ZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvQW1pZ2FPbmVHM1NFLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL0FtaWdhT25lRzNTRS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjUzODgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL0FtaWdhT25lRzNTRS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBIeXBlcmlvbiBFbnRlcnRhaW5tZW50LCBUaG9tYXNGQGh5cGVyaW9uLWVudGVydGFpbm1lbnQuY29tCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSAiYXJ0aWNpYVMuaCIKKyNpbmNsdWRlICJtZW1pby5oIgorI2luY2x1ZGUgInZpYTY4Ni5oIgorCitfX2FzbSgiIC5nbG9ibCBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICBzZW5kX2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBsaXMgICAgIHI5LCAweGZlMDAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGxpICAgICAgcjQsIDB4MTAgICAgICAgICMgcmV0cmllcyAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBtdGN0ciAgIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICBpZGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgYW5kaS4gICByNCwgcjQsIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGJuZSAgICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgIHJlYWR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIHN0YiAgICAgcjMsIDB4NjAocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgIGNoZWNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGxieiAgICAgcjQsIDB4NjQocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBhbmRpLiAgIHI0LCByNCwgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgYmVxICAgICBjaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBsYnogICAgIHI0LCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgY21wd2kgICByNCwgMHhmYSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGJlcSAgICAgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgYmRueiAgICBpZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBsaSAgICAgIHIzLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgZG9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgbGkgICAgICByMywgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgIC5nbG9ibCB0ZXN0X2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICB0ZXN0X2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBtZmxyICAgIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisJICAgICAgICBsaSAgICAgIHIzLCAweGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgYmwgICAgICBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGxpICAgICAgcjMsIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICBibCAgICAgIHNlbmRfa2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgICAgICAgICAgICAgICAgbXRsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorICAgICAgICAgICAgICAgIGJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyIpOworCisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXByaW50ZiAoIkFtaWdhT25lRzNTRVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworbG9uZyBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJcmV0dXJuIGFydGljaWFTX3JhbV9pbml0ICgpOworfQorCisKKwordm9pZCBhZnRlcl9yZWxvYyAodWxvbmcgZGVzdF9hZGRyKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJYm9hcmRfaW5pdF9yIChnZCwgZGVzdF9hZGRyKTsKK30KKworCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJZXh0ZXJuIHBjaV9kZXZfdCB2aWRlb19kZXY7CisJZXh0ZXJuIHZvaWQgZHJ2X3ZpZGVvX2luaXQgKHZvaWQpOworCisJaWYgKHZpZGVvX2RldiAhPSB+MCkKKwkJZHJ2X3ZpZGVvX2luaXQgKCk7CisKKwlyZXR1cm4gKDApOworfQorCisKK3ZvaWQgcGNpX2luaXQgKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19SQU1CT09UCisJYXJ0aWNpYVNfcGNpX2luaXQgKCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvTWFrZWZpbGUgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzE3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL01ha2VmaWxlCkBAIC0wLDAgKzEsNTMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK0NPQkpTCT0gJChCT0FSRCkubyBhcnRpY2lhUy5vIGZsYXNoLm8gc2VyaWFsLm8gc21idXMubyBhcnRpY2lhU19wY2kubyBcCisJCXZpYTY4Ni5vIGk4MjU5Lm8gLi4vYmlvc19lbXVsYXRvci94ODZpbnRlcmZhY2UubyAJXAorCQkuLi9iaW9zX2VtdWxhdG9yL2Jpb3MubyAuLi9iaW9zX2VtdWxhdG9yL2dsdWUubwkJXAorCQlpbnRlcnJ1cHRzLm8gcHMya2JkLm8gdmlkZW8ubyB1c2JfdWhjaS5vIGVuZXQubwkgICAgICAgIFwKKwkJLi4vbWVudS9jbWRfbWVudS5vIGNtZF9ib290YS5vIG52cmFtLm8KKworQU9CSlMJPSBib2FyZF9hc21faW5pdC5vIG1lbWlvLm8KKworT0JKUwk9ICQoQ09CSlMpICQoQU9CSlMpIAorCisjIyBGSVhNRSAhISEKKyMgRU1VT0JKUyA9IC4uL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11LyoubworCisKKyQoTElCKToJLmRlcGVuZCAkKE9CSlMpICQoRU1VT0JKUykKKwktcm0gJChMSUIpCisJJChBUikgY3J2ICRAICQoT0JKUykgJChFTVVPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6IE1ha2VmaWxlICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCisJJChDQykgLU0gJChDRkxBR1MpICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2FydGljaWFTLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2FydGljaWFTLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4NTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvYXJ0aWNpYVMuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogSHlwZXJpb24gRW50ZXJ0YWlubWVudCwgVGhvbWFzRkBoeXBlcmlvbi1lbnRlcnRhaW5tZW50LmNvbSAKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgIm1lbWlvLmgiCisjaW5jbHVkZSAiYXJ0aWNpYVMuaCIKKyNpbmNsdWRlICJzbWJ1cy5oIgorI2luY2x1ZGUgInZpYTY4Ni5oIgorCisjdW5kZWYgREVCVUcKKworc3RydWN0IGRpbW1fYmFuayB7CisJdWludDggdXNlZDsJCQkvKiBCYW5rIGlzIHBvcHVsYXRlZCAqLworCXVpbnQzMiByb3dzOwkJCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzICovCisJdWludDMyIGNvbHVtbnM7CQkJLyogTnVtYmVyIG9mIGNvbHVtbiBhZGRyZXNzZXMgKi8KKwl1aW50OCByZWdpc3RlcmVkOwkJLyogU0lNTSBpcyByZWdpc3RlcmVkICovCisJdWludDggZWNjOwkJCS8qIFNJTU0gaGFzIGVjYyAqLworCXVpbnQ4IGJ1cnN0X2xlbjsJCS8qIFN1cHBvcnRlZCBidXJzdCBsZW5ndGhzICovCisJdWludDMyIGNhc19sYXQ7CQkJLyogU3VwcG9ydGVkIENBUyBsYXRlbmNpZXMgKi8KKwl1aW50MzIgY2FzX3VzZWQ7CQkvKiBDQVMgdG8gdXNlIChub3Qgc2V0IGJ5IHVzZXIpICovCisJdWludDMyIHRyY2Q7CQkJLyogUkFTIHRvIENBUyBsYXRlbmN5ICovCisJdWludDMyIHRycDsJCQkvKiBQcmVjaGFyZ2UgbGF0ZW5jeSAqLworCXVpbnQzMiB0Y2xrX2hpOwkJCS8qIFNEUkFNIGN5Y2xlIHRpbWUgKGhpZ2hlc3QgQ0FTIGxhdGVuY3kpICovCisJdWludDMyIHRjbGtfMmhpOwkJLyogU0RSQU0gc2Vjb25kIGhpZ2hlc3QgQ0FTIGxhdGVuY3kgKi8KKwl1aW50MzIgc2l6ZTsJCQkvKiBTaXplIG9mIGJhbmsgaW4gYnl0ZXMgKi8KKwl1aW50OCBhdXRvX3JlZnJlc2g7CQkvKiBNb2R1bGUgc3VwcG9ydHMgYXV0byByZWZyZXNoICovCisJdWludDMyIHJlZnJlc2hfdGltZTsJCS8qIFJlZnJlc2ggdGltZSAoaW4gbnMpICovCit9OworCisKKy8qCisqKiBCYXNlZCBpbiBwYXJ0IG9uIHRoZSBldmI2NDI2MCBjb2RlCisqLworCisvKgorICogdHJhbnNsYXRlIG5zLm5zLzEwIGNvZGluZyBvZiBTUEQgdGltaW5nIHZhbHVlcworICogaW50byAxMCBwcyB1bml0IHZhbHVlcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IE5TMTB0bzEwUFMgKHVuc2lnbmVkIGNoYXIgc3BkX2J5dGUpCit7CisJdW5zaWduZWQgc2hvcnQgbnMsIG5zMTA7CisKKwkvKiBpc29sYXRlIHVwcGVyIG5pYmJsZSAqLworCW5zID0gKHNwZF9ieXRlID4+IDQpICYgMHgwRjsKKwkvKiBpc29sYXRlIGxvd2VyIG5pYmJsZSAqLworCW5zMTAgPSAoc3BkX2J5dGUgJiAweDBGKTsKKworCXJldHVybiAobnMgKiAxMDAgKyBuczEwICogMTApOworfQorCisvKgorICogdHJhbnNsYXRlIG5zIGNvZGluZyBvZiBTUEQgdGltaW5nIHZhbHVlcworICogaW50byAxMCBwcyB1bml0IHZhbHVlcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IE5TdG8xMFBTICh1bnNpZ25lZCBjaGFyIHNwZF9ieXRlKQoreworCXJldHVybiAoc3BkX2J5dGUgKiAxMDApOworfQorCisKK2xvbmcgZGV0ZWN0X3NkcmFtICh1aW50OCAqIHJvbSwgaW50IGRpbW1OdW0sIHN0cnVjdCBkaW1tX2JhbmsgKmJhbmtzKQoreworCWludCBkaW1tX2FkZHJlc3MgPSAoZGltbU51bSA9PSAwKSA/IFNNX0RJTU0wX0FERFIgOiBTTV9ESU1NMV9BRERSOworCXVpbnQzMiBidXNjbG9jayA9IGdldF9idXNfZnJlcSAoMCk7CisJdWludDMyIG1lbWNsb2NrID0gYnVzY2xvY2s7CisJdWludDMyIHRtZW1jbG9jayA9IDEwMDAwMDAwMDAgLyAobWVtY2xvY2sgLyAxMDApOworCXVpbnQzMiBkYXRhd2lkdGg7CisKKwlpZiAoc21fZ2V0X2RhdGEgKHJvbSwgZGltbV9hZGRyZXNzKSA9PSAwKSB7CisJCS8qIE5vdGhpbmcgaW4gc2xvdCwgbWFrZSBib3RoIGJhbmtzIGVtcHR5ICovCisJCWRlYnVnICgiU2xvdCAlZDogdmFjYW50XG4iLCBkaW1tTnVtKTsKKwkJYmFua3NbMF0udXNlZCA9IDA7CisJCWJhbmtzWzFdLnVzZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocm9tWzJdICE9IDB4MDQpIHsKKwkJZGVidWcgKCJTbG90ICVkOiBObyBTRFJBTVxuIiwgZGltbU51bSk7CisJCWJhbmtzWzBdLnVzZWQgPSAwOworCQliYW5rc1sxXS51c2VkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGV0ZXJtaW5lIG51bWJlciBvZiBiYW5rcy9yb3dzICovCisJaWYgKHJvbVs1XSA9PSAxKSB7CisJCWJhbmtzWzBdLnVzZWQgPSAxOworCQliYW5rc1sxXS51c2VkID0gMDsKKwl9IGVsc2UgeworCQliYW5rc1swXS51c2VkID0gMTsKKwkJYmFua3NbMV0udXNlZCA9IDE7CisJfQorCisJLyogRGV0ZXJtaW5lIG51bWJlciBvZiByb3cgYWRkcmVzc2VzICovCisJaWYgKHJvbVszXSAmIDB4ZjApIHsKKwkJLyogRGlmZmVyZW50IGJhbmtzIHNpemVzICovCisJCWJhbmtzWzBdLnJvd3MgPSByb21bM10gJiAweDBmOworCQliYW5rc1sxXS5yb3dzID0gKHJvbVszXSAmIDB4ZjApID4+IDQ7CisJfSBlbHNlIHsKKwkJLyogRXF1YWwgc2l6ZWQgYmFua3MgKi8KKwkJYmFua3NbMF0ucm93cyA9IHJvbVszXSAmIDB4MGY7CisJCWJhbmtzWzFdLnJvd3MgPSBiYW5rc1swXS5yb3dzOworCX0KKworCS8qIERldGVybWluZSBudW1iZXIgb2YgY29sdW1uIGFkZHJlc3NlcyAqLworCWlmIChyb21bNF0gJiAweGYwKSB7CisJCS8qIERpZmZlcmVudCBiYW5rIHNpemVzICovCisJCWJhbmtzWzBdLmNvbHVtbnMgPSByb21bNF0gJiAweDBmOworCQliYW5rc1sxXS5jb2x1bW5zID0gKHJvbVs0XSAmIDB4ZjApID4+IDQ7CisJfSBlbHNlIHsKKwkJYmFua3NbMF0uY29sdW1ucyA9IHJvbVs0XSAmIDB4MGY7CisJCWJhbmtzWzFdLmNvbHVtbnMgPSBiYW5rc1swXS5jb2x1bW5zOworCX0KKworCS8qIENoZWNrIEplZGVjIHJldmlzaW9uLCBhbmQgbW9kaWZ5IHJvdy9jb2x1bW4gYWNjb3JkaW5nbHkgKi8KKwlpZiAocm9tWzYyXSA+IDB4MTApIHsKKwkJaWYgKGJhbmtzWzBdLnJvd3MgPD0gMykKKwkJCWJhbmtzWzBdLnJvd3MgKz0gMTU7CisJCWlmIChiYW5rc1sxXS5yb3dzIDw9IDMpCisJCQliYW5rc1sxXS5yb3dzICs9IDE1OworCQlpZiAoYmFua3NbMF0uY29sdW1ucyA8PSAzKQorCQkJYmFua3NbMF0uY29sdW1ucyArPSAxNTsKKwkJaWYgKGJhbmtzWzBdLmNvbHVtbnMgPD0gMykKKwkJCWJhbmtzWzBdLmNvbHVtbnMgKz0gMTU7CisJfQorCisJLyogQ2hlY2sgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZCAqLworCWlmIChyb21bMjFdICYgMHgxMikgeworCQliYW5rc1swXS5yZWdpc3RlcmVkID0gMTsKKwkJYmFua3NbMV0ucmVnaXN0ZXJlZCA9IDE7CisJfSBlbHNlIHsKKwkJYmFua3NbMF0ucmVnaXN0ZXJlZCA9IDA7CisJCWJhbmtzWzFdLnJlZ2lzdGVyZWQgPSAwOworCX0KKworI2lmZGVmIENPTkZJR19FQ0MKKwkvKiBDaGVjayBwYXJpdHkvRUNDICovCisJYmFua3NbMF0uZWNjID0gKHJvbVsxMV0gPT0gMHgwMik7CisJYmFua3NbMV0uZWNjID0gKHJvbVsxMV0gPT0gMHgwMik7CisjZW5kaWYKKworCS8qIEZpbmQgYnVyc3QgbGVuZ3RocyBzdXBwb3J0ZWQgKi8KKwliYW5rc1swXS5idXJzdF9sZW4gPSByb21bMTZdICYgMHg4ZjsKKwliYW5rc1sxXS5idXJzdF9sZW4gPSByb21bMTZdICYgMHg4ZjsKKworCS8qIEZpbmQgcG9zc2libGUgY2FzIGxhdGVuY2llcyAqLworCWJhbmtzWzBdLmNhc19sYXQgPSByb21bMThdICYgMHg3RjsKKwliYW5rc1sxXS5jYXNfbGF0ID0gcm9tWzE4XSAmIDB4N0Y7CisKKwkvKiBSQVMvQ0FTIGxhdGVuY3kgKi8KKwliYW5rc1swXS50cmNkID0gKE5TdG8xMFBTIChyb21bMjldKSArICh0bWVtY2xvY2sgLSAxKSkgLyB0bWVtY2xvY2s7CisJYmFua3NbMV0udHJjZCA9IChOU3RvMTBQUyAocm9tWzI5XSkgKyAodG1lbWNsb2NrIC0gMSkpIC8gdG1lbWNsb2NrOworCisJLyogUHJlY2hhcmdlIGxhdGVuY3kgKi8KKwliYW5rc1swXS50cnAgPSAoTlN0bzEwUFMgKHJvbVsyN10pICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwliYW5rc1sxXS50cnAgPSAoTlN0bzEwUFMgKHJvbVsyN10pICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKworCS8qIGhpZ2hlc3QgQ0FTIGxhdGVuY3kgKi8KKwliYW5rc1swXS50Y2xrX2hpID0gTlMxMHRvMTBQUyAocm9tWzldKTsKKwliYW5rc1sxXS50Y2xrX2hpID0gTlMxMHRvMTBQUyAocm9tWzldKTsKKworCS8qIHNlY29uZCBoaWdoZXN0IENBUyBsYXRlbmN5ICovCisJYmFua3NbMF0udGNsa18yaGkgPSBOUzEwdG8xMFBTIChyb21bMjNdKTsKKwliYW5rc1sxXS50Y2xrXzJoaSA9IE5TMTB0bzEwUFMgKHJvbVsyM10pOworCisJLyogYmFuayBzaXplcyAqLworCWRhdGF3aWR0aCA9IHJvbVsxM10gJiAweDdmOworCWJhbmtzWzBdLnNpemUgPQorCQkJKDFMIDw8IChiYW5rc1swXS5yb3dzICsgYmFua3NbMF0uY29sdW1ucykpICoKKwkJCS8qIEZJWE1FIGRhdGF3aWR0aCAqLyA4ICogcm9tWzE3XTsKKwlpZiAocm9tWzEzXSAmIDB4ODApCisJCWJhbmtzWzFdLnNpemUgPSAyICogYmFua3NbMF0uc2l6ZTsKKwllbHNlCisJCWJhbmtzWzFdLnNpemUgPSAoMUwgPDwgKGJhbmtzWzFdLnJvd3MgKyBiYW5rc1sxXS5jb2x1bW5zKSkgKgorCQkJCS8qIEZJWE1FIGRhdGF3aWR0aCAqLyA4ICogcm9tWzE3XTsKKworCS8qIFJlZnJlc2ggKi8KKwlpZiAocm9tWzEyXSAmIDB4ODApIHsKKwkJYmFua3NbMF0uYXV0b19yZWZyZXNoID0gMTsKKwkJYmFua3NbMV0uYXV0b19yZWZyZXNoID0gMTsKKwl9IGVsc2UgeworCQliYW5rc1swXS5hdXRvX3JlZnJlc2ggPSAwOworCQliYW5rc1sxXS5hdXRvX3JlZnJlc2ggPSAwOworCX0KKworCXN3aXRjaCAocm9tWzEyXSAmIDB4N2YpIHsKKwljYXNlIDA6CisJCWJhbmtzWzBdLnJlZnJlc2hfdGltZSA9ICgxNTYyNTAwICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwkJYmFua3NbMV0ucmVmcmVzaF90aW1lID0gKDE1NjI1MDAgKyAodG1lbWNsb2NrIC0gMSkpIC8gdG1lbWNsb2NrOworCQlicmVhazsKKwljYXNlIDE6CisJCWJhbmtzWzBdLnJlZnJlc2hfdGltZSA9ICgzOTA2MDAgKyAodG1lbWNsb2NrIC0gMSkpIC8gdG1lbWNsb2NrOworCQliYW5rc1sxXS5yZWZyZXNoX3RpbWUgPSAoMzkwNjAwICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQliYW5rc1swXS5yZWZyZXNoX3RpbWUgPSAoNzgxMjAwICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwkJYmFua3NbMV0ucmVmcmVzaF90aW1lID0gKDc4MTIwMCArICh0bWVtY2xvY2sgLSAxKSkgLyB0bWVtY2xvY2s7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYmFua3NbMF0ucmVmcmVzaF90aW1lID0gKDMxMjUwMDAgKyAodG1lbWNsb2NrIC0gMSkpIC8gdG1lbWNsb2NrOworCQliYW5rc1sxXS5yZWZyZXNoX3RpbWUgPSAoMzEyNTAwMCArICh0bWVtY2xvY2sgLSAxKSkgLyB0bWVtY2xvY2s7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJYmFua3NbMF0ucmVmcmVzaF90aW1lID0gKDYyNTAwMDAgKyAodG1lbWNsb2NrIC0gMSkpIC8gdG1lbWNsb2NrOworCQliYW5rc1sxXS5yZWZyZXNoX3RpbWUgPSAoNjI1MDAwMCArICh0bWVtY2xvY2sgLSAxKSkgLyB0bWVtY2xvY2s7CisJCWJyZWFrOworCWNhc2UgNToKKwkJYmFua3NbMF0ucmVmcmVzaF90aW1lID0gKDEyNTAwMDAwICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwkJYmFua3NbMV0ucmVmcmVzaF90aW1lID0gKDEyNTAwMDAwICsgKHRtZW1jbG9jayAtIDEpKSAvIHRtZW1jbG9jazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmFua3NbMF0ucmVmcmVzaF90aW1lID0gMHgxMDA7CS8qIERlZmF1bHQgb2YgQXJ0aWNpYSBTICovCisJCWJhbmtzWzFdLnJlZnJlc2hfdGltZSA9IDB4MTAwOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBERUJVRworCXByaW50ZiAoIlxuSW5mb3JtYXRpb24gZm9yIFNJTU0gYmFuayAlbGQ6XG4iLCBkaW1tTnVtKTsKKwlwcmludGYgKCJOdW1iZXIgb2YgYmFua3M6ICVsZFxuIiwgYmFua3NbMF0udXNlZCArIGJhbmtzWzFdLnVzZWQpOworCXByaW50ZiAoIk51bWJlciBvZiByb3cgYWRkcmVzc2VzOiAlbGRcbiIsIGJhbmtzWzBdLnJvd3MpOworCXByaW50ZiAoIk51bWJlciBvZiBjb3VtbnMgYWRkcmVzc2VzOiAlbGRcbiIsIGJhbmtzWzBdLmNvbHVtbnMpOworCXByaW50ZiAoIlNJTU0gaXMgJXNyZWdpc3RlcmVkXG4iLAorCQkJYmFua3NbMF0ucmVnaXN0ZXJlZCA9PSAwID8gIm5vdCAiIDogIiIpOworI2lmZGVmIENPTkZJR19FQ0MKKwlwcmludGYgKCJTSU1NICVzIEVDQ1xuIiwKKwkJCWJhbmtzWzBdLmVjYyA9PSAxID8gInN1cHBvcnRzIiA6ICJkb2Vzbid0IHN1cHBvcnQiKTsKKyNlbmRpZgorCXByaW50ZiAoIlN1cHBvcnRlZCBidXJzdCBsZW5naHRzOiAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCWJhbmtzWzBdLmJ1cnN0X2xlbiAmIDB4MDggPyAiOCIgOiAiICIsCisJCQliYW5rc1swXS5idXJzdF9sZW4gJiAweDA0ID8gIjQiIDogIiAiLAorCQkJYmFua3NbMF0uYnVyc3RfbGVuICYgMHgwMiA/ICIyIiA6ICIgIiwKKwkJCWJhbmtzWzBdLmJ1cnN0X2xlbiAmIDB4MDEgPyAiMSIgOiAiICIsCisJCQliYW5rc1swXS5idXJzdF9sZW4gJiAweDgwID8gIlBBR0UiIDogIiAgICAiKTsKKwlwcmludGYgKCJTdXBwb3J0ZWQgQ0FTIGxhdGVuY2llczogJXMgJXMgJXNcbiIsCisJCQliYW5rc1swXS5jYXNfbGF0ICYgMHgwNCA/ICJDQVMgMyIgOiAiICAgICAiLAorCQkJYmFua3NbMF0uY2FzX2xhdCAmIDB4MDIgPyAiQ0FTIDIiIDogIiAgICAgIiwKKwkJCWJhbmtzWzBdLmNhc19sYXQgJiAweDAxID8gIkNBUyAxIiA6ICIgICAgICIpOworCXByaW50ZiAoIlJBUyB0byBDQVMgbGF0ZW5jeTogJWxkXG4iLCBiYW5rc1swXS50cmNkKTsKKwlwcmludGYgKCJQcmVjaGFyZ2UgbGF0ZW5jeTogJWxkXG4iLCBiYW5rc1swXS50cnApOworCXByaW50ZiAoIlNEUkFNIGhpZ2hlc3QgQ0FTIGxhdGVuY3k6ICVsZFxuIiwgYmFua3NbMF0udGNsa19oaSk7CisJcHJpbnRmICgiU0RSQU0gMm5kIGhpZ2hlc3QgQ0FTIGxhdGVuY3k6ICVsZFxuIiwgYmFua3NbMF0udGNsa18yaGkpOworCXByaW50ZiAoIlNEUkFNIGRhdGEgd2lkdGg6ICVsZFxuIiwgZGF0YXdpZHRoKTsKKwlwcmludGYgKCJBdXRvIFJlZnJlc2ggJXNzdXBwb3J0ZWRcbiIsCisJCQliYW5rc1swXS5hdXRvX3JlZnJlc2ggPyAiIiA6ICJub3QgIik7CisJcHJpbnRmICgiUmVmcmVzaCB0aW1lOiAlbGQgY2xvY2tzXG4iLCBiYW5rc1swXS5yZWZyZXNoX3RpbWUpOworCWlmIChiYW5rc1swXS51c2VkKQorCQlwcmludGYgKCJCYW5rIDAgc2l6ZTogJWxkIE1CXG4iLCBiYW5rc1swXS5zaXplIC8gMTAyNCAvIDEwMjQpOworCWlmIChiYW5rc1sxXS51c2VkKQorCQlwcmludGYgKCJCYW5rIDEgc2l6ZTogJWxkIE1CXG4iLCBiYW5rc1sxXS5zaXplIC8gMTAyNCAvIDEwMjQpOworCisJcHJpbnRmICgiXG4iKTsKKyNlbmRpZgorCisJc21fdGVybSAoKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBzZWxlY3RfY2FzIChzdHJ1Y3QgZGltbV9iYW5rICpiYW5rcywgdWludDggZmFzdCkKK3sKKwlpZiAoIWJhbmtzWzBdLnVzZWQpIHsKKwkJYmFua3NbMF0uY2FzX3VzZWQgPSAwOworCQliYW5rc1swXS5jYXNfdXNlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmFzdCkgeworCQkvKiBTZWFyY2ggZm9yIGZhc3QgQ0FTICovCisJCXVpbnQzMiBpOworCQl1aW50MzIgYyA9IDB4MDE7CisKKwkJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworCQkJaWYgKGJhbmtzWzBdLmNhc19sYXQgJiBjKSB7CisJCQkJYmFua3NbMF0uY2FzX3VzZWQgPSBpOworCQkJCWJhbmtzWzFdLmNhc191c2VkID0gaTsKKwkJCQlkZWJ1ZyAoIlVzaW5nIENBUyAlZCAoZmFzdClcbiIsIGkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWMgPDw9IDE7CisJCX0KKworCQkvKiBEZWZhdWx0IHRvIENBUyAzICovCisJCWJhbmtzWzBdLmNhc191c2VkID0gMzsKKwkJYmFua3NbMV0uY2FzX3VzZWQgPSAzOworCQlkZWJ1ZyAoIlVzaW5nIENBUyAzIChmYXN0KVxuIik7CisKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCS8qIFNlYXJjaCBmb3Igc2xvdyBjYXMgKi8KKwkJdWludDMyIGk7CisJCXVpbnQzMiBjID0gMHgwODsKKworCQlmb3IgKGkgPSA0OyBpID4gMTsgaS0tKSB7CisJCQlpZiAoYmFua3NbMF0uY2FzX2xhdCAmIGMpIHsKKwkJCQliYW5rc1swXS5jYXNfdXNlZCA9IGk7CisJCQkJYmFua3NbMV0uY2FzX3VzZWQgPSBpOworCQkJCWRlYnVnICgiVXNpbmcgQ0FTICVkIChzbG93KVxuIiwgaSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYyA+Pj0gMTsKKwkJfQorCisJCS8qIERlZmF1bHQgdG8gQ0FTIDMgKi8KKwkJYmFua3NbMF0uY2FzX3VzZWQgPSAzOworCQliYW5rc1sxXS5jYXNfdXNlZCA9IDM7CisJCWRlYnVnICgiVXNpbmcgQ0FTIDMgKHNsb3cpXG4iKTsKKworCQlyZXR1cm47CisJfQorCisJYmFua3NbMF0uY2FzX3VzZWQgPSAzOworCWJhbmtzWzFdLmNhc191c2VkID0gMzsKKwlkZWJ1ZyAoIlVzaW5nIENBUyAzXG4iKTsKKworCXJldHVybjsKK30KKwordWludDMyIGdldF9yZWdfc2V0dGluZyAodWludDMyIGJhbmtzLCB1aW50MzIgcm93cywgdWludDMyIGNvbHVtbnMsIHVpbnQzMiBzaXplKQoreworCXVpbnQzMiBpOworCisJc3RydWN0IFJvd0NvbHVtblNpemUgeworCQl1aW50MzIgYmFua3M7CisJCXVpbnQzMiByb3dzOworCQl1aW50MzIgY29sdW1uczsKKwkJdWludDMyIHNpemU7CisJCXVpbnQzMiByZWdpc3Rlcl92YWx1ZTsKKwl9OworCisJc3RydWN0IFJvd0NvbHVtblNpemUgcmNzX21hcFtdID0geworCQkvKiAgU2JrIFJhZHIgQ2FkciAgIE1CICAgICBWYWx1ZSAqLworCQl7MSwgMTEsIDgsIDgsIDB4MDA4NDBmMDB9LAorCQl7MSwgMTEsIDksIDE2LCAweDAwOTI1ZjAwfSwKKwkJezEsIDExLCAxMCwgMzIsIDB4MDBhNjRmMDB9LAorCQl7MiwgMTIsIDgsIDMyLCAweDAwYzU1ZjAwfSwKKwkJezIsIDEyLCA5LCA2NCwgMHgwMGQ2NmYwMH0sCisJCXsyLCAxMiwgMTAsIDEyOCwgMHgwMGU3N2YwMH0sCisJCXsyLCAxMiwgMTEsIDI1NiwgMHgwMGZmOGYwMH0sCisJCXsyLCAxMywgMTEsIDUxMiwgMHgwMGZmOWYwMH0sCisJCXswLCAwLCAwLCAwLCAweDAwMDAwMDAwfQorCX07CisKKworCWkgPSAwOworCisJd2hpbGUgKHJjc19tYXBbaV0uYmFua3MgIT0gMCkgeworCQlpZiAocm93cyA9PSByY3NfbWFwW2ldLnJvd3MKKwkJCSYmIGNvbHVtbnMgPT0gcmNzX21hcFtpXS5jb2x1bW5zCisJCQkmJiAoc2l6ZSAvIDEwMjQgLyAxMDI0KSA9PSByY3NfbWFwW2ldLnNpemUpCisJCQlyZXR1cm4gcmNzX21hcFtpXS5yZWdpc3Rlcl92YWx1ZTsKKworCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3VpbnQzMiBidXJzdF90b19sZW4gKHVpbnQzMiBzdXBwb3J0KQoreworCWlmIChzdXBwb3J0ICYgMHg4MCkKKwkJcmV0dXJuIDB4NzsKKwllbHNlIGlmIChzdXBwb3J0ICYgMHg4KQorCQlyZXR1cm4gMHgzOworCWVsc2UgaWYgKHN1cHBvcnQgJiAweDQpCisJCXJldHVybiAweDI7CisJZWxzZSBpZiAoc3VwcG9ydCAmIDB4MikKKwkJcmV0dXJuIDB4MTsKKwllbHNlIGlmIChzdXBwb3J0ICYgMHgxKQorCQlyZXR1cm4gMHgwOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgYXJ0aWNpYVNfcmFtX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlyZWdpc3RlciB1aW50MzIgaTsKKwlyZWdpc3RlciB1aW50MzIgdmFsdWUxOworCXJlZ2lzdGVyIHVpbnQzMiB2YWx1ZTI7CisJdWludDggcm9tWzEyOF07CisJdWludDMyIGJ1cnN0X2xlbjsKKwl1aW50MzIgYnVyc3Rfc3VwcG9ydDsKKwl1aW50MzIgdG90YWxfcmFtID0gMDsKKworCXN0cnVjdCBkaW1tX2JhbmsgYmFua3NbNF07CS8qIEZJWE1FOiBNb3ZlIHRvIGluaXRyYW0gKi8KKwl1aW50MzIgYnVzY2xvY2sgPSBnZXRfYnVzX2ZyZXEgKDApOworCXVpbnQzMiBtZW1jbG9jayA9IGJ1c2Nsb2NrOworCXVpbnQzMiByZWczMjsKKwl1aW50MzIgcmVmcmVzaF9jbG9ja3M7CisJdWludDggYXV0b19yZWZyZXNoOworCisJbWVtc2V0IChiYW5rcywgMCwgc2l6ZW9mIChzdHJ1Y3QgZGltbV9iYW5rKSAqIDQpOworCisJZGV0ZWN0X3NkcmFtIChyb20sIDAsICZiYW5rc1swXSk7CisJZGV0ZWN0X3NkcmFtIChyb20sIDEsICZiYW5rc1syXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXRvdGFsX3JhbSA9IHRvdGFsX3JhbSArIChiYW5rc1tpXS51c2VkICogYmFua3NbaV0uc2l6ZSk7CisJfQorCisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBHTE9CQUxJTkZPMCwgMHgxMTc0MzBjMCk7CisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBIQlVTQUNSMCwgMHgxZjAxMDBiMCk7CisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBTUkFNX0NSLCAweDAwZjEyMDAwKTsJLyogTm90ZTogTWlnaHQgYWxzbyB0cnkgMHgwMGYxMDAwMCAob3JpZ2luYWw6IDB4MDBmMTIwMDApICovCisJcGNpX3dyaXRlX2NmZ19ieXRlICgwLCAwLCBEUkFNX1JBU19DVEwwLCAweDNmKTsKKwlwY2lfd3JpdGVfY2ZnX2J5dGUgKDAsIDAsIERSQU1fUkFTX0NUTDEsIDB4MDApOwkvKiAgd2FzOiAweDA0KTsgKi8KKwlwY2lfd3JpdGVfY2ZnX3dvcmQgKDAsIDAsIERSQU1fRUNDMCwgMHgyMDIwKTsJLyogIHdhczogMHgyNDAwKTsgIE5vIEVDQyB5ZXQgKi8KKworCS8qIEZJWE1FOiBNb3ZlIHRoaXMgc3R1ZmYgdG8gc2VwZXJhdGUgZnVuY3Rpb24sIGxpa2Ugc2V0dXBfZGltbV9iYW5rICovCisJaWYgKGJhbmtzWzBdLnVzZWQpIHsKKwkJdmFsdWUxID0gZ2V0X3JlZ19zZXR0aW5nIChiYW5rc1swXS51c2VkICsgYmFua3NbMV0udXNlZCwKKwkJCQkJICBiYW5rc1swXS5yb3dzLCBiYW5rc1swXS5jb2x1bW5zLAorCQkJCQkgIGJhbmtzWzBdLnNpemUpOworCX0gZWxzZSB7CisJCXZhbHVlMSA9IDA7CisJfQorCisJaWYgKGJhbmtzWzFdLnVzZWQpIHsKKwkJdmFsdWUyID0gZ2V0X3JlZ19zZXR0aW5nIChiYW5rc1swXS51c2VkICsgYmFua3NbMV0udXNlZCwKKwkJCQkJICBiYW5rc1sxXS5yb3dzLCBiYW5rc1sxXS5jb2x1bW5zLAorCQkJCQkgIGJhbmtzWzFdLnNpemUpOworCX0gZWxzZSB7CisJCXZhbHVlMiA9IDA7CisJfQorCisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBESU1NMF9CMF9TQ1IwLCB2YWx1ZTEpOworCXBjaV93cml0ZV9jZmdfbG9uZyAoMCwgMCwgRElNTTBfQjFfU0NSMCwgdmFsdWUyKTsKKworCWRlYnVnICgiRElNTTBfQjBfU0NSMCA9IDB4JTA4eFxuIiwgdmFsdWUxKTsKKwlkZWJ1ZyAoIkRJTU0wX0IxX1NDUjAgPSAweCUwOHhcbiIsIHZhbHVlMik7CisKKwlpZiAoYmFua3NbMl0udXNlZCkgeworCQl2YWx1ZTEgPSBnZXRfcmVnX3NldHRpbmcgKGJhbmtzWzJdLnVzZWQgKyBiYW5rc1szXS51c2VkLAorCQkJCQkgIGJhbmtzWzJdLnJvd3MsIGJhbmtzWzJdLmNvbHVtbnMsCisJCQkJCSAgYmFua3NbMl0uc2l6ZSk7CisJfSBlbHNlIHsKKwkJdmFsdWUxID0gMDsKKwl9CisKKwlpZiAoYmFua3NbM10udXNlZCkgeworCQl2YWx1ZTIgPSBnZXRfcmVnX3NldHRpbmcgKGJhbmtzWzJdLnVzZWQgKyBiYW5rc1szXS51c2VkLAorCQkJCQkgIGJhbmtzWzNdLnJvd3MsIGJhbmtzWzNdLmNvbHVtbnMsCisJCQkJCSAgYmFua3NbM10uc2l6ZSk7CisJfSBlbHNlIHsKKwkJdmFsdWUyID0gMDsKKwl9CisKKwlwY2lfd3JpdGVfY2ZnX2xvbmcgKDAsIDAsIERJTU0xX0IyX1NDUjAsIHZhbHVlMSk7CisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBESU1NMV9CM19TQ1IwLCB2YWx1ZTIpOworCisJZGVidWcgKCJESU1NMF9CMl9TQ1IwID0gMHglMDh4XG4iLCB2YWx1ZTEpOworCWRlYnVnICgiRElNTTBfQjNfU0NSMCA9IDB4JTA4eFxuIiwgdmFsdWUyKTsKKworCXBjaV93cml0ZV9jZmdfbG9uZyAoMCwgMCwgRElNTTJfQjRfU0NSMCwgMCk7CisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBESU1NMl9CNV9TQ1IwLCAwKTsKKwlwY2lfd3JpdGVfY2ZnX2xvbmcgKDAsIDAsIERJTU0zX0I2X1NDUjAsIDApOworCXBjaV93cml0ZV9jZmdfbG9uZyAoMCwgMCwgRElNTTNfQjdfU0NSMCwgMCk7CisKKwkvKiBEZXRlcm1pbmUgdGltaW5nICovCisJc2VsZWN0X2NhcyAoJmJhbmtzWzBdLCAwKTsKKwlzZWxlY3RfY2FzICgmYmFua3NbMl0sIDApOworCisJLyogRklYTUU6IFdoYXQgYWJvdXQgd3JpdGUgcmVjb3ZlcnkgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgQXV0byByZWZyZXNoICAgIFByZWNoYXJnZSAqLworI2lmIDAKKwlyZWczMiA9ICgweDMgPDwgMTMpIHwgKDB4NyA8PCAxMCkgfCAoKGJhbmtzWzBdLnRycCAtIDIpIDw8IDgpIHwKKwkvKiAgICBXcml0ZSByZWNvdmVyeSAgQ0FTIExhdGVuY3kgKi8KKwkJKDB4MSA8PCA2KSB8IChiYW5rc1swXS5jYXNfdXNlZCA8PCA0KSB8CisJLyogICAgICBSQVMvQ0FTIGxhdGVuY3kgKi8KKwkJKChiYW5rc1swXS50cmNkIC0gMSkgPDwgMCk7CisKKwlyZWczMiB8PSAoKDB4MyA8PCAxMykgfCAoMHg3IDw8IDEwKSB8ICgoYmFua3NbMl0udHJwIC0gMikgPDwgOCkgfAorCQkgICgweDEgPDwgNikgfCAoYmFua3NbMl0uY2FzX3VzZWQgPDwgNCkgfAorCQkgICgoYmFua3NbMl0udHJjZCAtIDEpIDw8IDApKSA8PCAxNjsKKyNlbHNlCisJaWYgKDEwMDAwMDAwMCA9PSBnZC0+YnVzX2NsaykKKwkJcmVnMzIgPSAweDcxNzM3MTczOworCWVsc2UKKwkJcmVnMzIgPSAweDY5NzM2OTczOworI2VuZGlmCisJcGNpX3dyaXRlX2NmZ19sb25nICgwLCAwLCBESU1NMF9UQ1IwLCByZWczMik7CisJZGVidWcgKCJESU1NMF9UQ1IwID0gMHglMDh4XG4iLCByZWczMik7CisKKwkvKiBXcml0ZSBkZWZhdWx0IGluIERJTU0yLzMgKG5vdCB1c2VkIG9uIEExKSAqLworCXBjaV93cml0ZV9jZmdfbG9uZyAoMCwgMCwgRElNTTJfVENSMCwgMHg3ZDczN2Q3Myk7CisKKworCS8qIERldGVybWluZSBidWZmZXJlZC91bmJ1ZmZlcmVkIG1vZGUgZm9yIGVhY2ggU0lNTS4gVXNlcyBmaXJzdCBiYW5rIGFzIHJlZmVyZW5jZSAoc2Vjb25kLCBpZiBwcmVzZW50LCB1c2VzIHRoZSBzYW1lKSAqLworCXJlZzMyID0gcGNpX3JlYWRfY2ZnX2xvbmcgKDAsIDAsIERSQU1fR0NSMCk7CisJcmVnMzIgJj0gMHhGRjAwRkZGRjsKKworI2lmIDAKKwlpZiAoYmFua3NbMF0udXNlZCAmJiBiYW5rc1swXS5yZWdpc3RlcmVkKQorCQlyZWczMiB8PSAweDEgPDwgMTY7CisKKwlpZiAoYmFua3NbMl0udXNlZCAmJiBiYW5rc1syXS5yZWdpc3RlcmVkKQorCQlyZWczMiB8PSAweDEgPDwgMTg7CisjZWxzZQorCWlmIChiYW5rc1swXS5yZWdpc3RlcmVkIHx8IGJhbmtzWzJdLnJlZ2lzdGVyZWQpCisJCXJlZzMyIHw9IDB4NTUgPDwgMTY7CisjZW5kaWYKKwlwY2lfd3JpdGVfY2ZnX2xvbmcgKDAsIDAsIERSQU1fR0NSMCwgcmVnMzIpOworCWRlYnVnICgiRFJBTV9HQ1IwID0gMHglMDh4XG4iLCByZWczMik7CisKKwkvKiBEZXRlcm1pbmUgcmVmcmVzaCAqLworCXJlZnJlc2hfY2xvY2tzID0gMHhmZmZmZmZmZjsKKwlhdXRvX3JlZnJlc2ggPSAxOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoYmFua3NbaV0udXNlZCkgeworCQkJaWYgKGJhbmtzW2ldLmF1dG9fcmVmcmVzaCA9PSAwKQorCQkJCWF1dG9fcmVmcmVzaCA9IDA7CisJCQlpZiAoYmFua3NbaV0ucmVmcmVzaF90aW1lIDwgcmVmcmVzaF9jbG9ja3MpCisJCQkJcmVmcmVzaF9jbG9ja3MgPSBiYW5rc1tpXS5yZWZyZXNoX3RpbWU7CisJCX0KKwl9CisKKworI2lmIDEKKwkvKiAgSXQgc2VlbXMgdGhpcyBpcyBzdWdnZXN0ZWQgYnkgdGhlIEFydGljaWFTIGRhdGEgYm9vayAqLworCWlmICgxMDAwMDAwMDAgPT0gZ2QtPmJ1c19jbGspCisJCXJlZnJlc2hfY2xvY2tzID0gMTU2MTsKKwllbHNlCisJCXJlZnJlc2hfY2xvY2tzID0gMjA4MzsKKyNlbmRpZgorCisKKwlkZWJ1ZyAoIlJlZnJlc2ggc2V0IHRvICVsZCBjbG9ja3MsIGF1dG8gcmVmcmVzaCAlc1xuIiwKKwkJICAgcmVmcmVzaF9jbG9ja3MsIGF1dG9fcmVmcmVzaCA/ICJvbiIgOiAib2ZmIik7CisKKwlwY2lfd3JpdGVfY2ZnX2xvbmcgKDAsIDAsIERSQU1fUkVGUkVTSDAsCisJCQkoMSA8PCAxNikgfCAoMSA8PCAxNSkgfCAoYXV0b19yZWZyZXNoIDw8IDEyKSB8CisJCQkocmVmcmVzaF9jbG9ja3MpKTsKKwlkZWJ1ZyAoIkRSQU1fUkVGUkVTSDAgPSAweCUwOHhcbiIsCisJCQkoMSA8PCAxNikgfCAoMSA8PCAxNSkgfCAoYXV0b19yZWZyZXNoIDw8IDEyKSB8CisJCQkocmVmcmVzaF9jbG9ja3MpKTsKKworLyogICAgIHBjaV93cml0ZV9jZmdfbG9uZygwLCAwLCBEUkFNX1JFRlJFU0gwLCAgIDB4MDAwMTk0MDApOyAgKi8KKworCS8qIFNldCBtb2RlIHJlZ2lzdGVycyAqLworCS8qIEZJWE1FOiBGb3Igbm93LCBzZXQgc2FtZSBidXJzdCBsZW4gZm9yIGFsbCBtb2R1bGVzLiBEdW5ubyBpZiB0aGF0J3MgbmVjZXNzYXJ5ICovCisJLyogRmluZCBhIGNvbW1vbiBidXJzdCBsZW4gKi8KKwlidXJzdF9zdXBwb3J0ID0gMHhmZjsKKworCWlmIChiYW5rc1swXS51c2VkKQorCQlidXJzdF9zdXBwb3J0ID0gYmFua3NbMF0uYnVyc3RfbGVuOworCWlmIChiYW5rc1sxXS51c2VkKQorCQlidXJzdF9zdXBwb3J0ID0gYmFua3NbMV0uYnVyc3RfbGVuOworCWlmIChiYW5rc1syXS51c2VkKQorCQlidXJzdF9zdXBwb3J0ID0gYmFua3NbMl0uYnVyc3RfbGVuOworCWlmIChiYW5rc1szXS51c2VkKQorCQlidXJzdF9zdXBwb3J0ID0gYmFua3NbM10uYnVyc3RfbGVuOworCisJLyogCisJICAgKiogTW9kZSByZWdpc3RlcjoKKwkgICAqKiBCaXRzICAgICAgICAgVXNlCisJICAgKiogMC0yICAgICAgICAgIEJ1cnN0IGxlbgorCSAgICoqIDMgICAgICAgICAgICBCdXJzdCB0eXBlICgwID0gc2VxdWVudGlhbCwgMSA9IGludGVybGVhdmUpCisJICAgKiogNC02ICAgICAgICAgIENBUyBsYXRlbmN5CisJICAgKiogNy04ICAgICAgICAgIE9wZXJhdGlvbiBtb2RlICgwID0gZGVmYXVsdCwgYWxsIG90aGVycyBpbnZhbGlkKQorCSAgICoqIDkgICAgICAgICAgICBXcml0ZSBidXJzdAorCSAgICoqIDEwLTExICAgICAgICBSZXNlcnZlZAorCSAgICoqCisJICAgKiogTW9kZSByZWdpc3RlciBidXJzdCB0YWJsZToKKwkgICAqKiBBMiBBMSBBMCAgICAgbGVuZ2h0CisJICAgKiogMCAgMCAgMCAgICAgIDEKKwkgICAqKiAwICAwICAxICAgICAgMgorCSAgICoqIDAgIDEgIDAgICAgICA0CisJICAgKiogMCAgMSAgMSAgICAgIDgKKwkgICAqKiAxICAwICAwICAgICAgaW52YWxpZAorCSAgICoqIDEgIDAgIDEgICAgICBpbnZhbGlkCisJICAgKiogMSAgMSAgMCAgICAgIGludmFsaWQKKwkgICAqKiAxICAxICAxICAgICAgcGFnZSAob25seSB2YWxpZCBmb3Igbm9uLWludGVybGVhdmVkKQorCSAqLworCisJYnVyc3RfbGVuID0gYnVyc3RfdG9fbGVuIChidXJzdF9zdXBwb3J0KTsKKwlidXJzdF9sZW4gPSAyOwkJCQkvKiBGSVhNRSAqLworCisJaWYgKGJhbmtzWzBdLnVzZWQpIHsKKwkJcGNpX3dyaXRlX2NmZ193b3JkICgwLCAwLCBEUkFNX1BDUjAsCisJCQkweDgwMDAgfCBidXJzdF9sZW4gfCAoYmFua3NbMF0uY2FzX3VzZWQgPDwgNCkpOworCQlkZWJ1ZyAoIk1vZGUgYmFuayAwOiAweCUwOHhcbiIsCisJCQkweDgwMDAgfCBidXJzdF9sZW4gfCAoYmFua3NbMF0uY2FzX3VzZWQgPDwgNCkpOworCX0gZWxzZSB7CisJCS8qICBTZWVtcyB0byBiZSBuZWVkZWQgdG8gZGlzYWJsZSB0aGUgYmFuayAqLworCQlwY2lfd3JpdGVfY2ZnX3dvcmQgKDAsIDAsIERSQU1fUENSMCwgMHgwMDAwIHwgMHgwMzIpOworCX0KKworCWlmIChiYW5rc1sxXS51c2VkKSB7CisJCXBjaV93cml0ZV9jZmdfd29yZCAoMCwgMCwgRFJBTV9QQ1IwLAorCQkJMHg5MDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzFdLmNhc191c2VkIDw8IDQpKTsKKwkJZGVidWcgKCJNb2RlIGJhbmsgMTogMHglMDh4XG4iLAorCQkJMHg4MDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzFdLmNhc191c2VkIDw8IDQpKTsKKwl9IGVsc2UgeworCQkvKiAgU2VlbXMgdG8gYmUgbmVlZGVkIHRvIGRpc2FibGUgdGhlIGJhbmsgKi8KKwkJcGNpX3dyaXRlX2NmZ193b3JkICgwLCAwLCBEUkFNX1BDUjAsIDB4MTAwMCB8IDB4MDMyKTsKKwl9CisKKworCWlmIChiYW5rc1syXS51c2VkKSB7CisJCXBjaV93cml0ZV9jZmdfd29yZCAoMCwgMCwgRFJBTV9QQ1IwLAorCQkJMHhhMDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzJdLmNhc191c2VkIDw8IDQpKTsKKwkJZGVidWcgKCJNb2RlIGJhbmsgMjogMHglMDh4XG4iLAorCQkJMHg4MDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzJdLmNhc191c2VkIDw8IDQpKTsKKwl9IGVsc2UgeworCQkvKiAgU2VlbXMgdG8gYmUgbmVlZGVkIHRvIGRpc2FibGUgdGhlIGJhbmsgKi8KKwkJcGNpX3dyaXRlX2NmZ193b3JkICgwLCAwLCBEUkFNX1BDUjAsIDB4MjAwMCB8IDB4MDMyKTsKKwl9CisKKworCWlmIChiYW5rc1szXS51c2VkKSB7CisJCXBjaV93cml0ZV9jZmdfd29yZCAoMCwgMCwgRFJBTV9QQ1IwLAorCQkJMHhiMDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzNdLmNhc191c2VkIDw8IDQpKTsKKwkJZGVidWcgKCJNb2RlIGJhbmsgMzogMHglMDh4XG4iLAorCQkJMHg4MDAwIHwgYnVyc3RfbGVuIHwgKGJhbmtzWzNdLmNhc191c2VkIDw8IDQpKTsKKwl9IGVsc2UgeworCQkvKiAgU2VlbXMgdG8gYmUgbmVlZGVkIHRvIGRpc2FibGUgdGhlIGJhbmsgKi8KKwkJcGNpX3dyaXRlX2NmZ193b3JkICgwLCAwLCBEUkFNX1BDUjAsIDB4MzAwMCB8IDB4MDMyKTsKKwl9CisKKworCXBjaV93cml0ZV9jZmdfd29yZCAoMCwgMCwgMHhiYSwgMHgwMCk7CisKKwlyZXR1cm4gdG90YWxfcmFtOworfQorCitleHRlcm4gaW50IGRydl9pc2Ffa2JkX2luaXQgKHZvaWQpOworCitpbnQgbGFzdF9zdGFnZV9pbml0ICh2b2lkKQoreworCWRydl9pc2Ffa2JkX2luaXQgKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBvdmVyd3JpdGVfY29uc29sZSAodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisjZGVmaW5lIGluXzggcmVhZF9ieXRlCisjZGVmaW5lIG91dF84IHdyaXRlX2J5dGUKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBnZXRfbXNyICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbXNyOworCisJYXNtIHZvbGF0aWxlICgibWZtc3IgJTAiOiI9ciIgKG1zcik6KTsKKworCXJldHVybiBtc3I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X21zciAodW5zaWduZWQgbG9uZyBtc3IpCit7CisJYXNtIHZvbGF0aWxlICgibXRtc3IgJTAiOjoiciIgKG1zcikpOworfQorCitpbnQgYm9hcmRfcHJlX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBjX3ZhbHVlID0gMDsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKworCS8qIEJhc2ljIGluaXQgb2YgUFMvMiBrZXlib2FyZCAobmVlZGVkIGZvciBzb21lIHJlYXNvbikuLi4gKi8KKwkvKiBSaXBwZWQgZnJvbSBKb2huJ3MgY29kZSAqLworCXdoaWxlICgoaW5fOCAoKHVuc2lnbmVkIGNoYXIgKikgMHhmZTAwMDA2NCkgJiAweDAyKSAhPSAwKTsKKwlvdXRfOCAoKHVuc2lnbmVkIGNoYXIgKikgMHhmZTAwMDA2NCwgMHhhYSk7CisJd2hpbGUgKChpbl84ICgodW5zaWduZWQgY2hhciAqKSAweGZlMDAwMDY0KSAmIDB4MDEpID09IDApOworCWNfdmFsdWUgPSBpbl84ICgodW5zaWduZWQgY2hhciAqKSAweGZlMDAwMDYwKTsKKwl3aGlsZSAoKGluXzggKCh1bnNpZ25lZCBjaGFyICopIDB4ZmUwMDAwNjQpICYgMHgwMikgIT0gMCk7CisJb3V0XzggKCh1bnNpZ25lZCBjaGFyICopIDB4ZmUwMDAwNjQsIDB4YWIpOworCXdoaWxlICgoaW5fOCAoKHVuc2lnbmVkIGNoYXIgKikgMHhmZTAwMDA2NCkgJiAweDAxKSA9PSAwKTsKKwljX3ZhbHVlID0gaW5fOCAoKHVuc2lnbmVkIGNoYXIgKikgMHhmZTAwMDA2MCk7CisJd2hpbGUgKChpbl84ICgodW5zaWduZWQgY2hhciAqKSAweGZlMDAwMDY0KSAmIDB4MDIpICE9IDApOworCW91dF84ICgodW5zaWduZWQgY2hhciAqKSAweGZlMDAwMDY0LCAweGFlKTsKKy8qICAgICB3aGlsZSAoKGluXzgoKHVuc2lnbmVkIGNoYXIgKikweGZlMDAwMDY0KSAmIDB4MDEpID09IDApOyAqLworLyogICAgIGNfdmFsdWUgPSBpbl84KCh1bnNpZ25lZCBjaGFyICopMHhmZTAwMDA2MCk7ICovCisKKwkvKiAgRW5hYmxlIEZQVSAqLworCW1zciA9IGdldF9tc3IgKCk7CisJc2V0X21zciAobXNyIHwgTVNSX0ZQKTsKKworCXZpYV9jYWxpYnJhdGVfYnVzX2ZyZXEgKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvYXJ0aWNpYVMuaCBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvYXJ0aWNpYVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThkNzBhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9hcnRpY2lhUy5oCkBAIC0wLDAgKzEsMTQzIEBACisjaWZuZGVmIEFSVElDSUFTX0gKKyNkZWZpbmUgQVJUSUNJQVNfSAorCisjaW5jbHVkZSAic2hvcnRfdHlwZXMuaCIKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2RlZmluZSBSRUdfR1JPVVAgICAgICAgMHhGMAorCisvKiBBcnRpY2lhUyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0xPQkFMSU5GTzAgICAgIDB4NTAKKyNkZWZpbmUgR0xPQkFMSU5GTzEgICAgIDB4NTEKKyNkZWZpbmUgR0xPQkFMSU5GTzIgICAgIDB4NTIKKyNkZWZpbmUgR0xPQkFMSU5GTzMgICAgIDB4NTMKKyNkZWZpbmUgR0xPQkFMQ1RMMCAgICAgIDB4NTQKKyNkZWZpbmUgR0xPQkFMQ1RMMSAgICAgIDB4NTUKKyNkZWZpbmUgTlZSQU1DVEwgICAgICAgIDB4NTYKKyNkZWZpbmUgUENJMUFDUjAgICAgICAgIDB4NTgKKyNkZWZpbmUgUENJMUFDUjEgICAgICAgIDB4NTkKKyNkZWZpbmUgUENJMUFDUjIgICAgICAgIDB4NWEKKyNkZWZpbmUgUENJMUFDUjMgICAgICAgIDB4NWIKKyNkZWZpbmUgSEJVU0FDUjAgICAgICAgIDB4NWMKKyNkZWZpbmUgSEJVU0FDUjEgICAgICAgIDB4NWQKKyNkZWZpbmUgSEJVU0FDUjIgICAgICAgIDB4NWUKKyNkZWZpbmUgSEJVU0FDUjMgICAgICAgIDB4NWYKKyNkZWZpbmUgSE9TVElOVDAgICAgICAgIDB4NjgKKyNkZWZpbmUgSE9TVElOVDEgICAgICAgIDB4NjkKKyNkZWZpbmUgSE9TVElOVDIgICAgICAgIDB4NmEKKyNkZWZpbmUgSE9TVElOVDMgICAgICAgIDB4NmIKKyNkZWZpbmUgSE9TVFJCQ1IgICAgICAgIDB4NzAKKyNkZWZpbmUgWERCQ1IgICAgICAgICAgIDB4NzQKKworI2RlZmluZSBMQlNCQ1IyICAgICAgICAgMHhkMgorCisKKy8qIE1lbW9yeSBjb250cm9sbGVyICovCisKKyNkZWZpbmUgRElNTTBfQjBfU0NSMCAgIDB4OTAKKyNkZWZpbmUgRElNTTBfQjFfU0NSMCAgIDB4OTQKKyNkZWZpbmUgRElNTTFfQjJfU0NSMCAgIDB4OTgKKyNkZWZpbmUgRElNTTFfQjNfU0NSMCAgIDB4OWMKKyNkZWZpbmUgRElNTTJfQjRfU0NSMCAgIDB4YTAKKyNkZWZpbmUgRElNTTJfQjVfU0NSMCAgIDB4YTQKKyNkZWZpbmUgRElNTTNfQjZfU0NSMCAgIDB4YTgKKyNkZWZpbmUgRElNTTNfQjdfU0NSMCAgIDB4YWMKKworI2RlZmluZSBESU1NMF9UQ1IwICAgICAgMHhiMAorI2RlZmluZSBESU1NMV9UQ1IwICAgICAgMHhiMgorI2RlZmluZSBESU1NMl9UQ1IwICAgICAgMHhiNAorI2RlZmluZSBESU1NM19UQ1IwICAgICAgMHhiNgorCisjZGVmaW5lIERSQU1fUkVGUkVTSDAgICAweGI4CisjZGVmaW5lIERSQU1fR0NSMCAgICAgICAweGMwCisjZGVmaW5lIERSQU1fUENSMCAgICAgICAweGM2CisjZGVmaW5lIERSQU1fRUNDMCAgICAgICAweGM0CisjZGVmaW5lIFNSQU1fQ1IgICAgICAgICAweGM4CisjZGVmaW5lIERSQU1fUkFTX0NUTDAgICAweGNjCisjZGVmaW5lIERSQU1fUkFTX0NUTDEgICAweGNkCisKKy8qIEJpdHMgZm9yIFJFR19HUk9VUCAqLworI2RlZmluZSBSRUdfR1JPVVBfTVVMVEkgICAgICAgKDE8PDEpCisjZGVmaW5lIFJFR19HUk9VUF9TUEVDSUFMICAgICAoMTw8MykKKyNkZWZpbmUgUkVHX0dST1VQX0RJQUcgICAgICAgICgweDE8PDQpCisjZGVmaW5lIFJFR19HUk9VUF9QT1dFUiAgICAgICAoMHgyPDw0KQorCisKKyNkZWZpbmUgR0xPQkFMSU5GTzBfQk8gICAgICAgICgxPDw3KQorCisKKyNkZWZpbmUgR0xPQkFMSU5GTzJfQjFBUkJJVEVSICgxPDw2KQorCisKKyNkZWZpbmUgSEJVU0FDUjBfQ1BVQVBDICAgICAgICgxPDwwKQorI2RlZmluZSBIQlVTQUNSMF9OVU1SRVFfMiAgICAgKDA8PDEpCisjZGVmaW5lIEhCVVNBQ1IwX05VTVJFUV8zICAgICAoMTw8MSkKKyNkZWZpbmUgSEJVU0FDUjBfTlVNUkVRXzQgICAgICgyPDwxKQorI2RlZmluZSBIQlVTQUNSMF9OVU1SRVFfTUFTSyAgKDc8PDEpCisjZGVmaW5lIEhCVVNBQ1IwX1JBVyAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSEJVU0FDUjBfV0FJVCAgICAgICAgICgxPDw3KQorI2RlZmluZSBIQlVTQUNSMF9SRVNFUlZFRCAgICAgKDB4MzApCisKKworI2RlZmluZSBIQlVTQUNSMl9CVVJTVCAgICAgICAgKDE8PDApCisjZGVmaW5lIEhCVVNBQ1IyX0xBVCAgICAgICAgICAoMTw8MSkKKworCisjZGVmaW5lIEhCVVNBQ1IzX0xNV0NfU00gICAgICAoMTw8MCkKKyNkZWZpbmUgSEJVU0FDUjNfTE1XQ19QQ0kxICAgICgxPDwxKQorI2RlZmluZSBIQlVTQUNSM19MTVdDX1BDSTAgICAgKDE8PDIpCisjZGVmaW5lIEhCVVNBQ1IzX1BNV0NfUENJMSAgICAoMTw8MykKKyNkZWZpbmUgSEJVU0FDUjNfUE1XQ19QQ0kwICAgICgxPDw0KQorI2RlZmluZSBIQlVTQUNSM19GS0ggICAgICAgICAgKDE8PDUpCisjZGVmaW5lIEhCVVNBQ1IzXzkySF9FTiAgICAgICAoMTw8NikKKyNkZWZpbmUgSEJVU0FDUjNfNjBIXzY0SF9FTiAgICgxPDw3KQorCisKKyNkZWZpbmUgSE9TVFJCQ1JfUFJFRkVUQ0ggICAgICgxPDw0KQorCisKKyNkZWZpbmUgWERCQ1JfSFdUT1hEICAgICAgICAgICgxPDwwKQorI2RlZmluZSBYREJDUl9LQlRPWEQgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFhEQkNSX1JUQ1RPWEQgICAgICAgICAoMTw8MikKKyNkZWZpbmUgWERCQ1JfU0NBTEVfMV8xICAgICAgICgweDA8PDMpICAgICAgIAorI2RlZmluZSBYREJDUl9TQ0FMRV8yXzIgICAgICAgKDB4MTw8MykgICAgICAgCisjZGVmaW5lIFhEQkNSX1NDQUxFXzNfMiAgICAgICAoMHgyPDwzKSAgICAgICAKKyNkZWZpbmUgWERCQ1JfU0NBTEVfNF80ICAgICAgICgweDM8PDMpICAgICAgIAorI2RlZmluZSBYREJDUl9TQ0FMRV81XzggICAgICAgKDB4NDw8MykgICAgICAgCisjZGVmaW5lIFhEQkNSX1NDQUxFXzZfOCAgICAgICAoMHg1PDwzKSAgICAgICAKKyNkZWZpbmUgWERCQ1JfU0NBTEVfOF84ICAgICAgICgweDY8PDMpICAgICAgIAorI2RlZmluZSBYREJDUl9TQ0FMRV8wXzE2ICAgICAgKDB4Nzw8MykgICAgICAgCisjZGVmaW5lIFhEQkNSX1hEUFJPTSAgICAgICAgICAoMTw8NykKKworCisjZGVmaW5lIExCU0JDUjJfMV9SV0FDICAgICAgICAoMTw8MikKKworCisvKiBQQ0kgY29udHJvbGxlciAqLworI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHQUREUiAgMHhmZWMwMGNmOAorI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHREFUQSAgMHhmZWUwMGNmYworCisjZGVmaW5lIEFSVElDSUFTX1BDSV9CVVMgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUlRJQ0lBU19QQ0lfTUFYU0laRSAgIDB4N2NmZmZmZmYKKyNkZWZpbmUgQVJUSUNJQVNfUENJX1BIWVMgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgQVJUSUNJQVNfU1lTX0JVUyAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSVElDSUFTX1NZU19NQVhTSVpFICAgMHg3ZmZmZmZmZgorI2RlZmluZSBBUlRJQ0lBU19TWVNfUEhZUyAgICAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBBUlRJQ0lBU19QQ0lJT19CVVMgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQVJUSUNJQVNfUENJSU9fTUFYU0laRSAweDAwM2ZmZmZmCisjZGVmaW5lIEFSVElDSUFTX1BDSUlPX1BIWVMgICAgMHhmZTgwMDAwMAorCisjZGVmaW5lIEFSVElDSUFTX0lTQUlPX0JVUyAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBBUlRJQ0lBU19JU0FJT19NQVhTSVpFIDB4MDAwMGQwMDAKKyNkZWZpbmUgQVJUSUNJQVNfSVNBSU9fUEhZUyAgICAweGZlMDAyMDAwCisKKworCisvKiBQcm90b3R5cGVzICovCitsb25nIGFydGljaWFTX3JhbV9pbml0KHZvaWQpOwordm9pZCBhcnRpY2lhU19wY2lfaW5pdCh2b2lkKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvYXJ0aWNpYVNfcGNpLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2FydGljaWFTX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGMzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2FydGljaWFTX3BjaS5jCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBIeXBlcmlvbiBFbnRlcnRhaW5tZW50LCBIYW5zLUpvZXJnRkBoeXBlcmlvbi1lbnRlcnRhaW5tZW50LmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlICJtZW1pby5oIgorI2luY2x1ZGUgImFydGljaWFTLmgiCisKKy8vI2RlZmluZSBBUlRJQ0lBX1BDSV9ERUJVRworCisjaWZkZWYgIEFSVElDSUFfUENJX0RFQlVHCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikgICAgIHByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworc3RydWN0IHBjaV9jb250cm9sbGVyIGFydGljaWFTX2hvc2U7CisKK2xvbmcgaXJxX2FsbG9jKGxvbmcgd2FudGVkKTsKKworc3RhdGljIHBjaV9kZXZfdCBwY2lfaG9zZV9maW5kX2NsYXNzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgc2hvcnQgZmluZF9jbGFzcywgaW50IGluZGV4KTsKK3N0YXRpYyBpbnQgYXJ0aWNpYVNfaW5pdF92Z2Eodm9pZCk7CitzdGF0aWMgdm9pZCBwY2lfY2ZnZnVuY19kdW1teShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3QsIHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0YWJsZSk7Cit1bnNpZ25lZCBjaGFyIHBjaV9pcnFfYWxsb2Modm9pZCk7CisKK2V4dGVybiB2b2lkIHZpYV9jZmdmdW5jX3ZpYTY4NihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3N0LCBwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGFibGUpOworZXh0ZXJuIHZvaWQgdmlhX2NmZ2Z1bmNfaWRlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3N0LCBwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGFibGUpOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfaXJxX3JvdXRpbmcodWludDggW10pOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfYWZ0ZXJzY2FuKHZvaWQpOworCisjZGVmaW5lIGNmZ2Z1bmNfdmlhNjg2ICAgICAgMQorI2RlZmluZSBjZmdmdW5jX2R1bW15ICAyCisjZGVmaW5lIGNmZ2Z1bmNfaWRlX2luaXQgICAgMworCitzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgY29uZmlnX3RhYmxlW10gPQoreworICAgIHsKKwkweDExMDYsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19CUklER0VfSVNBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSh2b2lkICopY2ZnZnVuY192aWE2ODYsIHswLCAwLCAwfQorICAgIH0sCisgICAgeworCTB4MTEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCw3LDQsCisJKHZvaWQgKiljZmdmdW5jX2R1bW15LCB7MCwwLDB9CisgICAgfSwKKyAgICB7CisJMHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIDAsIDcsIFBDSV9BTllfSUQsCisJKHZvaWQgKiljZmdmdW5jX2R1bW15LCB7MCwwLDB9CisgICAgfSwKKyAgICB7CisJMHgxMTA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLDcsMSwKKwkodm9pZCAqKWNmZ2Z1bmNfaWRlX2luaXQsIHswLDAsMH0KKyAgICB9LAorICAgIHsKKwkwLAorICAgIH0KK307CisKKwordm9pZCBwY2lfY2ZnZnVuY19kdW1teShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3QsIHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0YWJsZSkKK3sKKworCit9CisKK3Vuc2lnbmVkIGxvbmcgaXJxX3BlbmFsdGllc1sxNl0gPQoreworICAgIDEwMDAsICAgIC8qIDA6dGltZXIgKi8KKyAgICAxMDAwLCAgICAvKiAxOmtleWJvYXJkICovCisgICAgMTAwMCwgICAgLyogMjpjYXNjYWRlICovCisgICAgNTAsICAgICAgLyogMzpzZXJpYWwgKENPTTIpICovCisgICAgNTAsICAgICAgLyogNDpzZXJpYWwgKENPTTEpICovCisgICAgNCwgICAgICAgLyogNTpVU0IyICovCisgICAgMTAwLCAgICAgLyogNjpmbG9wcHkgKi8KKyAgICAzLCAgICAgICAvKiA3OnBhcmFsbGVsICovCisgICAgNTAsICAgICAgLyogODpBQzk3L01DOTcgKi8KKyAgICAwLCAgICAgICAvKiA5OiAqLworICAgIDMsICAgICAgIC8qIDEwOjogKi8KKyAgICAwLCAgICAgICAvKiAxMTogKi8KKyAgICAzLCAgICAgICAvKiAxMjogVVNCMSAqLworICAgIDAsICAgICAgIC8qIDEzOiAqLworICAgIDEwMCwgICAgIC8qIDE0OiBpZGUwICovCisgICAgMTAwLCAgICAgLyogMTU6IGlkZTEgKi8KK307CisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhIGhhcmQtY29kZWQgaW50ZXJydXB0IG1hcHBpbmcgZm9yIHRoZQorICoga25vdyBkZXZpY2VzIG9uIHRoZSBib2FyZC4KKyAqIElmIGEgZGV2aWNlIGlzbid0IGZvdW5kIGhlcmUsIGFzc3VtZWQgdG8gYmUgYSBkZXZpY2UgdGhhdCdzCisgKiBwbHVnZ2VkIGludG8gYSBQQ0kgb3IgQUdQIHNsb3QKKyAqIE5PVEU6IFRoaXMgdGFibGUgaXMgbWFjaGluZSBkZXBlbmRhbnQuCisgKi8KKworc3RydWN0IHBjaV9pcnFfZml4dXBfdGFibGUKK3sKKyAgICB1aW50OCAgIGJ1czsgICAgICAgICAgICAgLyogQnVzIG51bWJlciAqLworICAgIHVpbnQ4ICAgZGV2aWNlOyAgICAgICAgICAvKiBEZXZpY2UgbnVtYmVyICovCisgICAgdWludDggICBmdW5jOyAgICAgICAgICAgIC8qIEZ1bmN0aW9uIG51bWJlciAqLworICAgIHVpbnQ4ICAgaW50ZXJydXB0OyAgICAgICAvKiBJbnRlcnJ1cHQgdG8gdXNlICgweGZmIHRvIGRpc2FibGUpICovCit9OworCitzdHJ1Y3QgcGNpX2lycV9maXh1cF90YWJsZSBmaXh1cHRhYiBbXSA9Cit7CisgICAgeyAwLCAwLCAwLCAweGZmfSwgICAgICAgIC8qIEFydGljaWEgUyBob3N0IGJyaWRnZSAqLworICAgIHsgMCwgMSwgMCwgMHhmZn0sICAgICAgICAvKiBBcnRpY2lhIFMgQUdQIGJyaWRnZSAqLworLy8gICAgeyAwLCA2LCAwLCAweDA1fSwgICAgICAgIC8qIDNDT00gZXRoZXJuZXQgKi8KKyAgICB7IDAsIDcsIDAsIDB4ZmZ9LCAgICAgICAgLyogVklBIHNvdXRoYnJpZGdlICovCisgICAgeyAwLCA3LCAxLCAweDBlfSwgICAgICAgIC8qIElERSBjb250cm9sbGVyIGluIGxlZ2FjeSBtb2RlICovCisvLyAgICB7IDAsIDcsIDIsIDB4MDV9LCAgICAgICAgLyogRmlyc3QgVVNCIGNvbnRyb2xsZXIgKi8KKy8vICAgIHsgMCwgNywgMywgMHgwY30sICAgICAgICAvKiBTZWNvbmQgVVNCIGNvbnRyb2xsZXIgKHNoYXJlcyBpbnRlcnJ1cHQgd2l0aCBldGhlcm5ldCkgKi8KKyAgICB7IDAsIDcsIDQsIDB4ZmZ9LCAgICAgICAgLyogQUNQSSBQb3dlciBNYW5hZ2VtZW50ICovCisvLyAgICB7IDAsIDcsIDUsIDB4MDh9LCAgICAgICAgLyogQUM5NyAqLworLy8gICAgeyAwLCA3LCA2LCAweDA4fSwgICAgICAgIC8qIE1DOTcgKi8KKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9Cit9OworCisKKy8qCisgKiBUaGlzIHRhYmxlIG1hcHMgSVJRJ3MgdG8gUENJIGludGVycnVwdHMKKyAqLworCit1aW50OCBwY2lfaW50bWFwWzRdID0gezAsIDAsIDAsIDB9OworCisvKgorICogTWFwIFBDSSBzbG90cyB0byBpbnRlcnJ1cHQgcm91dGluZ3MKKyAqIFRoaXMgdGFibGUgbGlzdHMgdGhlIGRldmljZSBudW1iZXIgYXNzaWduZWQgdG8gYSBjYXJkIGluc2VydGVkCisgKiBpbnRvIHRoZSBzbG90LCBhbG9uZyB3aXRoIGEgcGVybXV0YXRpb24gZm9yIHRoZSBzbG90J3MgSVJRIHJvdXRpbmcuCisgKiBOT1RFOiBUaGlzIHRhYmxlIGlzIG1hY2hpbmUgZGVwZW5kYW50LgorICovCisKK3N0cnVjdCBwY2lfc2xvdF9pcnFfcm91dGluZworeworICAgIHVpbnQ4IGJ1czsKKyAgICB1aW50OCBkZXZpY2U7CisKKyAgICB1aW50OCBpbnRzWzRdOworfTsKKworc3RydWN0IHBjaV9zbG90X2lycV9yb3V0aW5nIGFtaWdhb25lX3BjaV9yb3V0aW5nW10gPQoreworICAgIHswLCAgOCwgICB7MCwgMSwgMiwgM319LCAgICAgICAvKiBTbG90IDEgKGxlZnQgb2YgcmlzZXIgc2xvdCkgKi8KKyAgICB7MCwgIDksICAgezEsIDIsIDMsIDB9fSwgICAgICAgLyogU2xvdCAyIChtaWRkbGUgc2xvdCkgKi8KKyAgICB7MCwgMTAsICAgezIsIDMsIDAsIDF9fSwgICAgICAgLyogU2xvdCAzIChsZWZ0bW9zdCBzbG90KSAqLworICAgIHsxLCAgMCwgICB7MSwgMCwgMiwgM319LCAgICAgICAvKiBBR1Agc2xvdCAob25seSBJUlFBIGFuZCBJUlFCKSAqLworICAgIHsxLCAgMSwgICB7MSwgMiwgMywgMH19LCAgICAgICAvKiBQQ0kgc2xvdCBvbiBBR1AgYnVzICovCisgICAgezAsICA2LCAgIHszLCAzLCAzLCAzfX0sICAgICAgIC8qIE9uIGJvYXJkIGV0aGVybmV0ICovCisgICAgezAsICA3LCAgIHswLCAxLCAyLCAzfX0sICAgICAgIC8qIFNvdXRoYnJpZGdlICovCisgICAgezB4ZmYsIDAsIHswLCAwLCAwLCAwfX0KK307CisKK3ZvaWQgYXJ0aWNpYVNfcGNpX2lycV9pbml0KHZvaWQpCit7CisgICAgY2hhciAqczsKKworICAgIHMgPSBnZXRlbnYoInBjaV9pcnFhIik7CisgICAgaWYgKHMpCisJcGNpX2ludG1hcFswXSA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxMCk7CisgICAgZWxzZQorCXBjaV9pbnRtYXBbMF0gPSBwY2lfaXJxX2FsbG9jKCk7CisKKyAgICBzID0gZ2V0ZW52KCJwY2lfaXJxYiIpOworICAgIGlmIChzKQorCXBjaV9pbnRtYXBbMV0gPSBzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTApOworICAgIGVsc2UKKwlwY2lfaW50bWFwWzFdID0gcGNpX2lycV9hbGxvYygpOworCisgICAgcyA9IGdldGVudigicGNpX2lycWMiKTsKKyAgICBpZiAocykKKwlwY2lfaW50bWFwWzJdID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDEwKTsKKyAgICBlbHNlCisJcGNpX2ludG1hcFsyXSA9IHBjaV9pcnFfYWxsb2MoKTsKKworICAgIHMgPSBnZXRlbnYoInBjaV9pcnFkIik7CisgICAgaWYgKHMpCisJcGNpX2ludG1hcFszXSA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxMCk7CisgICAgZWxzZQorCXBjaV9pbnRtYXBbM10gPSBwY2lfaXJxX2FsbG9jKCk7Cit9CisKKwordW5zaWduZWQgY2hhciBwY2lfaXJxX2FsbG9jKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgaW50IGludGVycnVwdCA9IDEwOworICAgIHVuc2lnbmVkIGxvbmcgbWluX3BlbmFsdHkgPSAxMDAwOworCisgICAgLyogU2VhcmNoIGZvciB0aGUgbWluaW1hbCBwZW5hbHR5LCBmYXZvcmluZyBpbnRlcnJ1cHRzIGF0IHRoZSBlbmQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisJaWYgKGlycV9wZW5hbHRpZXNbaV0gPD0gbWluX3BlbmFsdHkpCisJeworCSAgICBpbnRlcnJ1cHQgPSBpOworCSAgICBtaW5fcGVuYWx0eSA9IGlycV9wZW5hbHRpZXNbaV07CisJfQorICAgIH0KKworICAgIFBSSU5URigicGNpX2lycV9hbGxvYzogTWluaW1hbCBwZW5hbHR5IGlzICVsZCBmb3IgJWRcbiIsIG1pbl9wZW5hbHR5LCBpbnRlcnJ1cHQpOworCisgICAgaXJxX3BlbmFsdGllc1tpbnRlcnJ1cHRdKys7CisKKyAgICByZXR1cm4gaW50ZXJydXB0OworfQorCisKK3ZvaWQgYXJ0aWNpYVNfcGNpX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCit7CisgICAgaW50OCBidXMsIGRldmljZSwgZnVuYywgcGluLCBsaW5lOworICAgIGludCBpOworCisgICAgYnVzID0gUENJX0JVUyhkZXYpOworICAgIGRldmljZSA9IFBDSV9ERVYoZGV2KTsKKyAgICBmdW5jID0gUENJX0ZVTkMoZGV2KTsKKworICAgIFBSSU5URigiRml4dXAgaXJxIG9mICVkOiVkLiVkXG4iLCBidXMsIGRldmljZSwgZnVuYyk7CisKKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBkZXZpY2UgaW4gdGhlIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgZml4dXB0YWJbaV0uYnVzICE9IDB4ZmY7IGkrKykKKyAgICB7CisJaWYgKGJ1cyA9PSBmaXh1cHRhYltpXS5idXMgJiYgZGV2aWNlID09IGZpeHVwdGFiW2ldLmRldmljZSAmJiBmdW5jID09IGZpeHVwdGFiW2ldLmZ1bmMpCisJeworCSAgICAvKiBJZiB0aGUgZGV2aWNlIG5lZWRzIGFuIGludGVycnVwdCwgd3JpdGUgaXQgKi8KKwkgICAgaWYgKGZpeHVwdGFiW2ldLmludGVycnVwdCAhPSAweGZmKQorCSAgICB7CisJCVBSSU5URigiQXNzaWduaW5nIElSUSAlZCAoZml4ZWQpXG4iLCBmaXh1cHRhYltpXS5pbnRlcnJ1cHQpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGZpeHVwdGFiW2ldLmludGVycnVwdCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIE90aGVyd2lzZSwgc2VlIGlmIGl0IHdhbnRzIGFuIGludGVycnVwdCwgYW5kIGRpc2FibGUgaXQgaWYgbmVlZGVkICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworCQlpZiAocGluKQorCQl7CisJCSAgICBQUklOVEYoIkRpc2FibGluZyBJUlFcbiIpOworCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAweGZmKTsKKwkJfQorCSAgICB9CisKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBhbm90aGVyIFBDSSBkZXZpY2UgaW4gYSBzbG90Li4uIGZpbmQgdGhlIGFwcHJvcHJpYXRlIElSUSAqLworCisgICAgLyogRmluZCBtYXRjaGluZyBwaW4gKi8KKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKyAgICBwaW4tLTsKKworICAgIC8qIFNlYXJjaCBmb3IgaXQncyBtYXAgKi8KKyAgICBmb3IgKGkgPSAwOyBhbWlnYW9uZV9wY2lfcm91dGluZ1tpXS5idXMgIT0gMHhmZjsgaSsrKQorICAgIHsKKwlpZiAoYnVzID09IGFtaWdhb25lX3BjaV9yb3V0aW5nW2ldLmJ1cyAmJiBkZXZpY2UgPT0gYW1pZ2FvbmVfcGNpX3JvdXRpbmdbaV0uZGV2aWNlKQorCXsKKwkgICAgbGluZSA9IHBjaV9pbnRtYXBbYW1pZ2FvbmVfcGNpX3JvdXRpbmdbaV0uaW50c1twaW5dXTsKKwkgICAgUFJJTlRGKCJBc3NpZ25pbmcgSVJRICVkIChwaW4gJWQpXG4iLCBsaW5lLCBwaW4pOworCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGxpbmUpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIFBSSU5URigiVW5rb253biBQQ0kgZGV2aWNlIGZvdW5kXG4iKTsKK30KKwordm9pZCBhcnRpY2lhU19wY2lfaW5pdCAodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBjaGFyICpzOworCisgICAgUFJJTlRGKCJhdHJpY2lhU19wY2lfaW5pdFxuIik7CisKKyAgICAvLyBXaHkgYXJlbid0IHRoZXNlIHJlbG9jYXRlZD8/CisgICAgZm9yIChpPTA7IGNvbmZpZ190YWJsZVtpXS5jb25maWdfZGV2aWNlOyBpKyspCisgICAgeworCXN3aXRjaCgoaW50KWNvbmZpZ190YWJsZVtpXS5jb25maWdfZGV2aWNlKQorCXsKKwljYXNlIGNmZ2Z1bmNfdmlhNjg2OiAgICAgY29uZmlnX3RhYmxlW2ldLmNvbmZpZ19kZXZpY2UgPSB2aWFfY2ZnZnVuY192aWE2ODY7ICAgICAgYnJlYWs7CisJY2FzZSBjZmdmdW5jX2R1bW15OiAgICAgIGNvbmZpZ190YWJsZVtpXS5jb25maWdfZGV2aWNlID0gcGNpX2NmZ2Z1bmNfZHVtbXk7ICAgICAgIGJyZWFrOworCWNhc2UgY2ZnZnVuY19pZGVfaW5pdDogICBjb25maWdfdGFibGVbaV0uY29uZmlnX2RldmljZSA9IHZpYV9jZmdmdW5jX2lkZV9pbml0OyAgICBicmVhazsKKwlkZWZhdWx0OiBQUklOVEYoIkVycm9yOiBVbmtub3duIGNvbnN0YW50XG4iKTsKKwl9CisgICAgfQorCisgICAgYXJ0aWNpYVNfaG9zZS5maXJzdF9idXNubyA9IDA7CisgICAgYXJ0aWNpYVNfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKyAgICBhcnRpY2lhU19ob3NlLmNvbmZpZ190YWJsZSA9IGNvbmZpZ190YWJsZTsKKyAgICBhcnRpY2lhU19ob3NlLmZpeHVwX2lycSA9IGFydGljaWFTX3BjaV9maXh1cF9pcnE7CisKKyAgICBhcnRpY2lhU19wY2lfaXJxX2luaXQoKTsKKworICAgIC8qIFN5c3RlbSBtZW1vcnkgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihhcnRpY2lhU19ob3NlLnJlZ2lvbnMgKyAwLAorCQkgICBBUlRJQ0lBU19TWVNfQlVTLAorCQkgICBBUlRJQ0lBU19TWVNfUEhZUywKKwkJICAgQVJUSUNJQVNfU1lTX01BWFNJWkUsCisJCSAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisgICAgLyogUENJIG1lbW9yeSBzcGFjZSAqLworICAgIHBjaV9zZXRfcmVnaW9uKGFydGljaWFTX2hvc2UucmVnaW9ucyArIDEsCisJCSAgIEFSVElDSUFTX1BDSV9CVVMsCisJCSAgIEFSVElDSUFTX1BDSV9QSFlTLAorCQkgICBBUlRJQ0lBU19QQ0lfTUFYU0laRSwKKwkJICAgUENJX1JFR0lPTl9NRU0pOworCisgICAgLyogUENJIGlvIHNwYWNlICovCisgICAgcGNpX3NldF9yZWdpb24oYXJ0aWNpYVNfaG9zZS5yZWdpb25zICsgMiwKKwkJICAgQVJUSUNJQVNfUENJSU9fQlVTLAorCQkgICBBUlRJQ0lBU19QQ0lJT19QSFlTLAorCQkgICBBUlRJQ0lBU19QQ0lJT19NQVhTSVpFLAorCQkgICBQQ0lfUkVHSU9OX0lPKTsKKworICAgIC8qIFBDSS9JU0EgaW8gc3BhY2UgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihhcnRpY2lhU19ob3NlLnJlZ2lvbnMgKyAzLAorCQkgICBBUlRJQ0lBU19JU0FJT19CVVMsCisJCSAgIEFSVElDSUFTX0lTQUlPX1BIWVMsCisJCSAgIEFSVElDSUFTX0lTQUlPX01BWFNJWkUsCisJCSAgIFBDSV9SRUdJT05fSU8pOworCisKKworICAgIGFydGljaWFTX2hvc2UucmVnaW9uX2NvdW50ID0gNDsKKworICAgIHBjaV9zZXR1cF9pbmRpcmVjdCgmYXJ0aWNpYVNfaG9zZSwgQVJUSUNJQVNfUENJX0NGR0FERFIsIEFSVElDSUFTX1BDSV9DRkdEQVRBKTsKKyAgICBQUklOVEYoIlJlZ2lzdGVyaW5nIGFydGljaWEgaG9zZS4uLlxuIik7CisgICAgcGNpX3JlZ2lzdGVyX2hvc2UoJmFydGljaWFTX2hvc2UpOworICAgIFBSSU5URigiRW5hYmxpbmcgQUdQLi4uXG4iKTsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoUENJX0JERigwLDAsMCksIDB4NTgsIDB4MDEpOworICAgIFBSSU5URigiU2Nhbm5pbmcgYnVzLi4uXG4iKTsKKyAgICBhcnRpY2lhU19ob3NlLmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKCZhcnRpY2lhU19ob3NlKTsKKworICAgIHZpYV9pbml0X2lycV9yb3V0aW5nKHBjaV9pbnRtYXApOworCisgICAgUFJJTlRGKCJBZnRlci1TY2FuIHJlc3VsdHM6XG4iKTsKKyAgICBQUklOVEYoIkJ1cyByYW5nZTogJWQgLSAlZFxuIiwgYXJ0aWNpYVNfaG9zZS5maXJzdF9idXNubyAsIGFydGljaWFTX2hvc2UubGFzdF9idXNubyk7CisKKyAgICB2aWFfaW5pdF9hZnRlcnNjYW4oKTsKKworICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShQQ0lfQkRGKDAsMSwwKSwgUENJX0lOVEVSUlVQVF9MSU5FLCAweEZGKTsKKworICAgIHMgPSBnZXRlbnYoImFzX2lycSIpOworICAgIGlmIChzKQorICAgIHsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoUENJX0JERigwLDAsMCksIFBDSV9JTlRFUlJVUFRfTElORSwgc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDEwKSk7CisgICAgfQorCisgICAgcyA9IGdldGVudigieDg2X3J1bl9iaW9zIik7CisgICAgaWYgKCFzIHx8IChzICYmIHN0cmNtcChzLCAib24iKT09MCkpCisgICAgeworCWlmIChhcnRpY2lhU19pbml0X3ZnYSgpID09IC0xKQorCXsKKwkgICAgLyogSWYgdGhlIFZHQSBkaWRuJ3QgaW5pdCBhbmQgd2UgaGF2ZSBzdGRvdXQgc2V0IHRvIFZHQSwgcmVzZXQgdG8gc2VyaWFsICovCisvKiAJICAgIHMgPSBnZXRlbnYoInN0ZG91dCIpOyAqLworLyogCSAgICBpZiAocyAmJiBzdHJjbXAocywgInZnYSIpID09IDApICovCisvKiAJICAgIHsgKi8KKy8qIAkJc2V0ZW52KCJzdGRvdXQiLCAic2VyaWFsIik7ICovCisvKiAJICAgIH0gKi8KKwl9CisgICAgfQorICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShQQ0lfQkRGKDAsMSwwKSwgUENJX0lOVEVSUlVQVF9MSU5FLCAweEZGKTsKKworfQorCitwY2lfZGV2X3QgcGNpX2hvc2VfZmluZF9jbGFzcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIHNob3J0IGZpbmRfY2xhc3MsIGludCBpbmRleCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3ViX2J1cywgZm91bmRfbXVsdGk9MDsKKyAgICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGNsYXNzOworICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX3R5cGU7CisgICAgcGNpX2Rldl90IGRldjsKKyAgICB1OCBjMSwgYzI7CisKKyAgICBzdWJfYnVzID0gYnVzOworCisgICAgZm9yIChkZXYgPSAgUENJX0JERihidXMsMCwwKTsKKwkgZGV2IDwgIFBDSV9CREYoYnVzLFBDSV9NQVhfUENJX0RFVklDRVMtMSxQQ0lfTUFYX1BDSV9GVU5DVElPTlMtMSk7CisJIGRldiArPSBQQ0lfQkRGKDAsMCwxKSkKKyAgICB7CisJaWYgKCBkZXYgPT0gUENJX0JERihob3NlLT5maXJzdF9idXNubywwLDApICkKKwkgICAgY29udGludWU7CisKKwlpZiAoUENJX0ZVTkMoZGV2KSAmJiAhZm91bmRfbXVsdGkpCisJICAgIGNvbnRpbnVlOworCisJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9IRUFERVJfVFlQRSwgJmhlYWRlcl90eXBlKTsKKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfVkVORE9SX0lELCAmdmVuZG9yKTsKKworCWlmICh2ZW5kb3IgIT0gMHhmZmZmICYmIHZlbmRvciAhPSAweDAwMDApCisJeworCisJICAgIGlmICghUENJX0ZVTkMoZGV2KSkKKwkJZm91bmRfbXVsdGkgPSBoZWFkZXJfdHlwZSAmIDB4ODA7CisJICAgIHBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDBCLCAmYzEpOworCSAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHgwQSwgJmMyKTsKKwkgICAgY2xhc3MgPSBjMTw8OCB8IGMyOworCSAgICAvL3ByaW50ZigiQXQgJTAyeDolMDJ4OiUwMng6IGNsYXNzICV4XG4iLAorCSAgICAvLwkgICBQQ0lfQlVTKGRldiksIFBDSV9ERVYoZGV2KSwgUENJX0ZVTkMoZGV2KSwgY2xhc3MpOworCSAgICBpZiAoY2xhc3MgPT0gZmluZF9jbGFzcykKKwkgICAgeworCQlpZiAoaW5kZXggPT0gMCkKKwkJICAgIHJldHVybiBkZXY7CisJCWVsc2UgaW5kZXgtLTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gfjA7Cit9CisKKworLyoKKyAqIEZvciBhIGdpdmVuIGJ1cyBudW1iZXIsIGZpbmQgdGhlIGJyaWRnZSBvbiB0aGlzIGhvc2UgdGhhdCBwcm92aWRlcyB0aGlzCisgKiBidXMgbnVtYmVyLiBUaGUgZnVuY3Rpb24gc2NhbnMgZm9yIGJyaWRnZXMgYW5kIHBlZWtzIGNvbmZpZyBzcGFjZSBvZmZzZXQKKyAqIDB4MTkgKFBDSV9TRUNPTkRBUllfQlVTKS4KKyAqLworcGNpX2Rldl90IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1c25yKQoreworICAgIHBjaV9kZXZfdCBkZXY7CisgICAgaW50IGJ1czsKKyAgICB1bnNpZ25lZCBpbnQgZm91bmRfbXVsdGk9MDsKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcl90eXBlOworICAgIHVuc2lnbmVkIHNob3J0IHZlbmRvcjsKKyAgICB1bnNpZ25lZCBjaGFyIHNlY29uZGFyeV9idXM7CisKKyAgICBpZiAoaG9zZSA9PSBOVUxMKSBob3NlID0gJmFydGljaWFTX2hvc2U7CisKKyAgICBpZiAoYnVzbnIgPCBob3NlLT5maXJzdF9idXNubyB8fCBidXNuciA+IGhvc2UtPmxhc3RfYnVzbm8pIHJldHVybiBQQ0lfQU5ZX0lEOyAvLyBOb3QgaW4gcmFuZ2UKKworICAgIC8qCisgICAgICogVGhlIGJyaWRnZSBtdXN0IGJlIG9uIGEgbG93ZXIgYnVzIG51bWJlcgorICAgICAqLworICAgIGZvciAoYnVzID0gaG9zZS0+Zmlyc3RfYnVzbm87IGJ1cyA8IGJ1c25yOyBidXMrKykKKyAgICB7CisJZm9yIChkZXYgPSAgUENJX0JERihidXMsMCwwKTsKKwkgICAgIGRldiA8ICBQQ0lfQkRGKGJ1cyxQQ0lfTUFYX1BDSV9ERVZJQ0VTLTEsUENJX01BWF9QQ0lfRlVOQ1RJT05TLTEpOworCSAgICAgZGV2ICs9IFBDSV9CREYoMCwwLDEpKQorCXsKKwkgICAgaWYgKCBkZXYgPT0gUENJX0JERihob3NlLT5maXJzdF9idXNubywwLDApICkKKwkJY29udGludWU7CisKKwkgICAgaWYgKFBDSV9GVU5DKGRldikgJiYgIWZvdW5kX211bHRpKQorCQljb250aW51ZTsKKworCSAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0hFQURFUl9UWVBFLCAmaGVhZGVyX3R5cGUpOworCisJICAgIHBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfVkVORE9SX0lELCAmdmVuZG9yKTsKKworCSAgICBpZiAodmVuZG9yICE9IDB4ZmZmZiAmJiB2ZW5kb3IgIT0gMHgwMDAwKQorCSAgICB7CisKKwkJaWYgKCFQQ0lfRlVOQyhkZXYpKQorCQkgICAgZm91bmRfbXVsdGkgPSBoZWFkZXJfdHlwZSAmIDB4ODA7CisJCWlmIChoZWFkZXJfdHlwZSA9PSAxKSAvLyBCcmlkZ2UgZGV2aWNlIGhlYWRlcgorCQl7CisJCSAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NFQ09OREFSWV9CVVMsICZzZWNvbmRhcnlfYnVzKTsKKwkJICAgIGlmICgoaW50KXNlY29uZGFyeV9idXMgPT0gYnVzbnIpIHJldHVybiBkZXY7CisJCX0KKworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gUENJX0FOWV9JRDsKK30KKworc3RhdGljIHNob3J0IGNsYXNzZXNbXSA9Cit7CisgICAgUENJX0NMQVNTX0RJU1BMQVlfVkdBLAorICAgIFBDSV9DTEFTU19ESVNQTEFZX1hHQSwKKyAgICBQQ0lfQ0xBU1NfRElTUExBWV8zRCwKKyAgICBQQ0lfQ0xBU1NfRElTUExBWV9PVEhFUiwKKyAgICB+MAorfTsKKworZXh0ZXJuIGludCBleGVjdXRlX2Jpb3MocGNpX2Rldl90IGdyX2Rldiwgdm9pZCAqKTsKKworcGNpX2Rldl90IHZpZGVvX2RldjsKKworaW50IGFydGljaWFTX2luaXRfdmdhICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisgICAgZXh0ZXJuIHZvaWQgc2h1dGRvd25fYmlvcyh2b2lkKTsKKyAgICBwY2lfZGV2X3QgZGV2ID0gfjA7CisgICAgaW50IGJ1c25yID0gMDsKKyAgICBpbnQgY2xhc3NuciA9IDA7CisKKyAgICB2aWRlb19kZXYgPSBQQ0lfQU5ZX0lEOworCisgICAgcHJpbnRmKCJWR0E6ICAgIik7CisKKyAgICBQUklOVEYoIlRyeWluZyB0byBpbml0aWFsaXplIHg4NiBWR0EgQ2FyZChzKVxuIik7CisKKyAgICB3aGlsZSAoZGV2ID09IH4wKQorICAgIHsKKwlQUklOVEYoIlNlYXJjaGluZyBmb3IgY2xhc3MgMHgleCBvbiBidXMgJWRcbiIsIGNsYXNzZXNbY2xhc3Nucl0sIGJ1c25yKTsKKwkvKiBGaW5kIHRoZSBmaXJzdCBvZiB0aGlzIGNsYXNzIG9uIHRoaXMgYnVzICovCisJZGV2ID0gcGNpX2hvc2VfZmluZF9jbGFzcygmYXJ0aWNpYVNfaG9zZSwgYnVzbnIsIGNsYXNzZXNbY2xhc3Nucl0sIDApOworCWlmIChkZXYgIT0gfjApIGJyZWFrOworCWJ1c25yKys7CisJaWYgKGJ1c25yID4gYXJ0aWNpYVNfaG9zZS5sYXN0X2J1c25vKQorCXsKKwkgICAgYnVzbnIgPSAwOworCSAgICBjbGFzc25yICsrOworCSAgICBpZiAoY2xhc3Nlc1tjbGFzc25yXSA9PSB+MCkKKwkgICAgeworCQlwcmludGYoIk5PVCBQUkVTRU5UXG4iKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBmb3VuZCB0aGUgZmlyc3QgZ3JhcGhpY3MgY2FyZC4KKyAgICAgKiBJZiB0aGUgYnVzIG51bWJlciBpcyBub3QgMCwgdGhlbiBpdCBpcyBwcm9iYWJseSBiZWhpbmQgYSBicmlkZ2UsIGFuZCB0aGUKKyAgICAgKiBicmlkZ2UgbmVlZHMgdG8gYmUgdG9sZCB0byBmb3J3YXJkIFZHQSBhY2Nlc3MuCisgICAgICovCisKKyAgICBpZiAoUENJX0JVUyhkZXYpICE9IDApCisgICAgeworCXBjaV9kZXZfdCBicmlkZ2U7CisJUFJJTlRGKCJCZWhpbmQgYnJpZGdlLCBsb29raW5nIGZvciBicmlkZ2VcbiIpOworCWJyaWRnZSA9IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKCZhcnRpY2lhU19ob3NlLCBQQ0lfQlVTKGRldikpOworCWlmIChkZXYgIT0gUENJX0FOWV9JRCkKKwl7CisJICAgIHVuc2lnbmVkIGNoYXIgYWdwX2NvbnRyb2xfMDsKKwkgICAgUFJJTlRGKCJHb3QgdGhlIGJyaWRnZSBhdCAlMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgUENJX0JVUyhicmlkZ2UpLCBQQ0lfREVWKGJyaWRnZSksIFBDSV9GVU5DKGJyaWRnZSkpOworCSAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKCZhcnRpY2lhU19ob3NlLCBicmlkZ2UsIDB4M0UsICZhZ3BfY29udHJvbF8wKTsKKwkgICAgYWdwX2NvbnRyb2xfMCB8PSAweDE4OworCSAgICBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZSgmYXJ0aWNpYVNfaG9zZSwgYnJpZGdlLCAweDNFLCBhZ3BfY29udHJvbF8wKTsKKwkgICAgUFJJTlRGKCJDb25maWd1cmVkIGZvciBWR0EgZm9yd2FyZGluZ1xuIik7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogTm93IHRyeSB0byBydW4gdGhlIGJpb3MKKyAgICAgKi8KKworICAgIGlmIChleGVjdXRlX2Jpb3MoZGV2LCBnZC0+cmVsb2NhZGRyKSkKKyAgICB7CisJcHJpbnRmKCJPS1xuIik7CisJdmlkZW9fZGV2ID0gZGV2OworICAgIH0KKyAgICBlbHNlCisgICAgeworCXByaW50ZigiRVJST1JcbiIpOworICAgIH0KKworICAgIFBSSU5URigiRG9uZSBzY2FubmluZy5cbiIpOworCisgICAgc2h1dGRvd25fYmlvcygpOworCisgICAgaWYgKGRldiA9PSBQQ0lfQU5ZX0lEKSByZXR1cm4gLTE7CisgICAgZWxzZSByZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9ib2FyZF9hc21faW5pdC5TIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9ib2FyZF9hc21faW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjFjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2JvYXJkX2FzbV9pbml0LlMKQEAgLTAsMCArMSwxNTcgQEAKKwkjaW5jbHVkZQkibWFjcm9zLmgiCisJCisJCisKKyNkZWZpbmUgR0xPQkFMSU5GTzAJICAgICAgMHg1MAkKKyNkZWZpbmUgR0xPQkFMSU5GTzBfQk8gICAgICAgICgxPDw3KQorI2RlZmluZSBHTE9CQUxJTkZPMl9CMUFSQklURVIgKDE8PDYpCisjZGVmaW5lIEhCVVNBQ1IwICAgICAgICAgICAgICAweDVjCisjZGVmaW5lIEhCVVNBQ1IyX0JVUlNUICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSEJVU0FDUjJfTEFUICAgICAgICAgICgxPDwxKQorCQorI2RlZmluZSBSRUNFSVZFUl9IT0xESU5HIDAKKyNkZWZpbmUgVFJBTlNNSVRURVJfSE9MRElORyAwCisjZGVmaW5lIElOVEVSUlVQVF9FTkFCTEUgMQorI2RlZmluZSBJTlRFUlJVUFRfU1RBVFVTIDIKKyNkZWZpbmUgRklGT19DT05UUk9MIDIKKyNkZWZpbmUgTElORV9DT05UUk9MIDMKKyNkZWZpbmUgTU9ERU1fQ09OVFJPTCA0CisjZGVmaW5lIExJTkVfU1RBVFVTIDUKKyNkZWZpbmUgTU9ERU1fU1RBVFVTIDYKKyNkZWZpbmUgU0NSQVRDSF9QQUQgNworCisjZGVmaW5lIERJVklTT1JfTEFUQ0hfTFNCIDAKKyNkZWZpbmUgRElWSVNPUl9MQVRDSF9NU0IgMQorI2RlZmluZSBQUkVTQ0FMRVJfRElWSVNJT04gNQorCisjZGVmaW5lIFVBUlQoeCkgKDB4M2Y4Kyh4KSkKKworI2RlZmluZSBHTE9CQUxJTkZPMCAgICAgICAgICAgMHg1MAorI2RlZmluZSBHTE9CQUxJTkZPMF9CTyAgICAgICAgKDE8PDcpCisjZGVmaW5lIEdMT0JBTElORk8yX0IxQVJCSVRFUiAoMTw8NikKKyNkZWZpbmUgSEJVU0FDUjAgICAgICAgICAgICAgIDB4NWMKKyNkZWZpbmUgSEJVU0FDUjJfQlVSU1QgICAgICAgICgxPDwwKQorI2RlZmluZSBIQlVTQUNSMl9MQVQgICAgICAgICAgKDE8PDEpCisKKyNkZWZpbmUgU1VQRVJJT18xICAgICAgICAgICAgICAgKCg3IDw8IDMpIHwgKDApKQorI2RlZmluZSBTVVBFUklPXzIgICAgICAgICAgICAgICAoKDcgPDwgMykgfCAoMSkpCisJCisJLmdsb2JsCWJvYXJkX2FzbV9pbml0CisJCitib2FyZF9hc21faW5pdDoKKwltZmxyCXIyOQorCS8qIFNldCAnTXVzdC1zZXQnIHJlZ2lzdGVyICovCisJbGkJcjMsIDAKKwlsaQlyNCwgMAorCWxpCXI1LCAweDVlCisJYmwJcGNpX3JlYWRfY2ZnX2J5dGUKKwlvcmkJcjMsIHIzLCAoMTw8MSkKKwl4b3JpCXI2LCByMywgKDE8PDEpCisJbGkJcjMsIDAKKwlibAlwY2lfd3JpdGVfY2ZnX2J5dGUKKworCWxpCXIzLCAwCisJbGkJcjUsIDB4NTIKKwlibAlwY2lfcmVhZF9jZmdfYnl0ZQorCW9yaQlyNiwgcjMsICgxPDw2KQorCWxpCXIzLCAwCisJYmwJcGNpX3dyaXRlX2NmZ19ieXRlCisKKwlsaQlyMywgMAorCWxpCXI0LCAweDA4CisJbGkJcjUsIDB4ZDIKKwlibAlwY2lfcmVhZF9jZmdfYnl0ZQorCW9yaQlyNiwgcjMsICgxPDwyKQorCWxpCXIzLCAwCisJYmwJcGNpX3dyaXRlX2NmZ19ieXRlCisKKworCS8qIERvIFBDSSByZXNldCAqLworLyoJbGkJcjMsIDAKKwlsaQlyNCwgMHgzOAorCWxpCXI1LCAweDQ3CisJYmwJcGNpX3JlYWRfY2ZnX2J5dGUKKwlvcmkJcjYsIHIzLCAweDAxCisJbGkJcjMsIDAKKwlsaQlyNCwgMHgzOAorCWxpCXI1LCAweDQ3CisJYmwJcGNpX3dyaXRlX2NmZ19ieXRlKi8KKworCQorCS8qIEVuYWJsZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgKi8KKwlsaQlyMywgMAorCWxpCXI0LCAwCisJbGkJcjUsIDB4NTYKKwlsaQlyNiwgMHgwQgorCWJsCXBjaV93cml0ZV9jZmdfYnl0ZQorCisKKwkvKiBJbml0IFN1cGVyLUkvTyBjaGlwcyAqLworCisJc2lvd2IJMHg0MCwgMHgwOAorCXNpb3diCTB4NDEsIDB4MDEKKwlzaW93YgkweDQ1LCAweDgwCisJc2lvd2IJMHg0NiwgMHg2MAkKKwlzaW93YgkweDQ3LCAweDIwCisJc2lvd2IJMHg0OCwgMHgwMQorCXNpb3diCTB4NGEsIDB4YzQKKwlzaW93YgkweDUwLCAweDBlCisJc2lvd2IJMHg1MSwgMHg3NgorCXNpb3diCTB4NTIsIDB4MzQKKwlzaW93YgkweDU0LCAweDAwCisJc2lvd2IJMHg1NSwgMHg5MAorCXNpb3diCTB4NTYsIDB4OTkKKwlzaW93YgkweDU3LCAweDkwCisJc2lvd2IJMHg4NSwgMHgwMQorCQkKKwkvKiBFbmFibGUgY29uZmlndXJhdGlvbiBtb2RlIGZvciBTdXBlcklPICovCisJbGkJcjMsIDAKKwlsaQlyNCwgKDc8PDMpCisJbGkJcjUsIDB4ODUKKwlibAlwY2lfcmVhZF9jZmdfYnl0ZQorCW9yaQlyNiwgcjMsIDB4MDIKKwltcglyMzEsIHI2CisJbGkJcjMsMAorCWJsCXBjaV93cml0ZV9jZmdfYnl0ZQorCisJLyogQ09NMSBhcyAzZjggKi8KKwlvdXRiCTB4M2YwLCAweGU3CisJb3V0YgkweDNmMSwgMHhmZQorCisJLyogQ09NMiBhcyAyZjggKi8KKwlvdXRiCTB4M2YwLCAweGU4CisJb3V0YgkweDNmMSwgMHhlYgorCisJLyogRW5hYmxlICovCisJb3V0YgkweDNmMCwgMHhlMgorCWluYglyMywgMHgzZjEKKwlvcmkJcjMsIHIzLCAweDBjCisJb3V0YgkweDNmMCwgMHhlMgorCW91dGJyCTB4M2YxLCByMworCQorCS8qIERpc2FibGUgY29uZmlndXJhdGlvbiBtb2RlICovCisJbGkJcjMsIDAKKwlsaQlyNCwgKDc8PDMpCisJbGkJcjUsIDB4ODUKKwltcglyNiwgcjMxCisJYmwJcGNpX3dyaXRlX2NmZ19ieXRlCisKKwkvKiBTZXQgbGluZSBjb250cm9sICovCisJb3V0YglVQVJUKExJTkVfQ09OVFJPTCksIDB4ODMKKwlvdXRiCVVBUlQoRElWSVNPUl9MQVRDSF9MU0IpLCAweDBjCisJb3V0YglVQVJUKERJVklTT1JfTEFUQ0hfTVNCKSwgMHgwMAorCW91dGIJVUFSVChMSU5FX0NPTlRST0wpLCAweDMKKworCW10bHIJcjI5CisJYmxyCisKKwkJCisJLmdsb2JsCW5ld19yZXNldAorCS5nbG9ibAluZXdfcmVzZXRfZW5kCituZXdfcmVzZXQ6CisJbGkJcjAsIDB4MTAwCisJb3JpcwlyMCwgcjAsIDB4RkZGMAorCW10bHIJcjAKKwlibHIKKwkKK25ld19yZXNldF9lbmQ6CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY21kX2Jvb3RhLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGFhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jCkBAIC0wLDAgKzEsMTIzIEBACisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290YS5oPgorI2luY2x1ZGUgIi4uL2Rpc2svcGFydF9hbWlnYS5oIgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisKKyN1bmRlZiBCT09UQV9ERUJVRworCisjaWZkZWYgQk9PVEFfREVCVUcKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKK3N0cnVjdCBibG9ja19oZWFkZXIgeworCXUzMiBpZDsKKwl1MzIgc3VtbWVkX2xvbmdzOworCXMzMiBjaGtfc3VtOworfTsKKworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKmlkZV9nZXRfZGV2IChpbnQgZGV2KTsKK2V4dGVybiBzdHJ1Y3QgYm9vdGNvZGVfYmxvY2sgKmdldF9ib290Y29kZSAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKTsKK2V4dGVybiBpbnQgc3VtX2Jsb2NrIChzdHJ1Y3QgYmxvY2tfaGVhZGVyICpoZWFkZXIpOworCitzdHJ1Y3QgYm9vdGNvZGVfYmxvY2sgYmJsazsKKworaW50IGRvX2Jvb3RhIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgY2hhciAqbG9hZF9hZGRyZXNzID0gKHVuc2lnbmVkIGNoYXIgKikgQ0ZHX0xPQURfQUREUjsKKwl1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwl1bnNpZ25lZCBsb25nIHBhcnRfbnVtYmVyID0gMDsKKwlibG9ja19kZXZfZGVzY190ICpib290X2Rpc2s7CisJY2hhciAqczsKKwlzdHJ1Y3QgYm9vdGNvZGVfYmxvY2sgKmJvb3RfY29kZTsKKworCS8qIEdldCBwYXJhbWV0ZXJzICovCisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCWxvYWRfYWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopIHNpbXBsZV9zdHJ0b2wgKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJcGFydF9udW1iZXIgPSAwOworCQlicmVhazsKKwljYXNlIDM6CisJCWxvYWRfYWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopIHNpbXBsZV9zdHJ0b2wgKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJcGFydF9udW1iZXIgPSBzaW1wbGVfc3RydG9sIChhcmd2WzJdLCBOVUxMLCAxNik7CisJCWJyZWFrOworCX0KKworCWJhc2VfYWRkcmVzcyA9IGxvYWRfYWRkcmVzczsKKworCVBSSU5URiAoIkxvYWRpbmcgYm9vdCBjb2RlIGZyb20gZGlzayAlZCB0byAlcFxuIiwgcGFydF9udW1iZXIsCisJCQlsb2FkX2FkZHJlc3MpOworCisJLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgZGlzayBkZXZpY2UgKi8KKwlib290X2Rpc2sgPSBpZGVfZ2V0X2RldiAocGFydF9udW1iZXIpOworCWlmICghYm9vdF9kaXNrKSB7CisJCVBSSU5URiAoIlVua25vd24gZGlzayAlZFxuIiwgcGFydF9udW1iZXIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGaW5kIHRoZSBib290Y29kZSBibG9jayAqLworCWJvb3RfY29kZSA9IGdldF9ib290Y29kZSAoYm9vdF9kaXNrKTsKKwlpZiAoIWJvb3RfY29kZSkgeworCQlQUklOVEYgKCJOb3QgYSBib290YWJsZSBkaXNrICVkXG4iLCBwYXJ0X251bWJlcik7CisJCXJldHVybiAxOworCX0KKworCS8qIE9ubHkgdXNlIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYmxvY2sgKi8KKwlvZmZzZXQgPSBib290X2NvZGUtPmxvYWRfZGF0YVswXTsKKwltZW1jcHkgKGxvYWRfYWRkcmVzcywgJmJvb3RfY29kZS0+bG9hZF9kYXRhWzFdLCAxMjIgKiA0KTsKKwlsb2FkX2FkZHJlc3MgKz0gMTIyICogNDsKKworCS8qIFNldHVwIGZvciB0aGUgbG9vcCAqLworCWJibGsubmV4dCA9IGJvb3RfY29kZS0+bmV4dDsKKwlib290X2NvZGUgPSAmYmJsazsKKworCS8qIFNjYW4gdGhlIGNoYWluLCBhbmQgY29weSB0aGUgbG9hZGVyIHN1Y2Nlc2l2ZWx5IGludG8gdGhlIGRlc3RpbmF0aW9uIGFyZWEgKi8KKwl3aGlsZSAoMHhmZmZmZmZmZiAhPSBib290X2NvZGUtPm5leHQpIHsKKwkJUFJJTlRGICgiTG9hZGluZyBibG9jayAlZFxuIiwgYm9vdF9jb2RlLT5uZXh0KTsKKworCQkvKiBMb2FkIGJsb2NrICovCisJCWlmICgxICE9CisJCQlib290X2Rpc2stPmJsb2NrX3JlYWQgKGJvb3RfZGlzay0+ZGV2LCBib290X2NvZGUtPm5leHQsIDEsCisJCQkJCQkJCSAgICh1bG9uZyAqKSAmIGJibGspKSB7CisJCQlQUklOVEYgKCJSZWFkIGVycm9yXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogY2hlY2sgc3VtICovCisJCWlmIChzdW1fYmxvY2sgKChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopICh1bG9uZyAqKSAmIGJibGspICE9IDApIHsKKwkJCVBSSU5URiAoIkNoZWNrc3VtIGVycm9yXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogT2ssIGNvbmNhdGVuYXRlIGl0IHRvIHRoZSBhbHJlYWR5IGxvYWRlZCBjb2RlICovCisJCW1lbWNweSAobG9hZF9hZGRyZXNzLCBib290X2NvZGUtPmxvYWRfZGF0YSwgMTIzICogNCk7CisJCWxvYWRfYWRkcmVzcyArPSAxMjMgKiA0OworCX0KKworCXByaW50ZiAoIkJvb3Rjb2RlIGxvYWRlZCB0byAlcCAoc2l6ZSAlZClcbiIsIGJhc2VfYWRkcmVzcywKKwkJCWxvYWRfYWRkcmVzcyAtIGJhc2VfYWRkcmVzcyk7CisJcHJpbnRmICgiRW50cnkgcG9pbnQgYXQgJXBcbiIsIGJhc2VfYWRkcmVzcyArIG9mZnNldCk7CisKKwlmbHVzaF9jYWNoZSAoYmFzZV9hZGRyZXNzLCBsb2FkX2FkZHJlc3MgLSBiYXNlX2FkZHJlc3MpOworCisKKwlzID0gZ2V0ZW52ICgiYXV0b3N0YXJ0Iik7CisJaWYgKHMgJiYgc3RyY21wIChzLCAieWVzIikgPT0gMCkgeworCQlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCQl2b2lkICgqYm9vdCkgKGJkX3QgKiwgY2hhciAqLCBibG9ja19kZXZfZGVzY190ICopOworCQljaGFyICphcmdzOworCisJCWJvb3QgPSAodm9pZCAoKikoYmRfdCAqLCBjaGFyICosIGJsb2NrX2Rldl9kZXNjX3QgKikpIChiYXNlX2FkZHJlc3MgKyBvZmZzZXQpOworCQlib290IChnZC0+YmQsIGdldGVudiAoImFtaWdhX2Jvb3RhcmdzIiksIGJvb3RfZGlzayk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY29uZmlnLm1rIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzN2NkOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMKKyMgQW1pZ2FPbmVHM1NFIGJvYXJkcworIworCitYODZFTVUgPSAgLUkuLi9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZSAtSS4uL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11CisKK1RFWFRfQkFTRSA9IDB4ZmZmMDAwMDAKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1XYSwtbXJlZ25hbWVzIC1ERUFTVEVSRUdHICQoWDg2RU1VKSAjLURERUJVRworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2VuZXQuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvZW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWE4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2VuZXQuYwpAQCAtMCwwICsxLDg4NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogQWRhbSBLb3dhbGN6eWssIEFDSyBTb2Z0d2FyZSBDb250cm9scyBJbmMuIGFrb3dhbGN6eWtAY29nZWNvLmNhCisgKgorICogU29tZSBwb3J0aW9ucyB0YWtlbiBmcm9tIDNjNTl4LmMgV3JpdHRlbiAxOTk2LTE5OTkgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBPdXRsaW5lIG9mIHRoZSBwcm9ncmFtIGJhc2VkIG9uIGVlcHJvMTAwLmMgd2hpY2ggaXMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaW5jbHVkZSAiYXJ0aWNpYVMuaCIKKyNpbmNsdWRlICJtZW1pby5oIgorCisvKiAzQ29tIEV0aGVybmV0IFBDSSBkZWZpbml0aW9ucyovCisKKy8vICNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zQ09NCQkweDEwQjcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1QwkweDkyMDAKKworLyogM0NvbSBDb21tYW5kcywgdG9wIDUgYml0cyBhcmUgY29tbWFuZCBhbmQgYm90dG9tIDExIGJpdHMgYXJlIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBUb3RhbFJlc2V0IAkJKDA8PDExKSAKKyNkZWZpbmUgU2VsZWN0V2luZG93IAkJKDE8PDExKQorI2RlZmluZSBTdGFydENvYXggCQkoMjw8MTEpCisjZGVmaW5lIFJ4RGlzYWJsZSAJCSgzPDwxMSkgCisjZGVmaW5lIFJ4RW5hYmxlIAkJKDQ8PDExKSAKKyNkZWZpbmUgUnhSZXNldCAJCSg1PDwxMSkKKyNkZWZpbmUgVXBTdGFsbCAJCSg2PDwxMSkgCisjZGVmaW5lIFVwVW5zdGFsbCAJCSg2PDwxMSkrMQorI2RlZmluZSBEb3duU3RhbGwgCQkoNjw8MTEpKzIgCisjZGVmaW5lIERvd25VbnN0YWxsIAkJKDY8PDExKSszCisjZGVmaW5lIFJ4RGlzY2FyZCAJCSg4PDwxMSkKKyNkZWZpbmUgVHhFbmFibGUgCQkoOTw8MTEpCisjZGVmaW5lIFR4RGlzYWJsZSAJCSgxMDw8MTEpIAorI2RlZmluZSBUeFJlc2V0IAkJKDExPDwxMSkKKyNkZWZpbmUgRmFrZUludHIgCQkoMTI8PDExKSAKKyNkZWZpbmUgQWNrSW50ciAJCSgxMzw8MTEpIAorI2RlZmluZSBTZXRJbnRyRW5iIAkJKDE0PDwxMSkKKyNkZWZpbmUgU2V0U3RhdHVzRW5iIAkJKDE1PDwxMSkgCisjZGVmaW5lIFNldFJ4RmlsdGVyIAkJKDE2PDwxMSkKKyNkZWZpbmUgU2V0UnhUaHJlc2hvbGQgCQkoMTc8PDExKQorI2RlZmluZSBTZXRUeFRocmVzaG9sZCAJCSgxODw8MTEpIAorI2RlZmluZSBTZXRUeFN0YXJ0IAkJKDE5PDwxMSkKKyNkZWZpbmUgU3RhcnRETUFVcCAJCSgyMDw8MTEpCisjZGVmaW5lIFN0YXJ0RE1BRG93biAJCSgyMDw8MTEpKzEKKyNkZWZpbmUgU3RhdHNFbmFibGUJCSgyMTw8MTEpCisjZGVmaW5lIFN0YXRzRGlzYWJsZQkJKDIyPDwxMSkgCisjZGVmaW5lIFN0b3BDb2F4IAkJKDIzPDwxMSkKKyNkZWZpbmUgU2V0RmlsdGVyQml0IAkJKDI1PDwxMSkKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXMgKi8KKworI2RlZmluZSBSeFN0YXRpb24gCQkxIAorI2RlZmluZSBSeE11bHRpY2FzdAkJMiAKKyNkZWZpbmUgUnhCcm9hZGNhc3QJCTQgCisjZGVmaW5lIFJ4UHJvbSAJCQk4CisKKy8qIDNDb20gc3RhdHVzIHdvcmQgZGVmbml0aW9ucyAqLworCisjZGVmaW5lIEludExhdGNoIAkJMHgwMDAxCisjZGVmaW5lIEhvc3RFcnJvciAJCTB4MDAwMgorI2RlZmluZSBUeENvbXBsZXRlIAkJMHgwMDA0CisjZGVmaW5lIFR4QXZhaWxhYmxlIAkJMHgwMDA4CisjZGVmaW5lIFJ4Q29tcGxldGUgCQkweDAwMTAgCisjZGVmaW5lIFJ4RWFybHkgCQkweDAwMjAKKyNkZWZpbmUgSW50UmVxIAkJCTB4MDA0MAorI2RlZmluZSBTdGF0c0Z1bGwgCQkweDAwODAKKyNkZWZpbmUgRE1BRG9uZSAJCSgxPDw4KQorI2RlZmluZSBEb3duQ29tcGxldGUgCQkoMTw8OSkgCisjZGVmaW5lIFVwQ29tcGxldGUgCQkoMTw8MTApCisjZGVmaW5lIERNQUluUHJvZ3Jlc3MgCQkoMTw8MTEpCQkJLyogRE1BIGNvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeS4qLworI2RlZmluZSBDbWRJblByb2dyZXNzIAkJKDE8PDEyKSAgICAgICAgICAgCS8qIEVMM19DTUQgaXMgc3RpbGwgYnVzeS4qLworCisvKiBQb2xsaW5nIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIERuUG9sbAkJCTB4MmQKKyNkZWZpbmUgVXBQb2xsCQkJMHgzZAorCisvKiBSZWdpc3RlciB3aW5kb3cgMCBvZmZldHMgKi8KKworI2RlZmluZSBXbjBFZXByb21DbWQgCQkxMAkgICAgICAgICAgCS8qIFdpbmRvdyAwOiBFRVBST00gY29tbWFuZCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgV24wRWVwcm9tRGF0YSAJCTEyICAgICAgICAgICAgIAkJLyogV2luZG93IDA6IEVFUFJPTSByZXN1bHRzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBJbnRyU3RhdHVzCQkweDBFCSAgICAgICAgICAgICAgICAvKiBWYWxpZCBpbiBhbGwgd2luZG93cy4gKi8KKworLyogUmVnaXN0ZXIgd2luZG93IDAgRUVQUk9NIGJpdHMgKi8KKworI2RlZmluZSBFRVBST01fUmVhZCAJCTB4ODAKKyNkZWZpbmUgRUVQUk9NX1dSSVRFIAkJMHg0MAorI2RlZmluZSBFRVBST01fRVJBU0UgCQkweEMwCisjZGVmaW5lIEVFUFJPTV9FV0VOQiAJCTB4MzAgICAgICAgICAgICAJLyogRW5hYmxlIGVyYXNpbmcvd3JpdGluZyBmb3IgMTAgbXNlYy4gKi8KKyNkZWZpbmUgRUVQUk9NX0VXRElTIAkJMHgwMCAgICAgICAgICAgIAkvKiBEaXNhYmxlIEVXRU5CIGJlZm9yZSAxMCBtc2VjIHRpbWVvdXQuICovCisKKy8qIEVFUFJPTSBsb2NhdGlvbnMuICovCisKKyNkZWZpbmUgUGh5c0FkZHIwMQkJMCAKKyNkZWZpbmUgUGh5c0FkZHIyMwkJMQorI2RlZmluZSBQaHlzQWRkcjQ1CQkyIAorI2RlZmluZSBNb2RlbElECQkJMworI2RlZmluZSBFdGhlckxpbmszSUQJCTcgCisjZGVmaW5lIElGWGN2cklPCQk4IAorI2RlZmluZSBJUlFMaW5lCQkJOQorI2RlZmluZSBOb2RlQWRkcjAxCQkxMCAKKyNkZWZpbmUgTm9kZUFkZHIyMwkJMTEgCisjZGVmaW5lIE5vZGVBZGRyNDUJCTEyCisjZGVmaW5lIERyaXZlclR1bmUJCTEzIAorI2RlZmluZSBDaGVja3N1bQkJMTUKKworLyogUmVnaXN0ZXIgd2luZG93IDEgb2Zmc2V0cywgdGhlIHdpbmRvdyB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb24gKi8KKworI2RlZmluZSBUWF9GSUZPIAkJMHgxMCAgCisjZGVmaW5lIFJYX0ZJRk8gCQkweDEwICAKKyNkZWZpbmUgUnhFcnJvcnMgCQkweDE0CisjZGVmaW5lIFJ4U3RhdHVzIAkJMHgxOCAgCisjZGVmaW5lIFRpbWVyCQkJMHgxQSAKKyNkZWZpbmUgVHhTdGF0dXMgCQkweDFCCisjZGVmaW5lIFR4RnJlZSAJCQkweDFDCSAJCS8qIFJlbWFpbmluZyBmcmVlIGJ5dGVzIGluIFR4IGJ1ZmZlci4gKi8KKworLyogUmVnaXN0ZXIgV2luZG93IDIgKi8KKyAgICAgICAgCisjZGVmaW5lIFduMl9SZXNldE9wdGlvbnMJMTIKKworLyogUmVnaXN0ZXIgV2luZG93IDM6IE1BQy9jb25maWcgYml0cyAqLworCisjZGVmaW5lIFduM19Db25maWcJCTAJCQkvKiBJbnRlcm5hbCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFduM19NQUNfQ3RybAkJNgorI2RlZmluZSBXbjNfT3B0aW9ucwkJOAorCisjZGVmaW5lIEJGRVhUKHZhbHVlLCBvZmZzZXQsIGJpdGNvdW50KSAgCQkJCQlcCisgICAgCSgoKCh1bnNpZ25lZCBsb25nKSh2YWx1ZSkpID4+IChvZmZzZXQpKSAmICgoMSA8PCAoYml0Y291bnQpKSAtIDEpKQorCisjZGVmaW5lIEJGSU5TKGxocywgcmhzLCBvZmZzZXQsIGJpdGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgobGhzKSAmIH4oKCgoMSA8PCAoYml0Y291bnQpKSAtIDEpKSA8PCAob2Zmc2V0KSkpIHwgICAJCVwKKyAgICAgICAgKCgocmhzKSAmICgoMSA8PCAoYml0Y291bnQpKSAtIDEpKSA8PCAob2Zmc2V0KSkpCisKKyNkZWZpbmUgUkFNX1NJWkUodikgICAgICAgICAgICAgQkZFWFQodiwgMCwgMykKKyNkZWZpbmUgUkFNX1dJRFRIKHYpICAgIAlCRkVYVCh2LCAzLCAxKQorI2RlZmluZSBSQU1fU1BFRUQodikgICAgCUJGRVhUKHYsIDQsIDIpCisjZGVmaW5lIFJPTV9TSVpFKHYpICAgICAgICAgICAgIEJGRVhUKHYsIDYsIDIpCisjZGVmaW5lIFJBTV9TUExJVCh2KSAgICAJQkZFWFQodiwgMTYsIDIpCisjZGVmaW5lIFhDVlIodikgICAgICAgICAgICAgICAgIEJGRVhUKHYsIDIwLCA0KQorI2RlZmluZSBBVVRPU0VMRUNUKHYpICAgCUJGRVhUKHYsIDI0LCAxKQorCisvKiBSZWdpc3RlciBXaW5kb3cgNDogWGN2ci9tZWRpYSBiaXRzICovCisgICAgICAgIAorI2RlZmluZSBXbjRfRklGT0RpYWcgCQk0CisjZGVmaW5lIFduNF9OZXREaWFnIAkJNgorI2RlZmluZSBXbjRfUGh5c2ljYWxNZ210CTgKKyNkZWZpbmUgV240X01lZGlhIAkJMTAKKworI2RlZmluZSBNZWRpYV9TUUUgCQkweDAwMDggICAgIAkJLyogRW5hYmxlIFNRRSBlcnJvciBjb3VudGluZyBmb3IgQVVJLiAqLworI2RlZmluZSBNZWRpYV8xMFRQIAkJMHgwMEMwCQkJLyogRW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGZvciAxMGJhc2VULiAqLworI2RlZmluZSBNZWRpYV9MbmsgCQkweDAwODAJCQkvKiBFbmFibGUganVzdCBsaW5rIGJlYXQgZm9yIDEwMFRYLzEwMEZYLiAqLworI2RlZmluZSBNZWRpYV9MbmtCZWF0IAkJMHgwODAwCisKKy8qIFJlZ2lzdGVyIFdpbmRvdyA3OiBCdXMgTWFzdGVyIGNvbnRyb2wgKi8KKworI2RlZmluZSBXbjdfTWFzdGVyQWRkciAJCTAKKyNkZWZpbmUgV243X01hc3RlckxlbiAJCTYKKyNkZWZpbmUgV243X01hc3RlclN0YXR1cyAJMTIKKworLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgY29udHJvbCByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgUGt0U3RhdHVzIAkJMHgyMAorI2RlZmluZSBEb3duTGlzdFB0cgkJMHgyNAorI2RlZmluZSBGcmFnQWRkciAJCTB4MjgKKyNkZWZpbmUgRnJhZ0xlbiAJCTB4MmMKKyNkZWZpbmUgVHhGcmVlVGhyZXNob2xkIAkweDJmCisjZGVmaW5lIFVwUGt0U3RhdHVzIAkJMHgzMAorI2RlZmluZSBVcExpc3RQdHIgCQkweDM4CisKKy8qIFRoZSBSeCBhbmQgVHggZGVzY3JpcHRvciBsaXN0cy4gKi8KKworI2RlZmluZSBMQVNUX0ZSQUcgICAgICAgMHg4MDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IEFkZHIvTGVuIHBhaXIgaW4gZGVzY3JpcHRvci4gKi8KKyNkZWZpbmUgRE5fQ09NUExFVEUgICAgIDB4MDAwMTAwMDAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBwYWNrZXQgaGFzIGJlZW4gZG93bmxvYWRlZCAqLworCitzdHJ1Y3QgcnhfZGVzY18zY29tIHsKKyAgICAgICAgdTMyIG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMAkgICAJKi8KKyAgICAgICAgdTMyIHN0YXR1czsJCQkJCS8qIEZTSCAtPiBGcmFtZSBTdGFydCBIZWFkZXIgCQkqLworICAgICAgICB1MzIgYWRkcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcCB0byA2MyBhZGRyL2xlbiBwYWlycyBwb3NzaWJsZSAJKi8KKyAgICAgICAgdTMyIGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IExBU1RfRlJBRyB0byBpbmRpY2F0ZSBsYXN0IHBhaXIJKi8KK307CisKKy8qIFZhbHVlcyBmb3IgdGhlIFJ4IHN0YXR1cyBlbnRyeS4gKi8KKworI2RlZmluZSBSeERDb21wbGV0ZQkJMHgwMDAwODAwMAorI2RlZmluZSBSeERFcnJvcgkJMHg0MDAwCisjZGVmaW5lIElQQ2hrc3VtRXJyCQkoMTw8MjUpIAorI2RlZmluZSBUQ1BDaGtzdW1FcnIJCSgxPDwyNikgCisjZGVmaW5lIFVEUENoa3N1bUVycgkJKDE8PDI3KQorI2RlZmluZSBJUENoa3N1bVZhbGlkCQkoMTw8MjkpIAorI2RlZmluZSBUQ1BDaGtzdW1WYWxpZAkJKDE8PDMwKQorI2RlZmluZSBVRFBDaGtzdW1WYWxpZAkJKDE8PDMxKQorCitzdHJ1Y3QgdHhfZGVzY18zY29tIHsKKyAgICAgICAgdTMyIG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMAkJKi8KKyAgICAgICAgdTMyIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyAwOjEyIGxlbmd0aCwgb3RoZXJzIHNlZSBiZWxvdwkqLworICAgICAgICB1MzIgYWRkcjsKKyAgICAgICAgdTMyIGxlbmd0aDsKK307CisKKy8qIFZhbHVlcyBmb3IgdGhlIFR4IHN0YXR1cyBlbnRyeS4gKi8KKworI2RlZmluZSBDUkNEaXNhYmxlCQkweDIwMDAKKyNkZWZpbmUgVHhEQ29tcGxldGUJCTB4ODAwMAorI2RlZmluZSBBZGRJUENoa3N1bQkJMHgwMjAwMDAwMAorI2RlZmluZSBBZGRUQ1BDaGtzdW0JCTB4MDQwMDAwMDAKKyNkZWZpbmUgQWRkVURQQ2hrc3VtCQkweDA4MDAwMDAwCisjZGVmaW5lIFR4SW50clVwbG9hZGVkCQkweDgwMDAwMDAwICAgICAgICAgICAgICAvKiBJUlEgd2hlbiBpbiBGSUZPLCBidXQgbWF5YmUgbm90IHNlbnQuICovCisKKy8qIFhDVlIgVHlwZXMgKi8KKworI2RlZmluZSBYQ1ZSXzEwYmFzZVQJCTAKKyNkZWZpbmUgWENWUl9BVUkJCTEgCisjZGVmaW5lIFhDVlJfMTBiYXNlVE9ubHkJMgorI2RlZmluZSBYQ1ZSXzEwYmFzZTIJCTMgCisjZGVmaW5lIFhDVlJfMTAwYmFzZVR4CQk0CisjZGVmaW5lIFhDVlJfMTAwYmFzZUZ4CQk1CisjZGVmaW5lIFhDVlJfTUlJCQk2CisjZGVmaW5lIFhDVlJfTldBWQkJOAorI2RlZmluZSBYQ1ZSX0V4dE1JSQkJOQorI2RlZmluZSBYQ1ZSX0RlZmF1bHQJCTEwCQkJLyogSSBkb24ndCB0aGluayB0aGlzIGlzIGNvcnJlY3QgLT4gc2hvdWxkIGhhdmUgYmVlbiAweDEwIGlmIEF1dG8gTmVnb3RpYXRlICovCisKK3N0cnVjdCBkZXNjcmlwdG9yIHsJCQkgICAgCQkvKiBBIGdlbmVyaWMgZGVzY3JpcHRvci4gKi8KKyAgICAgICAgdTMyIG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMAkgICAJKi8KKyAgICAgICAgdTMyIHN0YXR1czsJCQkJCS8qIEZTSCAtPiBGcmFtZSBTdGFydCBIZWFkZXIgCQkqLworICAgICAgICB1MzIgYWRkcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcCB0byA2MyBhZGRyL2xlbiBwYWlycyBwb3NzaWJsZSAJKi8KKyAgICAgICAgdTMyIGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IExBU1RfRlJBRyB0byBpbmRpY2F0ZSBsYXN0IHBhaXIJKi8KK307CisKKy8qIE1pc2MuIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgTlVNX1JYX0RFU0MgCQlQS1RCVUZTUlggKiAxMAorI2RlZmluZSBOVU1fVFhfREVTQyAJCTEgICAgICAgICAgICAvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgICAqLworCisjZGVmaW5lIFRPVVRfTE9PUAkJMTAwMDAwMAorCisjZGVmaW5lIEVUSF9BTEVOCQk2CisKKyNkZWZpbmUgRUwzV0lORE9XKGRldiwgd2luX251bSkgRVRIX09VVFcoZGV2LCBTZWxlY3RXaW5kb3cgKyAod2luX251bSksIEVMM19DTUQpCisjZGVmaW5lIEVMM19DTUQgMHgwZQorI2RlZmluZSBFTDNfU1RBVFVTIDB4MGUKKworCisjdW5kZWYgRVRIX0RFQlVHCisKKyNpZmRlZiBFVEhfREVCVUcKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKSAgICAgcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgcnhfZGVzY18zY29tICpyeF9yaW5nOwkJIAkvKiBSWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAJCSovCitzdGF0aWMgc3RydWN0IHR4X2Rlc2NfM2NvbSAqdHhfcmluZzsJCSAJLyogVFggZGVzY3JpcHRvciByaW5nICAgICAgICAgCQkqLworc3RhdGljIHU4IHJ4X2J1ZmZlcltOVU1fUlhfREVTQ11bUEtUU0laRV9BTElHTl07CS8qIHN0b3JhZ2UgZm9yIHRoZSBpbmNvbWluZyBtZXNzYWdlcyAJKi8KK3N0YXRpYyBpbnQgcnhfbmV4dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIAkJLyogUlggZGVzY3JpcHRvciByaW5nIHBvaW50ZXIgCQkqLworc3RhdGljIGludCB0eF9uZXh0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgCQkvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlciAJCSovCitzdGF0aWMgaW50IHR4X3RocmVzaG9sZDsKKworc3RhdGljIHZvaWQgIGluaXRfcnhfcmluZyhzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkICBwdXJnZV90eF9yaW5nKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworCitzdGF0aWMgdm9pZCAgcmVhZF9od19hZGRyKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKiBiaXMpOworCitzdGF0aWMgaW50IGV0aF8zY29tX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqYmlzKTsKK3N0YXRpYyBpbnQgZXRoXzNjb21fc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBldGhfM2NvbV9yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgZXRoXzNjb21faGFsdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKKworI2RlZmluZSBpb190b19waHlzKGEpCXBjaV9pb190b19waHlzKChwY2lfZGV2X3QpZGV2LT5wcml2LCBhKQorI2RlZmluZSBwaHlzX3RvX2lvKGEpCXBjaV9waHlzX3RvX2lvKChwY2lfZGV2X3QpZGV2LT5wcml2LCBhKQorI2RlZmluZSBtZW1fdG9fcGh5cyhhKQlwY2lfbWVtX3RvX3BoeXMoKHBjaV9kZXZfdClkZXYtPnByaXYsIGEpCisjZGVmaW5lIHBoeXNfdG9fbWVtKGEpCXBjaV9waHlzX3RvX21lbSgocGNpX2Rldl90KWRldi0+cHJpdiwgYSkKKworc3RhdGljIGlubGluZSBpbnQgRVRIX0lOTChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1X2xvbmcgYWRkcikKK3sKKyAgICBfX2FzbSB2b2xhdGlsZSAoImVpZWlvIik7CisJcmV0dXJuIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdTMyICopaW9fdG9fcGh5cyhhZGRyICsgZGV2LT5pb2Jhc2UpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgRVRIX0lOVyhzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1X2xvbmcgYWRkcikKK3sKKyAgICBfX2FzbSB2b2xhdGlsZSAoImVpZWlvIik7CisJcmV0dXJuIGxlMTZfdG9fY3B1KCoodm9sYXRpbGUgdTE2ICopaW9fdG9fcGh5cyhhZGRyICsgZGV2LT5pb2Jhc2UpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgRVRIX0lOQihzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1X2xvbmcgYWRkcikKK3sKKyAgICBfX2FzbSB2b2xhdGlsZSAoImVpZWlvIik7CisJcmV0dXJuICoodm9sYXRpbGUgdTggKilpb190b19waHlzKGFkZHIgKyBkZXYtPmlvYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBFVEhfT1VUQihzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCBpbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisJKih2b2xhdGlsZSB1OCAqKWlvX3RvX3BoeXMoYWRkciArIGRldi0+aW9iYXNlKSA9IGNvbW1hbmQ7CisgICAgX19hc20gdm9sYXRpbGUgKCJlaWVpbyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRVRIX09VVFcoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworCSoodm9sYXRpbGUgdTE2ICopaW9fdG9fcGh5cyhhZGRyICsgZGV2LT5pb2Jhc2UpID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7CisgICAgX19hc20gdm9sYXRpbGUgKCJlaWVpbyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRVRIX09VVEwoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworCSoodm9sYXRpbGUgdTMyICopaW9fdG9fcGh5cyhhZGRyICsgZGV2LT5pb2Jhc2UpID0gY3B1X3RvX2xlMzIoY29tbWFuZCk7CisgICAgX19hc20gdm9sYXRpbGUgKCJlaWVpbyIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBFVEhfU1RBVFVTKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgICAgX19hc20gdm9sYXRpbGUgKCJlaWVpbyIpOworCXJldHVybiBsZTE2X3RvX2NwdSgqKHZvbGF0aWxlIHUxNiAqKWlvX3RvX3BoeXMoRUwzX1NUQVRVUyArIGRldi0+aW9iYXNlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBFVEhfQ01EKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBjb21tYW5kKQoreworCSoodm9sYXRpbGUgdTE2ICopaW9fdG9fcGh5cyhFTDNfQ01EICsgZGV2LT5pb2Jhc2UpID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7IAorICAgIF9fYXNtIHZvbGF0aWxlICgiZWllaW8iKTsKK30KKworLyogQ29tbWFuZCByZWdpc3RlciBpcyBhbHdheXMgaW4gdGhlIHNhbWUgc3BvdCBpbiBhbGwgdGhlIHJlZ2lzdGVyIHdpbmRvd3MgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXNzdWVzIGEgY29tbWFuZCBhbmQgd2FpdHMgZm9yIGl0IHNvIGNvbXBsZXRlIGJ5IGNoZWNraW5nIHRoZSBDbWRJblByb2dyZXNzIGJpdCAqLworCitzdGF0aWMgaW50IGlzc3VlX2FuZF93YWl0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBjb21tYW5kKQoreworCisgICAgICAgIGludCBpLCBzdGF0dXM7CisKKwlFVEhfQ01EKGRldiwgY29tbWFuZCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFVEhfU1RBVFVTKGRldik7CisJCS8vcHJpbnRmICgiSXNzdWU6IHN0YXR1cyAweCU0eC5cbiIsIHN0YXR1cyk7CisJCWlmICghKHN0YXR1cyAmIENtZEluUHJvZ3Jlc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBPSywgdGhhdCBkaWRuJ3Qgd29yay4gIERvIGl0IHRoZSBzbG93IHdheS4gIE9uZSBzZWNvbmQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRVRIX1NUQVRVUyhkZXYpOworCQkvL3ByaW50ZiAoIklzc3VlOiBzdGF0dXMgMHglNHguXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgfQorICAgICAgICBQUklOVEYoIkV0aGVybmV0IGNvbW1hbmQ6IDB4JTR4IGRpZCBub3QgY29tcGxldGUhIFN0YXR1czogMHglNHhcbiIsIGNvbW1hbmQsIEVUSF9TVEFUVVMoZGV2KSApOworCXJldHVybiAwOworfQorCisvKiBEZXRlcm1pbmUgbmV0d29yayBtZWRpYSB0eXBlIGFuZCBzZXQgdXAgM2NvbSBhY2NvcmRpbmdseSAgICAgICAgICAgKi8KKy8qIEkgdGhpbmsgSSdtIGdvaW5nIHRvIHN0YXJ0IHdpdGggc29tZXRoaW5nIGtub3duIGZpcnN0IGxpa2UgMTBiYXNlVCAqLworCitzdGF0aWMgaW50IGF1dG9fbmVnb3RpYXRlKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgICAgaW50IGk7CisKKyAgICBFTDNXSU5ET1coZGV2LCAxKTsKKworICAgIC8vIFdhaXQgZm9yIEF1dG8gbmVnb3RpYXRpb24gdG8gY29tcGxldGUKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDEwMDA7IGkrKykKKyAgICB7CisJaWYgKEVUSF9JTlcoZGV2LCAyKSAmIDB4MDQpCisJICAgIGJyZWFrOworCXVkZWxheSgxMDApOworCisJaWYgKGkgPT0gMTAwMCkKKwl7CisJICAgIFBSSU5URigiRXJyb3I6IEF1dG8gbmVnb3RpYXRpb24gZmFpbGVkXG4iKTsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICAKKworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZXRoX2ludGVycnVwdChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworICAgIHUxNiBzdGF0dXMgPSBFVEhfU1RBVFVTKGRldik7CisKKyAgICBwcmludGYoImV0aDA6IHN0YXR1cyA9IDB4JTA0eFxuIiwgc3RhdHVzKTsKKworICAgIGlmICghKHN0YXR1cyAmIEludExhdGNoKSkKKwlyZXR1cm47CisKKyAgICBpZiAoc3RhdHVzICYgKDE8PDYpKQorICAgIHsKKwlFVEhfQ01EKGRldiwgQWNrSW50ciB8ICgxPDw2KSk7CisJcHJpbnRmKCJBY2tub3dsZWRnZWQgSW50ZXJydXB0IGNvbW1hbmRcbiIpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBEb3duQ29tcGxldGUpCisgICAgeworCUVUSF9DTUQoZGV2LCBBY2tJbnRyIHwgRG93bkNvbXBsZXRlKTsKKwlwcmludGYoIkFja25vd2xlZGdlZCBEb3duQ29tcGxldGVcbiIpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBVcENvbXBsZXRlKQorICAgIHsKKwlFVEhfQ01EKGRldiwgQWNrSW50ciB8IFVwQ29tcGxldGUpOworCXByaW50ZigiQWNrbm93bGVkZ2VkIFVwQ29tcGxldGVcbiIpOworICAgIH0KKworICAgIEVUSF9DTUQoZGV2LCBBY2tJbnRyIHwgSW50TGF0Y2gpOworICAgIHByaW50ZigiQWNrbm93bGVkZ2VkIEludExhdGNoXG4iKTsKK30KKworaW50IGV0aF8zY29tX2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworICAgICAgICB1MzIgZXRoX2lvYmFzZSA9IDAsIHN0YXR1czsKKyAgICAgICAgaW50IGNhcmRfbnVtYmVyID0gMCwgcmV0OworICAgICAgICBzdHJ1Y3QgZXRoX2RldmljZSogZGV2OworICAgICAgICBwY2lfZGV2X3QgZGV2bm87CisJY2hhciAqczsKKworCXMgPSBnZXRlbnYoIjNjb21fYmFzZSIpOworCisJLyogRmluZCBldGhlcm5ldCBjb250cm9sbGVyIG9uIHRoZSBQQ0kgYnVzICovCisKKwlpZiAoKGRldm5vID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1QywgMCkpIDwgMCkKKwl7CisJCVBSSU5URigiRXJyb3I6IENhbm5vdCBmaW5kIHRoZSBldGhlcm5ldCBkZXZpY2Ugb24gdGhlIFBDSSBidXNcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHMpCisJeworCSAgICB1bnNpZ25lZCBsb25nIGJhc2UgPSBhdG9pKHMpOworCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldm5vLCBQQ0lfQkFTRV9BRERSRVNTXzAsIGJhc2UgfCAweDAxKTsKKwl9CisKKwlyZXQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2bm8sIFBDSV9CQVNFX0FERFJFU1NfMCwgJmV0aF9pb2Jhc2UpOworICAgICAgICBldGhfaW9iYXNlICY9IH4weGY7CisKKwlQUklOVEYoImV0aDogM0NvbSBGb3VuZCBhdCBBZGRyZXNzOiAweCV4XG4iLCBldGhfaW9iYXNlKTsKKyAgCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZubywgUENJX0NPTU1BTkQsIFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKworCSAvKiBDaGVjayBpZiBJL08gYWNjZXNzZXMgYW5kIEJ1cyBNYXN0ZXJpbmcgYXJlIGVuYWJsZWQgKi8KKworCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZubywgUENJX0NPTU1BTkQsICZzdGF0dXMpOworCisJaWYgKCEoc3RhdHVzICYgUENJX0NPTU1BTkRfSU8pKQorCXsKKwkJcHJpbnRmKCJFcnJvcjogQ2Fubm90IGVuYWJsZSBJTyBhY2Nlc3MuXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01FTU9SWSkpCisJeworCQlwcmludGYoIkVycm9yOiBDYW5ub3QgZW5hYmxlIE1FTU9SWSBhY2Nlc3MuXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01BU1RFUikpCisJeworCQlwcmludGYoIkVycm9yOiBDYW5ub3QgZW5hYmxlIEJ1cyBNYXN0ZXJpbmcuXG4iKTsKKwkJZ290byBEb25lOworCX0KKworICAgICAgICBkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UqKSBtYWxsb2Moc2l6ZW9mKCpkZXYpKTsgLy9zdHJ1Y3QgZXRoX2RldmljZSkpOworCisgICAgICAgIHNwcmludGYoZGV2LT5uYW1lLCAiM0NvbSAzYzkyMGMjJWQiLCBjYXJkX251bWJlcik7CisgICAgICAgIGRldi0+aW9iYXNlID0gZXRoX2lvYmFzZTsKKyAgICAgICAgZGV2LT5wcml2ICAgPSAodm9pZCopIGRldm5vOworICAgICAgICBkZXYtPmluaXQgICA9IGV0aF8zY29tX2luaXQ7CisgICAgICAgIGRldi0+aGFsdCAgID0gZXRoXzNjb21faGFsdDsKKyAgICAgICAgZGV2LT5zZW5kICAgPSBldGhfM2NvbV9zZW5kOworICAgICAgICBkZXYtPnJlY3YgICA9IGV0aF8zY29tX3JlY3Y7CisKKyAgICAgICAgZXRoX3JlZ2lzdGVyKGRldik7CisKKy8qIAl7ICovCisvKiAJICAgIGNoYXIgaW50ZXJydXB0OyAqLworLyogCSAgICBkZXZubyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUMsIDApOyAqLworLyogCSAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXZubywgUENJX0lOVEVSUlVQVF9MSU5FLCAmaW50ZXJydXB0KTsgKi8KKwkgICAgCisvKiAJICAgIHByaW50ZigiSW5zdGFsbGluZyBldGgwIGludGVycnVwdCBoYW5kbGVyIHRvICVkXG4iLCBpbnRlcnJ1cHQpOyAqLworLyogCSAgICBpcnFfaW5zdGFsbF9oYW5kbGVyKGludGVycnVwdCwgZXRoX2ludGVycnVwdCwgZGV2KTsgKi8KKy8qIAl9ICovCisKKyAgICAgICAgY2FyZF9udW1iZXIrKzsKKworCS8qIFNldCB0aGUgbGF0ZW5jeSB0aW1lciBmb3IgdmFsdWUgKi8KKwlzID0gZ2V0ZW52KCIzY29tX2xhdGVuY3kiKTsKKwlpZiAocykKKwl7CisJICAgIHJldCA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZubywgUENJX0xBVEVOQ1lfVElNRVIsICh1bnNpZ25lZCBjaGFyKWF0b2kocykpOworCX0KKwllbHNlIHJldCA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZubywgUENJX0xBVEVOQ1lfVElNRVIsIDB4MGEpOworCisJcmVhZF9od19hZGRyKGRldiwgYmlzKTsgCQkJCS8qIGdldCB0aGUgTUFDIGFkZHJlc3MgZnJvbSBXaW5kb3cgMiovCisKKwkvKiBSZXNldCB0aGUgZXRoZXJuZXQgY29udHJvbGxlciAqLworCisJUFJJTlRGICgiSXNzdWluZyByZXNldCBjb21tYW5kLi4uLlxuIik7CisJaWYgKCFpc3N1ZV9hbmRfd2FpdChkZXYsIFRvdGFsUmVzZXQpKQorCXsKKwkJcHJpbnRmKCJFcnJvcjogQ2Fubm90IHJlc2V0IGV0aGVybmV0IGNvbnRyb2xsZXIuXG4iKTsKKwkJZ290byBEb25lOworCX0KKwllbHNlCisJCVBSSU5URiAoIkV0aGVybmV0IGNvbnRyb2xsZXIgcmVzZXQuXG4iKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnggYW5kIHR4IHJpbmdzICovCisKKwlpZighKHJ4X3JpbmcgPSBtZW1hbGlnbihzaXplb2Yoc3RydWN0IHJ4X2Rlc2NfM2NvbSkgKiBOVU1fUlhfREVTQywgMTYpKSkKKwl7CisJCVBSSU5URiAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJYX1JJTkcuLi4uLlxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisJCisJaWYgKCEodHhfcmluZyA9IG1lbWFsaWduKHNpemVvZihzdHJ1Y3QgdHhfZGVzY18zY29tKSAqIE5VTV9UWF9ERVNDLCAxNikpKQorCXsKKwkJUFJJTlRGICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgVFhfUklORy4uLi4uXG4iKTsKKwkJZ290byBEb25lOworCX0KKwkKK0RvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgaW50IGV0aF8zY29tX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqYmlzKQoreworCWludCBpLCBzdGF0dXMgPSAwOworCWludCB0eF9jdXIsIGxvb3A7CisJdTE2IHN0YXR1c19lbmFibGUsIGludHJfZW5hYmxlOworCXN0cnVjdCBkZXNjcmlwdG9yICppYXNfY21kOworCisJLyogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBuZXR3b3JrIHRoZSBtYWNoaW5lIGlzIGNvbm5lY3RlZCB0bwkqLworCS8qIHByZXNlbnRseSBkcm9wcyB0aGUgY29ubmVjdCB0byAxME1icHMJCQkqLwkgICAgIAorCisJaWYgKCFhdXRvX25lZ290aWF0ZShkZXYpKQorCXsKKwkJcHJpbnRmKCJFcnJvcjogQ2Fubm90IGRldGVybWluZSBuZXR3b3JrIG1lZGlhLlxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKyAgICAgICAgaXNzdWVfYW5kX3dhaXQoZGV2LCBUeFJlc2V0KTsKKyAgICAgICAgaXNzdWVfYW5kX3dhaXQoZGV2LCBSeFJlc2V0fDB4MDQpOworCisgICAgICAgIC8qIFN3aXRjaCB0byByZWdpc3RlciBzZXQgNyBmb3Igbm9ybWFsIHVzZS4gKi8KKyAgICAgICAgRUwzV0lORE9XKGRldiwgNyk7CisKKwkvKiBJbml0aWFsaXplIFJ4IGFuZCBUeCByaW5ncyAqLworCisJaW5pdF9yeF9yaW5nKGRldik7CisJcHVyZ2VfdHhfcmluZyhkZXYpOworCisgCUVUSF9DTUQoZGV2LCBTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0IHwgUnhQcm9tKTsKKworICAgICAgICBpc3N1ZV9hbmRfd2FpdChkZXYsU2V0VHhTdGFydHwweDA3ZmYpOworCisgICAgICAgIC8qIEJlbG93IHNldHMgd2hpY2ggaW5kaWNhdGlvbiBiaXRzIHRvIGJlIHNlZW4uICovCisKKyAgICAgICAgc3RhdHVzX2VuYWJsZSA9IFNldFN0YXR1c0VuYiB8IEhvc3RFcnJvciB8IERvd25Db21wbGV0ZSB8IFVwQ29tcGxldGUgfCAoMTw8Nik7CisgICAgICAgIEVUSF9DTUQoZGV2LCBzdGF0dXNfZW5hYmxlKTsKKworCS8qIEJlbG93IHNldHMgbm8gYml0cyBhcmUgdG8gY2F1c2UgYW4gaW50ZXJydXB0IHNpbmNlIHRoaXMgaXMganVzdCBwb2xsaW5nICovCisKKyAgICAgICAgaW50cl9lbmFibGUgICA9IFNldEludHJFbmI7CisvLwlpbnRyX2VuYWJsZSA9IFNldEludHJFbmIgfCAoMTw8OSkgfCAoMTw8MTApIHwgKDE8PDYpOworICAgICAgICBFVEhfQ01EKGRldiwgaW50cl9lbmFibGUpOworCUVUSF9PVVRCKGRldiwgMTI3LCBVcFBvbGwpOworCisgICAgICAgIC8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrICovCisKKyAgICAgICAgRVRIX0NNRChkZXYsIEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSk7CisgICAgICAgIEVUSF9DTUQoZGV2LCBpbnRyX2VuYWJsZSk7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIHdoZXJlIHRoZSBSWCByaW5nIGlzIGxvY2F0ZWQgKi8KKworCWlzc3VlX2FuZF93YWl0KGRldixVcFN0YWxsKTsJCQkJLyogU3RhbGwgYW5kIHNldCB0aGUgVXBsaXN0UHRyIAkJKi8KKwlFVEhfT1VUTChkZXYsICh1MzIpJnJ4X3JpbmdbcnhfbmV4dF0sIFVwTGlzdFB0cik7CisgICAgICAgIEVUSF9DTUQoZGV2LCBSeEVuYWJsZSk7IAkJCQkvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAJCSovCisJaXNzdWVfYW5kX3dhaXQoZGV2LFVwVW5zdGFsbCk7CisKKwkvKiBTZW5kIHRoZSBJbmRpdmlkdWFsIEFkZHJlc3MgU2V0dXAgZnJhbWUgKi8KKworCXR4X2N1ciAgICAgICA9IHR4X25leHQ7CisJdHhfbmV4dCAgICAgID0gKCh0eF9uZXh0KzEpICUgTlVNX1RYX0RFU0MpOworCisJaWFzX2NtZCAgICAgICAgICAgICA9IChzdHJ1Y3QgZGVzY3JpcHRvciAqKSZ0eF9yaW5nW3R4X2N1cl07CisJaWFzX2NtZC0+c3RhdHVzICAgICA9IGNwdV90b19sZTMyKDE8PDMxKTsJCS8qIHNldCBEbkluZGljYXRlIGJpdC4gCQkJKi8KKwlpYXNfY21kLT5uZXh0ICAgICAgID0gMDsKKwlpYXNfY21kLT5hZGRyICAgICAgID0gY3B1X3RvX2xlMzIoKHUzMikmYmlzLT5iaV9lbmV0YWRkclswXSk7CisJaWFzX2NtZC0+bGVuZ3RoICAgICA9IGNwdV90b19sZTMyKDYgfCBMQVNUX0ZSQUcpOworCisJLyogVGVsbCB0aGUgYWRhcHRlciB3aGVyZSB0aGUgVFggcmluZyBpcyBsb2NhdGVkICovCisKKyAgICAgICAgRVRIX0NNRChkZXYsIFR4RW5hYmxlKTsgCQkJCS8qIEVuYWJsZSB0cmFuc21pdHRlci4gCQkJKi8KKwlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25TdGFsbCk7CQkJCS8qIFN0YWxsIGFuZCBzZXQgdGhlIERvd25MaXN0UHRyLiAJKi8KKwlFVEhfT1VUTChkZXYsICh1MzIpJnR4X3JpbmdbdHhfY3VyXSwgRG93bkxpc3RQdHIpOworCWlzc3VlX2FuZF93YWl0KGRldiwgRG93blVuc3RhbGwpOworCWZvciAoaT0wOyAhKEVUSF9TVEFUVVMoZGV2KSAmIERvd25Db21wbGV0ZSk7IGkrKykKKwl7CisJCWlmIChpID49IFRPVVRfTE9PUCkKKwkJeworCQkJUFJJTlRGKCJUWCBSaW5nIHN0YXR1cyAoSW5pdCk6ICAweCU0eFxuIiwgbGUzMl90b19jcHUodHhfcmluZ1t0eF9jdXJdLnN0YXR1cykpOworCQkJUFJJTlRGKCJFVEhfU1RBVFVTOiAweCV4XG4iLCBFVEhfU1RBVFVTKGRldikpOworCQkJZ290byBEb25lOworCQl9CisJfQorCWlmIChFVEhfU1RBVFVTKGRldikgJiBEb3duQ29tcGxldGUpCQkJLyogSWYgRG93bkxvYWQgQ29tcGxldGUgQUNLIHRoZSBiaXQgCSovCisJeworICAgICAgICAJRVRIX0NNRChkZXYsIEFja0ludHIgfCBEb3duQ29tcGxldGUpOwkJLyogYWNrbm93bGVkZ2UgdGhlIGluZGljYXRpb24gYml0CSovCisgCQlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25TdGFsbCk7CQkJLyogc3RhbGwgYW5kIGNsZWFyIERvd25MaXN0UHRyIAkJKi8KKwkJRVRIX09VVEwoZGV2LCAwLCBEb3duTGlzdFB0cik7CisJCWlzc3VlX2FuZF93YWl0KGRldiwgRG93blVuc3RhbGwpOworCX0KKwlzdGF0dXMgPSAxOworCSAgICAKK0RvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGV0aF8zY29tX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBzdGF0dXMgPSAwOworCWludCB0eF9jdXI7CisKKwlpZiAobGVuZ3RoIDw9IDApCisJeworCQlQUklOVEYoImV0aDogYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgbGVuZ3RoKTsKKwkJZ290byBEb25lOworCX0KKworCXR4X2N1ciAgPSB0eF9uZXh0OworCXR4X25leHQgPSAodHhfbmV4dCsxKSAlIE5VTV9UWF9ERVNDOworCisJdHhfcmluZ1t0eF9jdXJdLnN0YXR1cyAgPSBjcHVfdG9fbGUzMigxPDwzMSk7CQkvKiBzZXQgRG5JbmRpY2F0ZSBiaXQgCQkJKi8KKwl0eF9yaW5nW3R4X2N1cl0ubmV4dCAgICA9IDA7CisJdHhfcmluZ1t0eF9jdXJdLmFkZHIgICAgPSBjcHVfdG9fbGUzMigoKHUzMikgcGFja2V0KSk7CisJdHhfcmluZ1t0eF9jdXJdLmxlbmd0aCAgPSBjcHVfdG9fbGUzMihsZW5ndGggfCBMQVNUX0ZSQUcpOworCisJLyogU2VuZCB0aGUgcGFja2V0ICovCisKKwlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25TdGFsbCk7CQkJCS8qIHN0YWxsIGFuZCBzZXQgdGhlIERvd25MaXN0UHRyIAkqLworCUVUSF9PVVRMKGRldiwgKHUzMikgJnR4X3JpbmdbdHhfY3VyXSwgRG93bkxpc3RQdHIpOworCWlzc3VlX2FuZF93YWl0KGRldiwgRG93blVuc3RhbGwpOworCisJZm9yIChpPTA7ICEoRVRIX1NUQVRVUyhkZXYpICYgRG93bkNvbXBsZXRlKTsgaSsrKQorCXsKKwkJaWYgKGkgPj0gVE9VVF9MT09QKQorCQl7CisJCQlQUklOVEYoIlRYIFJpbmcgc3RhdHVzIChzZW5kKTogMHglNHhcbiIsIGxlMzJfdG9fY3B1KHR4X3JpbmdbdHhfY3VyXS5zdGF0dXMpKTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCX0KKwlpZiAoRVRIX1NUQVRVUyhkZXYpICYgRG93bkNvbXBsZXRlKQkJCS8qIElmIERvd25Mb2FkIENvbXBsZXRlIEFDSyB0aGUgYml0IAkqLworCXsKKyAgICAgICAgCUVUSF9DTUQoZGV2LCBBY2tJbnRyIHwgRG93bkNvbXBsZXRlKTsJCS8qIGFja25vd2xlZGdlIHRoZSBpbmRpY2F0aW9uIGJpdAkqLworIAkJaXNzdWVfYW5kX3dhaXQoZGV2LCBEb3duU3RhbGwpOwkJCS8qIHN0YWxsIGFuZCBjbGVhciBEb3duTGlzdFB0ciAJCSovCisJCUVUSF9PVVRMKGRldiwgMCwgRG93bkxpc3RQdHIpOworCQlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25VbnN0YWxsKTsKKwl9CisJc3RhdHVzPTE7CisgRG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIFByaW50UGFja2V0ICh1Y2hhciAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworaW50IGxvb3A7Cit1Y2hhciAqcHRyOworCisJcHJpbnRmICgiUHJpbnRpbmcgcGFja2V0IG9mIGxlbmd0aCAleC5cblxuIiwgbGVuZ3RoKTsKKwlwdHIgPSBwYWNrZXQ7CisJZm9yIChsb29wID0gMTsgbG9vcCA8PSBsZW5ndGg7IGxvb3ArKykKKwl7CisJCXByaW50ZiAoIiUyeCAiLCAqcHRyKyspOworCQlpZiAoKGxvb3AgJSA0MCk9PSAwKQorCQkJcHJpbnRmICgiXG4iKTsKKwl9Cit9CisKK2ludCBldGhfM2NvbV9yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisJdTE2IHN0YXQgPSAwOworCXUzMiBzdGF0dXM7CisJaW50IHJ4X3ByZXYsIGxlbmd0aCA9IDA7CisKKwl3aGlsZSAoIShFVEhfU1RBVFVTKGRldikgJiBVcENvbXBsZXRlKSkJCQkvKiB3YWl0IG9uIHJlY2VpcHQgb2YgcGFja2V0IAkqLworCQk7CisKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9yaW5nW3J4X25leHRdLnN0YXR1cyk7CQkvKiBwYWNrZXQgc3RhdHVzCQkqLworCisJd2hpbGUgKHN0YXR1cyAmICgxPDwxNSkpCisJewkJCisJCS8qIEEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkICovCisKKwkJaWYgKHN0YXR1cyAmICgxPDwxNSkpCQkKKwkJeworCQkJLyogQSB2YWxpZCBmcmFtZSByZWNlaXZlZCAgKi8KKwkJCQorCQkJbGVuZ3RoID0gbGUzMl90b19jcHUocnhfcmluZ1tyeF9uZXh0XS5zdGF0dXMpICYgMHgxZmZmOwkJLyogbGVuZ3RoIGlzIGluIGJpdHMgMCAtIDEyIAkqLworCQkJCisJCQkvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycyAqLworCisJCQlOZXRSZWNlaXZlKCh1Y2hhciAqKWxlMzJfdG9fY3B1KHJ4X3JpbmdbcnhfbmV4dF0uYWRkciksIGxlbmd0aCk7CisJCQlyeF9yaW5nW3J4X25leHRdLnN0YXR1cyA9IDA7CQkJCQkvKiBjbGVhciB0aGUgc3RhdHVzIHdvcmQgCSovCisJCQlFVEhfQ01EKGRldiwgQWNrSW50ciB8IFVwQ29tcGxldGUpOworCQkJaXNzdWVfYW5kX3dhaXQoZGV2LCBVcFVuc3RhbGwpOworCQl9CisJCWVsc2UKKwkJaWYgKHN0YXQgJiBIb3N0RXJyb3IpCisJCXsKKwkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvciAqLworCisJCQlwcmludGYoIlJ4IGVycm9yIHN0YXR1czogIDB4JTR4XG4iLCBzdGF0KTsKKwkJCWluaXRfcnhfcmluZyhkZXYpOworCQkJZ290byBEb25lOworCQl9CisKKwkJcnhfcHJldiA9IHJ4X25leHQ7CisJCXJ4X25leHQgPSAocnhfbmV4dCArIDEpICUgTlVNX1JYX0RFU0M7CisJCXN0YXQgPSBFVEhfU1RBVFVTKGRldik7CQkJCQkvKiByZWdpc3RlciBzdGF0dXMgCSovCisJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbcnhfbmV4dF0uc3RhdHVzKTsJCS8qIHBhY2tldCBzdGF0dXMgCSovCisJfQorCitEb25lOgorCXJldHVybiBsZW5ndGg7Cit9CisKK3ZvaWQgZXRoXzNjb21faGFsdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworCWlmICghKGRldi0+aW9iYXNlKSkgCisJeworCQlnb3RvIERvbmU7CisJfQorCisJaXNzdWVfYW5kX3dhaXQoZGV2LCBEb3duU3RhbGwpOwkJLyogc2h1dCBkb3duIHRyYW5zbWl0IGFuZCByZWNlaXZlICovCisJaXNzdWVfYW5kX3dhaXQoZGV2LCBVcFN0YWxsKTsKKwlpc3N1ZV9hbmRfd2FpdChkZXYsIFJ4RGlzYWJsZSk7CisJaXNzdWVfYW5kX3dhaXQoZGV2LCBUeERpc2FibGUpOworCisvLwlmcmVlKHR4X3JpbmcpOwkJCQkvKiByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIERQRCBhbmQgVVBEIHJpbmdzICovCisvLwlmcmVlKHJ4X3JpbmcpOworCitEb25lOgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yeF9yaW5nKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpIAoreworCWludCBpOworCisJUFJJTlRGKCJJbml0aWFsaXppbmcgcnhfcmluZy4gcnhfYnVmZmVyID0gJXBcbiIsIHJ4X2J1ZmZlcik7CisJaXNzdWVfYW5kX3dhaXQoZGV2LCBVcFN0YWxsKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKQorCXsKKwkJcnhfcmluZ1tpXS5uZXh0ICAgID0gY3B1X3RvX2xlMzIoKCh1MzIpICZyeF9yaW5nWyhpKzEpICUgTlVNX1JYX0RFU0NdKSk7CisJCXJ4X3JpbmdbaV0uc3RhdHVzICA9IDA7CisJCXJ4X3JpbmdbaV0uYWRkciAgICA9IGNwdV90b19sZTMyKCgodTMyKSAmcnhfYnVmZmVyW2ldWzBdKSk7CisJCXJ4X3JpbmdbaV0ubGVuZ3RoICA9IGNwdV90b19sZTMyKFBLVFNJWkVfQUxJR04gfCBMQVNUX0ZSQUcpOworCX0KKwlyeF9uZXh0ID0gMDsKK30KKworc3RhdGljIHZvaWQgcHVyZ2VfdHhfcmluZyhzdHJ1Y3QgZXRoX2RldmljZSogZGV2KSAKK3sKKwlpbnQgaTsKKworCVBSSU5URigiUHVyZ2luZyB0eF9yaW5nLlxuIik7CisKKwl0eF9uZXh0ICAgICAgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspCisJeworCQl0eF9yaW5nW2ldLm5leHQgICAgPSAwOworCQl0eF9yaW5nW2ldLnN0YXR1cyAgPSAwOworCQl0eF9yaW5nW2ldLmFkZHIgICAgPSAwOworCQl0eF9yaW5nW2ldLmxlbmd0aCAgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9od19hZGRyKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKmJpcykgCit7CisJdTggaHdfYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgaW50IGVlcHJvbVsweDQwXTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tzdW0gPSAwOworCWludCBpLCBqLCB0aW1lcjsKKworICAgICAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NLiAqLworCisgICAgICAgIEVMM1dJTkRPVyhkZXYsIDApOworCWZvciAoaSA9IDA7IGkgPCAweDQwOyBpKyspCisJeworICAgICAgICAJRVRIX09VVFcoZGV2LCBFRVBST01fUmVhZCArIGksIFduMEVlcHJvbUNtZCk7CisgICAgICAgICAgICAgICAgLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisgICAgICAgICAgICAgICAgZm9yICh0aW1lciA9IDEwOyB0aW1lciA+PSAwOyB0aW1lci0tKSAKKwkJeworICAgICAgICAgICAgICAgIAl1ZGVsYXkoMTYyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRVRIX0lOVyhkZXYsIFduMEVlcHJvbUNtZCkgJiAweDgwMDApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVlcHJvbVtpXSA9IEVUSF9JTlcoZGV2LCBXbjBFZXByb21EYXRhKTsKKyAgICAgICAgfQorCisJLyogQ2hlY2tzdW0gY2FsY3VsYXRpb24uICBJJ20gbm90IHN1cmUgYWJvdXQgdGhpcyBwYXJ0IGFuZCB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBvbiB0aGUgM2NvbSBzaWRlIG9mIHRoaW5ncyAqLworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAweDIxOyBpKyspCisgICAgICAgICAgICAgICAgY2hlY2tzdW0gIF49IGVlcHJvbVtpXTsKKyAgICAgICAgY2hlY2tzdW0gPSAoY2hlY2tzdW0gXiAoY2hlY2tzdW0gPj4gOCkpICYgMHhmZjsKKworICAgICAgICBpZiAoY2hlY2tzdW0gIT0gMHhiYikKKyAgICAgICAgICAgICAgICBwcmludGYoIiAqKiogSU5WQUxJRCBFRVBST00gQ0hFQ0tTVU0gJTQuNHggKioqIFxuIiwgY2hlY2tzdW0pOworCisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJaHdfYWRkcltqKytdID0gKHU4KSgoZWVwcm9tW2krMTBdID4+IDgpICYgMHhmZik7CisJCWh3X2FkZHJbaisrXSA9ICh1OCkoZWVwcm9tW2krMTBdICYgMHhmZik7CisJfQorCisJLyogIE1BQyBBZGRyZXNzIGlzIGluIHdpbmRvdyAyLCB3cml0ZSB2YWx1ZSBmcm9tIEVFUFJPTSB0byB3aW5kb3cgMiAqLworCisgICAgICAgIEVMM1dJTkRPVyhkZXYsIDIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIEVUSF9PVVRCKGRldiwgaHdfYWRkcltpXSwgaSk7CisKKwlmb3IgKGogPSAwOyBqIDwgRVRIX0FMRU47IGorPTIpCisJeworCQlod19hZGRyW2pdICAgPSAodTgpKEVUSF9JTlcoZGV2LCBqKSAmIDB4ZmYpOworCQlod19hZGRyW2orMV0gPSAodTgpKChFVEhfSU5XKGRldiwgaikgPj4gOCkgJiAweGZmKTsKKwl9CisKKwlmb3IgKGk9MDtpPEVUSF9BTEVOO2krKykgCisJeworCQlpZiAoaHdfYWRkcltpXSAhPSBiaXMtPmJpX2VuZXRhZGRyW2ldKSAKKwkJeworLyogCQkJcHJpbnRmKCJXYXJuaW5nOiBIVyBhZGRyZXNzIGRvbid0IG1hdGNoOlxuIik7ICovCisvKiAJCQlwcmludGYoIkFkZHJlc3MgaW4gM0NvbSBXaW5kb3cgMiBpcyAgICAgICAgICIgKi8KKy8qIAkJCSAgICAgICAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsICovCisvKiAJCQkgICAgICAgaHdfYWRkclswXSwgaHdfYWRkclsxXSwgaHdfYWRkclsyXSwgKi8KKy8qIAkJCSAgICAgICBod19hZGRyWzNdLCBod19hZGRyWzRdLCBod19hZGRyWzVdKTsgKi8KKy8qIAkJCXByaW50ZigiQWRkcmVzcyB1c2VkIGJ5IFUtQm9vdCBpcyAiICovCisvKiAJCQkgICAgICAgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCAqLworLyogCQkJICAgICAgIGJpcy0+YmlfZW5ldGFkZHJbMF0sIGJpcy0+YmlfZW5ldGFkZHJbMV0sICAqLworLyogCQkJICAgICAgIGJpcy0+YmlfZW5ldGFkZHJbMl0sIGJpcy0+YmlfZW5ldGFkZHJbM10sICAqLworLyogCQkJICAgICAgIGJpcy0+YmlfZW5ldGFkZHJbNF0sIGJpcy0+YmlfZW5ldGFkZHJbNV0pOyAqLworLyogCQkJZ290byBEb25lOyAqLworCQkgICAgY2hhciBidWZmZXJbMjU2XTsKKwkJICAgIGlmIChiaXMtPmJpX2VuZXRhZGRyWzBdID09IDAgJiYgYmlzLT5iaV9lbmV0YWRkclsxXSA9PSAwICYmCisJCQliaXMtPmJpX2VuZXRhZGRyWzJdID09IDAgJiYgYmlzLT5iaV9lbmV0YWRkclszXSA9PSAwICYmCisJCQliaXMtPmJpX2VuZXRhZGRyWzRdID09IDAgJiYgYmlzLT5iaV9lbmV0YWRkcls1XSA9PSAwKQorCQkgICAgeworCisJCQlzcHJpbnRmKGJ1ZmZlciwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwgCisJCQkJaHdfYWRkclswXSwgaHdfYWRkclsxXSwgaHdfYWRkclsyXSwgCisJCQkJaHdfYWRkclszXSwgaHdfYWRkcls0XSwgaHdfYWRkcls1XSk7IAorCQkJc2V0ZW52KCJldGhhZGRyIiwgYnVmZmVyKTsKKwkJICAgIH0KKwkJfQorCX0KKworCWZvcihpPTA7IGk8RVRIX0FMRU47IGkrKykgZGV2LT5lbmV0YWRkcltpXSA9IGh3X2FkZHJbaV07CisKK0RvbmU6CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2ZsYXNoLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5Yjk1NQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvZmxhc2guYwpAQCAtMCwwICsxLDM1IEBACisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Zmxhc2guaD4KKworZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKwordW5zaWduZWQgbG9uZyBmbGFzaF9pbml0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUzsgaSsrKQorICAgIHsKKwlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwlmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudCA9IDA7CisJZmxhc2hfaW5mb1tpXS5zaXplID0gMDsKKyAgICB9CisKKworICAgIHJldHVybiAxOworfQorCitpbnQgZmxhc2hfZXJhc2UoZmxhc2hfaW5mb190ICppbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBmbGFzaF9wcmludF9pbmZvKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKyAgICBwcmludGYoIk5vIGZsYXNocm9tIGluc3RhbGxlZFxuIik7Cit9CisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvZmxhc2hfbmV3LmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2ZsYXNoX25ldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWJlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2ZsYXNoX25ldy5jCkBAIC0wLDAgKzEsNjUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAibWVtaW8uaCIgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyN1bmRlZiBERUJVR19GTEFTSAorLy8jZGVmaW5lIERFQlVHX0ZMQVNICisKKyNpZmRlZiBERUJVR19GTEFTSAorI2RlZmluZSBERUJVR0YoZm10LGFyZ3MuLi4pIHByaW50ZihmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbGFzaF9pbmZvX3QJZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKKworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBhZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pOworc3RhdGljIGludCBmbGFzaF9nZXRfb2Zmc2V0cyAodWxvbmcgYmFzZSwgZmxhc2hfaW5mb190ICppbmZvKTsKK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZsYXNoX3Jlc2V0ICh1bG9uZyBhZGRyKTsKKworaW50IGZsYXNoX3hkX25lc3Q7CisKK3N0YXRpYyB2b2lkIGZsYXNoX3RvX3hkKHZvaWQpCit7CisgICAgdW5zaWduZWQgY2hhciB4OworCisgICAgZmxhc2hfeGRfbmVzdCArKzsKKworICAgIGlmIChmbGFzaF94ZF9uZXN0ID09IDEpCisgICAgeworCURFQlVHRigiRmxhc2ggb24gWERcbiIpOworCXggPSBwY2lfcmVhZF9jZmdfYnl0ZSgwLCAwLCAweDc0KTsKKwlwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgMHg3NCwgeHwxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZsYXNoX3RvX21lbSh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgeDsKKworICAgIGZsYXNoX3hkX25lc3QgLS07CisgICAKKyAgICBpZiAoZmxhc2hfeGRfbmVzdCA9PSAwKQorICAgIHsKKwlERUJVR0YoIkZsYXNoIG9uIG1lbW9yeSBidXNcbiIpOworCXggPSBwY2lfcmVhZF9jZmdfYnl0ZSgwLCAwLCAweDc0KTsKKwlwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgMHg3NCwgeCYweEZFKTsKKyAgICB9Cit9CisKK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdF9vbGQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRkdfTUFYX0ZMQVNIX0JBTktTOyBpKyspCisgICAgeworCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCWZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50ID0gMDsKKwlmbGFzaF9pbmZvW2ldLnNpemUgPSAwOworICAgIH0KKworCisgICAgcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYXNoX3NpemUgPSAwOworCisJZmxhc2hfeGRfbmVzdCA9IDA7CisKKwlmbGFzaF90b194ZCgpOworCisJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLworCWZvciAoaT0wOyBpPENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSAwOworCQlmbGFzaF9pbmZvW2ldLnNpemUgPSAwOworCX0KKworCURFQlVHRigiXG4jIyBHZXQgZmxhc2ggc2l6ZSBAIDB4JTA4eFxuIiwgQ0ZHX0ZMQVNIX0JBU0UpOworCisJZmxhc2hfc2l6ZSA9IGZsYXNoX2dldF9zaXplIChDRkdfRkxBU0hfQkFTRSwgZmxhc2hfaW5mbyk7CisKKwlERUJVR0YoIiMjIEZsYXNoIGJhbmsgc2l6ZTogJTA4bHhcbiIsIGZsYXNoX3NpemUpOworCisJaWYgKGZsYXNoX3NpemUpIHsKKyNpZiBDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFICYmIFwKKyAgICBDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfRkxBU0hfTUFYX1NJWkUKKwkJLyogbW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgICAgQ0ZHX01PTklUT1JfQkFTRSwKKwkJCSAgICAgIENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4gLSAxLAorCQkJICAgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisJCS8qIEVOViBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgICAgQ0ZHX0VOVl9BRERSLAorCQkJICAgICAgQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TRUNUX1NJWkUgLSAxLAorCQkJICAgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKwl9IGVsc2UgeworCQlwdXRzICgiV2FybmluZzogdGhlIEJPT1QgRmxhc2ggaXMgbm90IGluaXRpYWxpc2VkICEiKTsKKwl9CisKKwlmbGFzaF90b19tZW0oKTsKKworCXJldHVybiBmbGFzaF9zaXplOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBydW4gZnJvbSBGTEFTSCEKKyAqLworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBhZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJc2hvcnQgaTsKKwl1Y2hhciB2YWx1ZTsKKwl1Y2hhciAqeCA9ICh1Y2hhciAqKWFkZHI7CisKKwlmbGFzaF90b194ZCgpOworCisJLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KKwl4WzB4MDU1NV0gPSAgMHhBQTsKKwlfX2FzbSB2b2xhdGlsZSAoInN5bmNcbiBlaWVpbyIpOworCXhbMHgwMkFBXSA9ICAweDU1OworCV9fYXNtIHZvbGF0aWxlICgic3luY1xuIGVpZWlvIik7CisJeFsweDA1NTVdID0gIDB4OTA7CisJX19hc20gdm9sYXRpbGUgKCJzeW5jXG4gZWllaW8iKTsKKworCXZhbHVlID0geFswXTsKKwlfX2FzbSB2b2xhdGlsZSAoInN5bmNcbiBlaWVpbyIpOworCisJREVCVUdGKCJNYW51Zi4gSUQgQCAweCUwOGx4OiAweCUwOHhcbiIsICh1bG9uZylhZGRyLCB2YWx1ZSk7CisKKwlzd2l0Y2ggKHZhbHVlIHwgKHZhbHVlIDw8IDE2KSkgeworCQljYXNlIEFNRF9NQU5VRkFDVDoKKwkJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0FNRDsKKwkJCWJyZWFrOworCisJCWNhc2UgRlVKX01BTlVGQUNUOgorCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fRlVKOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVE1fTUFOVUZBQ1Q6CisJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9TVE07CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKKwkJCWluZm8tPnNpemUgPSAwOworCQkJZmxhc2hfcmVzZXQgKGFkZHIpOworCQkJcmV0dXJuIDA7CisJfQorCisJdmFsdWUgPSB4WzFdOworCV9fYXNtIHZvbGF0aWxlICgic3luY1xuIGVpZWlvIik7CisKKwlERUJVR0YoIkRldmljZSBJRCBAIDB4JTA4bHg6IDB4JTA4eFxuIiwgYWRkcisxLCB2YWx1ZSk7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJCWNhc2UgQU1EX0lEX0YwNDBCOgorCQkJREVCVUdGKCJBbTI5RjA0MEJcbiIpOworCQkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQkJaW5mby0+c2l6ZSA9IDB4MDAwODAwMDA7CisJCQlicmVhazsJCQkvKiA9PiA1MTIga0IJCSovCisKKwkJY2FzZSBBTURfSURfTFYwNDBCOgorCQkJREVCVUdGKCJBbTI5TFYwNDBCXG4iKTsKKwkJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMDQwOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkJCWluZm8tPnNpemUgPSAweDAwMDgwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gNTEyIGtCCQkqLworCisJCWNhc2UgQU1EX0lEX0xWNDAwVDoKKwkJCURFQlVHRigiQW0yOUxWNDAwVFxuIik7CisJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTQwMFQ7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMTsKKwkJCWluZm8tPnNpemUgPSAweDAwMTAwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gMSBNQgkJKi8KKworCQljYXNlIEFNRF9JRF9MVjQwMEI6CisJCQlERUJVR0YoIkFtMjlMVjQwMEJcbiIpOworCQkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU00MDBCOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTE7CisJCQlpbmZvLT5zaXplID0gMHgwMDEwMDAwMDsKKwkJCWJyZWFrOwkJCS8qID0+IDEgTUIJCSovCisKKwkJY2FzZSBBTURfSURfTFY4MDBUOgorCQkJREVCVUdGKCJBbTI5TFY4MDBUXG4iKTsKKwkJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwVDsKKwkJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQkJaW5mby0+c2l6ZSA9IDB4MDAyMDAwMDA7CisJCQlicmVhazsJCQkvKiA9PiAyIE1CCQkqLworCisJCWNhc2UgQU1EX0lEX0xWODAwQjoKKwkJCURFQlVHRigiQW0yOUxWNDAwQlxuIik7CisJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMEI7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxOTsKKwkJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gMiBNQgkJKi8KKworCQljYXNlIEFNRF9JRF9MVjE2MFQ6CisJCQlERUJVR0YoIkFtMjlMVjE2MFRcbiIpOworCQkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBUOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzU7CisJCQlpbmZvLT5zaXplID0gMHgwMDQwMDAwMDsKKwkJCWJyZWFrOwkJCS8qID0+IDQgTUIJCSovCisKKwkJY2FzZSBBTURfSURfTFYxNjBCOgorCQkJREVCVUdGKCJBbTI5TFYxNjBCXG4iKTsKKwkJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMTYwQjsKKwkJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDM1OworCQkJaW5mby0+c2l6ZSA9IDB4MDA0MDAwMDA7CisJCQlicmVhazsJCQkvKiA9PiA0IE1CCQkqLworCisJCWNhc2UgQU1EX0lEX0xWMzIwVDoKKwkJCURFQlVHRigiQW0yOUxWMzIwVFxuIik7CisJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTMyMFQ7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA2NzsKKwkJCWluZm8tPnNpemUgPSAweDAwODAwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gOCBNQgkJKi8KKworI2lmIDAKKwkJLyogSGFzIHRoZSBzYW1lIElEIGFzIEFNRF9JRF9MVjMyMFQsIHRvIGJlIGZpeGVkICovCisJCWNhc2UgQU1EX0lEX0xWMzIwQjoKKwkJCURFQlVHRigiQW0yOUxWMzIwQlxuIik7CisJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTMyMEI7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA2NzsKKwkJCWluZm8tPnNpemUgPSAweDAwODAwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gOCBNQgkJKi8KKyNlbmRpZgorCisJCWNhc2UgQU1EX0lEX0xWMDMzQzoKKwkJCURFQlVHRigiQW0yOUxWMDMzQ1xuIik7CisJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTAzM0M7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA2NDsKKwkJCWluZm8tPnNpemUgPSAweDAxMDAwMDAwOworCQkJYnJlYWs7CQkJLyogPT4gMTZNYgkJKi8KKworCQljYXNlIFNUTV9JRF9GMDQwQjoKKwkJCURFQlVHRigiTTI5RjA0MEJcbiIpOworCQkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQkJaW5mby0+c2l6ZSA9IDB4MDAwODAwMDA7CisJCQlicmVhazsJCQkvKiA9PiA1MTIga0IJCSovCisKKwkJZGVmYXVsdDoKKwkJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJCWZsYXNoX3Jlc2V0IChhZGRyKTsKKwkJCWZsYXNoX3RvX21lbSgpOworCQkJcmV0dXJuICgwKTsJCS8qID0+IG5vIG9yIHVua25vd24gZmxhc2ggKi8KKworCX0KKworCWlmIChpbmZvLT5zZWN0b3JfY291bnQgPiBDRkdfTUFYX0ZMQVNIX1NFQ1QpIHsKKwkJcHJpbnRmICgiKiogRVJST1I6IHNlY3RvciBjb3VudCAlZCA+IG1heCAoJWQpICoqXG4iLAorCQkJaW5mby0+c2VjdG9yX2NvdW50LCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSBDRkdfTUFYX0ZMQVNIX1NFQ1Q7CisJfQorCisJaWYgKCEgZmxhc2hfZ2V0X29mZnNldHMgKGFkZHIsIGluZm8pKSB7CisJCWZsYXNoX3Jlc2V0IChhZGRyKTsKKwkJZmxhc2hfdG9fbWVtKCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIGZvciBwcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkvKiByZWFkIHNlY3RvciBwcm90ZWN0aW9uIGF0IHNlY3RvciBhZGRyZXNzLCAoQTcgLi4gQTApID0gMHgwMiAqLworCQkvKiBEMCA9IDEgaWYgcHJvdGVjdGVkICovCisJCXZhbHVlID0gaW44KGluZm8tPnN0YXJ0W2ldICsgMik7CisJCWlvYmFycmllcl9ydygpOworCQlpbmZvLT5wcm90ZWN0W2ldID0gKHZhbHVlICYgMSkgIT0gMDsKKwl9CisKKwkvKgorCSAqIFJlc2V0IGJhbmsgdG8gcmVhZCBtb2RlCisJICovCisJZmxhc2hfcmVzZXQgKGFkZHIpOworCisJZmxhc2hfdG9fbWVtKCk7CisKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCitzdGF0aWMgaW50IGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwkJY2FzZSBGTEFTSF9BTTA0MDoKKwkJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgdW5pZm9ybSBzZWN0b3IgdHlwZQkqLworCQkJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgaSAqIGluZm8tPnNpemUgLworCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQ7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJdm9sYXRpbGUgdWxvbmcgYWRkciA9IGluZm8tPnN0YXJ0WzBdOworCWludCBmbGFnLCBwcm90LCBzZWN0LCBsX3NlY3Q7CisJdWxvbmcgc3RhcnQsIG5vdywgbGFzdDsKKworCWZsYXNoX3RvX3hkKCk7CisKKwlpZiAoc19maXJzdCA8IDAgfHwgc19maXJzdCA+IHNfbGFzdCkgeworCQlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQkJcHJpbnRmICgiLSBtaXNzaW5nXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCX0KKwkJZmxhc2hfdG9fbWVtKCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZiAoIkNhbid0IGVyYXNlIHVua25vd24gZmxhc2ggdHlwZSAlMDhseCAtIGFib3J0ZWRcbiIsCisJCQlpbmZvLT5mbGFzaF9pZCk7CisJCWZsYXNoX3RvX21lbSgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3Q9c19maXJzdDsgc2VjdDw9c19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKworCWlmIChwcm90KSB7CisJCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwKKwkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJbF9zZWN0ID0gLTE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlvdXQ4KGFkZHIgKyAweDU1NSwgMHhBQSk7CisJaW9iYXJyaWVyX3J3KCk7CisJb3V0OChhZGRyICsgMHgyQUEsIDB4NTUpOworCWlvYmFycmllcl9ydygpOworCW91dDgoYWRkciArIDB4NTU1LCAweDgwKTsKKwlpb2JhcnJpZXJfcncoKTsKKwlvdXQ4KGFkZHIgKyAweDU1NSwgMHhBQSk7CisJaW9iYXJyaWVyX3J3KCk7CisJb3V0OChhZGRyICsgMHgyQUEsIDB4NTUpOworCWlvYmFycmllcl9ydygpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgc2VjdCsrKSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJYWRkciA9IGluZm8tPnN0YXJ0W3NlY3RdOworCQkJb3V0OChhZGRyLCAweDMwKTsKKwkJCWlvYmFycmllcl9ydygpOworCQkJbF9zZWN0ID0gc2VjdDsKKwkJfQorCX0KKworCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChmbGFnKQorCQllbmFibGVfaW50ZXJydXB0cygpOworCisJLyogd2FpdCBhdCBsZWFzdCA4MHVzIC0gbGV0J3Mgd2FpdCAxIG1zICovCisJdWRlbGF5ICgxMDAwKTsKKworCS8qCisJICogV2Ugd2FpdCBmb3IgdGhlIGxhc3QgdHJpZ2dlcmVkIHNlY3RvcgorCSAqLworCWlmIChsX3NlY3QgPCAwKQorCQlnb3RvIERPTkU7CisKKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJbGFzdCAgPSBzdGFydDsKKwlhZGRyID0gaW5mby0+c3RhcnRbbF9zZWN0XTsKKworCURFQlVHRiAoIlN0YXJ0IGVyYXNlIHRpbWVvdXQ6ICVkXG4iLCBDRkdfRkxBU0hfRVJBU0VfVE9VVCk7CisKKwl3aGlsZSAoKGluOChhZGRyKSAmIDB4ODApICE9IDB4ODApIHsKKwkJaWYgKChub3cgPSBnZXRfdGltZXIoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQlwcmludGYgKCJUaW1lb3V0XG4iKTsKKwkJCWZsYXNoX3Jlc2V0IChpbmZvLT5zdGFydFswXSk7CisJCQlmbGFzaF90b19tZW0oKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIHNob3cgdGhhdCB3ZSdyZSB3YWl0aW5nICovCisJCWlmICgobm93IC0gbGFzdCkgPiAxMDAwKSB7CS8qIGV2ZXJ5IHNlY29uZCAqLworCQkJcHV0YyAoJy4nKTsKKwkJCWxhc3QgPSBub3c7CisJCX0KKwkJaW9iYXJyaWVyX3J3KCk7CisJfQorCitET05FOgorCS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCWZsYXNoX3Jlc2V0IChpbmZvLT5zdGFydFswXSk7CisJZmxhc2hfdG9fbWVtKCk7CisKKwlwcmludGYgKCIgZG9uZVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1bG9uZyBjcCwgd3AsIGRhdGE7CisJaW50IGksIGwsIHJjOworCisJZmxhc2hfdG9feGQoKTsKKworCXdwID0gKGFkZHIgJiB+Myk7CS8qIGdldCBsb3dlciB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLworCisJLyoKKwkgKiBoYW5kbGUgdW5hbGlnbmVkIHN0YXJ0IGJ5dGVzCisJICovCisJaWYgKChsID0gYWRkciAtIHdwKSAhPSAwKSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGk9MCwgY3A9d3A7IGk8bDsgKytpLCArK2NwKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKWNwKTsKKwkJfQorCQlmb3IgKDsgaTw0ICYmIGNudD4wOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJCS0tY250OworCQkJKytjcDsKKwkJfQorCQlmb3IgKDsgY250PT0wICYmIGk8NDsgKytpLCArK2NwKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKWNwKTsKKwkJfQorCisJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkgICAgICAgIGZsYXNoX3RvX21lbSgpOworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gNDsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gNCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTA7IGk8NDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCX0KKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCSAgICAgICAgZmxhc2hfdG9fbWVtKCk7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQl3cCAgKz0gNDsKKwkJY250IC09IDQ7CisJfQorCisJaWYgKGNudCA9PSAwKSB7CisJCWZsYXNoX3RvX21lbSgpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDQgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCS0tY250OworCX0KKwlmb3IgKDsgaTw0OyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJfQorCisKKwlmbGFzaF90b19tZW0oKTsKKwlyZXR1cm4gKHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKTsKK30KKworLyoKKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworCXZvbGF0aWxlIHVsb25nIGFkZHIgPSBpbmZvLT5zdGFydFswXTsKKwl1bG9uZyBzdGFydDsKKwlpbnQgaTsKKworCWZsYXNoX3RvX3hkKCk7CisKKwkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKwlpZiAoKGluMzIoZGVzdCkgJiBkYXRhKSAhPSBkYXRhKSB7CisJCWZsYXNoX3RvX21lbSgpOworCQlyZXR1cm4gKDIpOworCX0KKworCS8qIHdyaXRlIGVhY2ggYnl0ZSBvdXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWNoYXIgKmRhdGFfY2ggPSAoY2hhciAqKSZkYXRhOworCQlpbnQgZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJCW91dDgoYWRkciArIDB4NTU1LCAweEFBKTsKKwkJaW9iYXJyaWVyX3J3KCk7CisJCW91dDgoYWRkciArIDB4MkFBLCAweDU1KTsKKwkJaW9iYXJyaWVyX3J3KCk7CisJCW91dDgoYWRkciArIDB4NTU1LCAweEEwKTsKKwkJaW9iYXJyaWVyX3J3KCk7CisJCW91dDgoZGVzdCtpLCBkYXRhX2NoW2ldKTsKKwkJaW9iYXJyaWVyX3J3KCk7CisKKwkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmbGFnKQorCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCQkvKiBkYXRhIHBvbGxpbmcgZm9yIEQ3ICovCisJCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwkJd2hpbGUgKChpbjgoZGVzdCtpKSAmIDB4ODApICE9IChkYXRhX2NoW2ldICYgMHg4MCkpIHsKKwkJCWlmIChnZXRfdGltZXIoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCQlmbGFzaF9yZXNldCAoYWRkcik7CisJCQkJZmxhc2hfdG9fbWVtKCk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCWlvYmFycmllcl9ydygpOworCQl9CisJfQorCisJZmxhc2hfcmVzZXQgKGFkZHIpOworCWZsYXNoX3RvX21lbSgpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZXNldCBiYW5rIHRvIHJlYWQgbW9kZQorICovCitzdGF0aWMgdm9pZCBmbGFzaF9yZXNldCAodWxvbmcgYWRkcikKK3sKKyAgICAgICAgZmxhc2hfdG9feGQoKTsKKwlvdXQ4KGFkZHIsIDB4RjApOwkvKiByZXNldCBiYW5rICovCisJaW9iYXJyaWVyX3J3KCk7CisJZmxhc2hfdG9fbWVtKCk7Cit9CisKK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAoZmxhc2hfaW5mb190ICppbmZvKQoreworCWludCBpOworCisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmICgibWlzc2luZyBvciB1bmtub3duIEZMQVNIIHR5cGVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSB7CisJY2FzZSBGTEFTSF9NQU5fQU1EOglwcmludGYgKCJBTUQgIik7CQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9GVUo6CXByaW50ZiAoIkZVSklUU1UgIik7CQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9CTToJcHJpbnRmICgiQlJJR0hUIE1JQ1JPICIpOwlicmVhazsKKwljYXNlIEZMQVNIX01BTl9TVE06CXByaW50ZiAoIlNHUyBUSE9NU09OICIpOwlicmVhazsKKwlkZWZhdWx0OgkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfQU0wNDA6CXByaW50ZiAoIjI5RjA0MCBvciAyOUxWMDQwICg0IE1iaXQsIHVuaWZvcm0gc2VjdG9ycylcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU00MDBCOglwcmludGYgKCJBTTI5TFY0MDBCICg0IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNNDAwVDoJcHJpbnRmICgiQU0yOUxWNDAwVCAoNCBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNODAwQjoJcHJpbnRmICgiQU0yOUxWODAwQiAoOCBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTgwMFQ6CXByaW50ZiAoIkFNMjlMVjgwMFQgKDggTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTE2MEI6CXByaW50ZiAoIkFNMjlMVjE2MEIgKDE2IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMTYwVDoJcHJpbnRmICgiQU0yOUxWMTYwVCAoMTYgTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTMyMEI6CXByaW50ZiAoIkFNMjlMVjMyMEIgKDMyIE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMzIwVDoJcHJpbnRmICgiQU0yOUxWMzIwVCAoMzIgTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCQkJYnJlYWs7CisJZGVmYXVsdDoJCXByaW50ZiAoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJCQlicmVhazsKKwl9CisKKwlpZiAoaW5mby0+c2l6ZSAlIDB4MTAwMDAwID09IDApIHsKKwkJcHJpbnRmICgiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJCWluZm8tPnNpemUgLyAweDEwMDAwMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKwl9IGVsc2UgaWYgKGluZm8tPnNpemUgJSAweDQwMCA9PSAwKSB7CisJCXByaW50ZiAoIiAgU2l6ZTogJWxkIEtCIGluICVkIFNlY3RvcnNcbiIsCisJCSAgICAgICAgaW5mby0+c2l6ZSAvIDB4NDAwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgU2l6ZTogJWxkIEIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJICAgICAgICBpbmZvLT5zaXplLCBpbmZvLT5zZWN0b3JfY291bnQpOworCX0KKworCXByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKwlmb3IgKGk9MDsgaTxpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJcHJpbnRmICgiICUwOGxYJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIKKwkJKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvaTgyNTkuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvaTgyNTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RmYzYwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9pODI1OS5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBKb2huIFcuIExpbnZpbGxlLCBsaW52aWxsZUB0dXhkcml2ZXIuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgImk4MjU5LmgiCisKKyN1bmRlZiAgSVJRX0RFQlVHCisKKyNpZmRlZiAgSVJRX0RFQlVHCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikgICAgIHByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfYnl0ZSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBmcm9tKQoreworICAgIGludCB4OworICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhcil4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp0bywgaW50IHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3RiICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9sb25nX2xpdHRsZSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpmcm9tKQoreworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBhc20gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxXG4gZWllaW9cbiBzeW5jIiA6ICI9ciIgKHgpIDogInIiIChmcm9tKSwgIm0iKCpmcm9tKSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXg7Cit9CisKKyNpZmRlZiBvdXQ4CisjdW5kZWYgb3V0OAorI2VuZGlmCisKKyNpZmRlZiBpbjgKKyN1bmRlZiBpbjgKKyNlbmRpZgorCisjZGVmaW5lIG91dDgoYWRkciwgYnl0ZSkgd3JpdGVfYnl0ZSgweEZFMDAwMDAwIHwgYWRkciwgYnl0ZSkKKyNkZWZpbmUgaW44KGFkZHIpIHJlYWRfYnl0ZSgweEZFMDAwMDAwIHwgYWRkcikKKworLyoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGlycSBtYXNrIGZvciBib3RoIDgyNTlBIGlycSBjb250cm9sbGVycywKKyAqLworc3RhdGljIGNoYXIgY2FjaGVkX2ltclsyXSA9IHsweGZmLCAweGZmfTsKKworI2RlZmluZSBjYWNoZWRfaW1yMQkoY2FjaGVkX2ltclswXSkKKyNkZWZpbmUgY2FjaGVkX2ltcjIJKGNhY2hlZF9pbXJbMV0pCisKK3ZvaWQgaTgyNTlfaW5pdCh2b2lkKQoreworCWNoYXIgZHVtbXk7CisJUFJJTlRGKCJJbml0aWFsaXppbmcgSW50ZXJydXB0IGNvbnRyb2xsZXJcbiIpOworCS8qIGluaXQgbWFzdGVyIGludGVycnVwdCBjb250cm9sbGVyICovCisJb3V0OCgweDIwLCAweDExKTsgLy8weDE5KTsgLy8gd2FzOiAweDExKTsgLyogU3RhcnQgaW5pdCBzZXF1ZW5jZSAqLworCW91dDgoMHgyMSwgMHgwMCk7IC8qIFZlY3RvciBiYXNlICovCisJb3V0OCgweDIxLCAweDA0KTsgLyogZWRnZSB0aWdnZXJlZCwgQ2FzY2FkZSAoc2xhdmUpIG9uIElSUTIgKi8KKwlvdXQ4KDB4MjEsIDB4MTEpOyAvLyB3YXM6IDB4MDEpOyAvKiBTZWxlY3QgODA4NiBtb2RlICovCisKKwkvKiBpbml0IHNsYXZlIGludGVycnVwdCBjb250cm9sbGVyICovCisJb3V0OCgweEEwLCAweDExKTsgLy8weDE5KTsgLy8gd2FzOiAweDExKTsgLyogU3RhcnQgaW5pdCBzZXF1ZW5jZSAqLworCW91dDgoMHhBMSwgMHgwOCk7IC8qIFZlY3RvciBiYXNlICovCisJb3V0OCgweEExLCAweDAyKTsgLyogZWRnZSB0cmlnZ2VyZWQsIENhc2NhZGUgKHNsYXZlKSBvbiBJUlEyICovCisJb3V0OCgweEExLCAweDExKTsgLy8gd2FzOiAweDAxKTsgLyogU2VsZWN0IDgwODYgbW9kZSAqLworCisJLyogYWx3YXlzIHJlYWQgSVNSICovCisJb3V0OCgweDIwLCAweDBCKTsKKwlkdW1teSA9IGluOChJU1JfMSk7CisJb3V0OCgweEEwLCAweDBCKTsKKwlkdW1teSA9IGluOChJU1JfMik7CisKKy8qICAgICBvdXQ4KDB4NDMsIDB4MzApOyAqLworLyogICAgIG91dDgoMHg0MCwgMCk7ICovCisvKiAgICAgb3V0OCgweDQwLCAwKTsgKi8KKy8qICAgICBvdXQ4KDB4NDMsIDB4NzApOyAqLworLyogICAgIG91dDgoMHg0MSwgMCk7ICovCisvKiAgICAgb3V0OCgweDQxLCAwKTsgKi8KKy8qICAgICBvdXQ4KDB4NDMsIDB4YjApOyAqLworLyogICAgIG91dDgoMHg0MiwgMCk7ICovCisvKiAgICAgb3V0OCgweDQyLCAwKTsgKi8KKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KKwlvdXQ4KElNUl8yLCBjYWNoZWRfaW1yMik7CisJb3V0OChJTVJfMSwgY2FjaGVkX2ltcjEpOworCisJaTgyNTlfdW5tYXNrX2lycSgyKTsKKyNpZiAwCisJeworCSAgICBpbnQgaTsKKwkgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKwkgICAgeworCQlpODI1OV91bm1hc2tfaXJxKGkpOworCSAgICB9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2xhdGlsZSBjaGFyICpwY2lfaW50YWNrID0gKHZvaWQgKikweEZFRjAwMDAwOworCitpbnQgaTgyNTlfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKworCWlycSA9IHJlYWRfbG9uZ19saXR0bGUocGNpX2ludGFjaykgJiAweGZmOworCWlmIChpcnE9PTcpIHsKKwkJLyoKKwkJICogVGhpcyBtYXkgYmUgYSBzcHVyaW91cyBpbnRlcnJ1cHQuCisJCSAqCisJCSAqIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKElTUikuIElmIHRoZSBtb3N0CisJCSAqIHNpZ25pZmljYW50IGJpdCBpcyBub3Qgc2V0IHRoZW4gdGhlcmUgaXMgbm8gdmFsaWQKKwkJICogaW50ZXJydXB0LgorCQkgKi8KKwkJaWYofmluOCgweDIwKSYweDgwKSB7CisJCQlpcnEgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiBpcnE7Cit9CitpbnQgaTgyNTlfZ2V0X2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIGlycTsKKworCS8qCisJICogUGVyZm9ybSBhbiBpbnRlcnJ1cHQgYWNrbm93bGVkZ2UgY3ljbGUgb24gY29udHJvbGxlciAxCisJICovCisJb3V0OChPQ1czXzEsIDB4MEMpOyAvKiBwcmVwYXJlIGZvciBwb2xsICovCisJaXJxID0gaW44KElQTF8xKSAmIDc7CisJaWYgKGlycSA9PSAyKSB7CisJCS8qCisJCSAqIEludGVycnVwdCBpcyBjYXNjYWRlZCBzbyBwZXJmb3JtIGludGVycnVwdAorCQkgKiBhY2tub3dsZWRnZSBvbiBjb250cm9sbGVyIDIKKwkJICovCisJCW91dDgoT0NXM18yLCAweDBDKTsgLyogcHJlcGFyZSBmb3IgcG9sbCAqLworCQlpcnEgPSAoaW44KElQTF8yKSAmIDcpICsgODsKKwkJaWYgKGlycSA9PSAxNSkgeworCQkJLyoKKwkJCSAqIFRoaXMgbWF5IGJlIGEgc3B1cmlvdXMgaW50ZXJydXB0CisJCQkgKgorCQkJICogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4gSWYgdGhlIG1vc3QKKwkJCSAqIHNpZ25pZmljYW50IGJpdCBpcyBub3Qgc2V0IHRoZW4gdGhlcmUgaXMgbm8gdmFsaWQKKwkJCSAqIGludGVycnVwdAorCQkJICovCisJCQlvdXQ4KE9DVzNfMiwgMHgwYik7CisJCQlpZiAofihpbjgoSVNSXzIpICYgMHg4MCkpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGlycSA9PSA3KSB7CisJCS8qCisJCSAqIFRoaXMgbWF5IGJlIGEgc3B1cmlvdXMgaW50ZXJydXB0CisJCSAqCisJCSAqIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuIElmIHRoZSBtb3N0CisJCSAqIHNpZ25pZmljYW50IGJpdCBpcyBub3Qgc2V0IHRoZW4gdGhlcmUgaXMgbm8gdmFsaWQKKwkJICogaW50ZXJydXB0CisJCSAqLworCQlvdXQ4KE9DVzNfMSwgMHgwYik7CisJCWlmICh+KGluOChJU1JfMSkgJiAweDgwKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBpcnE7Cit9CisKKy8qCisgKiBDYXJlZnVsISBUaGUgODI1OUEgaXMgYSBmcmFnaWxlIGJlYXN0LCBpdCBwcmV0dHkKKyAqIG11Y2ggX2hhc18gdG8gYmUgZG9uZSBleGFjdGx5IGxpa2UgdGhpcyAobWFzayBpdAorICogZmlyc3QsIF90aGVuXyBzZW5kIHRoZSBFT0ksIGFuZCB0aGUgb3JkZXIgb2YgRU9JCisgKiB0byB0aGUgdHdvIDgyNTlzIGlzIGltcG9ydGFudCEKKyAqLwordm9pZCBpODI1OV9tYXNrX2FuZF9hY2soaW50IGlycSkKK3sKKwlpZiAoaXJxID4gNykgeworCQljYWNoZWRfaW1yMiB8PSAoMSA8PCAoaXJxIC0gOCkpOworCQlpbjgoSU1SXzIpOyAvKiBEVU1NWSAqLworCQlvdXQ4KElNUl8yLCBjYWNoZWRfaW1yMik7CisJCW91dDgoT0NXMl8yLCAweDIwKTsgLyogTm9uLXNwZWNpZmljIEVPSSAqLworCQlvdXQ4KE9DVzJfMSwgMHgyMCk7IC8qIE5vbi1zcGVjaWZpYyBFT0kgdG8gY2FzY2FkZSAqLworCX0gZWxzZSB7CisJCWNhY2hlZF9pbXIxIHw9ICgxIDw8IGlycSk7CisJCWluOChJTVJfMSk7IC8qIERVTU1ZICovCisJCW91dDgoSU1SXzEsIGNhY2hlZF9pbXIxKTsKKwkJb3V0OChPQ1cyXzEsIDB4MjApOyAvKiBOb24tc3BlY2lmaWMgRU9JICovCisJfQorfQorCit2b2lkIGk4MjU5X21hc2tfaXJxKGludCBpcnEpCit7CisJaWYgKGlycSAmIDgpIHsKKwkJY2FjaGVkX2ltcjIgfD0gKDEgPDwgKGlycSAmIDcpKTsKKwkJb3V0OChJTVJfMiwgY2FjaGVkX2ltcjIpOworCX0gZWxzZSB7CisJCWNhY2hlZF9pbXIxIHw9ICgxIDw8IGlycSk7CisJCW91dDgoSU1SXzEsIGNhY2hlZF9pbXIxKTsKKwl9Cit9CisKK3ZvaWQgaTgyNTlfdW5tYXNrX2lycShpbnQgaXJxKQoreworCWlmIChpcnEgJiA4KSB7CisJCWNhY2hlZF9pbXIyICY9IH4oMSA8PCAoaXJxICYgNykpOworCQlvdXQ4KElNUl8yLCBjYWNoZWRfaW1yMik7CisJfSBlbHNlIHsKKwkJY2FjaGVkX2ltcjEgJj0gfigxIDw8IGlycSk7CisJCW91dDgoSU1SXzEsIGNhY2hlZF9pbXIxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2k4MjU5LmggYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2k4MjU5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjNDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvaTgyNTkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBKb2huIFcuIExpbnZpbGxlLCBsaW52aWxsZUB0dXhkcml2ZXIuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2RlZmluZSBJQ1cxXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfSUNXMQorI2RlZmluZSBJQ1cxXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfSUNXMQorI2RlZmluZSBJQ1cyXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfSUNXMgorI2RlZmluZSBJQ1cyXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfSUNXMgorI2RlZmluZSBJQ1czXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfSUNXMworI2RlZmluZSBJQ1czXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfSUNXMworI2RlZmluZSBJQ1c0XzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfSUNXNAorI2RlZmluZSBJQ1c0XzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfSUNXNAorI2RlZmluZSBPQ1cxXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfT0NXMQorI2RlZmluZSBPQ1cxXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfT0NXMQorI2RlZmluZSBPQ1cyXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfT0NXMgorI2RlZmluZSBPQ1cyXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfT0NXMgorI2RlZmluZSBPQ1czXzEgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDFfT0NXMworI2RlZmluZSBPQ1czXzIgIENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgSVNBX0lOVDJfT0NXMworCisjZGVmaW5lIElNUl8xICAgT0NXMV8xCisjZGVmaW5lIElNUl8yICAgT0NXMV8yCisKKyNkZWZpbmUgSVNSXzEgICBJQ1cxXzEKKyNkZWZpbmUgSVNSXzIgICBJQ1cxXzIKKworI2RlZmluZSBJUExfMSAgIElDVzFfMQorI2RlZmluZSBJUExfMiAgIElDVzFfMgorCitleHRlcm4gdm9pZCBpODI1OV9pbml0KHZvaWQpOworCitleHRlcm4gaW50IGk4MjU5X2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitleHRlcm4gdm9pZCBpODI1OV9tYXNrX2FuZF9hY2soaW50IGlycSk7CisKK2V4dGVybiB2b2lkIGk4MjU5X21hc2tfaXJxKGludCBpcnEpOworCitleHRlcm4gdm9pZCBpODI1OV91bm1hc2tfaXJxKGludCBpcnEpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9pbnRlcnJ1cHRzLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjkzZWEwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEpvaG4gVy4gTGludmlsbGUgPGxpbnZpbGxlQHR1eGRyaXZlci5jb20+CisgKgorICogICAgQ29waWVkIGFuZCBtb2RpZmllZCBmcm9tIG9yaWdpbmFsIGNvZGUgYnkgSm9zaCBIdWJlci4gIE9yaWdpbmFsCisgKiAgICBjb3B5cmlnaHQgbm90aWNlIHByZXNlcnZlZCBiZWxvdy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBpbnRlcnJ1cHRzLmMgLSBqdXN0IGVub3VnaCBzdXBwb3J0IGZvciB0aGUgZGVjcmVtZW50ZXIvdGltZXIKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlICJpODI1OS5oIgorCisjdW5kZWYgREVCVUcKKyNpZmRlZiAgREVCVUcKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKSAgICAgcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorI2RlZmluZSBOUl9JUlFTCTE2CisKK3ZvaWQgaXJxX2FsbG9jX2luaXQodm9pZCk7Citsb25nIGlycV9hbGxvYyhsb25nIHdhbnRlZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBkZWNyZW1lbnRlcl9jb3VudDsJICAgICAvKiBjb3VudCB2YWx1ZSBmb3IgMWU2L0haIG1pY3Jvc2Vjb25kcyAqLworCitzdHJ1Y3QgaXJxX2FjdGlvbiB7CisgICAgaW50ZXJydXB0X2hhbmRsZXJfdCAqaGFuZGxlcjsKKyAgICB2b2lkICphcmc7CisgICAgdWxvbmcgY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlycV9hY3Rpb24gaXJxX2hhbmRsZXJzW05SX0lSUVNdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZworZ2V0X21zcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbXNyOworCisJYXNtIHZvbGF0aWxlKCJtZm1zciAlMCIgOiAiPXIiIChtc3IpIDopOworCXJldHVybiBtc3I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3NldF9tc3IodW5zaWduZWQgbG9uZyBtc3IpCit7CisJYXNtIHZvbGF0aWxlKCJtdG1zciAlMCIgOiA6ICJyIiAobXNyKSk7IAorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCitnZXRfZGVjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlhc20gdm9sYXRpbGUoIm1mZGVjICUwIiA6ICI9ciIgKHZhbCkgOik7CisJcmV0dXJuIHZhbDsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitzZXRfZGVjKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibXRkZWMgJTAiIDogOiAiciIgKHZhbCkpOyAKK30KKworCit2b2lkCitlbmFibGVfaW50ZXJydXB0cyh2b2lkKQoreworICAgIHNldF9tc3IgKGdldF9tc3IoKSB8IE1TUl9FRSk7Cit9CisKKy8qIHJldHVybnMgZmxhZyBpZiBNU1JfRUUgd2FzIHNldCBiZWZvcmUgKi8KK2ludAorZGlzYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCit7CisgICAgdWxvbmcgbXNyOworCisgICAgbXNyID0gZ2V0X21zcigpOworICAgIHNldF9tc3IgKG1zciAmIH5NU1JfRUUpOworICAgIHJldHVybiAoKG1zciAmIE1TUl9FRSkgIT0gMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaW50ZXJydXB0X2luaXQgKHZvaWQpCit7CisgICAgZXh0ZXJuIHZvaWQgbmV3X3Jlc2V0KHZvaWQpOworICAgIGV4dGVybiB2b2lkIG5ld19yZXNldF9lbmQodm9pZCk7CisjaWZkZWYgREVCVUcKKwlwdXRzKCJpbnRlcnJ1cHRfaW5pdDogc2V0dGluZyBkZWNyZW1lbnRlcl9jb3VudFxuIik7CisjZW5kaWYKKwlkZWNyZW1lbnRlcl9jb3VudCA9IGdldF90YmNsaygpIC8gQ0ZHX0haOworCisjaWZkZWYgREVCVUcKKwlwdXRzKCJpbnRlcnJ1cHRfaW5pdDogc2V0dGluZyBhY3R1YWwgZGVjcmVtdGVyXG4iKTsKKyNlbmRpZgorCXNldF9kZWMgKGdldF90YmNsaygpIC8gQ0ZHX0haKTsKKworI2lmZGVmIERFQlVHCisJcHV0cygiaW50ZXJydXB0X2luaXQ6IGNsZWFyaW5nIGV4dGVybmFsIGludGVycnVwdCB0YWJsZVxuIik7CisjZW5kaWYKKwkvKiBjbGVhciBleHRlcm5hbCBpbnRlcnJ1cHQgdGFibGUgaGVyZSAqLworCW1lbXNldChpcnFfaGFuZGxlcnMsIDAsIHNpemVvZihpcnFfaGFuZGxlcnMpKTsKKworI2lmZGVmIERFQlVHCisJcHV0cygiaW50ZXJydXB0X2luaXQ6IGluaXRpYWxpemluZyBpbnRlcnJ1cHQgY29udHJvbGxlclxuIik7CisjZW5kaWYKKwlpODI1OV9pbml0KCk7CisKKyNpZmRlZiBERUJVRworCXB1dHMoIkNvcHlpbmcgcmVzZXQgdHJhbXBvbGluZVxuIik7CisjZW5kaWYKKwkvKiBXQVJOSU5HOiBBc3NtdWVzIHRoYXQgdGhlIGZpcnN0IG1lZ2FieXRlIGlzIENBQ0hFSU5ISUJJVCEgKi8KKwltZW1jcHkoKHZvaWQgKikweDEwMCwgbmV3X3Jlc2V0LCBuZXdfcmVzZXRfZW5kIC0gbmV3X3Jlc2V0KTsKKworI2lmZGVmIERFQlVHCisJUFJJTlRGKCJpbnRlcnJ1cHRfaW5pdDogZW5hYmxpbmcgaW50ZXJydXB0cyAobXNyID0gJTA4eClcbiIsCisJCWdldF9tc3IoKSk7CisjZW5kaWYKKwlzZXRfbXNyIChnZXRfbXNyKCkgfCBNU1JfRUUpOworCisjaWZkZWYgREVCVUcKKwlQUklOVEYoImludGVycnVwdF9pbml0OiBkb25lLiAobXNyID0gJTA4eClcbiIsIGdldF9tc3IoKSk7CisjZW5kaWYKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQKK2V4dGVybmFsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBleHRlcm4gaW50IGk4MjU5X2lycSh2b2lkKTsKKworCWludCBpcnEsIHVubWFzayA9IDE7CisKKwlpcnEgPSBpODI1OV9pcnEoKTsgLy9pODI1OV9nZXRfaXJxKHJlZ3MpOworLy8JcHJpbnRmKCJpcnEgPSAlZCwgaGFuZGxlciBhdCAlcCBhY2s9JWRcbiIsIGlycSwgaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciwgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHhGRUYwMDAwMCk7CisJaTgyNTlfbWFza19hbmRfYWNrKGlycSk7CisKKwlpZiAoaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciAhPSBOVUxMKQorCQkoKmlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIpKGlycV9oYW5kbGVyc1tpcnFdLmFyZyk7CisJZWxzZSB7CisJCVBSSU5URiAoIlxuQm9ndXMgRXh0ZXJuYWwgSW50ZXJydXB0IElSUSAlZFxuIiwgaXJxKTsKKwkJLyoKKwkgCSogdHVybiBvZmYgdGhlIGJvZ3VzIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0CisJIAkqIG1pZ2h0IHJlcGVhdCBmb3JldmVyCisJIAkqLworCQl1bm1hc2sgPSAwOworCX0KKworCWlmICh1bm1hc2spIGk4MjU5X3VubWFza19pcnEoaXJxKTsKK30KKwordm9sYXRpbGUgdWxvbmcgdGltZXN0YW1wID0gMDsKKworLyoKKyAqIHRpbWVyX2ludGVycnVwdCAtIGdldHMgY2FsbGVkIHdoZW4gdGhlIGRlY3JlbWVudGVyIG92ZXJmbG93cywKKyAqIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIFRyaXZpYWwgaW1wbGVtZW50YXRpb24gLSBubyBuZWVkIHRvIGJlIHJlYWxseSBhY2N1cmF0ZS4KKyAqLwordm9pZAordGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNldF9kZWMoZGVjcmVtZW50ZXJfY291bnQpOworCXRpbWVzdGFtcCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorcmVzZXRfdGltZXIodm9pZCkKK3sKKwl0aW1lc3RhbXAgPSAwOworfQorCit1bG9uZworZ2V0X3RpbWVyKHVsb25nIGJhc2UpCit7CisJcmV0dXJuICh0aW1lc3RhbXAgLSBiYXNlKTsKK30KKwordm9pZAorc2V0X3RpbWVyKHVsb25nIHQpCit7CisJdGltZXN0YW1wID0gdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGEgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KKwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlcihpbnQgaXJxLCBpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyLCB2b2lkICphcmcpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJUFJJTlRGKCJpcnFfaW5zdGFsbF9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCVBSSU5URigiaXJxX2luc3RhbGxfaGFuZGxlcjogMHglMDhseCByZXBsYWNpbmcgMHglMDhseFxuIiwKKwkJICAgICAgICh1bG9uZyloYW5kbGVyLCAodWxvbmcpaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlcik7CisKKwlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKKwlpcnFfaGFuZGxlcnNbaXJxXS5hcmcgICAgID0gYXJnOworCisJaTgyNTlfdW5tYXNrX2lycShpcnEpOworfQorCit2b2lkCitpcnFfZnJlZV9oYW5kbGVyKGludCBpcnEpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJUFJJTlRGKCJpcnFfZnJlZV9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCWk4MjU5X21hc2tfaXJxKGlycSk7CisKKwlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID0gTlVMTDsKKwlpcnFfaGFuZGxlcnNbaXJxXS5hcmcgICAgID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2RvX2lycWluZm8oY21kX3RibF90ICpjbWR0cCwgYmRfdCAqYmQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXB1dHMoIklSUSByZWxhdGVkIGZ1bmN0aW9ucyBhcmUgdW5pbXBsZW1lbnRlZCBjdXJyZW50bHkuXG4iKTsKK30KKworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL21hY3Jvcy5oIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJlMzliCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9tYWNyb3MuaApAQCAtMCwwICsxLDg0IEBACisKKyNpZm5kZWYgX01BQ1JPU19ICisjZGVmaW5lIF9NQUNST1NfSAorCisJLyoKKwkqKiBMb2FkIGEgbG9uZyBpbnRlZ2VyIGludG8gYSByZWdpc3RlcgorCSovCisgICAgICAJLm1hY3JvIGxpdyByZWcsIHZhbHVlCisgICAgICAgICAgICAgICAgbGlzIFxyZWcsIFx2YWx1ZUBoCisgICAgICAgICAgICAgICAgb3JpIFxyZWcsIFxyZWcsIFx2YWx1ZUBsCisgICAgICAgIC5lbmRtCisKKworCS8qIAorCSoqIEdlbmVyYXRlIGNvbmZpZ19hZGRyIHJlcXVlc3QKKwkqKiBUaGlzIG1hY3JvIGV4cGVjdHMgdGhlIHZhbHVlcyBpbiByZWdpc3RlcnM6CisJKiogcjMgLSBidXMKKwkqKiByNCAtIGRldmZuCisJKiogcjUgLSBvZmZzZXQKKwkqLworCS5tYWNybyBjb25maWdfYWRkciAJCisJCXJsd2lubQlyOSwgcjUsIDI0LCAwLCA2CisJCXJsd2lubQlyOCwgcjQsIDE2LCAwLCAzMQorCQlybHdpbm0JcjcsIHIzLCA4LCAwLCAzMQorCQlvcglyOSwgcjgsIHI5CisJCW9yCXI5LCByNywgcjkKKwkJb3JpCXI5LCByOSwgMHg4MAorCQlsaXcJcjEwLCAweGZlYzAwY2Y4CisJCXN0dwlyOSwgMChyMTApCisJCWVpZWlvCisJCXN5bmMKKwkuZW5kbQorCisJCisJLyoKKwkqKiBHZW5lcmF0ZSBjb25maWdfZGF0YSBhZGRyZXNzCisJKi8KKwkubWFjcm8gY29uZmlnX2RhdGEgbWFzaworCQlhbmRpLglyOSwgcjUsIFxtYXNrCisJCWFkZGkJcjksIHI5LCAweGNmYworCQlvcmlzCXI5LCByOSwgMHhmZWUwCisJLmVuZG0KKworCisJLyoKKwkqKiBXcml0ZSBhIGJ5dGUgdmFsdWUgdG8gYW4gb3V0cHV0IHBvcnQKKwkqLworICAgICAgICAubWFjcm8gb3V0YiBwb3J0LCB2YWx1ZQorICAgICAgICAgICAgICAgIGxpcyAgICAgcjIsIDB4ZmUwMAorICAgICAgICAgICAgICAgIGxpICAgICAgcjAsIFx2YWx1ZQorICAgICAgICAgICAgICAgIHN0YiAgICAgcjAsIFxwb3J0KHIyKQorICAgICAgICAuZW5kbQorCisKKwkvKgorCSoqIFdyaXRlIGEgcmVnaXN0ZXIgYnl0ZSB2YWx1ZSB0byBhbiBvdXRwdXQgcG9ydAorCSovCisgICAgICAgIC5tYWNybyBvdXRiciBwb3J0LCB2YWx1ZQorICAgICAgICAgICAgICAgIGxpcyAgICAgcjIsIDB4ZmUwMAorICAgICAgICAgICAgICAgIHN0YiAgICAgXHZhbHVlLCBccG9ydChyMikKKyAgICAgICAgLmVuZG0KKworCisJLyogCisJKiogUmVhZCBhIGJ5dGUgdmFsdWUgZnJvbSBhIHBvcnQgaW50byBhIHNwZWNpZmllZCByZWdpc3RlcgorCSovCisgICAgICAgIC5tYWNybyBpbmIgcmVnLCBwb3J0CisgICAgICAgICAgICAgICAgbGlzICAgICByMiwgMHhmZTAwCisgICAgICAgICAgICAgICAgbGJ6ICAgICBccmVnLCBccG9ydChyMikKKyAgICAgICAgLmVuZG0KKworCisJLyoKKwkqKiBXcml0ZSBhIGJ5dGUgdG8gdGhlIFN1cGVySU8gY29uZmlnIGFyZWEKKwkqLworICAgICAgICAubWFjcm8gc2lvd2Igb2Zmc2V0LCB2YWx1ZQorICAgICAgICAgICAgICAgIGxpICAgICAgcjMsIDAKKyAgICAgICAgICAgICAgICBsaSAgICAgIHI0LCAoNzw8MykKKyAgICAgICAgICAgICAgICBsaSAgICAgIHI1LCBcb2Zmc2V0CisgICAgICAgICAgICAgICAgbGkgICAgICByNiwgXHZhbHVlCisgICAgICAgICAgICAgICAgYmwgICAgICBwY2lfd3JpdGVfY2ZnX2J5dGUKKyAgICAgICAgLmVuZG0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL21lbWlvLlMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL21lbWlvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhMDlhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtaW8uUwpAQCAtMCwwICsxLDc0IEBACisjaW5jbHVkZQkibWFjcm9zLmgiCisKKwkKKworCS5nbG9ibCBwY2lfcmVhZF9jZmdfYnl0ZQorCQorcGNpX3JlYWRfY2ZnX2J5dGU6CisJY29uZmlnX2FkZHIKKwljb25maWdfZGF0YQkzCisJZWllaW8KKwlzeW5jCisJbGJ6CXIzLCAwKHI5KQorCWJscgorCisJCisKKwkuZ2xvYmwgcGNpX3dyaXRlX2NmZ19ieXRlCisJCitwY2lfd3JpdGVfY2ZnX2J5dGU6CQorCWNvbmZpZ19hZGRyCisJY29uZmlnX2RhdGEJMworCXN0YglyNiwgMChyOSkKKwllaWVpbworCXN5bmMKKwlibHIKKworCisKKwkuZ2xvYmwgcGNpX3JlYWRfY2ZnX3dvcmQKKwkKK3BjaV9yZWFkX2NmZ193b3JkOgorCWNvbmZpZ19hZGRyCisJY29uZmlnX2RhdGEJMgorCWxoYnJ4CXIzLCAwLCByOQorCWVpZWlvCisJc3luYworCWJscgorCisKKwkKKwkuZ2xvYmwgcGNpX3dyaXRlX2NmZ193b3JkCisJCitwY2lfd3JpdGVfY2ZnX3dvcmQ6CisJY29uZmlnX2FkZHIKKwljb25maWdfZGF0YQkyCisJc3RoYnJ4CXI2LCAwLCByOQorCWVpZWlvCisJc3luYworCWJscgorCisJCisKKwkuZ2xvYmwgcGNpX3JlYWRfY2ZnX2xvbmcKKwkKK3BjaV9yZWFkX2NmZ19sb25nOgorCWNvbmZpZ19hZGRyCisJY29uZmlnX2RhdGEJMAorCWx3YnJ4CXIzLCAwLCByOQorCWVpZWlvCisJc3luYworCWJscgorCisKKworCS5nbG9ibCBwY2lfd3JpdGVfY2ZnX2xvbmcKKwkKK3BjaV93cml0ZV9jZmdfbG9uZzoKKwljb25maWdfYWRkcgorCWNvbmZpZ19kYXRhCTAKKwlzdHdicngJcjYsIDAsIHI5CisJZWllaW8KKwlzeW5jCisJYmxyCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtaW8uaCBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjA4MzlmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9tZW1pby5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTWVtb3J5IG1hcHBlZCBJTworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogSHlwZXJpb24gRW50ZXJ0YWlubWVudCwgVGhvbWFzRkBoeXBlcmlvbi1lbnRlcnRhaW5tZW50LmNvbSAKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogWW91IG1heSBhbHNvIHVzZSB0aGlzIHVuZGVyIGEgQlNEIGxpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkKKyAqCisgKi8gCisKKyNpZm5kZWYgX01FTUlPX0gKKyNkZWZpbmUgX01FTUlPX0gKKworI2luY2x1ZGUgInNob3J0X3R5cGVzLmgiCisKKyNkZWZpbmUgSU9CQVNFIDB4RkUwMDAwMDAKKworI2RlZmluZSBpbl9ieXRlKGZyb20pIHJlYWRfYnl0ZSggKHVpbnQ4ICopKElPQkFTRSB8IChmcm9tKSkpCisjZGVmaW5lIGluX3dvcmQoZnJvbSkgcmVhZF93b3JkX2xpdHRsZSgodWludDE2ICopKElPQkFTRSB8IChmcm9tKSkpCisjZGVmaW5lIGluX2xvbmcoZnJvbSkgcmVhZF9sb25nX2xpdHRsZSgodWludDMyICopKElPQkFTRSB8IChmcm9tKSkpCisjZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKHVpbnQ4ICopKElPQkFTRSB8ICh0bykpLCB2YWwpCisjZGVmaW5lIG91dF93b3JkKHRvLCB2YWwpIHdyaXRlX3dvcmRfbGl0dGxlKCh1aW50MTYgKikoSU9CQVNFIHwgKHRvKSksIHZhbCkKKyNkZWZpbmUgb3V0X2xvbmcodG8sIHZhbCkgd3JpdGVfbG9uZ19saXR0bGUoKHVpbnQzMiAqKShJT0JBU0UgfCAodG8pKSwgdmFsKQorCisKK3N0YXRpYyBpbmxpbmUgdWludDggcmVhZF9ieXRlKHZvbGF0aWxlIHVpbnQ4ICpmcm9tKQoreworICAgIGludCB4OworICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvXG4gc3luYyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKKyAgICByZXR1cm4gKHVpbnQ4KXg7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2J5dGUodm9sYXRpbGUgdWludDggKnRvLCB1aW50OCB4KQoreworICAgIGFzbSB2b2xhdGlsZSAoInN0YiAlMSwlMFxuIGVpZWlvXG4gc3luYyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2IHJlYWRfd29yZF9saXR0bGUodm9sYXRpbGUgdWludDE2ICpmcm9tKQoreworICAgIGludCB4OworICAgIGFzbSB2b2xhdGlsZSAoImxoYnJ4ICUwLDAsJTFcbiBlaWVpb1xuIHN5bmMiIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIgKCpmcm9tKSk7CisgICAgcmV0dXJuICh1aW50MTYpeDsKK30KKworc3RhdGljIGlubGluZSB1aW50MTYgcmVhZF93b3JkX2JpZyh2b2xhdGlsZSB1aW50MTYgKmZyb20pCit7CisgICAgaW50IHg7CisgICAgYXNtIHZvbGF0aWxlICgibGh6ICUwLCUxXG4gZWllaW9cbiBzeW5jIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAodWludDE2KXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2xpdHRsZSh2b2xhdGlsZSB1aW50MTYgKnRvLCBpbnQgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdGhicnggJTEsMCwlMlxuIGVpZWlvXG4gc3luYyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9iaWcodm9sYXRpbGUgdWludDE2ICp0bywgaW50IHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3RoICUxLCUwXG4gZWllaW9cbiBzeW5jIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzIgcmVhZF9sb25nX2xpdHRsZSh2b2xhdGlsZSB1aW50MzIgKmZyb20pCit7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGFzbSB2b2xhdGlsZSAoImx3YnJ4ICUwLDAsJTFcbiBlaWVpb1xuIHN5bmMiIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIoKmZyb20pKTsKKyAgICByZXR1cm4gKHVpbnQzMil4OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMiByZWFkX2xvbmdfYmlnKHZvbGF0aWxlIHVpbnQzMiAqZnJvbSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgYXNtIHZvbGF0aWxlICgibHd6ICUwLCUxXG4gZWllaW9cbiBzeW5jIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAodWludDMyKXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2xpdHRsZSh2b2xhdGlsZSB1aW50MzIgKnRvLCB1aW50MzIgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdHdicnggJTEsMCwlMlxuIGVpZWlvXG4gc3luYyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19iaWcodm9sYXRpbGUgdWludDMyICp0bywgdWludDMyIHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3R3ICUxLCUwXG4gZWllaW9cbiBzeW5jIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKK30KKworI2RlZmluZSBDT05GSUdfQUREUihidXMsIGRldmZuLCBvZmZzZXQpIFwKKyAgICB3cml0ZV9sb25nX2JpZygodWludDMyICopMHhGRUMwMENGOCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoKG9mZnNldCAmIDB4RkMpPDwyNCkgfCAoZGV2Zm4gPDwgMTYpICBcCisgICAgICAgICAgICAgICAgICAgfCAoYnVzPDw4KSB8IDB4ODApOworI2RlZmluZSBDT05GSUdfREFUQShvZmZzZXQsbWFzaykgKCh2b2lkICopKDB4RkVFMDBDRkMrKG9mZnNldCAmIG1hc2spKSkKKworCit1aW50OCBwY2lfcmVhZF9jZmdfYnl0ZShpbnQzMiBidXMsIGludDMyIGRldmZuLCBpbnQzMiBvZmZzZXQpOwordm9pZCBwY2lfd3JpdGVfY2ZnX2J5dGUoaW50MzIgYnVzLCBpbnQzMiBkZXZmbiwgaW50MzIgb2Zmc2V0LCB1aW50OCB4KTsKK3VpbnQxNiBwY2lfcmVhZF9jZmdfd29yZChpbnQzMiBidXMsIGludDMyIGRldmZuLCBpbnQzMiBvZmZzZXQpOwordm9pZCBwY2lfd3JpdGVfY2ZnX3dvcmQoaW50MzIgYnVzLCBpbnQzMiBkZXZmbiwgaW50MzIgb2Zmc2V0LCB1aW50MTYgeCk7Cit1aW50MzIgcGNpX3JlYWRfY2ZnX2xvbmcoaW50MzIgYnVzLCBpbnQzMiBkZXZmbiwgaW50MzIgb2Zmc2V0KTsKK3ZvaWQgcGNpX3dyaXRlX2NmZ19sb25nKGludDMyIGJ1cywgaW50MzIgZGV2Zm4sIGludDMyIG9mZnNldCwgdWludDMyIHgpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9tZW1vcnlfZHVtcCBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtb3J5X2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtb3J5X2R1bXAKQEAgLTAsMCArMSwzMCBAQAorNjQgTUI6CisweDAwOiA4MCAwOCAwNCAwYyAwOSAwMSA0MCAwMCAwMSBhMCA2MCAwMCA4MCAwOCAwMCAwMQorMHgxMDogOGYgMDQgMDQgMDEgMDEgMDAgMDYgYTAgNjAgMDAgMDAgMTQgMTAgMTQgMmQgMTAKKzB4MjA6IDIwIDEwIDIwIDEwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisweDMwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAxMiBmMgorMHg0MDogN2YgNjEgMDAgMDAgMDAgMDAgMDAgMDAgNDYgMDQgMDAgZmYgZmYgZmYgZmYgZmYKKzB4NTA6IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmCisweDYwOiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZgorMHg3MDogZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgNjQgZjQKKworNTEyIE1COgorMHgwMDogODAgMDggMDQgMGQgMGEgMDIgNDAgMDAgMDEgNzUgNTQgMDAgODIgMDggMDAgMDEKKzB4MTA6IDhmIDA0IDA0IDAxIDAxIDAwIDBmIDAwIDAwIDAwIDAwIDE0IDBmIDE0IDJkIDQwCisweDIwOiAxNSAwOCAxNSAwOCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorMHgzMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMTIgZDIKKzB4NDA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisweDUwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorMHg2MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKzB4NzA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDY0IGZkCisKKzI1NiBNQjoKKzB4MDA6IDgwIDA4IDA0IDBjIDBhIDAyIDQwIDAwIDAxIDc1IDU0IDAwIDgwIDA4IDAwIDAxCisweDEwOiA4ZiAwNCAwNiAwMSAwMSAwMCAwZSBhMCA2MCAwMCAwMCAxNCAwZiAxNCAyZCAyMAorMHgyMDogMTUgMDggMTUgMDggMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKzB4MzA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDEyIGIwCisweDQwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorMHg1MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKzB4NjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisweDcwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA2NCBmNgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL252cmFtLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL252cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkZTE1YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbnZyYW0uYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBUaG9tYXMgRnJpZWRlbiwgSHlwZXJpb24gRW50ZXJ0YWlubWVudCAKKyAqIFRob21hc0ZAaHlwZXJpb24tZW50ZXJ0YWlubWVudC5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSAibWVtaW8uaCIKKwordm9pZCBlbmFibGVfbnZyYW0odm9pZCkKK3sKKyAgICBwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgMHg1NiwgMHgwYik7Cit9CisKK3ZvaWQgZGlzYWJsZV9udnJhbSh2b2lkKQoreworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCAwLCAweDU2LCAweDApOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3BzMmtiZC5jIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9wczJrYmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ2N2JlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9wczJrYmQuYwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogSm9obiBXLiBMaW52aWxsZSwgbGludmlsbGVAdHV4ZHJpdmVyLmNvbQorICogCisgKiBNb2RpZmllZCBmcm9tIGNvZGUgZm9yIHN1cHBvcnQgb2YgTUlQNDA1IGFuZCBQSVA0MDUgYm9hcmRzLiAgUHJldmlvdXMKKyAqIGNvcHlyaWdodCBmb2xsb3dzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRGVuaXMgUGV0ZXIsIE1QTCBBRyBTd2l0emVybGFuZCwgZC5wZXRlckBtcGwuY2gKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogU291cmNlIHBhcnRseSBkZXJpdmVkIGZyb206CisgKiBsaW51eC9kcml2ZXJzL2NoYXIvcGNfa2V5Yi5jCisgKgorICoKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxkZXZpY2VzLmg+CisjaW5jbHVkZSAicHMya2JkLmgiCisKKwordW5zaWduZWQgY2hhciBrYmRfcmVhZF9zdGF0dXModm9pZCk7Cit1bnNpZ25lZCBjaGFyIGtiZF9yZWFkX2lucHV0KHZvaWQpOwordm9pZCBrYmRfc2VuZF9kYXRhKHVuc2lnbmVkIGNoYXIgZGF0YSk7Cit2b2lkIGk4MjU5X21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwordm9pZCBpODI1OV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOworCisvKiB1c2VkIG9ubHkgYnkgc2VuZF9kYXRhIC0gc2V0IGJ5IGtleWJvYXJkX2ludGVycnVwdCAqLworCisKKyN1bmRlZiBLQkdfREVCVUcKKy8vI2RlZmluZSBLQkdfREVCVUcKKworI2lmZGVmIEtCR19ERUJVRworI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBLQkRfU1RBVF9LT0JGCQkweDAxCisjZGVmaW5lIEtCRF9TVEFUX0lCRgkJMHgwMgorI2RlZmluZSBLQkRfU1RBVF9TWVMJCTB4MDQKKyNkZWZpbmUgS0JEX1NUQVRfQ0QJCQkweDA4CisjZGVmaW5lIEtCRF9TVEFUX0xPQ0sJCTB4MTAKKyNkZWZpbmUgS0JEX1NUQVRfTU9CRgkJMHgyMAorI2RlZmluZSBLQkRfU1RBVF9USV9PVVQJMHg0MAorI2RlZmluZSBLQkRfU1RBVF9QQVJFUlIJMHg4MAorCisjZGVmaW5lIEtCRF9JTklUX1RJTUVPVVQgMjAwMAkJLyogVGltZW91dCBpbiBtcyBmb3IgaW5pdGlhbGl6aW5nIHRoZSBrZXlib2FyZCAqLworI2RlZmluZSBLQkNfVElNRU9VVCAyNTAJCQkvKiBUaW1lb3V0IGluIG1zIGZvciBzZW5kaW5nIHRvIGtleWJvYXJkIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgS0JEX1RJTUVPVVQgMjAwMAkJLyogVGltZW91dCBpbiBtcyBmb3Iga2V5Ym9hcmQgY29tbWFuZCBhY2tub3dsZWRnZSAqLworLyoKKyAqCUtleWJvYXJkIENvbnRyb2xsZXIgQ29tbWFuZHMKKyAqLworCisjZGVmaW5lIEtCRF9DQ01EX1JFQURfTU9ERQkJCTB4MjAJLyogUmVhZCBtb2RlIGJpdHMgKi8KKyNkZWZpbmUgS0JEX0NDTURfV1JJVEVfTU9ERQkJCTB4NjAJLyogV3JpdGUgbW9kZSBiaXRzICovCisjZGVmaW5lIEtCRF9DQ01EX0dFVF9WRVJTSU9OCQkweEExCS8qIEdldCBjb250cm9sbGVyIHZlcnNpb24gKi8KKyNkZWZpbmUgS0JEX0NDTURfTU9VU0VfRElTQUJMRQkweEE3CS8qIERpc2FibGUgbW91c2UgaW50ZXJmYWNlICovCisjZGVmaW5lIEtCRF9DQ01EX01PVVNFX0VOQUJMRQkJMHhBOAkvKiBFbmFibGUgbW91c2UgaW50ZXJmYWNlICovCisjZGVmaW5lIEtCRF9DQ01EX1RFU1RfTU9VU0UJCQkweEE5CS8qIE1vdXNlIGludGVyZmFjZSB0ZXN0ICovCisjZGVmaW5lIEtCRF9DQ01EX1NFTEZfVEVTVAkJCTB4QUEJLyogQ29udHJvbGxlciBzZWxmIHRlc3QgKi8KKyNkZWZpbmUgS0JEX0NDTURfS0JEX1RFU1QJCQkJMHhBQgkvKiBLZXlib2FyZCBpbnRlcmZhY2UgdGVzdCAqLworI2RlZmluZSBLQkRfQ0NNRF9LQkRfRElTQUJMRQkJMHhBRAkvKiBLZXlib2FyZCBpbnRlcmZhY2UgZGlzYWJsZSAqLworI2RlZmluZSBLQkRfQ0NNRF9LQkRfRU5BQkxFCQkJMHhBRQkvKiBLZXlib2FyZCBpbnRlcmZhY2UgZW5hYmxlICovCisjZGVmaW5lIEtCRF9DQ01EX1dSSVRFX0FVWF9PQlVGCTB4RDMgICAgLyogV3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciBhcyBpZgorCQkJCQkgICBpbml0aWF0ZWQgYnkgdGhlIGF1eGlsaWFyeSBkZXZpY2UgKi8KKyNkZWZpbmUgS0JEX0NDTURfV1JJVEVfTU9VU0UJCTB4RDQJLyogV3JpdGUgdGhlIGZvbGxvd2luZyBieXRlIHRvIHRoZSBtb3VzZSAqLworCisvKgorICoJS2V5Ym9hcmQgQ29tbWFuZHMKKyAqLworCisjZGVmaW5lIEtCRF9DTURfU0VUX0xFRFMJCQkJMHhFRAkvKiBTZXQga2V5Ym9hcmQgbGVkcyAqLworI2RlZmluZSBLQkRfQ01EX1NFVF9SQVRFCQkJCTB4RjMJLyogU2V0IHR5cGVtYXRpYyByYXRlICovCisjZGVmaW5lIEtCRF9DTURfRU5BQkxFCQkJCQkweEY0CS8qIEVuYWJsZSBzY2FubmluZyAqLworI2RlZmluZSBLQkRfQ01EX0RJU0FCTEUJCQkJCTB4RjUJLyogRGlzYWJsZSBzY2FubmluZyAqLworI2RlZmluZSBLQkRfQ01EX1JFU0VUCQkJCQkJMHhGRgkvKiBSZXNldCAqLworCisvKgorICoJS2V5Ym9hcmQgUmVwbGllcworICovCisKKyNkZWZpbmUgS0JEX1JFUExZX1BPUgkJCQkJCTB4QUEJLyogUG93ZXIgb24gcmVzZXQgKi8KKyNkZWZpbmUgS0JEX1JFUExZX0FDSwkJCQkJCTB4RkEJLyogQ29tbWFuZCBBQ0sgKi8KKyNkZWZpbmUgS0JEX1JFUExZX1JFU0VORAkJCQkweEZFCS8qIENvbW1hbmQgTkFDSywgc2VuZCB0aGUgY21kIGFnYWluICovCisKKy8qCisgKglTdGF0dXMgUmVnaXN0ZXIgQml0cworICovCisKKyNkZWZpbmUgS0JEX1NUQVRfT0JGIAkJCQkJCTB4MDEJLyogS2V5Ym9hcmQgb3V0cHV0IGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEtCRF9TVEFUX0lCRiAJCQkJCQkweDAyCS8qIEtleWJvYXJkIGlucHV0IGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEtCRF9TVEFUX1NFTEZURVNUCQkJCTB4MDQJLyogU2VsZiB0ZXN0IHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgS0JEX1NUQVRfQ01ECQkJCQkJMHgwOAkvKiBMYXN0IHdyaXRlIHdhcyBhIGNvbW1hbmQgd3JpdGUgKDA9ZGF0YSkgKi8KKyNkZWZpbmUgS0JEX1NUQVRfVU5MT0NLRUQJCQkJMHgxMAkvKiBaZXJvIGlmIGtleWJvYXJkIGxvY2tlZCAqLworI2RlZmluZSBLQkRfU1RBVF9NT1VTRV9PQkYJCQkweDIwCS8qIE1vdXNlIG91dHB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZSBLQkRfU1RBVF9HVE8gCQkJCQkJMHg0MAkvKiBHZW5lcmFsIHJlY2VpdmUveG1pdCB0aW1lb3V0ICovCisjZGVmaW5lIEtCRF9TVEFUX1BFUlIgCQkJCQkweDgwCS8qIFBhcml0eSBlcnJvciAqLworCisjZGVmaW5lIEFVWF9TVEFUX09CRiAoS0JEX1NUQVRfT0JGIHwgS0JEX1NUQVRfTU9VU0VfT0JGKQorCisvKgorICoJQ29udHJvbGxlciBNb2RlIFJlZ2lzdGVyIEJpdHMKKyAqLworCisjZGVmaW5lIEtCRF9NT0RFX0tCRF9JTlQJCQkJMHgwMQkvKiBLZXlib2FyZCBkYXRhIGdlbmVyYXRlIElSUTEgKi8KKyNkZWZpbmUgS0JEX01PREVfTU9VU0VfSU5UCQkJMHgwMgkvKiBNb3VzZSBkYXRhIGdlbmVyYXRlIElSUTEyICovCisjZGVmaW5lIEtCRF9NT0RFX1NZUyAJCQkJCQkweDA0CS8qIFRoZSBzeXN0ZW0gZmxhZyAoPykgKi8KKyNkZWZpbmUgS0JEX01PREVfTk9fS0VZTE9DSwkJCTB4MDgJLyogVGhlIGtleWxvY2sgZG9lc24ndCBhZmZlY3QgdGhlIGtleWJvYXJkIGlmIHNldCAqLworI2RlZmluZSBLQkRfTU9ERV9ESVNBQkxFX0tCRAkJMHgxMAkvKiBEaXNhYmxlIGtleWJvYXJkIGludGVyZmFjZSAqLworI2RlZmluZSBLQkRfTU9ERV9ESVNBQkxFX01PVVNFCTB4MjAJLyogRGlzYWJsZSBtb3VzZSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgS0JEX01PREVfS0NDIAkJCQkJCTB4NDAJLyogU2NhbiBjb2RlIGNvbnZlcnNpb24gdG8gUEMgZm9ybWF0ICovCisjZGVmaW5lIEtCRF9NT0RFX1JGVQkJCQkJCTB4ODAKKworCisjZGVmaW5lIEtEQl9EQVRBX1BPUlQJCQkweDYwCisjZGVmaW5lIEtEQl9DT01NQU5EX1BPUlQJMHg2NAorCisjZGVmaW5lIAlMRURfU0NSCQkweDAxCS8qIHNjcm9sbCBsb2NrIGxlZCAqLworI2RlZmluZSAJTEVEX0NBUAkJMHgwNAkvKiBjYXBzIGxvY2sgbGVkICovCisjZGVmaW5lIAlMRURfTlVNCQkweDAyCS8qIG51bSBsb2NrIGxlZCAqLworCisjZGVmaW5lIAlLQkRfQlVGRkVSX0xFTiAweDIwICAvKiBzaXplIG9mIHRoZSBrZXlib2FyZGJ1ZmZlciAqLworCisKKworCitzdGF0aWMgdm9sYXRpbGUgY2hhciBrYmRfYnVmZmVyW0tCRF9CVUZGRVJfTEVOXTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgaW5fcG9pbnRlciA9IDA7CitzdGF0aWMgdm9sYXRpbGUgaW50IG91dF9wb2ludGVyID0gMDsKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciBudW1fbG9jayA9IDA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBjYXBzX2xvY2sgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2Nyb2xsX2xvY2sgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hpZnQgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RybCA9IDA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBhbHQgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZTAgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVkcyA9IDA7CisKKyNkZWZpbmUgREVWTkFNRSAicHMya2JkIgorCisvKiBTaW1wbGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoZSBrZXlzICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9wbGFpbl94bGF0ZVtdID0geworCTB4ZmYsMHgxYiwgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzAnLCAnLScsICc9JywnXGInLCdcdCcsCS8qIDB4MDAgLSAweDBmICovCisJICdxJywgJ3cnLCAnZScsICdyJywgJ3QnLCAneScsICd1JywgJ2knLCAnbycsICdwJywgJ1snLCAnXScsJ1xyJywweGZmLCAnYScsICdzJywJLyogMHgxMCAtIDB4MWYgKi8KKwkgJ2QnLCAnZicsICdnJywgJ2gnLCAnaicsICdrJywgJ2wnLCAnOycsJ1wnJywgJ2AnLDB4ZmYsJ1xcJywgJ3onLCAneCcsICdjJywgJ3YnLAkvKiAweDIwIC0gMHgyZiAqLworCSAnYicsICduJywgJ20nLCAnLCcsICcuJywgJy8nLDB4ZmYsMHhmZiwweGZmLCAnICcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCS8qIDB4MzAgLSAweDNmICovCisJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwgJzcnLCAnOCcsICc5JywgJy0nLCAnNCcsICc1JywgJzYnLCAnKycsICcxJywJLyogMHg0MCAtIDB4NGYgKi8KKwkgJzInLCAnMycsICcwJywgJy4nLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLCAgLyogMHg1MCAtIDB4NUYgKi8KKwknXHInLDB4ZmYsMHhmZgorCX07CisJICAJICAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9zaGlmdF94bGF0ZVtdID0geworCTB4ZmYsMHgxYiwgJyEnLCAnQCcsICcjJywgJyQnLCAnJScsICdeJywgJyYnLCAnKicsICcoJywgJyknLCAnXycsICcrJywnXGInLCdcdCcsCS8qIDB4MDAgLSAweDBmICovCisJICdRJywgJ1cnLCAnRScsICdSJywgJ1QnLCAnWScsICdVJywgJ0knLCAnTycsICdQJywgJ3snLCAnfScsJ1xyJywweGZmLCAnQScsICdTJywJLyogMHgxMCAtIDB4MWYgKi8KKwkgJ0QnLCAnRicsICdHJywgJ0gnLCAnSicsICdLJywgJ0wnLCAnOicsICciJywgJ34nLDB4ZmYsICd8JywgJ1onLCAnWCcsICdDJywgJ1YnLAkvKiAweDIwIC0gMHgyZiAqLworCSAnQicsICdOJywgJ00nLCAnPCcsICc+JywgJz8nLDB4ZmYsMHhmZiwweGZmLCAnICcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCS8qIDB4MzAgLSAweDNmICovCisJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwgJzcnLCAnOCcsICc5JywgJy0nLCAnNCcsICc1JywgJzYnLCAnKycsICcxJywJLyogMHg0MCAtIDB4NGYgKi8KKwkgJzInLCAnMycsICcwJywgJy4nLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLCAgLyogMHg1MCAtIDB4NUYgKi8KKwknXHInLDB4ZmYsMHhmZgorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9jdHJsX3hsYXRlW10gPSB7CisJMHhmZiwweDFiLCAnMScsMHgwMCwgJzMnLCAnNCcsICc1JywweDFFLCAnNycsICc4JywgJzknLCAnMCcsMHgxRiwgJz0nLCdcYicsJ1x0JywJLyogMHgwMCAtIDB4MGYgKi8KKwkweDExLDB4MTcsMHgwNSwweDEyLDB4MTQsMHgxOCwweDE1LDB4MDksMHgwZiwweDEwLDB4MWIsMHgxZCwnXG4nLDB4ZmYsMHgwMSwweDEzLAkvKiAweDEwIC0gMHgxZiAqLworCTB4MDQsMHgwNiwweDA4LDB4MDksMHgwYSwweDBiLDB4MGMsICc7JywnXCcnLCAnficsMHgwMCwweDFjLDB4MWEsMHgxOCwweDAzLDB4MTYsCS8qIDB4MjAgLSAweDJmICovCisJMHgwMiwweDBlLDB4MGQsICc8JywgJz4nLCAnPycsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwJLyogMHgzMCAtIDB4M2YgKi8KKwkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLCAnNycsICc4JywgJzknLCAnLScsICc0JywgJzUnLCAnNicsICcrJywgJzEnLAkvKiAweDQwIC0gMHg0ZiAqLworCSAnMicsICczJywgJzAnLCAnLicsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsICAvKiAweDUwIC0gMHg1RiAqLworCSdccicsMHhmZiwweGZmCisJfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdCAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBpc2Ffa2JkX2luaXQodm9pZCkKK3sKKwljaGFyKiByZXN1bHQ7CisJcmVzdWx0PWtiZF9pbml0aWFsaXplKCk7CisJaWYgKHJlc3VsdCAhPSBOVUxMKQorCXsKKwkgICAgcmVzdWx0ID0ga2JkX2luaXRpYWxpemUoKTsKKwl9CisJaWYocmVzdWx0PT1OVUxMKSB7CisJCXByaW50ZigiQVQgS2V5Ym9hcmQgaW5pdGlhbGl6ZWRcbiIpOworCQlpcnFfaW5zdGFsbF9oYW5kbGVyKEtCRF9JTlRFUlJVUFQsIChpbnRlcnJ1cHRfaGFuZGxlcl90ICopa2JkX2ludGVycnVwdCwgTlVMTCk7CisJCXJldHVybiAoMSk7CisJfQorCWVsc2UgeworCQlwcmludGYoIiVzXG4iLHJlc3VsdCk7CisJCXJldHVybiAoLTEpOworCX0KK30KKworI2lmZGVmIENGR19DT05TT0xFX09WRVJXUklURV9ST1VUSU5FCitleHRlcm4gaW50IG92ZXJ3cml0ZV9jb25zb2xlICh2b2lkKTsKKyNlbHNlCitpbnQgb3ZlcndyaXRlX2NvbnNvbGUgKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCitpbnQgZHJ2X2lzYV9rYmRfaW5pdCAodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisgIAlkZXZpY2VfdCBrYmRkZXYgOworCWNoYXIgKnN0ZGlubmFtZSAgPSBnZXRlbnYgKCJzdGRpbiIpOworCisJaWYoaXNhX2tiZF9pbml0KCk9PS0xKQorCQlyZXR1cm4gLTE7CisgIAltZW1zZXQgKCZrYmRkZXYsIDAsIHNpemVvZihrYmRkZXYpKTsKKyAgCXN0cmNweShrYmRkZXYubmFtZSwgREVWTkFNRSk7CisgIAlrYmRkZXYuZmxhZ3MgPSAgREVWX0ZMQUdTX0lOUFVUIHwgREVWX0ZMQUdTX1NZU1RFTTsKKyAgCWtiZGRldi5wdXRjID0gTlVMTCA7CisJa2JkZGV2LnB1dHMgPSBOVUxMIDsKKwlrYmRkZXYuZ2V0YyA9IGtiZF9nZXRjIDsKKwlrYmRkZXYudHN0YyA9IGtiZF90ZXN0YyA7CisKKyAJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIgKCZrYmRkZXYpOworCWlmKGVycm9yPT0wKSB7CisJCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIHN0YW5kYXJkIGlucHV0IGRldmljZSAqLworCQlpZihzdHJjbXAoc3RkaW5uYW1lLERFVk5BTUUpPT0wKSB7CisJCQkvKiByZWFzc2lnbiB0aGUgY29uc29sZSAqLworCQkJaWYob3ZlcndyaXRlX2NvbnNvbGUoKSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQkJZXJyb3I9Y29uc29sZV9hc3NpZ24oc3RkaW4sREVWTkFNRSk7CisJCQlpZihlcnJvcj09MCkKKwkJCQlyZXR1cm4gMTsKKwkJCWVsc2UgCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFF1ZXVlIGhhbmRsaW5nIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHB1dHMgY2hhcmFjdGVyIGluIHRoZSBxdWV1ZSBhbmQgc2V0cyB1cCB0aGUgaW4gYW5kIG91dCBwb2ludGVyICovCit2b2lkIGtiZF9wdXRfcXVldWUoY2hhciBkYXRhKQoreworCWlmKChpbl9wb2ludGVyKzEpPT1LQkRfQlVGRkVSX0xFTikgeworCQlpZihvdXRfcG9pbnRlcj09MCkgeworCQkJcmV0dXJuOyAvKiBidWZmZXIgZnVsbCAqLworCQl9IGVsc2V7CisJCQlpbl9wb2ludGVyPTA7CisJCX0KKwl9IGVsc2UgeworCQlpZigoaW5fcG9pbnRlcisxKT09b3V0X3BvaW50ZXIpCisJCQlyZXR1cm47IC8qIGJ1ZmZlciBmdWxsICovCisJCWluX3BvaW50ZXIrKzsKKwl9CisJa2JkX2J1ZmZlcltpbl9wb2ludGVyXT1kYXRhOworCXJldHVybjsKK30KKworLyogdGVzdCBpZiBhIGNoYXJhY3RlciBpcyBpbiB0aGUgcXVldWUgKi8KK2ludCBrYmRfdGVzdGModm9pZCkKK3sKKwlpZihpbl9wb2ludGVyPT1vdXRfcG9pbnRlcikKKwkJcmV0dXJuKDApOyAvKiBubyBkYXRhICovCisJZWxzZQorCQlyZXR1cm4oMSk7CQorfQorLyogZ2V0cyB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHF1ZXVlICovCitpbnQga2JkX2dldGModm9pZCkKK3sKKwljaGFyIGM7CisKKwl3aGlsZShpbl9wb2ludGVyPT1vdXRfcG9pbnRlcik7CisJaWYoKG91dF9wb2ludGVyKzEpPT1LQkRfQlVGRkVSX0xFTikgCisJCW91dF9wb2ludGVyPTA7CisJZWxzZQorCQlvdXRfcG9pbnRlcisrOworCWM9a2JkX2J1ZmZlcltvdXRfcG9pbnRlcl07CisJcmV0dXJuIChpbnQpYzsKKwkKK30KKworCisvKiBzZXQgTEVEcyAqLworCit2b2lkIGtiZF9zZXRfbGVkcyh2b2lkKQoreworCWlmKGNhcHNfbG9jaz09MCkKKwkJbGVkcyY9fkxFRF9DQVA7IC8qIHN3aXRjaCBjYXBzX2xvY2sgb2ZmICovCisJZWxzZQorCQlsZWRzfD1MRURfQ0FQOyAvKiBzd2l0Y2ggb24gTEVEICovCisJaWYobnVtX2xvY2s9PTApCisJCWxlZHMmPX5MRURfTlVNOyAvKiBzd2l0Y2ggTEVEIG9mZiAqLworCWVsc2UKKwkJbGVkc3w9TEVEX05VTTsgIC8qIHN3aXRjaCBvbiBMRUQgKi8KKwlpZihzY3JvbGxfbG9jaz09MCkKKwkJbGVkcyY9fkxFRF9TQ1I7IC8qIHN3aXRjaCBMRUQgb2ZmICovCisJZWxzZQorCQlsZWRzfD1MRURfU0NSOyAvKiBzd2l0Y2ggb24gTEVEICovCisJa2JkX3NlbmRfZGF0YShLQkRfQ01EX1NFVF9MRURTKTsKKwlrYmRfc2VuZF9kYXRhKGxlZHMpOworfQorCQorCit2b2lkIGhhbmRsZV9rZXlib2FyZF9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKQoreworCXVuc2lnbmVkIGNoYXIga2V5Y29kZTsKKworCS8qICBDb252ZXJ0IHNjYW5jb2RlIHRvIGtleWNvZGUgKi8KKwlQUklOVEYoInNjYW5jb2RlICV4XG4iLHNjYW5jb2RlKTsKKwlpZihzY2FuY29kZT09MHhlMCkgeworCQllMD0xOyAvKiBzcGVjaWFsIGNoYXJha3RlcnMgKi8KKwkJcmV0dXJuOworCX0KKwlpZihlMD09MSkgeworCQllMD0wOyAvKiBkZWxldGUgZmxhZyAqLworCQlpZighKAkoKHNjYW5jb2RlJjB4N0YpPT0weDM4KXx8IC8qIHRoZSByaWdodCBjdHJsIGtleSAqLworCQkJKChzY2FuY29kZSYweDdGKT09MHgxRCl8fCAvKiB0aGUgcmlnaHQgYWx0IGtleSAqLworCQkJKChzY2FuY29kZSYweDdGKT09MHgzNSl8fAkvKiB0aGUgcmlnaHQgJy8nIGtleSAqLworCQkJKChzY2FuY29kZSYweDdGKT09MHgxQyl8fCAgLyogdGhlIHJpZ2h0IGVudGVyIGtleSAqLworCQkJKChzY2FuY29kZSk9PTB4NDgpfHwgLyogYXJyb3cgdXAgKi8KKwkJCSgoc2NhbmNvZGUpPT0weDUwKXx8IC8qIGFycm93IGRvd24gKi8KKwkJCSgoc2NhbmNvZGUpPT0weDRiKXx8IC8qIGFycm93IGxlZnQgKi8KKwkJCSgoc2NhbmNvZGUpPT0weDRkKSkpICAvKiBhcnJvdyByaWdodCAqLworCQkJLyogd2Ugc3dhbGxvdyB1bmtub3duIGUwIGNvZGVzICovCisJCQlyZXR1cm47CisJfQorCS8qIHNwZWNpYWwgY250cmwga2V5cyAqLworCXN3aXRjaChzY2FuY29kZSkKKwl7CisJY2FzZSAweDQ4OgorCSAgICBrYmRfcHV0X3F1ZXVlKDI3KTsKKwkgICAga2JkX3B1dF9xdWV1ZSg5MSk7CisJICAgIGtiZF9wdXRfcXVldWUoJ0EnKTsKKwkgICAgcmV0dXJuOworCWNhc2UgMHg1MDoKKwkgICAga2JkX3B1dF9xdWV1ZSgyNyk7CisJICAgIGtiZF9wdXRfcXVldWUoOTEpOworCSAgICBrYmRfcHV0X3F1ZXVlKCdCJyk7CisJICAgIHJldHVybjsKKwljYXNlIDB4NGI6CisJICAgIGtiZF9wdXRfcXVldWUoMjcpOworCSAgICBrYmRfcHV0X3F1ZXVlKDkxKTsKKwkgICAga2JkX3B1dF9xdWV1ZSgnRCcpOworCSAgICByZXR1cm47CisJY2FzZSAweDREOgorCSAgICBrYmRfcHV0X3F1ZXVlKDI3KTsKKwkgICAga2JkX3B1dF9xdWV1ZSg5MSk7CisJICAgIGtiZF9wdXRfcXVldWUoJ0MnKTsKKwkgICAgcmV0dXJuOworCWNhc2UgMHg1ODogLyogRjEyIGtleSAqLworCSAgICBpZiAoY3RybCA9PSAxKQorCSAgICB7CisJCWV4dGVybiBpbnQgY29uc29sZV9jaGFuZ2VkOworCQlzZXRlbnYoInN0ZGluIiwgREVWTkFNRSk7CisJCXNldGVudigic3Rkb3V0IiwgInZnYSIpOworCQljb25zb2xlX2NoYW5nZWQgPSAxOworCSAgICB9CisJICAgIHJldHVybjsKKwljYXNlIDB4MkE6IAorCQljYXNlIDB4MzY6IC8qIHNoaWZ0IHByZXNzZWQgKi8KKwkJCXNoaWZ0PTE7CisJCQlyZXR1cm47IC8qIGRvIG5vdGhpbmcgZWxzZSAqLworCQljYXNlIDB4QUE6IAorCQljYXNlIDB4QjY6IC8qIHNoaWZ0IHJlbGVhc2VkICovCisJCQlzaGlmdD0wOworCQkJcmV0dXJuOyAvKiBkbyBub3RoaW5nIGVsc2UgKi8KKwkJY2FzZSAweDM4OiAvKiBhbHQgcHJlc3NlZCAqLworCQkJYWx0PTE7CisJCQlyZXR1cm47IC8qIGRvIG5vdGhpbmcgZWxzZSAqLworCQljYXNlIDB4Qjg6IC8qIGFsdCByZWxlYXNlZCAqLworCQkJYWx0PTA7CisJCQlyZXR1cm47IC8qIGRvIG5vdGhpbmcgZWxzZSAqLworCQljYXNlIDB4MWQ6IC8qIGN0cmwgcHJlc3NlZCAqLworCQkJY3RybD0xOworCQkJcmV0dXJuOyAvKiBkbyBub3RoaW5nIGVsc2UgKi8KKwkJY2FzZSAweDlkOiAvKiBjdHJsIHJlbGVhc2VkICovCisJCQljdHJsPTA7CisJCQlyZXR1cm47IC8qIGRvIG5vdGhpbmcgZWxzZSAqLworCQljYXNlIDB4NDY6IC8qIHNjcm9sbG9jayBwcmVzc2VkICovCisJCQlzY3JvbGxfbG9jaz1+c2Nyb2xsX2xvY2s7CisJCQlrYmRfc2V0X2xlZHMoKTsKKwkJCXJldHVybjsgLyogZG8gbm90aGluZyBlbHNlICovCisJCWNhc2UgMHgzQTogLyogY2Fwc2xvY2sgcHJlc3NlZCAqLworCQkJY2Fwc19sb2NrPX5jYXBzX2xvY2s7CisJCQlrYmRfc2V0X2xlZHMoKTsKKwkJCXJldHVybjsgCisJCWNhc2UgMHg0NTogLyogbnVtbG9jayBwcmVzc2VkICovCisJCQludW1fbG9jaz1+bnVtX2xvY2s7CisJCQlrYmRfc2V0X2xlZHMoKTsKKwkJCXJldHVybjsgCisJCWNhc2UgMHhDNjogLyogc2Nyb2xsIGxvY2sgcmVsZWFzZWQgKi8KKwkJY2FzZSAweEM1OiAvKiBudW0gbG9jayByZWxlYXNlZCAqLworCQljYXNlIDB4QkE6IC8qIGNhcHMgbG9jayByZWxlYXNlZCAqLworCQkJcmV0dXJuOyAvKiBqdXN0IHN3YWxsb3cgKi8gCisJfQorCWlmKChzY2FuY29kZSYweDgwKT09MHg4MCkgLyoga2V5IHJlbGVhc2VkICovCisJCXJldHVybjsKKwkvKiBub3csIGRlY2lkZSB3aGljaCB0YWJsZSB3ZSBuZWVkICovCisJaWYoc2NhbmNvZGUgPiAoc2l6ZW9mKGtiZF9wbGFpbl94bGF0ZSkvc2l6ZW9mKGtiZF9wbGFpbl94bGF0ZVswXSkpKSB7IC8qIHNjYW5jb2RlIG5vdCBpbiBsaXN0ICovCisJCVBSSU5URigidW5rb3duIHNjYW5jb2RlICVYXG4iLHNjYW5jb2RlKTsKKwkJcmV0dXJuOyAvKiBzd2FsbG93IGl0ICovCisJfQorCS8qIHNldHVwIHBsYWluIGNvZGUgZmlyc3QgKi8KKwlrZXljb2RlPWtiZF9wbGFpbl94bGF0ZVtzY2FuY29kZV07CisJaWYoY2Fwc19sb2NrPT0xKSB7IC8qIGNhcHNfbG9jayBpcyBwcmVzc2VkLCBvdmVyd3JpdGUgcGxhaW4gY29kZSAqLworCQlpZihzY2FuY29kZSA+IChzaXplb2Yoa2JkX3NoaWZ0X3hsYXRlKS9zaXplb2Yoa2JkX3NoaWZ0X3hsYXRlWzBdKSkpIHsgLyogc2NhbmNvZGUgbm90IGluIGxpc3QgKi8KKwkJCVBSSU5URigidW5rb3duIGNhcHMtbG9ja2VkIHNjYW5jb2RlICVYXG4iLHNjYW5jb2RlKTsKKwkJCXJldHVybjsgLyogc3dhbGxvdyBpdCAqLworCQl9CisJCWtleWNvZGU9a2JkX3NoaWZ0X3hsYXRlW3NjYW5jb2RlXTsKKwkJaWYoa2V5Y29kZTwnQScpIHsgLyogd2Ugb25seSB3YW50IHRoZSBhbHBoYXMgY2FwaXRhbCAqLworCQkJa2V5Y29kZT1rYmRfcGxhaW5feGxhdGVbc2NhbmNvZGVdOworCQl9CisJfQorCWlmKHNoaWZ0PT0xKSB7IC8qIHNoaWZ0IG92ZXJ3cml0ZXMgY2Fwc19sb2NrICovCisJCWlmKHNjYW5jb2RlID4gKHNpemVvZihrYmRfc2hpZnRfeGxhdGUpL3NpemVvZihrYmRfc2hpZnRfeGxhdGVbMF0pKSkgeyAvKiBzY2FuY29kZSBub3QgaW4gbGlzdCAqLworCQkJUFJJTlRGKCJ1bmtvd24gc2hpZnRlZCBzY2FuY29kZSAlWFxuIixzY2FuY29kZSk7CisJCQlyZXR1cm47IC8qIHN3YWxsb3cgaXQgKi8KKwkJfQorCQlrZXljb2RlPWtiZF9zaGlmdF94bGF0ZVtzY2FuY29kZV07CisJfQorCWlmKGN0cmw9PTEpIHsgLyogY3RybCBvdmVyd3JpdGVzIGNhcHNfbG9jayBhbmQgc2hpZnQgKi8KKwkJaWYoc2NhbmNvZGUgPiAoc2l6ZW9mKGtiZF9jdHJsX3hsYXRlKS9zaXplb2Yoa2JkX2N0cmxfeGxhdGVbMF0pKSkgeyAvKiBzY2FuY29kZSBub3QgaW4gbGlzdCAqLworCQkJUFJJTlRGKCJ1bmtvd24gY3RybCBzY2FuY29kZSAlWFxuIixzY2FuY29kZSk7CisJCQlyZXR1cm47IC8qIHN3YWxsb3cgaXQgKi8KKwkJfQorCQlrZXljb2RlPWtiZF9jdHJsX3hsYXRlW3NjYW5jb2RlXTsKKwl9CisJLyogY2hlY2sgaWYgdmFsaWQga2V5Y29kZSAqLworCWlmKGtleWNvZGU9PTB4ZmYpIHsKKwkJUFJJTlRGKCJ1bmtvd24gc2NhbmNvZGUgJVhcbiIsc2NhbmNvZGUpOworCQlyZXR1cm47IC8qIHN3YWxsb3cgdW5rbm93biBjb2RlcyAqLworCX0KKwkKKwlrYmRfcHV0X3F1ZXVlKGtleWNvZGUpOworCVBSSU5URigiJXhcbiIsa2V5Y29kZSk7Cit9CisKKy8qCisgKiBUaGlzIHJlYWRzIHRoZSBrZXlib2FyZCBzdGF0dXMgcG9ydCwgYW5kIGRvZXMgdGhlCisgKiBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKgorICovCit1bnNpZ25lZCBjaGFyIGhhbmRsZV9rYmRfZXZlbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IGtiZF9yZWFkX3N0YXR1cygpOworCXVuc2lnbmVkIGludCB3b3JrID0gMTAwMDA7CisKKwl3aGlsZSAoKC0td29yayA+IDApICYmIChzdGF0dXMgJiBLQkRfU1RBVF9PQkYpKSB7CisJCXVuc2lnbmVkIGNoYXIgc2NhbmNvZGU7CisKKwkJc2NhbmNvZGUgPSBrYmRfcmVhZF9pbnB1dCgpOworCisJCS8qIEVycm9yIGJ5dGVzIG11c3QgYmUgaWdub3JlZCB0byBtYWtlIHRoZQorCQkgICBTeW5hcHRpY3MgdG91Y2hwYWRzIGNvbXBhcSB1c2Ugd29yayAqLworCQkvKiBJZ25vcmUgZXJyb3IgYnl0ZXMgKi8KKwkJaWYgKCEoc3RhdHVzICYgKEtCRF9TVEFUX0dUTyB8IEtCRF9TVEFUX1BFUlIpKSkKKwkJeworCQkJaWYgKHN0YXR1cyAmIEtCRF9TVEFUX01PVVNFX09CRikKKwkJCQk7IC8qIG5vdCBzdXBwb3J0ZWQ6IGhhbmRsZV9tb3VzZV9ldmVudChzY2FuY29kZSk7ICovCisJCQllbHNlCisJCQkJaGFuZGxlX2tleWJvYXJkX2V2ZW50KHNjYW5jb2RlKTsKKwkJfQorCQlzdGF0dXMgPSBrYmRfcmVhZF9zdGF0dXMoKTsKKwl9CisJaWYgKCF3b3JrKQorCQlQUklOVEYoInBjX2tleWI6IGNvbnRyb2xsZXIgamFtbWVkICgweCUwMlgpLlxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93bGV2ZWwgUGFydCBvZiBrZXlib2FyZCBzZWN0aW9uCisgKi8gIAordW5zaWduZWQgY2hhciBrYmRfcmVhZF9zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4oaW44KENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgS0RCX0NPTU1BTkRfUE9SVCkpOworfSAKKyAgCit1bnNpZ25lZCBjaGFyIGtiZF9yZWFkX2lucHV0KHZvaWQpCit7CisJcmV0dXJuKGluOChDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyArIEtEQl9EQVRBX1BPUlQpKTsKK30gCisKK3ZvaWQga2JkX3dyaXRlX2NvbW1hbmQodW5zaWduZWQgY2hhciBjbWQpCit7CisJb3V0OChDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyArIEtEQl9DT01NQU5EX1BPUlQsY21kKTsKK30gCisgIAordm9pZCBrYmRfd3JpdGVfb3V0cHV0KHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXQ4KENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgS0RCX0RBVEFfUE9SVCwgZGF0YSk7Cit9IAorIAoraW50IGtiZF9yZWFkX2RhdGEodm9pZCkKK3sKKwlpbnQgdmFsOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJdmFsPS0xOworCXN0YXR1cyA9IGtiZF9yZWFkX3N0YXR1cygpOworCWlmIChzdGF0dXMgJiBLQkRfU1RBVF9PQkYpIHsKKwkJdmFsID0ga2JkX3JlYWRfaW5wdXQoKTsKKwkJaWYgKHN0YXR1cyAmIChLQkRfU1RBVF9HVE8gfCBLQkRfU1RBVF9QRVJSKSkKKwkJCXZhbCA9IC0yOworCX0KKwlyZXR1cm4gdmFsOworfQorCitpbnQga2JkX3dhaXRfZm9yX2lucHV0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB2YWw7CisJCisJdGltZW91dCA9IEtCRF9USU1FT1VUOworCXZhbD1rYmRfcmVhZF9kYXRhKCk7CisJd2hpbGUodmFsIDwgMCkKKwl7CisJCWlmKHRpbWVvdXQtLT09MCkKKwkJCXJldHVybiAtMTsKKwkJdWRlbGF5KDEwMDApOworCQl2YWw9a2JkX3JlYWRfZGF0YSgpOworCX0KKwlyZXR1cm4gdmFsOworfQorCisKK2ludCBrYl93YWl0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gS0JDX1RJTUVPVVQgKiAxMDsKKworCWRvIHsKKwkJdW5zaWduZWQgY2hhciBzdGF0dXMgPSBoYW5kbGVfa2JkX2V2ZW50KCk7CisJCWlmICghKHN0YXR1cyAmIEtCRF9TVEFUX0lCRikpCisJCQlyZXR1cm4gMDsgLyogb2sgKi8KKwkJdWRlbGF5KDEwMDApOworCQl0aW1lb3V0LS07CisJfSB3aGlsZSAodGltZW91dCk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQga2JkX3dyaXRlX2NvbW1hbmRfdyhpbnQgZGF0YSkKK3sKKwlpZihrYl93YWl0KCkpCisJCVBSSU5URigidGltZW91dCBpbiBrYmRfd3JpdGVfY29tbWFuZF93XG4iKTsKKwlrYmRfd3JpdGVfY29tbWFuZChkYXRhKTsKK30KKwordm9pZCBrYmRfd3JpdGVfb3V0cHV0X3coaW50IGRhdGEpCit7CisJaWYoa2Jfd2FpdCgpKQorCQlQUklOVEYoInRpbWVvdXQgaW4ga2JkX3dyaXRlX291dHB1dF93XG4iKTsKKwlrYmRfd3JpdGVfb3V0cHV0KGRhdGEpOworfQorCit2b2lkIGtiZF9zZW5kX2RhdGEodW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWk4MjU5X21hc2tfaXJxKEtCRF9JTlRFUlJVUFQpOyAvKiBkaXNhYmxlIGludGVycnVwdCAqLworCWtiZF93cml0ZV9vdXRwdXRfdyhkYXRhKTsKKwlzdGF0dXMgPSBrYmRfd2FpdF9mb3JfaW5wdXQoKTsKKwlpZiAoc3RhdHVzID09IEtCRF9SRVBMWV9BQ0spCisJCWk4MjU5X3VubWFza19pcnEoS0JEX0lOVEVSUlVQVCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KK30KKworCitjaGFyICoga2JkX2luaXRpYWxpemUodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJaW5fcG9pbnRlciA9IDA7IC8qIGRlbGV0ZSBpbiBCdWZmZXIgKi8KKwlvdXRfcG9pbnRlciA9IDA7CisJLyoKKwkgKiBUZXN0IHRoZSBrZXlib2FyZCBpbnRlcmZhY2UuCisJICogVGhpcyBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZ2V0IGl0IGdvaW5nLgorCSAqIElmIHRoZSB0ZXN0IGlzIHN1Y2Nlc3NmdWwgYSB4NTUgaXMgcGxhY2VkIGluIHRoZSBpbnB1dCBidWZmZXIuCisJICovCisJa2JkX3dyaXRlX2NvbW1hbmRfdyhLQkRfQ0NNRF9TRUxGX1RFU1QpOworCWlmIChrYmRfd2FpdF9mb3JfaW5wdXQoKSAhPSAweDU1KSAKKwkJcmV0dXJuICJLYmQ6ICAgZmFpbGVkIHNlbGYgdGVzdCI7CisJLyoKKwkgKiBQZXJmb3JtIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHRlc3QuICBUaGlzIGNhdXNlcyB0aGUgY29udHJvbGxlcgorCSAqIHRvIHRlc3QgdGhlIGtleWJvYXJkIGNsb2NrIGFuZCBkYXRhIGxpbmVzLiAgVGhlIHJlc3VsdHMgb2YgdGhlCisJICogdGVzdCBhcmUgcGxhY2VkIGluIHRoZSBpbnB1dCBidWZmZXIuCisJICovCisJa2JkX3dyaXRlX2NvbW1hbmRfdyhLQkRfQ0NNRF9LQkRfVEVTVCk7CisJaWYgKGtiZF93YWl0X2Zvcl9pbnB1dCgpICE9IDB4MDApIAorCQlyZXR1cm4gIktiZDogICBpbnRlcmZhY2UgZmFpbGVkIHNlbGYgdGVzdCI7CisJLyoKKwkgKiBFbmFibGUgdGhlIGtleWJvYXJkIGJ5IGFsbG93aW5nIHRoZSBrZXlib2FyZCBjbG9jayB0byBydW4uCisJICovCisJa2JkX3dyaXRlX2NvbW1hbmRfdyhLQkRfQ0NNRF9LQkRfRU5BQkxFKTsKKwlzdGF0dXMgPSBrYmRfd2FpdF9mb3JfaW5wdXQoKTsKKwkvKgorCSAqIFJlc2V0IGtleWJvYXJkLiBJZiB0aGUgcmVhZCB0aW1lcyBvdXQKKwkgKiB0aGVuIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgbm8ga2V5Ym9hcmQgaXMKKwkgKiBwbHVnZ2VkIGludG8gdGhlIG1hY2hpbmUuCisJICogVGhpcyBkZWZhdWx0cyB0aGUga2V5Ym9hcmQgdG8gc2Nhbi1jb2RlIHNldCAyLgorCSAqCisJICogU2V0IHVwIHRvIHRyeSBhZ2FpbiBpZiB0aGUga2V5Ym9hcmQgYXNrcyBmb3IgUkVTRU5ELgorCSAqLworCWRvIHsKKwkJa2JkX3dyaXRlX291dHB1dF93KEtCRF9DTURfUkVTRVQpOworCQlzdGF0dXMgPSBrYmRfd2FpdF9mb3JfaW5wdXQoKTsKKwkJaWYgKHN0YXR1cyA9PSBLQkRfUkVQTFlfQUNLKSAKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICE9IEtCRF9SRVBMWV9SRVNFTkQpCisJCXsKKwkJCVBSSU5URigic3RhdHVzOiAlWFxuIixzdGF0dXMpOworCQkJcmV0dXJuICJLYmQ6ICAgcmVzZXQgZmFpbGVkLCBubyBBQ0siOworCQl9CisJfSB3aGlsZSAoMSk7CisJaWYgKGtiZF93YWl0X2Zvcl9pbnB1dCgpICE9IEtCRF9SRVBMWV9QT1IpCisJCXJldHVybiAiS2JkOiAgIHJlc2V0IGZhaWxlZCwgbm8gUE9SIjsKKworCS8qCisJICogU2V0IGtleWJvYXJkIGNvbnRyb2xsZXIgbW9kZS4gRHVyaW5nIHRoaXMsIHRoZSBrZXlib2FyZCBzaG91bGQgYmUKKwkgKiBpbiB0aGUgZGlzYWJsZWQgc3RhdGUuCisJICoKKwkgKiBTZXQgdXAgdG8gdHJ5IGFnYWluIGlmIHRoZSBrZXlib2FyZCBhc2tzIGZvciBSRVNFTkQuCisJICovCisJZG8geworCQlrYmRfd3JpdGVfb3V0cHV0X3coS0JEX0NNRF9ESVNBQkxFKTsKKwkJc3RhdHVzID0ga2JkX3dhaXRfZm9yX2lucHV0KCk7CisJCWlmIChzdGF0dXMgPT0gS0JEX1JFUExZX0FDSykKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICE9IEtCRF9SRVBMWV9SRVNFTkQpCisJCQlyZXR1cm4gIktiZDogICBkaXNhYmxlIGtleWJvYXJkOiBubyBBQ0siOworCX0gd2hpbGUgKDEpOworCisJa2JkX3dyaXRlX2NvbW1hbmRfdyhLQkRfQ0NNRF9XUklURV9NT0RFKTsKKwlrYmRfd3JpdGVfb3V0cHV0X3coS0JEX01PREVfS0JEX0lOVAorCQkJICAgICAgfCBLQkRfTU9ERV9TWVMKKwkJCSAgICAgIHwgS0JEX01PREVfRElTQUJMRV9NT1VTRQorCQkJICAgICAgfCBLQkRfTU9ERV9LQ0MpOworCisJLyogaWJtIHBvd2VycGMgcG9ydGFibGVzIG5lZWQgdGhpcyB0byB1c2Ugc2Nhbi1jb2RlIHNldCAxIC0tIENvcnQgKi8KKwlrYmRfd3JpdGVfY29tbWFuZF93KEtCRF9DQ01EX1JFQURfTU9ERSk7CisJaWYgKCEoa2JkX3dhaXRfZm9yX2lucHV0KCkgJiBLQkRfTU9ERV9LQ0MpKSB7CisJCS8qCisJCSAqIElmIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgY29udmVyc2lvbiwKKwkJICogU2V0IHRoZSBrZXlib2FyZCB0byBzY2FuLWNvZGUgc2V0IDEuCisJCSAqLworCQlrYmRfd3JpdGVfb3V0cHV0X3coMHhGMCk7CisJCWtiZF93YWl0X2Zvcl9pbnB1dCgpOworCQlrYmRfd3JpdGVfb3V0cHV0X3coMHgwMSk7CisJCWtiZF93YWl0X2Zvcl9pbnB1dCgpOworCX0KKwlrYmRfd3JpdGVfb3V0cHV0X3coS0JEX0NNRF9FTkFCTEUpOworCWlmIChrYmRfd2FpdF9mb3JfaW5wdXQoKSAhPSBLQkRfUkVQTFlfQUNLKQorCQlyZXR1cm4gIktiZDogICBlbmFibGUga2V5Ym9hcmQ6IG5vIEFDSyI7CisKKwkvKgorCSAqIEZpbmFsbHksIHNldCB0aGUgdHlwZW1hdGljIHJhdGUgdG8gbWF4aW11bS4KKwkgKi8KKwlrYmRfd3JpdGVfb3V0cHV0X3coS0JEX0NNRF9TRVRfUkFURSk7CisJaWYgKGtiZF93YWl0X2Zvcl9pbnB1dCgpICE9IEtCRF9SRVBMWV9BQ0spCisJCXJldHVybiAiS2JkOiAgIFNldCByYXRlOiBubyBBQ0siOworCWtiZF93cml0ZV9vdXRwdXRfdygweDAwKTsKKwlpZiAoa2JkX3dhaXRfZm9yX2lucHV0KCkgIT0gS0JEX1JFUExZX0FDSykKKwkJcmV0dXJuICJLYmQ6ICAgU2V0IHJhdGU6IG5vIEFDSyI7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQga2JkX2ludGVycnVwdCh2b2lkKQoreworCWhhbmRsZV9rYmRfZXZlbnQoKTsKK30KKworCisKKy8qIGVvZiAqLworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3BzMmtiZC5oIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9wczJrYmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZjMTRkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9wczJrYmQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBKb2huIFcuIExpbnZpbGxlLCBsaW52aWxsZUB0dXhkcml2ZXIuY29tCisgKiAKKyAqIE1vZGlmaWVkIGZyb20gY29kZSBmb3Igc3VwcG9ydCBvZiBNSVA0MDUgYW5kIFBJUDQwNSBib2FyZHMuICBQcmV2aW91cworICogY29weXJpZ2h0IGZvbGxvd3MuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9LQkRfSF8KKyNkZWZpbmUgX0tCRF9IXworICAgCitleHRlcm4gaW50IGtiZF90ZXN0Yyh2b2lkKTsKK2V4dGVybiBpbnQga2JkX2dldGModm9pZCk7CitleHRlcm4gdm9pZCBrYmRfaW50ZXJydXB0KHZvaWQpOworZXh0ZXJuIGNoYXIgKmtiZF9pbml0aWFsaXplKHZvaWQpOworCit1bnNpZ25lZCBjaGFyIGtiZF9pc19pbml0KHZvaWQpOworI2RlZmluZSBLQkRfSU5URVJSVVBUIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zZXJpYWwuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0Uvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZmI0NgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0Uvc2VyaWFsLmMKQEAgLTAsMCArMSwyNDcgQEAKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxuczE2NTUwLmg+CisjaW5jbHVkZSAic2hvcnRfdHlwZXMuaCIKKyNpbmNsdWRlICJtZW1pby5oIgorI2luY2x1ZGUgImFydGljaWFTLmgiCisKKyNpZm5kZWYgQ0ZHX05TMTY1NTAKK3N0YXRpYyB1aW50MzIgQ29tUG9ydDE7CisKK3VpbnQxNiBTZXJpYWxFY2hvID0gMTsKKworCisjZGVmaW5lIFJFQ0VJVkVSX0hPTERJTkcgMAorI2RlZmluZSBUUkFOU01JVFRFUl9IT0xESU5HIDAKKyNkZWZpbmUgSU5URVJSVVBUX0VOQUJMRSAxCisjZGVmaW5lIElOVEVSUlVQVF9TVEFUVVMgMgorI2RlZmluZSBGSUZPX0NPTlRST0wgMgorI2RlZmluZSBMSU5FX0NPTlRST0wgMworI2RlZmluZSBNT0RFTV9DT05UUk9MIDQKKyNkZWZpbmUgTElORV9TVEFUVVMgNQorI2RlZmluZSBNT0RFTV9TVEFUVVMgNgorI2RlZmluZSBTQ1JBVENIX1BBRCA3CisKKyNkZWZpbmUgRElWSVNPUl9MQVRDSF9MU0IgMAorI2RlZmluZSBESVZJU09SX0xBVENIX01TQiAxCisjZGVmaW5lIFBSRVNDQUxFUl9ESVZJU0lPTiA1CisKKyNkZWZpbmUgQ09NX1dSSVRFX0JZVEUocmVnLCBieXRlKSBvdXRfYnl0ZSgoQ29tUG9ydDErcmVnKSwgYnl0ZSkKKyNkZWZpbmUgQ09NX1JFQURfQllURShyZWcpIGluX2J5dGUoKENvbVBvcnQxK3JlZykpCisKK3N0YXRpYyBpbnQgc2VyaWFsX2luaXRfZG9uZSA9IDA7CisKK3ZvaWQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisjaWYgMAorCXVpbnQzMiBjbG9ja19kaXZpc29yID0gMTE1MjAwIC8gYmF1ZHJhdGU7CisJdWludDggY2ZnOworCXVpbnQ4IGE7CisJdWludDE2IGRldmZuID0gNyA8PCAzOworCisJaWYgKHNlcmlhbF9pbml0X2RvbmUpCisJCXJldHVybjsKKworCS8qICBFbnRlciBjb25maWd1cmF0aW9uIG1vZGUgKi8KKwljZmcgPSBwY2lfcmVhZF9jZmdfYnl0ZSAoMCwgZGV2Zm4sIDB4ODUpOworCXBjaV93cml0ZV9jZmdfYnl0ZSAoMCwgZGV2Zm4sIDB4ODUsIGNmZyB8IDB4MDIpOworCisJLyogU2V0IHNlcmlhbCBwb3J0IENPTTEgYXMgM0Y4ICovCisJb3V0X2J5dGUgKDB4M0YwLCAweEU3KTsKKwlvdXRfYnl0ZSAoMHgzZjEsIDB4ZmUpOworCisJLyogU2V0IHNlcmlhbCBwb3J0IENPTTIgYXMgMkY4ICovCisJb3V0X2J5dGUgKDB4M2YwLCAweGU4KTsKKwlvdXRfYnl0ZSAoMHgzZjEsIDB4ZWIpOworCisJLyogRW5hYmxlICovCisJb3V0X2J5dGUgKDB4M2YwLCAweGUyKTsKKwlhID0gaW5fYnl0ZSAoMHgzZjEpOworCWEgfD0gMHhjOworCW91dF9ieXRlICgweDNmMCwgMHhlMik7CisJb3V0X2J5dGUgKDB4M2YxLCBhKTsKKworCS8qICBSZXNldCB0aGUgY29uZmlndXJhdGlvbiBtb2RlICovCisJcGNpX3dyaXRlX2NmZ19ieXRlICgwLCBkZXZmbiwgMHg4NSwgY2ZnKTsKKyNlbmRpZgorCisJQ29tUG9ydDEgPSAweDNGODsKKworCS8qICBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlDT01fV1JJVEVfQllURSAoSU5URVJSVVBUX0VOQUJMRSwgMHgwMCk7CisKKwkvKiAgU2V0IGJhdWQgcmF0ZSAqLworCS8qIENPTV9XUklURV9CWVRFKExJTkVfQ09OVFJPTCwgMHg4Myk7ICovCisJLyogQ09NX1dSSVRFX0JZVEUoRElWSVNPUl9MQVRDSF9MU0IsICh1aW50OCkoY2xvY2tfZGl2aXNvciAmIDB4RkYpKTsgKi8KKwkvKiBDT01fV1JJVEVfQllURShESVZJU09SX0xBVENIX01TQiwgKHVpbnQ4KShjbG9ja19kaXZpc29yID4+IDgpKTsgKi8KKwkvKiBfX2FzbSgiZWllaW8iKTsgKi8KKworCS8qICBTZXQgOC1OLTEgKi8KKwlDT01fV1JJVEVfQllURSAoTElORV9DT05UUk9MLCAweDAzKTsKKwlfX2FzbSAoImVpZWlvIik7CisKKwkvKiAgRGlzYWJsZSBGSUZPICovCisJQ09NX1dSSVRFX0JZVEUgKE1PREVNX0NPTlRST0wsIDB4MDMpOworCUNPTV9XUklURV9CWVRFIChGSUZPX0NPTlRST0wsIDB4MDcpOworCisJX19hc20gKCJlaWVpbyIpOworCXNlcmlhbF9pbml0X2RvbmUgPSAxOworfQorCitleHRlcm4gaW50IGNvbnNvbGVfY2hhbmdlZDsKKwordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBzZW5kbWUpCit7CisJaWYgKHNlbmRtZSA9PSAnXG4nKSB7CisJCXdoaWxlICgoaW5fYnl0ZSAoMHgzRkQpICYgMHg0MCkgPT0gMCk7CisJCW91dF9ieXRlICgweDNmOCwgMHgwRCk7CisJfQorCisJd2hpbGUgKChpbl9ieXRlICgweDNGRCkgJiAweDQwKSA9PSAwKTsKKwlvdXRfYnl0ZSAoMHgzZjgsIHNlbmRtZSk7Cit9CisKK2ludCBzZXJpYWxfZ2V0YyAodm9pZCkKK3sKKyNpZiAwCisJdWludDggYzsKKworCWZvciAoOzspIHsKKwkJdWludDggeCA9IGluX2J5dGUgKDB4M0ZEKTsKKworCQlpZiAoeCAmIDB4MDEpCisJCQlicmVhazsKKworCQlpZiAoeCAmIDB4MEMpCisJCQlvdXRfYnl0ZSAoMHgzZmQsIDB4MGMpOworCX0KKworCWMgPSBpbl9ieXRlICgweDNGOCk7CisKKwlyZXR1cm4gYzsKKyNlbHNlCisJd2hpbGUgKChpbl9ieXRlICgweDNGRCkgJiAweDAxKSA9PSAwKSB7CisJCWlmIChjb25zb2xlX2NoYW5nZWQgIT0gMCkgeworCQkJcHJpbnRmICgiQ29uc29sZSBjaGFuZ2VkXG4iKTsKKwkJCWNvbnNvbGVfY2hhbmdlZCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gaW5fYnl0ZSAoMHgzRjgpOworI2VuZGlmCit9CisKK2ludCBzZXJpYWxfdHN0YyAodm9pZCkKK3sKKwlyZXR1cm4gKGluX2J5dGUgKDB4MDNGRCkgJiAweDAxKSAhPSAwOworfQorCit2b2lkIHNlcmlhbF9kZWJ1Z19wdXRjIChpbnQgYykKK3sKKwlzZXJpYWxfcHV0cyAoIkRCRyIpOworCXNlcmlhbF9wdXRjIChjKTsKKwlzZXJpYWxfcHV0YyAoMHgwZCk7CisJc2VyaWFsX3B1dGMgKDB4MEEpOworfQorCisjZWxzZQorCitjb25zdCBOUzE2NTUwX3QgQ29tMCA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTE7Citjb25zdCBOUzE2NTUwX3QgQ29tMSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTI7CisKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVpbnQzMiBjbG9ja19kaXZpc29yID0gMTE1MjAwIC8gZ2QtPmJhdWRyYXRlOworCisJTlMxNjU1MF9pbml0IChDb20wLCBjbG9ja19kaXZpc29yKTsKKwkvKiBOUzE2NTUwX3JlaW5pdChDb20xLCBjbG9ja19kaXZpc29yKTsgKi8KKwkvKiBzZXJpYWxfcHV0cygiQ09NMTogM0Y4aCBpbml0YWxpemVkIik7ICovCisKKwlyZXR1cm4gKDApOworfQorCisjaWYgMAordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBjKQoreworCU5TMTY1NTBfcHV0YyAoQ29tMCwgYyk7CisJaWYgKGMgPT0gJ1xuJykKKwkJTlMxNjU1MF9wdXRjIChDb20wLCAweDBEKTsKK30KKworaW50IHNlcmlhbF9nZXRjICh2b2lkKQoreworCXJldHVybiAoaW50KSBOUzE2NTUwX2dldGMgKENvbTApOworfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfdHN0YyAoQ29tMCk7Cit9CisjZWxzZQordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBzZW5kbWUpCit7CisJaWYgKHNlbmRtZSA9PSAnXG4nKSB7CisJCXdoaWxlICgoaW5fYnl0ZSAoMHgzRkQpICYgMHg0MCkgPT0gMCk7CisJCW91dF9ieXRlICgweDNmOCwgMHgwRCk7CisJfQorCisJd2hpbGUgKChpbl9ieXRlICgweDNGRCkgJiAweDQwKSA9PSAwKTsKKwlvdXRfYnl0ZSAoMHgzZjgsIHNlbmRtZSk7Cit9CisKKworZXh0ZXJuIGludCBjb25zb2xlX2NoYW5nZWQ7CisKK2ludCBzZXJpYWxfZ2V0YyAodm9pZCkKK3sKKyNpZiAwCisJdWludDggYzsKKworCWZvciAoOzspIHsKKwkJdWludDggeCA9IGluX2J5dGUgKDB4M0ZEKTsKKworCQlpZiAoeCAmIDB4MDEpCisJCQlicmVhazsKKworCQlpZiAoeCAmIDB4MEMpCisJCQlvdXRfYnl0ZSAoMHgzZmQsIDB4MGMpOworCX0KKworCWMgPSBpbl9ieXRlICgweDNGOCk7CisKKwlyZXR1cm4gYzsKKyNlbHNlCisJd2hpbGUgKChpbl9ieXRlICgweDNGRCkgJiAweDAxKSA9PSAwKSB7CisJCWlmIChjb25zb2xlX2NoYW5nZWQgIT0gMCkgeworCQkJY29uc29sZV9jaGFuZ2VkID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIGluX2J5dGUgKDB4M0Y4KTsKKyNlbmRpZgorfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJcmV0dXJuIChpbl9ieXRlICgweDAzRkQpICYgMHgwMSkgIT0gMDsKK30KKyNlbmRpZgorCisjZW5kaWYKKwordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXdoaWxlICgqc3RyaW5nKQorCQlzZXJpYWxfcHV0YyAoKnN0cmluZysrKTsKK30KKwordm9pZCBzZXJpYWxfc2V0YnJnICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJdWludDMyIGNsb2NrX2Rpdmlzb3IgPSAxMTUyMDAgLyBnZC0+YmF1ZHJhdGU7CisKKwlOUzE2NTUwX2luaXQgKENvbTAsIGNsb2NrX2Rpdmlzb3IpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zaG9ydF90eXBlcy5oIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zaG9ydF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGYzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3Nob3J0X3R5cGVzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIHNob3J0IHR5cGUgbmFtZXMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEh5cGVyaW9uIEVudGVydGFpbm1lbnQsIFRob21hc0ZAaHlwZXJpb24tZW50ZXJ0YWlubWVudC5jb20gCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfU0hPUlRfVFlQRVNfSAorI2RlZmluZSBfU0hPUlRfVFlQRVNfSAorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVpbnQzMjsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNjsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgaW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVpbnQ4OwordHlwZWRlZiBzaWduZWQgY2hhciAgICBpbnQ4OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0Uvc21idXMuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0Uvc21idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zbWJ1cy5jCkBAIC0wLDAgKzEsMjA2IEBACisjaW5jbHVkZSAibWVtaW8uaCIKKyNpbmNsdWRlICJhcnRpY2lhUy5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworCit2b2lkIHNtX3dyaXRlX21vZGUodm9pZCkKK3sKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDApOworICAgIG91dF9ieXRlKDB4QTUzQSwgMHgwMyk7Cit9CisKK3ZvaWQgc21fcmVhZF9tb2RlKHZvaWQpCit7CisgICAgb3V0X2J5dGUoMHhBNTNBLCAweDAyKTsKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDIpOworfQorCit2b2lkIHNtX3dyaXRlX2J5dGUodWludDggd3JpdGVtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbGV2ZWw7CisgICAgCisgICAgb3V0X2J5dGUoMHhBNTM5LCAweDAwKTsKKworICAgIGxldmVsID0gMDsKKworICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICB7CisJaWYgKCh3cml0ZW1lICYgMHg4MCkgPT0gKGxldmVsPDw3KSkgCisgICAgICAgIHsKKwkgICAgLyogQml0IGRpZCBub3QgY2hhbmdlLCByZXdyaXRlIHN0cm9iZSAqLworCSAgICBvdXRfYnl0ZSgweEE1MzksIGxldmVsIHwgMHgwMik7CisJICAgIG91dF9ieXRlKDB4QTUzOSwgbGV2ZWwpOyAKKwl9CisJZWxzZQorCXsKKwkgICAgLyogQml0IGNoYW5nZWQsIHNldCBiaXQsIHRoZW4gc3Ryb2JlICovCisJICAgIGxldmVsID0gKHdyaXRlbWUgJiAweDgwKSA+PiA3OworCSAgICBvdXRfYnl0ZSgweEE1MzksIGxldmVsKTsKKwkgICAgb3V0X2J5dGUoMHhBNTM5LCBsZXZlbCB8IDB4MDIpOworCSAgICBvdXRfYnl0ZSgweEE1MzksIGxldmVsKTsKKwl9CisJd3JpdGVtZSA8PD0gMTsKKyAgICB9CisgICAgb3V0X2J5dGUoMHhBNTM5LCAweDAwKTsKK30KKwordWludDggc21fcmVhZF9ieXRlKHZvaWQpCit7CisgICAgdWludDggcmV0bWUsIHI7CisgICAgaW50IGk7CisKKyAgICByZXRtZSA9IDA7CisgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgIHsKKwlyZXRtZSA8PD0gMTsKKwlvdXRfYnl0ZSgweEE1MzksIDB4MDApOworCW91dF9ieXRlKDB4QTUzOSwgMHgwMik7CisJciA9IGluX2J5dGUoMHhBNTM4KSAmIDB4MDE7CisJcmV0bWUgfD0gcjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0bWU7Cit9IAorCitpbnQgc21fZ2V0X2Fjayh2b2lkKQoreworICAgIHVpbnQ4IHI7CisgICAgciA9IGluX2J5dGUoMHhBNTM4KTsKKyAgICBpZiAoKHImMHgwMSkgPT0gMCkgcmV0dXJuIFRSVUU7CisgICAgZWxzZSByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQgc21fd3JpdGVfYWNrKHZvaWQpCit7CisgICAgb3V0X2J5dGUoMHhBNTM5LCAweDAwKTsKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDIpOworICAgIG91dF9ieXRlKDB4QTUzOSwgMHgwMCk7Cit9CisKK3ZvaWQgc21fd3JpdGVfbmFjayh2b2lkKQoreworICAgIG91dF9ieXRlKDB4QTUzOSwgMHgwMSk7CisgICAgb3V0X2J5dGUoMHhBNTM5LCAweDAzKTsKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDEpOworfQorCit2b2lkIHNtX3NlbmRfc3RhcnQodm9pZCkKK3sKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDMpOworICAgIG91dF9ieXRlKDB4QTUzOSwgMHgwMik7Cit9CisKK3ZvaWQgc21fc2VuZF9zdG9wKHZvaWQpCit7CisgICAgb3V0X2J5dGUoMHhBNTM5LCAweDAyKTsKKyAgICBvdXRfYnl0ZSgweEE1MzksIDB4MDMpOworfQorCitpbnQgc21fcmVhZF9ieXRlX2Zyb21fZGV2aWNlKHVpbnQ4IGFkZHIsIHVpbnQ4IHJlZywgdWludDggKnN0b3JhZ2UpCit7CisgICAgLy8gUyBBZGRyIFdyCisgICAgc21fd3JpdGVfbW9kZSgpOworICAgIHNtX3NlbmRfc3RhcnQoKTsKKyAgICBzbV93cml0ZV9ieXRlKChhZGRyPDwxKSk7CisgICAgCisgICAgLy8gW0FdCisgICAgc21fcmVhZF9tb2RlKCk7CisgICAgaWYgKHNtX2dldF9hY2soKSA9PSBGQUxTRSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gQ29tbQorICAgIHNtX3dyaXRlX21vZGUoKTsKKyAgICBzbV93cml0ZV9ieXRlKHJlZyk7CisgICAgCisgICAgLy8gW0FdCisgICAgc21fcmVhZF9tb2RlKCk7CisgICAgaWYgKHNtX2dldF9hY2soKSA9PSBGQUxTRSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gUyBBZGRyIFJkCisgICAgc21fd3JpdGVfbW9kZSgpOworICAgIHNtX3NlbmRfc3RhcnQoKTsKKyAgICBzbV93cml0ZV9ieXRlKChhZGRyPDwxKXwxKTsKKyAgICAKKyAgICAvLyBbQV0KKyAgICBzbV9yZWFkX21vZGUoKTsKKyAgICBpZiAoc21fZ2V0X2FjaygpID09IEZBTFNFKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBbRGF0YV0KKyAgICAqc3RvcmFnZSA9IHNtX3JlYWRfYnl0ZSgpOworICAgIAorICAgIC8vIE5BCisgICAgc21fd3JpdGVfbW9kZSgpOworICAgIHNtX3dyaXRlX25hY2soKTsKKyAgICBzbV9zZW5kX3N0b3AoKTsKKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkIHNtX2luaXQodm9pZCkKK3sgIAorICAgIC8qIFN3aXRjaCB0byBQTUMgbW9kZSAqLworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCAwLCBSRUdfR1JPVVAsICh1aW50OCkoUkVHX0dST1VQX1NQRUNJQUx8UkVHX0dST1VQX1BPV0VSKSk7CisgCisgICAgLyogU2V0IEdQSU8gQmFzZSAqLworICAgIHBjaV93cml0ZV9jZmdfbG9uZygwLCAwLCAweDQwLCAweGE1MDApOworCisgICAgLyogRW5hYmxlIEdQSU8gKi8KKyAgICBwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgMHg0NCwgMHgxMSk7CisKKyAgICAvKiBTZXQgYm90aCBHUElPIDAgYW5kIDEgYXMgb3V0cHV0ICovCisgICAgb3V0X2J5dGUoMHhBNTNBLCAweDAzKTsgCit9CisKKwordm9pZCBzbV90ZXJtKHZvaWQpCit7ICAKKyAgICAvKiBTd2l0Y2ggdG8gbm9ybWFsIG1vZGUgKi8KKyAgICBwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgUkVHX0dST1VQLCAwKTsKK30KKworCitpbnQgc21fZ2V0X2RhdGEodWludDggKkRhdGFBcnJheSwgaW50IGRpbW1fc29ja2V0KQoreworICAgIGludCBqOworCisjaWYgMAorICAgIC8qIFN3aXRjaCB0byBQTUMgbW9kZSAqLworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCAwLCBSRUdfR1JPVVAsICh1aW50OCkoUkVHX0dST1VQX1NQRUNJQUx8UkVHX0dST1VQX1BPV0VSKSk7CisgCisgICAgLyogU2V0IEdQSU8gQmFzZSAqLworICAgIHBjaV93cml0ZV9jZmdfbG9uZygwLCAwLCAweDQwLCAweGE1MDApOworCisgICAgLyogRW5hYmxlIEdQSU8gKi8KKyAgICBwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgMCwgMHg0NCwgMHgxMSk7CisKKyAgICAvKiBTZXQgYm90aCBHUElPIDAgYW5kIDEgYXMgb3V0cHV0ICovCisgICAgb3V0X2J5dGUoMHhBNTNBLCAweDAzKTsgCisjZW5kaWYKKworICAgIHNtX2luaXQoKTsKKyAgICAvKiBTdGFydCByZWFkaW5nIHRoZSByb20gKi8KKworICAgIGogPSAwOworCisgICAgZG8KKyAgICB7CisJaWYgKHNtX3JlYWRfYnl0ZV9mcm9tX2RldmljZShkaW1tX3NvY2tldCwgKHVpbnQ4KWosIERhdGFBcnJheSkgPT0gRkFMU0UpCisJeworCSAgICBzbV90ZXJtKCk7CisJICAgIHJldHVybiBGQUxTRTsKKwl9CisKKwlEYXRhQXJyYXkrKzsKKwlqKys7CisgICAgfSB3aGlsZSAoaiA8IDEyOCk7CisKKyAgICBzbV90ZXJtKCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3NtYnVzLmggYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3NtYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlYjZhMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0Uvc21idXMuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9TTUJVU19IXworI2RlZmluZSBfU01CVVNfSF8KKworI2luY2x1ZGUgInNob3J0X3R5cGVzLmgiCisKKyNkZWZpbmUgU01fRElNTTBfQUREUiAweDUxCisjZGVmaW5lIFNNX0RJTU0xX0FERFIgMHg1MgorCit2b2lkIHNtX3dyaXRlX21vZGUodm9pZCk7Cit2b2lkIHNtX3JlYWRfbW9kZSh2b2lkKTsKK3ZvaWQgc21fd3JpdGVfYnl0ZSh1aW50OCB3cml0ZW1lKTsKK3VpbnQ4IHNtX3JlYWRfYnl0ZSh2b2lkKTsKK2ludCBzbV9nZXRfYWNrKHZvaWQpOwordm9pZCBzbV93cml0ZV9hY2sodm9pZCk7Cit2b2lkIHNtX3dyaXRlX25hY2sodm9pZCk7Cit2b2lkIHNtX3NlbmRfc3RhcnQodm9pZCk7Cit2b2lkIHNtX3NlbmRfc3RvcCh2b2lkKTsKK2ludCBzbV9yZWFkX2J5dGVfZnJvbV9kZXZpY2UodWludDggYWRkciwgdWludDggcmVnLCB1aW50OCAqc3RvcmFnZSk7CitpbnQgc21fZ2V0X2RhdGEodWludDggKkRhdGFBcnJheSwgaW50IGRpbW1fc29ja2V0KTsKK3ZvaWQgc21faW5pdCh2b2lkKTsKK3ZvaWQgc21fdGVybSh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zdGFydC50eHQgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3N0YXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdiNTQxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9zdGFydC50eHQKQEAgLTAsMCArMSwyMDEgQEAKKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorICAgICAgICAvKiAgICAgICAgICAgICAgVEVST04gQXJ0aWNpYSAvIFNEUkFNIEluaXQgICAgICAgICAgICAgICovDQorICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorKiAgICAgICBYRF9DVEwgID0gMHg4MTAwMDAwMAkJCSgweDc0KQ0KKw0KKyogICAgICAgSEJVU19BQ0NfQ1RMXzAgJj0gMHhGRkZGRkRGRgkJKDB4NWMpDQorICAgICAgICAgICAgICAgICAgICAgICAvKiBob3N0IGJ1cyBhY2Nlc3MgY3RsIHJlZyAyKDVlKSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IC0gQ1BVIHJlYWQgZnJvbSBtZW1vcnkgZGF0YSBvbmUgY2xvY2sgYWZ0ZXIgZGF0YSBpcyBsYXRjaGVkICovDQorDQorKiAgICAgICBHTE9CTF9JTkZPXzAgfD0gMHgwMDAwNDAwMAkJKDB4NTApDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBpbmZvIHJlZ2lzdGVyIDIgKDUyKSwgQUdQL1BDSSBidXMgMSBhcmJpdGVyIGlzIGFkZHJlc3NlZCBpbiBBcnRpY2lhIFMgKi8NCisNCisgICAgICAgIFBDSV8xX1NCX0NPTkZJR18wIHw9IDB4MDAwMDA0MDAgICAgICAgICAoMHg4MGQwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDSTEgc2lkZSBiYW5kIGNvbmZpZyByZWcgMiAoZDIpLCBlbmFibGUgcmVhZCBhY2NlcyB3aGlsZSB3cml0ZSBidWZmZXIgbm90IGVtcHR5ICovDQorDQorICAgICAgICBNRU1fUkFTX0NUTF8wIHw9IDB4M2YwMDAwMDAJCSgweGNjKQ0KKwkJICAgICAgJj0gMHgzZmZmZmZmZg0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBSQVMgcGFyayBjb250cm9sIHJlZyAwKGNjKSwgcGFyayBhY2Nlc3MgZW5hYmxlIGlzIHNldCAqLw0KKwkJICAgICAgDQorICAgICAgICBIT1NUX1JEQlVGX0NUTCB8PSAweDEwMDAwMDAwCQkoMHg3MCkNCisJICAgICAgICAgICAgICAgJj0gMHgxMGZmZmZmZg0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBob3N0IHJlYWQgYnVmZmVyIGNvbnRyb2wgcmVnLCBlbmFibGUgcHJlZmV0Y2ggZm9yIENQVSByZWFkIGZyb20gRFJBTSBjb250cm9sICovDQorDQorICAgICAgICBIQlVTX0FDQ19DVExfMCB8PSAweDAxMDAwMDFmCQkoMHg1YykNCisJCSAgICAgICAmPSAweGYxZmZmZmZmDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgYnVzIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyLCBlbmFibGUgQ1BVIGFkZHJlc3MgYnVzIHBpcGUgY29udHJvbAkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiB0d28gb3V0c3RhbmRpbmcgcmVxdWVzdHMsICAqKiogY2hhbmdlZCB0byAyIGZyb20gMwkJCQkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgbGluZSBtZXJnZSB3cml0ZSBjb250cm9sIGZvciBDUFUgd3JpdGUgdG8gc3lzdGVtIG1lbW9yeSwgUENJIDEJKi8NCisgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIFBDSSAwIGJ1cyBtZW1vcnk7IGVuYWJsZSBwYWdlIG1lcmdlIHdyaXRlIGNvbnRyb2wgZm9yIHdyaXRlIHRvCQkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgYnVzIDAgJiBidXMgMSBtZW1vcnkJCQkJCQkJKi8NCisNCisgICAgICAgIFNSQU1fQ1RMIHw9IDB4MDAwMDQwMDAJCQkoMHhjOCkNCisJCSAmPSAweGZmYmZmN2ZmDQorICAgICAgICAgICAgICAgICAgICAgIC8qIERSQU0gZGV0YWlsIHRpbWluZyBjb250cm9sIHJlZ2lzdGVyIDEgKGNhKSwgYml0IDMgc2V0IHRvIDAJKi8NCisgICAgICAgICAgICAgICAgICAgICAgLyogRFJBTSBzdGFydCBhY2Nlc3MgbGF0ZW5jeSBjb250cm9sIC0gd2FpdCBmb3Igb25lIGNsb2NrCSovDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGZmOWYgY2hhbmdlZCB0byBmZmJmCQkJCQkJKi8NCisgICAgDQorICAgICAgICBESU0wX1RJTV9DVExfMCA9IDB4NzM3ZDczN2QgICAgICAgICAgICAgKDB4YzkpDQorICAgICAgICAgICAgICAgICAgICAgIC8qIERSQU0gdGltaW5nIGNvbnRyb2wgZm9yIGRpbW0wICYgZGltbTE7IHNldCB3YWl0IG9uZSBjbG9jawkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBjeWNsZSBmb3IgbmV4dCBkYXRhIGFjY2VzcyAJCQkJCSovDQorDQorICAgICAgICBESU0yX1RJTV9DVExfMCA9IDB4NzM3ZDczN2QgICAgICAgICAgICAgKDB4Y2EpDQorICAgICAgICAgICAgICAgICAgICAgIC8qIERSQU0gdGltaW5nIGNvbnRyb2wgZm9yIGRpbW0yICYgZGltbTM7IHNldCB3YWl0IG9uZSBjbG9jawkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBjeWNsZSBmb3IgbmV4dCBkYXRhIGFjY2VzcyAJCQkJCSovDQorDQorICAgICAgICBESU0wX0JOSzBfQ1RMXzAgPSBCTkswX1JBTV9TSVpfMTI4TUIgICAgKDB4OTApDQorCSAgICAgICAgICAgICAgLyogc2V0IGRpbW0wIGJhbmswIGZvciAxMjggTUIJKi8NCisNCisgICAgICAgIERJTTBfQk5LMV9DVExfMCA9IEJOSzFfUkFNX1NJWl8xMjhNQiAgICAoMHg5NCkNCisgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRpbW0wIGZvciAgYmFuazEJCSovDQorDQorICAgICAgICBESU0wX1RJTV9DVExfMCA9IDB4ZjNiZjAwMDAgICAgICAgICAgICAgKDB4YzkpDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGRpbW0wIHRpbWluZyBjb250cm9sIHJlZ2lzdGVyOyBSQVMgLSBDQVMgbGF0ZW5jeSAtIDQgY2xvY2sJCSovDQorICAgICAgICAgICAgICAgICAgICAgIC8qIENBUyBhY2Nlc3MgbGF0ZW5jeSAtIDMgd2FpdDsgcHJlLWNoYXJnZSBsYXRlbmN5IC0gMyB3YWl0CQkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUtY2hhcmdlIGNvbW1hbmQgcGVyaW9kIGNvbnRyb2wgLSA1IGNsb2NrOyB3YWl0IG9uZSBjbG9jawkJKi8NCisgICAgICAgICAgICAgICAgICAgICAgLyogY3ljbGUgZm9yIG5leHQgZGF0YSBhY2Nlc3M7IHJlYWQgdG8gd3JpdGUgYWNjZXNzIGxhdGVuY3kgY29udHJvbAkqLw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiAtIDIgY2xvY2sgY3ljbGVzCQkJCQkJCSovDQorDQorICAgICAgICBEUkFNX0dCTF9DVExfMCB8PSAweDAwMDAwMTAwICAgICAgICAgICAgKDB4YzApDQorCQkgICAgICAgJj0gMHhmZmZmMDFmZg0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBtZW1vcnkgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgLSBzdXBwb3J0IGJ1ZmZlciBzZHJhbSBvbiBiYW5rIDAJKi8NCisNCisgICAgICAgIERSQU1fRUNDX0NUTF8wIHw9IDB4MDAyNjAwMDAJCSgweGM0KQ0KKwkJICAgICAgICY9IDB4ZmYyNmZmZmYNCisgICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlIEVDQzsgZW5hYmxlIHJlYWQsIG1vZGlmeSwgd3JpdGUgY29udHJvbAkqLw0KKyANCisgICAgICAgIERSQU1fUkVGX0NUTF8wID0gRFJBTV9SRUZfREFUQSAgICAgICAgICAoMHhiOCkNCisJCSAgICAgIC8qIHNldCBEUkFNIHJlZnJlc2ggcGFyYW1ldGVycyAqKiogY2hhbmdlZCB0byAwMDk0MDEwMAkqLw0KKw0KKyAgICAgICAgbm9wDQorICAgICAgICBub3ANCisgICAgICAgIG5vcA0KKyAgICAgICAgbm9wDQorICAgICAgICBub3ANCisNCisgICAgICAgIERSQU1fRUNDX0NUTF8wIHw9IDB4MjAyNDMyODAJCSgweGM0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuIG9mZiBlY2MJCSovDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBTRFJBTSBiYW5rIDAJKi8NCisNCisgICAgICAgIERSQU1fRUNDX0NUTF8wIHw9IDB4MjAyNDMyOTAgICAgICAgICAgICAoMHhjNCkgPw0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgU0RSQU0gYmFuayAxCSovDQorIA0KKw0KKy8qIEFkZGl0aW9uYWwgU3R1ZmYuLi4qLw0KKw0KKyAgICAgICAgR0xPQkxfQ1RSTCB8PSAweDIwMDAwYjAwCQkoMHg1NCkNCisNCisgICAgICAgIFBDSV8wX1NCX0NPTkZJRyB8PSAweDA0MTAwMDA3CQkoMHhkMCkNCisgICAgICAgICAgICAgICAgICAgICAgLyogUENJIDAgU2lkZSBiYW5kIGNvbmZpZyByZWcqLw0KKw0KKyAgICAgICAgMHg4MDAwMDgzYyB8PSAweDAwMDgwMDAwDQorICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgVkdBIGRlY29kZSBvbiBQQ0kgQnVzIDEgKi8NCisNCisNCisvKkVuZCBBZGRpdGlvbmFsIFN0dWZmLi4qLw0KKw0KKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorICAgICAgICAvKiAgICAgICAgICAgICAgVEVST04gc2VyaWFsIHBvcnQgaW5pdGlhbGl6YXRpb24gY29kZSAgICAgICAgICAgKi8NCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkweDg0MzgwMDgwIHw9IDB4MDAwMzAwMDANCisgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgc3VwZXIgSU8gY29uZmlndXJhdGlvbiBWSUEgY2hpcCBSZWdpc3RlciA4NQkqLw0KKwkJICAgICAvKiBFbmFibGUgc3VwZXIgSS9PIGNvbmZpZyBtb2RlICovDQorDQorICAgICAgICAweGZlMDAwM2YwID0gMHhlMg0KKyAgICAgICAgYmwgZGVsYXkxDQorDQorICAgICAgICAweGZlMDAwM2YxID0gMHgwZg0KKwlibCBkZWxheTENCisJICAgICAgICAgICAgLyogZW5hYmxlIGNvbTEgJiBjb20yLCBwYXJhbGxlbCBwb3J0IGRpc2FibGVkICovIA0KKwkNCisJMHhmZTAwMDNmMCA9IDB4ZTcNCisgICAgICAgIGJsIGRlbGF5MQ0KKwkgICAgICAgICAgICAvKiBsZXQncyBtYWtlIGNvbTEgYmFzZSBhcyAweDNmOCAqLw0KKyAgICAgICAgDQorICAgICAgICAweGZlMDAwM2YxID0gMHhmZQ0KKyAgICAgICAgYmwgZGVsYXkxDQorDQorICAgICAgICAweGZlMDAwM2YwID0gMHhlOA0KKyAgICAgICAgYmwgZGVsYXkxICAgICAgICAgICANCisJCSAgICAvKiBsZXQncyBtYWtlIGNvbTIgYmFzZSBhcyAweDJmOCAqLw0KKw0KKwkweGZlMDAwM2YxID0gMHhiZQ0KKw0KKwkweDg0MzgwMDgwICY9IDB4ZmZmZGZmZmYNCisgICAgICAgICAgICAgICAgICAgIC8qIGNsb3Npbmcgc3VwZXIgSU8gY29uZmlndXJhdGlvbiBWSUEgY2hpcCBSZWdpc3RlciA4NSAgICovDQorICAgICANCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisgICAgICAgIDB4ZmUwMDAzZmIgPSAweDgzDQorCWJsIGRlbGF5MQ0KKyAgICAgICAgICAgICAgICAgICAvKmxhdGNoIGVuYWJsZSB3b3JkIGxlbmd0aCAtOCBiaXQgKi8gICAgICAgICAvKiBzZXQgbXNsYWIgYml0CSovDQorICAgICAgICAweGZlMDAwM2Y4ID0gMHgwYw0KKwlibCBkZWxheTENCisgICAgICAgICAgICAgICAgICAgLyogc2V0IGJhdWQgcmF0ZSBsc2IgZm9yIDk2MDAgYmF1ZAkqLw0KKyAgICAgICAgMHhmZTAwMDNmOSA9IDB4MA0KKwlibCBkZWxheTENCisgICAgICAgICAgICAgICAgICAgLyogc2V0IGJhdWQgcmF0ZSBtc2IgZm9yIDk2MDAgYmF1ZAkqLw0KKyAgICAgICAgMHhmZTAwMDNmYiAgPSAweDAzDQorCWJsIGRlbGF5MQ0KKyAgICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBtc2xhYgkqLw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgICAgICAgIC8qICAgICAgICAgICAgICBFTkQgVEVST04gU2VyaWFsIFBvcnQgSW5pdGlhbGl6YXRpb24gQ29kZSAgICAgICAqLw0KKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorICAgDQorDQorICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgICAgICAgIC8qICAgICAgRU5EIFRFUk9OIEFydGljaWEgLyBTRFJBTSBJbml0aWFsaXphdGlvbiBjb2RlICAgICAgICAgICAqLw0KKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorUHJvcG9zZWQgZnJvbSBEb2N1bWVudGF0aW9uOg0KKw0KK3dyaXRlIGRtZW0gMHhmZWMwMGNmOCAweDUwMDAwMDgwDQord3JpdGUgZG1lbSAweGZlZTAwY2ZjIDB4YzAzMDU0MTENCisNCisgICAgICBXcml0ZXMgdG8gaW5kZXggMHg1MC0weDUzLiANCisgICAgICAweDUwOiBHbG9iYWwgSW5mb3JtYXRpb24gUmVnaXN0ZXIgMA0KKwkgICAgMHhDMCA9IExpdHRsZSBFbmRpYW4gQ1BVLCBTZXF1ZW50aWFsIG9yZGVyIEJ1cnN0DQorICAgICAgMHg1MTogR2xvYmFsIEluZm9ybWF0aW9uIFJlZ2lzdGVyIDENCisJICAgIFJlYWQgb25seSwgMHgzMCA9IFByb3ZpZGVzIFBvd2VyUEMgYW5kIFg4NiBzdXBwb3J0DQorICAgICAgMHg1MjogR2xvYmFsIEluZm9ybWF0aW9uIFJlZ2lzdGVyIDINCisJICAgIDB4MDUgPSA2NC8xMjggYml0IENQVSBidXMgc3VwcG9ydA0KKyAgICAgIDB4NTM6IEdsb2JhbCBJbmZvcm1hdGlvbiBSZWdpc3RlciAzDQorCSAgICAweDgwID0gUENJIEJ1cyAwIGdyYW50IGFjdGl2ZSB0aW1lIGlzIDEgY2xvY2sgYWZ0ZXIgUkVRIyBkZWFzc2VydGVkDQorDQord3JpdGUgZG1lbSAweGZlYzAwY2Y4IDB4NWMwMDAwODANCit3cml0ZSBkbWVtIDB4ZmVlMDBjZmMgMHhiMzAwMDExRg0KKw0KK3dyaXRlIGRtZW0gMHhmZWMwMGNmOCAweGM4MDAwMDgwDQord3JpdGUgZG1lbSAweGZlZTAwY2ZjIDB4MDAyMGYxMDANCisNCit3cml0ZSBkbWVtIDB4ZmVjMDBjZjggMHg5MDAwMDA4MA0KK3dyaXRlIGRtZW0gMHhmZWUwMGNmYyAweDAwN2ZlNzAwDQorDQord3JpdGUgZG1lbSAweGZlYzAwY2Y4IDB4OTQwMDA4MA0KK3dyaXRlIGRtZW0gMHhmZWUwMGNmYyAweDAwN2ZlNzAwDQorDQord3JpdGUgZG1lbSAweGZlYzAwY2Y4IDB4YjAwMDAwODANCit3cml0ZSBkbWVtIDB4ZmVlMDBjZmMgMHg3MzdkNzM3ZA0KKw0KK3dyaXRlIGRtZW0gMHhmZWMwMGNmOCAweGI0MDAwMDgwDQord3JpdGUgZG1lbSAweGZlZTAwY2ZjIDB4NzM3ZDczN2QNCisNCit3cml0ZSBkbWVtIDB4ZmVjMDBjZjggMHhjMDAwMDA4MA0KK3dyaXRlIGRtZW0gMHhmZWUwMGNmYyAweDQwMDA1NTAwDQorDQord3JpdGUgZG1lbSAweGZlYzAwY2Y4IDB4YjgwMDAwODANCit3cml0ZSBkbWVtIDB4ZmVlMDBjZmMgMHgwMDk0MDEwMA0KKw0KK3dyaXRlIGRtZW0gMHhmZWMwMGNmOCAweGM0MDAwMDgwDQord3JpdGUgZG1lbSAweGZlZTAwY2ZjIDB4MDAwMDMyODANCisNCit3cml0ZSBkbWVtIDB4ZmVjMDBjZjggMHhjNDAwMDA4MA0KK3dyaXRlIGRtZW0gMHhmZWUwMGNmYyAweDAwMDAzMjkwDQorDQorDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS90b2RvLnR4dCBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdG9kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNWUzZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdG9kby50eHQKQEAgLTAsMCArMSwzIEBACistIEluaXQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gaW5pdCBzZHJhbQorLSBpbml0IGlkZSBjb250cm9sbGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91LWJvb3QubGRzIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmE3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogdS1ib290LmxkcyAtIGxpbmtlciBzY3JpcHQgZm9yIFUtQm9vdCBvbiB0aGUgQW1pZ2FPbmVHM1NFIEJvYXJkLgorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1Lzc0eHhfN3h4L3N0YXJ0Lm8JKC50ZXh0KQorLyogc3RvcmUgdGhlIGVudmlyb25tZW50IGluIGEgc2VwZXJhdGUgc2VjdG9yIGluIHRoZSBib290IGZsYXNoICovCisvKiAgICAuID0gZW52X29mZnNldDsgKi8KKyAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkgCisKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkgCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IEFMSUdOKDQpIC8qLiovIDsKKyAgUFJPVklERSAoZW5kID0gQUxJR04oNCkgLyouKi8pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91c2JfdWhjaS5jIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91c2JfdWhjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOGNiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3VzYl91aGNpLmMKQEAgLTAsMCArMSwxMTc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogTm90ZTogUGFydCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIGxpbnV4CisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIb3cgaXQgd29ya3M6CisgKiAtLS0tLS0tLS0tLS0tCisgKiBUaGUgZnJhbWVsaXN0IC8gVHJhbnNmZXIgZGVzY3JpcHRvciAvIFF1ZXVlIEhlYWRzIGFyZSBzaW1pbGFyIGxpa2UKKyAqIGluIHRoZSBsaW51eCB1c2JfdWhjaS5jLgorICoKKyAqIER1cmluZyBpbml0aWFsaXphdGlvbiwgdGhlIGZvbGxvd2luZyBza2VsZXRvbiBpcyBhbGxvY2F0ZWQgaW4gaW5pdF9za2VsOgorICoKKyAqICAgICAgICAgZnJhbWVzcGVjaWZpYyAgICAgICAgICAgfCAgICAgICAgICAgY29tbW9uIGNoYWluCisgKgorICogZnJhbWVsaXN0W10KKyAqIFsgIDAgXS0tLS0tPiBURCAtLS0tLS0tLS1cCisgKiBbICAxIF0tLS0tLT4gVEQgLS0tLS0tLS0tLT4gVEQgLS0tLS0tPiBRSCAtLS0tLS0tPiBRSCAtLS0tLS0tPiBRSCAtLS0+IE5VTEwKKyAqICAgLi4uICAgICAgICBURCAtLS0tLS0tLS0vCisgKiBbMTAyM10tLS0tLT4gVEQgLS0tLS0tLS0vCisgKgorICogICAgICAgICAgICAgIF5eICAgICAgICAgICAgIF5eICAgICAgICAgXl4gICAgICAgICAgXl4gICAgICAgICAgXl4KKyAqICAgICAgICAgICAgICA3IFREcyBmb3IgICAgICAxIFREIGZvciAgIFN0YXJ0IG9mICAgIFN0YXJ0IG9mICAgIEVuZCBDaGFpbgorICogICAgICAgICAgICAgIElOVCAoMi0xMjhtcykgIDFtcy1JTlQgICAgQ1RSTCBDaGFpbiAgQlVMSyBDaGFpbgorICoKKyAqCisgKiBTaW5jZSB0aGlzIGlzIGEgYm9vdGxvYWRlciwgdGhlIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGRlc2NyaXB0b3IgaGF2ZSBiZWVuIHJlbW92ZWQuCisgKgorICogSW50ZXJydXB0IFRyYW5zZmVycy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGb3IgSW50ZXJ1cHQgdHJhbnNmZXJzIFVTQl9NQVhfVEVNUF9JTlRfVEQgVHJhbnNmZXIgZGVzY3JpcHRvciBhcmUgYXZhaWxhYmxlLiBUaGV5CisgKiB3aWxsIGJlIGluc2VydGVkIGFmdGVyIHRoZSBhcHByb3ByaWF0ZSAoZGVwZW5kaW5nIHRoZSBpbnRlcnZhbCBzZXR0aW5nKSBza2VsZXRvbiBURC4KKyAqIElmIGFuIGludGVycnVwdCBoYXMgYmVlbiBkZXRlY3RlZCB0aGUgZGV2LT5pcnFoYW5kbGVyIGlzIGNhbGxlZC4gVGhlIHN0YXR1cyBhbmQgbnVtYmVyCisgKiBvZiB0cmFuc2ZlcmVkIGJ5dGVzIGlzIHN0b3JlZCBpbiBkZXYtPmlycV9zdGF0dXMgcmVzcC4gZGV2LT5pcnFfYWN0X2xlbi4gSWYgdGhlCisgKiBkZXYtPmlycWhhbmRsZXIgcmV0dXJucyAwLCB0aGUgaW50ZXJydXB0IFREIGlzIHJlbW92ZWQgYW5kIGRpc2FibGVkLiBJZiBhbiAxIGlzIHJldHVybmVkLAorICogdGhlIGludGVycnVwdCBURCB3aWxsIGJlIHJlYWN0aXZhdGVkLgorICoKKyAqIENvbnRyb2wgVHJhbnNmZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLQorICogQ29udHJvbCBUcmFuc2ZlcnMgYXJlIGlzc3VlZCBieSBmaWxsaW5nIHRoZSB0bXBfdGQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBhbmQgY29ubmVjdAorICogdGhlbSB0byB0aGUgcWhfY250cmwgcXVldWUgaGVhZGVyLiBCZWZvcmUgb3RoZXIgY29udHJvbC9idWxrIHRyYW5zZmVycyBjYW4gYmUgaXNzdWVkLAorICogdGhlIHByb2dyYW1tIGhhcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLiBUaGlzIGRvZXMgbm90IGFsbG93cyBhc3luY2hyb25vdXMgZGF0YSB0cmFuc2Zlci4KKyAqCisgKiBCdWxrIFRyYW5zZmVycworICogLS0tLS0tLS0tLS0tLS0KKyAqIEJ1bGsgVHJhbnNmZXJzIGFyZSBpc3N1ZWQgYnkgZmlsbGluZyB0aGUgdG1wX3RkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRhdGEgYW5kIGNvbm5lY3QKKyAqIHRoZW0gdG8gdGhlIHFoX2J1bGsgcXVldWUgaGVhZGVyLiBCZWZvcmUgb3RoZXIgY29udHJvbC9idWxrIHRyYW5zZmVycyBjYW4gYmUgaXNzdWVkLAorICogdGhlIHByb2dyYW1tIGhhcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLiBUaGlzIGRvZXMgbm90IGFsbG93cyBhc3luY2hyb25vdXMgZGF0YSB0cmFuc2Zlci4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2lmZGVmIENPTkZJR19VU0JfVUhDSQorCisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSAidXNiX3VoY2kuaCIKKworI2RlZmluZSBVU0JfTUFYX1RFTVBfVEQgICAgICAxMjggIC8qIG51bWJlciBvZiB0ZW1wb3JhcnkgVERzIGZvciBidWxrIGFuZCBjb250cm9sIHRyYW5zZmVycyAqLworI2RlZmluZSBVU0JfTUFYX1RFTVBfSU5UX1REICAzMiAgIC8qIG51bWJlciBvZiB0ZW1wb3JhcnkgVERzIGZvciBJbnRlcnJ1cHQgdHJhbnNmZXJzICovCisKKworLy8jZGVmaW5lIFVTQl9VSENJX0RFQlVHCisKKyNpZmRlZglVU0JfVUhDSV9ERUJVRworI2RlZmluZQlVU0JfVUhDSV9QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBVU0JfVUhDSV9QUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworCitzdGF0aWMgaW50IGlycXZlYyA9IC0xOyAgICAgICAgICAgIC8qIGlycSB2ZWN0b3IsIGlmIC0xIHVoY2kgaXMgc3RvcHBlZCAvIHJlc2V0ZWQgKi8KK3Vuc2lnbmVkIGludCB1c2JfYmFzZV9hZGRyOyAgICAgICAvKiBiYXNlIGFkZHJlc3MgKi8KKworc3RhdGljIHVoY2lfdGRfdCB0ZF9pbnRbOF07ICAgICAgICAvKiBJbnRlcnJ1cHQgVHJhbnNmZXIgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB1aGNpX3FoX3QgcWhfY250cmw7ICAgICAgICAgLyogY29udHJvbCBRdWV1ZSBIZWFkICovCitzdGF0aWMgdWhjaV9xaF90IHFoX2J1bGs7ICAgICAgICAgIC8qICBidWxrIFF1ZXVlIEhlYWQgKi8KK3N0YXRpYyB1aGNpX3FoX3QgcWhfZW5kOyAgICAgICAgICAgLyogZW5kIFF1ZXVlIEhlYWQgKi8KK3N0YXRpYyB1aGNpX3RkX3QgdGRfbGFzdDsgICAgICAgICAgLyogbGFzdCBURCAobGlua2VkIHdpdGggZW5kIGNoYWluKSAqLworCisvKiB0ZW1wb3JhcnkgdGRzICovCitzdGF0aWMgdWhjaV90ZF90IHRtcF90ZFtVU0JfTUFYX1RFTVBfVERdOyAgICAgICAgICAvKiB0ZW1wb3JhcnkgYnVsay9jb250cm9sIHRkJ3MgICovCitzdGF0aWMgdWhjaV90ZF90IHRtcF9pbnRfdGRbVVNCX01BWF9URU1QX0lOVF9URF07ICAvKiB0ZW1wb3JhcnkgaW50ZXJydXB0IHRkJ3MgICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZyYW1lbGlzdFsxMDI0XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMHgxMDAwKSkpOyAvKiBmcmFtZSBsaXN0ICovCisKK3N0YXRpYyBzdHJ1Y3QgdmlydF9yb290X2h1YiByaDsgICAvKiBzdHJ1Y3QgZm9yIHJvb3QgaHViICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzb21lIGZvcndhcmQgZGVjbGVyYXRpb24KKyAqLworaW50IHVoY2lfc3VibWl0X3JoX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCQkJCQl2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKTsKKworLyogZmlsbCBhIHRkIHdpdGggdGhlIGFwcHJvcHJvaWF0ZSBkYXRhLiBMaW5rLCBzdGF0dXMsIGluZm8gYW5kIGJ1ZmZlcgorICogYXJlIHVzZWQgYnkgdGhlIFVTQiBjb250cm9sbGVyIGl0c2VsZmVzLCBkZXYgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUKKyAqICJjb25uZWN0ZWQiIGRldmljZQorICovCit2b2lkIHVzYl9maWxsX3RkKHVoY2lfdGRfdCogdGQsdW5zaWduZWQgbG9uZyBsaW5rLHVuc2lnbmVkIGxvbmcgc3RhdHVzLAorCQkJCQl1bnNpZ25lZCBsb25nIGluZm8sIHVuc2lnbmVkIGxvbmcgYnVmZmVyLCB1bnNpZ25lZCBsb25nIGRldikKK3sKKwl0ZC0+bGluaz1zd2FwXzMyKGxpbmspOworCXRkLT5zdGF0dXM9c3dhcF8zMihzdGF0dXMpOworCXRkLT5pbmZvPXN3YXBfMzIoaW5mbyk7CisJdGQtPmJ1ZmZlcj1zd2FwXzMyKGJ1ZmZlcik7CisJdGQtPmRldl9wdHI9ZGV2OworfQorCisvKiBmaWxsIGEgcWggd2l0aCB0aGUgYXBwcm9wcm9pYXRlIGRhdGEuIEhlYWQgYW5kIGVsZW1lbnQgYXJlIHVzZWQgYnkgdGhlIFVTQiBjb250cm9sbGVyCisgKiBpdHNlbGZlcy4gQXMgc29vbiBhcyBhIHZhbGlkIGRldl9wdHIgaXMgZmlsbGVkLCBhIHRkIGNoYWluIGlzIGNvbm5lY3RlZCB0byB0aGUgcWguCisgKiBQbGVhc2Ugbm90ZSwgdGhhdCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSB0ZCBjaGFpbiwgdGhlIGVudHJ5IGVsZW1lbnQgaXMgcmVtb3ZlZCAvCisgKiBtYXJrZWQgaW52YWxpZCBieSB0aGUgVVNCIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgdXNiX2ZpbGxfcWgodWhjaV9xaF90KiBxaCx1bnNpZ25lZCBsb25nIGhlYWQsdW5zaWduZWQgbG9uZyBlbGVtZW50KQoreworCXFoLT5oZWFkPXN3YXBfMzIoaGVhZCk7CisJcWgtPmVsZW1lbnQ9c3dhcF8zMihlbGVtZW50KTsKKwlxaC0+ZGV2X3B0cj0wTDsKK30KKworLyogZ2V0IHRoZSBzdGF0dXMgb2YgYSB0ZC0+c3RhdHVzCisgKi8KK3Vuc2lnbmVkIGxvbmcgdXNiX3VoY2lfdGRfc3RhdCh1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdD0wOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9OQUspICAgICAgPyBVU0JfU1RfTkFLX1JFQyA6IDA7CisJcmVzdWx0IHw9IChzdGF0dXMgJiBURF9DVFJMX1NUQUxMRUQpICA/IFVTQl9TVF9TVEFMTEVEIDogMDsKKwlyZXN1bHQgfD0gKHN0YXR1cyAmIFREX0NUUkxfREJVRkVSUikgID8gVVNCX1NUX0JVRl9FUlIgOiAwOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9CQUJCTEUpICAgPyBVU0JfU1RfQkFCQkxFX0RFVCA6IDA7CisJcmVzdWx0IHw9IChzdGF0dXMgJiBURF9DVFJMX0NSQ1RJTUVPKSA/IFVTQl9TVF9DUkNfRVJSIDogMDsKKwlyZXN1bHQgfD0gKHN0YXR1cyAmIFREX0NUUkxfQklUU1RVRkYpID8gVVNCX1NUX0JJVF9FUlIgOiAwOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9BQ1RJVkUpICAgPyBVU0JfU1RfTk9UX1BST0MgOiAwOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGdldCB0aGUgc3RhdHVzIGFuZCB0aGUgdHJhbnNmZXJlZCBsZW4gb2YgYSB0ZCBjaGFpbi4KKyAqIGNhbGxlZCBmcm9tIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIKKyAqLworaW50IHVzYl9nZXRfdGRfc3RhdHVzKHVoY2lfdGRfdCAqdGQsc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXAsaW5mbzsKKwl1bnNpZ25lZCBsb25nIHN0YXQ7CisJdWhjaV90ZF90ICpteXRkPXRkOworCisJaWYoZGV2LT5kZXZudW09PXJoLmRldm51bSkKKwkJcmV0dXJuIDA7CisJZGV2LT5hY3RfbGVuPTA7CisJc3RhdD0wOworCWRvIHsKKwkJdGVtcD1zd2FwXzMyKCh1bnNpZ25lZCBsb25nKW15dGQtPnN0YXR1cyk7CisJCXN0YXQ9dXNiX3VoY2lfdGRfc3RhdCh0ZW1wKTsKKwkJaW5mbz1zd2FwXzMyKCh1bnNpZ25lZCBsb25nKW15dGQtPmluZm8pOworCQlpZigoKGluZm8gJiAweGZmKSE9IFVTQl9QSURfU0VUVVApICYmCisJCQkJKCgoaW5mbyA+PiAyMSkgJiAweDdmZikhPSAweDdmZikgJiYKKwkJCQkodGVtcCAmIDB4N0ZGKSE9MHg3ZmYpCisJCXsgIC8qIGlmIG5vdCBzZXR1cCBhbmQgbm90IG51bGwgZGF0YSBwYWNrICovCisJCQlkZXYtPmFjdF9sZW4rPSh0ZW1wICYgMHg3RkYpICsgMTsgLyogdGhlIHRyYW5zZmVyZWQgbGVuIGlzIGFjdF9sZW4gKyAxICovCisJCX0KKwkJaWYoc3RhdCkgeyAgICAgICAgICAgLyogc3RhdHVzIG5vIG9rICovCisJCQlkZXYtPnN0YXR1cz1zdGF0OworCQkJcmV0dXJuIC0xOworCQl9CisJCXRlbXA9c3dhcF8zMigodW5zaWduZWQgbG9uZylteXRkLT5saW5rKTsKKwkJbXl0ZD0odWhjaV90ZF90ICopKHRlbXAgJiAweGZmZmZmZmYwKTsKKwl9d2hpbGUoKHRlbXAgJiAweDEpPT0wKTsgLyogcHJvY2VzcyBhbGwgVERzICovCisJZGV2LT5zdGF0dXM9c3RhdDsKKwlyZXR1cm4gMDsgLyogT2sgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIExPVyBMRVZFTCBTVFVGRgorICogICAgICAgICAgYXNzZW1ibGVzIFFIcyB1bmQgVERzIGZvciBjb250cm9sLCBidWxrIGFuZCBpc28KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN1Ym1pdHMgYSBjb250cm9sIG1lc3NhZ2UuIFRoYXQgaXMgYSBTZXR1cCwgRGF0YSBhbmQgU3RhdHVzIHRyYW5zZmVyLgorICogUm91dGluZSBkb2VzIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uLgorICovCitpbnQgc3VibWl0X2NvbnRyb2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkJCQkJCQkJCWludCB0cmFuc2Zlcl9sZW4sc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQoreworCXVuc2lnbmVkIGxvbmcgZGVzdGluYXRpb24sIHN0YXR1czsKKwlpbnQgbWF4c3plID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOworCXVuc2lnbmVkIGxvbmcgZGF0YXB0cjsKKwlpbnQgbGVuOworCWludCBwa3RzemU7CisJaW50IGk9MDsKKworCWlmICghbWF4c3plKSB7CisJCVVTQl9VSENJX1BSSU5URigidWhjaV9zdWJtaXRfY29udHJvbF91cmI6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvXG4iLCBwaXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZigoKHBpcGU+PjgpJjB4N2YpPT1yaC5kZXZudW0pIHsKKwkJLyogdGhpcyBpcyB0aGUgcm9vdCBodWIgLT4gcmVkaXJlY3QgaXQgKi8KKwkJcmV0dXJuIHVoY2lfc3VibWl0X3JoX21zZyhkZXYscGlwZSxidWZmZXIsdHJhbnNmZXJfbGVuLHNldHVwKTsKKwl9CisJVVNCX1VIQ0lfUFJJTlRGKCJ1aGNpX3N1Ym1pdF9jb250cm9sIHN0YXJ0IGxlbiAleCwgbWF4c2l6ZSAleFxuIix0cmFuc2Zlcl9sZW4sbWF4c3plKTsKKwkvKiBUaGUgInBpcGUiIHRoaW5nIGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBpbiBiaXRzIDgtLTE4ICovCisJZGVzdGluYXRpb24gPSAocGlwZSAmIFBJUEVfREVWRVBfTUFTSykgfCBVU0JfUElEX1NFVFVQOyAvKiBTZXR1cCBzdGFnZSAqLworCS8qIDMgZXJyb3JzICovCisJc3RhdHVzID0gKHBpcGUgJiBURF9DVFJMX0xTKSB8IFREX0NUUkxfQUNUSVZFIHwgKDMgPDwgMjcpOworCS8qICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVNCX0RJU0FCTEVfU1BEID8gMCA6IFREX0NUUkxfU1BEKTsgKi8KKwkvKiAgQnVpbGQgdGhlIFREIGZvciB0aGUgY29udHJvbCByZXF1ZXN0LCB0cnkgZm9yZXZlciwgOCBieXRlcyBvZiBkYXRhICovCisJdXNiX2ZpbGxfdGQoJnRtcF90ZFtpXSxVSENJX1BUUl9URVJNICxzdGF0dXMsIGRlc3RpbmF0aW9uIHwgKDcgPDwgMjEpLCh1bnNpZ25lZCBsb25nKXNldHVwLCh1bnNpZ25lZCBsb25nKWRldik7CisjaWYgMAorCXsKKwkJY2hhciAqc3A9KGNoYXIgKilzZXR1cDsKKwkJcHJpbnRmKCJTRVRVUCB0byBwaXBlICVseDogJXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBpcGUsCisJCSAgICBzcFswXSxzcFsxXSxzcFsyXSxzcFszXSxzcFs0XSxzcFs1XSxzcFs2XSxzcFs3XSk7CisJfQorI2VuZGlmCisJZGF0YXB0ciA9ICh1bnNpZ25lZCBsb25nKWJ1ZmZlcjsKKwlsZW49dHJhbnNmZXJfbGVuOworCisJLyogSWYgZGlyZWN0aW9uIGlzICJzZW5kIiwgY2hhbmdlIHRoZSBmcmFtZSBmcm9tIFNFVFVQICgweDJEKQorCSAgIHRvIE9VVCAoMHhFMSkuIEVsc2UgY2hhbmdlIGl0IGZyb20gU0VUVVAgdG8gSU4gKDB4NjkpLiAqLworCWRlc3RpbmF0aW9uID0gKHBpcGUgJiBQSVBFX0RFVkVQX01BU0spIHwgKChwaXBlICYgVVNCX0RJUl9JTik9PTAgPyBVU0JfUElEX09VVCA6IFVTQl9QSURfSU4pOworCXdoaWxlIChsZW4gPiAwKSB7CisJCS8qIGRhdGEgc3RhZ2UgKi8KKwkJcGt0c3plID0gbGVuOworCQlpKys7CisJCWlmIChwa3RzemUgPiBtYXhzemUpCisJCQlwa3RzemUgPSBtYXhzemU7CisJCWRlc3RpbmF0aW9uIF49IDEgPDwgVERfVE9LRU5fVE9HR0xFOwkvKiB0b2dnbGUgREFUQTAvMSAqLworCQl1c2JfZmlsbF90ZCgmdG1wX3RkW2ldLFVIQ0lfUFRSX1RFUk0sIHN0YXR1cywgZGVzdGluYXRpb24gfCAoKHBrdHN6ZSAtIDEpIDw8IDIxKSxkYXRhcHRyLCh1bnNpZ25lZCBsb25nKWRldik7CS8qIFN0YXR1cywgcGt0c3plIGJ5dGVzIG9mIGRhdGEgKi8KKwkJdG1wX3RkW2ktMV0ubGluaz1zd2FwXzMyKCh1bnNpZ25lZCBsb25nKSZ0bXBfdGRbaV0pOworCisJCWRhdGFwdHIgKz0gcGt0c3plOworCQlsZW4gLT0gcGt0c3plOworCX0KKworCS8qICBCdWlsZCB0aGUgZmluYWwgVEQgZm9yIGNvbnRyb2wgc3RhdHVzICovCisJLyogSXQncyBvbmx5IElOIGlmIHRoZSBwaXBlIGlzIG91dCBBTkQgd2UgYXJlbid0IGV4cGVjdGluZyBkYXRhICovCisKKwlkZXN0aW5hdGlvbiAmPSB+VUhDSV9QSUQ7CisJaWYgKCgocGlwZSAmIFVTQl9ESVJfSU4pPT0wKSB8fCAodHJhbnNmZXJfbGVuID09IDApKQorCQlkZXN0aW5hdGlvbiB8PSBVU0JfUElEX0lOOworCWVsc2UKKwkJZGVzdGluYXRpb24gfD0gVVNCX1BJRF9PVVQ7CisJZGVzdGluYXRpb24gfD0gMSA8PCBURF9UT0tFTl9UT0dHTEU7CS8qIEVuZCBpbiBEYXRhMSAqLworCWkrKzsKKwlzdGF0dXMgJj1+VERfQ1RSTF9TUEQ7CisJLyogbm8gbGltaXQgb24gZXJyb3JzIG9uIGZpbmFsIHBhY2tldCAsIDAgYnl0ZXMgb2YgZGF0YSAqLworCXVzYl9maWxsX3RkKCZ0bXBfdGRbaV0sVUhDSV9QVFJfVEVSTSwgc3RhdHVzIHwgVERfQ1RSTF9JT0MsIGRlc3RpbmF0aW9uIHwgKFVIQ0lfTlVMTF9EQVRBX1NJWkUgPDwgMjEpLDAsKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwl0bXBfdGRbaS0xXS5saW5rPXN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRtcF90ZFtpXSk7CS8qIHF1ZXVlIHN0YXR1cyB0ZCAqLworCS8qCXVzYl9zaG93X3RkKGkrMSk7Ki8KKwlVU0JfVUhDSV9QUklOVEYoInVoY2lfc3VibWl0X2NvbnRyb2wgZW5kICglZCB0bXBfdGRzIHVzZWQpXG4iLGkpOworCS8qIGZpcnN0IG1hcmsgdGhlIGNvbnRyb2wgUUggZWxlbWVudCB0ZXJtaW5hdGVkICovCisJcWhfY250cmwuZWxlbWVudD0weGZmZmZmZmZmTDsKKwkvKiBzZXQgcWggYWN0aXZlICovCisJcWhfY250cmwuZGV2X3B0cj0odW5zaWduZWQgbG9uZylkZXY7CisJLyogZmlsbCBpbiB0bXBfdGRfY2hhaW4gKi8KKwlxaF9jbnRybC5lbGVtZW50PXN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRtcF90ZFswXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcGFyZSBURHMgZm9yIGJ1bGsgdHJhbnNmZXJzLgorICovCitpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLGludCB0cmFuc2Zlcl9sZW4pCit7CisJdW5zaWduZWQgbG9uZyBkZXN0aW5hdGlvbiwgc3RhdHVzLGluZm87CisJdW5zaWduZWQgbG9uZyBkYXRhcHRyOworCWludCBtYXhzemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJaW50IGxlbjsKKwlpbnQgaT0wOworCisJaWYodHJhbnNmZXJfbGVuIDwgMCkgeworCQlwcmludGYoIk5lZ2F0aXZlIHRyYW5zZmVyIGxlbmd0aCBpbiBzdWJtaXRfYnVsa1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFtYXhzemUpCisJCXJldHVybiAtMTsKKwkvKiBUaGUgInBpcGUiIHRoaW5nIGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBpbiBiaXRzIDgtLTE4LiAqLworCWRlc3RpbmF0aW9uID0gKHBpcGUgJiBQSVBFX0RFVkVQX01BU0spIHwgdXNiX3BhY2tldGlkIChwaXBlKTsKKwkvKiAzIGVycm9ycyAqLworCXN0YXR1cyA9IChwaXBlICYgVERfQ1RSTF9MUykgfCBURF9DVFJMX0FDVElWRSB8ICgzIDw8IDI3KTsKKwkvKgkoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVU0JfRElTQUJMRV9TUEQpID8gMCA6IFREX0NUUkxfU1BEKSB8ICgzIDw8IDI3KTsgKi8KKwkvKiBCdWlsZCB0aGUgVERzIGZvciB0aGUgYnVsayByZXF1ZXN0ICovCisJbGVuID0gdHJhbnNmZXJfbGVuOworCWRhdGFwdHIgPSAodW5zaWduZWQgbG9uZylidWZmZXI7CisJZG8geworCQlpbnQgcGt0c3plID0gbGVuOworCQlpZiAocGt0c3plID4gbWF4c3plKQorCQkJcGt0c3plID0gbWF4c3plOworCQkvKiBwa3RzemUgYnl0ZXMgb2YgZGF0YSAgKi8KKwkJaW5mbyA9IGRlc3RpbmF0aW9uIHwgKCgocGt0c3plIC0gMSkmVUhDSV9OVUxMX0RBVEFfU0laRSkgPDwgMjEpIHwKKwkJCSh1c2JfZ2V0dG9nZ2xlIChkZXYsIHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpLCB1c2JfcGlwZW91dCAocGlwZSkpIDw8IFREX1RPS0VOX1RPR0dMRSk7CisKKwkJaWYoKGxlbi1wa3RzemUpPT0wKQorCQkJc3RhdHVzIHw9IFREX0NUUkxfSU9DOwkvKiBsYXN0IG9uZSBnZW5lcmF0ZXMgSU5UICovCisKKwkJdXNiX2ZpbGxfdGQoJnRtcF90ZFtpXSxVSENJX1BUUl9URVJNLCBzdGF0dXMsIGluZm8sZGF0YXB0ciwodW5zaWduZWQgbG9uZylkZXYpOwkvKiBTdGF0dXMsIHBrdHN6ZSBieXRlcyBvZiBkYXRhICovCisJCWlmKGk+MCkKKwkJCXRtcF90ZFtpLTFdLmxpbms9c3dhcF8zMigodW5zaWduZWQgbG9uZykmdG1wX3RkW2ldKTsKKwkJaSsrOworCQlkYXRhcHRyICs9IHBrdHN6ZTsKKwkJbGVuIC09IHBrdHN6ZTsKKwkJdXNiX2RvdG9nZ2xlIChkZXYsIHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpLCB1c2JfcGlwZW91dCAocGlwZSkpOworCX0gd2hpbGUgKGxlbiA+IDApOworCS8qIGZpcnN0IG1hcmsgdGhlIGJ1bGsgUUggZWxlbWVudCB0ZXJtaW5hdGVkICovCisJcWhfYnVsay5lbGVtZW50PTB4ZmZmZmZmZmZMOworCS8qIHNldCBxaCBhY3RpdmUgKi8KKwlxaF9idWxrLmRldl9wdHI9KHVuc2lnbmVkIGxvbmcpZGV2OworCS8qIGZpbGwgaW4gdG1wX3RkX2NoYWluICovCisJcWhfYnVsay5lbGVtZW50PXN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRtcF90ZFswXSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogc2VhcmNoIGEgZnJlZSBpbnRlcnJ1cHQgdGQKKyAqLwordWhjaV90ZF90ICp1aGNpX2FsbG9jX2ludF90ZCh2b2lkKQoreworCWludCBpOworCWZvcihpPTA7aTxVU0JfTUFYX1RFTVBfSU5UX1REO2krKykgeworCQlpZih0bXBfaW50X3RkW2ldLmRldl9wdHI9PTApIC8qIG5vIGRldmljZSBhc3NpZ25lZCAtPiBmcmVlIFREICovCisJCQlyZXR1cm4gJnRtcF9pbnRfdGRbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCisjaWYgMAordm9pZCB1aGNpX3Nob3dfdGVtcF9pbnRfdGQodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IoaT0wO2k8VVNCX01BWF9URU1QX0lOVF9URDtpKyspIHsKKwkJaWYoKHRtcF9pbnRfdGRbaV0uZGV2X3B0ciYweDAxKSE9MHgxTCkgLyogbm8gZGV2aWNlIGFzc2lnbmVkIC0+IGZyZWUgVEQgKi8KKwkJCXByaW50ZigidGVtcF90ZCAlZCBpcyBhc3NpZ25lZCB0byBkZXYgJWx4XG4iLGksdG1wX2ludF90ZFtpXS5kZXZfcHRyKTsKKwl9CisJcHJpbnRmKCJhbGwgb3RoZXJzIHRlbXBfdGRzIGFyZSBmcmVlXG4iKTsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzdWJtaXRzIFVTQiBpbnRlcnJ1cHQgKGllLiBwb2xsaW5nIDstKQorICovCitpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsaW50IHRyYW5zZmVyX2xlbiwgaW50IGludGVydmFsKQoreworCWludCBuaW50LCBuOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzLCBkZXN0aW5hdGlvbjsKKwl1bnNpZ25lZCBsb25nIGluZm8sdG1wOworCXVoY2lfdGRfdCAqbXl0ZDsKKwlpZiAoaW50ZXJ2YWwgPCAwIHx8IGludGVydmFsID49IDI1NikKKwkJcmV0dXJuIC0xOworCisJaWYgKGludGVydmFsID09IDApCisJCW5pbnQgPSAwOworCWVsc2UgeworCQlmb3IgKG5pbnQgPSAwLCBuID0gMTsgbmludCA8PSA4OyBuaW50KyssIG4gKz0gbikJLyogcm91bmQgaW50ZXJ2YWwgZG93biB0byAyXm4gKi8KKwkJIHsKKwkJCWlmKGludGVydmFsIDwgbikgeworCQkJCWludGVydmFsID0gbiAvIDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmludC0tOworCX0KKworCVVTQl9VSENJX1BSSU5URigiUm91bmRlZCBpbnRlcnZhbCB0byAlaSwgY2hhaW4gICVpXG4iLCBpbnRlcnZhbCwgbmludCk7CisJbXl0ZD11aGNpX2FsbG9jX2ludF90ZCgpOworCWlmKG15dGQ9PU5VTEwpIHsKKwkJcHJpbnRmKCJObyBmcmVlIElOVCBURHMgZm91bmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXN0YXR1cyA9IChwaXBlICYgVERfQ1RSTF9MUykgfCBURF9DVFJMX0FDVElWRSB8IFREX0NUUkxfSU9DIHwgKDMgPDwgMjcpOworLyoJCSh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVNCX0RJU0FCTEVfU1BEID8gMCA6IFREX0NUUkxfU1BEKSB8ICgzIDw8IDI3KTsKKyovCisKKwlkZXN0aW5hdGlvbiA9KHBpcGUgJiBQSVBFX0RFVkVQX01BU0spIHwgdXNiX3BhY2tldGlkIChwaXBlKSB8ICgoKHRyYW5zZmVyX2xlbiAtIDEpICYgMHg3ZmYpIDw8IDIxKTsKKworCWluZm8gPSBkZXN0aW5hdGlvbiB8ICh1c2JfZ2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSkpIDw8IFREX1RPS0VOX1RPR0dMRSk7CisJdG1wID0gc3dhcF8zMih0ZF9pbnRbbmludF0ubGluayk7CisJdXNiX2ZpbGxfdGQobXl0ZCx0bXAsc3RhdHVzLCBpbmZvLCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwodW5zaWduZWQgbG9uZylkZXYpOworCS8qIExpbmsgaXQgKi8KKwl0bXAgPSBzd2FwXzMyKCh1bnNpZ25lZCBsb25nKW15dGQpOworCXRkX2ludFtuaW50XS5saW5rPXRtcDsKKworCXVzYl9kb3RvZ2dsZSAoZGV2LCB1c2JfcGlwZWVuZHBvaW50IChwaXBlKSwgdXNiX3BpcGVvdXQgKHBpcGUpKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93IExldmVsIGZ1bmN0aW9ucworICovCisKKwordm9pZCByZXNldF9oYyh2b2lkKQoreworCisJLyogR2xvYmFsIHJlc2V0IGZvciAxMDBtcyAqLworCW91dDE2ciggdXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzEsMHgwMjA0KTsKKwlvdXQxNnIoIHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MyLDB4MDIwNCk7CisJb3V0MTZyKCB1c2JfYmFzZV9hZGRyICsgVVNCQ01ELFVTQkNNRF9HUkVTRVQgfCBVU0JDTURfUlMpOworCS8qIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JJTlRSLDApOworCXdhaXRfbXMoNTApOworCW91dDE2ciggdXNiX2Jhc2VfYWRkciArIFVTQkNNRCwwKTsKKwl3YWl0X21zKDEwKTsKK30KKwordm9pZCBzdGFydF9oYyh2b2lkKQoreworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlKGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JDTUQpICYgVVNCQ01EX0hDUkVTRVQpIHsKKwkJaWYgKCEtLXRpbWVvdXQpIHsKKwkJCXByaW50ZigiVVNCQ01EX0hDUkVTRVQgdGltZWQgb3V0IVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBUdXJuIG9uIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JJTlRSLFVTQklOVFJfVElNRU9VVCB8IFVTQklOVFJfUkVTVU1FIHwgVVNCSU5UUl9JT0MgfCBVU0JJTlRSX1NQKTsKKwkvKiBTdGFydCBhdCBmcmFtZSAwICovCisJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JGUk5VTSwwKTsKKwkvKiBzZXQgRnJhbWVidWZmZXIgYmFzZSBhZGRyZXNzICovCisJb3V0MzJyKHVzYl9iYXNlX2FkZHIrVVNCRkxCQVNFQURELCh1bnNpZ25lZCBsb25nKSZmcmFtZWxpc3QpOworCS8qIFJ1biBhbmQgbWFyayBpdCBjb25maWd1cmVkIHdpdGggYSA2NC1ieXRlIG1heCBwYWNrZXQgKi8KKwlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQkNNRCxVU0JDTURfUlMgfCBVU0JDTURfQ0YgfCBVU0JDTURfTUFYUCk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHNrZWxldG9uCisgKi8KK3ZvaWQgdXNiX2luaXRfc2tlbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwlpbnQgbjsKKworCWZvcihuPTA7bjxVU0JfTUFYX1RFTVBfSU5UX1REO24rKykKKwkJdG1wX2ludF90ZFtuXS5kZXZfcHRyPTBMOyAvKiBubyBkZXZpY2VzIGNvbm5lY3RlZCAqLworCS8qIGxhc3QgdGQgKi8KKwl1c2JfZmlsbF90ZCgmdGRfbGFzdCxVSENJX1BUUl9URVJNLFREX0NUUkxfSU9DICwwLDAsMEwpOworICAvKiB1c2JfZmlsbF90ZCgmdGRfbGFzdCxVSENJX1BUUl9URVJNLDAsMCwwKTsgKi8KKwkvKiBFbmQgUXVldWUgSGVhZGVyICovCisJdXNiX2ZpbGxfcWgoJnFoX2VuZCxVSENJX1BUUl9URVJNLCh1bnNpZ25lZCBsb25nKSZ0ZF9sYXN0KTsKKwkvKiBCdWxrIFF1ZXVlIEhlYWRlciAqLworCXRlbXA9KHVuc2lnbmVkIGxvbmcpJnFoX2VuZDsKKwl1c2JfZmlsbF9xaCgmcWhfYnVsayx0ZW1wIHwgVUhDSV9QVFJfUUgsVUhDSV9QVFJfVEVSTSk7CisJLyogQ29udHJvbCBRdWV1ZSBIZWFkZXIgKi8KKwl0ZW1wPSh1bnNpZ25lZCBsb25nKSZxaF9idWxrOworCXVzYl9maWxsX3FoKCZxaF9jbnRybCwgdGVtcCB8IFVIQ0lfUFRSX1FILFVIQ0lfUFRSX1RFUk0pOworCS8qIDFtcyBJbnRlcnJ1cHQgdGQgKi8KKwl0ZW1wPSh1bnNpZ25lZCBsb25nKSZxaF9jbnRybDsKKwl1c2JfZmlsbF90ZCgmdGRfaW50WzBdLHRlbXAgfCBVSENJX1BUUl9RSCwwLDAsMCwwTCk7CisJdGVtcD0odW5zaWduZWQgbG9uZykmdGRfaW50WzBdOworCWZvcihuPTE7IG48ODsgbisrKQorCQl1c2JfZmlsbF90ZCgmdGRfaW50W25dLHRlbXAsMCwwLDAsMEwpOworCWZvciAobiA9IDA7IG4gPCAxMDI0OyBuKyspIHsKKwkvKiBsaW5rIGFsbCBmcmFtZWxpc3QgcG9pbnRlcnMgdG8gb25lIG9mIHRoZSBpbnRlcnJ1cHRzICovCisJCWludCBtLCBvOworCQlpZiAoKG4mMTI3KT09MTI3KQorCQkJZnJhbWVsaXN0W25dPSBzd2FwXzMyKCh1bnNpZ25lZCBsb25nKSZ0ZF9pbnRbMF0pOworCQllbHNlCisJCQlmb3IgKG8gPSAxLCBtID0gMjsgbSA8PSAxMjg7IG8rKywgbSArPSBtKQorCQkJCWlmICgobiAmIChtIC0gMSkpID09ICgobSAtIDEpIC8gMikpCisJCQkJCQlmcmFtZWxpc3Rbbl09IHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRkX2ludFtvXSk7CisJfQorfQorCisvKiBjaGVjayB0aGUgY29tbW9uIHNrZWxldG9uIGZvciBjb21wbGV0ZWQgdHJhbnNmZXJzLCBhbmQgdXBkYXRlIHRoZSBzdGF0dXMKKyAqIG9mIHRoZSAiY29ubmVjdGVkIiBkZXZpY2UuIENhbGxlZCBmcm9tIHRoZSBJUlEgcm91dGluZS4KKyAqLwordm9pZCB1c2JfY2hlY2tfc2tlbCh2b2lkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJLyogc3RhcnQgd2l0aCB0aGUgY29udHJvbCBxaCAqLworCWlmKHFoX2NudHJsLmRldl9wdHIhPTApIC8qIGl0J3MgYSBkZXZpY2UgYXNzaWduZWQgY2hlY2sgaWYgdGhpcyBjYXVzZWQgSVJRICovCisJeworCQlkZXY9KHN0cnVjdCB1c2JfZGV2aWNlICopcWhfY250cmwuZGV2X3B0cjsKKwkJdXNiX2dldF90ZF9zdGF0dXMoJnRtcF90ZFswXSxkZXYpOyAvKiB1cGRhdGUgc3RhdHVzICovCisJCWlmKCEoZGV2LT5zdGF0dXMgJiBVU0JfU1RfTk9UX1BST0MpKSB7IC8qIGlzIG5vdCBhY3RpdmUgYW55bW9yZSwgZGlzY29ubmVjdCBkZXZpY2VzICovCisJCQlxaF9jbnRybC5kZXZfcHRyPTA7CisJCX0KKwl9CisJLyogbm93IHByb2Nlc3MgdGhlIGJ1bGsgKi8KKwlpZihxaF9idWxrLmRldl9wdHIhPTApIC8qIGl0J3MgYSBkZXZpY2UgYXNzaWduZWQgY2hlY2sgaWYgdGhpcyBjYXVzZWQgSVJRICovCisJeworCQlkZXY9KHN0cnVjdCB1c2JfZGV2aWNlICopcWhfYnVsay5kZXZfcHRyOworCQl1c2JfZ2V0X3RkX3N0YXR1cygmdG1wX3RkWzBdLGRldik7IC8qIHVwZGF0ZSBzdGF0dXMgKi8KKwkJaWYoIShkZXYtPnN0YXR1cyAmIFVTQl9TVF9OT1RfUFJPQykpIHsgLyogaXMgbm90IGFjdGl2ZSBhbnltb3JlLCBkaXNjb25uZWN0IGRldmljZXMgKi8KKwkJCXFoX2J1bGsuZGV2X3B0cj0wOworCQl9CisJfQorfQorCisvKiBjaGVjayB0aGUgaW50ZXJydXB0IGNoYWluLCB1YmRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlLAorICogY2FsbCB0aGUgYXBwcm9wcmlhdGUgaXJxaGFuZGxlciBhbmQgcmVhY3RpdmF0ZSB0aGUgVEQgaWYgdGhlIGlycWhhbmRsZXIKKyAqIHJldHVybnMgd2l0aCAxCisgKi8KK3ZvaWQgdXNiX2NoZWNrX2ludF9jaGFpbih2b2lkKQoreworCWludCBpLHJlczsKKwl1bnNpZ25lZCBsb25nIGxpbmssc3RhdHVzOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJdWhjaV90ZF90ICp0ZCwqcHJldnRkOworCisJZm9yKGk9MDtpPDg7aSsrKSB7CisJCXByZXZ0ZD0mdGRfaW50W2ldOyAvKiB0aGUgZmlyc3QgcHJldmlvdXMgdGQgaXMgdGhlIHNrZWxldG9uIHRkICovCisJCWxpbms9c3dhcF8zMih0ZF9pbnRbaV0ubGluaykgJiAweGZmZmZmZmYwOyAvKiBuZXh0IGluIGNoYWluICovCisJCXRkPSh1aGNpX3RkX3QgKilsaW5rOyAvKiBhc3NpZ24gaXQgKi8KKwkJLyogYWxsIGludGVycnVwdCBURHMgYXJlIGZpbmFsbHkgbGlua2VkIHRvIHRoZSB0ZF9pbnRbMF0uCisgCQkgKiBzbyB3ZSBwcm9jZXNzIGFsbCB1bnRpbCB3ZSBmaW5kIHRoZSB0ZF9pbnRbMF0uCisJCSAqIGlmIGludDAgY2hhaW4gcG9pbnRzIHRvIGEgUUgsIHdlJ3JlIGFsc28gZG9uZQorCSAgICovCisJCXdoaWxlKCgoaT4wKSAmJiAobGluayAhPSAodW5zaWduZWQgbG9uZykmdGRfaW50WzBdKSkgfHwKKwkJCQkJKChpPT0wKSAmJiAhKHN3YXBfMzIodGQtPmxpbmspICYgIFVIQ0lfUFRSX1FIKSkpCisJCXsKKwkJCS8qIGNoZWNrIGlmIGEgZGV2aWNlIGlzIGFzc2lnbmVkIHdpdGggdGhpcyB0ZCAqLworCQkJc3RhdHVzPXN3YXBfMzIodGQtPnN0YXR1cyk7CisJCQlpZigodGQtPmRldl9wdHIhPTBMKSAmJiAhKHN0YXR1cyAmIFREX0NUUkxfQUNUSVZFKSkgeworCQkJCS8qIHRkIGlzIG5vdCBhY3RpdmUgYW5kIGEgZGV2aWNlIGlzIGFzc2lnbmVkIC0+IGNhbGwgaXJxaGFuZGxlciAqLworCQkJCWRldj0oc3RydWN0IHVzYl9kZXZpY2UgKil0ZC0+ZGV2X3B0cjsKKwkJCQlkZXYtPmlycV9hY3RfbGVuPSgoc3RhdHVzICYgMHg3RkYpPT0weDdGRikgPyAwIDogKHN0YXR1cyAmIDB4N0ZGKSArIDE7IC8qIHRyYW5zZmVyZWQgbGVuZ3RoICovCisJCQkJZGV2LT5pcnFfc3RhdHVzPXVzYl91aGNpX3RkX3N0YXQoc3RhdHVzKTsgLyogZ2V0IHN0YXR1cyAqLworCQkJCXJlcz1kZXYtPmlycV9oYW5kbGUoZGV2KTsgLyogY2FsbCBpcnFoYW5kbGVyICovCisJCQkJaWYocmVzPT0xKSB7CisJCQkJCS8qIHJlYWN0aXZhdGUgKi8KKwkJCQkJc3RhdHVzfD1URF9DVFJMX0FDVElWRTsKKwkJCQkJdGQtPnN0YXR1cz1zd2FwXzMyKHN0YXR1cyk7CisJCQkJCXByZXZ0ZD10ZDsgLyogcHJldmlvdXMgdGQgPSB0aGlzIHRkICovCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwcmV2dGQtPmxpbms9dGQtPmxpbms7IC8qIGxpbmsgcHJldmlvdXMgdGQgZGlyZWN0bHkgdG8gdGhlIG5leCB0ZCAtPiB1bmxpbmtlZCAqLworCQkJCQkvKiByZW1vdmUgZGV2aWNlIHBvaW50ZXIgKi8KKwkJCQkJdGQtPmRldl9wdHI9MEw7CisJCQkJfQorCQkJfSAvKiBpZiB3ZSBjYWxsIHRoZSBpcnEgaGFuZGxlciAqLworCQkJbGluaz1zd2FwXzMyKHRkLT5saW5rKSAmIDB4ZmZmZmZmZjA7IC8qIG5leHQgaW4gY2hhaW4gKi8KKwkJCXRkPSh1aGNpX3RkX3QgKilsaW5rOyAvKiBhc3NpZ24gaXQgKi8KKwkJfSAvKiBwcm9jZXNzIGFsbCB0ZCBpbiB0aGlzIGludCBjaGFpbiAqLworCX0gLyogbmV4dCBpbnRlcnJ1cHQgY2hhaW4gKi8KK30KKworCisvKiB1c2IgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqLwordm9pZCBoYW5kbGVfdXNiX2ludGVycnVwdCh2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworCS8qCisJICogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cywgYW5kIHdyaXRlIGl0IGJhY2sgdG8gY2xlYXIgdGhlCisJICogaW50ZXJydXB0IGNhdXNlCisJICovCisKKwlzdGF0dXMgPSBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCU1RTKTsKKworCWlmICghc3RhdHVzKQkJLyogc2hhcmVkIGludGVycnVwdCwgbm90IG1pbmUgKi8KKwkJcmV0dXJuOworCWlmIChzdGF0dXMgIT0gMSkgeworCQkvKiByZW1vdmUgaG9zdCBjb250cm9sbGVyIGhhbHRlZCBzdGF0ZSAqLworCQlpZiAoKHN0YXR1cyYweDIwKSAmJiAoKGluMTZyKHVzYl9iYXNlX2FkZHIrVVNCQ01EKSAmJiBVU0JDTURfUlMpPT0wKSkgeworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JDTUQsIFVTQkNNRF9SUyB8IGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JDTUQpKTsKKwkJfQorCX0KKwl1c2JfY2hlY2tfaW50X2NoYWluKCk7IC8qIGNhbGwgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBpbnQgdGRzICovCisJdXNiX2NoZWNrX3NrZWwoKTsgLyogY2FsbCBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGNvbW1vbiB0cmFuc2ZlciByb3V0aW5lcyAqLworCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlNUUyxzdGF0dXMpOworfQorCisKKy8qIGluaXQgdWhjaQorICovCitpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisJaW50CWJ1c2RldmZ1bmM7CisvKgorICogSEpGIC0gY29uZmlndXJlIElSUSBhbmQgYmFzZSBmcm9tIHZhcmlhYmxlcyBvcHRpb25hbGx5LgorICovCisJY2hhciAqczsKKworCisJYnVzZGV2ZnVuYz1wY2lfZmluZF9kZXZpY2UoVVNCX1VIQ0lfVkVORF9JRCxVU0JfVUhDSV9ERVZfSUQsMCk7IC8qIGdldCBQQ0kgRGV2aWNlIElEICovCisJaWYoYnVzZGV2ZnVuYz09LTEpIHsKKwkJcHJpbnRmKCJFcnJvciBVU0IgVUhDSSAoJTA0WCwlMDRYKSBub3QgZm91bmRcbiIsVVNCX1VIQ0lfVkVORF9JRCxVU0JfVUhDSV9ERVZfSUQpOworCQlyZXR1cm4gLTE7CisJfQorCQorI2lmIDEKKwlzID0gZ2V0ZW52KCJ1c2JfaXJxIik7CisJaWYgKHMpCisJeworCSAgICB0ZW1wID0gYXRvaShzKTsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ1c2RldmZ1bmMsIFBDSV9JTlRFUlJVUFRfTElORSwgdGVtcCk7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShidXNkZXZmdW5jLFBDSV9JTlRFUlJVUFRfTElORSwmdGVtcCk7CisKKwlzID0gZ2V0ZW52KCJ1c2JfYmFzZSIpOworCWlmIChzKQorCXsKKwkgICAgdW5zaWduZWQgbG9uZyB0ZW1wMjsKKwkgICAgdGVtcDIgPSBhdG9pKHMpOworCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJ1c2RldmZ1bmMsIFBDSV9CQVNFX0FERFJFU1NfNCwgdGVtcDJ8MHgwMSk7CisJfQorCisJaXJxdmVjID0gdGVtcDsKKwlpcnFfZnJlZV9oYW5kbGVyKGlycXZlYyk7CisJVVNCX1VIQ0lfUFJJTlRGKCJJbnRlcnJ1cHQgTGluZSA9ICVkXG4iLGlycXZlYyk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYnVzZGV2ZnVuYyxQQ0lfSU5URVJSVVBUX1BJTiwmdGVtcCk7CisJVVNCX1VIQ0lfUFJJTlRGKCJJbnRlcnJ1cHQgUGluID0gJWxkXG4iLHRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChidXNkZXZmdW5jLFBDSV9CQVNFX0FERFJFU1NfNCwmdXNiX2Jhc2VfYWRkcik7CisJVVNCX1VIQ0lfUFJJTlRGKCJJTyBCYXNlIEFkZHJlc3MgPSAweCVseFxuIix1c2JfYmFzZV9hZGRyKTsKKwl1c2JfYmFzZV9hZGRyJj0weEZGRkZGRkYwOworCXVzYl9iYXNlX2FkZHIrPUNGR19JU0FfSU9fQkFTRV9BRERSRVNTOworCXJoLmRldm51bSA9IDA7CisJdXNiX2luaXRfc2tlbCgpOworCXJlc2V0X2hjKCk7CisJc3RhcnRfaGMoKTsKKwlpcnFfaW5zdGFsbF9oYW5kbGVyKGlycXZlYywgKGludGVycnVwdF9oYW5kbGVyX3QgKiloYW5kbGVfdXNiX2ludGVycnVwdCwgTlVMTCk7CisJaXJxX2luc3RhbGxfaGFuZGxlcigwLCAoaW50ZXJydXB0X2hhbmRsZXJfdCAqKWhhbmRsZV91c2JfaW50ZXJydXB0LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKiBzdG9wIHVoY2kKKyAqLworaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCit7CisJaWYoaXJxdmVjPT0tMSkKKwkJcmV0dXJuIDE7CisJaXJxX2ZyZWVfaGFuZGxlcihpcnF2ZWMpOworCWlycV9mcmVlX2hhbmRsZXIoMCk7CisJcmVzZXRfaGMoKTsKKwlpcnF2ZWM9LTE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaXJ0dWFsIFJvb3QgSHViCisgKiBTaW5jZSB0aGUgdWhjaSBkb2VzIG5vdCBoYXZlIGEgcmVhbCBIVUIsIHdlIHNpbXVsYXRlIG9uZSA7LSkKKyAqLworI3VuZGVmCVVTQl9SSF9ERUJVRworCisjaWZkZWYJVVNCX1JIX0RFQlVHCisjZGVmaW5lCVVTQl9SSF9QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV93VmFsdWUodW5zaWduZWQgc2hvcnQgd1ZhbHVlLHVuc2lnbmVkIHNob3J0IHdJbmRleCk7CitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV9SZXEodW5zaWduZWQgc2hvcnQgcmVxKTsKKyNlbHNlCisjZGVmaW5lIFVTQl9SSF9QUklOVEYoZm10LGFyZ3MuLi4pCitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV93VmFsdWUodW5zaWduZWQgc2hvcnQgd1ZhbHVlLHVuc2lnbmVkIHNob3J0IHdJbmRleCkge30KK3N0YXRpYyB2b2lkIHVzYl9kaXNwbGF5X1JlcSh1bnNpZ25lZCBzaG9ydCByZXEpIHt9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfZGV2X2Rlc1tdID0KK3sKKwkweDEyLAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgwMCwJCQkvKiAgX191MTYgYmNkVVNCOyB2MS4wICovCisJMHgwMSwKKwkweDA5LAkJCS8qICBfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJCQkvKiAgX191OCAgYkRldmljZVByb3RvY29sOyAqLworCTB4MDgsCQkJLyogIF9fdTggIGJNYXhQYWNrZXRTaXplMDsgOCBCeXRlcyAqLworCTB4MDAsCQkJLyogIF9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgaWRQcm9kdWN0OyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgYmNkRGV2aWNlOyAqLworCTB4MDAsCisJMHgwMSwJCQkvKiAgX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpUHJvZHVjdDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpU2VyaWFsTnVtYmVyOyAqLworCTB4MDEJCQkvKiAgX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworCisvKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Cit7CisJMHgwOSwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAyLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IENvbmZpZ3VyYXRpb24gKi8KKwkweDE5LAkJCS8qICBfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkJCS8qICBfX3U4ICBiTnVtSW50ZXJmYWNlczsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCQkJLyogIF9fdTggIGJtQXR0cmlidXRlczsKKwkJCQkgICBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCQkJLyogIF9fdTggIE1heFBvd2VyOyAqLworCisgICAgIC8qIGludGVyZmFjZSAqLworCTB4MDksCQkJLyogIF9fdTggIGlmX2JMZW5ndGg7ICovCisJMHgwNCwJCQkvKiAgX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JBbHRlcm5hdGVTZXR0aW5nOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCisJMHgwOSwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZVN1YkNsYXNzOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisgICAgIC8qIGVuZHBvaW50ICovCisJMHgwNywJCQkvKiAgX191OCAgZXBfYkxlbmd0aDsgKi8KKwkweDA1LAkJCS8qICBfX3U4ICBlcF9iRGVzY3JpcHRvclR5cGU7IEVuZHBvaW50ICovCisJMHg4MSwJCQkvKiAgX191OCAgZXBfYkVuZHBvaW50QWRkcmVzczsgSU4gRW5kcG9pbnQgMSAqLworCTB4MDMsCQkJLyogIF9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCisJMHgwOCwJCQkvKiAgX191MTYgZXBfd01heFBhY2tldFNpemU7IDggQnl0ZXMgKi8KKwkweDAwLAorCTB4ZmYJCQkvKiAgX191OCAgZXBfYkludGVydmFsOyAyNTUgbXMgKi8KK307CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfaHViX2Rlc1tdID0KK3sKKwkweDA5LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MjksCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgSHViLWRlc2NyaXB0b3IgKi8KKwkweDAyLAkJCS8qICBfX3U4ICBiTmJyUG9ydHM7ICovCisJMHgwMCwJCQkvKiBfX3UxNiAgd0h1YkNoYXJhY3RlcmlzdGljczsgKi8KKwkweDAwLAorCTB4MDEsCQkJLyogIF9fdTggIGJQd3JPbjJwd3JHb29kOyAybXMgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBiSHViQ29udHJDdXJyZW50OyAwIG1BICovCisJMHgwMCwJCQkvKiAgX191OCAgRGV2aWNlUmVtb3ZhYmxlOyAqKiogNyBQb3J0cyBtYXggKioqICovCisJMHhmZgkJCS8qICBfX3U4ICBQb3J0UHdyQ3RybE1hc2s7ICoqKiA3IHBvcnRzIG1heCAqKiogKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDBbXSA9Cit7CisJMHgwNCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJMHgwOSwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworCTB4MDQsCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDFbXSA9Cit7CisJMjgsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLworCSdVJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknQycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdJJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknUicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdiJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCit9OworCisKKy8qCisgKiBSb290IEh1YiBDb250cm9sIFBpcGUgKGludGVycnVwdCBQaXBlcyBhcmUgbm90IHN1cHBvcnRlZCkKKyAqLworCisKK2ludCB1aGNpX3N1Ym1pdF9yaF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsaW50IHRyYW5zZmVyX2xlbixzdHJ1Y3QgZGV2cmVxdWVzdCAqY21kKQoreworCXZvaWQgKmRhdGEgPSBidWZmZXI7CisJaW50IGxlbmkgPSB0cmFuc2Zlcl9sZW47CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IHN0YXQgPSAwOworCWludCBpOworCisJdW5zaWduZWQgc2hvcnQgY3N0YXR1czsKKworCXVuc2lnbmVkIHNob3J0IGJtUlR5cGVfYlJlcTsKKwl1bnNpZ25lZCBzaG9ydCB3VmFsdWU7CisJdW5zaWduZWQgc2hvcnQgd0luZGV4OworCXVuc2lnbmVkIHNob3J0IHdMZW5ndGg7CisKKwlpZiAoKHBpcGUgJiBQSVBFX0lOVEVSUlVQVCkgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJcHJpbnRmKCJSb290LUh1YiBzdWJtaXQgSVJROiBOT1QgaW1wbGVtZW50ZWRcbiIpOworI2lmIDAKKwkJdWhjaS0+cmgudXJiID0gdXJiOworCQl1aGNpLT5yaC5zZW5kID0gMTsKKwkJdWhjaS0+cmguaW50ZXJ2YWwgPSB1cmItPmludGVydmFsOworCQlyaF9pbml0X2ludF90aW1lciAodXJiKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJYm1SVHlwZV9iUmVxID0gY21kLT5yZXF1ZXN0dHlwZSB8IGNtZC0+cmVxdWVzdCA8PCA4OworCXdWYWx1ZSA9IHN3YXBfMTYoY21kLT52YWx1ZSk7CisJd0luZGV4ID0gc3dhcF8xNihjbWQtPmluZGV4KTsKKwl3TGVuZ3RoID0gc3dhcF8xNihjbWQtPmxlbmd0aCk7CisJdXNiX2Rpc3BsYXlfUmVxKGJtUlR5cGVfYlJlcSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmguY19wX3JbaV0gPSAwOworCVVTQl9SSF9QUklOVEYoIlJvb3QtSHViOiBhZHI6ICUyeCBjbWQoJTF4KTogJTAyeCUwMnggJTA0eCAlMDR4ICUwNHhcbiIsCisJICAgICBkZXYtPmRldm51bSwgOCwgY21kLT5yZXF1ZXN0dHlwZSxjbWQtPnJlcXVlc3QsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoKTsKKworCXN3aXRjaCAoYm1SVHlwZV9iUmVxKSB7CisJCS8qIFJlcXVlc3QgRGVzdGluYXRpb246CisJCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKKwkJICAgUkhfSU5URVJGQUNFOiBpbnRlcmZhY2UsCisJCSAgIFJIX0VORFBPSU5UOiBlbmRwb2ludCwKKwkJICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCisJCSAgIFJIX09USEVSIHwgUkhfQ0xBU1MgIGFsbW9zdCBldmVyIG1lYW5zIEhVQl9QT1JUIGhlcmUKKwkJICovCisKKwljYXNlIFJIX0dFVF9TVEFUVVM6CisJCSoodW5zaWduZWQgc2hvcnQgKikgZGF0YSA9IHN3YXBfMTYoMSk7CisJCWxlbj0yOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCSoodW5zaWduZWQgc2hvcnQgKikgZGF0YSA9IHN3YXBfMTYoMCk7CisJCWxlbj0yOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9FTkRQT0lOVDoKKwkJKih1bnNpZ25lZCBzaG9ydCAqKSBkYXRhID0gc3dhcF8xNigwKTsKKwkJbGVuPTI7CisJCWJyZWFrOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTOgorCQkqKHVuc2lnbmVkIGxvbmcgKikgZGF0YSA9IHN3YXBfMzIoMCk7CisJCWxlbj00OworCQlicmVhazsJLyogaHViIHBvd2VyICoqICovCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKworCQlzdGF0dXMgPSBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSkpOworCQljc3RhdHVzID0gKChzdGF0dXMgJiBVU0JQT1JUU0NfQ1NDKSA+PiAoMSAtIDApKSB8CisJCQkoKHN0YXR1cyAmIFVTQlBPUlRTQ19QRUMpID4+ICgzIC0gMSkpIHwKKwkJCShyaC5jX3Bfclt3SW5kZXggLSAxXSA8PCAoMCArIDQpKTsKKwkJc3RhdHVzID0gKHN0YXR1cyAmIFVTQlBPUlRTQ19DQ1MpIHwKKwkJCSgoc3RhdHVzICYgVVNCUE9SVFNDX1BFKSA+PiAoMiAtIDEpKSB8CisJCQkoKHN0YXR1cyAmIFVTQlBPUlRTQ19TVVNQKSA+PiAoMTIgLSAyKSkgfAorCQkJKChzdGF0dXMgJiBVU0JQT1JUU0NfUFIpID4+ICg5IC0gNCkpIHwKKwkJCSgxIDw8IDgpIHwJLyogcG93ZXIgb24gKiogKi8KKwkJCSgoc3RhdHVzICYgVVNCUE9SVFNDX0xTREEpIDw8ICgtOCArIDkpKTsKKworCQkqKHVuc2lnbmVkIHNob3J0ICopIGRhdGEgPSBzd2FwXzE2KHN0YXR1cyk7CisJCSoodW5zaWduZWQgc2hvcnQgKikgKGRhdGEgKyAyKSA9IHN3YXBfMTYoY3N0YXR1cyk7CisJCWxlbj00OworCQlicmVhazsKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSAoUkhfRU5EUE9JTlRfU1RBTEwpOgorCQkJbGVuPTA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgorCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChSSF9DX0hVQl9PVkVSX0NVUlJFTlQpOgorCQkJbGVuPTA7CS8qIGh1YiBwb3dlciBvdmVyIGN1cnJlbnQgKiogKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJdXNiX2Rpc3BsYXlfd1ZhbHVlKHdWYWx1ZSx3SW5kZXgpOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6CisJCQlzdGF0dXMgPSBpbjE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpICYgflVTQlBPUlRTQ19QRTsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJc3RhdHVzID0gaW4xNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSAmIH5VU0JQT1JUU0NfU1VTUDsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCWxlbj0wOwkvKiBwb3J0IHBvd2VyICoqICovCisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX0NPTk5FQ1RJT04pOgorCQkJc3RhdHVzID0gaW4xNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19DU0M7CisJCQlvdXQxNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSxzdGF0dXMpOworCQkJbGVuPTA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6CisJCQlzdGF0dXMgPSBpbjE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpIHwgVVNCUE9SVFNDX1BFQzsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisvKioqIFdSX1JIX1BPUlRTVEFUKFJIX1BTX1BTU0MpOyAqLworCQkJbGVuPTA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9DX1BPUlRfUkVTRVQpOgorCQkJcmguY19wX3Jbd0luZGV4IC0gMV0gPSAwOworCQkJbGVuPTA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJdXNiX2Rpc3BsYXlfd1ZhbHVlKHdWYWx1ZSx3SW5kZXgpOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJc3RhdHVzID0gaW4xNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19TVVNQOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIrVVNCUE9SVFNDMSsyKih3SW5kZXgtMSksc3RhdHVzKTsKKwkJCWxlbj0wOworCQkJYnJlYWs7CisJCWNhc2UgKFJIX1BPUlRfUkVTRVQpOgorCQkJc3RhdHVzID0gaW4xNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19QUjsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQl3YWl0X21zKDEwKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpICYgflVTQlBPUlRTQ19QUjsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQl1ZGVsYXkoMTApOworCQkJc3RhdHVzID0gKHN0YXR1cyAmIDB4ZmZmNSkgfCBVU0JQT1JUU0NfUEU7CisJCQlvdXQxNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSxzdGF0dXMpOworCQkJd2FpdF9tcygxMCk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IDB4YTsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCWxlbj0wOwkvKiBwb3J0IHBvd2VyICoqICovCisJCQlicmVhazsKKwkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgorCQkJc3RhdHVzID0gaW4xNnIodXNiX2Jhc2VfYWRkcitVU0JQT1JUU0MxKzIqKHdJbmRleC0xKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19QRTsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyK1VTQlBPUlRTQzErMiood0luZGV4LTEpLHN0YXR1cyk7CisJCQlsZW49MDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzoKKwkJcmguZGV2bnVtID0gd1ZhbHVlOworCQlsZW49MDsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUjoKKwkJc3dpdGNoICgod1ZhbHVlICYgMHhmZjAwKSA+PiA4KSB7CisJCWNhc2UgKDB4MDEpOgkvKiBkZXZpY2UgZGVzY3JpcHRvciAqLworCQkJaT1zaXplb2Yocm9vdF9odWJfY29uZmlnX2Rlcyk7CisJCQlzdGF0dXM9aSA+IHdMZW5ndGggPyB3TGVuZ3RoIDogaTsKKwkJCWxlbiA9IGxlbmkgPiBzdGF0dXMgPyBzdGF0dXMgOiBsZW5pOworCQkJbWVtY3B5IChkYXRhLCByb290X2h1Yl9kZXZfZGVzLCBsZW4pOworCQkJYnJlYWs7CisJCWNhc2UgKDB4MDIpOgkvKiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KKwkJCWk9c2l6ZW9mKHJvb3RfaHViX2NvbmZpZ19kZXMpOworCQkJc3RhdHVzPWkgPiB3TGVuZ3RoID8gd0xlbmd0aCA6IGk7CisJCQlsZW4gPSBsZW5pID4gc3RhdHVzID8gc3RhdHVzIDogbGVuaTsKKwkJCW1lbWNweSAoZGF0YSwgcm9vdF9odWJfY29uZmlnX2RlcywgbGVuKTsKKwkJCWJyZWFrOworCQljYXNlICgweDAzKToJLypzdHJpbmcgZGVzY3JpcHRvcnMgKi8KKwkJCWlmKHdWYWx1ZT09MHgwMzAwKSB7CisJCQkJaT1zaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MCk7CisJCQkJc3RhdHVzID0gaSA+IHdMZW5ndGggPyB3TGVuZ3RoIDogaTsKKwkJCQlsZW4gPSBsZW5pID4gc3RhdHVzID8gc3RhdHVzIDogbGVuaTsKKwkJCQltZW1jcHkgKGRhdGEsIHJvb3RfaHViX3N0cl9pbmRleDAsIGxlbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZih3VmFsdWU9PTB4MDMwMSkgeworCQkJCWk9c2l6ZW9mKHJvb3RfaHViX3N0cl9pbmRleDEpOworCQkJCXN0YXR1cyA9IGkgPiB3TGVuZ3RoID8gd0xlbmd0aCA6IGk7CisJCQkJbGVuID0gbGVuaSA+IHN0YXR1cyA/IHN0YXR1cyA6IGxlbmk7CisJCQkJbWVtY3B5IChkYXRhLCByb290X2h1Yl9zdHJfaW5kZXgxLCBsZW4pOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCQlyb290X2h1Yl9odWJfZGVzWzJdID0gMjsKKwkJaT1zaXplb2Yocm9vdF9odWJfaHViX2Rlcyk7CisJCXN0YXR1cz0gaSA+IHdMZW5ndGggPyB3TGVuZ3RoIDogaTsKKwkJbGVuID0gbGVuaSA+IHN0YXR1cyA/IHN0YXR1cyA6IGxlbmk7CisJCW1lbWNweSAoZGF0YSwgcm9vdF9odWJfaHViX2RlcywgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoKKwkJKih1bnNpZ25lZCBjaGFyICopIGRhdGEgPSAweDAxOworCQlsZW4gPSAxOworCQlicmVhazsKKwljYXNlIFJIX1NFVF9DT05GSUdVUkFUSU9OOgorCQlsZW49MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCX0KKwlVU0JfUkhfUFJJTlRGKCJSb290LUh1YiBzdGF0ICVseCBwb3J0MTogJXggcG9ydDI6ICV4XG5cbiIsc3RhdCwKKwkgICAgIGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxKSwgaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzIpKTsKKwlkZXYtPmFjdF9sZW49bGVuOworCWRldi0+c3RhdHVzPXN0YXQ7CisJcmV0dXJuIHN0YXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb21lIERlYnVnIFJvdXRpbmVzCisgKi8KKworI2lmZGVmCVVTQl9SSF9ERUJVRworCitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV9SZXEodW5zaWduZWQgc2hvcnQgcmVxKQoreworCVVTQl9SSF9QUklOVEYoIi0gUm9vdC1IdWIgUmVxdWVzdDogIik7CisJc3dpdGNoIChyZXEpIHsKKwljYXNlIFJIX0dFVF9TVEFUVVM6CisJCVVTQl9SSF9QUklOVEYoIkdldCBTdGF0dXMgIik7CisJCWJyZWFrOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKKwkJVVNCX1JIX1BSSU5URigiR2V0IFN0YXR1cyBJbnRlcmZhY2UgIik7CisJCWJyZWFrOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgU3RhdHVzIEVuZHBvaW50ICIpOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9DTEFTUzoKKwkJVVNCX1JIX1BSSU5URigiR2V0IFN0YXR1cyBDbGFzcyIpOworCQlicmVhazsJLyogaHViIHBvd2VyICoqICovCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJVVNCX1JIX1BSSU5URigiR2V0IFN0YXR1cyBDbGFzcyBPdGhlcnMiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6CisJCVVTQl9SSF9QUklOVEYoIkNsZWFyIEZlYXR1cmUgRW5kcG9pbnQgIik7CisJCWJyZWFrOworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJDbGVhciBGZWF0dXJlIENsYXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJDbGVhciBGZWF0dXJlIE90aGVyIENsYXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJVVNCX1JIX1BSSU5URigiU2V0IEZlYXR1cmUgT3RoZXIgQ2xhc3MgIik7CisJCWJyZWFrOworCWNhc2UgUkhfU0VUX0FERFJFU1M6CisJCVVTQl9SSF9QUklOVEYoIlNldCBBZGRyZXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgRGVzY3JpcHRvciAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgRGVzY3JpcHRvciBDbGFzcyAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoKKwkJVVNCX1JIX1BSSU5URigiR2V0IENvbmZpZ3VyYXRpb24gIik7CisJCWJyZWFrOworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CisJCVVTQl9SSF9QUklOVEYoIkdldCBDb25maWd1cmF0aW9uICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlVU0JfUkhfUFJJTlRGKCIqKioqVU5LTk9XTioqKiogMHglMDRYICIscmVxKTsKKwl9CisJVVNCX1JIX1BSSU5URigiXG4iKTsKKworfQorCitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV93VmFsdWUodW5zaWduZWQgc2hvcnQgd1ZhbHVlLHVuc2lnbmVkIHNob3J0IHdJbmRleCkKK3sKKwlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6CisJCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogRW5hYmxlIFBvcnQgJWRcbiIsd0luZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJVVNCX1JIX1BSSU5URigiUm9vdC1IdWI6IFN1c3BlbmQgUG9ydCAlZFxuIix3SW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQkJVVNCX1JIX1BSSU5URigiUm9vdC1IdWI6IFBvcnQgUG93ZXIgJWRcbiIsd0luZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIChSSF9DX1BPUlRfQ09OTkVDVElPTik6CisJCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogQyBQb3J0IENvbm5lY3Rpb24gUG9ydCAlZFxuIix3SW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgKFJIX0NfUE9SVF9FTkFCTEUpOgorCQkJVVNCX1JIX1BSSU5URigiUm9vdC1IdWI6IEMgUG9ydCBFbmFibGUgUG9ydCAlZFxuIix3SW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgKFJIX0NfUE9SVF9TVVNQRU5EKToKKwkJCVVTQl9SSF9QUklOVEYoIlJvb3QtSHViOiBDIFBvcnQgU3VzcGVuZCBQb3J0ICVkXG4iLHdJbmRleCk7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogQyBQb3J0IE92ZXIgQ3VycmVudCBQb3J0ICVkXG4iLHdJbmRleCk7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCVVTQl9SSF9QUklOVEYoIlJvb3QtSHViOiBDIFBvcnQgcmVzZXQgUG9ydCAlZFxuIix3SW5kZXgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogdW5rbm93biAleCAleFxuIix3VmFsdWUsd0luZGV4KTsKKwkJCWJyZWFrOworCX0KK30KKworI2VuZGlmCisKKworCisjaWZkZWYJVVNCX1VIQ0lfREVCVUcKKworc3RhdGljIGludCB1c2JfZGlzcGxheV90ZCh1aGNpX3RkX3QgKnRkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCB2YWxpZDsKKworCXByaW50ZigiVEQgYXQgJXA6XG4iLHRkKTsKKworCXRtcD1zd2FwXzMyKHRkLT5saW5rKTsKKwlwcmludGYoIkxpbmsgcG9pbnRzIHRvIDB4JTA4bFgsICVzIGZpcnN0LCAlcywgJXNcbiIsdG1wJjB4ZmZmZmZmZjAsCisJCSgodG1wICYgMHg0KT09MHg0KSA/ICJEZXB0aCIgOiAiQnJlYXRoIiwKKwkJKCh0bXAgJiAweDIpPT0weDIpID8gIlFIIiA6ICJURCIsCisJCSgodG1wICYgMHgxKT09MHgxKSA/ICJpbnZhbGlkIiA6ICJ2YWxpZCIpOworCXZhbGlkPSgodG1wICYgMHgxKT09MHgwKTsKKwl0bXA9c3dhcF8zMih0ZC0+c3RhdHVzKTsKKwlwcmludGYoIiAgICAgJXMgJWxkIEVycm9ycyAlcyAlcyAlcyBcbiAgICAgJXMgJXMgJXMgJXMgJXMgJXNcbiAgICAgTGVuIDB4JWxYXG4iLAorCQkoKCh0bXA+PjI5KSYweDEpPT0weDEpID8gIlNQRCBFbmFibGUiIDogIlNQRCBEaXNhYmxlIiwKKwkJKCh0bXA+PjI4KSYweDMpLAorCQkoKCh0bXA+PjI2KSYweDEpPT0weDEpID8gIkxvdyBTcGVlZCIgOiAiRnVsbCBTcGVlZCIsCisJCSgoKHRtcD4+MjUpJjB4MSk9PTB4MSkgPyAiSVNPICIgOiAiIiwKKwkJKCgodG1wPj4yNCkmMHgxKT09MHgxKSA/ICJJT0MgIiA6ICIiLAorCQkoKCh0bXA+PjIzKSYweDEpPT0weDEpID8gIkFjdGl2ZSAiIDogIkluYWN0aXZlICIsCisJCSgoKHRtcD4+MjIpJjB4MSk9PTB4MSkgPyAiU3RhbGxlZCIgOiAiIiwKKwkJKCgodG1wPj4yMSkmMHgxKT09MHgxKSA/ICJEYXRhIEJ1ZmZlciBFcnJvciIgOiAiIiwKKwkJKCgodG1wPj4yMCkmMHgxKT09MHgxKSA/ICJCYWJibGUiIDogIiIsCisJCSgoKHRtcD4+MTkpJjB4MSk9PTB4MSkgPyAiTkFLIiA6ICIiLAorCQkoKCh0bXA+PjE4KSYweDEpPT0weDEpID8gIkJpdHN0dWZmIEVycm9yIiA6ICIiLAorCQkodG1wJjB4N2ZmKSk7CisJdG1wPXN3YXBfMzIodGQtPmluZm8pOworCXByaW50ZigiICAgICBNYXhMZW4gMHglbFhcbiIsKCh0bXA+PjIxKSYweDdGRikpOworCXByaW50ZigiICAgICAlcyBFbmRwb2ludCAweCVsWCBEZXYgQWRkciAweCVsWCBQSUQgMHglbFhcbiIsKCh0bXA+PjE5KSYweDEpPT0weDEgPyAiVE9HR0xFIiA6ICIiLAorCQkoKHRtcD4+MTUpJjB4RiksKCh0bXA+PjgpJjB4N0YpLHRtcCYweEZGKTsKKwl0bXA9c3dhcF8zMih0ZC0+YnVmZmVyKTsKKwlwcmludGYoIiAgICAgQnVmZmVyIDB4JTA4bFhcbiIsdG1wKTsKKwlwcmludGYoIiAgICAgREVWICUwOGxYXG4iLHRkLT5kZXZfcHRyKTsKKwlyZXR1cm4gdmFsaWQ7Cit9CisKKwordm9pZCB1c2Jfc2hvd190ZChpbnQgbWF4KQoreworCWludCBpOworCWlmKG1heD4wKSB7CisJCWZvcihpPTA7aTxtYXg7aSsrKSB7CisJCQl1c2JfZGlzcGxheV90ZCgmdG1wX3RkW2ldKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJaT0wOworCQlkbyB7CisJCQlwcmludGYoInRtcF90ZFslZF1cbiIsaSk7CisJCX13aGlsZSh1c2JfZGlzcGxheV90ZCgmdG1wX3RkW2krK10pKTsKKwl9Cit9CisKKworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1VTQl9VSENJICovCisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91c2JfdWhjaS5oIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS91c2JfdWhjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGE2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3VzYl91aGNpLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBOb3RlOiBQYXJ0IG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gbGludXgKKyAqCisgKi8KKyNpZm5kZWYgX1VTQl9VSENJX0hfCisjZGVmaW5lIF9VU0JfVUhDSV9IXworCisjdW5kZWYgVVNCX1VIQ0lfVkVORF9JRAorI2RlZmluZSBVU0JfVUhDSV9WRU5EX0lEIFBDSV9WRU5ET1JfSURfVklBCisjdW5kZWYgVVNCX1VIQ0lfREVWX0lECisjZGVmaW5lIFVTQl9VSENJX0RFVl9JRCAweDMwMzgKKworLyogQ29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBVU0JDTUQJCTAKKyNkZWZpbmUgICBVU0JDTURfUlMgICAgICAgMHgwMDAxCS8qIFJ1bi9TdG9wICovCisjZGVmaW5lICAgVVNCQ01EX0hDUkVTRVQgIDB4MDAwMgkvKiBIb3N0IHJlc2V0ICovCisjZGVmaW5lICAgVVNCQ01EX0dSRVNFVCAgIDB4MDAwNAkvKiBHbG9iYWwgcmVzZXQgKi8KKyNkZWZpbmUgICBVU0JDTURfRUdTTSAgICAgMHgwMDA4CS8qIEdsb2JhbCBTdXNwZW5kIE1vZGUgKi8KKyNkZWZpbmUgICBVU0JDTURfRkdSICAgICAgMHgwMDEwCS8qIEZvcmNlIEdsb2JhbCBSZXN1bWUgKi8KKyNkZWZpbmUgICBVU0JDTURfU1dEQkcgICAgMHgwMDIwCS8qIFNXIERlYnVnIG1vZGUgKi8KKyNkZWZpbmUgICBVU0JDTURfQ0YgICAgICAgMHgwMDQwCS8qIENvbmZpZyBGbGFnIChzdyBvbmx5KSAqLworI2RlZmluZSAgIFVTQkNNRF9NQVhQICAgICAweDAwODAJLyogTWF4IFBhY2tldCAoMCA9IDMyLCAxID0gNjQpICovCisKKy8qIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBVU0JTVFMJCTIKKyNkZWZpbmUgICBVU0JTVFNfVVNCSU5UICAgMHgwMDAxCS8qIEludGVycnVwdCBkdWUgdG8gSU9DICovCisjZGVmaW5lICAgVVNCU1RTX0VSUk9SICAgIDB4MDAwMgkvKiBJbnRlcnJ1cHQgZHVlIHRvIGVycm9yICovCisjZGVmaW5lICAgVVNCU1RTX1JEICAgICAgIDB4MDAwNAkvKiBSZXN1bWUgRGV0ZWN0ICovCisjZGVmaW5lICAgVVNCU1RTX0hTRSAgICAgIDB4MDAwOAkvKiBIb3N0IFN5c3RlbSBFcnJvciAtIGJhc2ljYWxseSBQQ0kgcHJvYmxlbXMgKi8KKyNkZWZpbmUgICBVU0JTVFNfSENQRSAgICAgMHgwMDEwCS8qIEhvc3QgQ29udHJvbGxlciBQcm9jZXNzIEVycm9yIC0gdGhlIHNjcmlwdHMgd2VyZSBidWdneSAqLworI2RlZmluZSAgIFVTQlNUU19IQ0ggICAgICAweDAwMjAJLyogSEMgSGFsdGVkICovCisKKy8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNCSU5UUgkJNAorI2RlZmluZSAgIFVTQklOVFJfVElNRU9VVCAweDAwMDEJLyogVGltZW91dC9DUkMgZXJyb3IgZW5hYmxlICovCisjZGVmaW5lICAgVVNCSU5UUl9SRVNVTUUgIDB4MDAwMgkvKiBSZXN1bWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIFVTQklOVFJfSU9DICAgICAweDAwMDQJLyogSW50ZXJydXB0IE9uIENvbXBsZXRlIGVuYWJsZSAqLworI2RlZmluZSAgIFVTQklOVFJfU1AgICAgICAweDAwMDgJLyogU2hvcnQgcGFja2V0IGludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBVU0JGUk5VTSAgICAgIDYKKyNkZWZpbmUgVVNCRkxCQVNFQUREICA4CisjZGVmaW5lIFVTQlNPRiAgICAgICAgMTIKKworLyogVVNCIHBvcnQgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBVU0JQT1JUU0MxCTE2CisjZGVmaW5lIFVTQlBPUlRTQzIJMTgKKyNkZWZpbmUgICBVU0JQT1JUU0NfQ0NTICAgMHgwMDAxCS8qIEN1cnJlbnQgQ29ubmVjdCBTdGF0dXMgKCJkZXZpY2UgcHJlc2VudCIpICovCisjZGVmaW5lICAgVVNCUE9SVFNDX0NTQyAgIDB4MDAwMgkvKiBDb25uZWN0IFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfUEUgICAgMHgwMDA0CS8qIFBvcnQgRW5hYmxlICovCisjZGVmaW5lICAgVVNCUE9SVFNDX1BFQyAgIDB4MDAwOAkvKiBQb3J0IEVuYWJsZSBDaGFuZ2UgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfTFMgICAgMHgwMDMwCS8qIExpbmUgU3RhdHVzICovCisjZGVmaW5lICAgVVNCUE9SVFNDX1JEICAgIDB4MDA0MAkvKiBSZXN1bWUgRGV0ZWN0ICovCisjZGVmaW5lICAgVVNCUE9SVFNDX0xTREEgIDB4MDEwMAkvKiBMb3cgU3BlZWQgRGV2aWNlIEF0dGFjaGVkICovCisjZGVmaW5lICAgVVNCUE9SVFNDX1BSICAgIDB4MDIwMAkvKiBQb3J0IFJlc2V0ICovCisjZGVmaW5lICAgVVNCUE9SVFNDX1NVU1AgIDB4MTAwMAkvKiBTdXNwZW5kICovCisKKy8qIExlZ2FjeSBzdXBwb3J0IHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQkxFR1NVUCAweGMwCisjZGVmaW5lIFVTQkxFR1NVUF9ERUZBVUxUIDB4MjAwMAkvKiBvbmx5IFBJUlEgZW5hYmxlIHNldCAqLworCisjZGVmaW5lIFVIQ0lfTlVMTF9EQVRBX1NJWkUgMHg3ZmYJLyogZm9yIFVIQ0kgY29udHJvbGxlciBURCAqLworI2RlZmluZSBVSENJX1BJRCAgICAgICAgICAgIDB4ZmYJLyogUElEIE1BU0sgKi8KKworI2RlZmluZSBVSENJX1BUUl9CSVRTICAgICAgIDB4MDAwRgorI2RlZmluZSBVSENJX1BUUl9URVJNICAgICAgIDB4MDAwMQorI2RlZmluZSBVSENJX1BUUl9RSCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBVSENJX1BUUl9ERVBUSCAgICAgIDB4MDAwNAorCisvKiBmb3IgVEQgPHN0YXR1cz46ICovCisjZGVmaW5lIFREX0NUUkxfU1BEICAgICAgICAgKDEgPDwgMjkpCS8qIFNob3J0IFBhY2tldCBEZXRlY3QgKi8KKyNkZWZpbmUgVERfQ1RSTF9DX0VSUl9NQVNLICAoMyA8PCAyNykJLyogRXJyb3IgQ291bnRlciBiaXRzICovCisjZGVmaW5lIFREX0NUUkxfTFMgICAgICAgICAgKDEgPDwgMjYpCS8qIExvdyBTcGVlZCBEZXZpY2UgKi8KKyNkZWZpbmUgVERfQ1RSTF9JT1MgICAgICAgICAoMSA8PCAyNSkJLyogSXNvY2hyb25vdXMgU2VsZWN0ICovCisjZGVmaW5lIFREX0NUUkxfSU9DICAgICAgICAgKDEgPDwgMjQpCS8qIEludGVycnVwdCBvbiBDb21wbGV0ZSAqLworI2RlZmluZSBURF9DVFJMX0FDVElWRSAgICAgICgxIDw8IDIzKQkvKiBURCBBY3RpdmUgKi8KKyNkZWZpbmUgVERfQ1RSTF9TVEFMTEVEICAgICAoMSA8PCAyMikJLyogVEQgU3RhbGxlZCAqLworI2RlZmluZSBURF9DVFJMX0RCVUZFUlIgICAgICgxIDw8IDIxKQkvKiBEYXRhIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBURF9DVFJMX0JBQkJMRSAgICAgICgxIDw8IDIwKQkvKiBCYWJibGUgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgVERfQ1RSTF9OQUsgICAgICAgICAoMSA8PCAxOSkJLyogTkFLIFJlY2VpdmVkICovCisjZGVmaW5lIFREX0NUUkxfQ1JDVElNRU8gICAgKDEgPDwgMTgpCS8qIENSQy9UaW1lIE91dCBFcnJvciAqLworI2RlZmluZSBURF9DVFJMX0JJVFNUVUZGICAgICgxIDw8IDE3KQkvKiBCaXQgU3R1ZmYgRXJyb3IgKi8KKyNkZWZpbmUgVERfQ1RSTF9BQ1RMRU5fTUFTSyAweDdmZgkvKiBhY3R1YWwgbGVuZ3RoLCBlbmNvZGVkIGFzIG4gLSAxICovCisKKyNkZWZpbmUgVERfQ1RSTF9BTllfRVJST1IJKFREX0NUUkxfU1RBTExFRCB8IFREX0NUUkxfREJVRkVSUiB8IFwKKwkJCQkgVERfQ1RSTF9CQUJCTEUgfCBURF9DVFJMX0NSQ1RJTUUgfCBURF9DVFJMX0JJVFNUVUZGKQorCisjZGVmaW5lIFREX1RPS0VOX1RPR0dMRQkJMTkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBWaXJ0dWFsIFJvb3QgSFVCCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlc3RpbmF0aW9uIG9mIHJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfSU5URVJGQUNFICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSSF9FTkRQT0lOVCAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFJIX09USEVSICAgICAgICAgICAgICAgICAgIDB4MDMKKworI2RlZmluZSBSSF9DTEFTUyAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFJIX1ZFTkRPUiAgICAgICAgICAgICAgICAgIDB4NDAKKworLyogUmVxdWVzdHM6IGJSZXF1ZXN0IDw8IDggfCBibVJlcXVlc3RUeXBlICovCisjZGVmaW5lIFJIX0dFVF9TVEFUVVMgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBSSF9DTEVBUl9GRUFUVVJFICAgICAgICAweDAxMDAKKyNkZWZpbmUgUkhfU0VUX0ZFQVRVUkUgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFJIX1NFVF9BRERSRVNTICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBSSF9HRVRfREVTQ1JJUFRPUiAgICAgICAweDA2ODAKKyNkZWZpbmUgUkhfU0VUX0RFU0NSSVBUT1IgICAgICAgMHgwNzAwCisjZGVmaW5lIFJIX0dFVF9DT05GSUdVUkFUSU9OICAgIDB4MDg4MAorI2RlZmluZSBSSF9TRVRfQ09ORklHVVJBVElPTiAgICAweDA5MDAKKyNkZWZpbmUgUkhfR0VUX1NUQVRFICAgICAgICAgICAgMHgwMjgwCisjZGVmaW5lIFJIX0dFVF9JTlRFUkZBQ0UgICAgICAgIDB4MEE4MAorI2RlZmluZSBSSF9TRVRfSU5URVJGQUNFICAgICAgICAweDBCMDAKKyNkZWZpbmUgUkhfU1lOQ19GUkFNRSAgICAgICAgICAgMHgwQzgwCisvKiBPdXIgVmVuZG9yIFNwZWNpZmljIFJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfU0VUX0VQICAgICAgICAgICAgICAgMHgyMDAwCisKKy8qIEh1YiBwb3J0IGZlYXR1cmVzICovCisjZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTiAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkhfUE9SVF9FTkFCTEUgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSSF9QT1JUX1NVU1BFTkQgICAgICAgICAgICAweDAyCisjZGVmaW5lIFJIX1BPUlRfT1ZFUl9DVVJSRU5UICAgICAgIDB4MDMKKyNkZWZpbmUgUkhfUE9SVF9SRVNFVCAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBSSF9QT1JUX1BPV0VSICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFJIX1BPUlRfTE9XX1NQRUVEICAgICAgICAgIDB4MDkKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04gICAgICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFICAgICAgICAgICAweDExCisjZGVmaW5lIFJIX0NfUE9SVF9TVVNQRU5EICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCAgICAgMHgxMworI2RlZmluZSBSSF9DX1BPUlRfUkVTRVQgICAgICAgICAgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUiAgICAgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVCAgICAgIDB4MDEKKworI2RlZmluZSBSSF9ERVZJQ0VfUkVNT1RFX1dBS0VVUCAgICAweDAwCisjZGVmaW5lIFJIX0VORFBPSU5UX1NUQUxMICAgICAgICAgIDB4MDEKKworLyogT3VyIFZlbmRvciBTcGVjaWZpYyBmZWF0dXJlICovCisjZGVmaW5lIFJIX1JFTU9WRV9FUCAgICAgICAgICAgICAgIDB4MDAKKworCisjZGVmaW5lIFJIX0FDSyAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfUkVRX0VSUiAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgUkhfTkFDSyAgICAgICAgICAgICAgICAgICAgMHgwMAorCisKKy8qIFRyYW5zZmVyIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBsaW5rOyAgICAgLyogbmV4dCB0ZC9xaCAoTEUpKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1czsgICAvKiBzdGF0dXMgb2YgdGhlIHRkICovCisJdW5zaWduZWQgbG9uZyBpbmZvOyAgICAgLyogTWF4IExlbmdodCAvIEVuZHBvaW50IC8gZGV2aWNlIGFkZHJlc3MgYW5kIFBJRCAqLworCXVuc2lnbmVkIGxvbmcgYnVmZmVyOyAgIC8qIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKExFKSAqLworCXVuc2lnbmVkIGxvbmcgZGV2X3B0cjsgIC8qIHBvaW50ZXIgdG8gdGhlIGFzc2lnbmVkIGRldmljZSAoQkUpICovCisJdW5zaWduZWQgbG9uZyByZXNbM107ICAgLyogcmVzZXJ2ZWQgKFREcyBtdXN0IGJlIDhCeXRlIGFsaWduZWQpICovCit9IHVoY2lfdGRfdCwgKnB1aGNpX3RkX3Q7CisKKy8qIFF1ZXVlIEhlYWRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGhlYWQ7ICAgICAgIC8qIE5leHQgUUggKExFKSovCisJdW5zaWduZWQgbG9uZyBlbGVtZW50OwkJLyogUXVldWUgZWxlbWVudCBwb2ludGVyIChMRSkgKi8KKwl1bnNpZ25lZCBsb25nIHJlc1s1XTsgICAgIC8qIHJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZyBkZXZfcHRyOyAgICAvKiBpZiAwIG5vIHRkcyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gdGhpcyBxaCAqLworfSB1aGNpX3FoX3QsICpwdWhjaV9xaF90OworCitzdHJ1Y3QgdmlydF9yb290X2h1YiB7CisJaW50IGRldm51bTsJCSAgICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgUm9vdCBIdWIgZW5kcG9pbnQgKi8KKwlpbnQgbnVtcG9ydHM7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwb3J0cyAqLworCWludCBjX3Bfcls4XTsgICAgICAgICAgICAgLyogQ19QT1JUX1JFU0VUICovCit9OworCisKKyNlbmRpZiAvKiBfVVNCX1VIQ0lfSF8gKi8KKworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpYTY4Ni5jIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWE2ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDgzY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWE2ODYuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogSHlwZXJpb24gRW50ZXJ0YWlubWVudCwgSGFucy1Kb2VyZ0ZAaHlwZXJpb24tZW50ZXJ0YWlubWVudC5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGF0YS5oPgorI2luY2x1ZGUgIm1lbWlvLmgiCisjaW5jbHVkZSAiYXJ0aWNpYVMuaCIKKyNpbmNsdWRlICJ2aWE2ODYuaCIKKyNpbmNsdWRlICJpODI1OS5oIgorCisjdW5kZWYgVklBX0RFQlVHCisKKyNpZmRlZiAgVklBX0RFQlVHCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikgICAgIHByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworCisvKiAgU2V0dXAgdGhlIElTQS10by1QQ0kgaG9zdCBicmlkZ2UgKi8KK3ZvaWQgdmlhX2lzYV9pbml0KHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0YWJsZSkKK3sKKyAgICBjaGFyIHJlZ3ZhbDsKKyAgICBpZiAoUENJX0ZVTkMoZGV2KSA9PSAwKQorICAgIHsKKwlQUklOVEYoIi4uLiBQQ0ktdG8tSVNBIGJyaWRnZSwgZGV2PTB4JVhcbiIsIGRldik7CisKKwkvKiAgRW5hYmxlIEkvTyBSZWNvdmVyeSB0aW1lICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgMHgwOCk7CisKKwkvKiAgRW5hYmxlIElTQSByZWZyZXNoICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MSwgMHg0MSk7IC8qICB3YXMgMDEgKi8KKworCS8qICBFbmFibGUgSVNBIGxpbmUgYnVmZmVyICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0NSwgMHg4MCk7CisKKwkvKiAgR2F0ZSBJTlRSLCBhbmQgZmx1c2ggbGluZSBidWZmZXIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ2LCAweDYwKTsKKworCS8qICBFbmFibGUgRUlTQSBwb3J0cyA0RDAvNEQxLiBEbyB3ZSBuZWVkIHRoaXMgPyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDcsIDB4ZTYpOyAvKiAgd2FzIDIwICovCisKKwkvKiAgNTEyIEsgUENJIERlY29kZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIDB4MDEpOworCisJLyogIFdhaXQgZm9yIFBHTlQgYmVmb3JlIGdyYW50IHRvIElTQSBNYXN0ZXIvRE1BICovCisJLyogIHBvcnRzIDAtRkYgdG8gU0RCdXMgKi8KKwkvKiAgSVJRIDE0IGFuZCAxNSBmb3IgaWRlIDAvMSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIDB4MDQpOyAvKiAgV2FzIGM0ICovCisKKwkvKiAgUGx1ZyduJ1BsYXkgKi8KKwkvKiAgUGFyYWxsZWwgRFJRIDMsIEZsb3BweSBEUlEgMiAoZGVmYXVsdCkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAweDBlKTsKKworCS8qICBJUlEgUm91dGluZyBmb3IgRmxvcHB5IGFuZCBQYXJhbGxlbCBwb3J0ICovCisJLyogIElSUSA2IGZvciBmbG9wcHksIElSUSA3IGZvciBwYXJhbGxlbCBwb3J0ICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgMHg3Nik7CisKKwkvKiAgSVJRIFJvdXRpbmcgZm9yIHNlcmlhbCBwb3J0cyAodGFrZSBJUlEgMyBhbmQgNCkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUyLCAweDM0KTsKKworCS8qICBBbGwgSVJRJ3MgbGV2ZWwgdHJpZ2dlcmVkLiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIDB4MDApOworCisJLyogIFBDSSBJUlEncyBhbGwgYXQgSVJRIDkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAweDkwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU2LCAweDk5KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU3LCAweDkwKTsKKworCS8qICBFbmFibGUgS2V5Ym9hcmQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NUEsICZyZWd2YWwpOworCXJlZ3ZhbCB8PSAweDAxOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NUEsIHJlZ3ZhbCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDgwLCAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDg1LCAweDAxKTsKKworLyogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NzcsIDB4MDApOyAqLworICAgIH0KK30KKworLyoKKyAqIEluaXRpYWxpemUgUE5QIGlycSByb3V0aW5nCisgKi8KKwordm9pZCB2aWFfaW5pdF9pcnFfcm91dGluZyh1aW50OCBpcnFfbWFwW10pCit7CisgICAgY2hhciAqczsKKyAgICB1aW50OCBsZXZlbF9lZGdlX2JpdHMgPSAweGY7CisKKyAgICAvKiBTZXQgaXJxIHJvdXRpbmdzICovCisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDMsIDB4NTUsIGlycV9tYXBbMF08PDQpOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzLCAweDU2LCBpcnFfbWFwWzFdIHwgaXJxX21hcFsyXTw8NCk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDMsIDB4NTcsIGlycV9tYXBbM108PDQpOworCisgICAgLyoKKyAgICAgKiBHYXRoZXIgbGV2ZWwvZWRnZSBiaXRzCisgICAgICogRGVmYXVsdCBpcyB0byBhc3N1bWUgbGV2ZWwgdHJpZ2dlcmVkCisgICAgICovCisKKyAgICBzID0gZ2V0ZW52KCJwY2lfaXJxYV9zZWxlY3QiKTsKKyAgICBpZiAocyAmJiBzdHJjbXAocywgImxldmVsIikgPT0gMCkKKwlsZXZlbF9lZGdlX2JpdHMgJj0gfjB4MDE7CisKKyAgICBzID0gZ2V0ZW52KCJwY2lfaXJxYl9zZWxlY3QiKTsKKyAgICBpZiAocyAmJiBzdHJjbXAocywgImxldmVsIikgPT0gMCkKKwlsZXZlbF9lZGdlX2JpdHMgJj0gfjB4MDI7CisKKyAgICBzID0gZ2V0ZW52KCJwY2lfaXJxY19zZWxlY3QiKTsKKyAgICBpZiAocyAmJiBzdHJjbXAocywgImxldmVsIikgPT0gMCkKKwlsZXZlbF9lZGdlX2JpdHMgJj0gfjB4MDQ7CisKKyAgICBzID0gZ2V0ZW52KCJwY2lfaXJxZF9zZWxlY3QiKTsKKyAgICBpZiAocyAmJiBzdHJjbXAocywgImxldmVsIikgPT0gMCkKKwlsZXZlbF9lZGdlX2JpdHMgJj0gfjB4MDg7CisKKyAgICBQUklOVEYoIklSUSBtYXBcbiIpOworICAgIFBSSU5URigiJWQ6ICVzXG4iLCBpcnFfbWFwWzBdLCBsZXZlbF9lZGdlX2JpdHMmMHgxID8gImVkZ2UiIDogImxldmVsIik7CisgICAgUFJJTlRGKCIlZDogJXNcbiIsIGlycV9tYXBbMV0sIGxldmVsX2VkZ2VfYml0cyYweDIgPyAiZWRnZSIgOiAibGV2ZWwiKTsKKyAgICBQUklOVEYoIiVkOiAlc1xuIiwgaXJxX21hcFsyXSwgbGV2ZWxfZWRnZV9iaXRzJjB4NCA/ICJlZGdlIiA6ICJsZXZlbCIpOworICAgIFBSSU5URigiJWQ6ICVzXG4iLCBpcnFfbWFwWzNdLCBsZXZlbF9lZGdlX2JpdHMmMHg4ID8gImVkZ2UiIDogImxldmVsIik7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDMsIDB4NTQsIGxldmVsX2VkZ2VfYml0cyk7CisKKyAgICBQUklOVEYoIiUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBjaV9yZWFkX2NmZ19ieXRlKDAsIDc8PDMsIDB4NTQpLAorCSAgIHBjaV9yZWFkX2NmZ19ieXRlKDAsIDc8PDMsIDB4NTUpLCBwY2lfcmVhZF9jZmdfYnl0ZSgwLCA3PDwzLCAweDU2KSwKKwkgICBwY2lfcmVhZF9jZmdfYnl0ZSgwLCA3PDwzLCAweDU3KSk7Cit9CisKKworLyogIFNldHVwIHRoZSBJREUgY29udHJvbGxlci4gVGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yayB5ZXQuIEkvTyB0byBhbiBJREUgY29udHJvbGxlciBwb3J0ICovCisvKiAgYWx3YXlzIHJldHVybiB0aGUgbGFzdCBjaGFyYWN0ZXIgb3V0cHV0IG9uIHRoZSBzZXJpYWwgcG9ydCAoISkgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcG5wLWxpYnJhcnkgd2hlbiBpdCBlbmNvdW50ZXJzIDA6NzoxICovCit2b2lkIHZpYV9jZmdmdW5jX2lkZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zdCwgcGNpX2Rldl90IGRldiwgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKnRhYmxlKQoreworICAgIFBSSU5URigiLi4uIElERSBjb250cm9sbGVyLCBkZXY9MHglWFxuIiwgZGV2KTsKKworICAgIC8qICBFbmFibGUgYm90aCBJREUgY2hhbm5lbHMuICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgMHgwMyk7CisgICAgLyogIHVkZWxheSgxMDAwMCk7ICovCisgICAgLyogIHVkZWxheSgxMDAwMCk7ICovCisKKyAgICAvKiAgRW5hYmxlIElPIFNwYWNlICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHgwNCwgMHgwMyk7CisKKyAgICAvKiAgU2V0IHRvIGNvbXBhdGliaWxpdHkgbW9kZSAqLworICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4MDksIDB4OEEpOyAvKiAgV0FTOiAweDhmKTsgKi8KKworICAgIC8qICBTZXQgdG8gbGVnYWN5IGludGVycnVwdCBtb2RlICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHgzZCwgMHgwMCk7IC8qIFdBUzogMHgwMSk7ICovCisKK30KKworCisvKiAgU2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZsb3BweSBjb250cm9sbGVyIHRvIDB4M0YwICovCit2b2lkIHZpYV9mZGNfaW5pdChwY2lfZGV2X3QgZGV2KQoreworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICAvKiAgRW5hYmxlIENvbmZpZ3VyYXRpb24gbW9kZSAqLworICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg4NSwgJmMpOworICAgIGMgfD0gMHgwMjsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDg1LCBjKTsKKworICAgIC8qICBTZXQgZmxvcHB5IGNvbnRyb2xsZXIgcG9ydCB0byAweDNGMC4gKi8KKyAgICBTSU9fV1JJVEVfQ09ORklHKDB4RTMsICgweDNGPDwyKSk7CisKKyAgICAvKiAgRW5hYmxlIGZsb3BweSBjb250cm9sbGVyICovCisgICAgU0lPX1JFQURfQ09ORklHKDB4RTIsIGMpOworICAgIGMgfD0gMHgxMDsKKyAgICBTSU9fV1JJVEVfQ09ORklHKDB4RTIsIGMpOworCisgICAgLyogIFN3aXRjaCBvZiBjb25maWd1cmF0aW9uIG1vZGUgKi8KKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ODUsICZjKTsKKyAgICBjICY9IH4weDAyOworICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODUsIGMpOworfQorCisvKiAgSW5pdCBmdW5jdGlvbiAwIG9mIHRoZSB2aWEgc291dGhicmlkZ2UuIENhbGxlZCBieSB0aGUgcG5wLWxpYnJhcnkgKi8KK3ZvaWQgdmlhX2NmZ2Z1bmNfdmlhNjg2KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zdCwgcGNpX2Rldl90IGRldiwgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKnRhYmxlKQoreworICAgIGlmIChQQ0lfRlVOQyhkZXYpID09IDApCisgICAgeworCS8qIEZJWE1FOiBUcnkgdG8gZ2VuZXJhdGUgYSBQQ0kgcmVzZXQgKi8KKwkvKiB1bnNpZ25lZCBjaGFyIGM7ICovCisJLyogcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ3LCAmYyk7ICovCisJLyogcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0NywgYyB8IDB4MDEpOyAqLworCisJdmlhX2lzYV9pbml0KGRldiwgdGFibGUpOworCXZpYV9mZGNfaW5pdChkZXYpOworICAgIH0KK30KKworX19hc20gICAgICAgICAoIiAgICAuZ2xvYmwgdmlhX2NhbGlicmF0ZV90aW1lX2Jhc2UgXG4iCisJICAgICAgICJ2aWFfY2FsaWJyYXRlX3RpbWVfYmFzZTogCSAgIFxuIgorICAgICAgICAgICAgICAgIiAgIGxpcyAgICAgOSwgMHhmZTAwCQkgICBcbiIKKyAgICAgICAgICAgICAgICIgICBsaSAgICAgIDAsIDB4MDAJCSAgIFxuIgorCSAgICAgICAiICAgbXR0YnUgICAwCQkJICAgXG4iCisJICAgICAgICIgICBtdHRibCAgIDAJCQkgICBcbiIKKwkgICAgICAgImN0Yl9sb29wOgkJCSAgIFxuIgorICAgICAgICAgICAgICAgIiAgIGxieiAgICAgMCwgMHg2MSg5KQkJICAgXG4iCisgICAgICAgICAgICAgICAiICAgZWllaW8JCQkgICBcbiIKKyAgICAgICAgICAgICAgICIgICBhbmRpLiAgIDAsIDAsIDB4MjAJCSAgIFxuIgorICAgICAgICAgICAgICAgIiAgIGJlcSAgICAgY3RiX2xvb3AJCSAgIFxuIgorICAgICAgICAgICAgICAgImN0Yl9kb25lOgkJCSAgIFxuIgorICAgICAgICAgICAgICAgIiAgIG1mdGIgICAgMwkJCSAgIFxuIgorICAgICAgICAgICAgICAgIiAgIGJsciIpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWFfY2FsaWJyYXRlX3RpbWVfYmFzZSh2b2lkKTsKKwordm9pZCB2aWFfY2FsaWJyYXRlX2J1c19mcmVxKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyAgICB1bnNpZ25lZCBsb25nIHRiOworCisgICAgLyogVGhpcyBpcyAyMCBtaWNyb3NlY29uZHMgKi8KKyAgICAjZGVmaW5lIENBTElCUkFURV9USU1FIDI4NjM2CisKKworICAgIC8qIEVuYWJsZSB0aGUgdGltZXIgKGFuZCBkaXNhYmxlIHNwZWFrZXIpICovCisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGMgPSBpbl9ieXRlKDB4NjEpOworICAgIG91dF9ieXRlKDB4NjEsICgoYyAmIH4weDAyKSB8IDB4MDEpKTsKKworICAgIC8qIFNldCB0aW1lciAyIHRvIGxvdy9oaWdoIHdyaXRpbmcgKi8KKyAgICBvdXRfYnl0ZSgweDQzLCAweGIwKTsKKyAgICBvdXRfYnl0ZSgweDQyLCBDQUxJQlJBVEVfVElNRSAmIDB4ZmYpOworICAgIG91dF9ieXRlKDB4NDIsIENBTElCUkFURV9USU1FID4+OCk7CisKKyAgICAvKiBSZWFkIHRoZSB0aW1lIGJhc2UgKi8KKyAgICB0YiA9IHZpYV9jYWxpYnJhdGVfdGltZV9iYXNlKCk7CisKKyAgICBpZiAodGIgPj0gNzAwMDAwKQorCWdkLT5idXNfY2xrID0gMTMzMzMzMzMzOworICAgIGVsc2UKKwlnZC0+YnVzX2NsayA9IDEwMDAwMDAwMDsKKworfQorCisKK3ZvaWQgaWRlX2xlZCh1Y2hhciBsZWQsIHVjaGFyIHN0YXR1cykKK3sKKy8qICAgICB1bnNpZ25lZCBjaGFyIGMgPSBpbl9ieXRlKDB4OTIpOyAqLworCisvKiAgICAgaWYgKCFzdGF0dXMpICovCisvKiAJb3V0X2J5dGUoMHg5MiwgYyB8IDB4QzApOyAqLworLyogICAgIGVsc2UgKi8KKy8qIAlvdXRfYnl0ZSgweDkyLCBjICYgfjB4QzApOyAqLworfQorCisKK3ZvaWQgdmlhX2luaXRfYWZ0ZXJzY2FuKHZvaWQpCit7CisgICAgLyogTW9kaWZ5IElERSBjb250cm9sbGVyIHNldHVwICovCisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MSwgUENJX0xBVEVOQ1lfVElNRVIsIDB4MjApOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9JT3xQQ0lfQ09NTUFORF9NRU1PUll8UENJX0NPTU1BTkRfTUFTVEVSKTsKKyAgICBwY2lfd3JpdGVfY2ZnX2J5dGUoMCwgNzw8M3wxLCBQQ0lfSU5URVJSVVBUX0xJTkUsIDB4ZmYpOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NDAsIDB4MGIpOyAgIC8qIEZJWE1FOiBNaWdodCBkZXBlbmQgb24gZHJpdmVzIGNvbm5lY3RlZCAqLworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NDEsIDB4NDIpOyAgIC8qIEZJWE1FOiBNaWdodCBkZXBlbmQgb24gZHJpdmVzIGNvbm5lY3RlZCAqLworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NDMsIDB4MDUpOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NDQsIDB4MTgpOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NDUsIDB4MTApOworICAgIHBjaV93cml0ZV9jZmdfYnl0ZSgwLCA3PDwzfDEsIDB4NGUsIDB4MjIpOyAgIC8qIEZJWE1FOiBOb3QgZG9jdW1lbnRlZCwgYnV0IHNldCBpbiBQQyBiaW9zICovCisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MSwgMHg0ZiwgMHgyMCk7ICAgLyogRklYTUU6IE5vdCBkb2N1bWVudGVkICovCisKKyAgICAvKiBNb2RpZnkgc29tZSB2YWx1ZXMgaW4gdGhlIFVTQiBjb250cm9sbGVyICovCisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MiwgMHgwNSwgMHgxNyk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MiwgMHgwNiwgMHgwMSk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MiwgMHg0MSwgMHgxMik7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MiwgMHg0MiwgMHgwMyk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NDApOworCisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MywgMHgwNSwgMHgxNyk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MywgMHgwNiwgMHgwMSk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MywgMHg0MSwgMHgxMik7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MywgMHg0MiwgMHgwMyk7CisgICAgcGNpX3dyaXRlX2NmZ19ieXRlKDAsIDc8PDN8MywgUENJX0xBVEVOQ1lfVElNRVIsIDB4NDApOworCisKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlhNjg2LmggYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpYTY4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDZhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpYTY4Ni5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgVklBNjg2X0hfCisjZGVmaW5lIFZJQTY4Nl9IXworCisKKyNkZWZpbmUgQ01PU19BRERSICAgICAgICAgMHg3MAorI2RlZmluZSBDTU9TX0RBVEEgICAgICAgICAweDcxCisKKyNkZWZpbmUgSTgyNTlfTUFTVEVSX0NPTlRST0wgMHgyMAorI2RlZmluZSBJODI1OV9NQVNURVJfTUFTSyAgICAweDIxCisKKyNkZWZpbmUgSTgyNTlfU0xBVkVfQ09OVFJPTCAgMHhBMAorI2RlZmluZSBJODI1OV9TTEFWRV9NQVNLICAgICAweEExCisKKyNkZWZpbmUgU0lPX0NPTkZJR19BRERSIDB4M0YwCisjZGVmaW5lIFNJT19DT05GSUdfREFUQSAweDNGMQorCisjZGVmaW5lIFNJT19XUklURV9DT05GSUcoYWRkciwgYnl0ZSkgXAorICAgb3V0X2J5dGUoU0lPX0NPTkZJR19BRERSLCBhZGRyKTsgIFwKKyAgIG91dF9ieXRlKFNJT19DT05GSUdfREFUQSwgYnl0ZSk7CisKKyNkZWZpbmUgU0lPX1JFQURfQ09ORklHKGFkZHIsIGJ5dGUpIFwKKyAgIG91dF9ieXRlKFNJT19DT05GSUdfQUREUiwgYWRkcik7IFwKKyAgIGJ5dGUgPSBpbl9ieXRlKFNJT19DT05GSUdfREFUQSk7CisKK3ZvaWQgdmlhX2luaXQodm9pZCk7CisKK3ZvaWQgdmlhX2NhbGlicmF0ZV9idXNfZnJlcSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYwpAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogSHlwZXJpb24gRW50ZXJ0YWlubWVudCwgSGFucy1Kb2VyZ0ZAaHlwZXJpb24tZW50ZXJ0YWlubWVudC5jb20gCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGRldmljZXMuaD4KKyNpbmNsdWRlICJtZW1pby5oIgorI2luY2x1ZGUgPHBhcnQuaD4KKwordW5zaWduZWQgY2hhciAqY3Vyc29yX3Bvc2l0aW9uOwordW5zaWduZWQgaW50IGN1cnNvcl9yb3c7Cit1bnNpZ25lZCBpbnQgY3Vyc29yX2NvbDsKKwordW5zaWduZWQgY2hhciBjdXJyZW50X2F0dHI7CisKK3Vuc2lnbmVkIGludCB2aWRlb19udW1yb3dzID0gMjU7Cit1bnNpZ25lZCBpbnQgdmlkZW9fbnVtY29scyA9IDgwOwordW5zaWduZWQgaW50IHZpZGVvX3Njcm9sbHMgPSAwOworCisjZGVmaW5lIFZJREVPX0JBU0UgKHVuc2lnbmVkIGNoYXIgKikweEZEMEI4MDAwCisjZGVmaW5lIFZJREVPX1JPV1MgdmlkZW9fbnVtcm93cworI2RlZmluZSBWSURFT19DT0xTIHZpZGVvX251bWNvbHMKKyNkZWZpbmUgVklERU9fUElUQ0ggKDIgKiB2aWRlb19udW1jb2xzKQorI2RlZmluZSBWSURFT19TSVpFICh2aWRlb19udW1yb3dzICogdmlkZW9fbnVtY29scyAqIDIpCisjZGVmaW5lIFZJREVPX05BTUUgInZnYSIKKwordm9pZCB2aWRlb190ZXN0KHZvaWQpOwordm9pZCB2aWRlb19wdXRjKGNoYXIgY2gpOwordm9pZCB2aWRlb19wdXRzKGNoYXIgKnN0cmluZyk7Cit2b2lkIHZpZGVvX3Njcm9sbChpbnQgcm93cyk7Cit2b2lkIHZpZGVvX2Jhbm5lcih2b2lkKTsKK2ludCAgdmlkZW9faW5pdCh2b2lkKTsKK2ludCAgdmlkZW9fc3RhcnQodm9pZCk7CitpbnQgIHZpZGVvX3Jvd3Modm9pZCk7CitpbnQgIHZpZGVvX2NvbHModm9pZCk7CisKK2NoYXIgKnByb21wdF9zdHJpbmcgPSAiPT4iOworCit2b2lkIHZpZGVvX3NldF9jb2xvcih1bnNpZ25lZCBjaGFyIGF0dHIpCit7CisgICAgdW5zaWduZWQgY2hhciAqZmIgPSAodW5zaWduZWQgY2hhciAqKVZJREVPX0JBU0U7CisgICAgaW50IGk7CisKKyAgICBjdXJyZW50X2F0dHIgPSB2aWRlb19nZXRfYXR0cigpOworCisgICAgZm9yIChpPTA7IGk8VklERU9fU0laRTsgaSs9MikKKyAgICB7CisJKihmYitpKzEpID0gY3VycmVudF9hdHRyOworICAgIH0KK30KKwordW5zaWduZWQgY2hhciB2aWRlb19nZXRfYXR0cih2b2lkKQoreworICAgIGNoYXIgKnM7CisgICAgdW5zaWduZWQgY2hhciBhdHRyOworCisgICAgYXR0ciA9IDB4MGY7CisKKyAgICBzID0gZ2V0ZW52KCJ2Z2FfZmdfY29sb3IiKTsKKyAgICBpZiAocykKKyAgICB7CisJYXR0ciA9IGF0b2kocyk7CisgICAgfQorCisgICAgcyA9IGdldGVudigidmdhX2JnX2NvbG9yIik7CisgICAgaWYgKHMpCisgICAgeworCWF0dHIgfD0gYXRvaShzKTw8NDsKKyAgICB9CisKKyAgICByZXR1cm4gYXR0cjsKK30KKworaW50IHZpZGVvX2luaXRlZCA9IDA7CisKK2ludCBkcnZfdmlkZW9faW5pdCh2b2lkKQoreworICAgIGludCBlcnJvciwgZGV2aWNlcyA9IDEgOworICAgIGRldmljZV90IHZnYWRldiA7CisgICAgaWYgKHZpZGVvX2luaXRlZCkgcmV0dXJuIDE7CisgICAgdmlkZW9faW5pdGVkID0gMTsKKyAgICB2aWRlb19pbml0KCk7CisgICAgbWVtc2V0ICgmdmdhZGV2LCAwLCBzaXplb2YodmdhZGV2KSk7CisgICAgCisgICAgc3RyY3B5KHZnYWRldi5uYW1lLCBWSURFT19OQU1FKTsKKyAgICB2Z2FkZXYuZmxhZ3MgPSAgREVWX0ZMQUdTX09VVFBVVCB8IERFVl9GTEFHU19TWVNURU07CisgICAgdmdhZGV2LnB1dGMgPSB2aWRlb19wdXRjOworICAgIHZnYWRldi5wdXRzID0gdmlkZW9fcHV0czsKKyAgICB2Z2FkZXYuZ2V0YyA9IE5VTEw7CisgICAgdmdhZGV2LnRzdGMgPSBOVUxMOworICAgIHZnYWRldi5zdGFydCA9IHZpZGVvX3N0YXJ0OworICAgIAorICAgIGVycm9yID0gZGV2aWNlX3JlZ2lzdGVyICgmdmdhZGV2KTsKKworICAgIGlmIChlcnJvciA9PSAwKQorICAgIHsKKwljaGFyICpzID0gZ2V0ZW52KCJzdGRvdXQiKTsKKwlpZiAocyAmJiBzdHJjbXAocywgVklERU9fTkFNRSk9PTApCisJeworCSAgICBpZiAob3ZlcndyaXRlX2NvbnNvbGUoKSkgcmV0dXJuIDE7CisJICAgIGVycm9yID0gY29uc29sZV9hc3NpZ24oc3Rkb3V0LCBWSURFT19OQU1FKTsKKwkgICAgaWYgKGVycm9yID09IDApIHJldHVybiAxOworCSAgICBlbHNlIHJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdmlkZW9faW5pdCh2b2lkKQoreworICAgIGN1cnNvcl9wb3NpdGlvbiA9IFZJREVPX0JBU0U7IC8vIENvbG9yIHRleHQgZGlzcGxheSBiYXNlCisgICAgY3Vyc29yX3JvdyA9IDA7CisgICAgY3Vyc29yX2NvbCA9IDA7CisgICAgY3VycmVudF9hdHRyID0gdmlkZW9fZ2V0X2F0dHIoKTsgLy8gQ3VycmVudGx5IHNlbGVjdGVkIHZhbHVlIGZvciBhdHRyaWJ1dGUuCisvLyAgICB2aWRlb190ZXN0KCk7CisgICAgdmlkZW9fc2V0X2NvbG9yKGN1cnJlbnRfYXR0cik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB2aWRlb19zZXRfY3Vyc29yKGludCBsaW5lLCBpbnQgY29sdW1uKQoreworICAgIHVuc2lnbmVkIHNob3J0IG9mZnNldCA9IGxpbmUqdmlkZW9fbnVtY29scyArIGNvbHVtbjsKKyAgICBjdXJzb3JfcG9zaXRpb24gPSBWSURFT19CQVNFICsgIGxpbmUqVklERU9fUElUQ0ggKyBjb2x1bW4qMjsKKyAgICBvdXRfYnl0ZSgweDNENCwgMHgwRSk7CisgICAgb3V0X2J5dGUoMHgzRDUsIG9mZnNldC8yNTYpOworICAgIG91dF9ieXRlKDB4M0Q0LCAweDBGKTsKKyAgICBvdXRfYnl0ZSgweDNENSwgb2Zmc2V0JTI1Nik7Cit9CisKK3ZvaWQgdmlkZW9fd3JpdGVfY2hhcihpbnQgY2hhcmFjdGVyKQoreworICAgICpjdXJzb3JfcG9zaXRpb24gPSBjaGFyYWN0ZXI7CisgICAgKihjdXJzb3JfcG9zaXRpb24rMSkgPSBjdXJyZW50X2F0dHI7Cit9CisKK3ZvaWQgdmlkZW9fdGVzdCh2b2lkKQoreworCit9CisKK3ZvaWQgdmlkZW9fcHV0YyhjaGFyIGNoKQoreworICAgIHN3aXRjaChjaCkKKyAgICB7CisgICAgY2FzZSAnXG4nOgorCWN1cnNvcl9jb2wgPSAwOworCWN1cnNvcl9yb3cgKz0gMTsKKwlicmVhazsKKyAgICBjYXNlICdccic6CisJY3Vyc29yX2NvbCA9IDA7CisJYnJlYWs7CisgICAgY2FzZSAnXGInOgorCWlmIChjdXJzb3JfY29sKSBjdXJzb3JfY29sLS07CisJZWxzZSByZXR1cm47CisJYnJlYWs7CisgICAgY2FzZSAnXHQnOgorCWN1cnNvcl9jb2wgPSAoY3Vyc29yX2NvbC84KzEpKjg7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwl2aWRlb193cml0ZV9jaGFyKGNoKTsKKwljdXJzb3JfY29sKys7CisJaWYgKGN1cnNvcl9jb2wgPiBWSURFT19DT0xTLTEpCisJeworCSAgICBjdXJzb3Jfcm93Kys7CisJICAgIGN1cnNvcl9jb2w9MDsKKwl9CisgICAgfQorCisgICAgaWYgKGN1cnNvcl9yb3cgPiBWSURFT19ST1dTLTEpCisJdmlkZW9fc2Nyb2xsKDEpOworICAgIHZpZGVvX3NldF9jdXJzb3IoY3Vyc29yX3JvdywgY3Vyc29yX2NvbCk7Cit9CisKK3ZvaWQgdmlkZW9fc2Nyb2xsKGludCByb3dzKQoreworICAgIHVuc2lnbmVkIHNob3J0IGNsZWFyID0gKCh1bnNpZ25lZCBzaG9ydCljdXJyZW50X2F0dHIpIHwgKCcgJzw8OCk7CisgICAgdW5zaWduZWQgc2hvcnQqIGFkZHIxNiA9ICYoKHVuc2lnbmVkIHNob3J0ICopVklERU9fQkFTRSlbKFZJREVPX1JPV1Mtcm93cykqVklERU9fQ09MU107CisgICAgaW50IGk7CisgICAgY2hhciAqczsKKworICAgIHMgPSBnZXRlbnYoInZnYV9hc2tzY3JvbGwiKTsKKyAgICB2aWRlb19zY3JvbGxzICs9IHJvd3M7CisKKyAgICBpZiAodmlkZW9fc2Nyb2xscyA+PSB2aWRlb19udW1yb3dzKQorICAgIHsKKwlpZiAocyAmJiBzdHJjbXAocywgInllcyIpKQorCXsKKwkgICAgd2hpbGUgKC0xID09IHRzdGMoKSk7CisJfQorCisJdmlkZW9fc2Nyb2xscyA9IDA7CisgICAgfQorCisKKyAgICBtZW1jcHkoVklERU9fQkFTRSwgVklERU9fQkFTRStyb3dzKihWSURFT19DT0xTKjIpLCAoVklERU9fUk9XUy1yb3dzKSooVklERU9fQ09MUyoyKSk7CisgICAgZm9yIChpID0gMCA7IGkgPCByb3dzICogVklERU9fQ09MUyA7IGkrKykKKwlhZGRyMTZbaV0gPSBjbGVhcjsKKyAgICBjdXJzb3Jfcm93LT1yb3dzOworICAgIGN1cnNvcl9jb2w9MDsKK30KKwordm9pZCB2aWRlb19wdXRzKGNoYXIgKnN0cmluZykKK3sKKyAgICB3aGlsZSAoKnN0cmluZykKKyAgICB7CisJdmlkZW9fcHV0Yygqc3RyaW5nKTsKKwlzdHJpbmcrKzsKKyAgICB9Cit9CisKK2ludCB2aWRlb19zdGFydCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBjaGFyIHZpZGVvX3NpbmdsZV9ib3hbXSA9Cit7CisgICAgMjE4LCAxOTYsIDE5MSwKKyAgICAxNzksICAgICAgMTc5LAorICAgIDE5MiwgMTk2LCAyMTcKK307CisKK3Vuc2lnbmVkIGNoYXIgdmlkZW9fZG91YmxlX2JveFtdID0KK3sKKyAgICAyMDEsIDIwNSwgMTg3LAorICAgIDE4NiwgICAgICAxODYsCisgICAgMjAwLCAyMDUsIDE4OAorfTsKKwordW5zaWduZWQgY2hhciB2aWRlb19zaW5nbGVfdGl0bGVbXSA9Cit7CisgICAgMTk1LCAxOTYsIDE4MCwgMTgwLCAxOTUKK307CisKK3Vuc2lnbmVkIGNoYXIgdmlkZW9fZG91YmxlX3RpdGxlW10gPQoreworICAgIDIwNCwgMjA1LCAxODUsIDE4MSwgMTk4Cit9OworCisjZGVmaW5lIFNJTkdMRV9CT1ggMAorI2RlZmluZSBET1VCTEVfQk9YIDEKKwordW5zaWduZWQgY2hhciAqdmlkZW9fYWRkcihpbnQgeCwgaW50IHkpCit7CisgICAgcmV0dXJuIFZJREVPX0JBU0UgKyAyKihWSURFT19DT0xTKnkpICsgMip4OworfQorCit2b2lkIHZpZGVvX2Jpb3NfcHJpbnRfc3RyaW5nKGNoYXIgKnMsIGludCB4LCBpbnQgeSwgaW50IGF0dHIsIGludCBjb3VudCkKK3sKKyAgICBpbnQgY2F0dHIgPSBjdXJyZW50X2F0dHI7CisgICAgaWYgKGF0dHIgIT0gLTEpIGN1cnJlbnRfYXR0ciA9IGF0dHI7CisgICAgdmlkZW9fc2V0X2N1cnNvcih4LHkpOworICAgIHdoaWxlIChjb3VudCkKKyAgICB7CisJY2hhciBjID0gKnMrKzsKKwlpZiAoYXR0ciA9PSAtMSkgY3VycmVudF9hdHRyID0gKnMrKzsKKwl2aWRlb19wdXRjKGMpOworCWNvdW50LS07CisgICAgfQorfQorCit2b2lkIHZpZGVvX2RyYXdfYm94KGludCBzdHlsZSwgaW50IGF0dHIsIGNoYXIgKnRpdGxlLCBpbnQgc2VwYXJhdGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmZiLCAqZmIyOyAKKyAgICB1bnNpZ25lZCBjaGFyICpzdCA9IChzdHlsZSA9PSBTSU5HTEVfQk9YKT92aWRlb19zaW5nbGVfYm94IDogdmlkZW9fZG91YmxlX2JveDsKKyAgICB1bnNpZ25lZCBjaGFyICp0aSA9IChzdHlsZSA9PSBTSU5HTEVfQk9YKT92aWRlb19zaW5nbGVfdGl0bGUgOiB2aWRlb19kb3VibGVfdGl0bGU7CisgICAgaW50IGk7CisKKyAgICBmYiA9IHZpZGVvX2FkZHIoeCx5KTsKKyAgICAqKGZiKSA9IHN0WzBdOworICAgICooZmIrMSkgPSBhdHRyOworICAgIGZiICs9IDI7CisKKyAgICBmYjIgPSB2aWRlb19hZGRyKHgseStoLTEpOworICAgICooZmIyKSA9IHN0WzVdOworICAgICooZmIyKzEpID0gYXR0cjsKKyAgICBmYjIgKz0gMjsKKworICAgIGZvciAoaT0wOyBpPHctMjtpKyspCisgICAgeworCSpmYiA9IHN0WzFdOworCWZiKys7CisJKmZiID0gYXR0cjsKKwlmYisrOworCisJKmZiMiA9IHN0WzZdOworCWZiMisrOworCSpmYjIgPSBhdHRyOworCWZiMisrOworCisgICAgfQorICAgICpmYiA9IHN0WzJdOworICAgICooZmIrMSkgPSBhdHRyOworCisgICAgKmZiMiA9IHN0WzddOworICAgICooZmIyKzEpID0gYXR0cjsKKworICAgIGZiICA9IHZpZGVvX2FkZHIoeCwgeSsxKTsKKyAgICBmYjIgPSB2aWRlb19hZGRyKHgrdy0xLCB5KzEpOworICAgIGZvciAoaT0wOyBpPGgtMjsgaSsrKQorICAgIHsKKwkqZmIgPSBzdFszXTsKKwkqKGZiKzEpID0gYXR0cjsgZmIgKz0gMipWSURFT19DT0xTOworCisJKmZiMiA9IHN0WzRdOyAKKwkqKGZiMisxKSA9IGF0dHI7IGZiMiArPSAyKlZJREVPX0NPTFM7CisgICAgfQorICAgIAorICAgIC8vIERyYXcgdGl0bGUKKyAgICBpZiAodGl0bGUpCisgICAgeworCWlmIChzZXBhcmF0ZSA9PSAwKQorCXsKKwkgICAgZmIgPSB2aWRlb19hZGRyKHgrMSwgeSk7CisJICAgICpmYiA9IHRpWzNdOworCSAgICBmYiArPSAyOworCSAgICAqZmIgPSAnICc7CisJICAgIGZiICs9IDI7CisJICAgIHdoaWxlICgqdGl0bGUpCisJICAgIHsKKwkJKmZiID0gKnRpdGxlOworCQlmYiArKzsKKwkJKmZiID0gYXR0cjsKKwkJZmIrKzsgdGl0bGUrKzsKKwkgICAgfQorCSAgICAqZmIgPSAnICc7CisJICAgIGZiICs9IDI7CisJICAgICpmYiA9IHRpWzRdOworCX0KKwllbHNlCisJeworCSAgICBmYiA9IHZpZGVvX2FkZHIoeCwgeSsyKTsKKwkgICAgKmZiID0gdGlbMF07CisJICAgIGZiICs9IDI7CisJICAgIGZvciAoaT0wOyBpPHctMjsgaSsrKQorCSAgICB7CisJCSpmYiA9IHRpWzFdOworCQkqKGZiKzEpID0gYXR0cjsKKwkJZmIgKz0gMjsKKwkgICAgfQorCSAgICAqZmIgPSB0aVsyXTsKKwkgICAgKihmYisxKSA9IGF0dHI7CisJICAgIGZiID0gdmlkZW9fYWRkcih4KzEsIHkrMSk7CisJICAgIGZvciAoaT0wOyBpPHctMjsgaSsrKQorCSAgICB7CisJCSpmYiA9ICcgJzsKKwkJKihmYisxKSA9IGF0dHI7CisJCWZiICs9IDI7CisJICAgIH0KKwkgICAgZmIgPSB2aWRlb19hZGRyKHgrMiwgeSsxKTsKKwkgICAgCisJICAgIHdoaWxlICgqdGl0bGUpCisJICAgIHsKKwkJKmZiID0gKnRpdGxlOworCQkqKGZiKzEpID0gYXR0cjsKKwkJZmIgKz0gMjsKKwkJdGl0bGUrKzsKKwkgICAgfQorCX0KKyAgICB9CisKK30KKwordm9pZCB2aWRlb19kcmF3X3RleHQoaW50IHgsIGludCB5LCBpbnQgYXR0ciwgY2hhciAqdGV4dCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpmYiA9IHZpZGVvX2FkZHIoeCx5KTsKKyAgICB3aGlsZSAoKnRleHQpCisgICAgeworCSpmYisrID0gKnRleHQrKzsKKwkqZmIrKyA9IGF0dHI7CisgICAgfQorfQorCit2b2lkIHZpZGVvX3NhdmVfcmVjdChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgdm9pZCAqc2F2ZV9hcmVhLCBpbnQgY2xlYXJjaGFyLCBpbnQgY2xlYXJhdHRyKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnNhdmUgPSAodW5zaWduZWQgY2hhciAqKXNhdmVfYXJlYTsKKyAgICB1bnNpZ25lZCBjaGFyICpmYiA9IHZpZGVvX2FkZHIoeCx5KTsKKyAgICBpbnQgaSxqOworICAgIGZvciAoaT0wOyBpPGg7IGkrKykKKyAgICB7CisJdW5zaWduZWQgY2hhciAqZmJiID0gZmI7CisJZm9yIChqPTA7IGo8dzsgaisrKQorCXsKKwkgICAgKnNhdmUgKysgPSAqZmI7CisJICAgIGlmIChjbGVhcmNoYXIgPiAwKSAqZmIgPSBjbGVhcmNoYXI7CisJICAgIGZiICsrOworCSAgICAqc2F2ZSArKyA9ICpmYjsKKwkgICAgaWYgKGNsZWFyYXR0ciA+IDApICpmYiA9IGNsZWFyYXR0cjsKKwl9CisJZmIgPSBmYmIgKyAyKlZJREVPX0NPTFM7CisgICAgfQorfQorCit2b2lkIHZpZGVvX3Jlc3RvcmVfcmVjdChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgdm9pZCAqc2F2ZV9hcmVhKQoreyAgIAorICAgIHVuc2lnbmVkIGNoYXIgKnNhdmUgPSAodW5zaWduZWQgY2hhciAqKXNhdmVfYXJlYTsKKyAgICB1bnNpZ25lZCBjaGFyICpmYiA9IHZpZGVvX2FkZHIoeCx5KTsKKyAgICBpbnQgaSxqOworICAgIGZvciAoaT0wOyBpPGg7IGkrKykKKyAgICB7CisJdW5zaWduZWQgY2hhciAqZmJiID0gZmI7CisJZm9yIChqPTA7IGo8dzsgaisrKQorCXsKKwkgICAgKmZiICsrID0gKnNhdmUgKys7CisJICAgICpmYiArKyA9ICpzYXZlICsrOworCX0KKwlmYiA9IGZiYiArIDIqVklERU9fQ09MUzsKKyAgICB9CisKK30KKworaW50IHZpZGVvX3Jvd3Modm9pZCkKK3sKKyAgICByZXR1cm4gVklERU9fUk9XUzsKK30KKworaW50IHZpZGVvX2NvbHModm9pZCkKK3sKKyAgICByZXR1cm4gVklERU9fQ09MUzsKK30KKwordm9pZCB2aWRlb19zaXplKGludCBjb2xzLCBpbnQgcm93cykKK3sKKyAgICB2aWRlb19udW1yb3dzID0gcm93czsKKyAgICB2aWRlb19udW1jb2xzID0gY29sczsKK30KKwordm9pZCB2aWRlb19jbGVhcih2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0ICpmYmIgPSAodW5zaWduZWQgc2hvcnQgKikweEZEMEI4MDAwOworICAgIGludCBpLGo7CisgICAgdW5zaWduZWQgc2hvcnQgdmFsID0gMHgyMDAwIHwgY3VycmVudF9hdHRyOworCisgICAgZm9yIChpPTA7IGk8dmlkZW9fcm93cygpOyBpKyspCisgICAgeworCWZvciAoaj0wOyBqPHZpZGVvX2NvbHMoKTsgaisrKQorCXsKKwkgICAgKmZiYisrID0gdmFsOworCX0KKyAgICB9CisgICAgdmlkZW9fc2V0X2N1cnNvcigwLDApOworICAgIGN1cnNvcl9yb3cgPSAwOworICAgIGN1cnNvcl9jb2wgPSAwOworfQorCisjaWZkZWYgRUFTVEVSRUdHCitpbnQgdmlkZW9fZWFzdGVyZWdnX2FjdGl2ZSA9IDA7CisKK3ZvaWQgdmlkZW9fZWFzdGVyZWdnKHZvaWQpCit7CisgICAgdmlkZW9fZWFzdGVyZWdnX2FjdGl2ZSA9IDE7Cit9CisjZW5kaWYKKworZXh0ZXJuIGJkX3QgKmJkX2dsb2JhbDsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICogaWRlX2dldF9kZXYoaW50IGRldik7CitleHRlcm4gY2hhciB2ZXJzaW9uX3N0cmluZ1tdOworCit2b2lkIHZpZGVvX2Jhbm5lcih2b2lkKQoreworICAgIGJsb2NrX2Rldl9kZXNjX3QgKmlkZTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpzOworICAgIGludCBtYXhkZXY7CisgICAgCisKKyAgICBpZiAodmlkZW9faW5pdGVkID09IDApIHJldHVybjsKKyNpZmRlZiBFQVNURVJFR0cKKyAgICBpZiAodmlkZW9fZWFzdGVyZWdnX2FjdGl2ZSkKKyAgICB7CisJcHJvbXB0X3N0cmluZz0iIjsKKwl2aWRlb19jbGVhcigpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiAgICAqKioqIENPTU1PRE9SRSA2NCBCQVNJQyBYMiAqKioqXG5cbiIpOworCXByaW50ZigiIDY0SyBSQU0gU1lTVEVNICAzODkxMSBCQVNJQyBCWVRFUyBGUkVFXG5cbiIpOworCXByaW50ZigiUkVBRFlcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2VuZGlmCisJcyA9IGdldGVudigiaWRlX21heGJ1cyIpOworCWlmIChzKQorCSAgICBtYXhkZXYgPSBhdG9pKHMpICogMjsKKwllbHNlCisJICAgIG1heGRldiA9IDQ7CisKKwlzID0gZ2V0ZW52KCJzdGRvdXQiKTsKKwlpZiAocyAmJiBzdHJjbXAocywgInNlcmlhbCIpID09IDApCisJICAgIHJldHVybjsKKworCXZpZGVvX2NsZWFyKCk7CisJcHJpbnRmKCIlc1xuXG5DUFU6ICIsIHZlcnNpb25fc3RyaW5nKTsKKwljaGVja2NwdSgpOworCXByaW50ZigiRFJBTTogJWxkIE1CXG4iLCBiZF9nbG9iYWwtPmJpX21lbXNpemUvKDEwMjQqMTAyNCkpOworCXByaW50ZigiRlNCOiAlbGQgTUh6XG4iLCBiZF9nbG9iYWwtPmJpX2J1c2ZyZXEvMTAwMDAwMCk7CisKKwlwcmludGYoIlxuLS0tLSBEaXNrIHN1bW1hcnkgLS0tLVxuIik7CisJZm9yIChpID0gMDsgaSA8IG1heGRldjsgaSsrKQorCXsKKwkgICAgaWRlID0gaWRlX2dldF9kZXYoaSk7CisJICAgIHByaW50ZigiRGV2aWNlICVkOiAiLCBpKTsKKwkgICAgZGV2X3ByaW50KGlkZSk7CisJfQorCisvKgorICAgIHZpZGVvX2RyYXdfYm94KFNJTkdMRV9CT1gsIDB4MEYsICJUZXN0IDEiLCAwLCAwLDE4LCA3MiwgNCk7CisgICAgdmlkZW9fZHJhd19ib3goRE9VQkxFX0JPWCwgMHgwRiwgIlRlc3QgMiIsIDEsIDQsMTAsIDUwLCA2KTsKKyAgICB2aWRlb19kcmF3X2JveChET1VCTEVfQk9YLCAweDBGLCAiVGVzdCAzIiwgMCwgNDAsIDMsIDIwLCA1KTsKKworICAgIHZpZGVvX2RyYXdfdGV4dCgxLCA0LCAweDJGLCAiSGlnaGxpZ2h0ZWQgb3B0aW9ucyIpOworICAgIHZpZGVvX2RyYXdfdGV4dCgxLCA1LCAweDBGLCAiTm9uLXNlbGVjdGVkIG9wdGlvbiIpOworICAgIHZpZGVvX2RyYXdfdGV4dCgxLCA2LCAweDA3LCAiZGlzYWJsZWQgb3B0aW9uIik7CisqLworI2lmZGVmIEVBU1RFUkVHRworICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDdiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9iaW9zLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBNb3N0bHkgZG9uZSBhZnRlciB0aGUgU2NpdGVjaCBCaW9zIGVtdWxhdGlvbgorICogV3JpdHRlbiBieSBIYW5zLUr2cmcgRnJpZWRlbgorICogSHlwZXJpb24gRW50ZXJ0YWlubWVudAorICovCisjaW5jbHVkZSAieDg2ZW11LmgiCisjaW5jbHVkZSAiZ2x1ZS5oIgorCisjdW5kZWYgREVCVUcKKyNpZmRlZiBERUJVRworI2RlZmluZSBQUklOVEYoZm10LCBhcmdzLi4uKSBwcmludGYoZm10LCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfU0VHIDB4RkZGMAorI2RlZmluZSBQQ0lCSU9TX1NVQ0NFU1NGVUwgMAorI2RlZmluZSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQgMHg4NgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUJZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVXT1JEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOworCit0eXBlZGVmIGNoYXIgQllURTsKK3R5cGVkZWYgc2hvcnQgV09SVDsKK3R5cGVkZWYgbG9uZyBMT05HOworCitzdGF0aWMgaW5saW5lIFVCWVRFIHJlYWRfYnl0ZSh2b2xhdGlsZSBVQllURSogZnJvbSkKK3sKKyAgICBpbnQgeDsKKyAgICBhc20gdm9sYXRpbGUgKCJsYnogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKKyAgICByZXR1cm4gKFVCWVRFKXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9ieXRlKHZvbGF0aWxlIFVCWVRFICp0bywgaW50IHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3RiICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOworfQorCitzdGF0aWMgaW5saW5lIFVXT1JEIHJlYWRfd29yZF9saXR0bGUodm9sYXRpbGUgVVdPUkQgKmZyb20pCit7CisgICAgaW50IHg7CisgICAgYXNtIHZvbGF0aWxlICgibGhicnggJTAsMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogInIiIChmcm9tKSwgIm0iICgqZnJvbSkpOworICAgIHJldHVybiAoVVdPUkQpeDsKK30KKworc3RhdGljIGlubGluZSBVV09SRCByZWFkX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICpmcm9tKQoreworICAgIGludCB4OworICAgIGFzbSB2b2xhdGlsZSAoImxoeiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAoVVdPUkQpeDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3RoYnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9iaWcodm9sYXRpbGUgVVdPUkQgKnRvLCBpbnQgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdGggJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVUxPTkcgcmVhZF9sb25nX2xpdHRsZSh2b2xhdGlsZSBVTE9ORyAqZnJvbSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgYXNtIHZvbGF0aWxlICgibHdicnggJTAsMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogInIiIChmcm9tKSwgIm0iKCpmcm9tKSk7CisgICAgcmV0dXJuIChVTE9ORyl4OworfQorCitzdGF0aWMgaW5saW5lIFVMT05HIHJlYWRfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKmZyb20pCit7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGFzbSB2b2xhdGlsZSAoImx3eiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAoVUxPTkcpeDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdHdicnggJTEsMCwlMlxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpLCAiciIgKHRvKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2JpZyh2b2xhdGlsZSBVTE9ORyAqdG8sIFVMT05HIHgpCit7CisgICAgYXNtIHZvbGF0aWxlICgic3R3ICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOworfQorCisjZGVmaW5lIHBvcnRfdG9fbWVtKGZyb20pICgweEZFMDAwMDAwfChmcm9tKSkKKyNkZWZpbmUgaW5fYnl0ZShmcm9tKSByZWFkX2J5dGUoIChVQllURSAqKXBvcnRfdG9fbWVtKGZyb20pKQorI2RlZmluZSBpbl93b3JkKGZyb20pIHJlYWRfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0oZnJvbSkpCisjZGVmaW5lIGluX2xvbmcoZnJvbSkgcmVhZF9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbShmcm9tKSkKKyNkZWZpbmUgb3V0X2J5dGUodG8sIHZhbCkgd3JpdGVfYnl0ZSgoVUJZVEUgKilwb3J0X3RvX21lbSh0byksIHZhbCkKKyNkZWZpbmUgb3V0X3dvcmQodG8sIHZhbCkgd3JpdGVfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0odG8pLCB2YWwpCisjZGVmaW5lIG91dF9sb25nKHRvLCB2YWwpIHdyaXRlX2xvbmdfbGl0dGxlKChVTE9ORyAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQorCitzdGF0aWMgdm9pZCBYODZBUEkgdW5kZWZpbmVkX2ludHIoaW50IGludG5vKQoreworICAgIGV4dGVybiB1MTYgQTFfcmR3KHUzMiBhZGRyKTsKKyAgICBpZiAoQTFfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQorICAgIHsKKwlQUklOVEYoIlVuZGVmaW5lZCBpbnRlcnJ1cHQgJXhoIGNhbGxlZCBBWCA9ICV4aCwgQlggPSAleGgsIENYID0gJXhoLCBEWCA9ICV4aFxuIiwKKwkgICBpbnRubywgTS54ODYuUl9BWCwgTS54ODYuUl9CWCwgTS54ODYuUl9DWCwgTS54ODYuUl9EWCk7CisJWDg2RU1VX2hhbHRfc3lzKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUFJJTlRGKCJDYWxsaW5nIGludGVycnVwdCAleGgsIEFMPSV4aCwgQUg9JXhoXG4iLCBpbnRubywgTS54ODYuUl9BTCwgTS54ODYuUl9BSCk7CisJWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKGludCBpbnRubyk7CitzdGF0aWMgdm9pZCBYODZBUEkgaW50MTUoaW50IGludG5vKTsKKworc3RhdGljIHZvaWQgWDg2QVBJIGludDEwKGludCBpbnRubykKK3sKKyAgICBpZiAoQTFfcmR3KGludG5vKjQrMikgPT0gQklPU19TRUcpCisJaW50NDIoaW50bm8pOworICAgIGVsc2UKKyAgICB7CisJUFJJTlRGKCJpbnQxMDogYnJhbmNoaW5nIHRvICUwNFg6JTA0WCwgQUw9JXhoLCBBSD0leGhcbiIsIEExX3JkdyhpbnRubyo0KzIpLCBBMV9yZHcoaW50bm8qNCksCisJICAgICAgIE0ueDg2LlJfQUwsIE0ueDg2LlJfQUgpOworCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFg4NkFQSSBpbnQxQShpbnQgaW50bm8pCit7CisgICAgaW50IGRldmljZTsKKworICAgIHN3aXRjaChNLng4Ni5SX0FYKQorICAgIHsKKyAgICBjYXNlIDB4QjEwMTogLy8gUENJIEJpb3MgUHJlc2VudD8KKwlNLng4Ni5SX0FMICA9IDB4MDA7CisJTS54ODYuUl9FRFggPSAweDIwNDk0MzUwOworCU0ueDg2LlJfQlggID0gMHgwMjEwOworCU0ueDg2LlJfQ0wgID0gMzsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCWJyZWFrOworICAgIGNhc2UgMHhCMTAyOiAvLyBGaW5kIGRldmljZQorCWRldmljZSA9IG15cGNpX2ZpbmRfZGV2aWNlKE0ueDg2LlJfRFgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfU0kpOworCWlmIChkZXZpY2UgIT0gLTEpCisJeworCSAgICBNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCSAgICBNLng4Ni5SX0JIID0gbXlwY2lfYnVzKGRldmljZSk7CisJICAgIE0ueDg2LlJfQkwgPSBteXBjaV9kZXZmbihkZXZpY2UpOworCX0KKwllbHNlCisJeworCSAgICBNLng4Ni5SX0FIID0gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCX0KKwlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKKwlicmVhazsKKyAgICBjYXNlIDB4QjEwMzogLy8gRmluZCBQQ0kgY2xhc3MgY29kZQorCU0ueDg2LlJfQUggPSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJLy9wcmludGYoIkZpbmQgYnkgY2xhc3Mgbm90IHlldCBpbXBsbWVudGVkIik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7CisJYnJlYWs7CisgICAgY2FzZSAweEIxMDg6IC8vIHJlYWQgY29uZmlnIGJ5dGUKKwlNLng4Ni5SX0NMID0gbXlwY2lfcmVhZF9jZmdfYnl0ZShNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKKwlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOworCS8vcHJpbnRmKCJyZWFkX2NvbmZpZ19ieXRlICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLAorCS8vCSAgICBNLng4Ni5SX0NMKTsKKwlicmVhazsKKyAgICBjYXNlIDB4QjEwOTogLy8gcmVhZCBjb25maWcgd29yZAorCU0ueDg2LlJfQ1ggPSBteXBjaV9yZWFkX2NmZ193b3JkKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREkpOworCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7CisJLy9wcmludGYoInJlYWRfY29uZmlnX3dvcmQgJXgsJXgsJXggLT4gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksCisJLy8JICAgIE0ueDg2LlJfQ1gpOworCWJyZWFrOworICAgIGNhc2UgMHhCMTBBOiAvLyByZWFkIGNvbmZpZyBkd29yZAorCU0ueDg2LlJfRUNYID0gbXlwY2lfcmVhZF9jZmdfbG9uZyhNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKKwlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOworCS8vcHJpbnRmKCJyZWFkX2NvbmZpZ19sb25nICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLAorCS8vICAgIE0ueDg2LlJfRUNYKTsKKwlicmVhazsKKyAgICBjYXNlIDB4QjEwQjogLy8gd3JpdGUgY29uZmlnIGJ5dGUKKwlteXBjaV93cml0ZV9jZmdfYnl0ZShNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0NMKTsKKwlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOworCS8vcHJpbnRmKCJ3cml0ZV9jb25maWdfYnl0ZSAleCwleCwleCA8LSAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwKKwkvLyAgICBNLng4Ni5SX0NMKTsKKwlicmVhazsKKyAgICBjYXNlIDB4QjEwQzogLy8gd3JpdGUgY29uZmlnIHdvcmQKKwlteXBjaV93cml0ZV9jZmdfd29yZChNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0NYKTsKKwlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOworCS8vcHJpbnRmKCJ3cml0ZV9jb25maWdfd29yZCAleCwleCwleCA8LSAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwKKwkvLwkgICAgTS54ODYuUl9DWCk7CisJYnJlYWs7CisgICAgY2FzZSAweEIxMEQ6IC8vIHdyaXRlIGNvbmZpZyBkd29yZAorCW15cGNpX3dyaXRlX2NmZ19sb25nKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksIE0ueDg2LlJfRUNYKTsKKwlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOworCS8vcHJpbnRmKCJ3cml0ZV9jb25maWdfbG9uZyAleCwleCwleCA8LSAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwKKwkvLwkgICAgTS54ODYuUl9FQ1gpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJUFJJTlRGKCJCSU9TIGludCAleGg6IFVua25vd24gZnVuY3Rpb24gQVg9JTA0eGhcbiIsIGludG5vLCBNLng4Ni5SX0FYKTsKKworICAgIH0KK30KKwordm9pZCBiaW9zX2luaXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBYODZFTVVfaW50ckZ1bmNzIGJpb3NfaW50cl90YWJbMjU2XTsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKKyAgICB7CisJd3JpdGVfbG9uZ19saXR0bGUoTS5tZW1fYmFzZStpKjQsIEJJT1NfU0VHPDwxNik7CisJYmlvc19pbnRyX3RhYltpXSA9IHVuZGVmaW5lZF9pbnRyOworICAgIH0KKworICAgIGJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKKyAgICBiaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7CisgICAgYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOworICAgIGJpb3NfaW50cl90YWJbMHgxNV0gPSBpbnQxNTsKKworICAgIGJpb3NfaW50cl90YWJbMHg2RF0gPSBpbnQ0MjsKKyAgICAKKyAgICBYODZFTVVfc2V0dXBJbnRyRnVuY3MoYmlvc19pbnRyX3RhYik7CisgICAgdmlkZW9faW5pdCgpOworfQorCit1bnNpZ25lZCBjaGFyIHNldHVwXzQweDI1W10gPQoreworICAgIDB4MzgsIDB4MjgsIDB4MmQsIDB4MGEsIDB4MWYsIDYsIDB4MTksCisgICAgMHgxYywgMiwgNywgNiwgNywgMCwgMCwgMCwgMAorfTsKKwordW5zaWduZWQgY2hhciBzZXR1cF84MHgyNVtdID0KK3sKKyAgICAweDcxLCAweDUwLCAweDVhLCAweDBhLCAweDFmLCA2LCAweDE5LAorICAgIDB4MWMsIDIsIDcsIDYsIDcsIDAsIDAsIDAsIDAKK307CisKK3Vuc2lnbmVkIGNoYXIgc2V0dXBfZ3JhcGhpY3NbXSA9Cit7CisgICAgMHgzOCwgMHgyOCwgMHgyMCwgMHgwYSwgMHg3ZiwgNiwgMHg2NCwKKyAgICAweDcwLCAyLCAxLCA2LCA3LCAwLCAwLCAwLCAwCit9OworCit1bnNpZ25lZCBjaGFyIHNldHVwX2J3W10gPQoreworICAgIDB4NjEsIDB4NTAsIDB4NTIsIDB4MGYsIDB4MTksIDYsIDB4MTksCisgICAgMHgxOSwgMiwgMHgwZCwgMHgwYiwgMHgwYywgMCwgMCwgMCwgMAorfTsKKwordW5zaWduZWQgY2hhciAqIHNldHVwX21vZGVzW10gPQoreworICAgIHNldHVwXzQweDI1LCAgICAgLy8gbW9kZSAwOiA0MHgyNSBidyB0ZXh0CisgICAgc2V0dXBfNDB4MjUsICAgICAvLyBtb2RlIDE6IDQweDI1IGNvbCB0ZXh0CisgICAgc2V0dXBfODB4MjUsICAgICAvLyBtb2RlIDI6IDgweDI1IGJ3IHRleHQKKyAgICBzZXR1cF84MHgyNSwgICAgIC8vIG1vZGUgMzogODB4MjUgY29sIHRleHQKKyAgICBzZXR1cF9ncmFwaGljcywgIC8vIG1vZGUgNDogMzIweDIwMCBjb2wgZ3JhcGhpY3MKKyAgICBzZXR1cF9ncmFwaGljcywgIC8vIG1vZGUgNTogMzIweDIwMCBidyBncmFwaGljcworICAgIHNldHVwX2dyYXBoaWNzLCAgLy8gbW9kZSA2OiA2NDB4MjAwIGJ3IGdyYXBoaWNzCisgICAgc2V0dXBfYncgICAgICAgICAvLyBtb2RlIDc6IDgweDI1IG1vbm8gdGV4dAorfTsKKwordW5zaWduZWQgaW50IHNldHVwX2NvbHNbXSA9Cit7CisgICAgNDAsIDQwLCA4MCwgODAsIDQwLCA0MCwgODAsIDgwCit9OworCit1bnNpZ25lZCBjaGFyIHNldHVwX21vZGVzZXRzW10gPQoreworICAgICAweDJDLCAweDI4LCAweDJELCAweDI5LCAweDJBLCAweDJFLCAweDFFLCAweDI5Cit9OworCit1bnNpZ25lZCBpbnQgc2V0dXBfYnVmc2l6ZVtdID0KK3sKKyAgICAyMDQ4LCAyMDQ4LCA0MDk2LCAyMDk2LCAxNjM4NCwgMTYzODQsIDE2Mzg0LCA0MDk2Cit9OworCit2b2lkIGJpb3Nfc2V0X21vZGUoaW50IG1vZGUpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBtb2RlX3NldCA9IHNldHVwX21vZGVzZXRzW21vZGVdOyAvLyBDb250cm9sIHJlZ2lzdGVyIHZhbHVlCisgICAgdW5zaWduZWQgY2hhciAqc2V0dXBfcmVncyA9IHNldHVwX21vZGVzW21vZGVdOyAvLyBSZWdpc3RlciAzRDQgQXJyYXkKKworICAgIC8vIFN3aXRjaCB2aWRlbyBvZmYKKyAgICBvdXRfYnl0ZSgweDNEOCwgbW9kZV9zZXQgJiAweDM3KTsKKworICAgIC8vIFNldCB1cCBwYXJhbWV0ZXJzIGF0IDNENGgKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKwlvdXRfYnl0ZSgweDNENCwgKHVuc2lnbmVkIGNoYXIpaSk7CisJb3V0X2J5dGUoMHgzRDUsICpzZXR1cF9yZWdzKTsKKwlzZXR1cF9yZWdzKys7CisgICAgfQorCisgICAgLy8gRW5hYmxlIHZpZGVvCisgICAgb3V0X2J5dGUoMHgzRDgsIG1vZGVfc2V0KTsKKworICAgIC8vIFNldCBvdmVyc2NhbgorICAgIGlmIChtb2RlID09IDYpIG91dF9ieXRlKDB4M0Q5LCAweDNGKTsKKyAgICBlbHNlICAgICAgICAgICBvdXRfYnl0ZSgweDNEOSwgMHgzMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb3NfcHJpbnRfc3RyaW5nKHZvaWQpCit7CisgICAgZXh0ZXJuIHZvaWQgdmlkZW9fYmlvc19wcmludF9zdHJpbmcoY2hhciAqc3RyaW5nLCBpbnQgeCwgaW50IHksIGludCBhdHRyLCBpbnQgY291bnQpOworICAgIGNoYXIgKnMgPSAoY2hhciAqKShNLng4Ni5SX0VTPDw0KSArIE0ueDg2LlJfQlA7CisgICAgaW50IGF0dHI7CisgICAgaWYgKE0ueDg2LlJfQUwgJiAweDAyKSBhdHRyID0gLSAxOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgYXR0ciA9IE0ueDg2LlJfQkw7CisgICAgdmlkZW9fYmlvc19wcmludF9zdHJpbmcocywgTS54ODYuUl9ESCwgTS54ODYuUl9ETCwgYXR0ciwgTS54ODYuUl9DWCk7Cit9CisKK3N0YXRpYyB2b2lkIFg4NkFQSSBpbnQ0MihpbnQgaW50bm8pCit7CisgICAgc3dpdGNoIChNLng4Ni5SX0FIKQorICAgIHsKKyAgICBjYXNlIDB4MDA6CisJYmlvc19zZXRfbW9kZShNLng4Ni5SX0FMKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MTM6CisJYmlvc19wcmludF9zdHJpbmcoKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCVBSSU5URigiV2FybmluZzogVklERU8gQklPUyBpbnRlcnJ1cHQgJXhoIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXhoLCBBTCA9ICV4aFxuIiwKKwkgICAgICAgaW50bm8sIE0ueDg2LlJfQUgsIE0ueDg2LlJfQUwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubykKK3sKKyAgICBQUklOVEYoIkNhbGxlZCBpbnRlcnJ1cHQgMTVoOiBBWCA9ICV4aCwgQlggPSAleGgsIENYID0gJXhoLCBEWCA9ICV4aFxuIiwKKwkgICBNLng4Ni5SX0FYLCBNLng4Ni5SX0JYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX0RYKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY1ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5jCkBAIC0wLDAgKzEsNTI4IEBACisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8NzR4eF83eHguaD4KKworCisjaWZkZWYgREVCVUcKKyN1bmRlZiBERUJVRworI2VuZGlmCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdjLi4uKQorI2VuZGlmCisKK3N0YXRpYyBwY2lfZGV2X3QgdG9fcGNpKGludCBidXMsIGludCBkZXZmbikKK3sKKyAgICByZXR1cm4gUENJX0JERihidXMsIChkZXZmbj4+MyksIGRldmZuJjMpOworfQorCitpbnQgbXlwY2lfZmluZF9kZXZpY2UoaW50IHZlbmRvciwgaW50IHByb2R1Y3QsIGludCBpbmRleCkKK3sKKyAgICByZXR1cm4gcGNpX2ZpbmRfZGV2aWNlKHZlbmRvciwgcHJvZHVjdCwgaW5kZXgpOworfQorCitpbnQgbXlwY2lfYnVzKGludCBkZXZpY2UpCit7CisgICAgcmV0dXJuIFBDSV9CVVMoZGV2aWNlKTsKK30KKworaW50IG15cGNpX2RldmZuKGludCBkZXZpY2UpCit7CisgICAgcmV0dXJuIChQQ0lfREVWKGRldmljZSk8PDMpIHwgUENJX0ZVTkMoZGV2aWNlKTsKK30KKworCisjZGVmaW5lIG15cGNpX3JlYWRfZnVuYyh0eXBlLCBzaXplKQkJCQlcCit0eXBlIG15cGNpX3JlYWRfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkJXAorewkJCQkJCQkJXAorICAgIHR5cGUgYzsJCQkJCQkJXAorICAgIHBjaV9yZWFkX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOwlcCisgICAgcmV0dXJuIGM7CQkJCQkJCVwKK30KKworI2RlZmluZSBteXBjaV93cml0ZV9mdW5jKHR5cGUsIHNpemUpCQkJCVwKK3ZvaWQgbXlwY2lfd3JpdGVfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQlcCit7CQkJCQkJCQlcCisgICAgcGNpX3dyaXRlX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgdmFsdWUpOwlcCit9CisKK215cGNpX3JlYWRfZnVuYyh1OCxieXRlKTsKK215cGNpX3JlYWRfZnVuYyh1MTYsd29yZCk7CisKK215cGNpX3dyaXRlX2Z1bmModTgsYnl0ZSk7CitteXBjaV93cml0ZV9mdW5jKHUxNix3b3JkKTsKKwordTMyIG15cGNpX3JlYWRfY2ZnX2xvbmcoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KQoreworICAgIHUzMiBjOworICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOworICAgIHJldHVybiBjOworfQorCit2b2lkIG15cGNpX3dyaXRlX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQodG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsIHZhbHVlKTsKK30KKwordm9pZCBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBjaGFyIGJ1ZltDRkdfUEJTSVpFXTsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgKHZvaWQpdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIHByaW50ZihidWYpOworfQorCitjaGFyICpfZ2V0ZW52KGNoYXIgKm5hbWUpCit7CisgICAgcmV0dXJuIGdldGVudihuYW1lKTsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfYmFyX3NpemUocGNpX2Rldl90IGRldiwgaW50IG9mZnNldCkKK3sKKyAgICB1MzIgYmFyX2JhY2ssIGJhcl92YWx1ZTsKKworICAgIC8qICBTYXZlIG9sZCBCQVIgdmFsdWUgKi8KKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsICZiYXJfYmFjayk7CisKKyAgICAvKiAgV3JpdGUgYWxsIDEncy4gKi8KKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCB+MCk7CisKKyAgICAvKiAgTm93IHJlYWQgYmFjayB0aGUgcmVsZXZhbnQgYml0cyAqLworICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgJmJhcl92YWx1ZSk7CisKKyAgICAvKiAgUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLworICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsIGJhcl9iYWNrKTsKKworICAgIGlmIChiYXJfdmFsdWUgPT0gMCkgcmV0dXJuIDB4RkZGRkZGRkY7IC8qICBUaGlzIEJBUiBpcyBkaXNhYmxlZCAqLworCisgICAgaWYgKChiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKKyAgICB7CisJLyogIFRoaXMgaXMgYSBtZW1vcnkgc3BhY2UgQkFSLiBNYXNrIGl0IG91dCBzbyB3ZSBnZXQgdGhlIHNpemUgb2YgaXQgKi8KKwlyZXR1cm4gfihiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKSArIDE7CisgICAgfQorCisgICAgLyogIE5vdCBzdWl0YWJsZSAqLworICAgIHJldHVybiAweEZGRkZGRkZGOworfQorCit2b2lkIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCkKK3sKKyAgICB1OCBjZmc7CisgICAgcGNpX2Rldl90IGFydCA9IFBDSV9CREYoMCwwLDApOworCisgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCAmY2ZnKTsKKyAgICAvKiBjZmcgfD0gMHgwODsgKi8KKyAgICBjZmcgfD0gMHgyMDsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOworfQorCit2b2lkIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpCit7CisgICAgdTggY2ZnOworICAgIHBjaV9kZXZfdCBhcnQgPSBQQ0lfQkRGKDAsMCwwKTsKKworICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgJmNmZyk7CisgICAgLyogY2ZnICY9IH4weDA4OyAqLworICAgIGNmZyAmPSB+MHgyMDsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOworfQorCit2b2lkIG1hcF9yb20ocGNpX2Rldl90IGRldiwgdTMyIGFkZHJlc3MpCit7CisgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgYWRkcmVzc3xQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKK30KKwordm9pZCB1bm1hcF9yb20ocGNpX2Rldl90IGRldikKK3sKKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKK30KKwordm9pZCBiYXRfbWFwKHU4IGJhdG51bSwgdTMyIGFkZHJlc3MsIHUzMiBsZW5ndGgpCit7CisgICAgdTMyIHRlbXAgPSBhZGRyZXNzOworICAgIGFkZHJlc3MgJj0gMHhGRkZFMDAwMDsKKyAgICB0ZW1wICAgICY9IDB4MDAwMUZGRkY7CisgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEgKSA+PiAxNzsKKyAgICBsZW5ndGggPDw9IDI7CisKKyAgICBzd2l0Y2ggKGJhdG51bSkKKyAgICB7CisgICAgY2FzZSAwOgorCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAwLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKKwlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMCwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7CisJYnJlYWs7CisgICAgY2FzZSAxOgorCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAxLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKKwlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMSwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7CisJYnJlYWs7CisgICAgY2FzZSAyOgorCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAyLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKKwlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMiwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7CisJYnJlYWs7CisgICAgY2FzZSAzOgorCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAzLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKKwlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMywgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7CisJYnJlYWs7CisgICAgfQorfQorCitpbnQgZmluZF9pbWFnZSh1MzIgcm9tX2FkZHJlc3MsIHUzMiByb21fc2l6ZSwgdm9pZCAqKmltYWdlLCB1MzIgKmltYWdlX3NpemUpOworCitpbnQgYXR0ZW1wdF9tYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHZvaWQgKmNvcHlfYWRkcmVzcykKK3sKKyAgICB1MzIgcm9tX3NpemUgICAgICA9IDA7CisgICAgdTMyIHJvbV9hZGRyZXNzICAgPSAwOworICAgIHUzMiBiYXJfc2l6ZSAgICAgID0gMDsKKyAgICB1MzIgYmFyX2JhY2t1cCAgICA9IDA7CisgICAgaW50IGksajsKKyAgICB2b2lkICppbWFnZSAgICAgICA9IDA7CisgICAgdTMyIGltYWdlX3NpemUgICAgPSAwOworICAgIGludCBkaWRfY29ycmVjdCAgID0gMDsKKyAgICB1MzIgcHJlZmV0Y2hfYWRkciA9IDA7CisgICAgdTMyIHByZWZldGNoX3NpemUgPSAwOworICAgIHUzMiBwcmVmZXRjaF9pZHggID0gMDsKKworICAgIC8qICBHZXQgdGhlIHNpemUgb2YgdGhlIGV4cGFuc2lvbiByb20gKi8KKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAweEZGRkZGRkZGKTsKKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZyb21fc2l6ZSk7CisgICAgaWYgKChyb21fc2l6ZSAmIDB4MDEpID09IDApCisgICAgeworCVBSSU5URigiTm8gUk9NXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByb21fc2l6ZSAmPSAweEZGRkZGODAwOworICAgIHJvbV9zaXplID0gKH5yb21fc2l6ZSkrMTsKKworICAgIFBSSU5URigiUk9NIFNpemUgaXMgJWRLXG4iLCByb21fc2l6ZS8xMDI0KTsKKworICAgIC8qCisgICAgICogVHJ5IHRvIGZpbmQgYSBwbGFjZSBmb3IgdGhlIFJPTS4gV2UgYWx3YXlzIGF0dGVtcHQgdG8gdXNlCisgICAgICogb25lIG9mIHRoZSBjYXJkJ3MgYmFzZXMgZm9yIHRoaXMsIGFzIHRoaXMgd2lsbCBiZSBpbiBhbnkKKyAgICAgKiBicmlkZ2UncyByZXNvdXJjZSByYW5nZSBhcyB3ZWxsIGFzIGJlaW5nIGZyZWUgb2YgY29uZmxpY3RzCisgICAgICogd2l0aCBvdGhlciBjYXJkcy4gSW4gYSBncmFwaGljcyBjYXJkIGl0IGlzIHZlcnkgdW5saWtlbHkKKyAgICAgKiB0aGF0IHRoZXJlIHdvbid0IGJlIGFueSBiYXNlIGFkZHJlc3MgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8KKyAgICAgKiBob2xkIHRoZSByb20uCisgICAgICoKKyAgICAgKiBGSVhNRTogVG8gd29yayBhcm91bmQgdGhpcywgdGhlb3JldGljYWxseSB0aGUgbGFyZ2VzdCBiYXNlCisgICAgICogY291bGQgYmUgdXNlZCBpZiBub25lIGlzIGZvdW5kIGluIHRoZSBsb29wIGJlbG93LgorICAgICAqLworCisgICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQorICAgIHsKKwliYXJfc2l6ZSA9IGdldF9iYXJfc2l6ZShkZXYsIGkpOworCVBSSU5URigiUENJX0JBU0VfQUREUkVTU18lZCBpcyAlZEsgbGFyZ2VcbiIsCisJICAgICAgIChpIC0gUENJX0JBU0VfQUREUkVTU18wKS80LAorCSAgICAgICBiYXJfc2l6ZS8xMDI0KTsKKwlpZiAoYmFyX3NpemUgIT0gMHhGRkZGRkZGRiAmJiBiYXJfc2l6ZSA+PSByb21fc2l6ZSkKKwl7CisJICAgIFBSSU5URigiRm91bmQgYSBtYXRjaCBmb3Igcm9tIHNpemVcbiIpOworCSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpLCAmcm9tX2FkZHJlc3MpOworCSAgICByb21fYWRkcmVzcyAmPSAweEZGRkZGRkYwOworCSAgICBpZiAocm9tX2FkZHJlc3MgIT0gMCAmJiByb21fYWRkcmVzcyAhPSAweEZGRkZGRkYwKSBicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKHJvbV9hZGRyZXNzID09IDAgfHwgcm9tX2FkZHJlc3MgPT0gMHhGRkZGRkZGMCkKKyAgICB7CisJUFJJTlRGKCJObyBzdWl0YWJsZSByb20gYWRkcmVzcyBmb3VuZFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogIERpc2FibGUgdGhlIEJBUiAqLworICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZiYXJfYmFja3VwKTsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgMCk7CisKKyAgICAvKiAgTWFwIFJPTSAqLworICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIHJvbV9hZGRyZXNzIHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisKKyAgICAvKiAgQ29weSB0aGUgcm9tIHRvIGEgcGxhY2UgaW4gdGhlIGVtdWxhdG9yIHNwYWNlICovCisgICAgUFJJTlRGKCJDbGFpbWluZyBCQVQgMlxuIik7CisgICAgYmF0X21hcCgyLCByb21fYWRkcmVzcywgcm9tX3NpemUpOworICAgIC8qIHNob3dfYmF0X21hcHBpbmcoKTsgKi8KKworICAgIGlmICgwID09IGZpbmRfaW1hZ2Uocm9tX2FkZHJlc3MsIHJvbV9zaXplLCAmaW1hZ2UsICZpbWFnZV9zaXplKSkKKyAgICB7CisJUFJJTlRGKCJObyB4ODYgQklPUyBpbWFnZSBmb3VuZFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgUFJJTlRGKCJDb3B5aW5nICVsZCBieXRlcyBmcm9tIDB4JWx4IHRvIDB4JWx4XG4iLCAobG9uZylpbWFnZV9zaXplLCAobG9uZylpbWFnZSwgKGxvbmcpY29weV9hZGRyZXNzKTsKKworICAgIC8qIG1lbWNweShjb3B5X2FkZHJlc3MsIHJvbV9hZGRyZXNzLCByb21fc2l6ZSk7ICovCisgICAgeworCXVuc2lnbmVkIGNoYXIgKmZyb20gPSAodW5zaWduZWQgY2hhciAqKWltYWdlOyAvKiByb21fYWRkcmVzczsgKi8KKwl1bnNpZ25lZCBjaGFyICp0byA9ICh1bnNpZ25lZCBjaGFyICopY29weV9hZGRyZXNzOworCWZvciAoaj0wOyBqPGltYWdlX3NpemUgLypyb21fc2l6ZSovOyBqKyspCisJeworCSAgICAqdG8rKyA9ICpmcm9tKys7CisJfQorICAgIH0KKworICAgIFBSSU5URigiQ29weSBpcyBkb25lXG4iKTsKKworICAgIC8qICBVbm1hcCB0aGUgUk9NIGFuZCByZXN0b3JlIHRoZSBCQVIgKi8KKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgYmFyX2JhY2t1cCk7CisKKyAgICAvKiAgRklYTUU6ICovCisgICAgYmF0X21hcCgyLCAweDgwMDAwMDAwLCAyNTYqMTAyNCoxMDI0KTsKKyAgICBzaG93X2JhdF9tYXBwaW5nKCk7CisKKyAgICAvKgorICAgICAqIFNpbmNlIG1vc3QgY2FyZHMgY2FuIHByb2JhYmx5IG9ubHkgZG8gMTYgYml0IElPIGFkZHJlc3NpbmcsIHdlCisgICAgICogY29ycmVjdCB0aGVpciBJTyBiYXNlIGludG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuCisgICAgICogVGhpcyBzaG91bGQgZG8gZm9yIG1vc3QuCisgICAgICovCisgICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQorICAgIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZ2YWx1ZSk7CisJaWYgKHZhbHVlICYgMHgwMSkgLyogIElPICovCisJeworCSAgICBkaWRfY29ycmVjdCA9IDE7CisJICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBpLCAweDEwMDEpOworCSAgICBicmVhazsKKwl9CisKKwlpZiAodmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKKwl7CisJICAgIHByZWZldGNoX2lkeCA9IGk7CisJICAgIHByZWZldGNoX2FkZHIgPSB2YWx1ZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJICAgIHByZWZldGNoX3NpemUgPSBnZXRfYmFyX3NpemUoZGV2LCBpKTsKKwl9CisgICAgfQorCisgICAgaWYgKDEpIC8qIGRpZF9jb3JyZWN0KSAqLworICAgIHsKKwlleHRlcm4gcGNpX2Rldl90IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1c25yKTsKKwlpbnQgYnVzbnIgPSBQQ0lfQlVTKGRldik7CisJaWYgKGJ1c25yKQorCXsKKwkgICAgcGNpX2Rldl90IGJyaWRnZTsKKwkgICAgUFJJTlRGKCJOZWVkIHRvIGNvcnJlY3QgYnJpZGdlIGRldmljZSBmb3IgSU8gcmFuZ2UgY2hhbmdlXG4iKTsKKwkgICAgYnJpZGdlID0gcGNpX2ZpbmRfYnJpZGdlX2Zvcl9idXMoTlVMTCwgYnVzbnIpOworCSAgICBpZiAoYnJpZGdlID09IFBDSV9BTllfSUQpCisJICAgIHsKKwkJUFJJTlRGKCJEaWRuJ3QgZmluZCBicmlkZ2UuIEhvcGUgdGhhdCdzIE9LXG4iKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogU2V0IHVwcGVyIEkvTyBiYXNlL2xpbWl0IHRvIDAKKwkJICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzAsIDB4MDApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDMxLCAweDAwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgzMiwgMHgwMCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzMsIDB4MDApOworCQlpZiAoZGlkX2NvcnJlY3QpCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBzZXQgbG93ZXIgSS9PIGJhc2UgdG8gMTAwMAorCQkgICAgICogVGhhdCBpcywgYml0cyAwOjMgYXJlIHNldCB0byAwMDAxIGJ5IGRlZmF1bHQuCisJCSAgICAgKiBiaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKKwkJICAgICAqIGFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgMC4KKwkJICAgICAqLworCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxQywgMHgxMSk7CisJCSAgICAvKgorCQkgICAgICogU2V0IGxvd2VyIEkvTyBsaW1pdCB0byAxRkZGCisJCSAgICAgKiBUaGF0IGlzLCBiaXRzIDA6MyBhcmUgcmVzZXJ2ZWQgYW5kIGFsd2F5cyAwMDAwCisJCSAgICAgKiBCaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKKwkJICAgICAqIEFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgRi4KKwkJICAgICAqLworCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxRCwgMHgxMCk7CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDBELCAweDIwKTsKKwkJICAgIFBSSU5URigiQ29ycmVjdGVkIGJyaWRnZSByZXNvdXJjZSByYW5nZSBvZiBicmlkZ2UgYXQgJTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICBQQ0lfQlVTKGJyaWRnZSksIFBDSV9ERVYoYnJpZGdlKSwgUENJX0ZVTkMoYnJpZGdlKSk7CisKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBUaGlzIGNhcmQgZG9lc24ndCBoYXZlIEkvTywgd2UgZGlzYWJsZSBJL08gZm9yd2FyZGluZworCQkgICAgICovCisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDFDLCAweDExKTsKKwkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MUQsIDB4MDApOworCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKKwkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKKwkJICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfSU8pOworCQkgICAgUFJJTlRGKCJEaXNhYmxlZCBicmlkZ2UgcmVzb3VyY2UgcmFuZ2Ugb2YgYnJpZGdlIGF0ICUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgUENJX0JVUyhicmlkZ2UpLCBQQ0lfREVWKGJyaWRnZSksIFBDSV9GVU5DKGJyaWRnZSkpOworCisJCX0KKwkgICAgfQorCSAgICAvKgorCSAgICAgKiBDb3JyZWN0IHRoZSBwcmVmZXRjaGFibGUgbWVtb3J5IGJhc2UsIHdoaWNoIGlzIG5vdCBzZXQgY29ycmVjdGx5IGJ5CisJICAgICAqIHRoZSBVLUJvb3QgYXV0b2NvbmZpZyBzdHVmZgorCSAgICAgKi8KKwkgICAgaWYgKHByZWZldGNoX2lkeCkKKwkgICAgeworLyogCQlQUklOVEYoIlNldHRpbmcgcHJlZmV0Y2hhYmxlIHJhbmdlIHRvICV4LCAleCAoJXggYW5kICV4KVxuIiwgKi8KKy8qIAkJICAgICAgIHByZWZldGNoX2FkZHIsIHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSwgKi8KKy8qIAkJICAgICAgIHByZWZldGNoX2FkZHI+PjE2LCAocHJlZmV0Y2hfYWRkcitwcmVmZXRjaF9zaXplKT4+MTYpOyAqLworLyogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgKHByZWZldGNoX2FkZHI+PjE2KSk7ICovCisvKiAJCXBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgKHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSk+PjE2KTsgKi8KKwkgICAgfQorCisJICAgIHBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9CQVNFLCAweDEwMDApOworCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsIDB4MDAwMCk7CisKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHhEMCwgMHgwQSk7CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4RDMsIDB4MDQpOworCisJICAgIC8qCisJICAgICAqIFNldCB0aGUgaW50ZXJydXB0IHBpbiB0byAwCisJICAgICAqLworI2lmIDAKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sIDApOworI2VuZGlmCisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfTElORSwgMCk7CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKKworCX0KKyAgICB9CisKKyAgICAvKiBGaW5hbGx5LCBlbmFibGUgdGhlIGNhcmQncyBJTyBhbmQgbWVtb3J5IHJlc3BvbnNlICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTyk7CisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMCk7CisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDApOworCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBmaW5kX2ltYWdlKHUzMiByb21fYWRkcmVzcywgdTMyIHJvbV9zaXplLCB2b2lkICoqaW1hZ2UsIHUzMiAqaW1hZ2Vfc2l6ZSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqcm9tID0gKHVuc2lnbmVkIGNoYXIgKilyb21fYWRkcmVzczsKKyAgICAvKiBpZiAoKnJvbSAhPSAweDU1IHx8ICoocm9tKzEpICE9IDB4QUEpIHJldHVybiAwOyAvLyBObyBiaW9zIHJvbSB0aGlzIGlzLCB5ZXMuICovCisKKyAgICBmb3IgKDs7KQorICAgIHsKKwl1bnNpZ25lZCBzaG9ydCBwY2lfZGF0YV9vZmZzZXQgPSAqKHJvbSsweDE4KSArIDI1NiAqICoocm9tKzB4MTkpOworCXVuc2lnbmVkIHNob3J0IHBjaV9pbWFnZV9sZW5ndGggPSAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTApICsgMjU2ICogKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTEpKSAqIDUxMjsKKwl1bnNpZ25lZCBjaGFyIHBjaV9pbWFnZV90eXBlID0gKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTQpOworCWlmICgqcm9tICE9IDB4NTUgfHwgKihyb20rMSkgIT0gMHhBQSkKKwl7CisJICAgIFBSSU5URigiSW52YWxpZCBoZWFkZXIgdGhpcyBpc1xuIik7CisJICAgIHJldHVybiAwOworCX0KKwlQUklOVEYoIkltYWdlICVpOiBUeXBlICVkICglcylcbiIsIGkrKywgcGNpX2ltYWdlX3R5cGUsCisJICAgICAgIHBjaV9pbWFnZV90eXBlPT0wID8gIng4NiIgOgorCSAgICAgICBwY2lfaW1hZ2VfdHlwZT09MSA/ICJPcGVuRmlybXdhcmUiIDoKKwkgICAgICAgIlVua25vd24iKTsKKwlpZiAocGNpX2ltYWdlX3R5cGUgPT0gMCkKKwl7CisJICAgICppbWFnZSA9IHJvbTsKKwkgICAgKmltYWdlX3NpemUgPSBwY2lfaW1hZ2VfbGVuZ3RoOworCSAgICByZXR1cm4gMTsKKwl9CisKKwlpZiAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTUpICYgMHg4MCkKKwl7CisJICAgIFBSSU5URigiTEFTVCBpbWFnZSBlbmNvdW50ZXJlZCwgbm8gaW1hZ2UgZm91bmRcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlyb20gKz0gcGNpX2ltYWdlX2xlbmd0aDsKKyAgICB9Cit9CisKK3ZvaWQgc2hvd19iYXRfbWFwcGluZyh2b2lkKQoreworI2lmZGVmIERFQlVHCisgICAgdTMyIGRiYXQwdSwgZGJhdDBsLCBpYmF0MHUsIGliYXQwbDsKKyAgICB1MzIgZGJhdDF1LCBkYmF0MWwsIGliYXQxdSwgaWJhdDFsOworICAgIHUzMiBkYmF0MnUsIGRiYXQybCwgaWJhdDJ1LCBpYmF0Mmw7CisgICAgdTMyIGRiYXQzdSwgZGJhdDNsLCBpYmF0M3UsIGliYXQzbDsKKyAgICB1MzIgbXNyLCBoaWQwLCBsMmNyX3JlZzsKKworICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0dSAlMCwwIiA6ICI9ciIgKGRiYXQwdSkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0bCAlMCwwIiA6ICI9ciIgKGRiYXQwbCkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0dSAlMCwwIiA6ICI9ciIgKGliYXQwdSkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0bCAlMCwwIiA6ICI9ciIgKGliYXQwbCkpOworCisgICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXR1ICUwLDEiIDogIj1yIiAoZGJhdDF1KSk7CisgICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXRsICUwLDEiIDogIj1yIiAoZGJhdDFsKSk7CisgICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXR1ICUwLDEiIDogIj1yIiAoaWJhdDF1KSk7CisgICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXRsICUwLDEiIDogIj1yIiAoaWJhdDFsKSk7CisKKyAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMiIgOiAiPXIiIChkYmF0MnUpKTsKKyAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMiIgOiAiPXIiIChkYmF0MmwpKTsKKyAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMiIgOiAiPXIiIChpYmF0MnUpKTsKKyAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMiIgOiAiPXIiIChpYmF0MmwpKTsKKworICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0dSAlMCwzIiA6ICI9ciIgKGRiYXQzdSkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0bCAlMCwzIiA6ICI9ciIgKGRiYXQzbCkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0dSAlMCwzIiA6ICI9ciIgKGliYXQzdSkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0bCAlMCwzIiA6ICI9ciIgKGliYXQzbCkpOworCisgICAgX19hc20gdm9sYXRpbGUgKCJtZm1zciAlMCIgICAgIDogIj1yIiAobXNyKSk7CisgICAgX19hc20gdm9sYXRpbGUgKCJtZnNwciAlMCwxMDA4IjogIj1yIiAoaGlkMCkpOworICAgIF9fYXNtIHZvbGF0aWxlICgibWZzcHIgJTAsMTAxNyI6ICI9ciIgKGwyY3JfcmVnKSk7CisKKyAgICBwcmludGYoImRiYXQwdTogJTA4eCBkYmF0MGw6ICUwOHggaWJhdDB1OiAlMDh4IGliYXQwbDogJTA4eFxuIiwKKwkgICBkYmF0MHUsIGRiYXQwbCwgaWJhdDB1LCBpYmF0MGwpOworICAgIHByaW50ZigiZGJhdDF1OiAlMDh4IGRiYXQxbDogJTA4eCBpYmF0MXU6ICUwOHggaWJhdDFsOiAlMDh4XG4iLAorCSAgIGRiYXQxdSwgZGJhdDFsLCBpYmF0MXUsIGliYXQxbCk7CisgICAgcHJpbnRmKCJkYmF0MnU6ICUwOHggZGJhdDJsOiAlMDh4IGliYXQydTogJTA4eCBpYmF0Mmw6ICUwOHhcbiIsCisJICAgZGJhdDJ1LCBkYmF0MmwsIGliYXQydSwgaWJhdDJsKTsKKyAgICBwcmludGYoImRiYXQzdTogJTA4eCBkYmF0M2w6ICUwOHggaWJhdDN1OiAlMDh4IGliYXQzbDogJTA4eFxuIiwKKwkgICBkYmF0M3UsIGRiYXQzbCwgaWJhdDN1LCBpYmF0M2wpOworCisgICAgcHJpbnRmKCJcbk1TUjogJTA4eCAgIEhJRDA6ICUwOHggICBMMkNSOiAlMDh4IFxuIiwgbXNyLGhpZDAsIGwyY3JfcmVnKTsKKyNlbmRpZgorfQorCisKKwordm9pZCByZW1vdmVfaW5pdF9kYXRhKHZvaWQpCit7CisgICAgY2hhciAqczsKKyAgICB1MzIgYmF0bCA9ICgoQ0ZHX1NEUkFNX0JBU0UrMHgxMDAwMDApIHwgQkFUTF9QUF9SVyk7CisgICAgdTMyIGJhdHUgPSgoQ0ZHX1NEUkFNX0JBU0UrMHgxMDAwMDApIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApOworI2lmIDAJLyogYWxyZWFkeSBkb25lIGluIGJvYXJkX2luaXRfcigpICovCisgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKENGR19JTklUX1JBTV9BRERSK0NGR19JTklUX0RBVEFfT0ZGU0VUKTsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGEyW0NGR19JTklUX0RBVEFfU0laRV07CisKKyAgICAvKiAgTWFrZSBhIGNvcHkgb2YgdGhlIGRhdGEgKi8KKyAgICBtZW1jcHkoZGF0YTIsIGRhdGEsIENGR19JTklUX0RBVEFfU0laRSk7CisjZW5kaWYgLyogMCAqLworCisgICAgLyogIEludmFsaWRhdGUgYW5kIGRpc2FibGUgZGF0YSBjYWNoZSAqLworICAgIGludmFsaWRhdGVfbDFfZGF0YV9jYWNoZSgpOworICAgIGRjYWNoZV9kaXNhYmxlKCk7CisKKyNpZiAwCisgICAgLyogIENvcHkgdG8gdGhlIHJlYWwgUkFNIGFkZHJlc3MgKi8KKyAgICBtZW1jcHkoZGF0YSwgZGF0YTIsIENGR19JTklUX0RBVEFfU0laRSk7CisjZW5kaWYKKworICAgIC8qcHJpbnRmKCJCZWZvcmUgSUNhY2hlIGVuYWJsZVxuIik7CisgICAgICBzaG93X2JhdF9tYXBwaW5nKCk7Ki8KKworICAgIF9fYXNtIHZvbGF0aWxlICgiaXN5bmMgICAgICAgIFxuIgorCQkgICAgIm10ZGJhdHUgMiwlMiBcbiIKKwkJICAgICJtdGRiYXRsIDIsJTIgXG4iCisJICAgICAgICAgICAgIm10ZGJhdHUgMSwlMCBcbiIKKwkJICAgICJtdGRiYXRsIDEsJTEgXG4iCisJCSAgICAic3luYyAgICAgICAgIFxuIgorCQkgICAgImlzeW5jICAgICAgICBcbiIKKwkJICAgIDogOiAiciIgKGJhdHUpLCAiciIgKGJhdGwpLCAiciIgKDApKTsKKworICAgIC8qIHNob3dfYmF0X21hcHBpbmcoKTsgKi8KKyAgICBzID0gZ2V0ZW52KCJ4ODZfY2FjaGUiKTsKKworICAgIGlmICghcyB8fCAocyAmJiBzdHJjbXAocywgIm9uIik9PTApKQorICAgIHsKKwlpY2FjaGVfZW5hYmxlKCk7CisJZGNhY2hlX2VuYWJsZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NWVmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9nbHVlLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBHTFVFX0gKKyNkZWZpbmUgR0xVRV9ICisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHBjaV9kZXZfdDsKKworaW50IG15cGNpX2ZpbmRfZGV2aWNlKGludCB2ZW5kb3IsIGludCBwcm9kdWN0LCBpbnQgaW5kZXgpOworaW50IG15cGNpX2J1cyhpbnQgZGV2aWNlKTsKK2ludCBteXBjaV9kZXZmbihpbnQgZGV2aWNlKTsKK3Vuc2lnbmVkIGxvbmcgZ2V0X2Jhcl9zaXplKHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQpOworCit1OCAgIG15cGNpX3JlYWRfY2ZnX2J5dGUoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KTsKK3UxNiAgbXlwY2lfcmVhZF9jZmdfd29yZChpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpOwordTMyICBteXBjaV9yZWFkX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCk7CisKK3ZvaWQgbXlwY2lfd3JpdGVfY2ZnX2J5dGUoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB1OCB2YWx1ZSk7Cit2b2lkIG15cGNpX3dyaXRlX2NmZ193b3JkKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTE2IHZhbHVlKTsKK3ZvaWQgbXlwY2lfd3JpdGVfY2ZnX2xvbmcoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB1MzIgdmFsdWUpOworCit2b2lkIF9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworY2hhciAqX2dldGVudihjaGFyICpuYW1lKTsKKwordm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQgbWVtc2V0KHZvaWQgKmFkZHIsIGludCB2YWx1ZSwgc2l6ZV90IHNpemUpOwordm9pZCBtZW1jcHkodm9pZCAqdG8sIHZvaWQgKmZyb20sIHNpemVfdCBudW1ieXRlcyk7CitpbnQgIHN0cmNtcChjaGFyICosIGNoYXIgKik7CisKK3ZvaWQgZW5hYmxlX2NvbXBhdGliaWxpdHlfaG9sZSh2b2lkKTsKK3ZvaWQgZGlzYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCk7CisKK3ZvaWQgbWFwX3JvbShwY2lfZGV2X3QgZGV2LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwordm9pZCB1bm1hcF9yb20ocGNpX2Rldl90IGRldik7CitpbnQgIGF0dGVtcHRfbWFwX3JvbShwY2lfZGV2X3QgZGV2LCB2b2lkICpjb3B5X2FkZHJlc3MpOworCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFIDB4MDEgICAgLyogMCA9IG1lbW9yeSwgMSA9IEkvTyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTyAweDAxCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSAweDAwCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLICAgICAgKH4weDBmVUwpCisKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wICAgICAgMHgxMCAgICAvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMSAgICAgIDB4MTQgICAgLyogMzIgYml0cyBbaHR5cGUgMCwxIG9ubHldICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMiAgICAgIDB4MTggICAgLyogMzIgYml0cyBbaHR5cGUgMCBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMgICAgICAweDFjICAgIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU180ICAgICAgMHgyMCAgICAvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNSAgICAgIDB4MjQgICAgLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQlVTKGQpICAgICAgKCgoZCkgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgUENJX0RFVihkKSAgICAgICgoKGQpID4+IDExKSAmIDB4MWYpCisjZGVmaW5lIFBDSV9GVU5DKGQpICAgICAoKChkKSA+PiA4KSAmIDB4NykKKyNkZWZpbmUgUENJX0JERihiLGQsZikgICgoYikgPDwgMTYgfCAoZCkgPDwgMTEgfCAoZikgPDwgOCkKKworI2RlZmluZSBQQ0lfQU5ZX0lEICh+MCkKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTICAgICAgICAgMHgzMCAgICAvKiBCaXRzIDMxLi4xMSBhcmUgYWRkcmVzcywgMTAuLjEgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTX0VOQUJMRSAweDAxCisKKyNkZWZpbmUgT0ZGKGFkZHIpICgoYWRkcikgJiAweEZGRkYpCisjZGVmaW5lIFNFRyhhZGRyKSAoKChhZGRyKT4+NCkgJjB4RjAwMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9kbWFrZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluLWxpbnV4L2dsaWJjL2RtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmNjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9kbWFrZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9rX2NwIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMva19jcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzcyOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMva19jcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9rX2VjaG8gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9rX2VjaG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluLWxpbnV4L2dsaWJjL2tfZWNobwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9rX3JtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMva19ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU1MDMwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMva19ybQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9tYWtlZGVwIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbWFrZWRlcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUxYjIyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbWFrZWRlcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQzMzUyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbmFzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy9uZGlzYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbmRpc2FzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE0YTdhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvZ2xpYmMvbmRpc2FzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy90cmFucyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluLWxpbnV4L2dsaWJjL3RyYW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWVhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9nbGliYy90cmFucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL2RtYWtlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvbGliYy9kbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk4ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvbGliYy9kbWFrZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL25hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL25hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMmEwYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluLWxpbnV4L2xpYmMvbmFzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL25kaXNhc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL25kaXNhc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlODFhMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluLWxpbnV4L2xpYmMvbmRpc2FzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi1saW51eC9saWJjL3RyYW5zIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvbGliYy90cmFucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM2YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4tbGludXgvbGliYy90cmFucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzMxLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzMxLWQxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2ZDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjMzEtZDE2LmJhdApAQCAtMCwwICsxLDI4IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgMy4xLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQzM7JUJDM19QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcQkMzOyVCQzNfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzNfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzLk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9TTkFQPQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzNfUEFUSCVcQklOOyVERUZQQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkMzX1BBVEglXEJJTlx0dXJib2MuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDM19QQVRIJVxCSU5cdHVyYm9jLmNmZworZWNobyAtTCVMSUIlID4gJUJDM19QQVRIJVxCSU5cdGxpbmsuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgMy4xIERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkzOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1jMzIuYmF0CkBAIC0wLDAgKzEsMzcgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX0JDNT0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzQKK1BBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKKworUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCitpZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCitjYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCisKKzpjcmVhdGVmaWxlcworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY1MTdkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMTYuYmF0CkBAIC0wLDAgKzEsMzIgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMTYgYml0IG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfQkM1PQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNAorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cdHVyYm9jLmNmZworZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmsuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNC41IDE2IGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiMmM3OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDMyLmJhdApAQCAtMCwwICsxLDMzIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9EUE1JMTY9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX0JDNT0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzQKK1BBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDdjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXNucC5iYXQKQEAgLTAsMCArMSwzMiBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX0JDNT0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9MQorU0VUIEJDX0xJQkJBU0U9QkM0CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCisKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKKworZWNobyBCb3JsYW5kIEMrKyA0LjUgU25hcCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJkM2NiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS10bnQuYmF0CkBAIC0wLDAgKzEsNDYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkM0OyVCQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDNDslQkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0xCitTRVQgVVNFX0JDNT0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzQKK1BBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKKworUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCitSRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCitSRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKK1JFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcworUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKK1JFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0CitSRU0gd29yayB0b28gd2VsbCkuCitSRU0KK1JFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKK1JFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCisKK1NFVCBET1NTVFlMRT0KKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS12eGQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS12eGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTlmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXZ4ZC5iYXQKQEAgLTAsMCArMSwzMiBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBWeEQgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xWWERcQkM0OyVCQzRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0xCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfQkM1PQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNAorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNC41IDMyLWJpdCBWeEQgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3OTliNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzE2LmJhdApAQCAtMCwwICsxLDMyIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDE2IGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9MQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9CQzU9CitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM0CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCisKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluay5jZmcKKworZWNobyBCb3JsYW5kIEMrKyA0LjUgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzMyLmJhdApAQCAtMCwwICsxLDM3IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9CQzU9CitTRVQgV0lOMzJfR1VJPTEKK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNAorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKK2NhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKKworOmNyZWF0ZWZpbGVzCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNC41IDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1jMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMGZkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWMzMi5iYXQKQEAgLTAsMCArMSw0MCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgQ19JTkNMVURFPSVCQzVfUEFUSCVcSU5DTFVERQorU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKK2NhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKKworOmNyZWF0ZWZpbGVzCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjUwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQxNi5iYXQKQEAgLTAsMCArMSwzNCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XEJDNTslQkM1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZworZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjFmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQzMi5iYXQKQEAgLTAsMCArMSwzNSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAzMiBiaXQgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKERQTUkzMikuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXNteC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXNteC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyNDFmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc214LmJhdApAQCAtMCwwICsxLDM1IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTVgzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU01YMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9EUE1JMTY9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1NNWDMyPTEKK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBTTVggY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFNNWDMyKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbnAuYmF0CkBAIC0wLDAgKzEsMzQgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPTEKK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkY2MzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXRudC5iYXQKQEAgLTAsMCArMSw0OCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQzU7JUJDNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkM1OyVCQzVfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPTEKK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQorCitSRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KK1JFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKK1JFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcworUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCitSRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcworUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKK1JFTSB3b3JrIHRvbyB3ZWxsKS4KK1JFTQorUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAorUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KKworU0VUIERPU1NUWUxFPQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXZ4ZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXZ4ZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1NjkxMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdnhkLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFZYRFxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcVlhEXEJDNTslQkM1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9WWEQ9MQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1NNWDMyPQorU0VUIFVTRV9TTVgxNj0KK1NFVCBVU0VfQkM1PTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCisKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKKworZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFdpbmRvd3MgKFZ4RCkgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3OWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzE2LmJhdApAQCAtMCwwICsxLDM0IEBACisgQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSworU0VUIFVTRV9EUE1JMTY9CitTRVQgVVNFX1dJTjE2PTEKK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfQkM1PTEKK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZworZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhjZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC13MzIuYmF0CkBAIC0wLDAgKzEsNDAgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIENfSU5DTFVERT0lQkM1X1BBVEglXElOQ0xVREUKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCisKK1JFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQoraWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcworY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAorCis6Y3JlYXRlZmlsZXMKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKKworZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXgxMS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZWIyZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAteDExLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPTEKK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA5NDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1jMzIuYmF0CkBAIC0wLDAgKzEsNDAgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIENfSU5DTFVERT0lQkNCNV9QQVRIJVxJTkNMVURFCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1NNWDMyPQorU0VUIFVTRV9TTVgxNj0KK1NFVCBVU0VfQkM1PTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKK2NhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKKworOmNyZWF0ZWZpbGVzCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExM2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDE2LmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMTYgYml0IG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQ0I1X1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCisKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXHR1cmJvYy5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluay5jZmcKKworZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDE3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQzMi5iYXQKQEAgLTAsMCArMSwzNSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCisKK1JFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cworZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKKworZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTY5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNteC5iYXQKQEAgLTAsMCArMSwzNSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfU01YMzI9MQorU0VUIFVTRV9TTVgxNj0KK1NFVCBVU0VfQkM1PTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFNNWCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoU01YMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjhmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNucC5iYXQKQEAgLTAsMCArMSwzNCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1NNWDMyPQorU0VUIFVTRV9TTVgxNj0KK1NFVCBVU0VfQkM1PTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1NOQVA9MQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIFNuYXAgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXRudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlMzYwMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdG50LmJhdApAQCAtMCwwICsxLDQ4IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7CitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKK1NFVCBVU0VfRFBNSTE2PQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfVE5UPTEKK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBCQ19MSUJCQVNFPUJDNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKKworUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCitSRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCitSRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKK1JFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcworUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKK1JFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0CitSRU0gd29yayB0b28gd2VsbCkuCitSRU0KK1JFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKK1JFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCisKK1NFVCBET1NTVFlMRT0KKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkZTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdnhkLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFZYRFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPTEKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgVVNFX0JDNT0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKK2VjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZworCitlY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBXaW5kb3dzIChWeEQpIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGQwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXcxNi5iYXQKQEAgLTAsMCArMSwzNCBAQAorIEBlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlLgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOworU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCitTRVQgVVNFX0RQTUkxNj0KK1NFVCBVU0VfV0lOMTY9MQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9CQzU9MQorU0VUIFVTRV9TTVgzMj0KK1NFVCBVU0VfU01YMTY9CitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIEJDX0xJQkJBU0U9QkM1CitQQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKKworUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCitlY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXHR1cmJvYy5jZmcKK2VjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cdHVyYm9jLmNmZworZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rLmNmZworCitlY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDE2IGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzYwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXczMi5iYXQKQEAgLTAsMCArMSw0MCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgQ19JTkNMVURFPSVCQ0I1X1BBVEglXElOQ0xVREUKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKK2NhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKKworOmNyZWF0ZWZpbGVzCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YzFhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUteDExLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfU01YMzI9CitTRVQgVVNFX1NNWDE2PQorU0VUIFVTRV9CQzU9MQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX1NOQVA9CitTRVQgQkNfTElCQkFTRT1CQzUKK1BBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQorCitSRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKK2VjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCitlY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZworZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCisKK2VjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTk3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZApAQCAtMCwwICsxLDIyIEBACisjISAvYmluL3NoCisKK2lmIFsgJCMgLWx0IDEgXSB8fCAoIFsgIiQxIiAhPSBnY2MtbGludXggXSAmJiBbICIkMSIgIT0gcW54NCBdICkgOyB0aGVuCisJZWNobyBVc2FnZTogJDAgY29tcGlsZXJfbmFtZSBbRE1BS0UgY29tbWFuZHNdCisJZWNobworCWVjaG8gQ3VycmVudCBjb21waWxlcnM6CisJZWNobyAiICBnY2MtbGludXggIC0gR05VIEMvQysrIDIuNyBvciBoaWdoZXIsIDMyIGJpdCIKKwllY2hvICIgIHFueDQgIC0gV2F0Y29tIEMvQysrIDEwLjYgb3IgaGlnaGVyLCAzMiBiaXQiCisJZXhpdCAxCitmaQorCit1bnNldCBEQkcgT1BUIE9QVF9TSVpFIEJVSUxEX0RMTCBJTVBPUlRfRExMIEZQVSBDSEVDS1MgQkVUQQorLiAkezF9LnNoCisKK3NoaWZ0CitkbWFrZSAkKiAmJiBleGl0IDAKKworZWNobyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitlY2hvICogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIGxpYnJhcnkuICoKK2VjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZXhpdCAxCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI5MDkzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQuYmF0CkBAIC0wLDAgKzEsNCBAQAorQGVjaG8gb2ZmCityZW0gRGlzYWJsZSBjaGVja2VkIGJ1aWxkIGFuZCBidWlsZCByZWxlYXNlIGNvZGUKK3NldCBDSEVDS0VEPQorY2FsbCBidWlsZF9pdC5iYXQgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMyNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfZGIuYmF0CkBAIC0wLDAgKzEsNCBAQAorQGVjaG8gb2ZmCityZW0gRW5hYmxlIGNoZWNrZWQgYnVpbGQgYW5kIGJ1aWxkIGRlYnVnIGNvZGUKK3NldCBDSEVDS0VEPTEKK2NhbGwgYnVpbGRfaXQuYmF0ICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2MTliNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2l0LmJhdApAQCAtMCwwICsxLDQzMiBAQAorQGVjaG8gb2ZmCityZW0gR2VuZXJpYyBiYXRjaCBmaWxlIHRvIGJ1aWxkIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhpcyBiYXRjaCBmaWxlCityZW0gYXNzdW1lcyB0aGF0IHRoZSBjb3JyZWN0IGJhdGNoIGZpbGVzIGV4aXN0IHRvIHNldHVwIHRoZSBhcHByb3ByaWF0ZQorcmVtIGNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgYW5kIHRoYXQgdGhlIERNQUtFLkVYRSBwcm9ncmFtIGlzIGF2YWlsYWJsZQorcmVtIHNvbWV3aGVyZSBvbiB0aGUgcGF0aC4KK3JlbQorcmVtIEJ1aWxkcyBhcyByZWxlYXNlIG9yIGRlYnVnIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIENIRUNLRUQKK3JlbSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworcmVtIFVuc2V0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBjaGFuZ2UgdGhlIGNvbXBpbGUgcHJvY2Vzcworc2V0IERCRz0KK3NldCBPUFQ9CitzZXQgT1BUX1NJWkU9CitzZXQgQlVJTERfRExMPQorc2V0IElNUE9SVF9ETEw9CitzZXQgRlBVPQorc2V0IENIRUNLUz0KK3NldCBCRVRBPQorCitpZiAlMT09YmMzMS1kMTYgZ290byBiYzMxLWQxNgoraWYgJTE9PWJjNDUtZDE2IGdvdG8gYmM0NS1kMTYKK2lmICUxPT1iYzQ1LWQzMiBnb3RvIGJjNDUtZDMyCitpZiAlMT09YmM0NS10bnQgZ290byBiYzQ1LXRudAoraWYgJTE9PWJjNDUtdzE2IGdvdG8gYmM0NS13MTYKK2lmICUxPT1iYzQ1LXczMiBnb3RvIGJjNDUtdzMyCitpZiAlMT09YmM0NS1jMzIgZ290byBiYzQ1LWMzMgoraWYgJTE9PWJjNDUtdnhkIGdvdG8gYmM0NS12eGQKK2lmICUxPT1iYzQ1LXNucCBnb3RvIGJjNDUtc25wCitpZiAlMT09YmM1MC1kMTYgZ290byBiYzUwLWQxNgoraWYgJTE9PWJjNTAtZDMyIGdvdG8gYmM1MC1kMzIKK2lmICUxPT1iYzUwLXRudCBnb3RvIGJjNTAtdG50CitpZiAlMT09YmM1MC13MTYgZ290byBiYzUwLXcxNgoraWYgJTE9PWJjNTAtdzMyIGdvdG8gYmM1MC13MzIKK2lmICUxPT1iYzUwLWMzMiBnb3RvIGJjNTAtYzMyCitpZiAlMT09YmM1MC12eGQgZ290byBiYzUwLXZ4ZAoraWYgJTE9PWJjNTAtc25wIGdvdG8gYmM1MC1zbnAKK2lmICUxPT1nY2MyLWQzMiBnb3RvIGdjYzItZDMyCitpZiAlMT09Z2NjMi13MzIgZ290byBnY2MyLXczMgoraWYgJTE9PWdjYzItYzMyIGdvdG8gZ2NjMi1jMzIKK2lmICUxPT1nY2MyLWxpbnV4IGdvdG8gZ2NjMi1saW51eAoraWYgJTE9PXZjNDAtZDE2IGdvdG8gdmM0MC1kMTYKK2lmICUxPT12YzQwLXRudCBnb3RvIHZjNDAtdG50CitpZiAlMT09dmM0MC13MTYgZ290byB2YzQwLXcxNgoraWYgJTE9PXZjNDAtdzMyIGdvdG8gdmM0MC13MzIKK2lmICUxPT12YzQwLWMzMiBnb3RvIHZjNDAtYzMyCitpZiAlMT09dmM0MC1kcnY5eCBnb3RvIHZjNDAtZHJ2OXgKK2lmICUxPT12YzQwLWRydm50IGdvdG8gdmM0MC1kcnZudAoraWYgJTE9PXZjNDAtcnR0IGdvdG8gdmM0MC1ydHQKK2lmICUxPT12YzQwLXNucCBnb3RvIHZjNDAtc25wCitpZiAlMT09dmM1MC1kMTYgZ290byB2YzUwLWQxNgoraWYgJTE9PXZjNTAtdG50IGdvdG8gdmM1MC10bnQKK2lmICUxPT12YzUwLXcxNiBnb3RvIHZjNTAtdzE2CitpZiAlMT09dmM1MC13MzIgZ290byB2YzUwLXczMgoraWYgJTE9PXZjNTAtYzMyIGdvdG8gdmM1MC1jMzIKK2lmICUxPT12YzUwLWRydjl4IGdvdG8gdmM1MC1kcnY5eAoraWYgJTE9PXZjNTAtZHJ2bnQgZ290byB2YzUwLWRydm50CitpZiAlMT09dmM1MC1ydHQgZ290byB2YzUwLXJ0dAoraWYgJTE9PXZjNTAtc25wIGdvdG8gdmM1MC1zbnAKK2lmICUxPT12YzYwLWQxNiBnb3RvIHZjNjAtZDE2CitpZiAlMT09dmM2MC10bnQgZ290byB2YzYwLXRudAoraWYgJTE9PXZjNjAtdzE2IGdvdG8gdmM2MC13MTYKK2lmICUxPT12YzYwLXczMiBnb3RvIHZjNjAtdzMyCitpZiAlMT09dmM2MC1jMzIgZ290byB2YzYwLWMzMgoraWYgJTE9PXZjNjAtZHJ2OXggZ290byB2YzYwLWRydjl4CitpZiAlMT09dmM2MC1kcnZudCBnb3RvIHZjNjAtZHJ2bnQKK2lmICUxPT12YzYwLWRydncyayBnb3RvIHZjNjAtZHJ2dzJrCitpZiAlMT09dmM2MC1ydHQgZ290byB2YzYwLXJ0dAoraWYgJTE9PXZjNjAtc25wIGdvdG8gdmM2MC1zbnAKK2lmICUxPT13YzEwYWQxNiBnb3RvIHdjMTBhZDE2CitpZiAlMT09d2MxMGFkMzIgZ290byB3YzEwYWQzMgoraWYgJTE9PXdjMTBhdG50IGdvdG8gd2MxMGF0bnQKK2lmICUxPT13YzEwYXcxNiBnb3RvIHdjMTBhdzE2CitpZiAlMT09d2MxMGF3MzIgZ290byB3YzEwYXczMgoraWYgJTE9PXdjMTBhYzMyIGdvdG8gd2MxMGFjMzIKK2lmICUxPT13YzEwYW8zMiBnb3RvIHdjMTBhbzMyCitpZiAlMT09d2MxMGFwMzIgZ290byB3YzEwYXAzMgoraWYgJTE9PXdjMTBhc25wIGdvdG8gd2MxMGFzbnAKK2lmICUxPT13YzEwLWQxNiBnb3RvIHdjMTAtZDE2CitpZiAlMT09d2MxMC1kMzIgZ290byB3YzEwLWQzMgoraWYgJTE9PXdjMTAtdG50IGdvdG8gd2MxMC10bnQKK2lmICUxPT13YzEwLXcxNiBnb3RvIHdjMTAtdzE2CitpZiAlMT09d2MxMC13MzIgZ290byB3YzEwLXczMgoraWYgJTE9PXdjMTAtYzMyIGdvdG8gd2MxMC1jMzIKK2lmICUxPT13YzEwLW8zMiBnb3RvIHdjMTAtbzMyCitpZiAlMT09d2MxMC1wMzIgZ290byB3YzEwLXAzMgoraWYgJTE9PXdjMTAtc25wIGdvdG8gd2MxMC1zbnAKK2lmICUxPT13YzExLWQxNiBnb3RvIHdjMTEtZDE2CitpZiAlMT09d2MxMS1kMzIgZ290byB3YzExLWQzMgoraWYgJTE9PXdjMTEtdG50IGdvdG8gd2MxMS10bnQKK2lmICUxPT13YzExLXcxNiBnb3RvIHdjMTEtdzE2CitpZiAlMT09d2MxMS13MzIgZ290byB3YzExLXczMgoraWYgJTE9PXdjMTEtYzMyIGdvdG8gd2MxMS1jMzIKK2lmICUxPT13YzExLW8zMiBnb3RvIHdjMTEtbzMyCitpZiAlMT09d2MxMS1wMzIgZ290byB3YzExLXAzMgoraWYgJTE9PXdjMTEtc25wIGdvdG8gd2MxMS1zbnAKKworZWNobyBVc2FnZTogQlVJTEQgJ2NvbXBpbGVyX25hbWUnIFtETUFLRSBjb21tYW5kc10KK2VjaG8uCitlY2hvIFdoZXJlICdjb21waWxlcl9uYW1lJyBpcyBvZiB0aGUgZm9ybSBjb21wLW9zLCB3aGVyZQorZWNobyAnY29tcCcgZGVmaW5lcyB0aGUgY29tcGlsZXIgYW5kICdvcycgZGVmaW5lcyB0aGUgT1MgZW52aXJvbm1lbnQuCitlY2hvIEZvciBpbnN0YW5jZSAnYmM1MC13MzInIGlzIGZvciBCb3JsYW5kIEMrKyA1LjAgZm9yIFdpbjMyLgorZWNobyBUaGUgdmFsdWUgb2YgJ2NvbXAnIGNhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKK2VjaG8uCitlY2hvICAgIGJjNDUgLSBCb3JsYW5kIEMrKyA0LjV4CitlY2hvICAgIGJjNTAgLSBCb3JsYW5kIEMrKyA1LngKK2VjaG8gICAgdmM0MCAtIFZpc3VhbCBDKysgNC54CitlY2hvICAgIHZjNTAgLSBWaXN1YWwgQysrIDUueAorZWNobyAgICB2YzYwIC0gVmlzdWFsIEMrKyA2LngKK2VjaG8gICAgd2MxMCAtIFdhdGNvbSBDKysgMTAuNgorZWNobyAgICB3YzExIC0gV2F0Y29tIEMrKyAxMS4wCitlY2hvICAgIGdjYzIgLSBHTlUgQy9DKysgMi45eAorZWNoby4KK2VjaG8gVGhlIHZhbHVlIG9mICdvcycgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorZWNoby4KK2VjaG8gICAgZDE2ICAgLSAxNi1iaXQgRE9TCitlY2hvICAgIGQzMiAgIC0gMzItYml0IERPUworZWNobyAgICB3MTYgICAtIDE2LWJpdCBXaW5kb3dzIEdVSSBtb2RlCitlY2hvICAgIGMzMiAgIC0gMzItYml0IFdpbmRvd3MgY29uc29sZSBtb2RlCitlY2hvICAgIHczMiAgIC0gMzItYml0IFdpbmRvd3MgR1VJIG1vZGUKK2VjaG8gICAgbzE2ICAgLSAxNi1iaXQgT1MvMiBjb25zb2xlIG1vZGUKK2VjaG8gICAgbzMyICAgLSAzMi1iaXQgT1MvMiBjb25zb2xlIG1vZGUKK2VjaG8gICAgcDMyICAgLSAzMi1iaXQgT1MvMiBQcmVzZW50YXRpb24gTWFuYWdlcgorZWNobyAgICBzbnAgICAtIDMyLWJpdCBTY2lUZWNoIFNuYXAgYXBwbGljYXRpb24KK2VjaG8gICAgbGludXggLSAzMi1iaXQgTGludXggYXBwbGljYXRpb24KK2dvdG8gZW5kCisKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gU2V0dXAgZm9yIHRoZSBzcGVjaWZpZWQgY29tcGlsZXIKKworOmJjMzEtZDE2CitjYWxsIGJjMzEtZDE2LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtZDE2CitjYWxsIGJjNDUtZDE2LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtZDMyCitjYWxsIGJjNDUtZDMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtdG50CitjYWxsIGJjNDUtdG50LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtdzE2CitjYWxsIGJjNDUtdzE2LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtdzMyCitjYWxsIGJjNDUtdzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtYzMyCitjYWxsIGJjNDUtYzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNDUtdnhkCitjYWxsIGJjNDUtdnhkLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtZDE2CitjYWxsIGJjNTAtZDE2LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtZDMyCitjYWxsIGJjNTAtZDMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtdG50CitjYWxsIGJjNTAtdG50LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtdzE2CitjYWxsIGJjNTAtdzE2LmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtdzMyCitjYWxsIGJjNTAtdzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtYzMyCitjYWxsIGJjNTAtYzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmJjNTAtdnhkCitjYWxsIGJjNTAtdnhkLmJhdAorZ290byBjb21waWxlaXQKKworOmdjYzItZDMyCitjYWxsIGdjYzItZDMyLmJhdAorZ290byBjb21waWxlaXQKKworOmdjYzItdzMyCitjYWxsIGdjYzItdzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmdjYzItYzMyCitjYWxsIGdjYzItYzMyLmJhdAorZ290byBjb21waWxlaXQKKworOmdjYzItbGludXgKK2NhbGwgZ2NjMi1saW51eC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpzYzcwLWQxNgorY2FsbCBzYzcwLWQxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpzYzcwLXcxNgorY2FsbCBzYzcwLXcxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpzYzcwLXRudAorY2FsbCBzYzcwLXRudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpzYzcwLXczMgorY2FsbCBzYzcwLXczMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpzYzcwLWMzMgorY2FsbCBzYzcwLWMzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLWQxNgorY2FsbCB2YzQwLWQxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLXRudAorY2FsbCB2YzQwLXRudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLXcxNgorY2FsbCB2YzQwLXcxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLXczMgorY2FsbCB2YzQwLXczMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLWMzMgorY2FsbCB2YzQwLWMzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzQwLWRydjl4CitjYWxsIHZjNDAtZHJ2OXguYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM0MC1kcnZudAorY2FsbCB2YzQwLWRydm50LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNDAtcnR0CitjYWxsIHZjNDAtcnR0LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtZDE2CitjYWxsIHZjNTAtZDE2LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtdG50CitjYWxsIHZjNTAtdG50LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtdzE2CitjYWxsIHZjNTAtdzE2LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtdzMyCitjYWxsIHZjNTAtdzMyLmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtYzMyCitjYWxsIHZjNTAtYzMyLmJhdAorZ290byBjb21waWxlaXQKKworOnZjNTAtZHJ2OXgKK2NhbGwgdmM1MC1kcnY5eC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzUwLWRydm50CitjYWxsIHZjNTAtZHJ2bnQuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM1MC1ydHQKK2NhbGwgdmM1MC1ydHQuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC1kMTYKK2NhbGwgdmM2MC1kMTYuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC10bnQKK2NhbGwgdmM2MC10bnQuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC13MTYKK2NhbGwgdmM2MC13MTYuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC13MzIKK2NhbGwgdmM2MC13MzIuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC1jMzIKK2NhbGwgdmM2MC1jMzIuYmF0Citnb3RvIGNvbXBpbGVpdAorCis6dmM2MC1kcnY5eAorY2FsbCB2YzYwLWRydjl4LmJhdAorZ290byBjb21waWxlaXQKKworOnZjNjAtZHJ2bnQKK2NhbGwgdmM2MC1kcnZudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzYwLWRydncyaworY2FsbCB2YzYwLWRydncyay5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp2YzYwLXJ0dAorY2FsbCB2YzYwLXJ0dC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYWQxNgorY2FsbCB3YzEwYWQxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYWQzMgorY2FsbCB3YzEwYWQzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYXRudAorY2FsbCB3YzEwYXRudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYXcxNgorY2FsbCB3YzEwYXcxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYXczMgorY2FsbCB3YzEwYXczMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYWMzMgorY2FsbCB3YzEwYWMzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYW8zMgorY2FsbCB3YzEwYW8zMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwYXAzMgorY2FsbCB3YzEwYXAzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLWQxNgorY2FsbCB3YzEwLWQxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLWQzMgorY2FsbCB3YzEwLWQzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLXRudAorY2FsbCB3YzEwLXRudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLXcxNgorY2FsbCB3YzEwLXcxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLXczMgorY2FsbCB3YzEwLXczMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLWMzMgorY2FsbCB3YzEwLWMzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLW8zMgorY2FsbCB3YzEwLW8zMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzEwLXAzMgorY2FsbCB3YzEwLXAzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLWQxNgorY2FsbCB3YzExLWQxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLWQzMgorY2FsbCB3YzExLWQzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLXRudAorY2FsbCB3YzExLXRudC5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLXcxNgorY2FsbCB3YzExLXcxNi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLXczMgorY2FsbCB3YzExLXczMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLWMzMgorY2FsbCB3YzExLWMzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLW8zMgorY2FsbCB3YzExLW8zMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzp3YzExLXAzMgorY2FsbCB3YzExLXAzMi5iYXQKK2dvdG8gY29tcGlsZWl0CisKKzpjb21waWxlaXQKK2tfcm0gLWYgKi5saWIgKi5hCitkbWFrZSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQoraWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3JlbmQKK2dvdG8gZW5kCisKKzplcnJvcmVuZAorZWNobyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitlY2hvICogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIGxpYnJhcnkuICoKK2VjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOmVuZApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RkcnYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RkcnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGY0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGRydi5iYXQKQEAgLTAsMCArMSw2IEBACitAZWNobyBvZmYKKyUxCitjZCAlMworJTQgJTUgJTYgJTcgJTggJTkKKyUyCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjAyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0CkBAIC0wLDAgKzEsMTAgQEAKKyMhIC9iaW4vc2gKKworY2QgJDEKK1BST0c9JDIKK3NoaWZ0IDIKK3JtIC1mICoubGliICouYQorJFBST0cgJCoKK1JFVD0kPworY2QgLi4KK2V4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBiNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQKQEAgLTAsMCArMSw1IEBACitAZWNobyBvZmYKK2NkICUxCitrX3JtIC1mICoubGliICouYQorc2hpZnQgMQorJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwLmVudiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwLmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJjM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHAuZW52CkBAIC0wLDAgKzEsNDYgQEAKKyM9IERvbid0IGVkaXQgdGhpcyBsaW5lIHVubGVzcyB5b3UgbW92ZSBkamdwcC5lbnYgb3V0c2lkZQorIz0gb2YgdGhlIGRqZ3BwIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuICBJZiB5b3UgZG8gbW92ZQorIz0gaXQsIHNldCBESkRJUiB0byB0aGUgZGlyZWN0b3J5IHlvdSBpbnN0YWxsZWQgREpHUFAgaW4uCisjPQorREpESVI9JTovPkRKR1BQJQorCisrVVNFUj1kb3N1c2VyCisrVE1QRElSPSVESkRJUiUvdG1wCisrRU1VMzg3PSVESkRJUiUvYmluL2VtdTM4Ny5keGUKKytMRk49eQorCitbYmlzb25dCitCSVNPTl9IQUlSWT0lREpESVIlL2xpYi9iaXNvbi5oYWkKK0JJU09OX1NJTVBMRT0lREpESVIlL2xpYi9iaXNvbi5zaW0KKworW2NwcF0KK0NQTFVTX0lOQ0xVREVfUEFUSD0lLz47Q1BMVVNfSU5DTFVERV9QQVRIJWluY2x1ZGU7JVNDSVRFQ0glL2luY2x1ZGU7JVBSSVZBVEUlL2luY2x1ZGU7LjslREpESVIlL2xhbmcvY3h4OyVESkRJUiUvaW5jbHVkZTslREpESVIlL2NvbnRyaWIvZ3J4MjAvaW5jbHVkZQorQ19JTkNMVURFX1BBVEg9JS8+O0NfSU5DTFVERV9QQVRIJWluY2x1ZGU7JVNDSVRFQ0glL2luY2x1ZGU7JVBSSVZBVEUlL2luY2x1ZGU7LjslREpESVIlL2luY2x1ZGU7JURKRElSJS9jb250cmliL2dyeDIwL2luY2x1ZGUKK09CSkNQTFVTX0lOQ0xVREVfUEFUSD0lLz47T0JKQ1BMVVNfSU5DTFVERV9QQVRIJSVESkRJUiUvaW5jbHVkZTslREpESVIlL2xhbmcvb2JqYworT0JKQ19JTkNMVURFX1BBVEg9JS8+O09CSkNfSU5DTFVERV9QQVRIJSVESkRJUiUvaW5jbHVkZTslREpESVIlL2xhbmcvb2JqYworCitbZ2NjXQorQ09NUElMRVJfUEFUSD0lLz47Q09NUElMRVJfUEFUSCUlREpESVIlL2JpbgorTElCUkFSWV9QQVRIPSUvPjtMSUJSQVJZX1BBVEglJURKRElSJS9saWI7JURKRElSJS9jb250cmliL2dyeDIwL2xpYjslU0NJVEVDSCUvbGliL3JlbGVhc2UvZG9zMzIvZGoyCisKK1tpbmZvXQorSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCitJTkZPX0NPTE9SUz0weDFmLjB4MzEKKworW2VtYWNzXQorSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCisKK1tsZXNzXQorTEVTU0JJTkZNVD0qazwlWD4KK0xFU1NDSEFSREVGPThiY2NjYmNjMTJiYzViOTUuYjEyNy5iCitMRVNTPSVMRVNTJSAtaDUkeTUkRGQyLjAkRHUxNC4wJERzNC43JERrOS4wJAorCitbbG9jYXRlXQorK0xPQ0FURV9QQVRIPSVESkRJUiUvbGliL2xvY2F0ZWRiLmRhdAorCitbbHNdCisrTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6CitbZGlyXQorK0xTX0NPTE9SUz1ubz0wMDpmaT0wMDpkaT0zNjpsYj0zNzswNzpjZD00MDszMzswMTpleD0zMjoqLmNtZD0zMjoqLnRhcj0wMTszMToqLnRnej0wMTszMToqLmFyaj0wMTszMToqLnRhej0wMTszMToqLmx6aD0wMTszMToqLnppcD0wMTszMToqLno9MDE7MzE6Ki5aPTAxOzMxOiouZ3o9MDE7MzE6Ki5kZWI9MDE7MzE6Ki5qcGc9MDE7MzQ6Ki5naWY9MDE7MzQ6Ki5ibXA9MDE7MzQ6Ki5wcG09MDE7MzQ6Ki50Z2E9MDE7MzQ6Ki54Ym09MDE7MzQ6Ki54cG09MDE7MzQ6Ki50aWY9MDE7MzQ6Ki5tcGc9MDE7Mzc6Ki5hdmk9MDE7Mzc6Ki5nbD0wMTszNzoqLmRsPTAxOzM3Oip+PTA4OiouYmFrPTA4OgorW3ZkaXJdCisrTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3OTJjOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwX2RiLmVudgpAQCAtMCwwICsxLDQ2IEBACisjPSBEb24ndCBlZGl0IHRoaXMgbGluZSB1bmxlc3MgeW91IG1vdmUgZGpncHAuZW52IG91dHNpZGUKKyM9IG9mIHRoZSBkamdwcCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgSWYgeW91IGRvIG1vdmUKKyM9IGl0LCBzZXQgREpESVIgdG8gdGhlIGRpcmVjdG9yeSB5b3UgaW5zdGFsbGVkIERKR1BQIGluLgorIz0KK0RKRElSPSU6Lz5ESkdQUCUKKworK1VTRVI9ZG9zdXNlcgorK1RNUERJUj0lREpESVIlL3RtcAorK0VNVTM4Nz0lREpESVIlL2Jpbi9lbXUzODcuZHhlCisrTEZOPXkKKworW2Jpc29uXQorQklTT05fSEFJUlk9JURKRElSJS9saWIvYmlzb24uaGFpCitCSVNPTl9TSU1QTEU9JURKRElSJS9saWIvYmlzb24uc2ltCisKK1tjcHBdCitDUExVU19JTkNMVURFX1BBVEg9JS8+O0NQTFVTX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9sYW5nL2N4eDslREpESVIlL2luY2x1ZGU7JURKRElSJS9jb250cmliL2dyeDIwL2luY2x1ZGUKK0NfSU5DTFVERV9QQVRIPSUvPjtDX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCitPQkpDUExVU19JTkNMVURFX1BBVEg9JS8+O09CSkNQTFVTX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKK09CSkNfSU5DTFVERV9QQVRIPSUvPjtPQkpDX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKKworW2djY10KK0NPTVBJTEVSX1BBVEg9JS8+O0NPTVBJTEVSX1BBVEglJURKRElSJS9iaW4KK0xJQlJBUllfUEFUSD0lLz47TElCUkFSWV9QQVRIJSVESkRJUiUvbGliOyVESkRJUiUvY29udHJpYi9ncngyMC9saWI7JVNDSVRFQ0glL2xpYi9kZWJ1Zy9kb3MzMi9kajIKKworW2luZm9dCitJTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KK0lORk9fQ09MT1JTPTB4MWYuMHgzMQorCitbZW1hY3NdCitJTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KKworW2xlc3NdCitMRVNTQklORk1UPSprPCVYPgorTEVTU0NIQVJERUY9OGJjY2NiY2MxMmJjNWI5NS5iMTI3LmIKK0xFU1M9JUxFU1MlIC1oNSR5NSREZDIuMCREdTE0LjAkRHM0LjckRGs5LjAkCisKK1tsb2NhdGVdCisrTE9DQVRFX1BBVEg9JURKRElSJS9saWIvbG9jYXRlZGIuZGF0CisKK1tsc10KKytMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKK1tkaXJdCisrTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6CitbdmRpcl0KKytMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE1MDZjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZmluZGludDMuYmF0CkBAIC0wLDAgKzEgQEAKK3BlcmwgYzpcc2NpdGVjaFxzcmNccGVybFxmaW5kaW50My5wZXIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWJlb3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZmQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhIC9iaW4vc2gKKworIyBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR0NDL0crKyBmb3IgQmVPUworCitpZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgorICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZWxzZQorICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZmkKKworZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL2djY19iZW9zLm1rCitleHBvcnQgSU5DTFVERT0iLUlpbmNsdWRlIC1JJFNDSVRFQ0gvaW5jbHVkZSAtSSRQUklWQVRFL2luY2x1ZGUiCitleHBvcnQgVVNFX1gxMT0wCitleHBvcnQgVVNFX0JFT1M9MQorCitlY2hvIEdDQyBCZU9TIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtZnJlZWJzZC5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1mcmVlYnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTZhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtZnJlZWJzZC5zaApAQCAtMCwwICsxLDE2IEBACisjISAvYmluL3NoCisKKyMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdDQy9HKysgZm9yIEZyZWVCU0QKKworaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KKyAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2Vsc2UKKyAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2ZpCisKK2V4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5taworZXhwb3J0IElOQ0xVREU9Ii1JaW5jbHVkZSAtSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIgorZXhwb3J0IFVTRV9YMTE9MQorZXhwb3J0IFVTRV9GUkVFQlNEPTEKKworZWNobyBHQ0MgRnJlZUJTRCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTRjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtbGludXguc2gKQEAgLTAsMCArMSwxOSBAQAorIyEgL2Jpbi9zaAorCisjIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHQ0MvRysrIGZvciBMaW51eAorCitpZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgorICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZWxzZQorICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZmkKKworZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL2djY19saW51eC5taworZXhwb3J0IElOQ0xVREU9ImluY2x1ZGU7JFNDSVRFQ0gvaW5jbHVkZTskUFJJVkFURS9pbmNsdWRlIgorZXhwb3J0IFVTRV9MSU5VWD0xCisKK2lmIFsgIngkTElCQyIgPSB4IF07IHRoZW4KKwllY2hvICJHQ0MgTGludXggY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKGdsaWIpIgorZWxzZQorCWVjaG8gIkdDQyBMaW51eCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAobGliYzUpIgorZmkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItYzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M0NzgzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1jMzIuYmF0CkBAIC0wLDAgKzEsMjYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHTlUgQyBjb21waWxlcgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJccmVsZWFzZVx3aW4zMlxnY2MyCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1x3aW4zMlxnY2MyCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZQorc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1xnY2Nfd2luMzIubWsKK3NldCBNQUtFX01PREU9CitzZXQgVVNFX1dJTjE2PQorc2V0IFVTRV9XSU4zMj0xCitzZXQgV0lOMzJfR1VJPQorc2V0IFVTRV9TTkFQPQorc2V0IEdDQ19MSUJCQVNFPWdjYzIKK1BBVEggJVNDSVRFQ0hfQklOJTslR0NDMl9QQVRIJVxOQVRJVkVcQklOOyVERUZQQVRIJQorCitlY2hvIEdDQyAyLjkueCAzMi1iaXQgV2luMzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Y2I4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWRvcy5iYXQKQEAgLTAsMCArMSwyOCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIERKR1BQIDIuMDIKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2VcZG9zMzJcZGoyCislU0NJVEVDSCVcYmluLWRvc1xrX2NwICVTQ0lURUNIJVxCSU5cREpHUFAuRU5WICVESl9QQVRIJVxESkdQUC5FTlYKK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXGRvczMyXGRqMgorJVNDSVRFQ0glXGJpbi1kb3Nca19jcCAlU0NJVEVDSCVcQklOXERKR1BQX0RCLkVOViAlREpfUEFUSCVcREpHUFAuRU5WCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IERKR1BQPSVESl9QQVRIJVxESkdQUC5FTlYKK3NldCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JURKX1BBVEglXElOQ0xVREU7CitzZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXERKMzIuTUsKK3NldCBVU0VfV0lOMTY9CitzZXQgVVNFX1dJTjMyPQorc2V0IFdJTjMyX0dVST0KK3NldCBVU0VfU05BUD0KK3NldCBESl9MSUJCQVNFPWRqMgorUEFUSCAlU0NJVEVDSF9CSU4lOyVESl9QQVRIJVxCSU47JURFRlBBVEglCisKK2VjaG8gREpHUFAgMi4wMiAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRFBNSSkuCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1saW51eC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViMmFiOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0CkBAIC0wLDAgKzEsMjYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHTlUgQyBjcm9zcy1jb21waWxlcgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJccmVsZWFzZVx3aW4zMlxnY2MyCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1x3aW4zMlxnY2MyCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZQorc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xnY2NfbGludXgubWsKK3NldCBNQUtFX01PREU9VU5JWAorc2V0IFVTRV9XSU4xNj0KK3NldCBVU0VfV0lOMzI9CitzZXQgV0lOMzJfR1VJPQorc2V0IFVTRV9TTkFQPQorc2V0IEdDQ19MSUJCQVNFPWdjYzIKK1BBVEggJVNDSVRFQ0hfQklOJTslR0NDMl9QQVRIJVxjcm9zcy1saW51eFxpMzg2LXJlZGhhdC1saW51eFxCSU47JURFRlBBVEglCisKK2VjaG8gR0NDIDIuOS54IDMyLWJpdCBMaW51eCBjb25zb2xlIGNyb3NzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLXczMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMzFhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItdzMyLmJhdApAQCAtMCwwICsxLDI2IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR05VIEMgY29tcGlsZXIKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2Vcd2luMzJcZ2NjMgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcZGVidWdcd2luMzJcZ2NjMgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGUKK3NldCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcZ2NjX3dpbjMyLm1rCitzZXQgTUFLRV9NT0RFPQorc2V0IFVTRV9XSU4xNj0KK3NldCBVU0VfV0lOMzI9MQorc2V0IFdJTjMyX0dVST0xCitzZXQgVVNFX1NOQVA9CitzZXQgR0NDX0xJQkJBU0U9Z2NjMgorUEFUSCAlU0NJVEVDSF9CSU4lOyVHQ0MyX1BBVEglXE5BVElWRVxCSU47JURFRlBBVEglCisKK2VjaG8gR0NDIDIuOS54IDMyLWJpdCBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21ha2VsaWIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWFrZWxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxNjczNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21ha2VsaWIuYmF0CkBAIC0wLDAgKzEsOTcgQEAKK2NhbGwgd2MxMS1kMzIuYmF0CisKK2NkIGM6XHByaXZhdGVcc3JjXGxpY2Vuc2UKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKK2NkIGM6XHNjaXRlY2hcc3JjXHBtCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCitjZCBjOlxzY2l0ZWNoXHNyY1xjb25zb2xlCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCitjZCBjOlxzY2l0ZWNoXHNyY1xudWNsZXVzCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCitjZCBjOlxzY2l0ZWNoXHNyY1x6bGliCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCisKK2NkIGM6XHByaXZhdGVcc3JjXGdyYXBoaWNzXHJlZjJkCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCitjZCBjOlxwcml2YXRlXHNyY1xkcnZsaWIKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKKworY2FsbCB3YzExLXczMi5iYXQKKworY2QgYzpccHJpdmF0ZVxzcmNcbGljZW5zZQorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorY2QgYzpcc2NpdGVjaFxzcmNccG0KK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKK2NkIGM6XHNjaXRlY2hcc3JjXGNvbnNvbGUKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKK2NkIGM6XHNjaXRlY2hcc3JjXG51Y2xldXMKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKK2NkIGM6XHNjaXRlY2hcc3JjXHpsaWIKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKKworY2QgYzpccHJpdmF0ZVxzcmNcZ3JhcGhpY3NccmVmMmQKK2RtYWtlIGNsZWFuCitkbWFrZSBkZXBlbmQKK2RtYWtlIC11IGluc3RhbGwKK2NkIGM6XHByaXZhdGVcc3JjXGRydmxpYgorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorCitjYWxsIHdjMTAtZDMyLmJhdAorCitjZCBjOlxwcml2YXRlXHNyY1xsaWNlbnNlCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCitjZCBjOlxzY2l0ZWNoXHNyY1xwbQorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorY2QgYzpcc2NpdGVjaFxzcmNcY29uc29sZQorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorY2QgYzpcc2NpdGVjaFxzcmNcbnVjbGV1cworZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorY2QgYzpcc2NpdGVjaFxzcmNcemxpYgorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorCitjZCBjOlxwcml2YXRlXHNyY1xncmFwaGljc1xyZWYyZAorZG1ha2UgY2xlYW4KK2RtYWtlIGRlcGVuZAorZG1ha2UgLXUgaW5zdGFsbAorY2QgYzpccHJpdmF0ZVxzcmNcZHJ2bGliCitkbWFrZSBjbGVhbgorZG1ha2UgZGVwZW5kCitkbWFrZSAtdSBpbnN0YWxsCisKK2NkIFxwcml2YXRlXHNyY1xncmFwaGljc1xkcml2ZXJzCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21lbHRvYmpzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTgwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaApAQCAtMCwwICsxLDIzIEBACisjISAvYmluL3NoCisjCisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyBhIHNpbmdsZSBvYmplY3QgZmlsZSBmcm9tIGEgc2V0IG9mIGxpYnJhcmllcyAoKi5hIGZpbGVzKQorIyBVc2FnZTogbWVsdG9ianMuc2ggdGFyZ2V0Lm8gbGlicmFyeTEuYSBsaWJyYXJ5Mi5hIC4uLgorIworIyAoQykgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiAxOTk4CisjCisKK1RNUERJUj0vdG1wL21lbHQkJAorVEFSR0VUPSQxCitUQVJHRVRESVI9JFBXRAorc2hpZnQKK21rZGlyICRUTVBESVIKKworY2QgJFRNUERJUgorCitmb3IgYSBpbiAkKgorZG8KKyAgICBhciB4ICRhCitkb25lCitsZCAtciAtbyAkVEFSR0VURElSLyRUQVJHRVQgKi5vCisKK3JtIC1mciAkVE1QRElSClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbnRkZGsuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbnRkZGsuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9udGRkay5iYXQKQEAgLTAsMCArMSw0MiBAQAorQGVjaG8gb2ZmCitSRU06IFNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIE5UIERESyBkZXZlbG9wbWVudC4KK1JFTTogTm90ZSB0aGF0IHdlIGhhdmUgaGFyZCBjb2RlZCB0aGlzIGZvciBXaW5kb3dzIE5UIGkzODYgZGV2ZWxvcG1lbnQuCisKK1NFVCBVU0VfTlREUlY9MQorU0VUIFVTRV9XMktEUlY9CitTRVQgQkFTRURJUj0lTlRfRERLUk9PVCUKK1NFVCBQQVRIPSVCQVNFRElSJVxiaW47JVBBVEglCitTRVQgTlRNQUtFRU5WPSVCQVNFRElSJVxpbmMKK1NFVCBCVUlMRF9NQUtFX1BST0dSQU09bm1ha2UuZXhlCitTRVQgQlVJTERfREVGQVVMVD0tZWkgLW5tYWtlIC1pCitTRVQgQlVJTERfREVGQVVMVF9UQVJHRVRTPS0zODYKK1NFVCBfT0JKX0RJUj1vYmoKK1NFVCBORVdfQ1JUUz0xCitTRVQgX05UUk9PVD0lQkFTRURJUiUKK1NFVCBJTkNMVURFPSVCQVNFRElSJVxpbmM7JUlOQ0xVREUlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZAorCitSRU06IHNldCB1cCBhbiBOVCBmcmVlIGJ1aWxkIGVudmlyb25tZW50CitTRVQgRERLQlVJTERFTlY9ZnJlZQorU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRAorU0VUIE5UREJHRklMRVM9MQorU0VUIE5UREVCVUc9CitTRVQgTlRERUJVR1RZUEU9CitTRVQgTVNDX09QVElNSVpBVElPTj0KK3NldCBMSUI9JUJBU0VESVIlXGxpYlxpMzg2XGZyZWU7JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxOVERSVlxWQzY7JU1TVkNEaXIlXExJQjsuCisKK2dvdG8gZG9uZQorCis6Y2hlY2tlZAorCitSRU06IHNldCB1cCBhbiBOVCBjaGVja2VkIGJ1aWxkIGVudmlyb25tZW50CitTRVQgRERLQlVJTERFTlY9Y2hlY2tlZAorU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRCAtRFJEUkRCRyAtRFNSVkRCRworU0VUIE5UREJHRklMRVM9CitTRVQgTlRERUJVRz1udHNkCitTRVQgTlRERUJVR1RZUEU9Ym90aAorU0VUIE1TQ19PUFRJTUlaQVRJT049L09kIC9PaQorc2V0IExJQj0lQkFTRURJUiVcbGliXGkzODZcZnJlZTslU0NJVEVDSF9MSUIlXExJQlxERUJVR1xOVERSVlxWQzY7JU1TVkNEaXIlXExJQjsuCisKKzpkb25lCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbng0LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54NC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNjNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54NC5zaApAQCAtMCwwICsxLDE4IEBACisjISAvYmluL3NoCisKKyMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyBmb3IgUU5YNAorCitpZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgorICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZWxzZQorICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZmkKKworZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL3FueDQubWsKK2V4cG9ydCBJTkNMVURFPSItSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIC1JL3Vzci9pbmNsdWRlIgorZXhwb3J0IFVTRV9RTlg9MQorZXhwb3J0IFVTRV9RTlg0PTEKK2V4cG9ydCBXQ19MSUJCQVNFPXdjMTAKKworZWNobyBRbnggNCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNGY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueG50by5zaApAQCAtMCwwICsxLDIxIEBACisjISAvYmluL3NoCisKKyMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyBmb3IgUU5YIE5ldXRyaW5vCisKK2lmIFsgIiRDSEVDS0VEIiA9ICIxIiBdOyB0aGVuCisgICAgZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitlbHNlCisgICAgZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitmaQorCitpZiBbIFgkR0NDX1BBVEggPSAiWCIgXTsgdGhlbgorCWV4cG9ydCBHQ0NfUEFUSD0vdXNyL2djYy9iaW4KK2ZpCisKK2V4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9xbnhudG8ubWsKK2V4cG9ydCBJTkNMVURFPSItSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIC1JL3Vzci9udG8vaW5jbHVkZSIKK2V4cG9ydCBVU0VfQklPUz0xCSMgVkJJT1MgbGliIGlzIHRpbnkgdW5kZXIgTmV1dHJpbm8sIGFsd2F5cyBpbmNsdWRlIGl0CitleHBvcnQgVVNFX1FOWD0xCitleHBvcnQgVVNFX1FOWE5UTz0xCisKK2VjaG8gUW54IE5ldXRyaW5vIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1iZW9zLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI3MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaApAQCAtMCwwICsxLDQyIEBACisjISAvYmluL3NoCisKKyMgQmVPUyBWRVJTSU9OCisjIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCisjIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCisjIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgorIworIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKKyMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KKyMKKyMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBCZU9TIGluc3RhbGxhdGlvbi4KKworIyBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAorIyBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KKworZXhwb3J0IFNDSVRFQ0g9JE1HTF9ST09UIAorCisjIFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKKyMgZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKKyMgaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKKyMgbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCisKK2V4cG9ydCBTQ0lURUNIX0xJQj0kU0NJVEVDSAorCisjIFRoZSBQUklWQVRFIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBwcml2YXRlIHNvdXJjZSBmaWxlcyByZXNpZGUgdGhhdAorIyBkbyBub3QgbGl2ZSBpbiB0aGUgcHVibGljIHNvdXJjZSB0cmVlCisKK2V4cG9ydCBQUklWQVRFPSRIT01FL3ByaXZhdGUKKworIyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGFsbCB0aGUgY29tcGlsZXJzIHRoYXQgeW91IG1heQorIyBiZSB1c2luZy4gQ2hhbmdlIHRoZW0gdG8gcmVmbGVjdCB3aGVyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgeW91cgorIyBjb21waWxlcnMuCisKK2V4cG9ydCBHQ0NfUEFUSD0vYm9vdC9kZXZlbG9wL3Rvb2xzL2dudXByby9iaW4KKworIyBBZGQgdGhlIFNjaXRlY2ggYmluIHBhdGggdG8gdGhlIGN1cnJlbnQgUEFUSAorZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluOiRTQ0lURUNIL2Jpbi1iZW9zOiRQQVRICisjaWYgWyAieCRMSUJDIiA9IHggXTsgdGhlbgorIwlleHBvcnQgUEFUSD0kUEFUSDokU0NJVEVDSC9iaW4tYmVvcy9nbGliYworI2Vsc2UKKyMJZXhwb3J0IFBBVEg9JFBBVEg6JFNDSVRFQ0gvYmluLWJlb3MvbGliYworI2ZpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1mcmVlYnNkLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtZnJlZWJzZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIwNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtZnJlZWJzZC5zaApAQCAtMCwwICsxLDM3IEBACisjISAvYmluL3NoCisKKyMgTElOVVggVkVSU0lPTgorIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAorIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcworIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KKyMKKyMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCisjIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCisjCisjIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgorCisjIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCisjIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgorCitleHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCisKKyMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQorIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAorIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcworIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KKworZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICisKKyMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0CisjIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKKworZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQorCisjIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5CisjIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCisjIGNvbXBpbGVycy4KKworZXhwb3J0IEdDQ19QQVRIPS91c3IvYmluCisKKyMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKK2V4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tZnJlZWJzZDokUEFUSApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1saW51eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNiZjFkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2gKQEAgLTAsMCArMSw0MyBAQAorIyEgL2Jpbi9zaAorCisjIExJTlVYIFZFUlNJT04KKyMgU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKKyMgb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyMgYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCisjCisjIE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAorIyBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgorIworIyBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIExpbnV4IGluc3RhbGxhdGlvbi4KKworIyBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAorIyBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KKworZXhwb3J0IFNDSVRFQ0g9JE1HTF9ST09UIAorCisjIFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKKyMgZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKKyMgaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKKyMgbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCisKK2V4cG9ydCBTQ0lURUNIX0xJQj0kU0NJVEVDSAorCisjIFRoZSBQUklWQVRFIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBwcml2YXRlIHNvdXJjZSBmaWxlcyByZXNpZGUgdGhhdAorIyBkbyBub3QgbGl2ZSBpbiB0aGUgcHVibGljIHNvdXJjZSB0cmVlCisKK2V4cG9ydCBQUklWQVRFPSRIT01FL3ByaXZhdGUKKworIyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGFsbCB0aGUgY29tcGlsZXJzIHRoYXQgeW91IG1heQorIyBiZSB1c2luZy4gQ2hhbmdlIHRoZW0gdG8gcmVmbGVjdCB3aGVyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgeW91cgorIyBjb21waWxlcnMuCisKK2V4cG9ydCBHQ0NfUEFUSD0vdXNyL2JpbgorZXhwb3J0IFRFTVA9L3RtcCBUTVA9L3RtcAorCisjIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICitleHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLWxpbnV4OiRQQVRICitpZiBbICJ4JExJQkMiID0geCBdOyB0aGVuCisJZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluLWxpbnV4L2dsaWJjOiRQQVRICitlbHNlCisJZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluLWxpbnV4L2xpYmM6JFBBVEgKK2ZpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1xbnguc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1xbnguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLXFueC5zaApAQCAtMCwwICsxLDM3IEBACisjISAvYmluL3NoCisKKyMgUU5YIDQgVkVSU0lPTgorIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAorIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcworIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KKyMKKyMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCisjIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCisjCisjIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgorCisjIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCisjIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgorCitleHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCisKKyMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQorIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAorIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcworIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KKworZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICisKKyMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0CisjIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKKworZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQorCisjIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5CisjIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCisjIGNvbXBpbGVycy4KKworZXhwb3J0IFdDMTBfUEFUSD0vdXNyL3dhdGNvbS8xMC42L3VzcgorCisjIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICitleHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLXFueDokUEFUSApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjEwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy5iYXQKQEAgLTAsMCArMSwxMTAgQEAKK0BlY2hvIG9mZgorUkVNOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JFTTogTWFzdGVyIGJhdGNoIGZpbGUgdG8gc2V0IHVwIGFsbCBuZWNlc3NhcnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvcgorUkVNOiB0aGUgU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMuIFRoaXMgYmF0Y2ggZmlsZSBzaG91bGQgYmUgZXhlY3V0ZWQKK1JFTTogKmZpcnN0KiBiZWZvcmUgYW55IG90aGVyIGJhdGNoIGZpbGVzIHdoZW4geW91IHN0YXJ0IGEgY29tbWFuZCBzaGVsbC4KK1JFTTogWW91IHNob3VsZCBub3QgbmVlZCB0byBtb2RpZnkgYW55IGJhdGNoIGZpbGVzIGV4Y2VwdCB0aGlzIG9uZSB0bworUkVNOiBjb25maWd1cmUgdGhlIG1ha2VmaWxlIHV0aWxpdGllcy4KK1JFTTo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JFTTogU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKK1JFTTogb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1JFTTogYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCitSRU06CitSRU06IE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAorUkVNOiBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgorUkVNOgorUkVNOiBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIE1TRE9TIGluc3RhbGxhdGlvbi4KKworUkVNOiBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAorUkVNOiBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KKworU0VUIFNDSVRFQ0g9Yzpcc2NpdGVjaAorCitSRU06IFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKK1JFTTogZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKK1JFTTogaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKK1JFTTogbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCisKK1NFVCBTQ0lURUNIX0xJQj0lU0NJVEVDSCUKKworUkVNOiBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKK1JFTTogZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQorCitTRVQgUFJJVkFURT1jOlxwcml2YXRlCisKK1JFTTogVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZSBwYXRoIHRvIHRoZSBTY2lUZWNoIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKK1JFTTogZm9yIHRoZSBkZXZlbG9wbWVudCBvcGVyYXRpbmcgc3lzdGVtLiBXZSBzZWxlY3QgZWl0aGVyIERPUyBob3N0ZWQKK1JFTTogdG9vbHMgb3IgV2luMzIgaG9zdGVkIHRvb2xzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZworUkVNOiBvbiBOVCBvciBub3QuIFdpbmRvd3MgOXggdXNlcnMgY2FuIHVzZSB0aGUgV2luMzIgaG9zdGVkIHRvb2xzIGJ1dAorUkVNOiB0aGV5IHJ1biBzbG93ZXIsIGJ1dCB5b3Ugd2lsbCBoYXZlIGxvbmcgZmlsZW5hbWVzIGlmIHlvdSBkbyB0aGlzLgorCitJRiAuJU9TJT09LldpbmRvd3NfTlQgZ290byBXaW4zMl9wYXRoCitJRiBOT1QgLiVXSU5ESVIlPT0uIGdvdG8gV2luMzJfcGF0aAorU0VUIFNDSVRFQ0hfQklOPSVTQ0lURUNIJVxiaW47JVNDSVRFQ0glXGJpbi1kb3MKK2dvdG8gcGF0aF9zZXQKKworUkVNOiBUaGUgZm9sbG93aW5nIHNldHMgdXAgdGhlIHBhdGggdG8gdGhlIFNjaVRlY2ggY29tbWFuZCBsaW5lIHV0aWxpdGllcworUkVNOiBmb3IgdGhlIGRldmVsb3BtZW50IG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMgorUkVNOiBob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdCwgc28geW91IGNhbiB1c2UgbG9uZyBmaWxlbmFtZXMuCisKKzpXaW4zMl9wYXRoCitTRVQgU0NJVEVDSF9CSU49JVNDSVRFQ0glXGJpbjslU0NJVEVDSCVcYmluLXdpbjMyCisKKzpwYXRoX3NldAorCitSRU06IFNldCB0aGUgVE1QIHZhcmlhYmxlIGZvciBkbWFrZSBpZiB0aGlzIGlzIG5vdCBhbHJlYWR5IHNldAorCitTRVQgVE1QPSVTQ0lURUNIJQorCitSRU06IFNldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHVzZSB0aGUgTmV0d2lkZSBBc3NlbWJsZXIKK1JFTTogKE5BU00pIHByb3ZpZGVkIHdpdGggdGhlIE1HTCB0b29scyB0byBidWlsZCBhbGwgYXNzZW1ibGVyIG1vZHVsZXMuCitSRU06IElmIHlvdSBoYXZlIFR1cmJvIEFzc2VtYmxlciA0LjAgb3IgbGF0ZXIgYW5kIHlvdSB3aXNoIHRvIHVzZSBpdCwKK1JFTTogeW91IGNhbiB1c2UgaXQgYnkgcmVtb3ZpbmcgdGhlIGZvbGxvd2luZyBsaW5lLgorCitTRVQgVVNFX05BU009MQorCitSRU06IFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB0byBzZXQgdXAgRERLIGRpcmVjdG9yaWVzIGZvciBkZXZpY2UgZHJpdmVyCitSRU06IGRldmVsb3BtZW50LiBUaGV5IGNhbiBzYWZlbHkgYmUgaWdub3JlZCB1bmxlc3MgeW91IGFyZSB1c2luZyB0aGUKK1JFTTogU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMgdG8gYnVpbGQgZGV2aWNlIGRyaXZlcnMuCisKK1NFVCBEREtEUklWRT1jOgorU0VUIE1TU0RLPWM6XGNcd2luMzJzZGsKK1NFVCBXOTVfRERLUk9PVD1jOlxjXDk1ZGRrCitTRVQgVzk4X0RES1JPT1Q9YzpcY1w5OGRkaworU0VUIE5UX0RES1JPT1Q9YzpcY1xudGRkaworU0VUIFcyS19EREtST09UPWM6XGNcMjAwMGRkaworU0VUIE1BU01fUk9PVD1jOlxjXG1hc202MTEKK1NFVCBWVE9PTFNEPWM6XGNcdnRkOTUKK1NFVCBTT0ZUSUNFX1BBVEg9YzpcY1xzaW50CisKK1JFTTogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKK1JFTTogYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKK1JFTTogY29tcGlsZXJzLgorCitTRVQgQkMzX1BBVEg9YzpcY1xiYzMKK1NFVCBCQzRfUEFUSD1jOlxjXGJjNDUKK1NFVCBCQzVfUEFUSD1jOlxjXGJjNTAKK1NFVCBCQ0I1X1BBVEg9YzpcY1xiY2I1MAorU0VUIFZDX1BBVEg9YzpcY1xtc3ZjCitTRVQgVkM0X1BBVEg9YzpcY1x2YzQyCitTRVQgVkM1X1BBVEg9YzpcY1x2YzUwCitTRVQgVkM2X1BBVEg9YzpcY1x2YzYwCitTRVQgU0M3MF9QQVRIPWM6XGNcc2M3NQorU0VUIFdDMTBBX1BBVEg9YzpcY1x3YzEwYQorU0VUIFdDMTBfUEFUSD1jOlxjXHdjMTAKK1NFVCBXQzExX1BBVEg9YzpcY1x3YzExCitTRVQgVE5UX1BBVEg9YzpcY1x0bnQKK1NFVCBESl9QQVRIPWM6XGNcZGpncHAKK1NFVCBHQ0MyX1BBVEg9YzpcdW5peFx1c3IKKworUkVNOiBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBJREUgYW5kIGNvbXBpbGVyIHBhdGgKK1JFTTogdG9vbHMgZm9yIFZpc3VhbCBDKysuIElmIHlvdSBkbyBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbiwgeW91IHdvbnQKK1JFTTogbmVlZCB0byBjaGFuZ2UgdGhpcy4gSWYgaG93ZXZlciB5b3UgZGlkIGEgY3VzdG9tIGluc3RhbGwgYW5kIGNoYW5nZWQKK1JFTTogdGhlIHBhdGhzIHRvIHRoZXNlIGRpcmVjdG9yeSwgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhpcyB0byBzdWl0LgorCitTRVQgVkM1X01TRGV2RGlyPSVWQzVfUEFUSCVcc2hhcmVkaWRlCitTRVQgVkM1X01TVkNEaXI9JVZDNV9QQVRIJVx2YworU0VUIFZDNl9NU0RldkRpcj0lVkM2X1BBVEglXGNvbW1vblxtc2Rldjk4CitTRVQgVkM2X01TVkNEaXI9JVZDNl9QQVRIJVx2Yzk4CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY3ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1jMzIuYmF0CkBAIC0wLDAgKzEsMzYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA0LjIgMzIgYml0IGVkaXRpb24KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKK3NldCBDX0lOQ0xVREU9JVZDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQorc2V0IElOSVQ9JVZDNF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9VkM0CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKKworUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCitpZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKK2NhbGwgd2luMzJzZGsuYmF0CisKKzpkb25lCitlY2hvIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTc0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWQxNi5iYXQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFZDNDslVkNfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFZDNDslVkNfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7CitzZXQgSU5JVD0lVkNfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9VkM0CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKKworZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2IERPUyBiaXQgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydjl4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2OXguYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTM1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydjl4LmJhdApAQCAtMCwwICsxLDIxIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCisKK1JFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQKK2NhbGwgdmM0MC1jMzIuYmF0ID4gTlVMCisKK1JFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIDl4IERESyBkZXZlbG9wbWVudAorc2V0IE1BU1RFUl9NQUtFPTEKK3NldCBEREtST09UPSVXOTVfRERLUk9PVCUKK3NldCBTREtST09UPSVNU1NESyUKK3NldCBDMTZfUk9PVD0lVkNfUEFUSCUKK3NldCBDMzJfUk9PVD0lVkM0X1BBVEglCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpjaGVja2VkX2J1aWxkCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gZG9uZQorOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA0LjIgV2luZG93cyA5eCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2bnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjY3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdApAQCAtMCwwICsxLDE4IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCisKK1JFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQgKHdpdGggUGxhdGZvcm0gU0RLKQorY2FsbCB2YzQwLWMzMi5iYXQgc2RrID4gTlVMCisKK1JFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIE5UIERESyBkZXZlbG9wbWVudAorU0VUIEJBU0VESVI9JU5UX0RES1JPT1QlCitTRVQgUEFUSD0lTlRfRERLUk9PVCVcYmluOyVQQVRIJQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBkb25lCis6Y2hlY2tlZF9idWlsZAorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpkb25lCitlY2hvIFZpc3VhbCBDKysgNC4yIFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1zbnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTcwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXNucC5iYXQKQEAgLTAsMCArMSwzMSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQorc2V0IElOSVQ9JVZDNF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9OVERSVj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9MQorU0VUIFZDX0xJQkJBU0U9VkM0CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKKworZWNobyBWaXN1YWwgQysrIDQuMiBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmYzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdG50LmJhdApAQCAtMCwwICsxLDQyIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOworc2V0IElOSVQ9JVZDNF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX05URFJWPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPVZDNAorUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCisKK1JFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgorUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgorUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCitSRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKK1JFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCitSRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAorUkVNIHdvcmsgdG9vIHdlbGwpLgorUkVNCitSRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCitSRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgorCitTRVQgRE9TU1RZTEU9CisKK2VjaG8gVmlzdWFsIEMrKyA0LjIgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0OWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdzE2LmJhdApAQCAtMCwwICsxLDI2IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKK3NldCBJTklUPSVWQ19QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCitTRVQgVVNFX1dJTjE2PTEKK1NFVCBVU0VfV0lOMzI9CitTRVQgVkNfTElCQkFTRT1WQzQKK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKKworZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MzIuYmF0CkBAIC0wLDAgKzEsMzcgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA0LjIgMzIgYml0IGVkaXRpb24KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKK3NldCBDX0lOQ0xVREU9JVZDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQorc2V0IElOSVQ9JVZDNF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBXSU4zMl9HVUk9MQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX05URFJWPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPVZDNAorUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCisKK1JFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQoraWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCitjYWxsIHdpbjMyc2RrLmJhdAorCis6ZG9uZQorZWNobyBWaXN1YWwgQysrIDQuMiAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjBhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXgxMS5iYXQKQEAgLTAsMCArMSwyMCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgorCitTRVQgTElCPSVWQzRfUEFUSCVcTElCOy4KK1NFVCBUT09MUk9PVERJUj0lVkM0X1BBVEglCitTRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM0X1BBVEglXElOQ0xVREUKK1NFVCBJTklUPSVWQzRfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgV0lOMzJfR1VJPTEKK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9OVERSVj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9CitTRVQgVkNfTElCQkFTRT1WQzQKK1BBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslREVGUEFUSCUKKworZWNobyBWaXN1YWwgQysrIDQuMiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMjdiOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtYzMyLmJhdApAQCAtMCwwICsxLDM5IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCisKK1NFVCBNU0RldkRpcj0lVkM1X01TRGV2RGlyJQorU0VUIE1TVkNEaXI9JVZDNV9NU1ZDRGlyJQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQorc2V0IENfSU5DTFVERT0lTVNWQ0RpciVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7CitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK3NldCBJTklUPSVNU1ZDRGlyJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9dmM1CitQQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQorY2FsbCB3aW4zMnNkay5iYXQKKworOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA1LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZDE2LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg5YzUwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kMTYuYmF0CkBAIC0wLDAgKzEsMjYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyAxLjUyYyAxNiBiaXQgZWRpdGlvbgorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxWQzU7JVZDX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxWQzU7JVZDX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQ19QQVRIJQorc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQ19QQVRIJVxJTkNMVURFOworc2V0IElOSVQ9JVZDX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMTYuTUsKK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCisKK2VjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2OXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnY5eC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhNGExNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2OXguYmF0CkBAIC0wLDAgKzEsMjEgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KKworUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudAorY2FsbCB2YzYwLWMzMi5iYXQgPiBOVUwKKworUkVNOiBFeHRyYSBzdHVmZiB0byBzZXQgdXAgZm9yIFdpbmRvd3MgOXggRERLIGRldmVsb3BtZW50CitzZXQgTUFTVEVSX01BS0U9MQorc2V0IERES1JPT1Q9JVc5NV9EREtST09UJQorc2V0IFNES1JPT1Q9JU1TU0RLJQorc2V0IEMxNl9ST09UPSVWQ19QQVRIJQorc2V0IEMzMl9ST09UPSVWQzZfUEFUSCUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gZG9uZQorOmNoZWNrZWRfYnVpbGQKK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBkb25lCis6ZG9uZQorZWNobyBWaXN1YWwgQysrIDYuMCBXaW5kb3dzIDl4IGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnZudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiMmYyNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0CkBAIC0wLDAgKzEsMTcgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KKworUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudCAod2l0aCBQbGF0Zm9ybSBTREspCitjYWxsIHZjNjAtYzMyLmJhdCBzZGsgPiBOVUwKKworUkVNOiBOb3cgc2V0dXAgc3R1ZmYgZm9yIHRoZSBOVCBEREsgYnVpbGQgZW52aXJvbm1lbnQKK2NhbGwgbnRkZGsuYmF0CisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpjaGVja2VkX2J1aWxkCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gZG9uZQorOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXJ0dC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXJ0dC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtcnR0LmJhdApAQCAtMCwwICsxLDMwIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzU7JVZDNV9QQVRIJVxWQ1xMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBUT09MUk9PVERJUj0lVkM1X1BBVEglXFZDCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNV9QQVRIJVxWQ1xJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKK3NldCBJTklUPSVWQzVfUEFUSCVcVkMKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPTEKK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQorCitlY2hvIFZpc3VhbCBDKysgNS4wIFJUVGFyZ2V0LTMyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDJlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXNucC5iYXQKQEAgLTAsMCArMSwzMyBAQAorQGVjaG8gb2ZmIFJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdAorZWRpdGlvbgorCitTRVQgTVNEZXZEaXI9JVZDNV9NU0RldkRpciUKK1NFVCBNU1ZDRGlyPSVWQzVfTVNWQ0RpciUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKK3NldCBJTklUPSVNU1ZDRGlyJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9OVERSVj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9MQorU0VUIFZDX0xJQkJBU0U9dmM1CitQQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQorCitlY2hvIFZpc3VhbCBDKysgNS4wIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwOTE5OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdG50LmJhdApAQCAtMCwwICsxLDQyIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxWQzU7JVZDNV9QQVRIJVxWQ1xMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JVZDNV9QQVRIJVxWQworc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQzVfUEFUSCVcVkNcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7CitzZXQgSU5JVD0lVkM1X1BBVEglXFZDCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9dmM1CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDNV9QQVRIJVxWQ1xCSU47JVZDNV9QQVRIJVxTSEFSRURJREVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCisKK1JFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgorUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgorUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCitSRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKK1JFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCitSRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAorUkVNIHdvcmsgdG9vIHdlbGwpLgorUkVNCitSRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCitSRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgorCitTRVQgRE9TU1RZTEU9CisKK2VjaG8gVmlzdWFsIEMrKyA1LjAgMzItYml0IGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAod2l0aCBUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYWI0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXcxNi5iYXQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFZDNTslVkNfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFZDNTslVkNfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7CitzZXQgSU5JVD0lVkNfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSworU0VUIFVTRV9XSU4xNj0xCitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNQorUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCisKK2VjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JjNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MzIuYmF0CkBAIC0wLDAgKzEsMzkgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KKworU0VUIE1TRGV2RGlyPSVWQzVfTVNEZXZEaXIlCitTRVQgTVNWQ0Rpcj0lVkM1X01TVkNEaXIlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCitzZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQorc2V0IElOSVQ9JU1TVkNEaXIlCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9dmM1CitQQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQorY2FsbCB3aW4zMnNkay5iYXQKKworOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA1LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI4NmJkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC14MTEuYmF0CkBAIC0wLDAgKzEsMjAgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KKworU0VUIExJQj0lVkM1X1BBVEglXFZDXExJQjsuCitTRVQgVE9PTFJPT1RESVI9JVZDNV9QQVRIJVxWQworU0VUIElOQ0xVREU9XHhjXGluY2x1ZGU7JVZDNV9QQVRIJVxWQ1xJTkNMVURFCitTRVQgSU5JVD0lVkM1X1BBVEglXFZDCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX1ZYRD0KK1NFVCBVU0VfTlREUlY9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9dmM1CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDNV9QQVRIJVxWQ1xCSU47JVZDNV9QQVRIJVxTSEFSRURJREVcQklOOyVERUZQQVRIJQorCitlY2hvIFZpc3VhbCBDKysgNS4wIFgxMSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtYzMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg0MTdkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1jMzIuYmF0CkBAIC0wLDAgKzEsMzkgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KKworU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCitTRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCitzZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERQorc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCitzZXQgSU5JVD0lTVNWQ0RpciUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX05URFJWPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNgorUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKKworUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCitpZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKK2NhbGwgd2luMzJzZGsuYmF0CisKKzpkb25lCitlY2hvIFZpc3VhbCBDKysgNi4wIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4NTVlMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZDE2LmJhdApAQCAtMCwwICsxLDI2IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKK3NldCBJTklUPSVWQ19QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9CitTRVQgVkNfTElCQkFTRT12YzYKK1BBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQorCitlY2hvIFZpc3VhbCBDKysgMS41MmMgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2OXguYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTRhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdApAQCAtMCwwICsxLDIxIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCisKK1JFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQKK2NhbGwgdmM2MC1jMzIuYmF0ID4gTlVMCisKK1JFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIDl4IERESyBkZXZlbG9wbWVudAorc2V0IE1BU1RFUl9NQUtFPTEKK3NldCBEREtST09UPSVXOTVfRERLUk9PVCUKK3NldCBTREtST09UPSVNU1NESyUKK3NldCBDMTZfUk9PVD0lVkNfUEFUSCUKK3NldCBDMzJfUk9PVD0lVkM2X1BBVEglCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpjaGVja2VkX2J1aWxkCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gZG9uZQorOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyA5eCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2bnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjJmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdApAQCAtMCwwICsxLDE3IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCisKK1JFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQgKHdpdGggUGxhdGZvcm0gU0RLKQorY2FsbCB2YzYwLWMzMi5iYXQgc2RrID4gTlVMCisKK1JFTTogTm93IHNldHVwIHN0dWZmIGZvciB0aGUgTlQgRERLIGJ1aWxkIGVudmlyb25tZW50CitjYWxsIG50ZGRrLmJhdAorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBkb25lCis6Y2hlY2tlZF9idWlsZAorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpkb25lCitlY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDQyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydncyay5iYXQKQEAgLTAsMCArMSwxNyBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgorCitSRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKK2NhbGwgdmM2MC1jMzIuYmF0IHNkayA+IE5VTAorCitSRU06IE5vdyBzZXR1cCBzdHVmZiBmb3IgdGhlIE5UIERESyBidWlsZCBlbnZpcm9ubWVudAorY2FsbCB3MmtkZGsuYmF0CisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIGRvbmUKKzpjaGVja2VkX2J1aWxkCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gZG9uZQorOmRvbmUKK2VjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBXaW5kb3dzIDIwMDAgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDhlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXNucC5iYXQKQEAgLTAsMCArMSwzMyBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgorCitTRVQgTVNEZXZEaXI9JVZDNl9NU0RldkRpciUKK1NFVCBNU1ZDRGlyPSVWQzZfTVNWQ0RpciUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxWQzY7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitzZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKK3NldCBJTklUPSVNU1ZDRGlyJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9OVERSVj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9MQorU0VUIFZDX0xJQkJBU0U9dmM2CitQQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQorCitlY2hvIFZpc3VhbCBDKysgNi4wIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXRudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YjVlMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdG50LmJhdApAQCAtMCwwICsxLDQyIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNjslVkM2X1BBVEglXFZDOThcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNjslVkM2X1BBVEglXFZDOThcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworc2V0IFRPT0xST09URElSPSVWQzZfUEFUSCVcVkM5OAorc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQzZfUEFUSCVcVkM5OFxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKK3NldCBJTklUPSVWQzZfUEFUSCVcVkM5OAorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX05URFJWPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNiBQQVRICislU0NJVEVDSF9CSU4lOyVWQzZfUEFUSCVcVkM5OFxCSU47JVZDNl9QQVRIJVxDT01NT05cTVNERVY5OFxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKKworUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCitSRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCitSRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKK1JFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcworUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKK1JFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0CitSRU0gd29yayB0b28gd2VsbCkuCitSRU0KK1JFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKK1JFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCisKK1NFVCBET1NTVFlMRT0KKworZWNobyBWaXN1YWwgQysrIDYuMCAzMi1iaXQgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwICh3aXRoIFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxNzVjMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzE2LmJhdApAQCAtMCwwICsxLDI3IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKK3NldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKK3NldCBJTklUPSVWQ19QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCitTRVQgVVNFX1dJTjE2PTEKK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1JUVEFSR0VUPQorU0VUIFVTRV9TTkFQPQorU0VUIFZDX0xJQkJBU0U9dmM2CitQQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKKworZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOGU3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXczMi5iYXQKQEAgLTAsMCArMSwzOSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgorCitTRVQgTVNEZXZEaXI9JVZDNl9NU0RldkRpciUKK1NFVCBNU1ZDRGlyPSVWQzZfTVNWQ0RpciUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitzZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK3NldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK3NldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKK3NldCBDX0lOQ0xVREU9JU1TVkNEaXIlXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFCitzZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK3NldCBJTklUPSVNU1ZDRGlyJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBXSU4zMl9HVUk9MQorU0VUIFVTRV9WWEQ9CitTRVQgVVNFX05URFJWPQorU0VUIFVTRV9SVFRBUkdFVD0KK1NFVCBVU0VfU05BUD0KK1NFVCBWQ19MSUJCQVNFPXZjNgorUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKKworUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCitpZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKK2NhbGwgd2luMzJzZGsuYmF0CisKKzpkb25lCitlY2hvIFZpc3VhbCBDKysgNi4wIDMyLWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC14MTEuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjIzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXgxMS5iYXQKQEAgLTAsMCArMSwyMCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgorCitTRVQgTElCPSVWQzZfUEFUSCVcVkM5OFxMSUI7LgorU0VUIFRPT0xST09URElSPSVWQzZfUEFUSCVcVkM5OAorU0VUIElOQ0xVREU9XHhjXGluY2x1ZGU7JVZDNl9QQVRIJVxWQzk4XElOQ0xVREU7CitTRVQgSU5JVD0lVkM2X1BBVEglXFZDOTgKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgV0lOMzJfR1VJPTEKK1NFVCBVU0VfVlhEPQorU0VUIFVTRV9OVERSVj0KK1NFVCBVU0VfUlRUQVJHRVQ9CitTRVQgVVNFX1NOQVA9CitTRVQgVkNfTElCQkFTRT12YzYKK1BBVEggJVNDSVRFQ0hfQklOJTslVkM2X1BBVEglXFZDOThcQklOOyVWQzZfUEFUSCVcQ09NTU9OXE1TREVWOThcQklOOyVERUZQQVRIJQorCitlY2hvIFZpc3VhbCBDKysgNi4wIFgxMSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3cya2Rkay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93MmtkZGsuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODU4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93MmtkZGsuYmF0CkBAIC0wLDAgKzEsNDIgQEAKK0BlY2hvIG9mZgorUkVNOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNaWNyb3NvZnQgV2luZG93cyBOVCBEREsgZGV2ZWxvcG1lbnQuCitSRU06IE5vdGUgdGhhdCB3ZSBoYXZlIGhhcmQgY29kZWQgdGhpcyBmb3IgV2luZG93cyBOVCBpMzg2IGRldmVsb3BtZW50LgorCitTRVQgVVNFX05URFJWPTEKK1NFVCBVU0VfVzJLRFJWPTEKK1NFVCBCQVNFRElSPSVXMktfRERLUk9PVCUKK1NFVCBQQVRIPSVCQVNFRElSJVxiaW47JVBBVEglCitTRVQgTlRNQUtFRU5WPSVCQVNFRElSJVxpbmMKK1NFVCBCVUlMRF9NQUtFX1BST0dSQU09bm1ha2UuZXhlCitTRVQgQlVJTERfREVGQVVMVD0tZWkgLW5tYWtlIC1pCitTRVQgQlVJTERfREVGQVVMVF9UQVJHRVRTPS0zODYKK1NFVCBfT0JKX0RJUj1vYmoKK1NFVCBORVdfQ1JUUz0xCitTRVQgX05UUk9PVD0lQkFTRURJUiUKK1NFVCBJTkNMVURFPSVCQVNFRElSJVxpbmM7JUJBU0VESVIlXGluY1xkZGs7JUlOQ0xVREUlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZAorCitSRU06IHNldCB1cCBhbiBOVCBmcmVlIGJ1aWxkIGVudmlyb25tZW50CitTRVQgRERLQlVJTERFTlY9ZnJlZQorU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRAorU0VUIE5UREJHRklMRVM9MQorU0VUIE5UREVCVUc9CitTRVQgTlRERUJVR1RZUEU9CitTRVQgTVNDX09QVElNSVpBVElPTj0KK3NldCBMSUI9JUJBU0VESVIlXGxpYmZyZVxpMzg2OyVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVzJLRFJWXFZDNjslTVNWQ0RpciVcTElCOy4KKworZ290byBkb25lCisKKzpjaGVja2VkCisKK1JFTTogc2V0IHVwIGFuIE5UIGNoZWNrZWQgYnVpbGQgZW52aXJvbm1lbnQKK1NFVCBEREtCVUlMREVOVj1jaGVja2VkCitTRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxEIC1EUkRSREJHIC1EU1JWREJHCitTRVQgTlREQkdGSUxFUz0KK1NFVCBOVERFQlVHPW50c2QKK1NFVCBOVERFQlVHVFlQRT1ib3RoCitTRVQgTVNDX09QVElNSVpBVElPTj0vT2QgL09pCitzZXQgTElCPSVCQVNFRElSJVxsaWJjaGtcaTM4NjslU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXMktEUlZcVkM2OyVNU1ZDRGlyJVxMSUI7LgorCis6ZG9uZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzM4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWMzMi5iYXQKQEAgLTAsMCArMSwzNCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXE5UOworU0VUIFdBVENPTT0lV0MxMF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBVU0VfV0lOMzg2PQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzEwCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuNiBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTNhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQxNi5iYXQKQEAgLTAsMCArMSwzMCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIChET1M0R1cpCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFdDMTA7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcV0MxMDsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAorU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcV0lOOworU0VUIFdBVENPTT0lV0MxMF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzEwCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuNiAxNi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM3MjEwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMzIuYmF0CkBAIC0wLDAgKzEsMzQgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcRE9TOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDsKK1NFVCBXQVRDT009JVdDMTBfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBVU0VfUU5YND0KK1NFVCBXQ19MSUJCQVNFPVdDMTAKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERPUzRHVykKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8xNi5iYXQKQEAgLTAsMCArMSwzMSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDE2LWJpdCBPUy8yIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMTZcd2MxMDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIxNlx3YzEwOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKK1NFVCBXQVRDT009JVdDMTBfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MxNi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9MQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMAorU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjYgMTYtYml0IE9TLzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDRiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8zMi5iYXQKQEAgLTAsMCArMSwzMSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyLWJpdCBPUy8yIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKK1NFVCBXQVRDT009JVdDMTBfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPTEKK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMAorU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNTdkZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcDMyLmJhdApAQCAtMCwwICsxLDMxIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzItYml0IE9TLzIgbW9kZQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzEwOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTA7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKK1NFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAorU0VUIFdBVENPTT0lV0MxMF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9MQorU0VUIFVTRV9PUzJHVUk9MQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMAorU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY4NjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1xbnguYmF0CkBAIC0wLDAgKzEsMzQgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZSAoUU5YIDQpCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFFOWDRcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XFFOWDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xRTlg0XFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxRTlg7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcUUg7CitTRVQgV0FUQ09NPSVXQzEwX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9YMzI9CitTRVQgVVNFX1gzMlZNPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9MQorU0VUIFdDX0xJQkJBU0U9V0MxMAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURKX1BBVEglXEJJTjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuNiAzMi1iaXQgUU5YIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXNucC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkZTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtc25wLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSAorU0VUIFdBVENPTT0lV0MxMF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9XSU4zODY9CitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0xCitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzEwCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuNiBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmYwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXRudC5iYXQKQEAgLTAsMCArMSw0NiBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAorU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCitTRVQgV0FUQ09NPSVXQzEwX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKK1NFVCBVU0VfVE5UPTEKK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9XSU4zODY9CitTRVQgVVNFX09TMjE2PQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9V0MxMAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK1JFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgorUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgorUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCitSRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKK1JFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCitSRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAorUkVNIHdvcmsgdG9vIHdlbGwpLgorUkVNCitSRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCitSRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgorCitTRVQgRE9TU1RZTEU9MQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmE4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXcxNi5iYXQKQEAgLTAsMCArMSwzMiBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxXQzEwOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7JVdDMTBfUEFUSCVcSFxXSU47CitTRVQgV0FUQ09NPSVXQzEwX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKK1NFVCBVU0VfV0lOMTY9MQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBVU0VfUU5YND0KK1NFVCBXQ19MSUJCQVNFPVdDMTAKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMC42IDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWJkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXczMi5iYXQKQEAgLTAsMCArMSwzNCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXE5UOworU0VUIFdBVENPTT0lV0MxMF9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBVU0VfV0lOMzg2PQorU0VUIFdJTjMyX0dVST0xCitTRVQgVVNFX09TMjE2PQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9V0MxMAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjYgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzgzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXgxMS5iYXQKQEAgLTAsMCArMSwyNCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCisKK1NFVCBMSUI9JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT0lV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7CitTRVQgV0FUQ09NPSVXQzEwX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9YMzI9CitTRVQgVVNFX1gzMlZNPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9MQorU0VUIFVTRV9XSU4zODY9CitTRVQgV0lOMzJfR1VJPTEKK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzEwCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuNiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwYzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhYzMyLmJhdApAQCAtMCwwICsxLDMzIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXE5UOworU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX09TMjE2PQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFdDX0xJQkJBU0U9V0MxMEEKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjBhIFdpbjMyIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllY2I2NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDE2LmJhdApAQCAtMCwwICsxLDI5IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlIChET1M0R1cpCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFdDMTBBOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFdDMTBBOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAorU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxXSU47CitTRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgV0NfTElCQkFTRT1XQzEwQQorU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmI3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQzMi5iYXQKQEAgLTAsMCArMSwzMiBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxET1M7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOworU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBXQ19MSUJCQVNFPVdDMTBBCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRE9TNEdXKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzM1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8xNi5iYXQKQEAgLTAsMCArMSwzMCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAxNi1iaXQgT1MvMiBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjE2XHdjMTA7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMTZcd2MxMDsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcZWRkYXQKK1NFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBBX1BBVEglXGhcb3MyOyVXQzEwQV9QQVRIJVxoCitTRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzE2Lm1rCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0xCitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgV0NfTElCQkFTRT13YzEwCitTRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IE9TLzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2FhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8zMi5iYXQKQEAgLTAsMCArMSwzMCBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMi1iaXQgT1MvMiBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjMyXHdjMTA7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMzJcd2MxMDsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMEFBX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwQUFfUEFUSCVcaFxvczI7JVdDMTBBQV9QQVRIJVxoCitTRVQgV0FUQ09NPSVXQzEwQUFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPTEKK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFdDX0xJQkJBU0U9V0MxMEEKK1NFVCBFRFBBVEg9JVdDMTBBQV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQUFfUEFUSCVcQklOTlQ7JVdDMTBBQTZfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyMWM2MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhcDMyLmJhdApAQCAtMCwwICsxLDMwIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyLWJpdCBPUy8yIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKK1NFVCBXQVRDT009JVdDMTBfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPTEKK1NFVCBVU0VfT1MyR1VJPTEKK1NFVCBVU0VfU05BUD0KK1NFVCBXQ19MSUJCQVNFPVdDMTBBCitTRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY4NTdjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFzbnAuYmF0CkBAIC0wLDAgKzEsMzMgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCitTRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPTEKK1NFVCBVU0VfV0lOMzg2PQorU0VUIFdJTjMyX0dVST0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9MQorU0VUIFdDX0xJQkJBU0U9V0MxMEEKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDEwLjBhIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXRudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiMzIxOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdG50LmJhdApAQCAtMCwwICsxLDQ1IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBBX1BBVEglXEg7JVdDMTBBX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCitTRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0xCitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBXQ19MSUJCQVNFPVdDMTBBCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitSRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KK1JFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKK1JFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcworUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCitSRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcworUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKK1JFTSB3b3JrIHRvbyB3ZWxsKS4KK1JFTQorUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAorUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KKworU0VUIERPU1NUWUxFPTEKKworZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzE2LmJhdApAQCAtMCwwICsxLDMxIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMEE7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMEE7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXFdJTjsKK1NFVCBXQVRDT009JVdDMTBBX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKK1NFVCBVU0VfV0lOMTY9MQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBXQ19MSUJCQVNFPVdDMTBBCitTRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxNGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzMyLmJhdApAQCAtMCwwICsxLDMzIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXE5UOworU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBXSU4zMl9HVUk9MQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBXQ19MSUJCQVNFPVdDMTBBCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWMzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1MzEyOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtYzMyLmJhdApAQCAtMCwwICsxLDQwIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorU0VUIENfSU5DTFVERT0lV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBXSU4zMl9HVUk9CitTRVQgVVNFX09TMjE2PQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9V0MxMQorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK1JFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQoraWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCitjYWxsIHdpbjMyc2RrLmJhdAorCis6ZG9uZQorZWNobyBXYXRjb20gQy9DKysgMTEuMCBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM4YWRhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMTYuYmF0CkBAIC0wLDAgKzEsMzAgQEAKK0BlY2hvIG9mZgorUkVNIFNFVHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAxNiBiaXQgbW9kZQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxXQzExOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFdDMTE7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXFdJTjsKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MxNi5NSworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX09TMjE2PQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9V0MxMQorU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDExLjAgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhNTRkNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDMyLmJhdApAQCAtMCwwICsxLDMzIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcRE9TOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7CitTRVQgV0FUQ09NPSVXQzExX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9YMzI9CitTRVQgVVNFX1gzMlZNPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzExCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREpfUEFUSCVcQklOOyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChET1M0R1cpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMTYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Njc1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8xNi5iYXQKQEAgLTAsMCArMSwzMSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDE2LWJpdCBPUy8yIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMTZcd2MxMTsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIxNlx3YzExOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MxNi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9MQorU0VUIFVTRV9PUzIzMj0KK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMQorU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDExLjAgMTYtYml0IE9TLzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjVkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8zMi5iYXQKQEAgLTAsMCArMSwzMSBAQAorQGVjaG8gb2ZmCitSRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyLWJpdCBPUy8yIG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMTsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzExOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0CitTRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5taworU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPTEKK1NFVCBVU0VfT1MyR1VJPQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMQorU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Y2JiZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtcDMyLmJhdApAQCAtMCwwICsxLDMxIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzItYml0IE9TLzIgbW9kZQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzExOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTE7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTFfUEFUSCVcZWRkYXQKK1NFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTFfUEFUSCVcaFxvczI7JVdDMTFfUEFUSCVcaAorU0VUIFdBVENPTT0lV0MxMV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9MQorU0VUIFVTRV9PUzJHVUk9MQorU0VUIFVTRV9TTkFQPQorU0VUIFVTRV9RTlg0PQorU0VUIFdDX0xJQkJBU0U9d2MxMQorU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCisKK2VjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtcW54LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtcW54LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ2MGZlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1xbnguYmF0CkBAIC0wLDAgKzEsMzQgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZSAoUU5YIDQpCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFFOWDRcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XFFOWDsuCitlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6Y2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xRTlg0XFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxRTlg7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcUUg7CitTRVQgV0FUQ09NPSVXQzExX1BBVEglCitTRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKK1NFVCBVU0VfVE5UPQorU0VUIFVTRV9YMzI9CitTRVQgVVNFX1gzMlZNPQorU0VUIFVTRV9XSU4xNj0KK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9MQorU0VUIFdDX0xJQkJBU0U9V0MxMQorUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURKX1BBVEglXEJJTjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgUU5YIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyYWM1NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtc25wLmJhdApAQCAtMCwwICsxLDM0IEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSAorU0VUIFdBVENPTT0lV0MxMV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0KK1NFVCBVU0VfWDMyPQorU0VUIFVTRV9YMzJWTT0KK1NFVCBVU0VfV0lOMTY9CitTRVQgVVNFX1dJTjMyPQorU0VUIFVTRV9XSU4zODY9CitTRVQgV0lOMzJfR1VJPQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0xCitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzExCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTEuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRiZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS10bnQuYmF0CkBAIC0wLDAgKzEsNDYgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgorZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOnNldHZhcnMKK1NFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXE5UOyVUTlRfUEFUSCVcSU5DTFVERQorU0VUIFdBVENPTT0lV0MxMV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCitTRVQgVVNFX1ROVD0xCitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0KK1NFVCBVU0VfV0lOMzg2PQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBVU0VfUU5YND0KK1NFVCBXQ19MSUJCQVNFPVdDMTEKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitSRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KK1JFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKK1JFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcworUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCitSRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcworUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKK1JFTSB3b3JrIHRvbyB3ZWxsKS4KK1JFTQorUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAorUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KKworU0VUIERPU1NUWUxFPTEKKworZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzE2LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjVjNzBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MTYuYmF0CkBAIC0wLDAgKzEsMzEgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlCisKK2lmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAorU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFdDMTE7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMTsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcV0lOOworU0VUIFdBVENPTT0lV0MxMV9QQVRIJQorU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCitTRVQgVVNFX1dJTjE2PTEKK1NFVCBVU0VfV0lOMzI9CitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBVU0VfT1MyMTY9CitTRVQgVVNFX09TMjMyPQorU0VUIFVTRV9PUzJHVUk9CitTRVQgVVNFX1NOQVA9CitTRVQgVVNFX1FOWDQ9CitTRVQgV0NfTElCQkFTRT1XQzExCitTRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCitQQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKKworZWNobyBXYXRjb20gQy9DKysgMTEuMCAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0Y2RiZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzMyLmJhdApAQCAtMCwwICsxLDQwIEBACitAZWNobyBvZmYKK1JFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKKworaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KK2VjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpjaGVja2VkX2J1aWxkCitTRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCitlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KK2dvdG8gc2V0dmFycworCis6c2V0dmFycworU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAorU0VUIENfSU5DTFVERT0lV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQKK1NFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBXSU4zMl9HVUk9MQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBVU0VfUU5YND0KK1NFVCBXQ19MSUJCQVNFPVdDMTEKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitSRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKK2lmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQorY2FsbCB3aW4zMnNkay5iYXQKKworOmRvbmUKK2VjaG8gV2F0Y29tIEMvQysrIDExLjAgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU2OWEzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS14MTEuYmF0CkBAIC0wLDAgKzEsMzQgQEAKK0BlY2hvIG9mZgorUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZQorCitpZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgorZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCitnb3RvIHNldHZhcnMKKworOmNoZWNrZWRfYnVpbGQKK1NFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KK2VjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgorZ290byBzZXR2YXJzCisKKzpzZXR2YXJzCitTRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCitTRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxOVDsKK1NFVCBXQVRDT009JVdDMTFfUEFUSCUKK1NFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSworU0VUIFVTRV9UTlQ9CitTRVQgVVNFX1gzMj0KK1NFVCBVU0VfWDMyVk09CitTRVQgVVNFX1dJTjE2PQorU0VUIFVTRV9XSU4zMj0xCitTRVQgVVNFX1dJTjM4Nj0KK1NFVCBXSU4zMl9HVUk9MQorU0VUIFVTRV9PUzIxNj0KK1NFVCBVU0VfT1MyMzI9CitTRVQgVVNFX09TMkdVST0KK1NFVCBVU0VfU05BUD0KK1NFVCBVU0VfUU5YND0KK1NFVCBXQ19MSUJCQVNFPVdDMTEKK1BBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQorCitlY2hvIFdhdGNvbSBDL0MrKyAxMS4wIFdpbjMyIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93aW4zMnNkay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93aW4zMnNkay5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3ZjAxNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3dpbjMyc2RrLmJhdApAQCAtMCwwICsxLDIwIEBACitAZWNobyBvZmYKK1JFTTogU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTWljcm9zb2Z0IFBsYXRmb3JtIFNESyBkZXZlbG9wbWVudAorUkVNOiBOb3RlIHRoYXQgd2UgaGF2ZSBoYXJkIGNvZGVkIHRoaXMgZm9yIFdpbmRvd3MgTlQgaTM4NiBkZXZlbG9wbWVudC4KKworU0VUIE1TVE9PTFM9JU1TU0RLJQorU0VUIERYU0RLUk9PVD0lTVNUT09MUyUKK1NFVCBJTkVUU0RLPSVNU1RPT0xTJQorU0VUIEJLT0ZGSUNFPSVNU1RPT0xTJQorU0VUIEJBU0VNQUtFPSVCS09GRklDRSVcSU5DTFVERVxCS09mZmljZS5NYWsKK1NFVCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslTVNUT09MUyVcSU5DTFVERTslQ19JTkNMVURFJQoraWYgLiUxJT09LmJvcmxhbmQgZ290byBib3JsYW5kCitTRVQgTElCPSVNU1RPT0xTJVxMSUI7JUxJQiUKK2dvdG8gbm90Ym9ybGFuZAorOmJvcmxhbmQKK1NFVCBMSUI9JU1TVE9PTFMlXExJQlxCT1JMQU5EOyVMSUIlCis6bm90Ym9ybGFuZAorU0VUIFBBVEg9JU1TVE9PTFMlXEJpblw7JU1TVE9PTFMlXEJpblxXaW5OVDslUEFUSCUKK1NFVCBDUFU9aTM4NgorCitlY2hvIE1pY3Jvc29mdCBQbGF0Zm9ybSBTREsgc3VwcG9ydCBlbmJhYmxlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9iaW9zZW11LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvYmlvc2VtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvYmlvc2VtdS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSByZWFsIG1vZGUgeDg2IEJJT1MgZW11bGF0b3IsIHdoaWNoIGlzCisqICAgICAgICAgICAgICAgdXNlZCB0byB3YXJtYm9vdCBhbnkgbnVtYmVyIG9mIFZHQSBjb21wYXRpYmxlIFBDSS9BR1AKKyogICAgICAgICAgICAgICBjb250cm9sbGVycyB1bmRlciBhbnkgT1MsIG9uIGFueSBwcm9jZXNzb3IgZmFtaWx5IHRoYXQKKyogICAgICAgICAgICAgICBzdXBwb3J0cyBQQ0kuIFdlIGFsc28gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2FsbAorKiAgICAgICAgICAgICAgIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucyBhbmQgSW50IDEwaCBmdW5jdGlvbnMgKGluY2x1ZGluZworKiAgICAgICAgICAgICAgIHRoZSBWRVNBIEJJT1MpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0JJT1NFTVVfSAorI2RlZmluZSBfX0JJT1NFTVVfSAorCisjaW5jbHVkZSAieDg2ZW11LmgiCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJwY2lsaWIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBwYWNrKDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVkdBCitjb250cm9sbGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIFZHQSBjb250cm9sbGVyIHRvIGJlCitzd2FwcGVkIG9uIHRoZSBmbHkgd2l0aGluIHRoZSBCSU9TIGVtdWxhdG9yLgorCitIRUFERVI6CitiaW9zZW11LmgKKworTUVNQkVSUzoKK3BjaUluZm8gICAgICAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIHRoZSBjb250cm9sbGVyCitCSU9TSW1hZ2UgICAgICAgLSBQb2ludGVyIHRvIGEgcmVhZC93cml0ZSBjb3B5IG9mIHRoZSBCSU9TIGltYWdlCitCSU9TSW1hZ2VMZW4gICAgLSBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UKK0xvd01lbSAgICAgICAgICAtIENvcHkgb2Yga2V5IGxvdyBtZW1vcnkgYXJlYXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUENJRGV2aWNlSW5mbyAgICpwY2lJbmZvOworICAgIHZvaWQgICAgICAgICAgICAqQklPU0ltYWdlOworICAgIHVsb25nICAgICAgICAgICBCSU9TSW1hZ2VMZW47CisgICAgdWNoYXIgICAgICAgICAgIExvd01lbVsxNTM2XTsKKyAgICB9IEJFX1ZHQUluZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit2Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK2Jpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKK2Jpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCitidXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCRV9WR0FJbmZvICAgICAgdmdhSW5mbzsKKyAgICB1bG9uZyAgICAgICAgICAgYmlvc21lbV9iYXNlOworICAgIHVsb25nICAgICAgICAgICBiaW9zbWVtX2xpbWl0OworICAgIHVsb25nICAgICAgICAgICBidXNtZW1fYmFzZTsKKyAgICB9IEJFX3N5c0VudjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgZGVmaW5pbmcgYWxsIHRoZSBCSU9TIEVtdWxhdG9yIEFQSSBmdW5jdGlvbnMgYXMgZXhwb3J0ZWQgZnJvbQordGhlIEJpbmFyeSBQb3J0YWJsZSBETEwuCit7c2VjcmV0fQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgIGR3U2l6ZTsKKyAgICBpYm9vbCAgIChQTUFQSVAgQkVfaW5pdCkodTMyIGRlYnVnRmxhZ3MsaW50IG1lbVNpemUsQkVfVkdBSW5mbyAqaW5mbyk7CisgICAgdm9pZCAgICAoUE1BUElQIEJFX3NldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7CisgICAgdm9pZCAgICAoUE1BUElQIEJFX2dldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7CisgICAgdm9pZCAqICAoUE1BUElQIEJFX21hcFJlYWxQb2ludGVyKSh1aW50IHJfc2VnLHVpbnQgcl9vZmYpOworICAgIHZvaWQgKiAgKFBNQVBJUCBCRV9nZXRWRVNBQnVmKSh1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKKyAgICB2b2lkICAgIChQTUFQSVAgQkVfY2FsbFJlYWxNb2RlKSh1aW50IHNlZyx1aW50IG9mZixSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOworICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NikoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOworICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NngpKGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKKyAgICB2b2lkICogIHJlc2VydmVkMTsKKyAgICB2b2lkICAgIChQTUFQSVAgQkVfZXhpdCkodm9pZCk7CisgICAgfSBCRV9leHBvcnRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHBvaW50ZXIgdHlwZSBmb3IgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgaW5pdGlhbGlzYXRpb24gZW50cnkgcG9pbnQuCit7c2VjcmV0fQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgQkVfZXhwb3J0cyAqIChQTUFQSVAgQkVfaW5pdExpYnJhcnlfdCkoUE1faW1wb3J0cyAqUE1JbXApOworCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIHtzZWNyZXR9IEdsb2JhbCBCSU9TIGVtdWxhdG9yIHN5c3RlbSBlbnZpcm9ubWVudCAqLworZXh0ZXJuIEJFX3N5c0VudiBfQkVfZW52OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgZW50cnkgcG9pbnRzICovCisKK2lib29sICAgUE1BUEkgQkVfaW5pdCh1MzIgZGVidWdGbGFncyxpbnQgbWVtU2l6ZSxCRV9WR0FJbmZvICppbmZvKTsKK3ZvaWQgICAgUE1BUEkgQkVfc2V0VkdBKEJFX1ZHQUluZm8gKmluZm8pOwordm9pZCAgICBQTUFQSSBCRV9nZXRWR0EoQkVfVkdBSW5mbyAqaW5mbyk7Cit2b2lkICAgIFBNQVBJIEJFX3NldERlYnVnRmxhZ3ModTMyIGRlYnVnRmxhZ3MpOwordm9pZCAqICBQTUFQSSBCRV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpOwordm9pZCAqICBQTUFQSSBCRV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpOwordm9pZCAgICBQTUFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKK2ludCAgICAgUE1BUEkgQkVfaW50ODYoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOworaW50ICAgICBQTUFQSSBCRV9pbnQ4NngoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQsUk1TUkVHUyAqc3JlZ3MpOwordm9pZCAgICBQTUFQSSBCRV9leGl0KHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0JJT1NFTVVfSCAqLworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTQ1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaApAQCAtMCwwICsxLDY5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19FVkVOVF9ICisjZGVmaW5lIF9fRVZFTlRfSAorCisjaW5jbHVkZSAic2NpdGVjaC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworLyogJ0MnIGNhbGxpbmcgY29udmVudGlvbnMgYWx3YXlzICovCisKKyNkZWZpbmUgRVZUQVBJICBfQVNNQVBJCisjZGVmaW5lIEVWVEFQSVAgX0FTTUFQSVAKKworLyogRXZlbnQgbWVzc2FnZSBtYXNrcyBmb3Iga2V5RG93biBldmVudHMgKi8KKworI2RlZmluZSBFVlRfQVNDSUlNQVNLICAgMHgwMEZGICAgICAgLyogQVNDSUkgY29kZSBvZiBrZXkgcHJlc3NlZCAgICAgICAgKi8KKyNkZWZpbmUgRVZUX1NDQU5NQVNLICAgIDB4RkYwMCAgICAgIC8qIFNjYW4gY29kZSBvZiBrZXkgcHJlc3NlZCAgICAgICAgICovCisjZGVmaW5lIEVWVF9DT1VOVE1BU0sgICAweDdGRkYwMDAwTCAvKiBDb3VudCBmb3IgS0VZUkVQRUFUJ3MgICAgICAgICAgICAqLworCisvKiBNYWNyb3MgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZHMgKi8KKworI2RlZmluZSBFVlRfYXNjaWlDb2RlKG0pICAgICggKHVjaGFyKSAobSAmIEVWVF9BU0NJSU1BU0spICkKKyNkZWZpbmUgRVZUX3NjYW5Db2RlKG0pICAgICAoICh1Y2hhcikgKCAobSAmIEVWVF9TQ0FOTUFTSykgPj4gOCApICkKKyNkZWZpbmUgRVZUX3JlcGVhdENvdW50KG0pICAoIChzaG9ydCkgKCAobSAmIEVWVF9DT1VOVE1BU0spID4+IDE2ICkgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZXMgdGhlIHNldCBvZiBBU0NJSSBjb2RlcyByZXBvcnRlZCBieSB0aGUgZXZlbnQgbGlicmFyeSBmdW5jdGlvbnMKK2luIHRoZSBtZXNzYWdlIGZpZWxkLiBVc2UgdGhlIEVWVF9hc2NpaUNvZGUgbWFjcm8gdG8gZXh0cmFjdCB0aGUgY29kZQorZnJvbSB0aGUgZXZlbnQgc3RydWN0dXJlLgorCitIRUFERVI6CitldmVudC5oCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBU0NJSV9jdHJsQSAgICAgICAgICAgICA9IDB4MDEsCisgICAgQVNDSUlfY3RybEIgICAgICAgICAgICAgPSAweDAyLAorICAgIEFTQ0lJX2N0cmxDICAgICAgICAgICAgID0gMHgwMywKKyAgICBBU0NJSV9jdHJsRCAgICAgICAgICAgICA9IDB4MDQsCisgICAgQVNDSUlfY3RybEUgICAgICAgICAgICAgPSAweDA1LAorICAgIEFTQ0lJX2N0cmxGICAgICAgICAgICAgID0gMHgwNiwKKyAgICBBU0NJSV9jdHJsRyAgICAgICAgICAgICA9IDB4MDcsCisgICAgQVNDSUlfYmFja3NwYWNlICAgICAgICAgPSAweDA4LAorICAgIEFTQ0lJX2N0cmxIICAgICAgICAgICAgID0gMHgwOCwKKyAgICBBU0NJSV90YWIgICAgICAgICAgICAgICA9IDB4MDksCisgICAgQVNDSUlfY3RybEkgICAgICAgICAgICAgPSAweDA5LAorICAgIEFTQ0lJX2N0cmxKICAgICAgICAgICAgID0gMHgwQSwKKyAgICBBU0NJSV9jdHJsSyAgICAgICAgICAgICA9IDB4MEIsCisgICAgQVNDSUlfY3RybEwgICAgICAgICAgICAgPSAweDBDLAorICAgIEFTQ0lJX2VudGVyICAgICAgICAgICAgID0gMHgwRCwKKyAgICBBU0NJSV9jdHJsTSAgICAgICAgICAgICA9IDB4MEQsCisgICAgQVNDSUlfY3RybE4gICAgICAgICAgICAgPSAweDBFLAorICAgIEFTQ0lJX2N0cmxPICAgICAgICAgICAgID0gMHgwRiwKKyAgICBBU0NJSV9jdHJsUCAgICAgICAgICAgICA9IDB4MTAsCisgICAgQVNDSUlfY3RybFEgICAgICAgICAgICAgPSAweDExLAorICAgIEFTQ0lJX2N0cmxSICAgICAgICAgICAgID0gMHgxMiwKKyAgICBBU0NJSV9jdHJsUyAgICAgICAgICAgICA9IDB4MTMsCisgICAgQVNDSUlfY3RybFQgICAgICAgICAgICAgPSAweDE0LAorICAgIEFTQ0lJX2N0cmxVICAgICAgICAgICAgID0gMHgxNSwKKyAgICBBU0NJSV9jdHJsViAgICAgICAgICAgICA9IDB4MTYsCisgICAgQVNDSUlfY3RybFcgICAgICAgICAgICAgPSAweDE3LAorICAgIEFTQ0lJX2N0cmxYICAgICAgICAgICAgID0gMHgxOCwKKyAgICBBU0NJSV9jdHJsWSAgICAgICAgICAgICA9IDB4MTksCisgICAgQVNDSUlfY3RybFogICAgICAgICAgICAgPSAweDFBLAorICAgIEFTQ0lJX2VzYyAgICAgICAgICAgICAgID0gMHgxQiwKKyAgICBBU0NJSV9zcGFjZSAgICAgICAgICAgICA9IDB4MjAsCisgICAgQVNDSUlfZXhjbGFtYXRpb24gICAgICAgPSAweDIxLCAvKiAhICovCisgICAgQVNDSUlfcXVvdGUgICAgICAgICAgICAgPSAweDIyLCAvKiAiICovCisgICAgQVNDSUlfcG91bmQgICAgICAgICAgICAgPSAweDIzLCAvKiAjICovCisgICAgQVNDSUlfZG9sbGFyICAgICAgICAgICAgPSAweDI0LCAvKiAkICovCisgICAgQVNDSUlfcGVyY2VudCAgICAgICAgICAgPSAweDI1LCAvKiAlICovCisgICAgQVNDSUlfYW1wZXJzYW5kICAgICAgICAgPSAweDI2LCAvKiAmICovCisgICAgQVNDSUlfYXBvc3Ryb3BoZSAgICAgICAgPSAweDI3LCAvKiAnICovCisgICAgQVNDSUlfbGVmdEJyYWNlICAgICAgICAgPSAweDI4LCAvKiAoICovCisgICAgQVNDSUlfcmlnaHRCcmFjZSAgICAgICAgPSAweDI5LCAvKiApICovCisgICAgQVNDSUlfdGltZXMgICAgICAgICAgICAgPSAweDJBLCAvKiAqICovCisgICAgQVNDSUlfcGx1cyAgICAgICAgICAgICAgPSAweDJCLCAvKiArICovCisgICAgQVNDSUlfY29tbWEgICAgICAgICAgICAgPSAweDJDLCAvKiAsICovCisgICAgQVNDSUlfbWludXMgICAgICAgICAgICAgPSAweDJELCAvKiAtICovCisgICAgQVNDSUlfcGVyaW9kICAgICAgICAgICAgPSAweDJFLCAvKiAuICovCisgICAgQVNDSUlfZGl2aWRlICAgICAgICAgICAgPSAweDJGLCAvKiAvICovCisgICAgQVNDSUlfMCAgICAgICAgICAgICAgICAgPSAweDMwLAorICAgIEFTQ0lJXzEgICAgICAgICAgICAgICAgID0gMHgzMSwKKyAgICBBU0NJSV8yICAgICAgICAgICAgICAgICA9IDB4MzIsCisgICAgQVNDSUlfMyAgICAgICAgICAgICAgICAgPSAweDMzLAorICAgIEFTQ0lJXzQgICAgICAgICAgICAgICAgID0gMHgzNCwKKyAgICBBU0NJSV81ICAgICAgICAgICAgICAgICA9IDB4MzUsCisgICAgQVNDSUlfNiAgICAgICAgICAgICAgICAgPSAweDM2LAorICAgIEFTQ0lJXzcgICAgICAgICAgICAgICAgID0gMHgzNywKKyAgICBBU0NJSV84ICAgICAgICAgICAgICAgICA9IDB4MzgsCisgICAgQVNDSUlfOSAgICAgICAgICAgICAgICAgPSAweDM5LAorICAgIEFTQ0lJX2NvbG9uICAgICAgICAgICAgID0gMHgzQSwgLyogOiAqLworICAgIEFTQ0lJX3NlbWljb2xvbiAgICAgICAgID0gMHgzQiwgLyogOyAqLworICAgIEFTQ0lJX2xlc3NUaGFuICAgICAgICAgID0gMHgzQywgLyogPCAqLworICAgIEFTQ0lJX2VxdWFscyAgICAgICAgICAgID0gMHgzRCwgLyogPSAqLworICAgIEFTQ0lJX2dyZWF0ZXJUaGFuICAgICAgID0gMHgzRSwgLyogPiAqLworICAgIEFTQ0lJX3F1ZXN0aW9uICAgICAgICAgID0gMHgzRiwgLyogPyAqLworICAgIEFTQ0lJX2F0ICAgICAgICAgICAgICAgID0gMHg0MCwgLyogQCAqLworICAgIEFTQ0lJX0EgICAgICAgICAgICAgICAgID0gMHg0MSwKKyAgICBBU0NJSV9CICAgICAgICAgICAgICAgICA9IDB4NDIsCisgICAgQVNDSUlfQyAgICAgICAgICAgICAgICAgPSAweDQzLAorICAgIEFTQ0lJX0QgICAgICAgICAgICAgICAgID0gMHg0NCwKKyAgICBBU0NJSV9FICAgICAgICAgICAgICAgICA9IDB4NDUsCisgICAgQVNDSUlfRiAgICAgICAgICAgICAgICAgPSAweDQ2LAorICAgIEFTQ0lJX0cgICAgICAgICAgICAgICAgID0gMHg0NywKKyAgICBBU0NJSV9IICAgICAgICAgICAgICAgICA9IDB4NDgsCisgICAgQVNDSUlfSSAgICAgICAgICAgICAgICAgPSAweDQ5LAorICAgIEFTQ0lJX0ogICAgICAgICAgICAgICAgID0gMHg0QSwKKyAgICBBU0NJSV9LICAgICAgICAgICAgICAgICA9IDB4NEIsCisgICAgQVNDSUlfTCAgICAgICAgICAgICAgICAgPSAweDRDLAorICAgIEFTQ0lJX00gICAgICAgICAgICAgICAgID0gMHg0RCwKKyAgICBBU0NJSV9OICAgICAgICAgICAgICAgICA9IDB4NEUsCisgICAgQVNDSUlfTyAgICAgICAgICAgICAgICAgPSAweDRGLAorICAgIEFTQ0lJX1AgICAgICAgICAgICAgICAgID0gMHg1MCwKKyAgICBBU0NJSV9RICAgICAgICAgICAgICAgICA9IDB4NTEsCisgICAgQVNDSUlfUiAgICAgICAgICAgICAgICAgPSAweDUyLAorICAgIEFTQ0lJX1MgICAgICAgICAgICAgICAgID0gMHg1MywKKyAgICBBU0NJSV9UICAgICAgICAgICAgICAgICA9IDB4NTQsCisgICAgQVNDSUlfVSAgICAgICAgICAgICAgICAgPSAweDU1LAorICAgIEFTQ0lJX1YgICAgICAgICAgICAgICAgID0gMHg1NiwKKyAgICBBU0NJSV9XICAgICAgICAgICAgICAgICA9IDB4NTcsCisgICAgQVNDSUlfWCAgICAgICAgICAgICAgICAgPSAweDU4LAorICAgIEFTQ0lJX1kgICAgICAgICAgICAgICAgID0gMHg1OSwKKyAgICBBU0NJSV9aICAgICAgICAgICAgICAgICA9IDB4NUEsCisgICAgQVNDSUlfbGVmdFNxdWFyZUJyYWNlICAgPSAweDVCLCAvKiBbICovCisgICAgQVNDSUlfYmFja1NsYXNoICAgICAgICAgPSAweDVDLCAvKiBcICovCisgICAgQVNDSUlfcmlnaHRTcXVhcmVCcmFjZSAgPSAweDVELCAvKiBdICovCisgICAgQVNDSUlfY2FyZXQgICAgICAgICAgICAgPSAweDVFLCAvKiBeICovCisgICAgQVNDSUlfdW5kZXJzY29yZSAgICAgICAgPSAweDVGLCAvKiBfICovCisgICAgQVNDSUlfbGVmdEFwb3N0cm9waGUgICAgPSAweDYwLCAvKiBgICovCisgICAgQVNDSUlfYSAgICAgICAgICAgICAgICAgPSAweDYxLAorICAgIEFTQ0lJX2IgICAgICAgICAgICAgICAgID0gMHg2MiwKKyAgICBBU0NJSV9jICAgICAgICAgICAgICAgICA9IDB4NjMsCisgICAgQVNDSUlfZCAgICAgICAgICAgICAgICAgPSAweDY0LAorICAgIEFTQ0lJX2UgICAgICAgICAgICAgICAgID0gMHg2NSwKKyAgICBBU0NJSV9mICAgICAgICAgICAgICAgICA9IDB4NjYsCisgICAgQVNDSUlfZyAgICAgICAgICAgICAgICAgPSAweDY3LAorICAgIEFTQ0lJX2ggICAgICAgICAgICAgICAgID0gMHg2OCwKKyAgICBBU0NJSV9pICAgICAgICAgICAgICAgICA9IDB4NjksCisgICAgQVNDSUlfaiAgICAgICAgICAgICAgICAgPSAweDZBLAorICAgIEFTQ0lJX2sgICAgICAgICAgICAgICAgID0gMHg2QiwKKyAgICBBU0NJSV9sICAgICAgICAgICAgICAgICA9IDB4NkMsCisgICAgQVNDSUlfbSAgICAgICAgICAgICAgICAgPSAweDZELAorICAgIEFTQ0lJX24gICAgICAgICAgICAgICAgID0gMHg2RSwKKyAgICBBU0NJSV9vICAgICAgICAgICAgICAgICA9IDB4NkYsCisgICAgQVNDSUlfcCAgICAgICAgICAgICAgICAgPSAweDcwLAorICAgIEFTQ0lJX3EgICAgICAgICAgICAgICAgID0gMHg3MSwKKyAgICBBU0NJSV9yICAgICAgICAgICAgICAgICA9IDB4NzIsCisgICAgQVNDSUlfcyAgICAgICAgICAgICAgICAgPSAweDczLAorICAgIEFTQ0lJX3QgICAgICAgICAgICAgICAgID0gMHg3NCwKKyAgICBBU0NJSV91ICAgICAgICAgICAgICAgICA9IDB4NzUsCisgICAgQVNDSUlfdiAgICAgICAgICAgICAgICAgPSAweDc2LAorICAgIEFTQ0lJX3cgICAgICAgICAgICAgICAgID0gMHg3NywKKyAgICBBU0NJSV94ICAgICAgICAgICAgICAgICA9IDB4NzgsCisgICAgQVNDSUlfeSAgICAgICAgICAgICAgICAgPSAweDc5LAorICAgIEFTQ0lJX3ogICAgICAgICAgICAgICAgID0gMHg3QSwKKyAgICBBU0NJSV9sZWZ0Q3VybHlCcmFjZSAgICA9IDB4N0IsIC8qIHsgKi8KKyAgICBBU0NJSV92ZXJ0aWNhbEJhciAgICAgICA9IDB4N0MsIC8qIHwgKi8KKyAgICBBU0NJSV9yaWdodEN1cmx5QnJhY2UgICA9IDB4N0QsIC8qIH0gKi8KKyAgICBBU0NJSV90aWxkZSAgICAgICAgICAgICA9IDB4N0UgIC8qIH4gKi8KKyAgICB9IEVWVF9hc2NpaUNvZGVzVHlwZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZWZpbmVzIHRoZSBzZXQgb2Ygc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUgZXZlbnQgbGlicmFyeSBmdW5jdGlvbnMKK2luIHRoZSBtZXNzYWdlIGZpZWxkLiBVc2UgdGhlIEVWVF9zY2FuQ29kZSBtYWNybyB0byBleHRyYWN0IHRoZSBjb2RlCitmcm9tIHRoZSBldmVudCBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCB3aWxsIGJlIHRoZQorc2FtZSBhY3Jvc3MgYWxsIGtleWJvYXJkcyAoYXNzdW1pbmcgdGhlIHBsYWNlbWVudCBvZiBrZXlzIG9uIGEgMTAxIGtleSBVUwora2V5Ym9hcmQpLCBidXQgdGhlIHRyYW5zbGF0ZWQgQVNDSUkgdmFsdWVzIG1heSBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uCit0aGUgY291bnRyeSBjb2RlIHBhZ2VzIGluIHVzZS4KKworTk9URTogICBTY2FuIGNvZGVzIGluIHRoZSBldmVudCBsaWJyYXJ5IGFyZSBub3QgcmVhbGx5IGhhcmR3YXJlIHNjYW4gY29kZXMsCisgICAgICAgIGJ1dCByYXRoZXIgdmlydHVhbCBzY2FuIGNvZGVzIGFzIGdlbmVyYXRlZCBieSBhIGxvdyBsZXZlbCBrZXlib2FyZAorICAgICAgICBpbnRlcmZhY2UgZHJpdmVyLiBBbGwgdmlydHVhbCBjb2RlcyBiZWdpbiB3aXRoIHNjYW4gY29kZSAweDYwIGFuZAorICAgICAgICByYW5nZSB1cCBmcm9tIHRoZXJlLgorCitIRUFERVI6CitldmVudC5oCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBLQl9wYWRFbnRlciAgICAgICAgICAgICA9IDB4NjAsIC8qIEtleXBhZCBrZXlzICovCisgICAgS0JfcGFkTWludXMgICAgICAgICAgICAgPSAweDRBLAorICAgIEtCX3BhZFBsdXMgICAgICAgICAgICAgID0gMHg0RSwKKyAgICBLQl9wYWRUaW1lcyAgICAgICAgICAgICA9IDB4MzcsCisgICAgS0JfcGFkRGl2aWRlICAgICAgICAgICAgPSAweDYxLAorICAgIEtCX3BhZExlZnQgICAgICAgICAgICAgID0gMHg2MiwKKyAgICBLQl9wYWRSaWdodCAgICAgICAgICAgICA9IDB4NjMsCisgICAgS0JfcGFkVXAgICAgICAgICAgICAgICAgPSAweDY0LAorICAgIEtCX3BhZERvd24gICAgICAgICAgICAgID0gMHg2NSwKKyAgICBLQl9wYWRJbnNlcnQgICAgICAgICAgICA9IDB4NjYsCisgICAgS0JfcGFkRGVsZXRlICAgICAgICAgICAgPSAweDY3LAorICAgIEtCX3BhZEhvbWUgICAgICAgICAgICAgID0gMHg2OCwKKyAgICBLQl9wYWRFbmQgICAgICAgICAgICAgICA9IDB4NjksCisgICAgS0JfcGFkUGFnZVVwICAgICAgICAgICAgPSAweDZBLAorICAgIEtCX3BhZFBhZ2VEb3duICAgICAgICAgID0gMHg2QiwKKyAgICBLQl9wYWRDZW50ZXIgICAgICAgICAgICA9IDB4NEMsCisgICAgS0JfRjEgICAgICAgICAgICAgICAgICAgPSAweDNCLCAvKiBGdW5jdGlvbiBrZXlzICovCisgICAgS0JfRjIgICAgICAgICAgICAgICAgICAgPSAweDNDLAorICAgIEtCX0YzICAgICAgICAgICAgICAgICAgID0gMHgzRCwKKyAgICBLQl9GNCAgICAgICAgICAgICAgICAgICA9IDB4M0UsCisgICAgS0JfRjUgICAgICAgICAgICAgICAgICAgPSAweDNGLAorICAgIEtCX0Y2ICAgICAgICAgICAgICAgICAgID0gMHg0MCwKKyAgICBLQl9GNyAgICAgICAgICAgICAgICAgICA9IDB4NDEsCisgICAgS0JfRjggICAgICAgICAgICAgICAgICAgPSAweDQyLAorICAgIEtCX0Y5ICAgICAgICAgICAgICAgICAgID0gMHg0MywKKyAgICBLQl9GMTAgICAgICAgICAgICAgICAgICA9IDB4NDQsCisgICAgS0JfRjExICAgICAgICAgICAgICAgICAgPSAweDU3LAorICAgIEtCX0YxMiAgICAgICAgICAgICAgICAgID0gMHg1OCwKKyAgICBLQl9sZWZ0ICAgICAgICAgICAgICAgICA9IDB4NEIsIC8qIEN1cnNvciBjb250cm9sIGtleXMgKi8KKyAgICBLQl9yaWdodCAgICAgICAgICAgICAgICA9IDB4NEQsCisgICAgS0JfdXAgICAgICAgICAgICAgICAgICAgPSAweDQ4LAorICAgIEtCX2Rvd24gICAgICAgICAgICAgICAgID0gMHg1MCwKKyAgICBLQl9pbnNlcnQgICAgICAgICAgICAgICA9IDB4NTIsCisgICAgS0JfZGVsZXRlICAgICAgICAgICAgICAgPSAweDUzLAorICAgIEtCX2hvbWUgICAgICAgICAgICAgICAgID0gMHg0NywKKyAgICBLQl9lbmQgICAgICAgICAgICAgICAgICA9IDB4NEYsCisgICAgS0JfcGFnZVVwICAgICAgICAgICAgICAgPSAweDQ5LAorICAgIEtCX3BhZ2VEb3duICAgICAgICAgICAgID0gMHg1MSwKKyAgICBLQl9jYXBzTG9jayAgICAgICAgICAgICA9IDB4M0EsCisgICAgS0JfbnVtTG9jayAgICAgICAgICAgICAgPSAweDQ1LAorICAgIEtCX3Njcm9sbExvY2sgICAgICAgICAgID0gMHg0NiwKKyAgICBLQl9sZWZ0U2hpZnQgICAgICAgICAgICA9IDB4MkEsCisgICAgS0JfcmlnaHRTaGlmdCAgICAgICAgICAgPSAweDM2LAorICAgIEtCX2xlZnRDdHJsICAgICAgICAgICAgID0gMHgxRCwKKyAgICBLQl9yaWdodEN0cmwgICAgICAgICAgICA9IDB4NkMsCisgICAgS0JfbGVmdEFsdCAgICAgICAgICAgICAgPSAweDM4LAorICAgIEtCX3JpZ2h0QWx0ICAgICAgICAgICAgID0gMHg2RCwKKyAgICBLQl9sZWZ0V2luZG93cyAgICAgICAgICA9IDB4NUIsCisgICAgS0JfcmlnaHRXaW5kb3dzICAgICAgICAgPSAweDVDLAorICAgIEtCX21lbnUgICAgICAgICAgICAgICAgID0gMHg1RCwKKyAgICBLQl9zeXNSZXEgICAgICAgICAgICAgICA9IDB4NTQsCisgICAgS0JfZXNjICAgICAgICAgICAgICAgICAgPSAweDAxLCAvKiBOb3JtYWwga2V5Ym9hcmQga2V5cyAqLworICAgIEtCXzEgICAgICAgICAgICAgICAgICAgID0gMHgwMiwKKyAgICBLQl8yICAgICAgICAgICAgICAgICAgICA9IDB4MDMsCisgICAgS0JfMyAgICAgICAgICAgICAgICAgICAgPSAweDA0LAorICAgIEtCXzQgICAgICAgICAgICAgICAgICAgID0gMHgwNSwKKyAgICBLQl81ICAgICAgICAgICAgICAgICAgICA9IDB4MDYsCisgICAgS0JfNiAgICAgICAgICAgICAgICAgICAgPSAweDA3LAorICAgIEtCXzcgICAgICAgICAgICAgICAgICAgID0gMHgwOCwKKyAgICBLQl84ICAgICAgICAgICAgICAgICAgICA9IDB4MDksCisgICAgS0JfOSAgICAgICAgICAgICAgICAgICAgPSAweDBBLAorICAgIEtCXzAgICAgICAgICAgICAgICAgICAgID0gMHgwQiwKKyAgICBLQl9taW51cyAgICAgICAgICAgICAgICA9IDB4MEMsCisgICAgS0JfZXF1YWxzICAgICAgICAgICAgICAgPSAweDBELAorICAgIEtCX2JhY2tTbGFzaCAgICAgICAgICAgID0gMHgyQiwKKyAgICBLQl9iYWNrc3BhY2UgICAgICAgICAgICA9IDB4MEUsCisgICAgS0JfdGFiICAgICAgICAgICAgICAgICAgPSAweDBGLAorICAgIEtCX1EgICAgICAgICAgICAgICAgICAgID0gMHgxMCwKKyAgICBLQl9XICAgICAgICAgICAgICAgICAgICA9IDB4MTEsCisgICAgS0JfRSAgICAgICAgICAgICAgICAgICAgPSAweDEyLAorICAgIEtCX1IgICAgICAgICAgICAgICAgICAgID0gMHgxMywKKyAgICBLQl9UICAgICAgICAgICAgICAgICAgICA9IDB4MTQsCisgICAgS0JfWSAgICAgICAgICAgICAgICAgICAgPSAweDE1LAorICAgIEtCX1UgICAgICAgICAgICAgICAgICAgID0gMHgxNiwKKyAgICBLQl9JICAgICAgICAgICAgICAgICAgICA9IDB4MTcsCisgICAgS0JfTyAgICAgICAgICAgICAgICAgICAgPSAweDE4LAorICAgIEtCX1AgICAgICAgICAgICAgICAgICAgID0gMHgxOSwKKyAgICBLQl9sZWZ0U3F1YXJlQnJhY2UgICAgICA9IDB4MUEsCisgICAgS0JfcmlnaHRTcXVhcmVCcmFjZSAgICAgPSAweDFCLAorICAgIEtCX2VudGVyICAgICAgICAgICAgICAgID0gMHgxQywKKyAgICBLQl9BICAgICAgICAgICAgICAgICAgICA9IDB4MUUsCisgICAgS0JfUyAgICAgICAgICAgICAgICAgICAgPSAweDFGLAorICAgIEtCX0QgICAgICAgICAgICAgICAgICAgID0gMHgyMCwKKyAgICBLQl9GICAgICAgICAgICAgICAgICAgICA9IDB4MjEsCisgICAgS0JfRyAgICAgICAgICAgICAgICAgICAgPSAweDIyLAorICAgIEtCX0ggICAgICAgICAgICAgICAgICAgID0gMHgyMywKKyAgICBLQl9KICAgICAgICAgICAgICAgICAgICA9IDB4MjQsCisgICAgS0JfSyAgICAgICAgICAgICAgICAgICAgPSAweDI1LAorICAgIEtCX0wgICAgICAgICAgICAgICAgICAgID0gMHgyNiwKKyAgICBLQl9zZW1pY29sb24gICAgICAgICAgICA9IDB4MjcsCisgICAgS0JfYXBvc3Ryb3BoZSAgICAgICAgICAgPSAweDI4LAorICAgIEtCX1ogICAgICAgICAgICAgICAgICAgID0gMHgyQywKKyAgICBLQl9YICAgICAgICAgICAgICAgICAgICA9IDB4MkQsCisgICAgS0JfQyAgICAgICAgICAgICAgICAgICAgPSAweDJFLAorICAgIEtCX1YgICAgICAgICAgICAgICAgICAgID0gMHgyRiwKKyAgICBLQl9CICAgICAgICAgICAgICAgICAgICA9IDB4MzAsCisgICAgS0JfTiAgICAgICAgICAgICAgICAgICAgPSAweDMxLAorICAgIEtCX00gICAgICAgICAgICAgICAgICAgID0gMHgzMiwKKyAgICBLQl9jb21tYSAgICAgICAgICAgICAgICA9IDB4MzMsCisgICAgS0JfcGVyaW9kICAgICAgICAgICAgICAgPSAweDM0LAorICAgIEtCX2RpdmlkZSAgICAgICAgICAgICAgID0gMHgzNSwKKyAgICBLQl9zcGFjZSAgICAgICAgICAgICAgICA9IDB4MzksCisgICAgS0JfdGlsZGUgICAgICAgICAgICAgICAgPSAweDI5CisgICAgfSBFVlRfc2NhbkNvZGVzVHlwZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZWZpbmVzIHRoZSBtYXNrIGZvciB0aGUgam95c3RpY2sgYXhlcyB0aGF0IGFyZSBwcmVzZW50CisKK0hFQURFUjoKK2V2ZW50LmgKKworTUVNQkVSUzoKK0VWVF9KT1lfQVhJU19YMSAgICAgLSBKb3lzdGljayAxLCBYIGF4aXMgaXMgcHJlc2VudAorRVZUX0pPWV9BWElTX1kxICAgICAtIEpveXN0aWNrIDEsIFkgYXhpcyBpcyBwcmVzZW50CitFVlRfSk9ZX0FYSVNfWDIgICAgIC0gSm95c3RpY2sgMiwgWCBheGlzIGlzIHByZXNlbnQKK0VWVF9KT1lfQVhJU19ZMiAgICAgLSBKb3lzdGljayAyLCBZIGF4aXMgaXMgcHJlc2VudAorRVZUX0pPWV9BWElTX0FMTCAgICAtIE1hc2sgZm9yIGFsbCBheGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFVlRfSk9ZX0FYSVNfWDEgICAgID0gMHgwMDAwMDAwMSwKKyAgICBFVlRfSk9ZX0FYSVNfWTEgICAgID0gMHgwMDAwMDAwMiwKKyAgICBFVlRfSk9ZX0FYSVNfWDIgICAgID0gMHgwMDAwMDAwNCwKKyAgICBFVlRfSk9ZX0FYSVNfWTIgICAgID0gMHgwMDAwMDAwOCwKKyAgICBFVlRfSk9ZX0FYSVNfQUxMICAgID0gMHgwMDAwMDAwRgorICAgIH0gRVZUX2V2ZW50Sm95QXhpc1R5cGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lcyB0aGUgZXZlbnQgbWVzc2FnZSBtYXNrcyBmb3Igam95c3RpY2sgZXZlbnRzCisKK0hFQURFUjoKK2V2ZW50LmgKKworTUVNQkVSUzoKK0VWVF9KT1kxX0JVVFRPTkEgICAgLSBKb3lzdGljayAxLCBidXR0b24gQSBpcyBkb3duCitFVlRfSk9ZMV9CVVRUT05CICAgIC0gSm95c3RpY2sgMSwgYnV0dG9uIEIgaXMgZG93bgorRVZUX0pPWTJfQlVUVE9OQSAgICAtIEpveXN0aWNrIDIsIGJ1dHRvbiBBIGlzIGRvd24KK0VWVF9KT1kyX0JVVFRPTkIgICAgLSBKb3lzdGljayAyLCBidXR0b24gQiBpcyBkb3duCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFVlRfSk9ZMV9CVVRUT05BICAgID0gMHgwMDAwMDAwMSwKKyAgICBFVlRfSk9ZMV9CVVRUT05CICAgID0gMHgwMDAwMDAwMiwKKyAgICBFVlRfSk9ZMl9CVVRUT05BICAgID0gMHgwMDAwMDAwNCwKKyAgICBFVlRfSk9ZMl9CVVRUT05CICAgID0gMHgwMDAwMDAwOAorICAgIH0gRVZUX2V2ZW50Sm95TWFza1R5cGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lcyB0aGUgZXZlbnQgbWVzc2FnZSBtYXNrcyBmb3IgbW91c2UgZXZlbnRzCisKK0hFQURFUjoKK2V2ZW50LmgKKworTUVNQkVSUzoKK0VWVF9MRUZUQk1BU0sgICAtIExlZnQgYnV0dG9uIGlzIGhlbGQgZG93bgorRVZUX1JJR0hUQk1BU0sgIC0gUmlnaHQgYnV0dG9uIGlzIGhlbGQgZG93bgorRVZUX01JRERMRUJNQVNLIC0gTWlkZGxlIGJ1dHRvbiBpcyBoZWxkIGRvd24KK0VWVF9CT1RIQk1BU0sgICAtIEJvdGggbGVmdCBhbmQgcmlnaHQgaGVsZCBkb3duIHRvZ2V0aGVyCitFVlRfQUxMQk1BU0sgICAgLSBBbGwgYnV0dG9ucyBwcmVzc2VkCitFVlRfREJMQ0xJQ0sgICAgLSBTZXQgaWYgbW91c2UgZG93biBldmVudCB3YXMgYSBkb3VibGUgY2xpY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIEVWVF9MRUZUQk1BU0sgICA9IDB4MDAwMDAwMDEsCisgICAgRVZUX1JJR0hUQk1BU0sgID0gMHgwMDAwMDAwMiwKKyAgICBFVlRfTUlERExFQk1BU0sgPSAweDAwMDAwMDA0LAorICAgIEVWVF9CT1RIQk1BU0sgICA9IDB4MDAwMDAwMDcsCisgICAgRVZUX0FMTEJNQVNLICAgID0gMHgwMDAwMDAwNywKKyAgICBFVlRfREJMQ0xJQ0sgICAgPSAweDAwMDEwMDAwCisgICAgfSBFVlRfZXZlbnRNb3VzZU1hc2tUeXBlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZXMgdGhlIGV2ZW50IG1vZGlmaWVyIG1hc2tzLiBUaGVzZSBhcmUgdGhlIG1hc2tzIHVzZWQgdG8gZXh0cmFjdAordGhlIG1vZGlmaWVyIGluZm9ybWF0aW9uIGZyb20gdGhlIG1vZGlmaWVycyBmaWVsZCBvZiB0aGUgZXZlbnRfdCBzdHJ1Y3R1cmUuCitOb3RlIHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgbW9kaWZpZXJzIGZpZWxkIHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIHRoZXNlCittb2RpZmllciBrZXlzIGF0IHRoZSB0aW1lIHRoZSBldmVudCBvY2N1cnJlZCwgbm90IHRoZSB0aW1lIHlvdSBkZWNpZGVkCit0byBwcm9jZXNzIHRoZSBldmVudC4KKworSEVBREVSOgorZXZlbnQuaAorCitNRU1CRVJTOgorRVZUX0xFRlRCVVQgICAgIC0gU2V0IGlmIGxlZnQgbW91c2UgYnV0dG9uIHdhcyBkb3duCitFVlRfUklHSFRCVVQgICAgLSBTZXQgaWYgcmlnaHQgbW91c2UgYnV0dG9uIHdhcyBkb3duCitFVlRfTUlERExFQlVUICAgLSBTZXQgaWYgdGhlIG1pZGRsZSBidXR0b24gd2FzIGRvd24KK0VWVF9SSUdIVFNISUZUICAtIFNldCBpZiByaWdodCBzaGlmdCB3YXMgZG93bgorRVZUX0xFRlRTSElGVCAgIC0gU2V0IGlmIGxlZnQgc2hpZnQgd2FzIGRvd24KK0VWVF9SSUdIVENUUkwgICAtIFNldCBpZiByaWdodCBjdHJsIGtleSB3YXMgZG93bgorRVZUX1JJR0hUQUxUICAgIC0gU2V0IGlmIHJpZ2h0IGFsdCBrZXkgd2FzIGRvd24KK0VWVF9MRUZUQ1RSTCAgICAtIFNldCBpZiBsZWZ0IGN0cmwga2V5IHdhcyBkb3duCitFVlRfTEVGVEFMVCAgICAgLSBTZXQgaWYgbGVmdCBhbHQga2V5IHdhcyBkb3duCitFVlRfU0hJRlRLRVkgICAgLSBNYXNrIGZvciBhbnkgc2hpZnQga2V5IGRvd24KK0VWVF9DVFJMU1RBVEUgICAtIFNldCBpZiBjdHJsIGtleSB3YXMgZG93bgorRVZUX0FMVFNUQVRFICAgIC0gU2V0IGlmIGFsdCBrZXkgd2FzIGRvd24KK0VWVF9DQVBTTE9DSyAgICAtIENhcHMgbG9jayBpcyBhY3RpdmUKK0VWVF9OVU1MT0NLICAgICAtIE51bSBsb2NrIGlzIGFjdGl2ZQorRVZUX1NDUk9MTExPQ0sgIC0gU2Nyb2xsIGxvY2sgaXMgYWN0aXZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFVlRfTEVGVEJVVCAgICAgPSAweDAwMDAwMDAxLAorICAgIEVWVF9SSUdIVEJVVCAgICA9IDB4MDAwMDAwMDIsCisgICAgRVZUX01JRERMRUJVVCAgID0gMHgwMDAwMDAwNCwKKyAgICBFVlRfUklHSFRTSElGVCAgPSAweDAwMDAwMDA4LAorICAgIEVWVF9MRUZUU0hJRlQgICA9IDB4MDAwMDAwMTAsCisgICAgRVZUX1JJR0hUQ1RSTCAgID0gMHgwMDAwMDAyMCwKKyAgICBFVlRfUklHSFRBTFQgICAgPSAweDAwMDAwMDQwLAorICAgIEVWVF9MRUZUQ1RSTCAgICA9IDB4MDAwMDAwODAsCisgICAgRVZUX0xFRlRBTFQgICAgID0gMHgwMDAwMDEwMCwKKyAgICBFVlRfU0hJRlRLRVkgICAgPSAweDAwMDAwMDE4LAorICAgIEVWVF9DVFJMU1RBVEUgICA9IDB4MDAwMDAwQTAsCisgICAgRVZUX0FMVFNUQVRFICAgID0gMHgwMDAwMDE0MCwKKyAgICBFVlRfU0NST0xMTE9DSyAgPSAweDAwMDAwMjAwLAorICAgIEVWVF9OVU1MT0NLICAgICA9IDB4MDAwMDA0MDAsCisgICAgRVZUX0NBUFNMT0NLICAgID0gMHgwMDAwMDgwMAorICAgIH0gRVZUX2V2ZW50TW9kTWFza1R5cGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lcyB0aGUgZXZlbnQgY29kZXMgcmV0dXJuZWQgaW4gdGhlIGV2ZW50X3Qgc3RydWN0dXJlcyB3aGF0IGZpZWxkLiBOb3RlCit0aGF0IHRoZXNlIGFyZSBkZWZpbmVkIGFzIGEgc2V0IG9mIG11dHVhbGx5IGV4bHVzaXZlIGJpdCBmaWVsZHMsIHNvIHlvdQorY2FuIHRlc3QgZm9yIG11bHRpcGxlIGV2ZW50IHR5cGVzIHVzaW5nIHRoZSBjb21iaW5lZCBldmVudCBtYXNrcyBkZWZpbmVkCitpbiB0aGUgRVZUX2V2ZW50TWFza1R5cGUgZW51bWVyYXRpb24uCisKK0hFQURFUjoKK2V2ZW50LmgKKworTUVNQkVSUzoKK0VWVF9OVUxMRVZUICAgICAtIEEgbnVsbCBldmVudAorRVZUX0tFWURPV04gICAgIC0gS2V5IGRvd24gZXZlbnQKK0VWVF9LRVlSRVBFQVQgICAtIEtleSByZXBlYXQgZXZlbnQKK0VWVF9LRVlVUCAgICAgICAtIEtleSB1cCBldmVudAorRVZUX01PVVNFRE9XTiAgIC0gTW91c2UgZG93biBldmVudAorRVZUX01PVVNFQVVUTyAgIC0gTW91c2UgZG93biBhdXRvcmVwZWF0IGV2ZW50CitFVlRfTU9VU0VVUCAgICAgLSBNb3VzZSB1cCBldmVudAorRVZUX01PVVNFTU9WRSAgIC0gTW91c2UgbW92ZW1lbnQgZXZlbnQKK0VWVF9KT1lDTElDSyAgICAtIEpveXN0aWNrIGJ1dHRvbiBzdGF0ZSBjaGFuZ2UgZXZlbnQKK0VWVF9KT1lNT1ZFICAgICAtIEpveXN0aWNrIG1vdmVtZW50IGV2ZW50CitFVlRfVVNFUkVWVCAgICAgLSBGaXJzdCB1c2VyIGV2ZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFVlRfTlVMTEVWVCAgICAgPSAweDAwMDAwMDAwLAorICAgIEVWVF9LRVlET1dOICAgICA9IDB4MDAwMDAwMDEsCisgICAgRVZUX0tFWVJFUEVBVCAgID0gMHgwMDAwMDAwMiwKKyAgICBFVlRfS0VZVVAgICAgICAgPSAweDAwMDAwMDA0LAorICAgIEVWVF9NT1VTRURPV04gICA9IDB4MDAwMDAwMDgsCisgICAgRVZUX01PVVNFQVVUTyAgID0gMHgwMDAwMDAxMCwKKyAgICBFVlRfTU9VU0VVUCAgICAgPSAweDAwMDAwMDIwLAorICAgIEVWVF9NT1VTRU1PVkUgICA9IDB4MDAwMDAwNDAsCisgICAgRVZUX0pPWUNMSUNLICAgID0gMHgwMDAwMDA4MCwKKyAgICBFVlRfSk9ZTU9WRSAgICAgPSAweDAwMDAwMTAwLAorICAgIEVWVF9VU0VSRVZUICAgICA9IDB4MDAwMDAyMDAKKyAgICB9IEVWVF9ldmVudFR5cGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lcyB0aGUgZXZlbnQgY29kZSBtYXNrcyB5b3UgY2FuIHVzZSB0byB0ZXN0IGZvciBtdWx0aXBsZSB0eXBlcyBvZgorZXZlbnRzLCBzaW5jZSB0aGUgZXZlbnQgY29kZXMgYXJlIG11dHVhbGx5IGV4bHVzaXZlIGJpdCBmaWVsZHMuCisKK0hFQURFUjoKK2V2ZW50LmgKKworTUVNQkVSUzoKK0VWVF9LRVlFVlQgICAgICAtIE1hc2sgZm9yIGFueSBrZXkgZXZlbnQKK0VWVF9NT1VTRUVWVCAgICAtIE1hc2sgZm9yIGFueSBtb3VzZSBldmVudAorRVZUX01PVVNFQ0xJQ0sgIC0gTWFzayBmb3IgYW55IG1vdXNlIGNsaWNrIGV2ZW50CitFVlRfSk9ZRVZUICAgICAgLSBNYXNrIGZvciBhbnkgam95c3RpY2sgZXZlbnQKK0VWVF9FVkVSWUVWVCAgICAtIE1hc2sgZm9yIGFueSBldmVudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgRVZUX0tFWUVWVCAgICAgID0gKEVWVF9LRVlET1dOIHwgRVZUX0tFWVJFUEVBVCB8IEVWVF9LRVlVUCksCisgICAgRVZUX01PVVNFRVZUICAgID0gKEVWVF9NT1VTRURPV04gfCBFVlRfTU9VU0VBVVRPIHwgRVZUX01PVVNFVVAgfCBFVlRfTU9VU0VNT1ZFKSwKKyAgICBFVlRfTU9VU0VDTElDSyAgPSAoRVZUX01PVVNFRE9XTiB8IEVWVF9NT1VTRVVQKSwKKyAgICBFVlRfSk9ZRVZUICAgICAgPSAoRVZUX0pPWUNMSUNLIHwgRVZUX0pPWU1PVkUpLAorICAgIEVWVF9FVkVSWUVWVCAgICA9IDB4N0ZGRkZGRkYKKyAgICB9IEVWVF9ldmVudE1hc2tUeXBlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gYW4gZXZlbnQgZXh0cmFjdGVkIGZyb20KK3RoZSBldmVudCBxdWV1ZS4KKworSEVBREVSOgorZXZlbnQuaAorCitNRU1CRVJTOgord2hpY2ggICAgICAgLSBXaW5kb3cgaWRlbnRpZmllciBmb3IgbWVzc2FnZSBmb3IgdXNlIGJ5IGhpZ2ggbGV2ZWwgd2luZG93IG1hbmFnZXIKKyAgICAgICAgICAgICAgY29kZSAoaS5lLiBNZWdhVmlzaW9uIEdVSSBvciBXaW5kb3dzIEFQSSkuCit3aGF0ICAgICAgICAtIFR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC4gV2lsbCBiZSBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGJ5CisgICAgICAgICAgICAgIHRoZSBFVlRfZXZlbnRUeXBlIGVudW1lcmF0aW9uLgord2hlbiAgICAgICAgLSBUaW1lIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBzdGFydHVwCit3aGVyZV94ICAgICAtIFggY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudAorICAgICAgICAgICAgICAoaW4gc2NyZWVuIGNvb3JkaW5hdGVzKS4gRm9yIGpveXN0aWNrIGV2ZW50cyB0aGlzIHJlcHJlc2VudHMKKyAgICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBqb3lzdGljayBYIGF4aXMuCit3aGVyZV95ICAgICAtIFkgY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudAorICAgICAgICAgICAgICAoaW4gc2NyZWVuIGNvb3JkaW5hdGVzKS4gRm9yIGpveXN0aWNrIGV2ZW50cyB0aGlzIHJlcHJlc2VudHMKKyAgICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBqb3lzdGljayBZIGF4aXMuCityZWxhdGl2ZV94ICAtIFJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBtb3VzZSBjdXJzb3IgaW4gdGhlIFggZGlyZWN0aW9uIChpbgorICAgICAgICAgICAgICB1bml0cyBvZiBtaWNrZXlzLCBvciAxLzIwMHRoIG9mIGFuIGluY2gpLiBGb3Igam95c3RpY2sgZXZlbnRzCisgICAgICAgICAgICAgIHRoaXMgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBqb3lzdGljayBYIGF4aXMuCityZWxhdGl2ZV95ICAtIFJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBtb3VzZSBjdXJzb3IgaW4gdGhlIFkgZGlyZWN0aW9uIChpbgorICAgICAgICAgICAgICB1bml0cyBvZiBtaWNrZXlzLCBvciAxLzIwMHRoIG9mIGFuIGluY2gpLiBGb3Igam95c3RpY2sgZXZlbnRzCisgICAgICAgICAgICAgIHRoaXMgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBqb3lzdGljayBZIGF4aXMuCittZXNzYWdlICAgICAtIEV2ZW50IHNwZWNpZmljIG1lc3NhZ2UgZm9yIHRoZSBldmVudC4gRm9yIHVzZSBldmVudHMgdGhpcyBjYW4gYmUKKyAgICAgICAgICAgICAgYW55IHVzZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24uIEZvciBrZXlib2FyZCBldmVudHMgdGhpcyBjb250YWlucworICAgICAgICAgICAgICB0aGUgQVNDSUkgY29kZSBpbiBiaXRzIDAtNywgdGhlIGtleWJvYXJkIHNjYW4gY29kZSBpbiBiaXRzIDgtMTUgYW5kCisgICAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgcmVwZWF0IGNvdW50IGluIGJpdHMgMTYtMzAuIFlvdSBjYW4gdXNlIHRoZQorICAgICAgICAgICAgICBFVlRfYXNjaWlDb2RlLCBFVlRfc2NhbkNvZGUgYW5kIEVWVF9yZXBlYXRDb3VudCBtYWNyb3MgdG8gZXh0cmFjdAorICAgICAgICAgICAgICB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQuIEZvciBtb3VzZSBldmVudHMgdGhpcworICAgICAgICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBidXR0b24gd2FzIHByZXNzZWQsIGFuZCB3aWxsIGJlIGEKKyAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudE1vdXNlTWFza1R5cGUKKyAgICAgICAgICAgICAgZW51bWVyYXRpb24uIEZvciBqb3lzdGljayBldmVudHMsIHRoaXMgY29uYXRpbnMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgYWJvdXQgd2hpY2ggYnV0dG9ucyB3ZXJlIHByZXNzZWQsIGFuZCB3aWxsIGJlIGEgY29tYmluYXRpb24gb2YKKyAgICAgICAgICAgICAgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudEpveU1hc2tUeXBlIGVudW1lcmF0aW9uLgorbW9kaWZpZXJzICAgLSBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQKKyAgICAgICAgICAgICAgc2hpZnQgbW9kaWZpZXJzIChDdHJsLCBBbHQgYW5kIFNoaWZ0IGtleXMpIHdoZW4gdGhlIGV2ZW50CisgICAgICAgICAgICAgIG9jY3VycmVkLiBGb3IgbW91c2UgZXZlbnRzIGl0IHdpbGwgYWxzbyBjb250YWluIHRoZSBzdGF0ZSBvZgorICAgICAgICAgICAgICB0aGUgbW91c2UgYnV0dG9ucy4gV2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZAorICAgICAgICAgICAgICBieSB0aGUgRVZUX2V2ZW50TW9kTWFza1R5cGUgZW51bWVyYXRpb24uCituZXh0ICAgICAgICAtIEludGVybmFsIHVzZTsgZG8gbm90IHVzZS4KK3ByZXYgICAgICAgIC0gSW50ZXJuYWwgdXNlOyBkbyBub3QgdXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgICAgICB3aGljaDsKKyAgICB1bG9uZyAgICAgICB3aGF0OworICAgIHVsb25nICAgICAgIHdoZW47CisgICAgaW50ICAgICAgICAgd2hlcmVfeDsKKyAgICBpbnQgICAgICAgICB3aGVyZV95OworICAgIGludCAgICAgICAgIHJlbGF0aXZlX3g7CisgICAgaW50ICAgICAgICAgcmVsYXRpdmVfeTsKKyAgICB1bG9uZyAgICAgICBtZXNzYWdlOworICAgIHVsb25nICAgICAgIG1vZGlmaWVyczsKKyAgICBpbnQgICAgICAgICBuZXh0OworICAgIGludCAgICAgICAgIHByZXY7CisgICAgfSBldmVudF90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSBjb2RlIHBhZ2UgdGFibGUuIEEgdGFibGUgb2YgdHJhbnNsYXRpb24KK2NvZGVzIGZvciBzY2FuIGNvZGVzIHRvIEFTQ0lJIGNvZGVzIGlzIHByb3ZpZGVkIGluIHRoaXMgdGFibGUgdG8gYmUgdXNlZAorYnkgdGhlIGtleWJvYXJkIGV2ZW50IGxpYnJhcmllcy4gT24gc29tZSBPUydlcyB0aGUga2V5Ym9hcmQgdHJhbnNsYXRpb24gaXMKK2hhbmRsZWQgYnkgdGhlIE9TLCBidXQgZm9yIERPUyBhbmQgZW1iZWRkZWQgc3lzdGVtcyB5b3UgbXVzdCByZWdpc3RlciBhCitkaWZmZXJlbnQgY29kZSBwYWdlIHRyYW5zbGF0aW9uIHRhYmxlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQga2V5Ym9hcmRzCitvdGhlciB0aGFuIHRoZSBVUyBFbmdsaXNoIGtleWJvYXJkICh0aGUgZGVmYXVsdCkuCisKK05PVEU6ICAgRW50cmllcyBpbiBjb2RlIHBhZ2UgdGFibGVzICptdXN0KiBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yIHRoZQorICAgICAgICBzY2FuIGNvZGVzIGFzIHdlIGRvIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgdGFibGVzIGZvciB0aGUgQVNDSUkKKyAgICAgICAgY29kZSBlcXVpdmFsZW50cy4KKworSEVBREVSOgorZXZlbnQuaAorCitNRU1CRVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdHJhbnNsYXRlIChyZWFsbHkgdGhlIHZpcnR1YWwgc2NhbiBjb2RlKS4KK2FzY2lpQ29kZSAgIC0gQVNDSUkgY29kZSBmb3IgdGhpcyBzY2FuIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVjaGFyICAgICAgIHNjYW5Db2RlOworICAgIHVjaGFyICAgICAgIGFzY2lpQ29kZTsKKyAgICB9IGNvZGVwYWdlX2VudHJ5X3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUuIFRoZSB0YWJsZQorY29udGFpbnMgdHJhbnNsYXRpb24gdGFibGVzIGZvciBub3JtYWwga2V5cywgc2hpZnRlZCBrZXlzIGFuZCBjdHJsIGtleXMuCitUaGUgQ3RybCBrZXkgYWx3YXlzIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIHNoaWZ0IHRhYmxlLCBhbmQgdGhlIHNoaWZ0Cit0YWJsZSBpcyB1c2VkIHdoZW4gdGhlIHNoaWZ0IGtleSBpcyBkb3duIG9yIHRoZSBDQVBTTE9DSyBrZXkgaXMgZG93bi4KKworSEVBREVSOgorZXZlbnQuaAorCitNRU1CRVJTOgorbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY29kZSBwYWdlIHRhYmxlIChpZTogIlVTIEVuZ2xpc2giKQorbm9ybWFsICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBub3JtYWwga2V5cworbm9ybWFsTGVuICAgICAgIC0gTGVuZ3RoIG9mIG5vcm1hbCB0cmFuc2xhdGlvbiB0YWJsZQorY2FwcyAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBrZXlzIHdoZW4gQ0FQU0xPQ0sgaXMgZG93bgorY2Fwc0xlbiAgICAgICAgIC0gTGVuZ3RoIG9mIENBUFNMT0NLIHRyYW5zbGF0aW9uIHRhYmxlCitzaGlmdCAgICAgICAgICAgLSBDb2RlIHBhZ2UgZm9yIHNoaWZ0ZWQga2V5cyAoaWU6IHNoaWZ0IGtleSBpcyBoZWxkIGRvd24pCitzaGlmdExlbiAgICAgICAgLSBMZW5ndGggb2Ygc2hpZnRlZCB0cmFuc2xhdGlvbiB0YWJsZQorc2hpZnRDYXBzICAgICAgIC0gQ29kZSBwYWdlIGZvciBzaGlmdGVkIGtleXMgd2hlbiBDQVBTTE9DSyBpcyBkb3duCitzaGlmdENhcHNMZW4gICAgLSBMZW5ndGggb2Ygc2hpZnRlZCBDQVBTTE9DSyB0cmFuc2xhdGlvbiB0YWJsZQorY3RybCAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBjdHJsJ2VkIGtleXMgKGllOiBjdHJsIGtleSBpcyBoZWxkIGRvd24pCitjdHJsTGVuICAgICAgICAgLSBMZW5ndGggb2YgY3RybCdlZCB0cmFuc2xhdGlvbiB0YWJsZQorbnVtUGFkICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBOVU1MT0NLJ2VkIGtleXBhZCBrZXlzCitudW1QYWRMZW4gICAgICAgLSBMZW5ndGggb2YgTlVNTE9DSydlZCB0cmFuc2xhdGlvbiB0YWJsZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICAgICAgICAgICAgIG5hbWVbMjBdOworICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKm5vcm1hbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5vcm1hbExlbjsKKyAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjYXBzOworICAgIGludCAgICAgICAgICAgICAgICAgY2Fwc0xlbjsKKyAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpzaGlmdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0TGVuOworICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKnNoaWZ0Q2FwczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0Q2Fwc0xlbjsKKyAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjdHJsOworICAgIGludCAgICAgICAgICAgICAgICAgY3RybExlbjsKKyAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpudW1QYWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1QYWRMZW47CisgICAgfSBjb2RlcGFnZV90OworCisvKiB7c2VjcmV0fSAqLwordHlwZWRlZiBpYm9vbCAoRVZUQVBJUCBfRVZUX3VzZXJFdmVudEZpbHRlcikoZXZlbnRfdCAqZXZ0KTsKKy8qIHtzZWNyZXR9ICovCit0eXBlZGVmIHZvaWQgKEVWVEFQSVAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyKShpbnQgeCxpbnQgeSk7CisvKiB7c2VjcmV0fSAqLwordHlwZWRlZiB2b2lkIChFVlRBUElQIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2spKHZvaWQgKnBhcmFtcyk7CisKKy8qIE1hY3JvIHRvIGZpbmQgdGhlIHNpemUgb2YgYSBzdGF0aWMgYXJyYXkgKi8KKworI2RlZmluZSBFVlRfQVJSX1NJWkUoYSkgICAgICAgICAoc2l6ZW9mKGEpL3NpemVvZigoYSlbMF0pKQorCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIFN0YW5kYXJkIGNvZGUgcGFnZSB0YWJsZXMgKi8KKworZXh0ZXJuIGNvZGVwYWdlX3QgX0NQX1VTX0VuZ2xpc2g7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFB1YmxpYyBBUEkgZnVuY3Rpb25zIGZvciB1c2VyIGFwcGxpY2F0aW9ucyAqLworCitpYm9vbCAgIEVWVEFQSSBFVlRfZ2V0TmV4dChldmVudF90ICpldnQsdWxvbmcgbWFzayk7CitpYm9vbCAgIEVWVEFQSSBFVlRfcGVla05leHQoZXZlbnRfdCAqZXZ0LHVsb25nIG1hc2spOworaWJvb2wgICBFVlRBUEkgRVZUX3Bvc3QodWxvbmcgd2hpY2gsdWxvbmcgd2hhdCx1bG9uZyBtZXNzYWdlLHVsb25nIG1vZGlmaWVycyk7Cit2b2lkICAgIEVWVEFQSSBFVlRfZmx1c2godWxvbmcgbWFzayk7Cit2b2lkICAgIEVWVEFQSSBFVlRfaGFsdChldmVudF90ICpldnQsdWxvbmcgbWFzayk7CitpYm9vbCAgIEVWVEFQSSBFVlRfaXNLZXlEb3duKHVjaGFyIHNjYW5Db2RlKTsKK3ZvaWQgICAgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcyhpbnQgeCxpbnQgeSk7Cit2b2lkICAgIEVWVEFQSSBFVlRfZ2V0TW91c2VQb3MoaW50ICp4LGludCAqeSk7CisKKy8qIEZ1bmN0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIHVwZGF0aW5nIG9mIGtleWJvYXJkIExFRCBzdGF0dXMgaW5kaWNhdG9ycyAqLworCit2b2lkICAgIEVWVEFQSSBFVlRfYWxsb3dMRURTKGlib29sIGVuYWJsZSk7CisKKy8qIEZ1bmN0aW9uIHRvIGluc3RhbGwgYSBjdXN0b20ga2V5Ym9hcmQgY29kZSBwYWdlLiBEZWZhdWx0IGlzIFVTIEVuZ2xpc2ggKi8KKworY29kZXBhZ2VfdCAqRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKTsKK3ZvaWQgICAgRVZUQVBJIEVWVF9zZXRDb2RlUGFnZShjb2RlcGFnZV90ICpwYWdlKTsKKworLyogRnVuY3Rpb25zIGZvciBmaW5lIGdyYWluZWQgam95c3RpY2sgY2FsaWJyYXRpb24gKi8KKwordm9pZCAgICBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKTsKK2ludCAgICAgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCk7Cit2b2lkICAgIEVWVEFQSSBFVlRfam95U2V0VXBwZXJMZWZ0KHZvaWQpOwordm9pZCAgICBFVlRBUEkgRVZUX2pveVNldExvd2VyUmlnaHQodm9pZCk7Cit2b2lkICAgIEVWVEFQSSBFVlRfam95U2V0Q2VudGVyKHZvaWQpOworCisvKiBJbnN0YWxsIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrICovCisKK3ZvaWQgICAgRVZUQVBJIEVWVF9zZXRVc2VyRXZlbnRGaWx0ZXIoX0VWVF91c2VyRXZlbnRGaWx0ZXIgZmlsdGVyKTsKKworLyogSW5zdGFsbCB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjayBmdW5jdGlvbiAqLworCit2b2lkICAgIEVWVEFQSSBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2soX0VWVF9oZWFydEJlYXRDYWxsYmFjayBjYWxsYmFjayx2b2lkICpwYXJhbXMpOwordm9pZCAgICBFVlRBUEkgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrKF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgKmNhbGxiYWNrLHZvaWQgKipwYXJhbXMpOworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgdG8gaW5pdGlhbGlzZSBhbmQga2lsbCB0aGUgZXZlbnQgbWFuYWdlci4gTUdMCisgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IGFzIHRoZSBNR0wKKyAqIGxpYnJhcmllcyBkbyBpdCBmb3IgeW91LgorICovCisKKy8qIHtzZWNyZXR9ICovCit2b2lkICAgIEVWVEFQSSBFVlRfaW5pdChfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKTsKKy8qIHtzZWNyZXR9ICovCit2b2lkICAgIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZShpbnQgeFJlcyxpbnQgeVJlcyk7CisvKiB7c2VjcmV0fSAqLwordm9pZCAgICBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCk7CisvKiB7c2VjcmV0fSAqLwordm9pZCAgICBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKTsKKy8qIHtzZWNyZXR9ICovCit2b2lkICAgIEVWVEFQSSBFVlRfZXhpdCh2b2lkKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLworI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIF9fRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL210cnIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5ODEyYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIGRlZmluaW5nIHRoZSBleHRlcm5hbCByaW5nIDAgaGVscGVyIGZ1bmN0aW9ucworKiAgICAgICAgICAgICAgIG5lZWRlZCBieSB0aGUgTVRSUiBtb2R1bGUuIFRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgaW5jbHVkZWQKKyogICAgICAgICAgICAgICBkaXJlY3RseSBmb3IgbmF0aXZlIHJpbmcgMCBkZXZpY2UgZHJpdmVycywgb3IgdGhleSBtYXkKKyogICAgICAgICAgICAgICBiZSBjYWxscyBkb3duIHRvIGEgcmluZyAwIGhlbHBlciBkZXZpY2UgZHJpdmVyIHdoZXJlCisqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgKG9yIHRoZSBlbnRpcmUgTVRSUiBtb2R1bGUgbWF5IGJlIGxvY2F0ZWQgaW4KKyogICAgICAgICAgICAgICB0aGUgZGV2aWNlIGRyaXZlciBpZiB0aGUgZGV2aWNlIGRyaXZlciBpcyAzMi1iaXQpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX01UUlJfSAorI2RlZmluZSBfX01UUlJfSAorCisjaW5jbHVkZSAic2NpdGVjaC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAocmVxdWlyZXMgcmluZyAwIGFjY2VzcyBvciBoZWxwZXIgZnVuY3Rpb25zISkgKi8KKwordm9pZCAgICBNVFJSX2luaXQodm9pZCk7CitpbnQgICAgIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKHVsb25nIGJhc2UsdWxvbmcgc2l6ZSx1aW50IHR5cGUpOworCisvKiBFeHRlcm5hbCBhc3NlbWJsZXIgaGVscGVyIGZ1bmN0aW9ucyAqLworCitpYm9vbCAgIF9BU01BUEkgX01UUlJfaXNSaW5nMCh2b2lkKTsKK3Vsb25nICAgX0FTTUFQSSBfTVRSUl9kaXNhYmxlSW50KHZvaWQpOwordm9pZCAgICBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVJbnQodWxvbmcgZmxhZ3MpOwordWxvbmcgICBfQVNNQVBJIF9NVFJSX3NhdmVDUjQodm9pZCk7Cit2b2lkICAgIF9BU01BUEkgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpOwordWNoYXIgICBfQVNNQVBJIF9NVFJSX2dldEN4ODYodWNoYXIgcmVnKTsKK3ZvaWQgICAgX0FTTUFQSSBfTVRSUl9zZXRDeDg2KHVjaGFyIHJlZyx1Y2hhciBkYXRhKTsKKyNpZmRlZiAgX18xNkJJVF9fCit2b2lkICAgIF9BU01BUEkgX01UUlJfcmVhZE1TUih1bG9uZyByZWcsIHVsb25nIGZhciAqZWF4LCB1bG9uZyBmYXIgKmVkeCk7CisjZWxzZQordm9pZCAgICBfQVNNQVBJIF9NVFJSX3JlYWRNU1IodWxvbmcgcmVnLCB1bG9uZyAqZWF4LCB1bG9uZyAqZWR4KTsKKyNlbmRpZgordm9pZCAgICBfQVNNQVBJIF9NVFJSX3dyaXRlTVNSKHVsb25nIHJlZywgdWxvbmcgZWF4LCB1bG9uZyBlZHgpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCisjZW5kaWYKKworI2VuZGlmICAvKiBfX01UUlJfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BjaWxpYi5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BjaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDU4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcGNpbGliLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnRlcmZhY2Ugcm91dGluZXMgdG8gdGhlIFBDSSBidXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUENJTElCX0gKKyNkZWZpbmUgX19QQ0lMSUJfSAorCisjaW5jbHVkZSAic2NpdGVjaC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworLyogRGVmaW5lcyBmb3IgUENJRGV2aWNlSW5mby5IZWFkZXJUeXBlICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgUENJX2RldmljZVR5cGUgICAgICAgICAgICAgICAgICA9IDB4MDAsCisgICAgUENJX2JyaWRnZVR5cGUgICAgICAgICAgICAgICAgICA9IDB4MDEsCisgICAgUENJX2NhcmRCdXNCcmlkZ2VUeXBlICAgICAgICAgICA9IDB4MDIsCisgICAgUENJX211bHRpRnVuY3Rpb25UeXBlICAgICAgICAgICA9IDB4ODAKKyAgICB9IFBDSUhlYWRlclR5cGVGbGFnczsKKworLyogRGVmaW5lcyBmb3IgUENJRGV2aWNlSW5mby5Db21tYW5kICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgUENJX2VuYWJsZUlPU3BhY2UgICAgICAgICAgICAgICA9IDB4MDAwMSwKKyAgICBQQ0lfZW5hYmxlTWVtb3J5U3BhY2UgICAgICAgICAgID0gMHgwMDAyLAorICAgIFBDSV9lbmFibGVCdXNNYXN0ZXIgICAgICAgICAgICAgPSAweDAwMDQsCisgICAgUENJX2VuYWJsZVNwZWNpYWxDeWxjZXMgICAgICAgICA9IDB4MDAwOCwKKyAgICBQQ0lfZW5hYmxlV3JpdGVBbmRJbnZhbGlkYXRlICAgID0gMHgwMDEwLAorICAgIFBDSV9lbmFibGVWR0FDb21wYXRpYmxlUGFsZXR0ZSAgPSAweDAwMjAsCisgICAgUENJX2VuYWJsZVBhcml0eSAgICAgICAgICAgICAgICA9IDB4MDA0MCwKKyAgICBQQ0lfZW5hYmxlV2FpdEN5Y2xlICAgICAgICAgICAgID0gMHgwMDgwLAorICAgIFBDSV9lbmFibGVTZXJyICAgICAgICAgICAgICAgICAgPSAweDAxMDAsCisgICAgUENJX2VuYWJsZUZhc3RCYWNrVG9CYWNrICAgICAgICA9IDB4MDIwMAorICAgIH0gUENJQ29tbWFuZEZsYWdzOworCisvKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLlN0YXR1cyAqLworCit0eXBlZGVmIGVudW0geworICAgIFBDSV9zdGF0dXNDYXBhYmlsaXRpZXNMaXN0ICAgICAgPSAweDAwMTAsCisgICAgUENJX3N0YXR1czY2TWh6Q2FwYWJsZSAgICAgICAgICA9IDB4MDAyMCwKKyAgICBQQ0lfc3RhdHVzVURGU3VwcG9ydGVkICAgICAgICAgID0gMHgwMDQwLAorICAgIFBDSV9zdGF0dXNGYXN0QmFja1RvQmFjayAgICAgICAgPSAweDAwODAsCisgICAgUENJX3N0YXR1c0RhdGFQYXJpdHlEZXRlY3RlZCAgICA9IDB4MDEwMCwKKyAgICBQQ0lfc3RhdHVzRGV2U2VsICAgICAgICAgICAgICAgID0gMHgwNjAwLAorICAgIFBDSV9zdGF0dXNTaWduYWxlZFRhcmdldEFib3J0ICAgPSAweDA4MDAsCisgICAgUENJX3N0YXR1c1JlY2lldmVkVGFyZ2V0QWJvcnQgICA9IDB4MTAwMCwKKyAgICBQQ0lfc3RhdHVzUmVjaWV2ZWRNYXN0ZXJBYm9ydCAgID0gMHgyMDAwLAorICAgIFBDSV9zdGF0dXNTaWduYWxlZFN5c3RlbUVycm9yICAgPSAweDQwMDAsCisgICAgUENJX3N0YXR1c0RldGVjdGVkUGFyaXR5RXJyb3IgICA9IDB4ODAwMAorICAgIH0gUENJU3RhdHVzRmxhZ3M7CisKKy8qIFBDSSBjYXBhYmlsaXR5IElEcyAqLworCit0eXBlZGVmIGVudW0geworICAgIFBDSV9jYXBzUG93ZXJNYW5hZ2VtZW50ICAgICAgICAgPSAweDAxLAorICAgIFBDSV9jYXBzQUdQICAgICAgICAgICAgICAgICAgICAgPSAweDAyLAorICAgIFBDSV9jYXBzTVNJICAgICAgICAgICAgICAgICAgICAgPSAweDA1CisgICAgfSBQQ0lDYXBzVHlwZTsKKworLyogUENJIEFHUCByYXRlIGRlZmluaXRpb25zICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgUENJX0FHUFJhdGUxWCAgICAgICAgICAgICAgICAgICA9IDB4MSwKKyAgICBQQ0lfQUdQUmF0ZTJYICAgICAgICAgICAgICAgICAgID0gMHgyLAorICAgIFBDSV9BR1BSYXRlNFggICAgICAgICAgICAgICAgICAgPSAweDQKKyAgICB9IFBDSUFHUFJhdGVUeXBlOworCisvKiBOT1RFOiBXZSBkZWZpbmUgYWxsIGJpdGZpZWxkJ3MgYXMgdWludCdzLCBzcGVjaWZpY2FsbHkgc28gdGhhdCB0aGUgSUJNCisgKiAgICAgICBWaXN1YWwgQWdlIEMrKyBjb21waWxlciBkb2VzIG5vdCBjb21wbGFpbi4gV2UgbmVlZCB0aGVtIHRvIGJlCisgKiAgICAgICAzMi1iaXRzIHdpZGUsIGFuZCB0aGlzIGlzIHRoZSB3aWR0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyLCBidXQKKyAqICAgICAgIHdlIGNhbid0IHVzZSBhIHVsb25nIHRvIG1ha2UgdGhpcyBleHBsaWNpdCBvciB3ZSBnZXQgZXJyb3JzLgorICovCisKKy8qIFN0cnVjdHVyZSBkZWZpbmluZyBhIFBDSSBzbG90IGlkZW50aWZpZXIgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludCAgICBaZXJvOjI7CisgICAgICAgIHVpbnQgICAgUmVnaXN0ZXI6NjsKKyAgICAgICAgdWludCAgICBGdW5jdGlvbjozOworICAgICAgICB1aW50ICAgIERldmljZTo1OworICAgICAgICB1aW50ICAgIEJ1czo4OworICAgICAgICB1aW50ICAgIFJlc2VydmVkOjc7CisgICAgICAgIHVpbnQgICAgRW5hYmxlOjE7CisgICAgICAgIH0gcDsKKyAgICB1bG9uZyAgIGk7CisgICAgfSBQQ0lzbG90OworCisvKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIHJlZ3VsYXIgKHR5cGUgMCkgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqIGxheW91dC4gV2UgdXNlIHRoaXMgaW4gYSB1bmlvbiBiZWxvdyBzbyB3ZSBjYW4gZGVzY3JpYmUgYWxsIHR5cGVzIG9mCisgKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZXMgd2l0aCBhIHNpbmdsZSBzdHJ1Y3R1cmUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nICAgQmFzZUFkZHJlc3MxMDsKKyAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTQ7CisgICAgdWxvbmcgICBCYXNlQWRkcmVzczE4OworICAgIHVsb25nICAgQmFzZUFkZHJlc3MxQzsKKyAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjA7CisgICAgdWxvbmcgICBCYXNlQWRkcmVzczI0OworICAgIHVsb25nICAgQ2FyZGJ1c0NJU1BvaW50ZXI7CisgICAgdXNob3J0ICBTdWJTeXN0ZW1WZW5kb3JJRDsKKyAgICB1c2hvcnQgIFN1YlN5c3RlbUlEOworICAgIHVsb25nICAgUk9NQmFzZUFkZHJlc3M7CisgICAgdWNoYXIgICBDYXBhYmlsaXRpZXNQb2ludGVyOworICAgIHVjaGFyICAgcmVzZXJ2ZWQxOworICAgIHVjaGFyICAgcmVzZXJ2ZWQyOworICAgIHVjaGFyICAgcmVzZXJ2ZWQzOworICAgIHVsb25nICAgcmVzZXJ2ZWQ0OworICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKKyAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKKyAgICB1Y2hhciAgIE1pbmltdW1HcmFudDsKKyAgICB1Y2hhciAgIE1heGltdW1MYXRlbmN5OworCisgICAgLyogVGhlc2UgYXJlIG5vdCBpbiB0aGUgYWN0dWFsIGNvbmZpZyBzcGFjZSwgYnV0IHdlIGVudW1lcmF0ZSB0aGVtICovCisgICAgdWxvbmcgICBCYXNlQWRkcmVzczEwTGVuOworICAgIHVsb25nICAgQmFzZUFkZHJlc3MxNExlbjsKKyAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMThMZW47CisgICAgdWxvbmcgICBCYXNlQWRkcmVzczFDTGVuOworICAgIHVsb25nICAgQmFzZUFkZHJlc3MyMExlbjsKKyAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjRMZW47CisgICAgdWxvbmcgICBST01CYXNlQWRkcmVzc0xlbjsKKyAgICB9IFBDSVR5cGUwSW5mbzsKKworLyogU3RydWN0dXJlIGRlZmluaW5nIFBDSSB0byBQQ0kgYnJpZGdlICh0eXBlIDEpIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBsYXlvdXQuIFdlIHVzZSB0aGlzIGluIGEgdW5pb24gYmVsb3cgc28gd2UgY2FuIGRlc2NyaWJlIGFsbCB0eXBlcyBvZgorICogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2VzIHdpdGggYSBzaW5nbGUgc3RydWN0dXJlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTA7CisgICAgdWxvbmcgICBCYXNlQWRkcmVzczE0OworICAgIHVjaGFyICAgUHJpbWFyeUJ1c051bWJlcjsKKyAgICB1Y2hhciAgIFNlY29uZGF5QnVzTnVtYmVyOworICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXNOdW1iZXI7CisgICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5VGltZXI7CisgICAgdWNoYXIgICBJT0Jhc2U7CisgICAgdWNoYXIgICBJT0xpbWl0OworICAgIHVzaG9ydCAgU2Vjb25kYXJ5U3RhdHVzOworICAgIHVzaG9ydCAgTWVtb3J5QmFzZTsKKyAgICB1c2hvcnQgIE1lbW9yeUxpbWl0OworICAgIHVzaG9ydCAgUHJlZmV0Y2hhYmxlTWVtb3J5QmFzZTsKKyAgICB1c2hvcnQgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OworICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlQmFzZUhpOworICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlTGltaXRIaTsKKyAgICB1c2hvcnQgIElPQmFzZUhpOworICAgIHVzaG9ydCAgSU9MaW1pdEhpOworICAgIHVjaGFyICAgQ2FwYWJpbGl0aWVzUG9pbnRlcjsKKyAgICB1Y2hhciAgIHJlc2VydmVkMTsKKyAgICB1Y2hhciAgIHJlc2VydmVkMjsKKyAgICB1Y2hhciAgIHJlc2VydmVkMzsKKyAgICB1bG9uZyAgIFJPTUJhc2VBZGRyZXNzOworICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKKyAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKKyAgICB1c2hvcnQgIEJyaWRnZUNvbnRyb2w7CisgICAgfSBQQ0lUeXBlMUluZm87CisKKy8qIFBDSSB0byBDYXJkQnVzIGJyaWRnZSAodHlwZSAyKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBTb2NrZXRSZWdpc3RlcnNCYXNlQWRkcmVzczsKKyAgICB1Y2hhciAgIENhcGFiaWxpdGllc1BvaW50ZXI7CisgICAgdWNoYXIgICByZXNlcnZlZDE7CisgICAgdXNob3J0ICBTZWNvbmRhcnlTdGF0dXM7CisgICAgdWNoYXIgICBQcmltYXJ5QnVzOworICAgIHVjaGFyICAgU2Vjb25kYXJ5QnVzOworICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXM7CisgICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5OworICAgIHN0cnVjdCAgeworICAgICAgICB1bG9uZyAgIEJhc2U7CisgICAgICAgIHVsb25nICAgTGltaXQ7CisgICAgICAgIH0gUmFuZ2VbNF07CisgICAgdWNoYXIgICBJbnRlcnJ1cHRMaW5lOworICAgIHVjaGFyICAgSW50ZXJydXB0UGluOworICAgIHVzaG9ydCAgQnJpZGdlQ29udHJvbDsKKyAgICB9IFBDSVR5cGUySW5mbzsKKworLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBpbmZvcm1hdGlvbiBmb3IgYQorICogc2luZ2xlIFBDSSBkZXZpY2Ugb24gdGhlIFBDSSBidXMuIFdlIGVudW1lcmF0ZSBhbGwgdGhpcyBpbmZvcm1hdGlvbgorICogZm9yIGFsbCBQQ0kgZGV2aWNlcyBvbiB0aGUgYnVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgICAgICAgICAgICAgIGR3U2l6ZTsKKyAgICBQQ0lzbG90ICAgICAgICAgICAgIHNsb3Q7CisgICAgdWxvbmcgICAgICAgICAgICAgICBtZWNoMTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIFZlbmRvcklEOworICAgIHVzaG9ydCAgICAgICAgICAgICAgRGV2aWNlSUQ7CisgICAgdXNob3J0ICAgICAgICAgICAgICBDb21tYW5kOworICAgIHVzaG9ydCAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgUmV2SUQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBJbnRlcmZhY2U7CisgICAgdWNoYXIgICAgICAgICAgICAgICBTdWJDbGFzczsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIEJhc2VDbGFzczsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIENhY2hlTGluZVNpemU7CisgICAgdWNoYXIgICAgICAgICAgICAgICBMYXRlbmN5VGltZXI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBIZWFkZXJUeXBlOworICAgIHVjaGFyICAgICAgICAgICAgICAgQklTVDsKKyAgICB1bmlvbiB7CisgICAgICAgIFBDSVR5cGUwSW5mbyAgICB0eXBlMDsKKyAgICAgICAgUENJVHlwZTFJbmZvICAgIHR5cGUxOworICAgICAgICBQQ0lUeXBlMkluZm8gICAgdHlwZTI7CisgICAgICAgIH0gdTsKKyAgICB9IFBDSURldmljZUluZm87CisKKy8qIFBDSSBDYXBhYmlsaXR5IGhlYWRlciBzdHJ1Y3R1cmUuIEFsbCBQQ0kgY2FwYWJpbGl0aWVzIGhhdmUgdGhlCisgKiBmb2xsb3dpbmcgaGVhZGVyLgorICoKKyAqIGNhcHNJRCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgYXMgZGVmaW5lIGFib3ZlLgorICoKKyAqIG5leHQgaXMgdGhlIG9mZnNldCBpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAoMHg0MC0weEZDKSBvZiB0aGUKKyAqIG5leHQgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgaW4gdGhlIGxpc3QsIG9yIDB4MDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUKKyAqIGVudHJpZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVjaGFyICAgY2Fwc0lEOworICAgIHVjaGFyICAgbmV4dDsKKyAgICB9IFBDSUNhcHNIZWFkZXI7CisKKy8qIFN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUENJIEFHUCBzdGF0dXMgcmVnaXN0ZXIgY29udGVudHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQgICAgcmF0ZTozOworICAgIHVpbnQgICAgcnN2ZDE6MTsKKyAgICB1aW50ICAgIGZhc3RXcml0ZToxOworICAgIHVpbnQgICAgZm91ckdCOjE7CisgICAgdWludCAgICByc3ZkMjozOworICAgIHVpbnQgICAgc2lkZUJhbmRBZGRyZXNzaW5nOjE7CisgICAgdWludCAgICByc3ZkMzoxNDsKKyAgICB1aW50ICAgIHJlcXVlc3RRdWV1ZURlcHRoTWF4aW11bTo4OworICAgIH0gUENJQUdQU3RhdHVzOworCisvKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFBDSSBBR1AgY29tbWFuZCByZWdpc3RlciBjb250ZW50cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludCAgICByYXRlOjM7CisgICAgdWludCAgICByc3ZkMToxOworICAgIHVpbnQgICAgZmFzdFdyaXRlRW5hYmxlOjE7CisgICAgdWludCAgICBmb3VyR0JFbmFibGU6MTsKKyAgICB1aW50ICAgIHJzdmQyOjI7CisgICAgdWludCAgICBBR1BFbmFibGU6MTsKKyAgICB1aW50ICAgIFNCQUVuYWJsZToxOworICAgIHVpbnQgICAgcnN2ZDM6MTQ7CisgICAgdWludCAgICByZXF1ZXN0UXVldWVEZXB0aDo4OworICAgIH0gUENJQUdQQ29tbWFuZDsKKworLyogQUdQIENhcGFiaWxpdHkgc3RydWN0dXJlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQQ0lDYXBzSGVhZGVyICAgaDsKKyAgICB1c2hvcnQgICAgICAgICAgbWFqTWluOworICAgIFBDSUFHUFN0YXR1cyAgICBBR1BTdGF0dXM7CisgICAgUENJQUdQQ29tbWFuZCAgIEFHUENvbW1hbmQ7CisgICAgfSBQQ0lBR1BDYXBhYmlsaXR5OworCisvKiBTdHJ1Y3R1cmUgZm9yIG9idGFpbmluZyB0aGUgUENJIElSUSByb3V0aW5nIGluZm9ybWF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1Y2hhciAgIGJ1czsKKyAgICB1Y2hhciAgIGRldmljZTsKKyAgICB1Y2hhciAgIGxpbmtBOworICAgIHVzaG9ydCAgbWFwQTsKKyAgICB1Y2hhciAgIGxpbmtCOworICAgIHVzaG9ydCAgbWFwQjsKKyAgICB1Y2hhciAgIGxpbmtDOworICAgIHVzaG9ydCAgbWFwQzsKKyAgICB1Y2hhciAgIGxpbmtEOworICAgIHVzaG9ydCAgbWFwRDsKKyAgICB1Y2hhciAgIHNsb3Q7CisgICAgdWNoYXIgICByZXNlcnZlZDsKKyAgICB9IFBDSVJvdXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCAgICAgICAgICBCdWZmZXJTaXplOworICAgIFBDSVJvdXRlSW5mbyAgICAqRGF0YUJ1ZmZlcjsKKyAgICB9IFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyOworCisjZGVmaW5lIE5VTV9QQ0lfUkVHICAgICAgICAgICAgICAgICAoc2l6ZW9mKFBDSURldmljZUluZm8pIC8gNCkgLSAxMAorI2RlZmluZSBQQ0lfQlJJREdFX0NMQVNTICAgICAgICAgICAgMHgwNgorI2RlZmluZSBQQ0lfSE9TVF9CUklER0VfU1VCQ0xBU1MgICAgMHgwMAorI2RlZmluZSBQQ0lfRUFSTFlfVkdBX0NMQVNTICAgICAgICAgMHgwMAorI2RlZmluZSBQQ0lfRUFSTFlfVkdBX1NVQkNMQVNTICAgICAgMHgwMQorI2RlZmluZSBQQ0lfRElTUExBWV9DTEFTUyAgICAgICAgICAgMHgwMworI2RlZmluZSBQQ0lfRElTUExBWV9WR0FfU1VCQ0xBU1MgICAgMHgwMAorI2RlZmluZSBQQ0lfRElTUExBWV9YR0FfU1VCQ0xBU1MgICAgMHgwMQorI2RlZmluZSBQQ0lfRElTUExBWV9PVEhFUl9TVUJDTEFTUyAgMHg4MAorI2RlZmluZSBQQ0lfTU1fQ0xBU1MgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQQ0lfQVVESU9fU1VCQ0xBU1MgICAgICAgICAgMHgwMQorCisvKiBNYWNyb3MgdG8gZGV0ZWN0IHNwZWNpZmljIGNsYXNzZXMgb2YgZGV2aWNlcyAqLworCisjZGVmaW5lIFBDSV9JU18zRExBQlNfTk9OVkdBX0NMQVNTKHBjaSkgXAorICAgKCgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9PVEhFUl9TVUJDTEFTUykgXAorICYmICgocGNpKS0+VmVuZG9ySUQgPT0gMHgzRDNEIHx8IChwY2kpLT5WZW5kb3JJRCA9PSAweDEwNEMpKQorCisjZGVmaW5lIFBDSV9JU19ESVNQTEFZX0NMQVNTKHBjaSkgXAorICAgKCgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9WR0FfU1VCQ0xBU1MpIFwKKyB8fCAoKHBjaSktPkJhc2VDbGFzcyA9PSBQQ0lfRElTUExBWV9DTEFTUyAmJiAocGNpKS0+U3ViQ2xhc3MgPT0gUENJX0RJU1BMQVlfWEdBX1NVQkNMQVNTKSBcCisgfHwgKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0VBUkxZX1ZHQV9DTEFTUyAmJiAocGNpKS0+U3ViQ2xhc3MgPT0gUENJX0VBUkxZX1ZHQV9TVUJDTEFTUykgXAorIHx8IFBDSV9JU18zRExBQlNfTk9OVkdBX0NMQVNTKHBjaSkpCisKKy8qIEZ1bmN0aW9uIGNvZGVzIHRvIHBhc3MgdG8gUENJX2FjY2Vzc1JlZyAqLworCisjZGVmaW5lIFBDSV9SRUFEX0JZVEUgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSV9SRUFEX1dPUkQgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBDSV9SRUFEX0RXT1JEICAgICAgICAgICAgICAyCisjZGVmaW5lIFBDSV9XUklURV9CWVRFICAgICAgICAgICAgICAzCisjZGVmaW5lIFBDSV9XUklURV9XT1JEICAgICAgICAgICAgICA0CisjZGVmaW5lIFBDSV9XUklURV9EV09SRCAgICAgICAgICAgICA1CisKKy8qIE1hY3JvcyB0byByZWFkL3dyaXRlIFBDSSByZWdpc3RlcnMuIFRoZXNlIGFzc3VtZSBhIGdsb2JhbCBQQ0kgYXJyYXkKKyAqIG9mIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqLworCisjZGVmaW5lIFBDSV9yZWFkUENJUmVnQihpbmRleCxkZXZpY2UpICAgXAorICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsMCwwLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCisKKyNkZWZpbmUgUENJX3JlYWRQQ0lSZWdXKGluZGV4LGRldmljZSkgICBcCisgICAgUENJX2FjY2Vzc1JlZyhpbmRleCwwLDEsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKKworI2RlZmluZSBQQ0lfcmVhZFBDSVJlZ0woaW5kZXgsZGV2aWNlKSAgIFwKKyAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LDAsMiwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQorCisjZGVmaW5lIFBDSV93cml0ZVBDSVJlZ0IoaW5kZXgsdmFsdWUsZGV2aWNlKSAgICBcCisgICAgUENJX2FjY2Vzc1JlZyhpbmRleCx2YWx1ZSwzLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCisKKyNkZWZpbmUgUENJX3dyaXRlUENJUmVnVyhpbmRleCx2YWx1ZSxkZXZpY2UpICAgIFwKKyAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LHZhbHVlLDQsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKKworI2RlZmluZSBQQ0lfd3JpdGVQQ0lSZWdMKGluZGV4LHZhbHVlLGRldmljZSkgICAgXAorICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsdmFsdWUsNSwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQorCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIEZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIFBDSSBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gKi8KKworaW50ICAgICBfQVNNQVBJIFBDSV9nZXROdW1EZXZpY2VzKHZvaWQpOworCisvKiBGdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIGRldmljZSBvbiB0aGUgUENJIGJ1cyAqLworCitpbnQgICAgIF9BU01BUEkgUENJX2VudW1lcmF0ZShQQ0lEZXZpY2VJbmZvIGluZm9bXSk7CisKKy8qIEZ1bmN0aW9uIHRvIGFjY2VzcyBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwordWxvbmcgICBfQVNNQVBJIFBDSV9hY2Nlc3NSZWcoaW50IGluZGV4LHVsb25nIHZhbHVlLGludCBmdW5jLFBDSURldmljZUluZm8gKmluZm8pOworCisvKiBGdW5jdGlvbiB0byBnZXQgUENJIElSUSByb3V0aW5nIG9wdGlvbnMgZm9yIGEgY2FyZCAqLworCitpbnQgICAgIF9BU01BUEkgUENJX2dldElSUVJvdXRpbmdPcHRpb25zKGludCBudW1EZXZpY2VzLFBDSVJvdXRlSW5mbyAqYnVmZmVyKTsKKworLyogRnVuY3Rpb24gdG8gcmUtcm91dGUgdGhlIFBDSSBJUlEgc2V0dGluZyBmb3IgYSBkZXZpY2UgKi8KKworaWJvb2wgICBfQVNNQVBJIFBDSV9zZXRIYXJkd2FyZUlSUShQQ0lEZXZpY2VJbmZvICppbmZvLHVpbnQgaW50UGluLHVpbnQgSVJRKTsKKworLyogRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzcGVjaWFsIGN5bGUgb24gdGhlIHNwZWNpZmllZCBQQ0kgYnVzICovCisKK3ZvaWQgICAgX0FTTUFQSSBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSh1aW50IGJ1cyx1bG9uZyBzcGVjaWFsQ3ljbGVEYXRhKTsKKworLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCit1bG9uZyAgIF9BU01BUEkgUENJX2ZpbmRCQVJTaXplKGludCBiYXIsUENJRGV2aWNlSW5mbyAqcGNpKTsKKworLyogRnVuY3Rpb24gdG8gcmVhZCBhIGJsb2NrIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyAqLworCit2b2lkICAgIF9BU01BUEkgUENJX3JlYWRSZWdCbG9jayhQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpkc3QsaW50IGNvdW50KTsKKworLyogRnVuY3Rpb24gdG8gd3JpdGUgYSBibG9jayBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMgKi8KKwordm9pZCAgICBfQVNNQVBJIFBDSV93cml0ZVJlZ0Jsb2NrKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKnNyYyxpbnQgY291bnQpOworCisvKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIDMyLWJpdCBQQ0kgQklPUyBlbnRyeSBwb2ludCAqLworCit1bG9uZyAgIF9BU01BUEkgUENJQklPU19nZXRFbnRyeSh2b2lkKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fUENJTElCX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX2hlbHAuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhN2MyNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFdpbjMyLCBPUy8yCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIGZvciB0aGUgU2NpVGVjaCBQb3J0YWJpbGl0eSBNYW5hZ2VyIDMyLWJpdAorKiAgICAgICAgICAgICAgIGhlbHBlciBWeEQgZm9yIFdpbmRvd3MgOXggZm9yIGFuZCB0aGUgMTYtYml0IHJpbmcgMAorKiAgICAgICAgICAgICAgIGhlbHBlciBkZXZpY2UgZHJpdmVyIGZvciBPUy8yLgorKgorKiAgICAgICAgICAgICAgIFRoaXMgZmlsZSBkb2N1bWVudHMgYWxsIHRoZSBwdWJsaWMgc2VydmljZXMgdXNlZCBieSB0aGUKKyogICAgICAgICAgICAgICBTY2lUZWNoIFBvcnRhYmlsaXR5IE1hbmFnZXIgbGlicmFyeSBhbmQgU2NpVGVjaCBOdWNsZXVzCisqICAgICAgICAgICAgICAgbG9hZGVyIGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUE1IRUxQX0gKKyNkZWZpbmUgX19QTUhFTFBfSAorCisvKiBJbmNsdWRlIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKworI2luY2x1ZGUgInNkZC9zZGR2ZXIuaCIKKyNkZWZpbmUgUE1IRUxQX01ham9yICAgICAgICAgICAgU0REX1JFTEVBU0VfTUFKT1IKKyNkZWZpbmUgUE1IRUxQX01pbm9yICAgICAgICAgICAgU0REX1JFTEVBU0VfTUlOT1IKKyNkZWZpbmUgUE1IRUxQX1ZFUlNJT04gICAgICAgICAgKChQTUhFTFBfTWFqb3IgPDwgOCkgfCBQTUhFTFBfTWlub3IpCisKKyNpZmRlZiAgX19PUzJfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQdWJsaWMgT1MvMiBTdXBwb3J0IGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNjaXRlY2guaCIKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisKKy8qIE5hbWUgb2YgZGV2aWNlIGRyaXZlciAqLworCisjZGVmaW5lIFBNSEVMUF9OQU1FICAgICAgICAgICAgICAgICAoUFNaKSJzZGRoZWxwJCIKKworLyogTWFpbiBJT0NUTCBmdW5jdGlvbiB0byB0YWxrIHRvIGRldmljZSBkcml2ZXIgKi8KKworI2RlZmluZSBQTUhFTFBfSU9DVEwgICAgICAgICAgICAgICAgMHgwMDgwCisKKy8qIE1hY3JvIGRlZmluaXRpb24gZm9yIGRlZmluaW5nIElPQ1RMIGZ1bmN0aW9uIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBTRERIRUxQCisgKiBkZXZpY2UgZHJpdmVyIGZvciBPUy8yLiBTaW1pbGFyIHRvIHRoYXQgdXNlZCBmb3IgdGhlIERPUy9XaW4zMiB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgUE1IRUxQX0NUTF9DT0RFKG5hbWUsdmFsdWUpIFwKKyAgICBQTUhFTFBfIyNuYW1lID0gdmFsdWUKKwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBWZXJzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgYWxsIGRyaXZlcnMgKi8KKyAgICBQTUhFTFBfQ1RMX0NPREUoR0VUVkVSICAgICAgICAgICAgICAgICAgICAgICwweDAwMDEpLAorICAgIFBNSEVMUF9DVExfQ09ERShNQVBQSFlTICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMiksCisgICAgUE1IRUxQX0NUTF9DT0RFKEFMTE9DTE9DS0VEICAgICAgICAgICAgICAgICAsMHgwMDAzKSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoRlJFRUxPQ0tFRCAgICAgICAgICAgICAgICAgICwweDAwMDQpLAorICAgIFBNSEVMUF9DVExfQ09ERShHRVRHRFQzMiAgICAgICAgICAgICAgICAgICAgLDB4MDAwNSksCisgICAgUE1IRUxQX0NUTF9DT0RFKE1BTExPQ1NIQVJFRCAgICAgICAgICAgICAgICAsMHgwMDA3KSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoRlJFRVNIQVJFRCAgICAgICAgICAgICAgICAgICwweDAwMDgpLAorICAgIFBNSEVMUF9DVExfQ09ERShNQVBUT1BST0NFU1MgICAgICAgICAgICAgICAgLDB4MDAwOSksCisgICAgUE1IRUxQX0NUTF9DT0RFKEZSRUVQSFlTICAgICAgICAgICAgICAgICAgICAsMHgwMDBBKSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoRkxVU0hUTEIgICAgICAgICAgICAgICAgICAgICwweDAwMEIpLAorICAgIFBNSEVMUF9DVExfQ09ERShTQVZFQ1I0ICAgICAgICAgICAgICAgICAgICAgLDB4MDAwQyksCisgICAgUE1IRUxQX0NUTF9DT0RFKFJFU1RPUkVDUjQgICAgICAgICAgICAgICAgICAsMHgwMDBEKSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoUkVBRE1TUiAgICAgICAgICAgICAgICAgICAgICwweDAwMEUpLAorICAgIFBNSEVMUF9DVExfQ09ERShXUklURU1TUiAgICAgICAgICAgICAgICAgICAgLDB4MDAwRiksCisgICAgUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUiAgICAgICAgICAgICAsMHgwMDEwKSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoR0VUUEhZU0lDQUxBRERSUkFOR0UgICAgICAgICwweDAwMTEpLAorICAgIFBNSEVMUF9DVExfQ09ERShMT0NLUEFHRVMgICAgICAgICAgICAgICAgICAgLDB4MDAxMiksCisgICAgUE1IRUxQX0NUTF9DT0RFKFVOTE9DS1BBR0VTICAgICAgICAgICAgICAgICAsMHgwMDEzKSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoR0VUU0hBUkVERVhQICAgICAgICAgICAgICAgICwweDAwNDIpLAorICAgIFBNSEVMUF9DVExfQ09ERShTRVRTSEFSRURFWFAgICAgICAgICAgICAgICAgLDB4MDA0MyksCisgICAgUE1IRUxQX0NUTF9DT0RFKEdFVFNUQUNLU1dJVENIUlROICAgICAgICAgICAsMHgwMDQ0KSwKKyAgICBQTUhFTFBfQ1RMX0NPREUoR0VUQlVJTEROTyAgICAgICAgICAgICAgICAgICwweDAwNTApLAorICAgIH0gUE1IRUxQX2N0bENvZGVzOworCisjZWxzZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQdWJsaWMgRE9TL1dpbmRvd3MgU3VwcG9ydCBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgREVWSUNFX01BSU4KKyNpbmNsdWRlIDx2dG9vbHNjLmg+CisjZGVmaW5lIFBNSEVMUF9Jbml0X09yZGVyICAgKFZERF9JTklUX09SREVSLTEpCisjZGVmaW5lIFJFVFVSTl9MT05HUyhuKSAgICAgKnAtPmRpb2NfYnl0ZXNyZXQgPSAobikgKiBzaXplb2YodWxvbmcpCisjZW5kaWYgIC8qIERFVklDRV9NQUlOICovCisjaW5jbHVkZSAic2NpdGVjaC5oIgorI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKKworLyogV2UgY29ubmVjdCB0byB0aGUgU0RESEVMUC5WWEQgbW9kdWxlIGlmIGl0IGlzIHN0YXRpY2x5IGxvYWRlZCAoYXMgcGFydAorICogb2YgU2NpVGVjaCBEaXNwbGF5IERvY3RvciksIG90aGVyd2lzZSB3ZSBkeW5hbWljYWxseSBsb2FkIHRoZSBQTUhFTFAuVlhECisgKiBwdWJsaWMgaGVscGVyIFZ4RC4KKyAqLworCisjZGVmaW5lIFBNSEVMUF9EZXZpY2VJRCAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTRERIRUxQX0RldmljZUlEICAgICAgICAweDNERjgKKyNkZWZpbmUgVlhETERSX0RldmljZUlEICAgICAgICAgMHgwMDI3CisjZGVmaW5lIFNEREhFTFBfTU9EVUxFICAgICAgICAgICJTRERIRUxQIgorI2RlZmluZSBTRERIRUxQX05BTUUgICAgICAgICAgICAiU0RESEVMUC5WWEQiCisjZGVmaW5lIFBNSEVMUF9NT0RVTEUgICAgICAgICAgICJQTUhFTFAiCisjZGVmaW5lIFBNSEVMUF9OQU1FICAgICAgICAgICAgICJQTUhFTFAuVlhEIgorI2RlZmluZSBQTUhFTFBfRERCTkFNRSAgICAgICAgICAicG1oZWxwICAiCisjZGVmaW5lIFNEREhFTFBfTU9EVUxFX1BBVEggICAgICJcXFxcLlxcIiBTRERIRUxQX01PRFVMRQorI2RlZmluZSBQTUhFTFBfTU9EVUxFX1BBVEggICAgICAiXFxcXC5cXCIgUE1IRUxQX01PRFVMRQorI2RlZmluZSBQTUhFTFBfVlhEX1BBVEggICAgICAgICAiXFxcXC5cXCIgUE1IRUxQX05BTUUKKworLyogTWFjcm8gZGVmaW5pdGlvbiBmb3IgZGVmaW5pbmcgSU9DVEwgZnVuY3Rpb24gY29udHJvbCBjb2RlcyBmb3IgdGhlIFBNSEVMUAorICogZGV2aWNlIGRyaXZlcnMgZm9yIFdpbmRvd3MgOXggYW5kIE5ULiBUaGlzIG1hY3JvIGlzIGJhc2ljYWxseSBkZXJpdmVkIGZyb20KKyAqIHRoZSBDVExfQ09ERSBtYWNybyBpbiB0aGUgV2luZG93cyAyMDAwIERESywgYnV0IHdlIGhhcmQgY29kZSBpdCBoZXJlIHRvCisgKiBhdm9pZCBoYXZpbmcgdG8gI2luY2x1ZGUgYW55IG9mIHRoZSBXaW5kb3dzIDIwMDAgRERLIGhlYWRlciBmaWxlcy4gV2UgYWxzbworICogZGVmaW5lIGJvdGggYSAxNi1iaXQgYW5kIDMyLWJpdCB2ZXJzaW9uIG9mIHRoZSBjb250cm9sIGNvZGUgd2l0aGluIHRoZSBzYW1lCisgKiBtYWNybyB0byBzaW1wbGlmeSBmdXR1cmUgYWRkaXRpb25zLgorICoKKyAqIEVzc2VudGlhbGx5IHRoZSBXaW4zMiBtYWNybyB3b3VsZCBub3JtYWxseSBleHBhbmQgdG8gdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgQ1RMX0NPREUoRklMRV9ERVZJQ0VfVklERU8sMHg4MDArdmFsdWUsTUVUSE9EX0JVRkZFUkVELEZJTEVfQU5ZX0FDQ0VTUykKKyAqLworCisjZGVmaW5lIFBNSEVMUF9DVExfQ09ERShuYW1lLHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQTUhFTFBfIyNuYW1lID0gdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBNSEVMUF8jI25hbWUjIzMyID0gKCgweDIzIDw8IDE2KSB8ICgwIDw8IDE0KSB8ICgoMHg4MDArdmFsdWUpIDw8IDIpIHwgKDApKQorCit0eXBlZGVmIGVudW0geworICAgIC8qIEluY2x1ZGUgYWxsIHRoZSBjb250cm9sIGNvZGVzLiBXZSBrZWVwIHRoZW0gaW4gYSBzZXBhcmF0ZSBoZWFkZXIKKyAgICAgKiBmaWxlIHNvIHdlIGNhbiBpbmNsdWRlIHRoZW0gaW4gbXVsdGlwbGUgcGxhY2VzIHRvIG1ha2UgdGhpcworICAgICAqIG1vcmUgdmVyc2F0aWxlLgorICAgICAqLworICAgICNpbmNsdWRlICJwbV93Y3RsLmgiCisgICAgfSBQTUhFTFBfY3RsQ29kZXM7CisKKy8qIEZvciByZWFsIG1vZGUgVnhEIGNhbGxzLCB3ZSBwdXQgdGhlIGZ1bmN0aW9uIG51bWJlciBpbnRvIHRoZSBoaWdoCisgKiBvcmRlciB3b3JkIG9mIEVBWCwgYW5kIGEgdmFsdWUgb2YgMHg0RkZGIGluIEFYLiBUaGlzIGFsbG93cyBvdXIKKyAqIFZ4RCBoYW5kbGVyIHdoaWNoIGlzIHNldCB1cCB0byBoYW5kbGUgSW50IDEwJ3MgdG8gcmVjb2duaXNlIGEgbmF0aXZlCisgKiBQTUhFTFAgQVBJIGNhbGwgZnJvbSBhIHJlYWwgbW9kZSBET1MgcHJvZ3JhbS4KKyAqLworCisjaWZkZWYgIFJFQUxNT0RFCisjZGVmaW5lIEFQSV9OVU0obnVtKSAgICAoKCh1bG9uZykobnVtKSA8PCAxNikgfCAweDRGRkYpCisjZWxzZQorI2RlZmluZSBBUElfTlVNKG51bSkgICAgKG51bSkKKyNlbmRpZgorCisjZW5kaWYgIC8qICFfX09TMl9fICovCisKKyNlbmRpZiAgLyogX19QTUhFTFBfSCAqLworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1fd2N0bC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX3djdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhjMTllCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX3djdGwuaApAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMiwgT1MvMgorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIHRvIGRlZmluZSBhbGwgdGhlIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBET1MKKyogICAgICAgICAgICAgICBhbmQgV2luMzIgZGV2aWNlIGRyaXZlciBBUEkncyBmb3IgY2FsbGluZyBmcm9tIHJpbmcgMworKiAgICAgICAgICAgICAgIGludG8gdGhlIHJpbmcgMCBkZXZpY2UgZHJpdmVycy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZlcnNpb24gZnVuY3Rpb24gdXNlZCBieSBhbGwgZHJpdmVycyAqLworUE1IRUxQX0NUTF9DT0RFKEdFVFZFUiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDAwKSwKKworLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgMTYtYml0IERPUyBUU1IgKi8KK1BNSEVMUF9DVExfQ09ERShSRFJFR0IgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMyksCitQTUhFTFBfQ1RMX0NPREUoV1JSRUdCICAgICAgICAgICAgICAgICAgICAgICwweDAwMDQpLAorUE1IRUxQX0NUTF9DT0RFKFJEUkVHVyAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA1KSwKK1BNSEVMUF9DVExfQ09ERShXUlJFR1cgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwNiksCitQTUhFTFBfQ1RMX0NPREUoUkRSRUdMICAgICAgICAgICAgICAgICAgICAgICwweDAwMDgpLAorUE1IRUxQX0NUTF9DT0RFKFdSUkVHTCAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA5KSwKKworLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgV2luRGlyZWN0ICovCitQTUhFTFBfQ1RMX0NPREUoTUFQUEhZUyAgICAgICAgICAgICAgICAgICAgICwweDAwMEYpLAorUE1IRUxQX0NUTF9DT0RFKEdFVFZFU0FCVUYgICAgICAgICAgICAgICAgICAsMHgwMDEzKSwKKworLyogRnVuY3Rpb25zIHVzZWQgYnkgUE0gbGlicmFyeSAqLworUE1IRUxQX0NUTF9DT0RFKERQTUlJTlQ4NiAgICAgICAgICAgICAgICAgICAsMHgwMDE0KSwKK1BNSEVMUF9DVExfQ09ERShJTlQ4NiAgICAgICAgICAgICAgICAgICAgICAgLDB4MDAxNSksCitQTUhFTFBfQ1RMX0NPREUoSU5UODZYICAgICAgICAgICAgICAgICAgICAgICwweDAwMTYpLAorUE1IRUxQX0NUTF9DT0RFKENBTExSRUFMTU9ERSAgICAgICAgICAgICAgICAsMHgwMDE3KSwKK1BNSEVMUF9DVExfQ09ERShBTExPQ0xPQ0tFRCAgICAgICAgICAgICAgICAgLDB4MDAxOCksCitQTUhFTFBfQ1RMX0NPREUoRlJFRUxPQ0tFRCAgICAgICAgICAgICAgICAgICwweDAwMTkpLAorUE1IRUxQX0NUTF9DT0RFKEVOQUJMRUxGQkNPTUIgICAgICAgICAgICAgICAsMHgwMDFBKSwKK1BNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFIgICAgICAgICAgICAgLDB4MDAxQiksCitQTUhFTFBfQ1RMX0NPREUoTUFMTE9DU0hBUkVEICAgICAgICAgICAgICAgICwweDAwMUQpLAorUE1IRUxQX0NUTF9DT0RFKEZSRUVTSEFSRUQgICAgICAgICAgICAgICAgICAsMHgwMDFGKSwKK1BNSEVMUF9DVExfQ09ERShMT0NLREFUQVBBR0VTICAgICAgICAgICAgICAgLDB4MDAyMCksCitQTUhFTFBfQ1RMX0NPREUoVU5MT0NLREFUQVBBR0VTICAgICAgICAgICAgICwweDAwMjEpLAorUE1IRUxQX0NUTF9DT0RFKExPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgICAsMHgwMDIyKSwKK1BNSEVMUF9DVExfQ09ERShVTkxPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgLDB4MDAyMyksCitQTUhFTFBfQ1RMX0NPREUoR0VUQ0FMTEdBVEUgICAgICAgICAgICAgICAgICwweDAwMjQpLAorUE1IRUxQX0NUTF9DT0RFKFNFVENOVFBBVEggICAgICAgICAgICAgICAgICAsMHgwMDI1KSwKK1BNSEVMUF9DVExfQ09ERShHRVRQREIgICAgICAgICAgICAgICAgICAgICAgLDB4MDAyNiksCitQTUhFTFBfQ1RMX0NPREUoRkxVU0hUTEIgICAgICAgICAgICAgICAgICAgICwweDAwMjcpLAorUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUlJBTkdFICAgICAgICAsMHgwMDI4KSwKK1BNSEVMUF9DVExfQ09ERShBTExPQ1BBR0UgICAgICAgICAgICAgICAgICAgLDB4MDAyOSksCitQTUhFTFBfQ1RMX0NPREUoRlJFRVBBR0UgICAgICAgICAgICAgICAgICAgICwweDAwMkEpLAorUE1IRUxQX0NUTF9DT0RFKEVOQUJMRVJJTkczSU9QTCAgICAgICAgICAgICAsMHgwMDJCKSwKK1BNSEVMUF9DVExfQ09ERShESVNBQkxFUklORzNJT1BMICAgICAgICAgICAgLDB4MDAyQyksCitQTUhFTFBfQ1RMX0NPREUoR0FTRVRMT0NBTFBBVEggICAgICAgICAgICAgICwweDAwMkQpLAorUE1IRUxQX0NUTF9DT0RFKEdBR0VURVhQT1JUUyAgICAgICAgICAgICAgICAsMHgwMDJFKSwKK1BNSEVMUF9DVExfQ09ERShHQVRIVU5LICAgICAgICAgICAgICAgICAgICAgLDB4MDAyRiksCitQTUhFTFBfQ1RMX0NPREUoU0VUTlVDTEVVU1BBVEggICAgICAgICAgICAgICwweDAwMzApLAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmZlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaApAQCAtMCwwICsxLDExNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1BNQVBJX0gKKyNkZWZpbmUgX19QTUFQSV9ICisKKyNpbmNsdWRlICJzY2l0ZWNoLmgiCisjaW5jbHVkZSAicGNpbGliLmgiCisjaW5jbHVkZSAienRpbWVyYy5oIgorI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fT1MyX1ZERF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCBUeXBlZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogWW91IHdpbGwgbmVlZCB0byBkZWZpbmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgYmVmb3JlIHlvdSBjb21waWxlIHRoaXMKKyAqIGxpYnJhcnkgZm9yIGl0IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIERPUyBleHRlbmRlciB0aGF0IHlvdSBhcmUKKyAqIHVzaW5nIHdoZW4gY29tcGlsaW5nIGZvciBleHRlbmRlZCBET1M6CisgKgorICogICAgICBUTlQgICAgICAgICAtIFBoYXIgTGFwIFROVCBET1MgRXh0ZW5kZXIKKyAqICAgICAgRE9TNEdXICAgICAgLSBSYXRpb25hbCBET1MvNEdXLCBET1MvNEdXIFBybywgQ2F1c2V3YXkgYW5kIFBNT0RFL1cKKyAqICAgICAgREpHUFAgICAgICAgLSBESkdQUCBwb3J0IG9mIEdOVSBDKysKKyAqCisgKiBJZiBub25lIGlzIHNwZWNpZmllZCwgd2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB3aGljaCBvcGVyYXRpbmcKKyAqIHN5c3RlbSBpcyBiZWluZyB0YXJnZXR0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBkZWZpbmVkIChwcm92aWRlZCBieQorICogc2NpdGVjaC5oIGhlYWRlciBmaWxlKToKKyAqCisgKiAgICAgIF9fTVNET1MxNl9fICAgICAtIERlZmF1bHQgZm9yIDE2IGJpdCBNU0RPUyBtb2RlCisgKiAgICAgIF9fTVNET1MzMl9fICAgICAtIERlZmF1bHQgZm9yIDMyIGJpdCBNU0RPUworICogICAgICBfX1dJTkRPV1MxNl9fICAgLSBEZWZhdWx0IGZvciAxNiBiaXQgV2luZG93cworICogICAgICBfX1dJTkRPV1MzMl9fICAgLSBEZWZhdWx0IGZvciAzMiBiaXQgV2luZG93cworICoKKyAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHdpbGwgYmUgZGVmaW5lZCBhdXRvbWF0aWNhbGx5IGZvciB5b3UgdG8gc2VsZWN0CisgKiB3aGljaCBtZW1vcnkgbW9kZWwgaXMgaW4gZWZmZWN0OgorICoKKyAqICAgICAgUkVBTE1PREUgICAgLSAxNiBiaXQgcmVhbCBtb2RlIChsYXJnZSBtZW1vcnkgbW9kZWwpCisgKiAgICAgIFBNMjg2ICAgICAgIC0gMTYgcHJvdGVjdGVkIG1vZGUgKGxhcmdlIG1lbW9yeSBtb2RlbCkKKyAqICAgICAgUE0zODYgICAgICAgLSAzMiBwcm90ZWN0ZWQgbW9kZSAoZmxhdCBtZW1vcnkgbW9kZWwpCisgKi8KKworI2lmIGRlZmluZWQoX19VTklYX18pICYmICFkZWZpbmVkKF9NQVhfUEFUSCkKKyNkZWZpbmUgX01BWF9QQVRIIDI1NgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFROVCkgfHwgZGVmaW5lZChET1NYKSB8fCBkZWZpbmVkKFgzMlZNKSB8fCBkZWZpbmVkKERQTUkzMikgICAgICBcCisgICAgfHwgZGVmaW5lZChET1M0R1cpIHx8IGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoX19XSU5ET1dTMzJfXykgICAgICAgICAgXAorICAgIHx8IGRlZmluZWQoX19NU0RPUzMyX18pIHx8IGRlZmluZWQoX19VTklYX18pIHx8IGRlZmluZWQoX19XSU4zMl9WWERfXykgXAorICAgIHx8IGRlZmluZWQoX18zMkJJVF9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykgfHwgZGVmaW5lZChfX1JUVEFSR0VUX18pCisjZGVmaW5lIFBNMzg2CisjZWxpZiBkZWZpbmVkKERQTUkxNikgfHwgZGVmaW5lZChfX1dJTkRPV1MxNl9fKQorI2RlZmluZSBQTTI4NgorI2Vsc2UKKyNkZWZpbmUgUkVBTE1PREUKKyNlbmRpZgorCisjcHJhZ21hIHBhY2soMSkKKworLyogUHJvdmlkZSB0aGUgdHlwZWRlZnMgZm9yIHRoZSBQTV9pbnQzODYgZnVuY3Rpb25zLCB3aGljaCBpc3N1ZSBuYXRpdmUKKyAqIGludGVycnVwdHMgaW4gcmVhbCBvciBwcm90ZWN0ZWQgbW9kZSBhbmQgY2FuIHBhc3MgZXh0ZW5kZWQgcmVnaXN0ZXJzCisgKiBhcm91bmQuCisgKi8KKworc3RydWN0IF9QTURXT1JEUkVHUyB7CisgICAgdWxvbmcgICBlYXgsZWJ4LGVjeCxlZHgsZXNpLGVkaSxjZmxhZzsKKyAgICB9OworCitzdHJ1Y3QgX1BNV09SRFJFR1MgeworICAgIHVzaG9ydCAgYXgsYXhfaGk7CisgICAgdXNob3J0ICBieCxieF9oaTsKKyAgICB1c2hvcnQgIGN4LGN4X2hpOworICAgIHVzaG9ydCAgZHgsZHhfaGk7CisgICAgdXNob3J0ICBzaSxzaV9oaTsKKyAgICB1c2hvcnQgIGRpLGRpX2hpOworICAgIHVzaG9ydCAgY2ZsYWcsY2ZsYWdfaGk7CisgICAgfTsKKworc3RydWN0IF9QTUJZVEVSRUdTIHsKKyAgICB1Y2hhciAgIGFsLCBhaDsgdXNob3J0IGF4X2hpOworICAgIHVjaGFyICAgYmwsIGJoOyB1c2hvcnQgYnhfaGk7CisgICAgdWNoYXIgICBjbCwgY2g7IHVzaG9ydCBjeF9oaTsKKyAgICB1Y2hhciAgIGRsLCBkaDsgdXNob3J0IGR4X2hpOworICAgIH07CisKK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCAgX1BNRFdPUkRSRUdTIGU7CisgICAgc3RydWN0ICBfUE1XT1JEUkVHUyAgeDsKKyAgICBzdHJ1Y3QgIF9QTUJZVEVSRUdTICBoOworICAgIH0gUE1SRUdTOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0ICBlczsKKyAgICB1c2hvcnQgIGNzOworICAgIHVzaG9ydCAgc3M7CisgICAgdXNob3J0ICBkczsKKyAgICB1c2hvcnQgIGZzOworICAgIHVzaG9ydCAgZ3M7CisgICAgfSBQTVNSRUdTOworCisvKiBQcm92aWRlIGRlZmluaXRpb25zIGZvciB0aGUgcmVhbCBtb2RlIHJlZ2lzdGVyIHN0cnVjdHVyZXMgcGFzc2VkIHRvCisgKiB0aGUgUE1faW50ODYoKSBhbmQgUE1faW50ODZ4KCkgcm91dGluZXMuIE5vdGUgdGhhdCB3ZSBwcm92aWRlIG91ciBvd24KKyAqIGZ1bmN0aW9ucyB0byBkbyB0aGlzIGZvciAxNi1iaXQgY29kZSB0aGF0IGNhbGxzIHRoZSBQTV9pbnQzODYgZnVuY3Rpb25zLgorICovCisKK3R5cGVkZWYgUE1SRUdTICBSTVJFR1M7Cit0eXBlZGVmIFBNU1JFR1MgUk1TUkVHUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxvbmcgICAgZWRpOworICAgIGxvbmcgICAgZXNpOworICAgIGxvbmcgICAgZWJwOworICAgIGxvbmcgICAgcmVzZXJ2ZWQ7CisgICAgbG9uZyAgICBlYng7CisgICAgbG9uZyAgICBlZHg7CisgICAgbG9uZyAgICBlY3g7CisgICAgbG9uZyAgICBlYXg7CisgICAgc2hvcnQgICBmbGFnczsKKyAgICBzaG9ydCAgIGVzLGRzLGZzLGdzLGlwLGNzLHNwLHNzOworICAgIH0gRFBNSV9yZWdzOworCisjaWZkZWYgIF9fTVNET1NfXworLyogUmVnaXN0ZXIgc3RydWN0dXJlIHBhc3NlZCB0byBQTV9WeERDYWxsIGZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBlYXg7CisgICAgdWxvbmcgICBlYng7CisgICAgdWxvbmcgICBlY3g7CisgICAgdWxvbmcgICBlZHg7CisgICAgdWxvbmcgICBlc2k7CisgICAgdWxvbmcgICBlZGk7CisgICAgdXNob3J0ICBkcyxlczsKKyAgICB9IFZYRF9yZWdzOworI2VuZGlmCisKKyNkZWZpbmUgUE1fTUFYX0RSSVZFICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUE1fTUFYX1BBVEggICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBQTV9GSUxFX0lOVkFMSUQgICAgICAgICAgICAgKHZvaWQqKTB4RkZGRkZGRkYKKworLyogU3RydWN0dXJlIGZvciBnZW5lcmljIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYW5kIG1hbmFnZW1lbnQuIEFsc28gdGhlIHNhbWUKKyAqIHZhbHVlcyBhcmUgcGFzc2VkIHRvIFBNX3NldEZpbGVBdHRyIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgIGR3U2l6ZTsKKyAgICB1bG9uZyAgIGF0dHJpYjsKKyAgICB1bG9uZyAgIHNpemVMbzsKKyAgICB1bG9uZyAgIHNpemVIaTsKKyAgICBjaGFyICAgIG5hbWVbUE1fTUFYX1BBVEhdOworICAgIH0gUE1fZmluZERhdGE7CisKKy8qIE1hY3JvIHRvIGNvbXB1dGUgdGhlIGJ5dGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSB0eXBlICovCisKKyNkZWZpbmUgUE1fRklFTERfT0ZGU0VUKHR5cGUsZmllbGQpICgobG9uZykmKCgodHlwZSopMCktPmZpZWxkKSkKKworLyogTWFyY3RvIHRvIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJhc2Ugb2YgdGhlIHN0cnVjdHVyZSBnaXZlbiBpdHMgdHlwZSwKKyAqIGFuZCBhbiBhZGRyZXNzIG9mIGEgZmllbGQgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuCisgKi8KKworI2RlZmluZSBQTV9DT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkgICAgICBcCisgICAgKCh0eXBlKikoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY2hhciopKGFkZHJlc3MpIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjaGFyKikoJigodHlwZSopMCktPmZpZWxkKSkpCisKKy8qIEZsYWdzIHN0b3JlZCBpbiB0aGUgUE1fZmluZERhdGEgc3RydWN0dXJlLCBhbmQgYWxzbyB2YWx1ZXMgcGFzc2VkIHRvCisgKiBQTV9zZXRGaWxlQXR0ciB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcy4KKyAqLworCisjZGVmaW5lIFBNX0ZJTEVfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBNX0ZJTEVfUkVBRE9OTFkgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFBNX0ZJTEVfRElSRUNUT1JZICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBNX0ZJTEVfQVJDSElWRSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBNX0ZJTEVfSElEREVOICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBNX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAweDAwMDAwMDEwCisKKy8qIEZsYWdzIHJldHVybmVkIGJ5IHRoZSBQTV9zcGxpdHBhdGggZnVuY3Rpb24gKi8KKworI2RlZmluZSBQTV9IQVNfV0lMRENBUkRTIDB4MDEKKyNkZWZpbmUgUE1fSEFTX0VYVEVOU0lPTiAweDAyCisjZGVmaW5lIFBNX0hBU19GSUxFTkFNRSAgMHgwNAorI2RlZmluZSBQTV9IQVNfRElSRUNUT1JZIDB4MDgKKyNkZWZpbmUgUE1fSEFTX0RSSVZFICAgICAweDEwCisKKy8qIFN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIFBNX3NldEZpbGVUaW1lIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0ICAgc2VjOyAgICAgICAgLyogU2Vjb25kcyAqLworICAgIHNob3J0ICAgbWluOyAgICAgICAgLyogTWludXRlcyAqLworICAgIHNob3J0ICAgaG91cjsgICAgICAgLyogSG91ciAoMC0tMjMpICovCisgICAgc2hvcnQgICBkYXk7ICAgICAgICAvKiBEYXkgb2YgbW9udGggKDEtLTMxKSAqLworICAgIHNob3J0ICAgbW9uOyAgICAgICAgLyogTW9udGggKDAtLTExKSAqLworICAgIHNob3J0ICAgeWVhcjsgICAgICAgLyogWWVhciAoY2FsZW5kYXIgeWVhciBtaW51cyAxOTAwKSAqLworICAgIH0gUE1fdGltZTsKKworLyogRGVmaW5lIGEgbWFjcm8gZm9yIGNyZWF0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzc2VzIGZyb20gc2VnbWVudDpvZmZzZXQgKi8KKworI2RlZmluZSBNS19QSFlTKHMsbykgICgoKHVsb25nKShzKSA8PCA0KSArICh1bG9uZykobykpCisKKy8qIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVzIHN1cHBvcnRlZC4gVGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZQorICogdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgYXQgcnVudGltZSB3aGljaCB3aWxsIGNvbnRhaW4KKyAqIG9uZSBvZiB0aGVzZSB2YWx1ZXMuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBQTV9yZWFsTW9kZSwKKyAgICBQTV8yODYsCisgICAgUE1fMzg2CisgICAgfSBQTV9tb2RlX2VudW07CisKKy8qIERlZmluZSB0eXBlcyBwYXNzZWQgdG8gUE1fZW5hYmxlV3JpdGVDb21iaW5lICovCisKKyNkZWZpbmUgUE1fTVRSUl9VTkNBQ0hBQkxFICAwCisjZGVmaW5lIFBNX01UUlJfV1JDT01CICAgICAgMQorI2RlZmluZSBQTV9NVFJSX1dSVEhST1VHSCAgIDQKKyNkZWZpbmUgUE1fTVRSUl9XUlBST1QgICAgICA1CisjZGVmaW5lIFBNX01UUlJfV1JCQUNLICAgICAgNgorI2RlZmluZSBQTV9NVFJSX01BWCAgICAgICAgIDYKKworLyogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgUE1fZW5hYmxlV3JpdGVDb21iaW5lICovCisKKyNkZWZpbmUgUE1fTVRSUl9FUlJfT0sgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBNX01UUlJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgLTEKKyNkZWZpbmUgUE1fTVRSUl9FUlJfUEFSQU1TICAgICAgICAgICAgICAtMgorI2RlZmluZSBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQgICAgIC0zCisjZGVmaW5lIFBNX01UUlJfRVJSX0JFTE9XXzFNQiAgICAgICAgICAgLTQKKyNkZWZpbmUgUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQgICAgICAgICAtNQorI2RlZmluZSBQTV9NVFJSX0VSUl9PVkVSTEFQICAgICAgICAgICAgIC02CisjZGVmaW5lIFBNX01UUlJfRVJSX1RZUEVfTUlTTUFUQ0ggICAgICAgLTcKKyNkZWZpbmUgUE1fTVRSUl9FUlJfTk9ORV9GUkVFICAgICAgICAgICAtOAorI2RlZmluZSBQTV9NVFJSX0VSUl9OT1dSQ09NQiAgICAgICAgICAgIC05CisjZGVmaW5lIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQgICAgICAgLTEwCisKKy8qIFZhbHVlcyBwYXNzZWQgdG8gdGhlIFBNX0RNQUNQcm9ncmFtIGZ1bmN0aW9uICovCisKKyNkZWZpbmUgUE1fRE1BX1JFQURfT05FU0hPVCAgICAgMHg0NCAgICAvKiBPbmUtc2hvdCBETUEgcmVhZCAgICAgICAgKi8KKyNkZWZpbmUgUE1fRE1BX1dSSVRFX09ORVNIT1QgICAgMHg0OCAgICAvKiBPbmUtc2hvdCBETUEgd3JpdGUgICAgICAgKi8KKyNkZWZpbmUgUE1fRE1BX1JFQURfQVVUT0lOSVQgICAgMHg1NCAgICAvKiBBdXRvLWluaXQgRE1BIHJlYWQgICAgICAgKi8KKyNkZWZpbmUgUE1fRE1BX1dSSVRFX0FVVE9JTklUICAgMHg1OCAgICAvKiBBdXRvLWluaXQgRE1BIHdyaXRlICAgICAgKi8KKworLyogRmxhZ3MgcGFzc2VkIHRvIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgKi8KKworI2RlZmluZSBQTV9ERUFDVElWQVRFICAgICAgIDEKKyNkZWZpbmUgUE1fUkVBQ1RJVkFURSAgICAgICAyCisKKy8qIFJldHVybiBjb2RlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gcmV0dXJuIGZyb20gdGhlIHN1c3BlbmQgYXBwbGljYXRpb24KKyAqIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCB0aGUgUE0gbGlicmFyeS4gU2VlIHRoZSBNR0wgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2RlZmluZSBQTV9TVVNQRU5EX0FQUCAgICAgIDAKKyNkZWZpbmUgUE1fTk9fU1VTUEVORF9BUFAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB0eXBlIHZhbHVlcyBwYXNzZWQgdG8gdGhlIFBNX2FncFJlc2VydmVQaHlzaWNhbAorZnVuY3Rpb24sIHRvIGRlZmluZSBob3cgdGhlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHNob3VsZCBiZSBoYW5kbGVkLgorCitUaGUgUE1fYWdwVW5jYWNoZWQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgYXMKK3VuY2FjaGVkIG1lbW9yeS4KKworVGhlIFBNX2FncFdyaXRlQ29tYmluZSB0eXBlIGluZGljYXRlcyB0aGF0IHdyaXRlIGNvbWJpbmluZyBzaG91bGQgYmUgZW5hYmxlZAorZm9yIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nLiBUaGlzIGlzIHVzZWQgZm9yIGZyYW1lYnVmZmVyIHdyaXRlIGNvbWJpbmcgYW5kCitzcGVlZHMgdXAgZGlyZWN0IGZyYW1lYnVmZmVyIHdyaXRlcyB0byB0aGUgbWVtb3J5LgorCitUaGUgUE1fYWdwSW50ZWxEQ0FDSEUgdHlwZSBpbmRpY2F0ZXMgdGhhdCBtZW1vcnkgc2hvdWxkIGNvbWUgZnJvbSB0aGUgSW50ZWwKK2k4MXggRGlzcGxheSBDYWNoZSAob3IgRENBQ0hFKSBtZW1vcnkgcG9vbC4gVGhpcyBmbGFnIGlzIHNwZWNpZmljIHRvIHRoZQorSW50ZWwgaTgxMCBhbmQgaTgxNSBjb250cm9sbGVycywgYW5kIHNob3VsZCBub3QgYmUgcGFzc2VkIGZvciBhbnkgb3RoZXIKK2NvbnRyb2xsZXIgdHlwZS4KKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorUE1fYWdwVW5jYWNoZWQgICAgICAtIEluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGJlIHVuY2FjaGVkCitQTV9hZ3BXcml0ZUNvbWJpbmUgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSBzaG91bGQgYmUgd3JpdGUgY29tYmluZWQKK1BNX2FncEludGVsRENBQ0hFICAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBjb21lIGZyb20gRENBQ0hFIHBvb2wKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIFBNX2FncFVuY2FjaGVkLAorICAgIFBNX2FncFdyaXRlQ29tYmluZSwKKyAgICBQTV9hZ3BJbnRlbERDQUNIRQorICAgIH0gUE1fYWdwTWVtb3J5VHlwZTsKKworLyogRGVmaW5lcyB0aGUgc2l6ZSBvZiBhbiBzeXN0ZW0gbWVtb3J5IHBhZ2UgKi8KKworI2RlZmluZSBQTV9QQUdFX1NJWkUgICAgICAgIDQwOTYKKworLyogVHlwZSBkZWZpbml0aW9uIGZvciBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBQTV9waHlzQWRkcjsKKworLyogRGVmaW5lIGEgYmFkIHBoeXNpY2FsIGFkZHJlc3MgcmV0dXJuZWQgYnkgbWFwIHBoeXNpY2FsIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIFBNX0JBRF9QSFlTX0FERFJFU1MgMHhGRkZGRkZGRgorCisvKiBUeXBlIGRlZmluaXRpb24gZm9yIHRoZSAxMi1ieXRlIGxvY2sgaGFuZGxlIGZvciBsb2NraW5nIGxpbmVhciBtZW1vcnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nICAgaFszXTsKKyAgICB9IFBNX2xvY2tIYW5kbGU7CisKKy8qICdDJyBjYWxsaW5nIGNvbnZlbnRpb25zIGFsd2F5cyAgICAgICAqLworCisjZGVmaW5lIFBNQVBJICAgX0FTTUFQSQorI2RlZmluZSBQTUFQSVAgIF9BU01BUElQCisKKy8qIEludGVybmFsIHR5cGVkZWYgdG8gb3ZlcnJpZGUgRFBNSV9pbnQ4NiBoYW5kbGVyICovCisKK3R5cGVkZWYgaWJvb2wgKFBNQVBJUCBEUE1JX2hhbmRsZXJfdCkoRFBNSV9yZWdzICpyZWdzKTsKK3ZvaWQgUE1BUEkgRFBNSV9zZXRJbnQxMEhhbmRsZXIoRFBNSV9oYW5kbGVyX3QgaGFuZGxlcik7CisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGEgd2luZG93IGhhbmRsZSBmb3IgY29uc29sZSBtb2RlcyAqLworCisjaWYgICAgIGRlZmluZWQoX19EUklWRVJfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCit0eXBlZGVmIHZvaWQgICAgICAgICpQTV9IV05EOyAgIC8qIFBvaW50ZXIgZm9yIHBvcnRhYmxlIGRyaXZlcnMgICAgICAgICAqLwordHlwZWRlZiB2b2lkICAgICAgICAqUE1fTU9EVUxFOyAvKiBNb2R1bGUgaGFuZGxlIGZvciBwb3J0YWJsZSBkcml2ZXJzICAgKi8KKyNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1NfXykKKyNpZmRlZiAgREVDTEFSRV9IQU5ETEUKK3R5cGVkZWYgSFdORCAgICAgICAgUE1fSFdORDsgICAgLyogUmVhbCB3aW5kb3cgaGFuZGxlICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIEhJTlNUQU5DRSAgIFBNX01PRFVMRTsgIC8qIFdpbjMyIERMTCBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAqLworI2Vsc2UKK3R5cGVkZWYgdm9pZCAgICAgICAgKlBNX0hXTkQ7ICAgLyogUGxhY2UgaG9sZGVyIGlmIHdpbmRvd3MuaCBub3QgaW5jbHVkZWQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKlBNX01PRFVMRTsgLyogUGxhY2UgaG9sZGVyIGlmIHdpbmRvd3MuaCBub3QgaW5jbHVkZWQgKi8KKyNlbmRpZgorI2VsaWYgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdpbmRvdyAgICAgICp3aW5kb3c7CisgICAgRGlzcGxheSAgICAgKmRpc3BsYXk7CisgICAgfSBQTV9IV05EOyAgICAgICAgICAgICAgICAgIC8qIFgxMSB3aW5kb3cgaGFuZGxlICovCisjZWxpZiAgIGRlZmluZWQoX19PUzJfXykKK3R5cGVkZWYgdm9pZCAgICAqUE1fSFdORDsKK3R5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOworI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKK3R5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogQ29uc29sZSBpZCBmb3IgZnVsbHNjcmVlbiBMaW51eCAqLwordHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7CisjZWxpZiAgIGRlZmluZWQoX19RTlhfXykKK3R5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogQ29uc29sZSBpZCBmb3IgZnVsbHNjcmVlbiBRTlggKi8KK3R5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOworI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKK3R5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIFJUVGFyZ2V0LTMyICovCit0eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKKyNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKK3R5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gRE9TICovCit0eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsgICAgIC8qIFBsYWNlaG9sZGVyIGZvciBmdWxsc2NyZWVuIERPUyAqLworI2VsaWYgICBkZWZpbmVkKF9fU01YMzJfXykKK3R5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gU01YICovCit0eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKKyNlbGlmICAgZGVmaW5lZChfX1NOQVBfXykKK3R5cGVkZWYgdm9pZCAgICAqUE1fSFdORDsKK3R5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOworI2Vsc2UKKyNlcnJvciAgUE0gbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQorI2VuZGlmCisKKy8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgY29kZSBwb2ludGVycyAqLworCit0eXBlZGVmIHZvaWQgKCpfX2NvZGVQdHIpKCk7CisKKy8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBDIGJhc2VkIGludGVycnVwdCBoYW5kbGVyICovCisKK3R5cGVkZWYgdm9pZCAoUE1BUElQIFBNX2ludEhhbmRsZXIpKHZvaWQpOwordHlwZWRlZiBpYm9vbCAoUE1BUElQIFBNX2lycUhhbmRsZXIpKHZvaWQpOworCisvKiBIYXJkd2FyZSBJUlEgaGFuZGxlIHVzZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgaGFyZHdhcmUgSVJRICovCisKK3R5cGVkZWYgdm9pZCAqUE1fSVJRSGFuZGxlOworCisvKiBUeXBlIGRlZmluaXRpb24gZm9yIHRoZSBmYXRhbCBjbGVhbnVwIGhhbmRsZXIgKi8KKwordHlwZWRlZiB2b2lkIChQTUFQSVAgUE1fZmF0YWxDbGVhbnVwSGFuZGxlcikodm9pZCk7CisKKy8qIFR5cGUgZGVmaWZpbml0aW9uIGZvciBzYXZlIHN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKK3R5cGVkZWYgaW50IChQTUFQSVAgUE1fc2F2ZVN0YXRlX2NiKShpbnQgZmxhZ3MpOworCisvKiBUeXBlIGRlZmluaW50aW9uIGZvciBlbnVtIHdyaXRlIGNvbWJpbmVkIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKK3R5cGVkZWYgdm9pZCAoUE1BUElQIFBNX2VudW1Xcml0ZUNvbWJpbmVfdCkodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKKworLyogU3RydWN0dXJlIGRlZmluaW5nIGFsbCB0aGUgUE0gQVBJIGZ1bmN0aW9ucyBhcyBleHBvcnRlZCB0bworICogdGhlIGJpbmFyeSBwb3J0YWJsZSBETEwncy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBkd1NpemU7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2dldE1vZGVUeXBlKSh2b2lkKTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fZ2V0QklPU1BvaW50ZXIpKHZvaWQpOworICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRBMDAwMFBvaW50ZXIpKHZvaWQpOworICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYXBQaHlzaWNhbEFkZHIpKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpOworICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYWxsb2NTaGFyZWQpKGxvbmcgc2l6ZSk7CisgICAgdm9pZCAqICByZXNlcnZlZDE7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVTaGFyZWQpKHZvaWQgKnB0cik7CisgICAgdm9pZCAqICAoUE1BUElQIFBNX21hcFRvUHJvY2Vzcykodm9pZCAqbGluZWFyLHVsb25nIGxpbWl0KTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fbWFwUmVhbFBvaW50ZXIpKHVpbnQgcl9zZWcsdWludCByX29mZik7CisgICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jUmVhbFNlZykodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVJlYWxTZWcpKHZvaWQgKm1lbSk7CisgICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jTG9ja2VkTWVtKSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZyk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVMb2NrZWRNZW0pKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9jYWxsUmVhbE1vZGUpKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOworICAgIGludCAgICAgKFBNQVBJUCBQTV9pbnQ4NikoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2ludDg2eCkoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCxSTVNSRUdTICpzcmVncyk7CisgICAgdm9pZCAgICAoUE1BUElQIERQTUlfaW50ODYpKGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fYXZhaWxhYmxlTWVtb3J5KSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fZ2V0VkVTQUJ1ZikodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZik7CisgICAgbG9uZyAgICAoUE1BUElQIFBNX2dldE9TVHlwZSkodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2ZhdGFsRXJyb3IpKGNvbnN0IGNoYXIgKm1zZyk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEJhbmtBKShpbnQgYmFuayk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEJhbmtBQikoaW50IGJhbmspOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRDUlRTdGFydCkoaW50IHgsaW50IHksaW50IHdhaXRWUlQpOworICAgIGNoYXIgKiAgKFBNQVBJUCBQTV9nZXRDdXJyZW50UGF0aCkoY2hhciAqcGF0aCxpbnQgbWF4TGVuKTsKKyAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXRWQkVBRlBhdGgpKHZvaWQpOworICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE51Y2xldXNQYXRoKSh2b2lkKTsKKyAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCkodm9pZCk7CisgICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0VW5pcXVlSUQpKHZvaWQpOworICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE1hY2hpbmVOYW1lKSh2b2lkKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgVkZfYXZhaWxhYmxlKSh2b2lkKTsKKyAgICB2b2lkICogIChQTUFQSVAgVkZfaW5pdCkodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKTsKKyAgICB2b2lkICAgIChQTUFQSVAgVkZfZXhpdCkodm9pZCk7CisgICAgUE1fSFdORCAoUE1BUElQIFBNX29wZW5Db25zb2xlKShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKTsKKyAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSkodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX3NhdmVDb25zb2xlU3RhdGUpKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fY2xvc2VDb25zb2xlKShQTV9IV05EIGh3bmRDb25zb2xlKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbikoaW50IHgsaW50IHkpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRPU1NjcmVlbldpZHRoKShpbnQgd2lkdGgsaW50IGhlaWdodCk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2VuYWJsZVdyaXRlQ29tYmluZSkodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fYmFja3NsYXNoKShjaGFyICpmaWxlbmFtZSk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2xvY2tEYXRhUGFnZXMpKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX3VubG9ja0RhdGFQYWdlcykodm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKKyAgICBpbnQgICAgIChQTUFQSVAgUE1fbG9ja0NvZGVQYWdlcykoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX3VubG9ja0NvZGVQYWdlcykoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7CisgICAgaWJvb2wgICAoUE1BUElQIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKShQTV9pbnRIYW5kbGVyIGloLGludCBmcmVxdWVuY3kpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KShpbnQgZnJlcXVlbmN5KTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKSh2b2lkKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1fZG9CSU9TUE9TVCkodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICpCSU9TUHRyLHVsb25nIEJJT1NMZW4pOworICAgIGNoYXIgICAgKFBNQVBJUCBQTV9nZXRCb290RHJpdmUpKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlUGh5c2ljYWxBZGRyKSh2b2lkICpwdHIsdWxvbmcgbGltaXQpOworICAgIHVjaGFyICAgKFBNQVBJUCBQTV9pbnBiKShpbnQgcG9ydCk7CisgICAgdXNob3J0ICAoUE1BUElQIFBNX2lucHcpKGludCBwb3J0KTsKKyAgICB1bG9uZyAgIChQTUFQSVAgUE1faW5wZCkoaW50IHBvcnQpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwYikoaW50IHBvcnQsdWNoYXIgdmFsKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fb3V0cHcpKGludCBwb3J0LHVzaG9ydCB2YWwpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwZCkoaW50IHBvcnQsdWxvbmcgdmFsKTsKKyAgICB2b2lkICogIHJlc2VydmVkMjsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKShQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1faGF2ZUJJT1NBY2Nlc3MpKHZvaWQpOworICAgIGludCAgICAgKFBNQVBJUCBQTV9rYmhpdCkodm9pZCk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2dldGNoKSh2b2lkKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1fZmluZEJQRCkoY29uc3QgY2hhciAqZGxsbmFtZSxjaGFyICpicGRwYXRoKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgUE1fZ2V0UGh5c2ljYWxBZGRyKSh2b2lkICpwKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fc2xlZXApKHVsb25nIG1pbGxpc2Vjb25kcyk7CisgICAgaW50ICAgICAoUE1BUElQIFBNX2dldENPTVBvcnQpKGludCBwb3J0KTsKKyAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0TFBUUG9ydCkoaW50IHBvcnQpOworICAgIFBNX01PRFVMRSAoUE1BUElQIFBNX2xvYWRMaWJyYXJ5KShjb25zdCBjaGFyICpzekRMTE5hbWUpOworICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRQcm9jQWRkcmVzcykoUE1fTU9EVUxFIGhNb2R1bGUsY29uc3QgY2hhciAqc3pQcm9jTmFtZSk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVMaWJyYXJ5KShQTV9NT0RVTEUgaE1vZHVsZSk7CisgICAgaW50ICAgICAoUE1BUElQIFBDSV9lbnVtZXJhdGUpKFBDSURldmljZUluZm8gaW5mb1tdKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgUENJX2FjY2Vzc1JlZykoaW50IGluZGV4LHVsb25nIHZhbHVlLGludCBmdW5jLFBDSURldmljZUluZm8gKmluZm8pOworICAgIGlib29sICAgKFBNQVBJUCBQQ0lfc2V0SGFyZHdhcmVJUlEpKFBDSURldmljZUluZm8gKmluZm8sdWludCBpbnRQaW4sdWludCBJUlEpOworICAgIHZvaWQgICAgKFBNQVBJUCBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSkodWludCBidXMsdWxvbmcgc3BlY2lhbEN5Y2xlRGF0YSk7CisgICAgdm9pZCAqICByZXNlcnZlZDM7CisgICAgdWxvbmcgICAoUE1BUElQIFBDSUJJT1NfZ2V0RW50cnkpKHZvaWQpOworICAgIHVpbnQgICAgKFBNQVBJUCBDUFVfZ2V0UHJvY2Vzc29yVHlwZSkodm9pZCk7CisgICAgaWJvb2wgICAoUE1BUElQIENQVV9oYXZlTU1YKSh2b2lkKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmUzRE5vdykodm9pZCk7CisgICAgaWJvb2wgICAoUE1BUElQIENQVV9oYXZlU1NFKSh2b2lkKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVSRFRTQykodm9pZCk7CisgICAgdWxvbmcgICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JTcGVlZCkoaWJvb2wgYWNjdXJhdGUpOworICAgIHZvaWQgICAgKFBNQVBJUCBaVGltZXJJbml0KSh2b2lkKTsKKyAgICB2b2lkICAgIChQTUFQSVAgTFpUaW1lck9uKSh2b2lkKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckxhcCkodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPZmYpKHZvaWQpOworICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyQ291bnQpKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT25FeHQpKExaVGltZXJPYmplY3QgKnRtKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckxhcEV4dCkoTFpUaW1lck9iamVjdCAqdG0pOworICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT2ZmRXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7CisgICAgdWxvbmcgICAoUE1BUElQIExaVGltZXJDb3VudEV4dCkoTFpUaW1lck9iamVjdCAqdG0pOworICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lck9uKSh2b2lkKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgVUxaVGltZXJMYXApKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lck9mZikodm9pZCk7CisgICAgdWxvbmcgICAoUE1BUElQIFVMWlRpbWVyQ291bnQpKHZvaWQpOworICAgIHVsb25nICAgKFBNQVBJUCBVTFpSZWFkVGltZSkodm9pZCk7CisgICAgdWxvbmcgICAoUE1BUElQIFVMWkVsYXBzZWRUaW1lKSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpOworICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lclJlc29sdXRpb24pKHVsb25nICpyZXNvbHV0aW9uKTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fZmluZEZpcnN0RmlsZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1fZmluZE5leHRGaWxlKSh2b2lkICpoYW5kbGUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fZmluZENsb3NlKSh2b2lkICpoYW5kbGUpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9tYWtlcGF0aCkoY2hhciAqcCxjb25zdCBjaGFyICpkcml2ZSxjb25zdCBjaGFyICpkaXIsY29uc3QgY2hhciAqbmFtZSxjb25zdCBjaGFyICpleHQpOworICAgIGludCAgICAgKFBNQVBJUCBQTV9zcGxpdHBhdGgpKGNvbnN0IGNoYXIgKmZuLGNoYXIgKmRyaXZlLGNoYXIgKmRpcixjaGFyICpuYW1lLGNoYXIgKmV4dCk7CisgICAgaWJvb2wgICAoUE1BUElQIFBNX2RyaXZlVmFsaWQpKGNoYXIgZHJpdmUpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9nZXRkY3dkKShpbnQgZHJpdmUsY2hhciAqZGlyLGludCBsZW4pOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRGaWxlQXR0cikoY29uc3QgY2hhciAqZmlsZW5hbWUsdWludCBhdHRyaWIpOworICAgIGlib29sICAgKFBNQVBJUCBQTV9ta2RpcikoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIGlib29sICAgKFBNQVBJUCBQTV9ybWRpcikoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIHVpbnQgICAgKFBNQVBJUCBQTV9nZXRGaWxlQXR0cikoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIGlib29sICAgKFBNQVBJUCBQTV9nZXRGaWxlVGltZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ210VGltZSxQTV90aW1lICp0aW1lKTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1fc2V0RmlsZVRpbWUpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLGlib29sIGdtdFRpbWUsUE1fdGltZSAqdGltZSk7CisgICAgY2hhciAqICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JOYW1lKSh2b2lkKTsKKyAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0VkdBU3RhdGVTaXplKSh2b2lkKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fc2F2ZVZHQVN0YXRlKSh2b2lkICpzdGF0ZUJ1Zik7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX3Jlc3RvcmVWR0FTdGF0ZSkoY29uc3Qgdm9pZCAqc3RhdGVCdWYpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV92Z2FCbGFua0Rpc3BsYXkpKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV92Z2FVbmJsYW5rRGlzcGxheSkodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2Jsb2NrVW50aWxUaW1lb3V0KSh1bG9uZyBtaWxsaXNlY29uZHMpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fYWRkNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc3ViNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fbXVsNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fZGl2NjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc2hyNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKKyAgICB2b2lkICAgIChQTUFQSVAgX1BNX3NhcjY0KSh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX19pNjQgKnJlc3VsdCk7CisgICAgdm9pZCAgICAoUE1BUElQIF9QTV9zaGw2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOworICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fbmVnNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9faTY0ICpyZXN1bHQpOworICAgIHVsb25nICAgKFBNQVBJUCBQQ0lfZmluZEJBUlNpemUpKGludCBiYXIsUENJRGV2aWNlSW5mbyAqcGNpKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUENJX3JlYWRSZWdCbG9jaykoUENJRGV2aWNlSW5mbyAqaW5mbyxpbnQgaW5kZXgsdm9pZCAqZHN0LGludCBjb3VudCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBDSV93cml0ZVJlZ0Jsb2NrKShQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpzcmMsaW50IGNvdW50KTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fZmx1c2hUTEIpKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV91c2VMb2NhbE1hbGxvYykodm9pZCAqICgqbWFsbG9jKShzaXplX3Qgc2l6ZSksdm9pZCAqICgqY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpLHZvaWQgKiAoKnJlYWxsb2MpKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSksdm9pZCAoKmZyZWUpKHZvaWQgKnApKTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fbWFsbG9jKShzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCAqICAoUE1BUElQIFBNX2NhbGxvYykoc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKKyAgICB2b2lkICogIChQTUFQSVAgUE1fcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZSkodm9pZCAqcCk7CisgICAgaWJvb2wgICAoUE1BUElQIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpOworICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9hbGxvY1BhZ2UpKGlib29sIGxvY2tlZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVQYWdlKSh2b2lkICpwKTsKKyAgICB1bG9uZyAgIChQTUFQSVAgUE1fYWdwSW5pdCkodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX2FncEV4aXQpKHZvaWQpOworICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwpKHVsb25nIG51bVBhZ2VzLGludCB0eXBlLHZvaWQgKipwaHlzQ29udGV4dCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOworICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwpKHZvaWQgKnBoeXNDb250ZXh0KTsKKyAgICBpYm9vbCAgIChQTUFQSVAgUE1fYWdwQ29tbWl0UGh5c2ljYWwpKHZvaWQgKnBoeXNDb250ZXh0LHVsb25nIG51bVBhZ2VzLHVsb25nIHN0YXJ0T2Zmc2V0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7CisgICAgaWJvb2wgICAoUE1BUElQIFBNX2FncEZyZWVQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQpOworICAgIGludCAgICAgKFBNQVBJUCBQQ0lfZ2V0TnVtRGV2aWNlcykodm9pZCk7CisgICAgdm9pZCAgICAoUE1BUElQIFBNX3NldExvY2FsQlBEUGF0aCkoY29uc3QgY2hhciAqcGF0aCk7CisgICAgdm9pZCAqICAoUE1BUElQIFBNX2xvYWREaXJlY3REcmF3KShpbnQgZGV2aWNlKTsKKyAgICB2b2lkICAgIChQTUFQSVAgUE1fdW5sb2FkRGlyZWN0RHJhdykoaW50IGRldmljZSk7CisgICAgUE1fSFdORCAoUE1BUElQIFBNX2dldERpcmVjdERyYXdXaW5kb3cpKHZvaWQpOworICAgIHZvaWQgICAgKFBNQVBJUCBQTV9kb1N1c3BlbmRBcHApKHZvaWQpOworICAgIH0gUE1faW1wb3J0czsKKworI3ByYWdtYSBwYWNrKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisjaWZkZWYgIF9fV0lOMzJfVlhEX18KKyNkZWZpbmUgVkVTQV9CVUZfU0laRSAxMDI0CitleHRlcm4gdWNoYXIgKl9QTV9ybUJ1ZkFkZHI7CisjZW5kaWYKKworLyoge3NlY3JldH0gUG9pbnRlciB0byBnbG9iYWwgZXhwb3J0cyBzdHJ1Y3R1cmUuCisgKiBTaG91bGQgbm90IGJlIHVzZWQgYnkgYXBwbGljYXRpb24gcHJvZ3JhbXMuCisgKi8KK2V4dGVybiBQTV9pbXBvcnRzIF9WQVJBUEkgX1BNX2ltcG9ydHM7CisKKy8qIHtzZWNyZXR9ICovCitleHRlcm4gdm9pZCAqICgqX19QTV9tYWxsb2MpKHNpemVfdCBzaXplKTsKKy8qIHtzZWNyZXR9ICovCitleHRlcm4gdm9pZCAqICgqX19QTV9jYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSk7CisvKiB7c2VjcmV0fSAqLworZXh0ZXJuIHZvaWQgKiAoKl9fUE1fcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKTsKKy8qIHtzZWNyZXR9ICovCitleHRlcm4gdm9pZCAoKl9fUE1fZnJlZSkodm9pZCAqcCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJvdXRpbmUgdG8gaW5pdGlhbGlzZSB0aGUgaG9zdCBzaWRlIFBNIGxpYnJhcnkuIE5vdGUgdXNlZCBmcm9tIERMTCdzICovCisKK3ZvaWQgICAgUE1BUEkgUE1faW5pdCh2b2lkKTsKKworLyogUm91dGluZSB0byByZXR1cm4gZWl0aGVyIFBNX3JlYWxNb2RlLCBQTV8yODYgb3IgUE1fMzg2ICovCisKK2ludCAgICAgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCk7CisKKy8qIFJvdXRpbmUgdG8gcmV0dXJuIGEgc2VsZWN0b3IgdG8gdGhlIEJJT1MgZGF0YSBhcmVhIGF0IHNlZ21lbnQgMHg0MCAqLworCit2b2lkICogIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpOworCisvKiBSb3V0aW5lIHRvIHJldHVybiBhIGxpbmVhciBwb2ludGVyIHRvIHRoZSBWR0EgZnJhbWUgYnVmZmVyIG1lbW9yeSAqLworCit2b2lkICogIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKTsKKworLyogUm91dGluZXMgdG8gbWFwL2ZyZWUgcGh5c2ljYWwgbWVtb3J5IGludG8gdGhlIGN1cnJlbnQgRFMgc2VnbWVudC4gSW4KKyAqIHNvbWUgZW52aXJvbm1lbnRzICgzMi1iaXQgRE9TIGlzIG9uZSksIGFmdGVyIHRoZSBtYXBwaW5nIGhhcyBiZWVuCisgKiBhbGxvY2F0ZWQsIGl0IGNhbm5vdCBiZSBmcmVlZC4gSGVuY2UgeW91IHNob3VsZCBvbmx5IGFsbG9jYXRlIHRoZQorICogbWFwcGluZyBvbmNlIGFuZCBjYWNoZSB0aGUgdmFsdWUgZm9yIHVzZSBieSBvdGhlciBwYXJ0cyBvZiB5b3VyCisgKiBhcHBsaWNhdGlvbi4gSWYgdGhlIG1hcHBpbmcgY2Fubm90IGJlIGNyZWF0ZWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHJldHVybiBhIE5VTEwgcG9pbnRlci4KKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBhbHNvIHdvcmsgZm9yIG1lbW9yeSBhZGRyZXNzZXMgYmVsb3cgMU1iLCBidXQgdGhlCisgKiBtYXBwZWQgYWRkcmVzcyBjYW5ub3QgY3Jvc3MgdGhlIDFNYiBib3VuZGFyeS4KKyAqLworCit2b2lkICogIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKTsKK3ZvaWQgICAgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpOworCisvKiBSb3V0aW5lIHRvIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBhZGRyZXNzLiBJdCBpcworICogdXAgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgdGhlIGVudGlyZSBhZGRyZXNzIHJhbmdlIGZvciBhIGxpbmVhcgorICogYmxvY2sgb2YgbWVtb3J5IGlzIHBhZ2UgYWxpZ25lZCBpZiB0aGF0IGlzIHJlcXVpcmVkLgorICovCisKK3Vsb25nICAgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApOworaWJvb2wgICBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpOworCisvKiBSb3V0aW5lcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24uIEJ5IGRlZmF1bHQgdGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgcmVndWxhcgorICogQyBydW50aW1lIGxpYnJhcnkgbWFsbG9jL2ZyZWUgZnVuY3Rpb25zLCBidXQgeW91IGNhbiB1c2UgdGhlCisgKiBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yIHdpdGgKKyAqIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0b3IuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBhbGwgbWVtb3J5IGFsbG9jYXRpb24KKyAqIHVzZWQgYnkgU2NpVGVjaCBwcm9kdWN0cyB3aWxsIHVzZSB5b3VyIG92ZXJyaWRkZW4gbWVtb3J5IGFsbG9jYXRvcgorICogZnVuY3Rpb25zLgorICoKKyAqIE5vdGUgdGhhdCBCUEQgZmlsZXMgYXV0b21hdGljYWxseSBtYXAgdGhlIEMgcnVudGltZSBsaWJyYXJ5CisgKiBtYWxsb2MvY2FsbG9jL3JlYWxsb2MvZnJlZSBjYWxscyBmcm9tIGluc2lkZSB0aGUgQlBEIHRvIHRoZSBQTSBsaWJyYXJ5CisgKiB2ZXJzaW9ucyBieSBkZWZhdWx0LgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1fdXNlTG9jYWxNYWxsb2Modm9pZCAqICgqbWFsbG9jKShzaXplX3Qgc2l6ZSksdm9pZCAqICgqY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpLHZvaWQgKiAoKnJlYWxsb2MpKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSksdm9pZCAoKmZyZWUpKHZvaWQgKnApKTsKK3ZvaWQgKiAgUE1BUEkgUE1fbWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQgKiAgUE1BUEkgUE1fY2FsbG9jKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSk7Cit2b2lkICogIFBNQVBJIFBNX3JlYWxsb2Modm9pZCAqcHRyLHNpemVfdCBzaXplKTsKK3ZvaWQgICAgUE1BUEkgUE1fZnJlZSh2b2lkICpwKTsKKworLyogUm91dGluZSB0byBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBpbiB0aGUgZ2xvYmFsIHNoYXJlZCByZWdpb24gdGhhdAorICogaXMgY29tbW9uIHRvIGFsbCB0YXNrcyBhbmQgYWNjZXNzaWJsZSBmcm9tIHJpbmcgMCBjb2RlLgorICovCisKK3ZvaWQgKiAgUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSk7CisKKy8qIFJvdXRpbmUgdG8gZnJlZSB0aGUgYWxsb2NhdGVkIHNoYXJlZCBtZW1vcnkgYmxvY2sgKi8KKwordm9pZCAgICBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cik7CisKKy8qIEF0dGFjaCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGxpbmVhciBtYXBwaW5nIHRvIGEgbmV3IHByb2Nlc3MgKi8KKwordm9pZCAqICBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqbGluZWFyLHVsb25nIGxpbWl0KTsKKworLyogTWFjcm9zIHRvIGV4dHJhY3QgYnl0ZSwgd29yZCBhbmQgbG9uZyB2YWx1ZXMgZnJvbSBhIGNoYXIgcG9pbnRlciAqLworCisjZGVmaW5lIFBNX2dldEJ5dGUocCkgICAgICAgKigodm9sYXRpbGUgdWNoYXIqKShwKSkKKyNkZWZpbmUgUE1fZ2V0V29yZChwKSAgICAgICAqKCh2b2xhdGlsZSB1c2hvcnQqKShwKSkKKyNkZWZpbmUgUE1fZ2V0TG9uZyhwKSAgICAgICAqKCh2b2xhdGlsZSB1bG9uZyopKHApKQorI2RlZmluZSBQTV9zZXRCeXRlKHAsdikgICAgIFBNX2dldEJ5dGUocCkgPSAodikKKyNkZWZpbmUgUE1fc2V0V29yZChwLHYpICAgICBQTV9nZXRXb3JkKHApID0gKHYpCisjZGVmaW5lIFBNX3NldExvbmcocCx2KSAgICAgUE1fZ2V0TG9uZyhwKSA9ICh2KQorCisvKiBSb3V0aW5lIGZvciBhY2Nlc3NpbmcgYSBsb3cgMU1iIG1lbW9yeSBibG9jay4gWW91IGRvbnQgbmVlZCB0byBmcmVlIHRoaXMKKyAqIHBvaW50ZXIsIGJ1dCBpbiAxNiBiaXQgcHJvdGVjdGVkIG1vZGUgdGhlIHNlbGVjdG9yIGFsbG9jYXRlZCB3aWxsIGJlCisgKiByZS11c2VkIHRoZSBuZXh0IHRpbWUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KKyAqLworCit2b2lkICogIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZik7CisKKy8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBjb252ZW50aW9uYWwgbWVtb3J5IGJlbG93IHRoZSAxTWIKKyAqIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gcmVhbCBtb2RlLiBFbnN1cmUgdGhhdCB5b3UgZnJlZQorICogdGhlIHNlZ21lbnQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIHNlbGVjdG9yIGFuZCBvZmZzZXQgdG8gdGhlIHNlZ21lbnQgdGhhdCBoYXMgYmVlbgorICogYWxsb2NhdGVkLCBhbmQgYWxzbyByZXR1cm5zIHRoZSByZWFsIG1vZGUgc2VnbWVudCBhbmQgb2Zmc2V0IHdoaWNoIGNhbgorICogYmUgcGFzc2VkIHRvIHJlYWwgbW9kZSByb3V0aW5lcy4gV2lsbCByZXR1cm4gMCBpZiBtZW1vcnkgY291bGQgbm90IGJlCisgKiBhbGxvY2F0ZWQuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB3aXRoIHNvbWUgRE9TIGV4dGVuZGVycywgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIHRoZQorICogZm9sbG93aW5nIGZ1bmN0aW9uIGNhbm5vdCBiZSBmcmVlZCwgaGVuY2UgaXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIHRoZQorICogbGlmZSBvZiB5b3VyIHByb2dyYW0uIFRodXMgaWYgeW91IG5lZWQgdG8gY2FsbCBhIGJ1bmNoIG9mIGRpZmZlcmVudAorICogcmVhbC1tb2RlIHJvdXRpbmVzIGluIHlvdXIgcHJvZ3JhbSwgYWxsb2NhdGUgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIGF0CisgKiBwcm9ncmFtIHN0YXJ0dXAgdGhhdCBjYW4gYmUgcmUtdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtIGV4ZWN1dGlvbi4KKyAqLworCit2b2lkICogIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpOwordm9pZCAgICBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pOworCisvKiBSb3V0aW5lIHRvIGFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkIG1lbW9yeSwgYW5kIHJldHVybiBib3RoIHRoZQorICogbGluZWFyIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgdGhlIG1lbW9yeS4gWW91IHNob3VsZCBhbHdheXMKKyAqIGFsbG9jYXRlIGxvY2tlZCBtZW1vcnkgYmxvY2tzIGluIHBhZ2Ugc2l6ZWQgY2h1bmtzIChpZTogNEsgb24gSUEzMikuCisgKiBJZiB0aGUgbWVtb3J5IGlzIG5vdCBjb250aWd1b3VzLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUKKyAqIFBNX2dldFBoeXNpY2FsQWRkciBmdW5jdGlvbiB0byBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbGluZWFyCisgKiBwYWdlcyB3aXRoaW4gdGhlIG1lbW9yeSBibG9jayAodGhlIHJldHVybmVkIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZQorICogZm9yIHRoZSBmaXJzdCBhZGRyZXNzIGluIHRoZSBtZW1vcnkgYmxvY2sgb25seSkuCisgKi8KKwordm9pZCAqICBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZyk7Cit2b2lkICAgIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cyk7CisKKy8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYW5kIGZyZWUgcGFnZWQgc2l6ZWQgYmxvY2tzIG9mIHNoYXJlZCBtZW1vcnkuCisgKiBBZGRyZXNzYWJsZSBmcm9tIGFsbCBwcm9jZXNzZXMsIGJ1dCBub3QgZnJvbSBhIHJpbmcgMCBjb250ZXh0CisgKiB1bmRlciBPUy8yLiBOb3RlIHRoYXQgdW5kZXIgT1MvMiBQTV9tYXBTaGFyZWRQYWdlcyBtdXN0IGJlIGNhbGxlZAorICogdG8gbWFwIHRoZSBtZW1vcnkgYmxvY2tzIGludG8gdGhlIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzcGFjZQorICogb2YgZWFjaCBjb25uZWN0aW5nIHByb2Nlc3MuCisgKi8KKwordm9pZCAqICBQTUFQSSBQTV9hbGxvY1BhZ2UoaWJvb2wgbG9ja2VkKTsKK3ZvaWQgICAgUE1BUEkgUE1fZnJlZVBhZ2Uodm9pZCAqcCk7CisjaWZkZWYgX19PUzJfXwordm9pZCAgICBQTUFQSSBQTV9tYXBTaGFyZWRQYWdlcyh2b2lkKTsKKyNlbmRpZgorCisvKiBSb3V0aW5lIHRvIHJldHVybiB0cnVlIGlmIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBCSU9TIG9uIHRoZSBob3N0IE9TICovCisKK2lib29sICAgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCk7CisKKy8qIFJvdXRpbmUgdG8gY2FsbCBhIHJlYWwgbW9kZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9jZWR1cmUuIFJlZ2lzdGVyCisgKiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhbmQgb3V0IGluIHRoZSAncmVncycgYW5kICdzcmVncycgc3RydWN0dXJlcy4gV2UKKyAqIGRvIG5vdCBwcm92aWRlIGFueSBtZXRob2Qgb2YgY29weWluZyBkYXRhIGZyb20gdGhlIHByb3RlY3RlZCBtb2RlIHN0YWNrCisgKiB0byB0aGUgcmVhbCBtb2RlIHN0YWNrLCBzbyBpZiB5b3UgbmVlZCB0byBwYXNzIGRhdGEgdG8gcmVhbCBtb2RlLCB5b3Ugd2lsbAorICogbmVlZCB0byB3cml0ZSBhIHJlYWwgbW9kZSBhc3NlbWJseSBsYW5ndWFnZSBob29rIHRvIHJlY2lldmUgdGhlIHZhbHVlcworICogaW4gcmVnaXN0ZXJzLCBhbmQgdG8gcGFzcyB0aGUgZGF0YSB0aHJvdWdoIGEgcmVhbCBtb2RlIGJsb2NrIGFsbG9jYXRlZAorICogd2l0aCB0aGUgUE1fYWxsb2NSZWFsU2VnKCkgcm91dGluZS4KKyAqLworCit2b2lkICAgIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKKworLyogUm91dGluZXMgdG8gZ2VuZXJhdGUgcmVhbCBtb2RlIGludGVycnVwdHMgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIHRoYXQKKyAqIGlzIHVzZWQgYnkgaW50ODYoKSBhbmQgaW50ODZ4KCkgaW4gcmVhbG1vZGUuIFRoaXMgcm91dGluZSBpcyBuZWVkIHRvCisgKiBjYWxsIGNlcnRhaW4gQklPUyBhbmQgRE9TIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHNvbWUKKyAqIERPUyBleHRlbmRlcnMuIE5vIHRyYW5zbGF0aW9uIGlzIGRvbmUgb24gYW55IG9mIHRoZSByZWdpc3RlciB2YWx1ZXMsCisgKiBzbyB0aGV5IG11c3QgYmUgY29ycmVjdGx5IHNldCB1cCBhbmQgdHJhbnNsYXRlZCBieSB0aGUgY2FsbGluZyBwcm9ncmFtLgorICoKKyAqIE5vcm1hbGx5IHRoZSBET1MgZXh0ZW5kZXJzIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgbm9ybWFsIGludDg2KCkKKyAqIGZ1bmN0aW9uIGRpcmVjdGx5IGFuZCB3aWxsIHBhc3Mgb24gdW5oYW5kbGVkIGNhbGxzIHRvIHJlYWwgbW9kZSB0byBiZQorICogaGFuZGxlZCBieSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIuIEhvd2V2ZXIgY2FsbHMgdG8gaW50ODZ4KCkgd2l0aCByZWFsCisgKiBtb2RlIHNlZ21lbnQgdmFsdWVzIHRvIGJlIGxvYWRlZCB3aWxsIGNhdXNlIGEgR1BGIGlmIHVzZWQgd2l0aCB0aGUKKyAqIHN0YW5kYXJkIGludDg2eCgpLCBzbyB5b3Ugc2hvdWxkIHVzZSB0aGVzZSByb3V0aW5lcyBpZiB5b3Uga25vdyB5b3UKKyAqIHdhbnQgdG8gY2FsbCBhIHJlYWwgbW9kZSBoYW5kbGVyLgorICovCisKK2ludCAgICAgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7CitpbnQgICAgIFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKKworLyogUm91dGluZSB0byBnZW5lcmF0ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZQorICogYWJvdmUgZnVuY3Rpb24sIGJ1dCB0YWtlcyBhIERQTUlfcmVncyBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlcnMKKyAqIHdoaWNoIGhhcyBhIGxvdCBtb3JlIGluZm9ybWF0aW9uLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIDMyLWJpdAorICogcHJvdGVjdGVkIG1vZGUuCisgKi8KKwordm9pZCAgICBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKTsKKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIGFuZCB0b3RhbCBtZW1vcnkuCisgKiBUaGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSAqb25seSogdmFsaWQgYmVmb3JlIHlvdSBoYXZlIG1hZGUgYW55CisgKiBjYWxscyB0byBtYWxsb2MoKSBhbmQgZnJlZSgpLiBJZiB5b3UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGV4YWN0bHkgaG93CisgKiBtdWNoIG1lbW9yeSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KKyAqIGdldCB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgYW5kIHRoZW4ga2VlcCB0cmFjayBvZgorICogdGhlIGF2YWlsYWJsZSBtZW1vcnkgZXZlcnkgdGltZSB5b3UgY2FsbCBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpOworCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBnbG9iYWwgVkVTQSByZWFsIG1vZGUgdHJhbnNmZXIgYnVmZmVyIGZvciB1c2UKKyAqIGJ5IGFwcGxpY2F0aW9ucy4KKyAqLworCit2b2lkICogIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZik7CisKKy8qIEhhbmRsZSBmYXRhbCBlcnJvciBjb25kaXRpb25zICovCisKK3ZvaWQgICAgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpOworCisvKiBGdW5jdGlvbiB0byBzZXQgYSBjbGVhbnVwIGVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gUE1fZmF0YWxFcnJvcgorICogaXMgY2FsbGVkLiBUaGlzIGFsbG93cyB1cyB0byB0aGUgY29uc29sZSBiYWNrIGludG8gYSBub3JtYWwgc3RhdGUKKyAqIGlmIHdlIGdldCBhIGZhaWx1cmUgZnJvbSBkZWVwIGluc2lkZSBhIEJQRCBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzCisgKiBub3QgZXhwb3J0ZWQgdG8gQlBEIGZpbGVzLCBhbmQgaXMgb25seSB1c2VkIGJ5IGNvZGUgY29tcGlsZWQgZm9yIHRoZQorICogT1MuCisgKi8KKwordm9pZCAgICBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cChQTV9mYXRhbENsZWFudXBIYW5kbGVyIGNsZWFudXApOworCisvKiBSZXR1cm4gdGhlIE9TIHR5cGUgZmxhZyBhcyBkZWZpbmVkIGluIDxkcnZsaWIvb3Mvb3MuaD4gKi8KKworbG9uZyAgICBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCk7CisKKy8qIEZ1bmN0aW9ucyB0byBzZXQgYSBWQkUgYmFuayB2aWEgYW4gSW50IDEwaCAqLworCit2b2lkICAgIFBNQVBJIFBNX3NldEJhbmtBKGludCBiYW5rKTsKK3ZvaWQgICAgUE1BUEkgUE1fc2V0QmFua0FCKGludCBiYW5rKTsKK3ZvaWQgICAgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKworY2hhciAqICBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aChjaGFyICpwYXRoLGludCBtYXhMZW4pOworCisvKiBSZXR1cm4gcGF0aHMgdG8gdGhlIFZCRS9BRiBhbmQgTnVjbGV1cyBkaXJlY3RvcmllcyAqLworCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpOworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpOworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpOworCisvKiBGaW5kIHRoZSBwYXRoIHRvIGEgYmluYXJ5IHBvcnRhYmxlIERMTCAqLworCit2b2lkICAgIFBNQVBJIFBNX3NldExvY2FsQlBEUGF0aChjb25zdCBjaGFyICpwYXRoKTsKK2lib29sICAgUE1BUEkgUE1fZmluZEJQRChjb25zdCBjaGFyICpkbGxuYW1lLGNoYXIgKmJwZHBhdGgpOworCisvKiBSZXR1cm5zIHRoZSBkcml2ZSBsZXR0ZXIgb2YgdGhlIGJvb3QgZHJpdmUgZm9yIERPUywgT1MvMiBhbmQgV2luZG93cyAqLworCitjaGFyICAgIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKTsKKworLyogUmV0dXJuIGEgbmV0d29yayB1bmlxdWUgbWFjaGluZSBpZGVudGlmaWVyIGFzIGEgc3RyaW5nICovCisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKTsKKworLyogUmV0dXJuIHRoZSBuZXR3b3JrIG1hY2hpbmUgbmFtZSBhcyBhIHN0cmluZyAqLworCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCk7CisKKy8qIEZ1bmN0aW9ucyB0byBpbnN0YWxsIGFuZCByZW1vdmUgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyCisgKiBlbXVsYXRpb24gY29kZS4gRm9yIHVuc3VwcG9ydGVkIERPUyBleHRlbmRlcnMgYW5kIHdoZW4gcnVubmluZyB1bmRlcgorICogYSBEUE1JIGhvc3QgbGlrZSBXaW5kb3dzIG9yIE9TLzIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBOVUxMLgorICovCisKK2lib29sICAgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpOwordm9pZCAqICBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYyk7Cit2b2lkICAgIFBNQVBJIFZGX2V4aXQodm9pZCk7CisKKy8qIEZ1bmN0aW9ucyB0byB3YWl0IGZvciBhIGtleXByZXNzIGFuZCByZWFkIGEga2V5IGZvciBjb21tYW5kIGxpbmUKKyAqIGVudmlyb25tZW50cyBzdWNoIGFzIERPUywgV2luMzIgY29uc29sZSBhbmQgVW5peC4KKyAqLworCitpbnQgICAgIFBNQVBJIFBNX2tiaGl0KHZvaWQpOworaW50ICAgICBQTUFQSSBQTV9nZXRjaCh2b2lkKTsKKworLyogRnVuY3Rpb25zIHRvIGNyZWF0ZSBlaXRoZXIgYSBmdWxsc2NyZWVuIG9yIHdpbmRvd2VkIGNvbnNvbGUgb24gdGhlCisgKiBkZXNrdG9wLCBhbmQgdG8gYWxsb3cgdGhlIHJlc29sdXRpb24gb2YgZnVsbHNjcmVlbiBjb25zb2xlcyB0byBiZQorICogY2hhbmdlZCBvbiB0aGUgZmx5IHdpdGhvdXQgY2xvc2luZyB0aGUgY29uc29sZS4gRm9yIG5vbi13aW5kb3dlZAorICogZW52aXJvbm1lbnRzIChzdWNoIGFzIGEgTGludXggb3IgT1MvMiBmdWxsc2NyZWVuIGNvbnNvbGUpLCB0aGVzZQorICogZnVuY3Rpb25zIGVuYWJsZSBjb25zb2xlIGdyYXBoaWNzIG1vZGUgYW5kIHJlc3RvcmUgY29uc29sZSB0ZXh0IG1vZGUuCisgKgorICogVGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgaXMgdXNlZCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8KKyAqIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUgbW9kZSB0byBhbGxvdyB0ZW1wb3JhcnkKKyAqIHN3aXRjaGluZyB0byBhbm90aGVyIGNvbnNvbGUgb3IgYmFjayB0byB0aGUgcmVndWxhciBHVUkgZGVza3RvcC4gSXQKKyAqIGlzIGFsc28gY2FsbGVkIHRvIHJlc3RvcmUgdGhlIGZ1bGxzY3JlZW4gZ3JhcGhpY3Mgc3RhdGUgYWZ0ZXIgdGhlCisgKiBmdWxsc2NyZWVuIGNvbnNvbGUgcmVnYWlucyB0aGUgZm9jdXMuCisgKgorICogVGhlIGRldmljZSBwYXJhbWV0ZXIgYWxsb3dzIGZvciB0aGUgY29uc29sZSB0byBiZSBvcGVuZWQgb24gYSBkaWZmZXJlbnQKKyAqIGRpc3BsYXkgY29udHJvbGxlcnMgKDAgaXMgYWx3YXlzIHRoZSBwcmltYXJ5IGNvbnRyb2xsZXIpLgorICovCisKK1BNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbik7CitpbnQgICAgIFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCk7Cit2b2lkICAgIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSk7Cit2b2lkICAgIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKTsKK3ZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKK3ZvaWQgICAgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpOworCisvKiBGdW5jdGlvbnMgdG8gbW9kaWZ5IE9TIGNvbnNvbGUgaW5mb3JtYXRpb24gKi8KKwordm9pZCAgICBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KTsKK3ZvaWQgICAgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCk7CisKKy8qIEZ1bmN0aW9uIHRvIGVtYWJsZSBJbnRlbCBQUHJvL1BJSSB3cml0ZSBjb21iaW5pbmcgKi8KKworaW50ICAgICBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKK2ludCAgICAgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZShQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spOworCisvKiBGdW5jdGlvbiB0byBhZGQgYSBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgZmlsZW5hbWUgKGlmIG5vdCBwcmVzZW50KSAqLworCit2b2lkICAgIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpmaWxlbmFtZSk7CisKKy8qIFJvdXRpbmVzIHRvIGxvY2sgYW5kIHVubG9jayByZWdpb25zIG9mIG1lbW9yeSB1bmRlciBhIHZpcnR1YWwgbWVtb3J5CisgKiBlbnZpcm9ubWVudC4gVGhlc2Ugcm91dGluZXMgX211c3RfIGJlIHVzZWQgdG8gbG9jayBhbGwgaGFyZHdhcmUKKyAqIGFuZCBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxlcnMgaW5zdGFsbGVkLCBfQU5EXyBhbnkgZ2xvYmFsIGRhdGEgdGhhdAorICogdGhlc2UgaGFuZGxlciBtYW5pcHVsYXRlLCBzbyB0aGF0IHRoZXkgd2lsbCBhbHdheXMgYmUgcHJlc2VudCBpbiBtZW1vcnkKKyAqIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgaW50ZXJydXB0cy4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGNhbGwgdGhlIGNvcnJlY3Qgcm91dGluZSBkZXBlbmRpbmcgb24KKyAqIHdoZXRoZXIgdGhlIGFyZWEgYmVpbmcgbG9ja2VkIGlzIGNvZGUgb3IgZGF0YSwgc28gdGhhdCB1bmRlciAzMiBiaXQKKyAqIFBNIHdlIHdpbGwgZ2V0IHRoZSBzZWxlY3RvciB2YWx1ZSBjb3JyZWN0LgorICovCisKK2ludCAgICAgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOworaW50ICAgICBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKK2ludCAgICAgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyhfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKK2ludCAgICAgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKF9fY29kZVB0ciBwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOworCisvKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCByZW1vdmUgUmVhbCBUaW1lIENsb2NrIGludGVycnVwdCBoYW5kbGVycy4gVGhlCisgKiBmcmVxdWVuY3kgb2YgdGhlIHJlYWwgdGltZSBjbG9jayBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nCisgKiBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbnksIGFuZCB0aGUgdmFsdWUgY2FuIGJlIGFueSBwb3dlciBvZiAyIHZhbHVlCisgKiBmcm9tIDJIeiB0byA4MTkySHouCisgKgorICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAorICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCisgKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCisgKgorICogTk9URTogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiB0aGUgUE0gbGlicmFyeSBzaG91bGQgZmFpbCB0aGVzZSBmdW5jdGlvbnMuCisgKi8KKworaWJvb2wgICBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLGludCBmcmVxdWVuY3kpOwordm9pZCAgICBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpOwordm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCk7CisKKy8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlcnMuCisgKgorICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAorICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCisgKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCisgKgorICogTk9URTogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiB0aGUgUE0gbGlicmFyeSBzaG91bGQgZmFpbCB0aGVzZSBmdW5jdGlvbnMuCisgKi8KKworUE1fSVJRSGFuZGxlIFBNQVBJIFBNX3NldElSUUhhbmRsZXIoaW50IElSUSxQTV9pcnFIYW5kbGVyIGloKTsKK3ZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUlSUUhhbmRsZXIoUE1fSVJRSGFuZGxlIGlycUhhbmRsZSk7CisKKy8qIEZ1bmN0aW9ucyB0byBwcm9ncmFtIERNQSB1c2luZyB0aGUgbGVnYWN5IElTQSBETUEgY29udHJvbGxlciAqLworCit2b2lkICAgIFBNQVBJIFBNX0RNQUNFbmFibGUoaW50IGNoYW5uZWwpOwordm9pZCAgICBQTUFQSSBQTV9ETUFDRGlzYWJsZShpbnQgY2hhbm5lbCk7Cit2b2lkICAgIFBNQVBJIFBNX0RNQUNQcm9ncmFtKGludCBjaGFubmVsLGludCBtb2RlLHVsb25nIGJ1ZmZlclBoeXMsaW50IGNvdW50KTsKK3Vsb25nICAgUE1BUEkgUE1fRE1BQ1Bvc2l0aW9uKGludCBjaGFubmVsKTsKKworLyogRnVuY3Rpb24gdG8gcG9zdCBzZWNvbmRhcnkgZ3JhcGhpY3MgY29udHJvbGxlcnMgdXNpbmcgdGhlIEJJT1MgKi8KKworaWJvb2wgICBQTUFQSSBQTV9kb0JJT1NQT1NUKHVzaG9ydCBheFZhbCx1bG9uZyBCSU9TUGh5c0FkZHIsdm9pZCAqbWFwcGVkQklPUyx1bG9uZyBCSU9TTGVuKTsKKworLyogRnVuY3Rpb24gdG8gaW5pdCB0aGUgQUdQIGZ1bmN0aW9ucyBhbmQgcmV0dXJuIHRoZSBBR1AgYXBlcnR1cmUgc2l6ZSBpbiBNQiAqLworCit1bG9uZyAgIFBNQVBJIFBNX2FncEluaXQodm9pZCk7Cit2b2lkICAgIFBNQVBJIFBNX2FncEV4aXQodm9pZCk7CisKKy8qIEZ1bmN0aW9ucyB0byByZXNlcnZlIGFuZCByZWxlYXNlIHBoeXNpY2FsIEFHUCBtZW1vcnkgcmFuZ2VzICovCisKK2lib29sICAgUE1BUEkgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsKHVsb25nIG51bVBhZ2VzLGludCB0eXBlLHZvaWQgKipwaHlzQ29udGV4dCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOworaWJvb2wgICBQTUFQSSBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQpOworCisvKiBGdW5jdGlvbnMgdG8gY29tbWl0IGFuZCBmcmVlIHBoeXNpY2FsIEFHUCBtZW1vcnkgcmFuZ2VzICovCisKK2lib29sICAgUE1BUEkgUE1fYWdwQ29tbWl0UGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQsUE1fcGh5c0FkZHIgKnBoeXNBZGRyKTsKK2lib29sICAgUE1BUEkgUE1fYWdwRnJlZVBoeXNpY2FsKHZvaWQgKnBoeXNDb250ZXh0LHVsb25nIG51bVBhZ2VzLHVsb25nIHN0YXJ0T2Zmc2V0KTsKKworLyogRnVuY3Rpb25zIHRvIGRvIEkvTyBwb3J0IG1hbmlwdWxhdGlvbiBkaXJlY3RseSBmcm9tIEMgY29kZS4gVGhlc2UKKyAqIGZ1bmN0aW9ucyBhcmUgcG9ydGFibGUgYW5kIHdpbGwgd29yayBvbiBhbnkgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZQorICogdG8gYWNjZXNzIEkvTyBzcGFjZSByZWdpc3RlcnMgb24gUENJIGRldmljZXMuCisgKi8KKwordWNoYXIgICBQTUFQSSBQTV9pbnBiKGludCBwb3J0KTsKK3VzaG9ydCAgUE1BUEkgUE1faW5wdyhpbnQgcG9ydCk7Cit1bG9uZyAgIFBNQVBJIFBNX2lucGQoaW50IHBvcnQpOwordm9pZCAgICBQTUFQSSBQTV9vdXRwYihpbnQgcG9ydCx1Y2hhciB2YWwpOwordm9pZCAgICBQTUFQSSBQTV9vdXRwdyhpbnQgcG9ydCx1c2hvcnQgdmFsKTsKK3ZvaWQgICAgUE1BUEkgUE1fb3V0cGQoaW50IHBvcnQsdWxvbmcgdmFsKTsKKworLyogRnVuY3Rpb25zIHRvIGRldGVybWluZSB0aGUgSS9PIHBvcnQgbG9jYXRpb25zIGZvciBDT00gYW5kIExQVCBwb3J0cy4KKyAqIFRoZSBmdW5jdGlvbnMgYXJlIHplcm8gYmFzZWQsIHNvIGZvciBDT00xIG9yIExQVDEgcGFzcyBpbiBhIHZhbHVlIG9mIDAsCisgKiBmb3IgQ09NMiBvciBMUFQyIHBhc3MgaW4gYSB2YWx1ZSBvZiAxIGV0Yy4KKyAqLworCitpbnQgICAgIFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpOworaW50ICAgICBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KTsKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgbmVlZCBwcm90b3R5cGVzICovCisKK3ZvaWQgICAgUE1BUEkgX1BNX2dldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgKnJlYWxpc3IpOwordm9pZCAgICBQTUFQSSBfUE1fc2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyByZWFsaXNyKTsKK3ZvaWQgICAgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKTsKKworLyogRnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVidWcgbG9nIGZpbGUgbG9jYXRpb24gKi8KKwordm9pZCAgICBQTUFQSSBQTV9zZXREZWJ1Z0xvZyhjb25zdCBjaGFyICpsb2dGaWxlUGF0aCk7CisKKy8qIEZ1bmN0aW9uIHRvIHB1dCB0aGUgcHJvY2VzcyB0byBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMgKi8KKwordm9pZCAgICBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpOworCisvKiBGdW5jdGlvbiB0byBibG9jayB1bnRpbCAnbWlsbGlzZWNvbmRzJyBoYXZlIHBhc3NlZCBzaW5jZSBsYXN0IGNhbGwgKi8KKwordm9pZCAgICBQTUFQSSBQTV9ibG9ja1VudGlsVGltZW91dCh1bG9uZyBtaWxsaXNlY29uZHMpOworCisvKiBGdW5jdGlvbnMgZm9yIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYW5kIG1hbmFnZW1lbnQgKi8KKwordm9pZCAqICBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLFBNX2ZpbmREYXRhICpmaW5kRGF0YSk7CitpYm9vbCAgIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSh2b2lkICpoYW5kbGUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKK3ZvaWQgICAgUE1BUEkgUE1fZmluZENsb3NlKHZvaWQgKmhhbmRsZSk7Cit2b2lkICAgIFBNQVBJIFBNX21ha2VwYXRoKGNoYXIgKnAsY29uc3QgY2hhciAqZHJpdmUsY29uc3QgY2hhciAqZGlyLGNvbnN0IGNoYXIgKm5hbWUsY29uc3QgY2hhciAqZXh0KTsKK2ludCAgICAgUE1BUEkgUE1fc3BsaXRwYXRoKGNvbnN0IGNoYXIgKmZuLGNoYXIgKmRyaXZlLGNoYXIgKmRpcixjaGFyICpuYW1lLGNoYXIgKmV4dCk7CitpYm9vbCAgIFBNQVBJIFBNX2RyaXZlVmFsaWQoY2hhciBkcml2ZSk7Cit2b2lkICAgIFBNQVBJIFBNX2dldGRjd2QoaW50IGRyaXZlLGNoYXIgKmRpcixpbnQgbGVuKTsKK3VpbnQgICAgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCAgICBQTUFQSSBQTV9zZXRGaWxlQXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1aW50IGF0dHJpYik7CitpYm9vbCAgIFBNQVBJIFBNX2dldEZpbGVUaW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLGlib29sIGdtVGltZSxQTV90aW1lICp0aW1lKTsKK2lib29sICAgUE1BUEkgUE1fc2V0RmlsZVRpbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ21UaW1lLFBNX3RpbWUgKnRpbWUpOworaWJvb2wgICBQTUFQSSBQTV9ta2Rpcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpYm9vbCAgIFBNQVBJIFBNX3JtZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyogRnVuY3Rpb25zIHRvIGhhbmRsZSBsb2FkaW5nIE9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgKi8KKworUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKnN6RExMTmFtZSk7Cit2b2lkICogIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKFBNX01PRFVMRSBoTW9kdWxlLGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpOwordm9pZCAgICBQTUFQSSBQTV9mcmVlTGlicmFyeShQTV9NT0RVTEUgaE1vZHVsZSk7CisKKy8qIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIGZvciA2NC1iaXQgYXJpdGhtZXRpYyAqLworCit2b2lkICAgIFBNQVBJIF9QTV9hZGQ2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3N1YjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwordm9pZCAgICBQTUFQSSBfUE1fbXVsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Cit2b2lkICAgIFBNQVBJIF9QTV9kaXY2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3NocjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3NhcjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3NobDY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKK3ZvaWQgICAgUE1BUEkgX1BNX25lZzY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9faTY0ICpyZXN1bHQpOworI2lmZGVmIF9fTkFUSVZFX0lOVDY0X18KKyNkZWZpbmUgUE1fYWRkNjQocixhLGIpICAgICAocikgPSAoYSkgKyAoYikKKyNkZWZpbmUgUE1fYWRkNjRfMzIocixhLGIpICAocikgPSAoYSkgKyAoYikKKyNkZWZpbmUgUE1fc3ViNjQocixhLGIpICAgICAocikgPSAoYSkgLSAoYikKKyNkZWZpbmUgUE1fc3ViNjRfMzIocixhLGIpICAocikgPSAoYSkgLSAoYikKKyNkZWZpbmUgUE1fbXVsNjQocixhLGIpICAgICAocikgPSAoYSkgKiAoYikKKyNkZWZpbmUgUE1fbXVsNjRfMzIocixhLGIpICAocikgPSAoYSkgKiAoYikKKyNkZWZpbmUgUE1fZGl2NjQocixhLGIpICAgICAocikgPSAoYSkgLyAoYikKKyNkZWZpbmUgUE1fZGl2NjRfMzIocixhLGIpICAocikgPSAoYSkgLyAoYikKKyNkZWZpbmUgUE1fc2hyNjQocixhLHMpICAgICAocikgPSAoYSkgPj4gKHMpCisjZGVmaW5lIFBNX3NhcjY0KHIsYSxzKSAgICAgKHIpID0gKChzNjQpKGEpKSA+PiAocykKKyNkZWZpbmUgUE1fc2hsNjQocixhLHMpICAgICAocikgPSAodTY0KShhKSA8PCAocykKKyNkZWZpbmUgUE1fbmVnNjQocixhLHMpICAgICAocikgPSAtKGEpCisjZGVmaW5lIFBNX25vdDY0KHIsYSxzKSAgICAgKHIpID0gfihhKQorI2RlZmluZSBQTV9lcTY0KGEsYikgICAgICAgIChhKSA9PSAoYikKKyNkZWZpbmUgUE1fZ3Q2NChhLGIpICAgICAgICAoYSkgPiAoYikKKyNkZWZpbmUgUE1fbHQ2NChhLGIpICAgICAgICAoYSkgPCAoYikKKyNkZWZpbmUgUE1fZ2VxNjQoYSxiKSAgICAgICAoYSkgPj0gKGIpCisjZGVmaW5lIFBNX2xlcTY0KGEsYikgICAgICAgKGEpIDw9IChiKQorI2RlZmluZSBQTV82NHRvMzIoYSkgICAgICAgICh1MzIpKGEpCisjZGVmaW5lIFBNXzY0dG9zMzIoYSkgICAgICAgKHMzMikoYSkKKyNkZWZpbmUgUE1fc2V0NjQoYSxiLGMpICAgICAoYSkgPSAoKHU2NCkoYikgPDwgMzIpICsgKGMpCisjZGVmaW5lIFBNX3NldDY0XzMyKGEsYikgICAgKGEpID0gKGIpCisjZWxzZQorI2RlZmluZSBQTV9hZGQ2NChyLGEsYikgICAgIF9QTV9hZGQ2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKKyNkZWZpbmUgUE1fYWRkNjRfMzIocixhLGIpICBfUE1fYWRkNjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKKyNkZWZpbmUgUE1fc3ViNjQocixhLGIpICAgICBfUE1fc3ViNjQoKGEpLmxvdywoYSkuaGlnaCwoYikubG93LChiKS5oaWdoLCYocikpCisjZGVmaW5lIFBNX3N1YjY0XzMyKHIsYSxiKSAgX1BNX3N1YjY0KChhKS5sb3csKGEpLmhpZ2gsYiwwLCYocikpCisjZGVmaW5lIFBNX211bDY0KHIsYSxiKSAgICAgX1BNX211bDY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQorI2RlZmluZSBQTV9tdWw2NF8zMihyLGEsYikgIF9QTV9tdWw2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQorI2RlZmluZSBQTV9kaXY2NChyLGEsYikgICAgIF9QTV9kaXY2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKKyNkZWZpbmUgUE1fZGl2NjRfMzIocixhLGIpICBfUE1fZGl2NjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKKyNkZWZpbmUgUE1fc2hyNjQocixhLHMpICAgICBfUE1fc2hyNjQoKGEpLmxvdywoYSkuaGlnaCxzLCYocikpCisjZGVmaW5lIFBNX3NhcjY0KHIsYSxzKSAgICAgX1BNX3NhcjY0KChhKS5sb3csKGEpLmhpZ2gscywmKHIpKQorI2RlZmluZSBQTV9zaGw2NChyLGEscykgICAgIF9QTV9zaGw2NCgoYSkubG93LChhKS5oaWdoLHMsJihyKSkKKyNkZWZpbmUgUE1fbmVnNjQocixhLHMpICAgICBfUE1fbmVnNjQoKGEpLmxvdywoYSkuaGlnaCwmKHIpKQorI2RlZmluZSBQTV9ub3Q2NChyLGEscykgICAgIChyKS5sb3cgPSB+KGEpLmxvdywgKHIpLmhpZ2ggPSB+KGEpLmhpZ2gKKyNkZWZpbmUgUE1fZXE2NChhLGIpICAgICAgICAoKGEpLmxvdyA9PSAoYikubG93ICYmIChhKS5oaWdoID09IChiKS5oaWdoKQorI2RlZmluZSBQTV9ndDY0KGEsYikgICAgICAgICgoKGEpLmhpZ2ggPiAoYikuaGlnaCkgfHwgKChhKS5oaWdoID09IChiKS5oaWdoICYmIChhKS5sb3cgPiAoYikubG93KSkKKyNkZWZpbmUgUE1fbHQ2NChhLGIpICAgICAgICAoKChhKS5oaWdoIDwgKGIpLmhpZ2gpIHx8ICgoYSkuaGlnaCA9PSAoYikuaGlnaCAmJiAoYSkubG93IDwgKGIpLmxvdykpCisjZGVmaW5lIFBNX2dlcTY0KGEsYikgICAgICAgKFBNX2VxNjQoYSxiKSB8fCBQTV9ndDY0KGEsYikpCisjZGVmaW5lIFBNX2xlcTY0KGEsYikgICAgICAgKFBNX2VxNjQoYSxiKSB8fCBQTV9sdDY0KGEsYikpCisjZGVmaW5lIFBNXzY0dG8zMihhKSAgICAgICAgKHUzMikoYS5sb3cpCisjZGVmaW5lIFBNXzY0dG9zMzIoYSkgICAgICAgKChhKS5oaWdoIDwgMCkgPyAtKGEpLmxvdyA6IChhKS5sb3cpCisjZGVmaW5lIFBNX3NldDY0KGEsYixjKSAgICAgKGEpLmhpZ2ggPSAoYiksIChhKS5sb3cgPSAoYykKKyNkZWZpbmUgUE1fc2V0NjRfMzIoYSxiKSAgICAoYSkuaGlnaCA9IDAsIChhKS5sb3cgPSAoYikKKyNlbmRpZgorCisvKiBGdW5jdGlvbiB0byBlbmFibGUgSU9QTCBhY2Nlc3MgaWYgcmVxdWlyZWQgKi8KKworaW50ICAgICBQTUFQSSBQTV9zZXRJT1BMKGludCBpb3BsKTsKKworLyogRnVuY3Rpb24gdG8gZmx1c2ggdGhlIFRMQiBhbmQgQ1BVIGNhY2hlcyAqLworCit2b2lkICAgIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpOworCisvKiBET1Mgc3BlY2lmaWMgZnVjbnRpb25zICovCisKKyNpZmRlZiAgX19NU0RPU19fCit1aW50ICAgIFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpOwordm9pZCAgICBQTUFQSSBQTV9WeERDYWxsKFZYRF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgVkdBIGhhcmR3YXJlIHN0YXRlICovCisKK2ludCAgICAgUE1BUEkgUE1fZ2V0VkdBU3RhdGVTaXplKHZvaWQpOwordm9pZCAgICBQTUFQSSBQTV9zYXZlVkdBU3RhdGUodm9pZCAqc3RhdGVCdWYpOwordm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlVkdBU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYpOwordm9pZCAgICBQTUFQSSBQTV92Z2FCbGFua0Rpc3BsYXkodm9pZCk7Cit2b2lkICAgIFBNQVBJIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KHZvaWQpOworCisvKiBGdW5jdGlvbnMgdG8gbG9hZCBhbmQgdW5sb2FkIERpcmVjdERyYXcgbGlicmFyaWVzLiBPbmx5IHVzZWQgb24KKyAqIFdpbmRvd3MgcGxhdGZvcm1zLgorICovCisKK3ZvaWQgKiAgUE1BUEkgUE1fbG9hZERpcmVjdERyYXcoaW50IGRldmljZSk7Cit2b2lkICAgIFBNQVBJIFBNX3VubG9hZERpcmVjdERyYXcoaW50IGRldmljZSk7CitQTV9IV05EIFBNQVBJIFBNX2dldERpcmVjdERyYXdXaW5kb3codm9pZCk7Cit2b2lkICAgIFBNQVBJIFBNX2RvU3VzcGVuZEFwcCh2b2lkKTsKKworLyogRnVuY3Rpb25zIHRvIGluc3RhbGwsIHN0YXJ0LCBzdG9wIGFuZCByZW1vdmUgTlQgc2VydmljZXMuIFZhbGlkIG9ubHkKKyAqIGZvciBXaW4zMiBhcHBzIHJ1bm5pbmcgb24gV2luZG93cyBOVC4KKyAqLworCisjaWZkZWYgX19XSU5ET1dTMzJfXwordWxvbmcgICBQTUFQSSBQTV9pbnN0YWxsU2VydmljZShjb25zdCBjaGFyICpzekRyaXZlck5hbWUsY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSxjb25zdCBjaGFyICpzekxvYWRHcm91cCx1bG9uZyBkd1NlcnZpY2VUeXBlKTsKK3Vsb25nICAgUE1BUEkgUE1fc3RhcnRTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwordWxvbmcgICBQTUFQSSBQTV9zdG9wU2VydmljZShjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKTsKK3Vsb25nICAgUE1BUEkgUE1fcmVtb3ZlU2VydmljZShjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKTsKKyNlbmRpZgorCisvKiBSb3V0aW5lcyB0byBnZW5lcmF0ZSBuYXRpdmUgaW50ZXJydXB0cyAoaWU6IHByb3RlY3RlZCBtb2RlIGludGVycnVwdHMKKyAqIGZvciBwcm90ZWN0ZWQgbW9kZSBhcHBzKSB1c2luZyBhbiBpbnRlcmZhY2UgdGhlIHNhbWUgYXMgdGhhdCB1c2UgYnkKKyAqIGludDg2KCkgYW5kIGludDg2eCgpIGluIHJlYWxtb2RlLiBUaGVzZSByb3V0aW5lcyBhcmUgcmVxdWlyZWQgYmVjYXVzZQorICogbWFueSAzMiBiaXQgY29tcGlsZXJzIHVzZSBkaWZmZXJlbnQgcmVnaXN0ZXIgc3RydWN0dXJlcyBhbmQgZGlmZmVyZW50CisgKiBmdW5jdGlvbnMgY2F1c2luZyBtYWpvciBwb3J0YWJpbGl0eSBoZWFkYWNoZXMuIFRodXMgd2UgcHJvdmlkZSBvdXIKKyAqIG93biBhbmQgc29sdmUgaXQgYWxsIGluIG9uZSBmZWxsIHN3b29wLCBhbmQgd2UgYWxzbyBnZXQgYSByb3V0aW5lIHRvCisgKiBwdXQgc3R1ZmYgaW50byAzMiBiaXQgcmVnaXN0ZXJzIGZyb20gcmVhbCBtb2RlIDstKQorICovCisKK3ZvaWQgICAgUE1BUEkgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncyk7CitpbnQgICAgIFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KTsKK2ludCAgICAgUE1BUEkgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKTsKKworLyogQ2FsbCB0aGUgWDg2IGVtdWxhdG9yIG9yIHRoZSByZWFsIEJJT1MgaW4gb3VyIHRlc3QgaGFybmVzcyAqLworCisjaWYgZGVmaW5lZChURVNUX0hBUk5FU1MpICYmICFkZWZpbmVkKFBNTElCKQorI2RlZmluZSBQTV9tYXBSZWFsUG9pbnRlcihyX3NlZyxyX29mZikgICAgICBfUE1faW1wb3J0cy5QTV9tYXBSZWFsUG9pbnRlcihyX3NlZyxyX29mZikKKyNkZWZpbmUgUE1fZ2V0VkVTQUJ1ZihsZW4scnNlZyxyb2ZmKSAgICAgICAgX1BNX2ltcG9ydHMuUE1fZ2V0VkVTQUJ1ZihsZW4scnNlZyxyb2ZmKQorI2RlZmluZSBQTV9jYWxsUmVhbE1vZGUoc2VnLG9mZixyZWdzLHNyZWdzKSBfUE1faW1wb3J0cy5QTV9jYWxsUmVhbE1vZGUoc2VnLG9mZixyZWdzLHNyZWdzKQorI2RlZmluZSBQTV9pbnQ4NihpbnRubyxpbixvdXQpICAgICAgICAgICAgICBfUE1faW1wb3J0cy5QTV9pbnQ4NihpbnRubyxpbixvdXQpCisjZGVmaW5lIFBNX2ludDg2eChpbnRubyxpbixvdXQsc3JlZ3MpICAgICAgIF9QTV9pbXBvcnRzLlBNX2ludDg2eChpbnRubyxpbixvdXQsc3JlZ3MpCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLworI2VuZGlmCisKKy8qIEluY2x1ZGUgT1MgZXh0ZW5zaW9ucyBmb3IgaW50ZXJydXB0IGhhbmRsaW5nICovCisKKyNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKKyNpbmNsdWRlICJwbWludC5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1BNQVBJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM1Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGRlY2xhcmluZyBhbGwgdGhlIFBNIGltcG9ydHMgc3RydWN0dXJlIGZvciB0aGUKKyogICAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFBNIGxpYnJhcnkuIEluY2x1ZGVkIGluIGFsbCBjb2RlCisqICAgICAgICAgICAgICAgdGhhdCBuZWVkcyB0byBwYXNzIHRoZSBQTSBpbXBvcnRzIHRvIEJQRCBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1BNX2ltcG9ydHMgIF9WQVJBUEkgX1BNX2ltcG9ydHMgPSB7CisgICAgc2l6ZW9mKFBNX2ltcG9ydHMpLAorICAgIFBNX2dldE1vZGVUeXBlLAorICAgIFBNX2dldEJJT1NQb2ludGVyLAorICAgIFBNX2dldEEwMDAwUG9pbnRlciwKKyAgICBQTV9tYXBQaHlzaWNhbEFkZHIsCisgICAgUE1fbWFsbG9jU2hhcmVkLAorICAgIE5VTEwsCisgICAgUE1fZnJlZVNoYXJlZCwKKyAgICBQTV9tYXBUb1Byb2Nlc3MsCisgICAgUE1fbWFwUmVhbFBvaW50ZXIsCisgICAgUE1fYWxsb2NSZWFsU2VnLAorICAgIFBNX2ZyZWVSZWFsU2VnLAorICAgIFBNX2FsbG9jTG9ja2VkTWVtLAorICAgIFBNX2ZyZWVMb2NrZWRNZW0sCisgICAgUE1fY2FsbFJlYWxNb2RlLAorICAgIFBNX2ludDg2LAorICAgIFBNX2ludDg2eCwKKyAgICBEUE1JX2ludDg2LAorICAgIFBNX2F2YWlsYWJsZU1lbW9yeSwKKyAgICBQTV9nZXRWRVNBQnVmLAorICAgIFBNX2dldE9TVHlwZSwKKyAgICBQTV9mYXRhbEVycm9yLAorICAgIFBNX3NldEJhbmtBLAorICAgIFBNX3NldEJhbmtBQiwKKyAgICBQTV9zZXRDUlRTdGFydCwKKyAgICBQTV9nZXRDdXJyZW50UGF0aCwKKyAgICBQTV9nZXRWQkVBRlBhdGgsCisgICAgUE1fZ2V0TnVjbGV1c1BhdGgsCisgICAgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgsCisgICAgUE1fZ2V0VW5pcXVlSUQsCisgICAgUE1fZ2V0TWFjaGluZU5hbWUsCisgICAgVkZfYXZhaWxhYmxlLAorICAgIFZGX2luaXQsCisgICAgVkZfZXhpdCwKKyAgICBQTV9vcGVuQ29uc29sZSwKKyAgICBQTV9nZXRDb25zb2xlU3RhdGVTaXplLAorICAgIFBNX3NhdmVDb25zb2xlU3RhdGUsCisgICAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSwKKyAgICBQTV9jbG9zZUNvbnNvbGUsCisgICAgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbiwKKyAgICBQTV9zZXRPU1NjcmVlbldpZHRoLAorICAgIFBNX2VuYWJsZVdyaXRlQ29tYmluZSwKKyAgICBQTV9iYWNrc2xhc2gsCisgICAgUE1fbG9ja0RhdGFQYWdlcywKKyAgICBQTV91bmxvY2tEYXRhUGFnZXMsCisgICAgUE1fbG9ja0NvZGVQYWdlcywKKyAgICBQTV91bmxvY2tDb2RlUGFnZXMsCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIsCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSwKKyAgICBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIsCisgICAgUE1fZG9CSU9TUE9TVCwKKyAgICBQTV9nZXRCb290RHJpdmUsCisgICAgUE1fZnJlZVBoeXNpY2FsQWRkciwKKyAgICBQTV9pbnBiLAorICAgIFBNX2lucHcsCisgICAgUE1faW5wZCwKKyAgICBQTV9vdXRwYiwKKyAgICBQTV9vdXRwdywKKyAgICBQTV9vdXRwZCwKKyAgICBOVUxMLAorICAgIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaywKKyAgICBQTV9oYXZlQklPU0FjY2VzcywKKyAgICBQTV9rYmhpdCwKKyAgICBQTV9nZXRjaCwKKyAgICBQTV9maW5kQlBELAorICAgIFBNX2dldFBoeXNpY2FsQWRkciwKKyAgICBQTV9zbGVlcCwKKyAgICBQTV9nZXRDT01Qb3J0LAorICAgIFBNX2dldExQVFBvcnQsCisgICAgUE1fbG9hZExpYnJhcnksCisgICAgUE1fZ2V0UHJvY0FkZHJlc3MsCisgICAgUE1fZnJlZUxpYnJhcnksCisgICAgUENJX2VudW1lcmF0ZSwKKyAgICBQQ0lfYWNjZXNzUmVnLAorICAgIFBDSV9zZXRIYXJkd2FyZUlSUSwKKyAgICBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSwKKyAgICBOVUxMLAorICAgIFBDSUJJT1NfZ2V0RW50cnksCisgICAgQ1BVX2dldFByb2Nlc3NvclR5cGUsCisgICAgQ1BVX2hhdmVNTVgsCisgICAgQ1BVX2hhdmUzRE5vdywKKyAgICBDUFVfaGF2ZVNTRSwKKyAgICBDUFVfaGF2ZVJEVFNDLAorICAgIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwKKyAgICBaVGltZXJJbml0LAorICAgIExaVGltZXJPbiwKKyAgICBMWlRpbWVyTGFwLAorICAgIExaVGltZXJPZmYsCisgICAgTFpUaW1lckNvdW50LAorICAgIExaVGltZXJPbkV4dCwKKyAgICBMWlRpbWVyTGFwRXh0LAorICAgIExaVGltZXJPZmZFeHQsCisgICAgTFpUaW1lckNvdW50RXh0LAorICAgIFVMWlRpbWVyT24sCisgICAgVUxaVGltZXJMYXAsCisgICAgVUxaVGltZXJPZmYsCisgICAgVUxaVGltZXJDb3VudCwKKyAgICBVTFpSZWFkVGltZSwKKyAgICBVTFpFbGFwc2VkVGltZSwKKyAgICBVTFpUaW1lclJlc29sdXRpb24sCisgICAgUE1fZmluZEZpcnN0RmlsZSwKKyAgICBQTV9maW5kTmV4dEZpbGUsCisgICAgUE1fZmluZENsb3NlLAorICAgIFBNX21ha2VwYXRoLAorICAgIFBNX3NwbGl0cGF0aCwKKyAgICBQTV9kcml2ZVZhbGlkLAorICAgIFBNX2dldGRjd2QsCisgICAgUE1fc2V0RmlsZUF0dHIsCisgICAgUE1fbWtkaXIsCisgICAgUE1fcm1kaXIsCisgICAgUE1fZ2V0RmlsZUF0dHIsCisgICAgUE1fZ2V0RmlsZVRpbWUsCisgICAgUE1fc2V0RmlsZVRpbWUsCisgICAgQ1BVX2dldFByb2Nlc3Nvck5hbWUsCisgICAgUE1fZ2V0VkdBU3RhdGVTaXplLAorICAgIFBNX3NhdmVWR0FTdGF0ZSwKKyAgICBQTV9yZXN0b3JlVkdBU3RhdGUsCisgICAgUE1fdmdhQmxhbmtEaXNwbGF5LAorICAgIFBNX3ZnYVVuYmxhbmtEaXNwbGF5LAorICAgIFBNX2Jsb2NrVW50aWxUaW1lb3V0LAorICAgIF9QTV9hZGQ2NCwKKyAgICBfUE1fc3ViNjQsCisgICAgX1BNX211bDY0LAorICAgIF9QTV9kaXY2NCwKKyAgICBfUE1fc2hyNjQsCisgICAgX1BNX3NhcjY0LAorICAgIF9QTV9zaGw2NCwKKyAgICBfUE1fbmVnNjQsCisgICAgUENJX2ZpbmRCQVJTaXplLAorICAgIFBDSV9yZWFkUmVnQmxvY2ssCisgICAgUENJX3dyaXRlUmVnQmxvY2ssCisgICAgUE1fZmx1c2hUTEIsCisgICAgUE1fdXNlTG9jYWxNYWxsb2MsCisgICAgUE1fbWFsbG9jLAorICAgIFBNX2NhbGxvYywKKyAgICBQTV9yZWFsbG9jLAorICAgIFBNX2ZyZWUsCisgICAgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UsCisgICAgUE1fYWxsb2NQYWdlLAorICAgIFBNX2ZyZWVQYWdlLAorICAgIFBNX2FncEluaXQsCisgICAgUE1fYWdwRXhpdCwKKyAgICBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwsCisgICAgUE1fYWdwUmVsZWFzZVBoeXNpY2FsLAorICAgIFBNX2FncENvbW1pdFBoeXNpY2FsLAorICAgIFBNX2FncEZyZWVQaHlzaWNhbCwKKyAgICBQQ0lfZ2V0TnVtRGV2aWNlcywKKyAgICBQTV9zZXRMb2NhbEJQRFBhdGgsCisjaWZkZWYgX19XSU5ET1dTMzJfXworICAgIFBNX2xvYWREaXJlY3REcmF3LAorICAgIFBNX3VubG9hZERpcmVjdERyYXcsCisgICAgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdywKKyAgICBQTV9kb1N1c3BlbmRBcHAsCisjZWxzZQorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisjZW5kaWYKKyAgICB9OworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbnQuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNzZkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbnQuaApAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUmVhbCBtb2RlIGFuZCAxNi8zMiBiaXQgUHJvdGVjdGVkIE1vZGUKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIGludGVycnVwdCBoYW5kbGluZyBleHRlbnNpb25zIHRvIHRoZSBPUworKiAgICAgICAgICAgICAgIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeS4gVGhlc2UgZXh0ZW5zaW9ucyBpbmNsdWRlcworKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaW50ZXJydXB0IGhhbmRsaW5nLCBhbGxvd2luZyBhbGwgY29tbW9uIGludGVycnVwdAorKiAgICAgICAgICAgICAgIGhhbmRsZXJzIHRvIGJlIGhvb2tlZCBhbmQgaGFuZGxlZCBkaXJlY3RseSB3aXRoIG5vcm1hbCBDCisqICAgICAgICAgICAgICAgZnVuY3Rpb25zLCBib3RoIGluIDE2IGJpdCBhbmQgMzIgYml0IG1vZGVzLiBOb3RlIGhvd2V2ZXIgdGhhdAorKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaGFuZGxpbmcgZG9lcyBub3QgbWVhbiBzbG93IHBlcmZvcm1hbmNlISBBbGwgbG93CisqICAgICAgICAgICAgICAgbGV2ZWwgaW50ZXJydXB0IGhhbmRsaW5nIGlzIGRvbmUgZWZmaWNpZW50bHkgaW4gYXNzZW1ibGVyCisqICAgICAgICAgICAgICAgZm9yIHNwZWVkICh3ZWxsIGFjdHVhbGx5IG5lY2Vzc2FyeSB0byBpbnN1bGF0ZSB0aGUKKyogICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBmcm9tIHRoZSBsYWNrIG9mIGZhciBwb2ludGVycyBpbiAzMiBiaXQgUE0pLiBUaGUKKyogICAgICAgICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlcnMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6CisqCisqICAgICAgICAgICAgICAgICAgIE1vdXNlICgweDMzIGNhbGxiYWNrKQorKiAgICAgICAgICAgICAgICAgICBUaW1lciBUaWNrICgweDgpCisqICAgICAgICAgICAgICAgICAgIEtleWJvYXJkICgweDkgYW5kIDB4MTUpCisqICAgICAgICAgICAgICAgICAgIENvbnRyb2wgQy9CcmVhayAoMHgyMy8weDFCKQorKiAgICAgICAgICAgICAgICAgICBDcml0aWNhbCBFcnJvciAoMHgyNCkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19QTUlOVF9ICisjZGVmaW5lIF9fUE1JTlRfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19TTVgzMl9fCisvKiBQQyBpbnRlcnJ1cHRzIChFbnN1cmUgY29uc2lzdGVudCB3aXRoIHBtZS5pbmMpICovCisjZGVmaW5lIFBNX0lSUTAgICAgICAweDQwCisjZGVmaW5lIFBNX0lSUTEgICAgICAoUE1fSVJRMCsxKQorI2RlZmluZSBQTV9JUlE2ICAgICAgKFBNX0lSUTArNikKKyNkZWZpbmUgUE1fSVJRMTQgICAgIChQTV9JUlEwKzE0KQorI2VuZGlmCisKKy8qIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGludGVycnVwdCBoYW5kbGVycyB0aGF0IHdlIHN1cHBvcnQgICAgICovCisKK3R5cGVkZWYgdWludCAgICAoUE1BUElQIFBNX2NyaXRpY2FsSGFuZGxlcikodWludCBheFZhbHVlLHVpbnQgZGlWYWx1ZSk7Cit0eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9icmVha0hhbmRsZXIpKHVpbnQgYnJlYWtIaXQpOwordHlwZWRlZiBzaG9ydCAgIChQTUFQSVAgUE1fa2V5MTVIYW5kbGVyKShzaG9ydCBzY2FuQ29kZSk7Cit0eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9tb3VzZUhhbmRsZXIpKHVpbnQgZXZlbnQsIHVpbnQgYnV0c3RhdGUsaW50IHgsaW50IHksaW50IG1pY2tleVgsaW50IG1pY2tleVkpOworCisvKiBDcmVhdGUgYSB0eXBlIGZvciByZXByZXNlbnRpbmcgZmFyIHBvaW50ZXJzIGluIGJvdGggMTYgYW5kIDMyIGJpdAorICogcHJvdGVjdGVkIG1vZGUuCisgKi8KKworI2lmZGVmICBQTTM4NgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxvbmcgICAgb2ZmOworICAgIHNob3J0ICAgc2VsOworICAgIH0gUE1GQVJQVFI7CisjZGVmaW5lIFBNTlVMTCAgezAsMH0KKyNlbHNlCit0eXBlZGVmIHZvaWQgKlBNRkFSUFRSOworI2RlZmluZSBQTU5VTEwgIE5VTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIFJvdXRpbmUgdG8gbG9hZCBzYXZlIGRlZmF1bHQgZGF0YSBzZWdtZW50IHNlbGVjdG9yIHZhbHVlIGludG8gYSBjb2RlCisgKiBzZWdtZW50IHZhcmlhYmxlLCBhbmQgYW5vdGhlciB0byBsb2FkIHRoZSB2YWx1ZSBpbnRvIHRoZSBEUyByZWdpc3Rlci4KKyAqLworCit2b2lkICAgIFBNQVBJIFBNX2xvYWREUyh2b2lkKTsKK3ZvaWQgICAgUE1BUEkgUE1fc2F2ZURTKHZvaWQpOworCisvKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZS4gVGhlCisgKiBtb3VzZSBoYW5kbGVyIHJvdXRpbmUgaXMgYSBub3JtYWwgQyBmdW5jdGlvbiwgYW5kIHRoZSBQTSBsaWJyYXJ5CisgKiB3aWxsIHRha2UgY2FyZSBvZiBwYXNzaW5nIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdG8gdGhlIGZ1bmN0aW9uLAorICogYW5kIHN3aXRjaGluZyB0byBhIGxvY2FsIHN0YWNrLgorICoKKyAqIE5vdGUgdGhhdCB5b3UgX211c3RfIGxvY2sgdGhlIG1lbW9yeSBjb250YWluaW5nIHRoZSBtb3VzZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCisgKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCisgKi8KKworaW50ICAgICBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssUE1fbW91c2VIYW5kbGVyIG1oKTsKK3ZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKTsKKworLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAorICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKKyAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKKworLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAorICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKKyAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKKworLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRpbWVyIGludGVycnVwdCBoYW5kbGVycy4KKyAqCisgKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKKyAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KKyAqLworCit2b2lkICAgIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIGloKTsKK3ZvaWQgICAgUE1BUEkgUE1fY2hhaW5QcmV2VGltZXIodm9pZCk7Cit2b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCk7CisKKy8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIGtleWJvYXJkIGludGVycnVwdCBoYW5kbGVycy4KKyAqCisgKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKKyAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KKyAqLworCit2b2lkICAgIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBpaCk7Cit2b2lkICAgIFBNQVBJIFBNX2NoYWluUHJldktleSh2b2lkKTsKK3ZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCk7CisKKy8qIFJvdXRpbmVzIHRvIGhvb2sgYW5kIHVuaG9vayB0aGUgYWx0ZXJuYXRlIEludCAxNWgga2V5Ym9hcmQgaW50ZXJjZXB0CisgKiBjYWxsb3V0IHJvdXRpbmUuIFlvdXIgZXZlbnQgaGFuZGxlciB3aWxsIG5lZWQgdG8gcmV0dXJuIHRoZSBmb2xsb3dpbmc6CisgKgorICogIHNjYW5Db2RlICAgIC0gTGV0IHRoZSBCSU9TIHByb2Nlc3Mgc2NhbiBjb2RlIChjaGFpbnMgdG8gcHJldmlvdXMgaGFuZGxlcikKKyAqICAwICAgICAgICAgICAtIFlvdSBoYXZlIHByb2Nlc3NlZCB0aGUgc2NhbiBjb2RlIHNvIGZsdXNoIGZyb20gQklPUworICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCisgKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCisgKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKKyAqLworCit2b2lkICAgIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIgaWgpOwordm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpOworCisvKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCByZW1vdmUgdGhlIGNvbnRyb2wgYy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlcnMuCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHlvdSBjYW4gY2FsbAorICogdGhlIHN1cHBsaWVkIHJvdXRpbmVzIHRvIHRlc3QgdGhlIHN0YXR1cyBvZiB0aGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrCisgKiBmbGFncy4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnIHRvIHRoZXNlIHJvdXRpbmVzLAorICogdGhlIGludGVybmFsIGZsYWdzIHdpbGwgYmUgcmVzZXQgaW4gb3JkZXIgdG8gY2F0Y2ggYW5vdGhlciBDdHJsLUMgb3IKKyAqIEN0cmwtQnJlYWsgaW50ZXJydXB0LgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKTsKK2ludCAgICAgUE1BUEkgUE1fY3RybENIaXQoaW50IGNsZWFyRmxhZyk7CitpbnQgICAgIFBNQVBJIFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKTsKK3ZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKTsKKworLyogUm91dGluZSB0byBpbnN0YWxsIGFuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIHRoYXQgd2lsbCBjYWxsIHlvdXIKKyAqIGNvZGUgZGlyZWN0bHkuIFRoaXMgaXMgbm90IGF2YWlsYWJsZSB1bmRlciBhbGwgRE9TIGV4dGVuZGVycywgYnV0IGRvZXMKKyAqIHdvcmsgdW5kZXIgcmVhbCBtb2RlLCBET1M0R1cgYW5kIFgzMi1WTS4gSXQgZG9lcyBub3Qgd29yayB1bmRlciB0aGUKKyAqIFBvd2VyUGFjayAzMiBiaXQgRE9TIGV4dGVuZGVycy4gSWYgeW91IGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0IGxldCB1cyBrbm93IQorICoKKyAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGVpdGhlciBpbnN0YWxsIG9uZSBvciB0aGUgb3RoZXIsIGJ1dCBub3QgYm90aCEKKyAqLworCit2b2lkICAgIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKTsKKworLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyLiBUaGUgaW50ZXJydXB0CisgKiBpcyBoYW5kbGVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHRoZSBvcGVyYXRpb24gd2lsbCBhbHdheXMgYmUgZmFpbGVkLgorICogWW91IGNhbiBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyIHdpdGggdGhlCisgKiBhcHByb3ByaWF0ZSBmdW5jdGlvbi4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnLCB0aGUKKyAqIGludGVybmFsIGZsYWcgd2lsbCBiZSByZXNldCByZWFkeSB0byBjYXRjaCBhbm90aGVyIGNyaXRpY2FsIGVycm9yLgorICovCisKK3ZvaWQgICAgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKTsKK2ludCAgICAgUE1BUEkgUE1fY3JpdGljYWxFcnJvcihpbnQgKmF4VmFsdWUsIGludCAqZGlWYWx1ZSwgaW50IGNsZWFyRmxhZyk7Cit2b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCk7CisKKy8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhbiBhbHRlcm5hdGUgY3JpdGljYWwgaGFuZGxlciB0aGF0IHdpbGwgY2FsbCB5b3VyCisgKiBjb2RlIGRpcmVjdGx5LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCisgKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCisgKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKKyAqCisgKiBOb3RlIHRoYXQgeW91IHNob3VsZCBlaXRoZXIgaW5zdGFsbCBvbmUgb3IgdGhlIG90aGVyLCBidXQgbm90IGJvdGghCisgKi8KKwordm9pZCAgICBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlcik7CisKKy8qIEZ1bmN0aW9ucyB0byBtYW5hZ2UgcHJvdGVjdGVkIG1vZGUgb25seSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KKwordm9pZCAgICBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKTsKK3ZvaWQgICAgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpaCk7Cit2b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fUE1JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2guaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiZmZhYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmgKQEAgLTAsMCArMSw3MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBHZW5lcmFsIGhlYWRlciBmaWxlIGZvciBvcGVyYXRpbmcgc3lzdGVtIHBvcnRhYmxlIGNvZGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fU0NJVEVDSF9ICisjZGVmaW5lIF9fU0NJVEVDSF9ICisKKy8qIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBkZWZpbmVzIHRvIGlkZW50aWZ5IHRoZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudDoKKyAqCisgKiAgX18xNkJJVF9fICAgICAgIENvbXBpbGluZyBmb3IgMTYgYml0IGNvZGUgKGFueSBlbnZpcm9ubWVudCkKKyAqICBfXzMyQklUX18gICAgICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgY29kZSAoYW55IGVudmlyb25tZW50KQorICogIF9fTVNET1NfXyAgICAgICBDb21waWxpbmcgZm9yIE1TLURPUyAoaW5jbHVkZXMgX19XSU5ET1dTMTZfXywgX19XSU4zODZfXykKKyAqICBfX1JFQUxET1NfXyAgICAgQ29tcGlsaW5nIGZvciBNUy1ET1MgKGV4Y2x1ZGVzIF9fV0lORE9XUzE2X18pCisgKiAgX19NU0RPUzE2X18gICAgIENvbXBpbGluZyBmb3IgMTYgYml0IE1TLURPUworICogIF9fTVNET1MzMl9fICAgICBDb21waWxpbmcgZm9yIDMyIGJpdCBNUy1ET1MKKyAqICBfX1dJTkRPV1NfXyAgICAgQ29tcGlsaW5nIGZvciBXaW5kb3dzCisgKiAgX19XSU5ET1dTMTZfXyAgIENvbXBpbGluZyBmb3IgMTYgYml0IFdpbmRvd3MgKF9fTVNET1NfXyBhbHNvIGRlZmluZWQpCisgKiAgX19XSU5ET1dTMzJfXyAgIENvbXBpbGluZyBmb3IgMzIgYml0IFdpbmRvd3MKKyAqICBfX1dJTjMyX1ZYRF9fICAgQ29tcGlsaW5nIGZvciBhIDMyLWJpdCBDIGJhc2VkIFZ4RAorICogIF9fTlRfRFJJVkVSX18gICBDb21waWxpbmcgZm9yIGEgMzItYml0IEMgYmFzZWQgTlQgZGV2aWNlIGRyaXZlcgorICogIF9fT1MyX18gICAgICAgICBDb21waWxpbmcgZm9yIE9TLzIKKyAqICBfX09TMl8xNl9fICAgICAgQ29tcGlsaW5nIGZvciAxNiBiaXQgT1MvMgorICogIF9fT1MyXzMyX18gICAgICBDb21waWxpbmcgZm9yIDMyIGJpdCBPUy8yCisgKiAgX19VTklYX18gICAgICAgIENvbXBpbGluZyBmb3IgVW5peAorICogIF9fUU5YX18gICAgICAgICBDb21waWxpbmcgZm9yIHRoZSBRTlggcmVhbHRpbWUgT1MgKFVuaXggY29tcGF0aWJsZSkKKyAqICBfX0xJTlVYX18gICAgICAgQ29tcGlsaW5nIGZvciB0aGUgTGludXggT1MgKFVuaXggY29tcGF0aWJsZSkKKyAqICBfX0ZSRUVCU0RfXyAgICAgQ29tcGlsaW5nIGZvciB0aGUgRnJlZUJTRCBPUyAoVW5peCBjb21wYXRpYmxlKQorICogIF9fQkVPU19fICAgICAgICBDb21waWxpbmcgZm9yIHRoZSBCZU9TIChVbml4IGNvbXBhdGlibGUpCisgKiAgX19TTVgzMl9fICAgICAgIENvbXBpbGluZyBmb3IgdGhlIFNNWCAzMi1iaXQgUmVhbCBUaW1lIE9TCisgKiAgX19FTkVBX09TRV9fICAgIENvbXBpbGluZyBmb3IgdGhlIE9TRSBlbWJlZGRlZCBPUworICogIF9fUlRUQVJHRVRfXyAgICBDb21waWxpbmcgZm9yIHRoZSBSVFRhcmdldCAzMi1iaXQgZW1iZWRkZWQgT1MKKyAqICBfX01BQ09TX18gICAgICAgQ29tcGlsaW5nIGZvciB0aGUgTWFjT1MgcGxhdGZvcm0gKFBvd2VyUEMpCisgKiAgX19EUklWRVJfXyAgICAgIENvbXBpbGluZyBmb3IgYSAzMi1iaXQgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVyCisgKiAgX19DT05TT0xFX18gICAgIENvbXBpbGluZyBmb3IgYSBmdWxsc2NyZWVuIE9TIGNvbnNvbGUgbW9kZQorICogIF9fU05BUF9fICAgICAgICBDb21waWxpbmcgYXMgYSBTbmFwIGV4ZWN1dGVhYmxlIG9yIGR5bmFtaWMgbGlicmFyeQorICoKKyAqICBfX0lOVEVMX18gICAgICAgQ29tcGlsaW5nIGZvciBJbnRlbCBDUFUncworICogIF9fQUxQSEFfXyAgICAgICBDb21waWxpbmcgZm9yIERFQyBBbHBoYSBDUFUncworICogIF9fTUlQU19fICAgICAgICBDb21waWxpbmcgZm9yIE1JUFMgQ1BVJ3MKKyAqICBfX1BQQ19fICAgICAgICAgQ29tcGlsaW5nIGZvciBQb3dlclBDIENQVSdzCisgKiAgX19NQzY4S19fICAgICAgIENvbXBpbGluZyBmb3IgTW90b3JvbGEgNjgweDAKKyAqCisgKiAgX19CSUdfRU5ESUFOX18gIENvbXBpbGluZyBmb3IgYSBiaWcgZW5kaWFuIHByb2Nlc3NvcgorICoKKyAqLworCisjaWZkZWYgIF9fU0NfXworI2lmICAgICBfX0lOVFNJWkUgPT0gNAorI2RlZmluZSBfX1NDMzg2X18KKyNlbmRpZgorI2VuZGlmCisKKy8qIERldGVybWluZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBjb21waWxlciBzcGVjaWZpYyAqLworCisjaWZkZWYgIF9fR05VQ19fCisjaWZkZWYgIF9fY3BsdXNwbHVzCisvLyBHKysgY3VycmVudGx5IGZ1Y2tzIHRoaXMgdXAhCisjZGVmaW5lIF9fY2RlY2wKKyNkZWZpbmUgX19zdGRjYWxsCisjZWxzZQorI3VuZGVmICBfX2NkZWNsCisjdW5kZWYgIF9fc3RkY2FsbAorI2RlZmluZSBfX2NkZWNsICAgICBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorI2RlZmluZSBfX3N0ZGNhbGwgICBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjZW5kaWYKKyNkZWZpbmUgX19GTEFUX18gICAgICAgICAgICAvKiBHQ0MgaXMgYWx3YXlzIDMyIGJpdCBmbGF0IG1vZGVsICAgICAgICAgICovCisjZGVmaW5lIF9fSEFTX0JPT0xfXyAgICAgICAgLyogTGF0ZXN0IEdOVSBDKysgaGFzIGlib29sIHR5cGUgICAgICAgICAgICAqLworI2RlZmluZSBfX0hBU19MT05HX0xPTkdfXyAgIC8qIEdOVSBDIHN1cHBvcnRzIGxvbmcgbG9uZyB0eXBlICAgICAgICAgICAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgICAvKiBCcmluZyBpbiBmb3IgZGVmaW5pdGlvbiBvZiBOVUxMICAgICAgICAgICovCisjZW5kaWYKKworI2lmZGVmICBfX0JPUkxBTkRDX18KKyNpZiAoX19CT1JMQU5EQ19fID49IDB4NTAwKSB8fCBkZWZpbmVkKENMQVNTTElCX0RFRlNfSCkKKyNkZWZpbmUgX19IQVNfQk9PTF9fICAgICAgICAvKiBCb3JsYW5kIEMrKyA1LjAgZGVmaW5lcyBpYm9vbCB0eXBlICAgICAgICovCisjZW5kaWYKKyNpZiAoX19CT1JMQU5EQ19fID49IDB4NTAyKSAmJiAhZGVmaW5lZChWVE9PTFNEKSAmJiAhZGVmaW5lZChfX1NNWDMyX18pCisjZGVmaW5lIF9fSEFTX0lOVDY0X18gICAgICAgLyogQm9ybGFuZCBDKysgNS4wMiBzdXBwb3J0cyBfX2ludDY0IHR5cGUgICAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoVlRPT0xTRCkgJiYgIWRlZmluZWQoX19TTVgzMl9fKQorI2RlZmluZSBfX0hBU19JTlQ2NF9fICAgICAgIC8qIFZpc3VhbCBDKysgc3VwcG9ydHMgX19pbnQ2NCB0eXBlICAgICAgICAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgKF9fV0FUQ09NQ19fID49IDExMDApICYmICFkZWZpbmVkKFZUT09MU0QpICYmICFkZWZpbmVkKF9fU01YMzJfXykKKyNkZWZpbmUgX19IQVNfSU5UNjRfXyAgICAgICAvKiBXYXRjb20gQysrIDExLjAgc3VwcG9ydHMgX19pbnQ2NCB0eXBlICAgICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERldGVybWluZSB0aGUgY29tcGlsZSB0aW1lIGVudmlyb25tZW50LiBUaGlzIG11c3QgYmUgZG9uZSBmb3IgZWFjaAorICogc3VwcG9ydGVkIHBsYXRmb3JtIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBhdCBjb21waWxlIHRpbWUgdGhlIHRhcmdldAorICogZW52aXJvbm1lbnQsIGhvcGVmdWxseSB3aXRob3V0IHJlcXVpcmluZyAjZGVmaW5lJ3MgZnJvbSB0aGUgdXNlci4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIDMyLWJpdCBiaW5hcnkgY29tcGF0aWJsZSBkcml2ZXIuIENvbXBpbGVkIGFzIFdpbjMyLCBidXQgYXMgT1MgbmV1dHJhbCAqLworI2lmZGVmICBfX0RSSVZFUl9fCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI3VuZGVmICBfX1dJTkRPV1NfXworI3VuZGVmICBfV0lOMzIKKyN1bmRlZiAgX19XSU4zMl9fCisjdW5kZWYgIF9fTlRfXworCisvKiAzMi1iaXQgU25hcCBleGUgb3IgZGxsLiBDb21waWxlZCBhcyBXaW4zMiwgYnV0IGFzIE9TIG5ldXRyYWwgKi8KKyNlbGlmICAgZGVmaW5lZChfX1NOQVBfXykKKyNpZm5kZWYgX18zMkJJVF9fCisjZGVmaW5lIF9fMzJCSVRfXworI2VuZGlmCisjdW5kZWYgIF9fV0lORE9XU19fCisjdW5kZWYgIF9XSU4zMgorI3VuZGVmICBfX1dJTjMyX18KKyN1bmRlZiAgX19OVF9fCisKKy8qIDMyLWJpdCBXaW5kb3dzIFZ4RCBjb21waWxlIGVudmlyb25tZW50ICovCisjZWxpZiAgIGRlZmluZWQoX192dG9vbHNkX2hfKSB8fCBkZWZpbmVkKFZUT09MU0QpCisjaW5jbHVkZSA8dnRvb2xzYy5oPgorI2RlZmluZSBfX1dJTjMyX1ZYRF9fCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2RlZmluZSBfTUFYX1BBVEggICAyNTYKKyN1bmRlZiBfX1dJTkRPV1MzMl9fCisKKy8qIDMyLWJpdCBXaW5kb3dzIE5UIGRyaXZlciBjb21waWxlIGVudmlyb25tZW50OiBUT0RPISEgKi8KKyNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgIm50ZHJpdmVyLmgiCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2RlZmluZSBfTUFYX1BBVEggICAyNTYKKyN1bmRlZiBfX1dJTkRPV1MzMl9fCisKKy8qIDMyLWJpdCBTTVggY29tcGlsZSBlbnZpcm9ubWVudCAqLworI2VsaWYgICBkZWZpbmVkKF9fU01YMzJfXykKKyNpZm5kZWYgX19NU0RPU19fCisjZGVmaW5lIF9fTVNET1NfXworI2VuZGlmCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2lmbmRlZiBfX0NPTlNPTEVfXworI2RlZmluZSBfX0NPTlNPTEVfXworI2VuZGlmCisKKy8qIDMyLWJpdCBFbmVhIE9TRSBlbnZpcm9ubWVudCAqLworI2VsaWYgICBkZWZpbmVkKF9fRU5FQV9PU0VfXykKKyNpZm5kZWYgX18zMkJJVF9fCisjZGVmaW5lIF9fMzJCSVRfXworI2VuZGlmCisjaWZuZGVmIF9fQ09OU09MRV9fCisjZGVmaW5lIF9fQ09OU09MRV9fCisjZW5kaWYKKworLyogMzItYml0IFJUVGFyZ2V0LTMyIGVudmlyb25tZW50ICovCisjZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQorI2lmbmRlZiBfXzMyQklUX18KKyNkZWZpbmUgX18zMkJJVF9fCisjZW5kaWYKKyNpZm5kZWYgX19DT05TT0xFX18KKyNkZWZpbmUgX19DT05TT0xFX18KKyNlbmRpZgorCisvKiAzMi1iaXQgZXh0ZW5kZWQgRE9TIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KKyNlbGlmICAgZGVmaW5lZChfX01TRE9TX18pIHx8IGRlZmluZWQoX19NU0RPUzMyX18pIHx8IGRlZmluZWQoX19ET1NfXykgfHwgZGVmaW5lZChfX0RQTUkzMl9fKSB8fCAoZGVmaW5lZChNX0k4NikgJiYgKCFkZWZpbmVkKF9fU0MzODZfXykgJiYgIWRlZmluZWQoTV9JMzg2KSkpIHx8IGRlZmluZWQoVE5UKQorI2lmbmRlZiBfX01TRE9TX18KKyNkZWZpbmUgX19NU0RPU19fCisjZW5kaWYKKyNpZiAgICAgZGVmaW5lZChfX01TRE9TMzJfXykgfHwgZGVmaW5lZChfXzM4Nl9fKSB8fCBkZWZpbmVkKF9fRkxBVF9fKSB8fCBkZWZpbmVkKF9fTlRfXykgfHwgZGVmaW5lZChfX1NDMzg2X18pCisjaWZuZGVmIF9fTVNET1MzMl9fCisjZGVmaW5lIF9fTVNET1MzMl9fCisjZW5kaWYKKyNpZm5kZWYgX18zMkJJVF9fCisjZGVmaW5lIF9fMzJCSVRfXworI2VuZGlmCisjaWZuZGVmIF9fUkVBTERPU19fCisjZGVmaW5lIF9fUkVBTERPU19fCisjZW5kaWYKKyNpZm5kZWYgX19DT05TT0xFX18KKyNkZWZpbmUgX19DT05TT0xFX18KKyNlbmRpZgorCisvKiAxNi1iaXQgV2luZG93cyBjb21waWxlIGVudmlyb25tZW50ICovCisjZWxpZiAgIChkZWZpbmVkKF9XaW5kb3dzKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSkgJiYgIWRlZmluZWQoX19EUE1JMTZfXykKKyNpZm5kZWYgX18xNkJJVF9fCisjZGVmaW5lIF9fMTZCSVRfXworI2VuZGlmCisjaWZuZGVmIF9fV0lORE9XUzE2X18KKyNkZWZpbmUgX19XSU5ET1dTMTZfXworI2VuZGlmCisjaWZuZGVmIF9fV0lORE9XU19fCisjZGVmaW5lIF9fV0lORE9XU19fCisjZW5kaWYKKyNpZm5kZWYgX19NU0RPU19fCisjZGVmaW5lIF9fTVNET1NfXworI2VuZGlmCisKKy8qIDE2LWJpdCBET1MgY29tcGlsZSBlbnZpcm9ubWVudCAqLworI2Vsc2UKKyNpZm5kZWYgX18xNkJJVF9fCisjZGVmaW5lIF9fMTZCSVRfXworI2VuZGlmCisjaWZuZGVmIF9fTVNET1MxNl9fCisjZGVmaW5lIF9fTVNET1MxNl9fCisjZW5kaWYKKyNpZm5kZWYgX19SRUFMRE9TX18KKyNkZWZpbmUgX19SRUFMRE9TX18KKyNlbmRpZgorI2lmbmRlZiBfX0NPTlNPTEVfXworI2RlZmluZSBfX0NPTlNPTEVfXworI2VuZGlmCisjZW5kaWYKKworLyogMzItYml0IFdpbmRvd3MgY29tcGlsZSBlbnZpcm9ubWVudCAqLworI2VsaWYgICBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19OVF9fKQorI2lmbmRlZiBfXzMyQklUX18KKyNkZWZpbmUgX18zMkJJVF9fCisjZW5kaWYKKyNpZm5kZWYgX19XSU5ET1dTMzJfXworI2RlZmluZSBfX1dJTkRPV1MzMl9fCisjZW5kaWYKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIF9XSU4zMiAgICAgICAgICAgICAgICAgIC8qIE1pY3Jvc29mdCBXaW4zMiBTREsgaGVhZGVycyB1c2UgX1dJTjMyICovCisjZW5kaWYKKyNpZm5kZWYgV0lOMzIKKyNkZWZpbmUgV0lOMzIgICAgICAgICAgICAgICAgICAgLyogT3BlbkdMIGhlYWRlcnMgdXNlIFdJTjMyICovCisjZW5kaWYKKyNpZm5kZWYgX19XSU5ET1dTX18KKyNkZWZpbmUgX19XSU5ET1dTX18KKyNlbmRpZgorCisvKiAzMi1iaXQgT1MvMiBWREQgY29tcGlsZSBlbnZpcm9ubWVudCAqLworLyogV2UncmUgYXNzdW1pbmcgKGZvciBub3cpIHRoYXQgQ0wzODYgbXVzdCBiZSB1c2VkICovCisjZWxpZiAgIGRlZmluZWQoTVNET1MpICYmIGRlZmluZWQoTV9JMzg2KQorLyogZml4ZXMgbmVjZXNzYXJ5IHRvIGNvbXBpbGUgd2l0aCBDTDM4NiAqLworI2RlZmluZSBfX2NkZWNsICBfY2RlY2wKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKKworI2luY2x1ZGUgPG12ZG0uaD4KKworLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc29tZXdoZXJlIGVsc2UuLi4gICAgICAgICAgICAgICAgICovCisvKiBJbmxpbmUgZWxpZ2libGUgZnVuY3Rpb25zICh3ZSBoYXZlIG5vIENSVCBsaWJzIGZvciBDTDM4NikgKi8KKyNwcmFnbWEgaW50cmluc2ljIChzdHJjcHksIHN0cmNtcCwgc3RybGVuLCBzdHJjYXQpCisjcHJhZ21hIGludHJpbnNpYyAobWVtY21wLCBtZW1jcHksIG1lbXNldCkKKworI2RlZmluZSBfX09TMl9WRERfXworI2lmbmRlZiBfXzMyQklUX18KKyNkZWZpbmUgX18zMkJJVF9fCisjZW5kaWYKKyNkZWZpbmUgQ0NITUFYUEFUSCAgMjU2CisjZGVmaW5lIF9NQVhfUEFUSCAgIDI1NgorI2lmbmRlZiBfX09TMl9fCisjZGVmaW5lIF9fT1MyX18KKyNlbmRpZgorI2lmbmRlZiBfX09TMl8zMl9fCisjZGVmaW5lIF9fT1MyXzMyX18KKyNlbmRpZgorCisvKiAxNi1iaXQgT1MvMiBjb21waWxlIGVudmlyb25tZW50ICovCisjZWxpZiAgIGRlZmluZWQoX19PUzJfMTZfXykKKyNpZm5kZWYgX19PUzJfXworI2RlZmluZSBfX09TMl9fCisjZW5kaWYKKyNpZm5kZWYgX18xNkJJVF9fCisjZGVmaW5lIF9fMTZCSVRfXworI2VuZGlmCisjaWZuZGVmIF9fT1MyX1BNX18KKyNpZm5kZWYgX19DT05TT0xFX18KKyNkZWZpbmUgX19DT05TT0xFX18KKyNlbmRpZgorI2VuZGlmCisKKy8qIDMyLWJpdCBPUy8yIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KKyNlbGlmICAgZGVmaW5lZChfX09TMl9fKSB8fCBkZWZpbmVkKF9fT1MyXzMyX18pCisjaWZuZGVmIF9fT1MyX18KKyNkZWZpbmUgX19PUzJfXworI2VuZGlmCisjaWZuZGVmIF9fT1MyXzMyX18KKyNkZWZpbmUgX19PUzJfMzJfXworI2VuZGlmCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2lmbmRlZiBfX09TMl9QTV9fCisjaWZuZGVmIF9fQ09OU09MRV9fCisjZGVmaW5lIF9fQ09OU09MRV9fCisjZW5kaWYKKyNlbmRpZgorCisvKiAzMi1iaXQgUU5YIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KKyNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQorI2lmbmRlZiBfXzMyQklUX18KKyNkZWZpbmUgX18zMkJJVF9fCisjZW5kaWYKKyNpZm5kZWYgX19VTklYX18KKyNkZWZpbmUgX19VTklYX18KKyNlbmRpZgorI2lmZGVmICBfX0dOVUNfXworI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fUEhPVE9OX18pICYmICFkZWZpbmVkKF9fWDExX18pCisjaWZuZGVmIF9fQ09OU09MRV9fCisjZGVmaW5lIF9fQ09OU09MRV9fCisjZW5kaWYKKyNlbmRpZgorCisvKiAzMi1iaXQgTGludXggY29tcGlsZSBlbnZpcm9ubWVudCAqLworI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykgfHwgZGVmaW5lZChsaW51eCkKKyNpZm5kZWYgX19MSU5VWF9fCisjZGVmaW5lIF9fTElOVVhfXworI2VuZGlmCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2lmbmRlZiBfX1VOSVhfXworI2RlZmluZSBfX1VOSVhfXworI2VuZGlmCisjaWZkZWYgIF9fR05VQ19fCisjZGVmaW5lIHN0cmljbXAgc3RyY2FzZWNtcAorI2VuZGlmCisjaWZuZGVmIF9fWDExX18KKyNpZm5kZWYgX19DT05TT0xFX18KKyNkZWZpbmUgX19DT05TT0xFX18KKyNlbmRpZgorI2VuZGlmCisKKy8qIDMyLWJpdCBGcmVlQlNEIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KKyNlbGlmICAgZGVmaW5lZChfX0ZSRUVCU0RfXykKKyNpZm5kZWYgX19GUkVFQlNEX18KKyNkZWZpbmUgX19GUkVFQlNEX18KKyNlbmRpZgorI2lmbmRlZiBfXzMyQklUX18KKyNkZWZpbmUgX18zMkJJVF9fCisjZW5kaWYKKyNpZm5kZWYgX19VTklYX18KKyNkZWZpbmUgX19VTklYX18KKyNlbmRpZgorI2lmZGVmICBfX0dOVUNfXworI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKKyNlbmRpZgorI2lmbmRlZiBfX1gxMV9fCisjaWZuZGVmIF9fQ09OU09MRV9fCisjZGVmaW5lIF9fQ09OU09MRV9fCisjZW5kaWYKKyNlbmRpZgorCisvKiAzMi1iaXQgQmVPUyBjb21waWxlIGVudmlyb25tZW50ICovCisjZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZgorI2lmbmRlZiBfX1VOSVhfXworI2RlZmluZSBfX1VOSVhfXworI2VuZGlmCisjaWZkZWYgIF9fR05VQ19fCisjZGVmaW5lIHN0cmljbXAgc3RyY2FzZWNtcAorI2VuZGlmCisKKy8qIFVuc3VwcG9ydGVkIE9TISAqLworI2Vsc2UKKyNlcnJvciAgVGhpcyBwbGF0Zm9ybSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCEKKyNlbmRpZgorCisvKiBEZXRlcm1pbmUgdGhlIENQVSB0eXBlIHRoYXQgd2UgYXJlIGNvbXBpbGluZyBmb3IgKi8KKworI2lmICAgICBkZWZpbmVkKF9fTV9BTFBIQSkgfHwgZGVmaW5lZChfX0FMUEhBXykgfHwgZGVmaW5lZChfX0FMUEhBKSB8fCBkZWZpbmVkKF9fYWxwaGEpCisjaWZuZGVmIF9fQUxQSEFfXworI2RlZmluZSBfX0FMUEhBX18KKyNlbmRpZgorI2VsaWYgICBkZWZpbmVkKF9fTV9QUEMpIHx8IGRlZmluZWQoX19QT1dFUkMpCisjaWZuZGVmIF9fUFBDX18KKyNkZWZpbmUgX19QUENfXworI2VuZGlmCisjZWxpZiAgIGRlZmluZWQoX19NX01SWDAwMCkKKyNpZm5kZWYgX19NSVBTX18KKyNkZWZpbmUgX19NSVBTX18KKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgX19JTlRFTF9fCisjZGVmaW5lIF9fSU5URUxfXyAgICAgICAgICAgICAgIC8qIEFzc3VtZSBJbnRlbCBpZiBub3RoaW5nIGZvdW5kICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0byBkZWZpbmUgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yCisgKiBwdWJsaWNseSBhY2Nlc2libGUgZnVuY3Rpb25zOgorICoKKyAqICBfUFVCQVBJICAtIENvbXBpbGVyIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgYWxsIHB1YmxpYyAnQycgZnVuY3Rpb25zCisgKiAgX0FTTUFQSSAgLSBDYWxsaW5nIGNvbnZlbnRpb25zIGZvciBhbGwgcHVibGljIGFzc2VtYmxlciBmdW5jdGlvbnMKKyAqICBfVkFSQVBJICAtIE1vZGlmaWVycyBmb3IgdmFyaWFibGVzOyBXYXRjb20gQysrIG1hbmdsZXMgQysrIGdsb2JhbHMKKyAqICBfU1REQ0FMTCAtIFdpbjMyIF9fc3RkY2FsbCB3aGVyZSBwb3NzaWJsZSwgX19jZGVjbCBpZiBub3Qgc3VwcG9ydGVkCisgKi8KKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1NDX18pCisjZGVmaW5lIF9fUEFTQ0FMICAgIF9fc3RkY2FsbAorI2Vsc2UKKyNkZWZpbmUgX19QQVNDQUwgICAgX19wYXNjYWwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChOT19TVERDQUxMKQorI2RlZmluZSBfU1REQ0FMTCAgICBfX2NkZWNsCisjZWxzZQorI2RlZmluZSBfU1REQ0FMTCAgICBfX3N0ZGNhbGwKKyNlbmRpZgorCisjaWZkZWYgIF9fV0FUQ09NQ19fCisjaWYgKF9fV0FUQ09NQ19fID49IDEwNTApCisjZGVmaW5lIF9WQVJBUEkgICAgIF9fY2RlY2wKKyNlbHNlCisjZGVmaW5lIF9WQVJBUEkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX1ZBUkFQSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fSUJNQ19fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCisjZGVmaW5lIFBUUl9ERUNMX0lOX0ZST05UCisjZW5kaWYKKworLyogRGVmaW5lIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBhbGwgcHVibGljIGZ1bmN0aW9ucy4gRm9yIHNpbXBsaWNpdHkKKyAqIHdlIGRlZmluZSBhbGwgcHVibGljIGZ1bmN0aW9ucyBhcyBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbnMsIHNvIHRoYXQKKyAqIHRoZXkgYXJlIHRoZSBzYW1lIGFjcm9zcyBhbGwgY29tcGlsZXJzIGFuZCBydW50aW1lIERMTCdzLgorICovCisKKyNkZWZpbmUgX1BVQkFQSSBfX2NkZWNsCisjZGVmaW5lIF9BU01BUEkgX19jZGVjbAorCisvKiBEZXRlcm1pbmUgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRoIGEKKyAqIGNhbGxpbmcgY29udmVudGlvbnMgb3ZlcnJpZGUuIE1vc3QgY29tcGlsZXJzIHJlcXVpcmUgdGhlIGNhbGxpbmcKKyAqIGNvbnZlbnRpb24gdG8gYmUgZGVjbGFyZWQgaW4gZnJvbnQgb2YgdGhlICcqJywgYnV0IG90aGVycyByZXF1aXJlCisgKiBpdCB0byBiZSBkZWNsYXJlZCBhZnRlciB0aGUgJyonLiBXZSBoYW5kbGUgYm90aCBpbiBoZXJlIGRlcGVuZGluZworICogb24gd2hhdCB0aGUgY29tcGlsZXIgcmVxdWlyZXMuCisgKi8KKworI2lmZGVmICBQVFJfREVDTF9JTl9GUk9OVAorI2RlZmluZSBfUFVCQVBJUCAgICAqIF9QVUJBUEkKKyNkZWZpbmUgX0FTTUFQSVAgICAgKiBfQVNNQVBJCisjZWxzZQorI2RlZmluZSBfUFVCQVBJUCAgICBfUFVCQVBJICoKKyNkZWZpbmUgX0FTTUFQSVAgICAgX0FTTUFQSSAqCisjZW5kaWYKKworLyogVXNlZnVsIG1hY3JvcyAqLworCisjZGVmaW5lIFBSSVZBVEUgc3RhdGljCisjZGVmaW5lIFBVQkxJQworCisvKiBUaGlzIEhBUyB0byBiZSAwTCBmb3IgMTYtYml0IHJlYWwgbW9kZSBjb2RlIHRvIHdvcmshISEgKi8KKworI2lmbmRlZiBOVUxMCisjICAgICAgIGRlZmluZSBfTlVMTCAwTAorIyAgICAgICBkZWZpbmUgTlVMTCBfTlVMTAorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjICAgICAgIGRlZmluZSBNQVgoYSxiKSAoICgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1JTgorIyAgICAgICBkZWZpbmUgTUlOKGEsYikgKCAoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2lmbmRlZiBBQlMKKyMgICAgICAgZGVmaW5lIEFCUyhhKSAgICgoYSkgPj0gMCA/IChhKSA6IC0oYSkpCisjZW5kaWYKKyNpZm5kZWYgU0lHTgorIyAgICAgICBkZWZpbmUgU0lHTihhKSAgKChhKSA+IDAgPyAxIDogLTEpCisjZW5kaWYKKworLyogR2VuZXJhbCB0eXBlZGVmcyAqLworCisjaWZuZGVmIF9fR0VOREVGUworI2RlZmluZSBfX0dFTkRFRlMKKyNpZiBkZWZpbmVkKF9fQkVPU19fKQorI2luY2x1ZGUgPFN1cHBvcnREZWZzLmg+CisjZWxzZQorI2lmZGVmIF9fTElOVVhfXworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9fU1RSSUNUX0FOU0lfXwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1bG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50OworI2VuZGlmCisjaWZkZWYgIF9fS0VSTkVMX18KKyNkZWZpbmUgX19HRU5ERUZTXzIKKyNlbmRpZgorI2Vsc2UKKyNpZiAhKGRlZmluZWQoX19RTlhOVE9fXykgJiYgZGVmaW5lZChHRU5FUkFMX1NUUlVDVCkpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIHVsb25nOworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVjaGFyOworI2VuZGlmCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaWJvb2w7ICAgICAgLyogSW50ZWdlciBib29sZWFuIHR5cGUgICAgICAgICAqLworI2lmZGVmICBVU0VfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgZm9yIG9sZGVyIGNvZGUgICAgICAgICAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgYm9vbCAgICAgICAgICAgICAgICBpYm9vbCAgICAgICAvKiBTdGFuZGFyZCBDICAgICAgICAgICAgICAgICAgICovCisjZWxzZQorI2lmbmRlZiBfX0hBU19CT09MX18KKyNkZWZpbmUgYm9vbCAgICAgICAgICAgICAgICBpYm9vbCAgICAgICAvKiBPbGRlciBDKysgY29tcGlsZXJzICAgICAgICAgICovCisjZW5kaWYKKyNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KKyNlbmRpZiAgLyogVVNFX0JPT0wgKi8KKyNlbmRpZiAgLyogX19HRU5ERUZTICovCisKKy8qIE1vcmUgZ2VuZXJhbCB0eXBlZGVmcyBjb21wYXRpYmxlIHdpdGggTGludXgga2VybmVsIGNvZGUgKi8KKworI2lmbmRlZiBfX0dFTkRFRlNfMgorI2RlZmluZSBfX0dFTkRFRlNfMgordHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIHM4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHU4OwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1MTY7CisjaWZkZWYgIF9fMTZCSVRfXwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgIHMzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1MzI7CisjZWxzZQordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIHMzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1MzI7CisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgbG93OworICAgIHMzMiBoaWdoOworICAgIH0gX19pNjQ7CisjaWZkZWYgIF9fSEFTX0xPTkdfTE9OR19fCisjZGVmaW5lIF9fTkFUSVZFX0lOVDY0X18KK3R5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdTY0OworI2VsaWYgICBkZWZpbmVkKF9fSEFTX0lOVDY0X18pICYmICFkZWZpbmVkKF9fMTZCSVRfXykKKyNkZWZpbmUgX19OQVRJVkVfSU5UNjRfXwordHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgIHM2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICB1NjQ7CisjZWxzZQordHlwZWRlZiBfX2k2NCAgICAgICAgICAgICAgIHM2NDsKK3R5cGVkZWYgX19pNjQgICAgICAgICAgICAgICB1NjQ7CisjZW5kaWYKKyNlbmRpZgorCisvKiBCb29sZWFuIHRydXRoIHZhbHVlcyAqLworCisjdW5kZWYgIGZhbHNlCisjdW5kZWYgIHRydWUKKyN1bmRlZiAgTk8KKyN1bmRlZiAgWUVTCisjdW5kZWYgIEZBTFNFCisjdW5kZWYgIFRSVUUKKyNkZWZpbmUgZmFsc2UgICAgICAgMAorI2RlZmluZSB0cnVlICAgICAgICAxCisjZGVmaW5lIE5PICAgICAgICAgIDAKKyNkZWZpbmUgWUVTICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAwCisjZGVmaW5lIFRSVUUgICAgICAgIDEKKworLyogSW5saW5lIGRlYnVnZ2VyIGludGVycnVwdHMgZm9yIFdhdGNvbSBDKysgYW5kIEJvcmxhbmQgQysrICovCisKKyNpZmRlZiAgX19XQVRDT01DX18KK3ZvaWQgRGVidWdJbnQodm9pZCk7CisjcHJhZ21hIGF1eCBEZWJ1Z0ludCA9ICAgICAgICAgICAgICBcCisgICAgImludCAgICAzIjsKK3ZvaWQgRGVidWdWeEQodm9pZCk7CisjcHJhZ21hIGF1eCBEZWJ1Z1Z4RCA9ICAgICAgICAgICAgICBcCisgICAgImludCAgICAxIjsKKyNlbGlmICAgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjZGVmaW5lIERlYnVnSW50KCkgIF9fZW1pdF9fKDB4Q0MpCisjZGVmaW5lIERlYnVnVnhEKCkgIHtfX2VtaXRfXygweENEKTsgX19lbWl0X18oMHgwMSk7fQorI2VsaWYgICBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBEZWJ1Z0ludCgpICBfYXNtIGludCAweDMKKyNkZWZpbmUgRGVidWdWeEQoKSAgX2FzbSBpbnQgMHgxCisjZWxpZiAgIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIERlYnVnSW50KCkgIGFzbSB2b2xhdGlsZSAoImludCAkMHgzIikKKyNkZWZpbmUgRGVidWdWeEQoKSAgYXNtIHZvbGF0aWxlICgiaW50ICQweDEiKQorI2Vsc2UKK3ZvaWQgX0FTTUFQSSBEZWJ1Z0ludCh2b2lkKTsKK3ZvaWQgX0FTTUFQSSBEZWJ1Z1Z4RCh2b2lkKTsKKyNlbmRpZgorCisvKiBNYWNyb3MgdG8gYnJlYWsgb25jZSBhbmQgbmV2ZXIgYnJlYWsgYWdhaW4gKi8KKworI2RlZmluZSBEZWJ1Z0ludE9uY2UoKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpYm9vbCBmaXJzdFRpbWUgPSB0cnVlOyAgXAorICAgIGlmIChmaXJzdFRpbWUpIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsgICAgICAgICAgXAorICAgICAgICBEZWJ1Z0ludCgpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERlYnVnVnhET25jZSgpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlib29sIGZpcnN0VGltZSA9IHRydWU7ICBcCisgICAgaWYgKGZpcnN0VGltZSkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOyAgICAgICAgICBcCisgICAgICAgIERlYnVnVnhEKCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIE1hY3JvcyBmb3IgbGludXggc3RyaW5nIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zICovCisKKyNpZmRlZiAgX19MSU5VWF9fCisjZGVmaW5lIHN0cmljbXAgc3RyY2FzZWNtcAorI2RlZmluZSBzdHJuaWNtcCBzdHJuY2FzZWNtcAorI2VuZGlmCisKKy8qIE1hY3JvcyBmb3IgTlQgZHJpdmVyIHN0cmluZyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyAqLworCisjaWZkZWYgX19OVF9EUklWRVJfXworI2RlZmluZSBzdHJpY21wIF9zdHJpY21wCisjZGVmaW5lIHN0cm5pY21wIF9zdHJuaWNtcAorI2VuZGlmCisKKy8qIEdldCByaWQgb2Ygc29tZSBoZWxhY2lvdXNseSBhbm5veWluZyBWaXN1YWwgQysrIHdhcm5pbmdzISAqLworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19NV0VSS1NfXykgJiYgIWRlZmluZWQoX19TQ19fKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDc2MSkgICAvLyBpbnRlZ3JhbCBzaXplIG1pc21hdGNoIGluIGFyZ3VtZW50OyBjb252ZXJzaW9uIHN1cHBsaWVkCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjQ0KSAgIC8vIGNvbnZlcnNpb24gZnJvbSAndW5zaWduZWQgc2hvcnQgJyB0byAndW5zaWduZWQgY2hhciAnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwMTgpICAgLy8gJzwnIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzA1KSAgIC8vICdpbml0aWFsaXppbmcnIDogdHJ1bmNhdGlvbiBmcm9tICdjb25zdCBkb3VibGUnIHRvICdmbG9hdCcKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2V0IG9mIGRlYnVnZ2luZyBtYWNyb3MgdXNlZCBieSB0aGUgbGlicmFyaWVzLiBJZiB0aGUgZGVidWcgZmxhZyBpcworICogc2V0LCB0aGV5IGFyZSB0dXJuZWQgb24gZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9mIHRoZSBmbGFnLiBVc2VyIGNvZGUKKyAqIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgY2FsbGVkIHdoZW4gYSBjaGVjayBmYWlscywgYW5kIHRoZQorICogTUdMIGRvZXMgdGhpcyBzbyBpdCBjYW4gcmVzdG9yZSB0aGUgc3lzdGVtIGZyb20gZ3JhcGhpY3MgbW9kZSB0byBkaXNwbGF5CisgKiBhbiBlcnJvciBtZXNzYWdlLiBUaGVzZSBmdW5jdGlvbnMgYWxzbyBsb2cgaW5mb3JtYXRpb24gdG8gdGhlCisgKiBzY2l0ZWNoLmxvZyBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgaGFyZCBkcml2ZSB3aGVuIHByb2JsZW1zCisgKiBzaG93IHVwLgorICoKKyAqIElmIHlvdSBzZXQgdGhlIHZhbHVlIG9mIENIRUNLRUQgdG8gYmUgMiwgaXQgd2lsbCBhbHNvIGVuYWJsZSBjb2RlIHRvCisgKiBpbnNlcnQgaGFyZCBjb2RlZCBkZWJ1Z2dlciBpbnRlcnJ1cHQgaW50byB0aGUgc291cmNlIGNvZGUgYXQgdGhlIGxpbmUgb2YKKyAqIGNvZGUgd2hlcmUgdGhlIGNoZWNrIGZhaWwuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBydW4gdGhlIGNvZGUgdW5kZXIgYQorICogZGVidWdnZXIgYXMgaXQgd2lsbCBicmVhayBpbnNpZGUgdGhlIGRlYnVnZ2VyIGJlZm9yZSBleGl0aW5nIHdpdGggYQorICogZmFpbHVyZSBjb25kaXRpb24uCisgKgorICogQWxzbyBmb3IgY29kZSBjb21waWxlZCB0byBydW4gdW5kZXIgV2luZG93cywgd2UgYWxzbyBjYWxsIHRoZQorICogT3V0cHV0RGVidWdTdHJpbmcgZnVuY3Rpb24gdG8gc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGRlYnVnZ2VyCisgKiBzdWNoIGFzIFNvZnQtSUNFIG9yIFdERUIzODYuIEhlbmNlIGlmIHlvdSBnZXQgYW55IG5vbi1mYXRhbCB3YXJuaW5ncyB5b3UKKyAqIHdpbGwgc2VlIHRob3NlIG9uIHRoZSBkZWJ1Z2dlciB0ZXJtaW5hbCBhcyB3ZWxsIGFzIGluIHRoZSBsb2cgZmlsZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKCpfQ0hLX2ZhaWwpKGludCBmYXRhbCxjb25zdCBjaGFyICptc2csY29uc3QgY2hhciAqY29uZCxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKK3ZvaWQgX0NIS19kZWZhdWx0RmFpbChpbnQgZmF0YWwsY29uc3QgY2hhciAqbXNnLGNvbnN0IGNoYXIgKmNvbmQsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7CisKKyNpZmRlZiAgQ0hFQ0tFRAorIyAgICAgICBkZWZpbmUgIENISyh4KSAgICAgIHgKKyNpZiAgICAgQ0hFQ0tFRCA+IDEKKyMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHApID8gKHZvaWQpMCA6IERlYnVnSW50KCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfQ0hLX2ZhaWwoMSwiQ2hlY2sgZmFpbGVkOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgIFwKKyAgICAgICAgICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQorIyAgICAgICBkZWZpbmUgIFdBUk4ocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgocCkgPyAodm9pZCkwIDogRGVidWdJbnQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9DSEtfZmFpbCgwLCJXYXJuaW5nOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgICAgICAgXAorICAgICAgICAgICAgI3AsIF9fRklMRV9fLCBfX0xJTkVfXykpCisjZWxzZQorIyAgICAgICBkZWZpbmUgIENIRUNLKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgocCkgPyAodm9pZCkwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9DSEtfZmFpbCgxLCJDaGVjayBmYWlsZWQ6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgXAorICAgICAgICAgICAgI3AsIF9fRklMRV9fLCBfX0xJTkVfXykpCisjICAgICAgIGRlZmluZSAgV0FSTihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChwKSA/ICh2b2lkKTAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCisgICAgICAgICAgICAjcCwgX19GSUxFX18sIF9fTElORV9fKSkKKyNlbmRpZgorIyAgICAgICBkZWZpbmUgIExPR0ZBVEFMKG1zZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfQ0hLX2ZhaWwoMSwiRmF0YWwgZXJyb3I6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgIFwKKyAgICAgICAgICAgIG1zZywgX19GSUxFX18sIF9fTElORV9fKQorIyAgICAgICBkZWZpbmUgIExPR1dBUk4obXNnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfQ0hLX2ZhaWwoMCwiV2FybmluZzogJyVzJywgZmlsZSAlcywgbGluZSAlZFxuIiwgICAgICAgIFwKKyAgICAgICAgICAgIG1zZywgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKKyMgICAgICAgZGVmaW5lICBDSEsoeCkKKyMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgKCh2b2lkKTApCisjICAgICAgIGRlZmluZSAgV0FSTihwKSAgICAgICAgICgodm9pZCkwKQorIyAgICAgICBkZWZpbmUgIExPR0ZBVEFMKG1zZykgICAoKHZvaWQpMCkKKyMgICAgICAgZGVmaW5lICBMT0dXQVJOKG1zZykgICAgKCh2b2lkKTApCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogX19TQ0lURUNIX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2EyZmMwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2gubWFjCkBAIC0wLDAgKzEsMTMyMSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICBOZXRXaWRlIEFzc2VtYmxlciAoTkFTTSkgb3IgVHVyYm8gQXNzZW1ibGVyIChUQVNNKQorOyogRW52aXJvbm1lbnQ6IEFueSBJbnRlbCBFbnZpcm9ubWVudAorOyoKKzsqIERlc2NyaXB0aW9uOiBNYWNyb3MgdG8gcHJvdmlkZSBtZW1vcnkgbW9kZWwgaW5kZXBlbmRhbnQgYXNzZW1ibHkgbGFuZ3VhZ2UKKzsqICAgICAgICAgICAgICBtb2R1bGUgZm9yIEMgcHJvZ3JhbW1pbmcuIFN1cHBvcnRzIHRoZSBsYXJnZSBhbmQgZmxhdCBtZW1vcnkKKzsqICAgICAgICAgICAgICBtb2RlbHMuCis7KgorOyogICAgICAgICAgICAgIFRoZSBkZWZpbmVzIHRoYXQgeW91IHNob3VsZCB1c2Ugd2hlbiBhc3NlbWJsaW5nIG1vZHVsZXMgdGhhdAorOyogICAgICAgICAgICAgIHVzZSB0aGlzIG1hY3JvIHBhY2thZ2UgYXJlOgorOyoKKzsqICAgICAgICAgICAgICAgICAgX19MQVJHRV9fICAgQXNzZW1ibGUgZm9yIDE2LWJpdCBsYXJnZSBtb2RlbAorOyogICAgICAgICAgICAgICAgICBfX0ZMQVRfXyAgICBBc3NlbWJsZSBmb3IgMzItYml0IEZMQVQgbWVtb3J5IG1vZGVsCis7KiAgICAgICAgICAgICAgICAgIF9fTk9VX18gICAgIE5vIHVuZGVyc2NvcmUgZm9yIGFsbCBleHRlcm5hbCBDIGxhYmVscworOyogICAgICAgICAgICAgICAgICBfX05PVV9WQVJfXyBObyB1bmRlcnNjb3JlIGZvciBnbG9iYWwgdmFyaWFibGVzIG9ubHkKKzsqCis7KiAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlIGZvciAxNi1iaXQgbGFyZ2UgbWVtb3J5IG1vZGVsIHdpdGgKKzsqICAgICAgICAgICAgICBsZWFkaW5nIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMuCis7KgorOyogICAgICAgICAgICAgIFRoZSBtYWluIGludGVudCBvZiB0aGUgbWFjcm8gZmlsZSBpcyB0byBlbmFibGUgcHJvZ3JhbW1lcnMKKzsqICAgICAgICAgICAgICB0byB3cml0ZSBfb25lXyBzZXQgb2Ygc291cmNlIHRoYXQgY2FuIGJlIGFzc2VtYmxlZCB0byBydW4KKzsqICAgICAgICAgICAgICBpbiBlaXRoZXIgMTYgYml0IHJlYWwgYW5kIHByb3RlY3RlZCBtb2RlcyBvciAzMiBiaXQKKzsqICAgICAgICAgICAgICBwcm90ZWN0ZWQgbW9kZSB3aXRob3V0IHRoZSBuZWVkIHRvIHJpZGRsZSB0aGUgY29kZSB3aXRoCis7KiAgICAgICAgICAgICAgJ2lmIGZsYXRtb2RlbCcgc3R5bGUgY29uZGl0aW9uYWwgYXNzZW1ibHkgKGl0IGlzIHN0aWxsIHRoZXJlCis7KiAgICAgICAgICAgICAgYnV0IG5pY2VseSBoaWRkZW4gYnkgYSBtYWNybyBsYXllciB0aGF0IGVuaGFuY2VzIHRoZQorOyogICAgICAgICAgICAgIHJlYWRhYmlsaXR5IGFuZCB1bmRlcnN0YW5kYWJpbGl0eSBvZiB0aGUgcmVzdWx0aW5nIGNvZGUpLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsgSW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBpbiBoZXJlIGRlcGVuZGluZyBvbiB0aGUgYXNzZW1ibGVyLiBOQVNNCis7IGFwcGVhcnMgdG8gYWx3YXlzIHRyeSBhbmQgcGFyc2UgY29kZSwgZXZlbiBpZiBpdCBpcyBpbiBhIG5vbi1jb21waWxpbmcKKzsgYmxvY2sgb2YgYSBpZmRlZiBleHByZXNzaW9uLCBhbmQgaGVuY2UgY3Jhc2hlcyBpZiB3ZSBpbmNsdWRlIHRoZSBUQVNNCis7IG1hY3JvIHBhY2thZ2UgaW4gdGhlIHNhbWUgaGVhZGVyIGZpbGUuIEhlbmNlIHdlIHNwbGl0IHRoZSBtYWNyb3MgdXAgaW50bworOyB0d28gc2VwYXJhdGUgaGVhZGVyIGZpbGVzLgorCitpZmRlZiBfX05BU01fTUFKT1JfXworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBNYWNybyBwYWNrYWdlIHdoZW4gY29tcGlsaW5nIHdpdGggTkFTTS4KKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzsgVHVybiBvZmYgdW5kZXJzY29yZXMgZm9yIGdsb2JhbHMgaWYgZGlzYWJsZWQgZm9yIGFsbCBleHRlcm5hbHMKKworJWlmZGVmICBfX05PVV9fCislZGVmaW5lIF9fTk9VX1ZBUl9fCislZW5kaWYKKworOyBEZWZpbmUgdGhlIF9fV0lORE9XU19fIHN5bWJvbCBpZiB3ZSBhcmUgY29tcGlsaW5nIGZvciBhbnkgV2luZG93cworOyBlbnZpcm9ubWVudAorCislaWZkZWYgIF9fV0lORE9XUzE2X18KKyVkZWZpbmUgX19XSU5ET1dTX18gICAgICAgICAxCislZW5kaWYKKyVpZmRlZiAgX19XSU5ET1dTMzJfXworJWRlZmluZSBfX1dJTkRPV1NfXyAgICAgICAgIDEKKyVkZWZpbmUgX19XSU5ET1dTMzJfMzg2X18gICAxCislZW5kaWYKKworOyBNYWNyb3MgZm9yIGFjY2Vzc2luZyAnZ2VuZXJpYycgcmVnaXN0ZXJzCisKKyVpZmRlZiAgX19GTEFUX18KKyVpZGVmaW5lIF9heCAgICBlYXgKKyVpZGVmaW5lIF9ieCAgICBlYngKKyVpZGVmaW5lIF9jeCAgICBlY3gKKyVpZGVmaW5lIF9keCAgICBlZHgKKyVpZGVmaW5lIF9zaSAgICBlc2kKKyVpZGVmaW5lIF9kaSAgICBlZGkKKyVpZGVmaW5lIF9icCAgICBlYnAKKyVpZGVmaW5lIF9zcCAgICBlc3AKKyVpZGVmaW5lIF9lcworJWlkZWZpbmUgVUNIQVIgIEJZVEUgICAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgorJWlkZWZpbmUgVVNIT1JUIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIHNob3J0CislaWRlZmluZSBVSU5UICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKKyVpZGVmaW5lIFVMT05HICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBsb25nCislaWRlZmluZSBCT09MICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgorJWlkZWZpbmUgRFBUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGRhdGEgcG9pbnRlcgorJWlkZWZpbmUgRkRQVFIgIEZXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKKyVpZGVmaW5lIE5EUFRSICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgorJWlkZWZpbmUgQ1BUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGNvZGUgcG9pbnRlcgorJWlkZWZpbmUgRkNQVFIgIEZXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKKyVpZGVmaW5lIE5DUFRSICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgorJWlkZWZpbmUgRlBUUiAgIE5FQVIgICAgICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCislaWRlZmluZSBEVUlOVCAgZGQgICAgICAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQorJWlkZWZpbmUgaW50c2l6ZSA0CislaWRlZmluZSBmbGF0bW9kZWwgMQorJWVsc2UKKyVpZGVmaW5lIF9heCAgICBheAorJWlkZWZpbmUgX2J4ICAgIGJ4CislaWRlZmluZSBfY3ggICAgY3gKKyVpZGVmaW5lIF9keCAgICBkeAorJWlkZWZpbmUgX3NpICAgIHNpCislaWRlZmluZSBfZGkgICAgZGkKKyVpZGVmaW5lIF9icCAgICBicAorJWlkZWZpbmUgX3NwICAgIHNwCislaWRlZmluZSBfZXMgICAgZXM6CislaWRlZmluZSBVQ0hBUiAgQllURSAgICAgICAgOyBTaXplIG9mIGEgY2hhcmFjdGVyCislaWRlZmluZSBVU0hPUlQgV09SRCAgICAgICAgOyBTaXplIG9mIGEgc2hvcnQKKyVpZGVmaW5lIFVJTlQgICBXT1JEICAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgorJWlkZWZpbmUgVUxPTkcgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGxvbmcKKyVpZGVmaW5lIEJPT0wgICBXT1JEICAgICAgICA7IFNpemUgb2YgYSBib29sZWFuCislaWRlZmluZSBEUFRSICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgZGF0YSBwb2ludGVyCislaWRlZmluZSBGRFBUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgZmFyIGRhdGEgcG9pbnRlcgorJWlkZWZpbmUgTkRQVFIgIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgZGF0YSBwb2ludGVyCislaWRlZmluZSBDUFRSICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgY29kZSBwb2ludGVyCislaWRlZmluZSBGQ1BUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgZmFyIGNvZGUgcG9pbnRlcgorJWlkZWZpbmUgTkNQVFIgIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgY29kZSBwb2ludGVyCislaWRlZmluZSBGUFRSICAgRkFSICAgICAgICAgOyBEaXN0YW5jZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMKKyVpZGVmaW5lIERVSU5UICBkdyAgICAgICAgICA7IERlY2xhcmUgYSBpbnRlZ2VyIHZhcmlhYmxlCislaWRlZmluZSBpbnRzaXplIDIKKyVlbmRpZgorJWlkZWZpbmUgaW52ZXJ0IH4KKyVpZGVmaW5lIG9mZnNldAorJWlkZWZpbmUgdXNlX25hc20KKworOyBDb252ZXJ0IGFsbCBqdW1wcyB0byBuZWFyIGp1bXBzLCBzaW5jZSBOQVNNIGRvZXMgbm90IHNvIHRoaXMgYXV0b21hdGljYWxseQorCislaWRlZmluZSBqbyAgICAgam8gbmVhcgorJWlkZWZpbmUgam5vICAgIGpubyBuZWFyCislaWRlZmluZSBqeiAgICAganogbmVhcgorJWlkZWZpbmUgam56ICAgIGpueiBuZWFyCislaWRlZmluZSBqZSAgICAgamUgbmVhcgorJWlkZWZpbmUgam5lICAgIGpuZSBuZWFyCislaWRlZmluZSBqYiAgICAgamIgIG5lYXIKKyVpZGVmaW5lIGpiZSAgICBqYmUgbmVhcgorJWlkZWZpbmUgamEgICAgIGphICBuZWFyCislaWRlZmluZSBqYWUgICAgamFlIG5lYXIKKyVpZGVmaW5lIGpsICAgICBqbCAgbmVhcgorJWlkZWZpbmUgamxlICAgIGpsZSBuZWFyCislaWRlZmluZSBqZyAgICAgamcgIG5lYXIKKyVpZGVmaW5lIGpnZSAgICBqZ2UgbmVhcgorJWlkZWZpbmUgamMgICAgIGpjICBuZWFyCislaWRlZmluZSBqbmMgICAgam5jIG5lYXIKKyVpZGVmaW5lIGpzICAgICBqcyAgbmVhcgorJWlkZWZpbmUgam5zICAgIGpucyBuZWFyCisKKyVpZmRlZiAgRE9VQkxFCislaWRlZmluZSAgICBSRUFMICAgIFFXT1JECislaWRlZmluZSAgICBEUkVBTCAgIGRxCislZWxzZQorJWlkZWZpbmUgICAgUkVBTCAgICBEV09SRAorJWlkZWZpbmUgICAgRFJFQUwgICBkZAorJWVuZGlmCisKKzsgQm9vbGVhbiB0cnV0aCB2YWx1ZXMgKHNhbWUgYXMgdGhvc2UgaW4gZGVidWcuaCkKKworJWlkZWZpbmUgRmFsc2UgICAgICAwCislaWRlZmluZSBUcnVlICAgICAgIDEKKyVpZGVmaW5lIE5vICAgICAgICAgMAorJWlkZWZpbmUgWWVzICAgICAgICAxCislaWRlZmluZSBZZXMgICAgICAgIDEKKworOyBNYWNybyB0byBiZSBpbnZva2VkIGF0IHRoZSBzdGFydCBvZiBhbGwgbW9kdWxlcyB0byBzZXQgdXAgc2VnbWVudHMgZm9yCis7IGxhdGVyIHVzZS4gRG9lcyBub3RoaW5nIGZvciBOQVNNLgorCislaW1hY3JvIGhlYWRlciAxCislZW5kbWFjcm8KKworOyBNYWNybyB0byBiZWdpbiBhIGRhdGEgc2VnbWVudAorCislaW1hY3JvIGJlZ2RhdGFzZWcgMQorJWlmZGVmIF9fR05VQ19fCitzZWdtZW50IC5kYXRhIHB1YmxpYyBjbGFzcz1EQVRBIHVzZTMyIGZsYXQKKyVlbHNlCislaWZkZWYgZmxhdG1vZGVsCitzZWdtZW50IF9EQVRBIHB1YmxpYyBhbGlnbj00IGNsYXNzPURBVEEgdXNlMzIgZmxhdAorJWVsc2UKK3NlZ21lbnQgX0RBVEEgcHVibGljIGFsaWduPTQgY2xhc3M9REFUQSB1c2UxNgorJWVuZGlmCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIGVuZCBhIGRhdGEgc2VnbWVudAorCislaW1hY3JvIGVuZGRhdGFzZWcgMQorJWVuZG1hY3JvCisKKzsgTWFjcm8gdG8gYmVnaW4gYSBjb2RlIHNlZ21lbnQKKworJWltYWNybyBiZWdjb2Rlc2VnIDEKKyVpZmRlZiBfX1BJQ19fCislaWZkZWYgX19MSU5VWF9fCisgICAgICAgIGV4dGVybiBfR0xPQkFMX09GRlNFVF9UQUJMRV8KKyVlbHNlCisgICAgICAgIGV4dGVybiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfCislZW5kaWYKKyVlbmRpZgorJWlmZGVmIF9fR05VQ19fCitzZWdtZW50IC50ZXh0IHB1YmxpYyBjbGFzcz1DT0RFIHVzZTMyIGZsYXQKKyVlbHNlCislaWZkZWYgZmxhdG1vZGVsCitzZWdtZW50IF9URVhUIHB1YmxpYyBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTMyIGZsYXQKKyVlbHNlCitzZWdtZW50ICUxX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMTYKKyVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworOyBNYWNybyB0byBiZWdpbiBhIG5lYXIgY29kZSBzZWdtZW50CisKKyVpbWFjcm8gYmVnY29kZXNlZ19uZWFyIDAKKyVpZmRlZiBfX0dOVUNfXworc2VnbWVudCAudGV4dCBwdWJsaWMgY2xhc3M9Q09ERSB1c2UzMiBmbGF0CislZWxzZQorJWlmZGVmIGZsYXRtb2RlbAorc2VnbWVudCBfVEVYVCBwdWJsaWMgYWxpZ249MTYgY2xhc3M9Q09ERSB1c2UzMiBmbGF0CislZWxzZQorc2VnbWVudCBfVEVYVCBwdWJsaWMgYWxpZ249MTYgY2xhc3M9Q09ERSB1c2UxNgorJWVuZGlmCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIGVuZCBhIGNvZGUgc2VnbWVudAorCislaW1hY3JvIGVuZGNvZGVzZWcgMQorJWVuZG1hY3JvCisKKzsgTWFjcm8gdG8gZW5kIGEgbmVhciBjb2RlIHNlZ21lbnQKKworJWltYWNybyBlbmRjb2Rlc2VnX25lYXIgMAorJWVuZG1hY3JvCisKKzsgTWFjcm8gZm9yIGFuIGV4dGVybiBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZworOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQorOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCis7IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCisKKyVpbWFjcm8gY2V4dGVybiAyCislaWZkZWYgIF9fTk9VX1ZBUl9fCitleHRlcm4gJTEKKyVlbHNlCitleHRlcm4gXyUxCislZGVmaW5lICUxIF8lMQorJWVuZGlmCislZW5kbWFjcm8KKworJWltYWNybyBjZXh0ZXJuZnVuYyAyCislaWZkZWYgIF9fTk9VX18KK2V4dGVybiAlMQorJWVsc2UKK2V4dGVybiBfJTEKKyVkZWZpbmUgJTEgXyUxCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvIGZvciBhIHB1YmxpYyBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZworOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQorOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCis7IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCisKKyVpbWFjcm8gY3B1YmxpYyAxCislaWZkZWYgIF9fTk9VX1ZBUl9fCitnbG9iYWwgJTEKKyUxOgorJWVsc2UKK2dsb2JhbCBfJTEKK18lMToKKyVkZWZpbmUgJTEgXyUxCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKKzsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKKzsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQorOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgorCislaW1hY3JvIGNnbG9iYWwgMQorJWlmZGVmICBfX05PVV9WQVJfXworZ2xvYmFsICUxCislZWxzZQorZ2xvYmFsIF8lMQorJWRlZmluZSAlMSBfJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgTWFjcm8gZm9yIGFuIGdsb2JhbCBDIGZ1bmN0aW9uIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZworOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQorOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCis7IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCisKKyVpbWFjcm8gY2dsb2JhbGZ1bmMgMQorJWlmZGVmIF9fUElDX18KK2dsb2JhbCAlMTpmdW5jdGlvbgorJWVsc2UKKyVpZmRlZiAgX19OT1VfXworZ2xvYmFsICUxCislZWxzZQorZ2xvYmFsIF8lMQorJWRlZmluZSAlMSBfJTEKKyVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworOyBNYWNybyB0byBzdGFydCBhIEMgY2FsbGFibGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBhIGZhciBmdW5jdGlvbiBmb3IKKzsgMTYtYml0IGNvZGUsIGFuZCBhIG5lYXIgZnVuY3Rpb24gZm9yIDMyLWJpdCBjb2RlLgorCislaW1hY3JvIGNwcm9jc3RhdGljIDEKKyVwdXNoIGNwcm9jCislMToKKyVpZmRlZiBmbGF0bW9kZWwKKyVzdGFja3NpemUgZmxhdAorJWRlZmluZSByZXQgcmV0bgorJWVsc2UKKyVzdGFja3NpemUgbGFyZ2UKKyVkZWZpbmUgcmV0IHJldGYKKyVlbmRpZgorJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCislZW5kbWFjcm8KKworJWltYWNybyBjcHJvY3N0YXJ0IDEKKyVwdXNoIGNwcm9jCisgICAgY2dsb2JhbGZ1bmMgJTEKKyUxOgorJWlmZGVmIGZsYXRtb2RlbAorJXN0YWNrc2l6ZSBmbGF0CislZGVmaW5lIHJldCByZXRuCislZWxzZQorJXN0YWNrc2l6ZSBsYXJnZQorJWRlZmluZSByZXQgcmV0ZgorJWVuZGlmCislYXNzaWduICUkbG9jYWxzaXplIDAKKyVlbmRtYWNybworCis7IFRoaXMgbWFjcm8gc2V0cyB1cCBhIHByb2NlZHVyZSB0byBiZSBleHBvcnRlZCBmcm9tIGEgMTYgYml0IERMTC4gU2luY2UgdGhlCis7IGNhbGxpbmcgY29udmVudGlvbnMgYXJlIGFsd2F5cyBfZmFyIF9wYXNjYWwgZm9yIDE2IGJpdCBETEwncywgd2UgYWN0dWFsbHkKKzsgcmVuYW1lIHRoaXMgcm91dGluZSB3aXRoIGFuIGV4dHJhIHVuZGVyc2NvcmUgd2l0aCAnQycgY2FsbGluZyBjb252ZW50aW9ucworOyBhbmQgYSBzbWFsbCBETEwgc3R1YiB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBoaWdoIGxldmVsIGNvZGUgdG8gY2FsbCB0aGUKKzsgYXNzZW1ibGVyIHJvdXRpbmUuCisKKyVpbWFjcm8gY3Byb2NzdGFydGRsbDE2IDEKKyVpZmRlZiAgX19XSU5ET1dTMTZfXworY3Byb2NzdGFydCAgXyUxCislZWxzZQorY3Byb2NzdGFydCAgJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIG5lYXIgZnVuY3Rpb24uCisKKyVpbWFjcm8gY3Byb2NuZWFyIDEKKyVwdXNoIGNwcm9jCisgICAgY2dsb2JhbGZ1bmMgJTEKKyUxOgorJWRlZmluZSByZXQgcmV0bgorJWlmZGVmIGZsYXRtb2RlbAorJXN0YWNrc2l6ZSBmbGF0CislZWxzZQorJXN0YWNrc2l6ZSBzbWFsbAorJWVuZGlmCislYXNzaWduICUkbG9jYWxzaXplIDAKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIHN0YXJ0IGEgQyBjYWxsYWJsZSBmYXIgZnVuY3Rpb24uCisKKyVpbWFjcm8gY3Byb2NmYXIgMQorJXB1c2ggY3Byb2MKKyAgICBjZ2xvYmFsZnVuYyAlMQorJTE6CislZGVmaW5lIHJldCByZXRmCislaWZkZWYgZmxhdG1vZGVsCislc3RhY2tzaXplIGZsYXQKKyVlbHNlCislc3RhY2tzaXplIGxhcmdlCislZW5kaWYKKyVhc3NpZ24gJSRsb2NhbHNpemUgMAorJWVuZG1hY3JvCisKKzsgTWFjcm8gdG8gZW5kIGEgQyBmdW5jdGlvbgorCislaW1hY3JvIGNwcm9jZW5kIDAKKyVwb3AKKyVlbmRtYWNybworCis7IE1hY3JvcyBmb3IgZW50ZXJpbmcgYW5kIGV4aXRpbmcgQyBjYWxsYWJsZSBmdW5jdGlvbnMuIE5vdGUgdGhhdCB3ZSBtdXN0Cis7IGFsd2F5cyBzYXZlIGFuZCByZXN0b3JlIHRoZSBTSSBhbmQgREkgcmVnaXN0ZXJzIGZvciBDIGZ1bmN0aW9ucywgYW5kIGZvcgorOyAzMiBiaXQgQyBmdW5jdGlvbnMgd2UgYWxzbyBuZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgRUJYIGFuZCBjbGVhciB0aGUKKzsgZGlyZWN0aW9uIGZsYWcuCisKKyVpbWFjcm8gZW50ZXJfYyAwCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorJWlmbmlkbiAlJGxvY2Fsc2l6ZSwwCisgICAgICAgIHN1YiAgICAgX3NwLCUkbG9jYWxzaXplCislZW5kaWYKKyVpZmRlZiAgZmxhdG1vZGVsCisgICAgICAgIHB1c2ggICAgZWJ4CislZW5kaWYKKyAgICAgICAgcHVzaCAgICBfc2kKKyAgICAgICAgcHVzaCAgICBfZGkKKyVlbmRtYWNybworCislaW1hY3JvIGxlYXZlX2MgMAorICAgICAgICBwb3AgICAgIF9kaQorICAgICAgICBwb3AgICAgIF9zaQorJWlmZGVmICBmbGF0bW9kZWwKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgY2xkCislZW5kaWYKKyVpZm5pZG4gJSRsb2NhbHNpemUsMAorICAgICAgICBtb3YgICAgIF9zcCxfYnAKKyVlbmRpZgorICAgICAgICBwb3AgICAgIF9icAorJWVuZG1hY3JvCisKKyVpbWFjcm8gICB1c2VfZWJ4IDAKKyVpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcHVzaCAgICBlYngKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVpbWFjcm8gICB1bnVzZV9lYnggMAorJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBwb3AgICAgIGVieAorJWVuZGlmCislZW5kbWFjcm8KKworOyBNYWNyb3MgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSB2YWx1ZSBvZiBEUyxFUyxGUyxHUyB3aGVuIGl0IGlzIHRvCis7IGJlIHVzZWQgaW4gYXNzZW1ibHkgcm91dGluZXMuIFRoaXMgZXZhbHVhdGVzIHRvIG5vdGhpbmcgaW4gdGhlIGZsYXQgbWVtb3J5Cis7IG1vZGVsLCBidXQgaXMgc2F2ZXMgYW5kIHJlc3RvcmVzIERTIGluIHRoZSBsYXJnZSBtZW1vcnkgbW9kZWwuCisKKyVpbWFjcm8gdXNlX2RzIDAKKyVpZm5kZWYgZmxhdG1vZGVsCisgICAgICAgIHB1c2ggICAgZHMKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVpbWFjcm8gdW51c2VfZHMgMAorJWlmbmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcG9wICAgICBkcworJWVuZGlmCislZW5kbWFjcm8KKworJWltYWNybyB1c2VfZXMgMAorJWlmbmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcHVzaCAgICBlcworJWVuZGlmCislZW5kbWFjcm8KKworJWltYWNybyB1bnVzZV9lcyAwCislaWZuZGVmIGZsYXRtb2RlbAorICAgICAgICBwb3AgICAgIGVzCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvcyBmb3IgbG9hZGluZyB0aGUgYWRkcmVzcyBvZiBhIGRhdGEgcG9pbnRlciBpbnRvIGEgc2VnbWVudCBhbmQKKzsgaW5kZXggcmVnaXN0ZXIgcGFpci4gVGhlICVpbWFjcm8gZXhwbGljaXRseSBsb2FkcyBEUyBvciBFUyBpbiB0aGUgMTYgYml0Cis7IG1lbW9yeSBtb2RlbCwgb3IgaXQgc2ltcGx5IGxvYWRzIHRoZSBvZmZzZXQgaW50byB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZsYXQKKzsgbWVtb3J5IG1vZGVsIHNpbmNlIERTIGFuZCBFUyBhbHdheXMgcG9pbnQgdG8gYWxsIGFkZHJlc3NhYmxlIG1lbW9yeS4gWW91Cis7IG11c3QgdXNlIHRoZSBjb3JyZWN0IF9SRUcgKGllOiBfQlgpICVpbWFjcm9zIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzLgorCislaW1hY3JvIF9sZHMgICAgMgorJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgICUxLCUyCislZWxzZQorICAgICAgICBsZHMgICAgICUxLCUyCislZW5kaWYKKyVlbmRtYWNybworCislaW1hY3JvICAgX2xlcyAgMgorJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgICUxLCUyCislZWxzZQorICAgICAgICBsZXMgICAgICUxLCUyCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvcyBmb3IgYWRkaW5nIGFuZCBzdWJ0cmFjdGluZyBhIHZhbHVlIGZyb20gcmVnaXN0ZXJzLiBUd28gdmFsdWUgYXJlCis7IHByb3ZpZGVkLCBvbmUgZm9yIDE2IGJpdCBtb2RlcyBhbmQgYW5vdGhlciBmb3IgMzIgYml0IG1vZGVzICh0aGUgZXh0ZW5kZWQKKzsgcmVnaXN0ZXIgaXMgdXNlZCBpbiAzMiBiaXQgbW9kZXMpLgorCislaW1hY3JvICAgX2FkZCAgMworJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBhZGQgICAgIGUlMSwgJTMKKyVlbHNlCisgICAgICAgIGFkZCAgICAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislaW1hY3JvIF9zdWIgICAgMworJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBzdWIgICAgIGUlMSwgJTMKKyVlbHNlCisgICAgICAgIHN1YiAgICAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIGNsZWFyIHRoZSBoaWdoIG9yZGVyIHdvcmQgZm9yIHRoZSAzMiBiaXQgZXh0ZW5kZWQgcmVnaXN0ZXJzLgorOyBUaGlzIGlzIHVzZWQgdG8gY29udmVydCBhbiB1bnNpZ25lZCAxNiBiaXQgdmFsdWUgdG8gYW4gdW5zaWduZWQgMzIgYml0Cis7IHZhbHVlLCBhbmQgd2lsbCBldmFsdWF0ZSB0byBub3RoaW5nIGluIDE2IGJpdCBtb2Rlcy4KKworJWltYWNybyBjbHJoaSAgIDEKKyVpZmRlZiAgZmxhdG1vZGVsCisgICAgICAgIG1vdnp4ICAgZSUxLCUxCislZW5kaWYKKyVlbmRtYWNybworCislaW1hY3JvIHNnbmhpICAgMQorJWlmZGVmICBmbGF0bW9kZWwKKyAgICAgICAgbW92c3ggICBlJTEsJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgTWFjcm8gdG8gbG9hZCBhbiBleHRlbmRlZCByZWdpc3RlciB3aXRoIGFuIGludGVnZXIgdmFsdWUgaW4gZWl0aGVyIG1vZGUKKworJWltYWNybyBsb2FkaW50IDIKKyVpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlJTEsJTIKKyVlbHNlCisgICAgICAgIHhvciAgICAgZSUxLGUlMQorICAgICAgICBtb3YgICAgICUxLCUyCislZW5kaWYKKyVlbmRtYWNybworCis7IE1hY3JvcyB0byBsb2FkIGFuZCBzdG9yZSBpbnRlZ2VyIHZhbHVlcyB3aXRoIHN0cmluZyBpbnN0cnVjdGlvbnMKKworJWltYWNybyBMT0RTSU5UIDAKKyVpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbG9kc2QKKyVlbHNlCisgICAgICAgIGxvZHN3CislZW5kaWYKKyVlbmRtYWNybworCislaW1hY3JvIFNUT1NJTlQgMAorJWlmZGVmIGZsYXRtb2RlbAorICAgICAgICBzdG9zZAorJWVsc2UKKyAgICAgICAgc3Rvc3cKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgTWFjcm9zIHRvIHByb3ZpZGUgcmVzYiwgcmVzdywgcmVzZCBjb21wYXRpYmlsaXR5IHdpdGggTkFTTQorCislaW1hY3JvIGRjbGIgMQordGltZXMgJTEgZGIgMAorJWVuZG1hY3JvCisKKyVpbWFjcm8gZGNsdyAxCit0aW1lcyAlMSBkdyAwCislZW5kbWFjcm8KKworJWltYWNybyBkY2xkIDEKK3RpbWVzICUxIGRkIDAKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIGdldCB0aGUgYWRkcmVzIG9mIHRoZSBHT1QgZm9yIExpbnV4L0ZyZWVCU0Qgc2hhcmVkCis7IGxpYnJhcmllcyBpbnRvIHRoZSBFQlggcmVnaXN0ZXIuCisKKyVpbWFjcm8gICAgIGdldF9HT1QgMQorICAgICAgICAgICAgY2FsbCAgICAlJWdldGdvdAorJSVnZXRnb3Q6ICAgcG9wICAgICAlMQorICAgICAgICAgICAgYWRkICAgICAlMSxfR0xPQkFMX09GRlNFVF9UQUJMRV8rJCQtJSVnZXRnb3Qgd3J0IC4uZ290cGMKKyVlbmRtYWNybworCis7IE1hY3JvIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBhICpsb2NhbCogdmFyaWFibGUgdGhhdCBpcyBnbG9iYWwgdG8KKzsgYSBzaW5nbGUgbW9kdWxlIGluIGEgbWFubmVyIHRoYXQgd2lsbCB3b3JrIGNvcnJlY3RseSB3aGVuIGNvbXBpbGVkCis7IGludG8gYSBMaW51eCBzaGFyZWQgbGlicmFyeS4gTm90ZSB0aGF0IHRoaXMgd2lsbCAqbm90KiB3b3JrIGZvcgorOyB2YXJpYWJsZXMgdGhhdCBhcmUgZGVmaW5lZCBhcyBnbG9iYWwgdG8gYWxsIG1vZHVsZXMuIEZvciB0aGF0Cis7IHVzZSB0aGUgTEVBX0cgbWFjcm8KKworJW1hY3JvICAgICAgTEVBX0wgICAgMgorJWlmZGVmIF9fUElDX18KKyAgICAgICAgZ2V0X0dPVCAlMQorICAgICAgICBsZWEgICAgICUxLFslMSslMiB3cnQgLi5nb3RvZmZdCislZWxzZQorICAgICAgICBsZWEgICAgICUxLFslMl0KKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgU2FtZSBtYWNybyBhcyBhYm92ZSBidXQgZm9yIGdsb2JhbCB2YXJpYWJsZXMgcHVibGljIHRvICphbGwqCis7IG1vZHVsZXMuCisKKyVtYWNybyAgICAgIExFQV9HICAgIDIKKyVpZmRlZiBfX1BJQ19fCisgICAgICAgIGdldF9HT1QgJTEKKyAgICAgICAgbW92ICAgICAlMSxbJTErJTIgd3J0IC4uZ290XQorJWVsc2UKKyAgICAgICAgbGVhICAgICAlMSxbJTJdCislZW5kaWYKKyVlbmRtYWNybworCis7IG1hY3JvcyB0byBkZWNsYXJlIGFzc2VtYmxlciBmdW5jdGlvbiBzdHVicyBmb3IgZnVuY3Rpb24gc3RydWN0dXJlcworCislaW1hY3JvIEJFR0lOX1NUVUJTX0RFRiAyCitiZWdkYXRhc2VnICBfU1RVQlMKKyVpZmRlZiAgX19OT1VfVkFSX18KK2V4dGVybiAlMQorJWRlZmluZSBTVFVCU19TVEFSVCAlMQorJWVsc2UKK2V4dGVybiBfJTEKKyVkZWZpbmUgU1RVQlNfU1RBUlQgXyUxCislZW5kaWYKK2VuZGRhdGFzZWcgIF9TVFVCUworYmVnY29kZXNlZyAgX1NUVUJTCislYXNzaWduIG9mZiAlMgorJWVuZG1hY3JvCisKKyVpbWFjcm8gICBERUNMQVJFX1NUVUIgIDEKKyVpZmRlZiBfX1BJQ19fCisgICAgICAgIGdsb2JhbCAlMTpmdW5jdGlvbgorJTE6CisgICAgICAgIGdldF9HT1QgZWF4CisgICAgICAgIG1vdiAgICAgZWF4LFtlYXgrU1RVQlNfU1RBUlQgd3J0IC4uZ290XQorICAgICAgICBqbXAgICAgIFtlYXgrb2ZmXQorJWVsc2UKKyVpZmRlZiAgX19OT1VfXworICAgICAgICBnbG9iYWwgJTEKKyUxOgorJWVsc2UKKyAgICAgICAgZ2xvYmFsIF8lMQorXyUxOgorJWVuZGlmCisgICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KKyVlbmRpZgorJWFzc2lnbiBvZmYgb2ZmKzQKKyVlbmRtYWNybworCislaW1hY3JvICAgU0tJUF9TVFVCICAxCislYXNzaWduIG9mZiBvZmYrNAorJWVuZG1hY3JvCisKKyVpbWFjcm8gREVDTEFSRV9TVERDQUxMIDIKKyVpZmRlZiAgU1REQ0FMTF9NQU5HTEUKKyAgICAgICAgZ2xvYmFsIF8lMUAlMgorXyUxQCUyOgorJWVsc2UKKyVpZmRlZiBTVERDQUxMX1VTQ09SRQorICAgICAgICBnbG9iYWwgXyUxCitfJTE6CislZWxzZQorICAgICAgICBnbG9iYWwgJTEKKyUxOgorJWVuZGlmCislZW5kaWYKKyAgICAgICAgam1wICAgICBbRFdPUkQgU1RVQlNfU1RBUlQrb2ZmXQorJWFzc2lnbiBvZmYgb2ZmKzQKKyVlbmRtYWNybworCislaW1hY3JvICAgRU5EX1NUVUJTX0RFRiAwCitlbmRjb2Rlc2VnICBfU1RVQlMKKyVlbmRtYWNybworCis7IG1hY3JvcyB0byBkZWNsYXJlIGFzc2VtYmxlciBpbXBvcnQgc3R1YnMgZm9yIGJpbmFyeSBsb2FkYWJsZSBkcml2ZXJzCisKKyVpbWFjcm8gQkVHSU5fSU1QT1JUU19ERUYgICAxCitCRUdJTl9TVFVCU19ERUYgJTEsNAorJWVuZG1hY3JvCisKKyVpbWFjcm8gICBERUNMQVJFX0lNUCAgIDIKK0RFQ0xBUkVfU1RVQiAgICAlMQorJWVuZG1hY3JvCisKKyVpbWFjcm8gICBTS0lQX0lNUCAgIDIKK1NLSVBfU1RVQiAgICAlMQorJWVuZG1hY3JvCisKKyVpbWFjcm8gICBTS0lQX0lNUDIgICAxCitERUNMQVJFX1NUVUIgICAgJTEKKyVlbmRtYWNybworCislaW1hY3JvICAgU0tJUF9JTVAzICAgMQorU0tJUF9TVFVCICAgICUxCislZW5kbWFjcm8KKworJWltYWNybyAgIEVORF9JTVBPUlRTX0RFRiAwCitFTkRfU1RVQlNfREVGCislZW5kbWFjcm8KKworZWxzZSAgICA7IF9fTkFTTV9NQUpPUl9fCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IE1hY3JvIHBhY2thZ2Ugd2hlbiBjb21waWxpbmcgd2l0aCBUQVNNLgorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworOyBUdXJuIG9mZiB1bmRlcnNjb3JlcyBmb3IgZ2xvYmFscyBpZiBkaXNhYmxlZCBmb3IgYWxsIGV4dGVybmFscworCitpZmRlZiAgIF9fTk9VX18KK19fTk9VX1ZBUl9fICAgICAgICAgPSAxCitlbmRpZgorCis7IERlZmluZSB0aGUgX19XSU5ET1dTX18gc3ltYm9sIGlmIHdlIGFyZSBjb21waWxpbmcgZm9yIGFueSBXaW5kb3dzCis7IGVudmlyb25tZW50CisKK2lmZGVmICAgX19XSU5ET1dTMTZfXworX19XSU5ET1dTX18gICAgICAgICA9IDEKK2VuZGlmCitpZmRlZiAgIF9fV0lORE9XUzMyX18KK19fV0lORE9XU19fICAgICAgICAgPSAxCitfX1dJTkRPV1MzMl8zODZfXyAgID0gMQorZW5kaWYKK2lmZGVmICAgX19XSU4zODZfXworX19XSU5ET1dTX18gICAgICAgICA9IDEKK19fV0lORE9XUzMyXzM4Nl9fICAgPSAxCitlbmRpZgoraWZkZWYgICBfX1ZYRF9fCitfX1dJTkRPV1NfXyAgICAgICAgID0gMQorX19XSU5ET1dTMzJfMzg2X18gICA9IDEKKyAgICAgICAgTUFTTQorICAgICAgICAuMzg2CisgICAgICAgIE5PX1NFR01FTlRTID0gMQorICAgICAgICBpbmNsdWRlIHZtbS5pbmMgICAgICAgICA7IElHTk9SRSBERVBFTkQKKyAgICAgICAgaW5jbHVkZSB2c2VnbWVudC5pbmMgICAgOyBJR05PUkUgREVQRU5ECisgICAgICAgIElERUFMCitlbmRpZgorCis7IE1hY3JvcyBmb3IgYWNjZXNzaW5nICdnZW5lcmljJyByZWdpc3RlcnMKKworaWZkZWYgICBfX0ZMQVRfXworICAgICAgICBfYXggICAgICAgICBFUVUgZWF4ICAgICA7IEVBWCBpcyB1c2VkIGZvciBhY2N1bXVsYXRvcgorICAgICAgICBfYnggICAgICAgICBFUVUgZWJ4ICAgICA7IEVCWCBpcyB1c2VkIGZvciBhY2N1bXVsYXRvcgorICAgICAgICBfY3ggICAgICAgICBFUVUgZWN4ICAgICA7IEVDWCBpcyB1c2VkIGZvciBsb29waW5nCisgICAgICAgIF9keCAgICAgICAgIEVRVSBlZHggICAgIDsgRURYIGlzIHVzZWQgZm9yIGRhdGEgcmVnaXN0ZXIKKyAgICAgICAgX3NpICAgICAgICAgRVFVIGVzaSAgICAgOyBFU0kgaXMgdGhlIHNvdXJjZSBpbmRleCByZWdpc3RlcgorICAgICAgICBfZGkgICAgICAgICBFUVUgZWRpICAgICA7IEVESSBpcyB0aGUgZGVzdGluYXRpb24gaW5kZXggcmVnaXN0ZXIKKyAgICAgICAgX2JwICAgICAgICAgRVFVIGVicCAgICAgOyBFQlAgaXMgdXNlZCBmb3IgYmFzZSBwb2ludGVyIHJlZ2lzdGVyCisgICAgICAgIF9zcCAgICAgICAgIEVRVSBlc3AgICAgIDsgRVNQIGlzIHVzZWQgZm9yIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIKKyAgICAgICAgX2VzICAgICAgICAgRVFVICAgICAgICAgOyBFUyBhbmQgRFMgYXJlIHRoZSBzYW1lIGluIDMyIGJpdCBQTQorICAgICAgICB0eXBlZGVmIFVDSEFSIEJZVEUgICAgICA7IFNpemUgb2YgYSBjaGFyYWN0ZXIKKyAgICAgICAgdHlwZWRlZiBVU0hPUlQgV09SRCAgICAgOyBTaXplIG9mIGEgc2hvcnQKKyAgICAgICAgdHlwZWRlZiBVSU5UIERXT1JEICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKKyAgICAgICAgdHlwZWRlZiBVTE9ORyBEV09SRCAgICAgOyBTaXplIG9mIGEgbG9uZworICAgICAgICB0eXBlZGVmIEJPT0wgRFdPUkQgICAgICA7IFNpemUgb2YgYSBib29sZWFuCisgICAgICAgIHR5cGVkZWYgRFBUUiBEV09SRCAgICAgIDsgU2l6ZSBvZiBhIGRhdGEgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIEZEUFRSIEZXT1JEICAgICA7IFNpemUgb2YgYSBmYXIgZGF0YSBwb2ludGVyCisgICAgICAgIHR5cGVkZWYgTkRQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIG5lYXIgZGF0YSBwb2ludGVyCisgICAgICAgIHR5cGVkZWYgQ1BUUiBEV09SRCAgICAgIDsgU2l6ZSBvZiBhIGNvZGUgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIEZDUFRSIEZXT1JEICAgICA7IFNpemUgb2YgYSBmYXIgY29kZSBwb2ludGVyCisgICAgICAgIHR5cGVkZWYgTkNQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIG5lYXIgY29kZSBwb2ludGVyCisgICAgICAgIHR5cGVkZWYgRFVJTlQgRFdPUkQgICAgIDsgRGVjbGFyZSBhIGludGVnZXIgdmFyaWFibGUKKyAgICAgICAgRlBUUiAgICAgICAgRVFVIE5FQVIgICAgOyBEaXN0YW5jZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgICAgaW50c2l6ZSAgICAgPSAgIDQgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKKyAgICAgICAgZmxhdG1vZGVsICAgPSAgIDEgICAgICAgOyBUaGlzIGlzIGEgZmxhdCBtZW1vcnkgbW9kZWwKKyAgICAgICAgUDM4NiAgICAgICAgICAgICAgICAgICAgOyBUdXJuIG9uIDM4NiBjb2RlIGdlbmVyYXRpb24KKyAgICAgICAgTU9ERUwgICAgICAgRkxBVCAgICAgICAgOyBTZXQgdXAgZm9yIDMyIGJpdCBzaW1wbGlmaWVkIEZMQVQgbW9kZWwKK2Vsc2UKKyAgICAgICAgX2F4ICAgICAgICAgRVFVIGF4ICAgICAgOyBBWCBpcyB1c2VkIGZvciBhY2N1bXVsYXRvcgorICAgICAgICBfYnggICAgICAgICBFUVUgYnggICAgICA7IEJYIGlzIHVzZWQgZm9yIGFjY3VtdWxhdG9yCisgICAgICAgIF9jeCAgICAgICAgIEVRVSBjeCAgICAgIDsgQ1ggaXMgdXNlZCBmb3IgbG9vcGluZworICAgICAgICBfZHggICAgICAgICBFUVUgZHggICAgICA7IERYIGlzIHVzZWQgZm9yIGRhdGEgcmVnaXN0ZXIKKyAgICAgICAgX3NpICAgICAgICAgRVFVIHNpICAgICAgOyBTSSBpcyB0aGUgc291cmNlIGluZGV4IHJlZ2lzdGVyCisgICAgICAgIF9kaSAgICAgICAgIEVRVSBkaSAgICAgIDsgREkgaXMgdGhlIGRlc3RpbmF0aW9uIGluZGV4IHJlZ2lzdGVyCisgICAgICAgIF9icCAgICAgICAgIEVRVSBicCAgICAgIDsgQlAgaXMgdXNlZCBmb3IgYmFzZSBwb2ludGVyIHJlZ2lzdGVyCisgICAgICAgIF9zcCAgICAgICAgIEVRVSBzcCAgICAgIDsgU1AgaXMgdXNlZCBmb3Igc3RhY2sgcG9pbnRlciByZWdpc3RlcgorICAgICAgICBfZXMgICAgICAgICBFUVUgZXM6ICAgICA7IEVTIGlzIHVzZWQgZm9yIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICAgICAgdHlwZWRlZiBVQ0hBUiBCWVRFICAgICAgOyBTaXplIG9mIGEgY2hhcmFjdGVyCisgICAgICAgIHR5cGVkZWYgVVNIT1JUIFdPUkQgICAgIDsgU2l6ZSBvZiBhIHNob3J0CisgICAgICAgIHR5cGVkZWYgVUlOVCBXT1JEICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCisgICAgICAgIHR5cGVkZWYgVUxPTkcgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGxvbmcKKyAgICAgICAgdHlwZWRlZiBCT09MIFdPUkQgICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgorICAgICAgICB0eXBlZGVmIERQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKKyAgICAgICAgdHlwZWRlZiBGRFBUUiBEV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGRhdGEgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIE5EUFRSIFdPUkQgICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIENQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKKyAgICAgICAgdHlwZWRlZiBGQ1BUUiBEV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGNvZGUgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIE5DUFRSIFdPUkQgICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgorICAgICAgICB0eXBlZGVmIERVSU5UIFdPUkQgICAgICA7IERlY2xhcmUgYSBpbnRlZ2VyIHZhcmlhYmxlCisgICAgICAgIEZQVFIgICAgICAgIEVRVSBGQVIgICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAgICAgIGludHNpemUgICAgID0gICAyICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCisgICAgICAgIFAzODYgICAgICAgICAgICAgICAgICAgIDsgVHVybiBvbiAzODYgY29kZSBnZW5lcmF0aW9uCitlbmRpZgorICAgICAgICBpbnZlcnQgICAgICBFUVUgbm90CisKKzsgUHJvdmlkZSBhIHR5cGVkZWYgZm9yIHJlYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycworCitpZmRlZiAgIERPVUJMRQordHlwZWRlZiBSRUFMICAgIFFXT1JECit0eXBlZGVmIERSRUFMICAgUVdPUkQKK2Vsc2UKK3R5cGVkZWYgUkVBTCAgICBEV09SRAordHlwZWRlZiBEUkVBTCAgIERXT1JECitlbmRpZgorCis7IE1hY3JvcyB0byBhY2Nlc3MgdGhlIGZsb2F0aW5nIHBvaW50IHN0YWNrIHJlZ2lzdGVycyB0byBjb252ZXJ0IHRoZW0KKzsgZnJvbSBOQVNNIHN0eWxlIHRvIFRBU00gc3R5bGUKKworc3QwICAgICAgICAgRVFVICAgICBzdCgwKQorc3QxICAgICAgICAgRVFVICAgICBzdCgxKQorc3QyICAgICAgICAgRVFVICAgICBzdCgyKQorc3QzICAgICAgICAgRVFVICAgICBzdCgzKQorc3Q0ICAgICAgICAgRVFVICAgICBzdCg0KQorc3Q1ICAgICAgICAgRVFVICAgICBzdCg1KQorc3Q2ICAgICAgICAgRVFVICAgICBzdCg2KQorc3Q3ICAgICAgICAgRVFVICAgICBzdCg3KQorc3Q4ICAgICAgICAgRVFVICAgICBzdCg4KQorCis7IEJvb2xlYW4gdHJ1dGggdmFsdWVzIChzYW1lIGFzIHRob3NlIGluIGRlYnVnLmgpCisKK2lmbmRlZiAgX19WWERfXworRmFsc2UgICAgICAgPSAgICAgICAwCitUcnVlICAgICAgICA9ICAgICAgIDEKK05vICAgICAgICAgID0gICAgICAgMAorWWVzICAgICAgICAgPSAgICAgICAxCitZZXMgICAgICAgICA9ICAgICAgIDEKK2VuZGlmCisKKzsgTWFjcm9zIGZvciB0aGUgX0RBVEEgZGF0YSBzZWdtZW50LiBUaGlzIHNlZ21lbnQgY29udGFpbnMgaW5pdGlhbGlzZWQgZGF0YS4KKworTUFDUk8gICBiZWdkYXRhc2VnIG5hbWUKK2lmZGVmICAgX19WWERfXworICAgICAgICBNQVNNCitWWERfTE9DS0VEX0RBVEFfU0VHCisgICAgICAgIElERUFMCitlbHNlCitpZmRlZiAgIGZsYXRtb2RlbAorICAgICAgICBEQVRBU0VHCitlbHNlCitTRUdNRU5UIF9EQVRBIERXT1JEIFBVQkxJQyBVU0UxNiAnREFUQScKK2VuZGlmCitlbmRpZgorRU5ETQorCitNQUNSTyAgIGVuZGRhdGFzZWcgbmFtZQoraWZkZWYgICBfX1ZYRF9fCisgICAgICAgIE1BU00KK1ZYRF9MT0NLRURfREFUQV9FTkRTCisgICAgICAgIElERUFMCitlbHNlCitpZm5kZWYgIGZsYXRtb2RlbAorRU5EUyAgICBfREFUQQorZW5kaWYKK2VuZGlmCitFTkRNCisKKzsgTWFjcm8gZm9yIHRoZSBtYWluIGNvZGUgc2VnbWVudC4KKworTUFDUk8gICBiZWdjb2Rlc2VnIG5hbWUKK2lmZGVmICAgX19WWERfXworICAgICAgICBNQVNNCitWWERfTE9DS0VEX0NPREVfU0VHCisgICAgICAgIElERUFMCitlbHNlCitpZmRlZiAgIGZsYXRtb2RlbAorICAgICAgICBDT0RFU0VHCisgICAgICAgIEFTU1VNRSAgQ1M6RkxBVCxEUzpGTEFULFNTOkZMQVQKK2Vsc2UKK1NFR01FTlQgJm5hbWUmX1RFWFQgUEFSQSBQVUJMSUMgVVNFMTYgJ0NPREUnCisgICAgICAgIEFTU1VNRSBDUzombmFtZSZfVEVYVCxEUzpfREFUQQorZW5kaWYKK2VuZGlmCitFTkRNCisKKzsgTWFjcm8gZm9yIGEgbmVhciBjb2RlIHNlZ21lbnQKKworTUFDUk8gICBiZWdjb2Rlc2VnX25lYXIKK2lmZGVmICAgZmxhdG1vZGVsCisgICAgICAgIENPREVTRUcKKyAgICAgICAgQVNTVU1FICBDUzpGTEFULERTOkZMQVQsU1M6RkxBVAorZWxzZQorU0VHTUVOVCBfVEVYVCBQQVJBIFBVQkxJQyBVU0UxNiAnQ09ERScKKyAgICAgICAgQVNTVU1FIENTOl9URVhULERTOl9EQVRBCitlbmRpZgorRU5ETQorCitNQUNSTyAgIGVuZGNvZGVzZWcgbmFtZQoraWZkZWYgICBfX1ZYRF9fCisgICAgICAgIE1BU00KK1ZYRF9MT0NLRURfQ09ERV9FTkRTCisgICAgICAgIElERUFMCitlbHNlCitpZm5kZWYgIGZsYXRtb2RlbAorRU5EUyAgICAmbmFtZSZfVEVYVAorZW5kaWYKK2VuZGlmCitFTkRNCisKK01BQ1JPICAgZW5kY29kZXNlZ19uZWFyCitpZm5kZWYgIGZsYXRtb2RlbAorRU5EUyAgICBfVEVYVAorZW5kaWYKK0VORE0KKworOyBNYWNybyB0byBiZSBpbnZva2VkIGF0IHRoZSBzdGFydCBvZiBhbGwgbW9kdWxlcyB0byBzZXQgdXAgc2VnbWVudHMgZm9yCis7IGxhdGVyIHVzZS4KKworTUFDUk8gICBoZWFkZXIgbmFtZQorYmVnZGF0YXNlZyBuYW1lCitlbmRkYXRhc2VnIG5hbWUKK0VORE0KKworOyBNYWNybyBmb3IgYW4gZXh0ZXJuIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCis7IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCis7IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKKzsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KKworTUFDUk8gICBjZXh0ZXJuIG5hbWUsc2l6ZQoraWZkZWYgICBfX05PVV9WQVJfXworICAgICAgICBFWFRSTiAgIG5hbWU6c2l6ZQorZWxzZQorICAgICAgICBFWFRSTiAgIF8mbmFtZSY6c2l6ZQorbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKK2VuZGlmCitFTkRNCisKK01BQ1JPICAgY2V4dGVybmZ1bmMgbmFtZSxzaXplCitpZmRlZiAgIF9fTk9VX18KKyAgICAgICAgRVhUUk4gICBuYW1lOnNpemUKK2Vsc2UKKyAgICAgICAgRVhUUk4gICBfJm5hbWUmOnNpemUKK25hbWUgICAgRVFVICAgICBfJm5hbWUmCitlbmRpZgorRU5ETQorCitNQUNSTyAgIHN0ZGV4dGVybmZ1bmMgICBuYW1lLG51bV9hcmdzLHNpemUKK2lmZGVmICAgU1REQ0FMTF9NQU5HTEUKKyAgICAgICAgRVhUUk4gICBfJm5hbWUmQCZudW1fYXJncyY6c2l6ZQorbmFtZSAgICBFUVUgICAgIF8mbmFtZSZAJm51bV9hcmdzCitlbHNlCisgICAgICAgIEVYVFJOICAgbmFtZTpzaXplCitlbmRpZgorRU5ETQorCis7IE1hY3JvIGZvciBhIHB1YmxpYyBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZworOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQorOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCis7IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCisKK01BQ1JPICAgY3B1YmxpYyBuYW1lCitpZmRlZiAgIF9fTk9VX1ZBUl9fCituYW1lOgorICAgICAgICBQVUJMSUMgIG5hbWUKK2Vsc2UKK18mbmFtZSY6CisgICAgICAgIFBVQkxJQyAgXyZuYW1lJgorbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKK2VuZGlmCitFTkRNCisKKzsgTWFjcm8gZm9yIGFuIGdsb2JhbCBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZworOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQorOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCis7IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCisKK01BQ1JPICAgY2dsb2JhbCBuYW1lCitpZmRlZiAgIF9fTk9VX1ZBUl9fCisgICAgICAgIFBVQkxJQyAgbmFtZQorZWxzZQorICAgICAgICBQVUJMSUMgIF8mbmFtZSYKK25hbWUgICAgRVFVICAgICBfJm5hbWUmCitlbmRpZgorRU5ETQorCis7IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBmdW5jdGlvbiBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKKzsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKKzsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQorOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgorCitNQUNSTyAgIGNnbG9iYWxmdW5jIG5hbWUKK2lmZGVmICAgX19OT1VfXworICAgICAgICBQVUJMSUMgIG5hbWUKK2Vsc2UKKyAgICAgICAgUFVCTElDICBfJm5hbWUmCituYW1lICAgIEVRVSAgICAgXyZuYW1lJgorZW5kaWYKK0VORE0KKworOyBNYWNybyB0byBzdGFydCBhIEMgY2FsbGFibGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBhIGZhciBmdW5jdGlvbiBmb3IKKzsgMTYtYml0IGNvZGUsIGFuZCBhIG5lYXIgZnVuY3Rpb24gZm9yIDMyLWJpdCBjb2RlLgorCitNQUNSTyAgIGNwcm9jc3RhdGljIG5hbWUgICAgICAgIDsgU2V0IHVwIG1vZGVsIGluZGVwZW5kYW50IHByaXZhdGUgcHJvYworaWZkZWYgZmxhdG1vZGVsCitQUk9DICAgIG5hbWUgTkVBUgorZWxzZQorUFJPQyAgICBuYW1lIEZBUgorZW5kaWYKK0xvY2FsU2l6ZSAgID0gMAorRU5ETQorCitNQUNSTyAgIGNwcm9jc3RhcnQgbmFtZSAgICAgICAgIDsgU2V0IHVwIG1vZGVsIGluZGVwZW5kYW50IHByb2MKK2lmZGVmIGZsYXRtb2RlbAoraWZkZWYgICBfX05PVV9fCitQUk9DICAgIG5hbWUgTkVBUgorZWxzZQorUFJPQyAgICBfJm5hbWUmIE5FQVIKK2VuZGlmCitlbHNlCitpZmRlZiAgIF9fTk9VX18KK1BST0MgICAgbmFtZSBGQVIKK2Vsc2UKK1BST0MgICAgXyZuYW1lJiBGQVIKK2VuZGlmCitlbmRpZgorTG9jYWxTaXplICAgPSAwCisgICAgICAgIGNnbG9iYWxmdW5jIG5hbWUKK0VORE0KKworTUFDUk8gICBjcHJvY25lYXIgbmFtZSAgICAgICAgICA7IFNldCB1cCBuZWFyIHByb2MKK2lmZGVmICAgX19OT1VfXworUFJPQyAgICBuYW1lIE5FQVIKK2Vsc2UKK1BST0MgICAgXyZuYW1lJiBORUFSCitlbmRpZgorTG9jYWxTaXplICAgPSAwCisgICAgICAgIGNnbG9iYWxmdW5jIG5hbWUKK0VORE0KKworTUFDUk8gICBjcHJvY2ZhciBuYW1lICAgICAgICAgICA7IFNldCB1cCBmYXIgcHJvYworaWZkZWYgICBfX05PVV9fCitQUk9DICAgIG5hbWUgRkFSCitlbHNlCitQUk9DICAgIF8mbmFtZSYgRkFSCitlbmRpZgorTG9jYWxTaXplICAgPSAwCisgICAgICAgIGNnbG9iYWxmdW5jIG5hbWUKK0VORE0KKworTUFDUk8gICBjcHJvY2VuZCAgICAgICAgICAgICAgIDsgRW5kIHByb2NlZHVyZSBtYWNybworRU5EUAorRU5ETQorCis7IFRoaXMgbWFjcm8gc2V0cyB1cCBhIHByb2NlZHVyZSB0byBiZSBleHBvcnRlZCBmcm9tIGEgMTYgYml0IERMTC4gU2luY2UgdGhlCis7IGNhbGxpbmcgY29udmVudGlvbnMgYXJlIGFsd2F5cyBfZmFyIF9wYXNjYWwgZm9yIDE2IGJpdCBETEwncywgd2UgYWN0dWFsbHkKKzsgcmVuYW1lIHRoaXMgcm91dGluZSB3aXRoIGFuIGV4dHJhIHVuZGVyc2NvcmUgd2l0aCAnQycgY2FsbGluZyBjb252ZW50aW9ucworOyBhbmQgYSBzbWFsbCBETEwgc3R1YiB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBoaWdoIGxldmVsIGNvZGUgdG8gY2FsbCB0aGUKKzsgYXNzZW1ibGVyIHJvdXRpbmUuCisKK01BQ1JPICAgY3Byb2NzdGFydGRsbDE2IG5hbWUKK2lmZGVmICAgX19XSU5ET1dTMTZfXworY3Byb2NzdGFydCAgXyZuYW1lJgorZWxzZQorY3Byb2NzdGFydCAgbmFtZQorZW5kaWYKK0VORE0KKworOyBNYWNyb3MgZm9yIGVudGVyaW5nIGFuZCBleGl0aW5nIEMgY2FsbGFibGUgZnVuY3Rpb25zLiBOb3RlIHRoYXQgd2UgbXVzdAorOyBhbHdheXMgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgU0kgYW5kIERJIHJlZ2lzdGVycyBmb3IgQyBmdW5jdGlvbnMsIGFuZCBmb3IKKzsgMzIgYml0IEMgZnVuY3Rpb25zIHdlIGFsc28gbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIEVCWCBhbmQgY2xlYXIgdGhlCis7IGRpcmVjdGlvbiBmbGFnLgorCitNQUNSTyAgIHNhdmVfY19yZWdzCitpZmRlZiAgIGZsYXRtb2RlbAorICAgICAgICBwdXNoICAgIGVieAorZW5kaWYKKyAgICAgICAgcHVzaCAgICBfc2kKKyAgICAgICAgcHVzaCAgICBfZGkKK0VORE0KKworTUFDUk8gICBlbnRlcl9jCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgIElGRElGSSAgPExvY2FsU2l6ZT4sPDA+CisgICAgICAgIHN1YiAgICAgX3NwLExvY2FsU2l6ZQorICAgIEVORElGCisgICAgICAgIHNhdmVfY19yZWdzCitFTkRNCisKK01BQ1JPICAgcmVzdG9yZV9jX3JlZ3MKKyAgICAgICAgcG9wICAgICBfZGkKKyAgICAgICAgcG9wICAgICBfc2kKK2lmZGVmICAgZmxhdG1vZGVsCisgICAgICAgIHBvcCAgICAgZWJ4CitlbmRpZgorRU5ETQorCitNQUNSTyAgIGxlYXZlX2MKKyAgICAgICAgcmVzdG9yZV9jX3JlZ3MKKyAgICAgICAgY2xkCisgICAgSUZESUZJICA8TG9jYWxTaXplPiw8MD4KKyAgICAgICAgbW92ICAgICBfc3AsX2JwCisgICAgRU5ESUYKKyAgICAgICAgcG9wICAgICBfYnAKK0VORE0KKworTUFDUk8gICB1c2VfZWJ4CitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcHVzaCAgICBlYngKK2VuZGlmCitFTkRNCisKK01BQ1JPICAgdW51c2VfZWJ4CitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcG9wICAgICBlYngKK2VuZGlmCitFTkRNCisKKzsgTWFjcm9zIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgdmFsdWUgb2YgRFMsRVMsRlMsR1Mgd2hlbiBpdCBpcyB0bworOyBiZSB1c2VkIGluIGFzc2VtYmx5IHJvdXRpbmVzLiBUaGlzIGV2YWx1YXRlcyB0byBub3RoaW5nIGluIHRoZSBmbGF0IG1lbW9yeQorOyBtb2RlbCwgYnV0IGlzIHNhdmVzIGFuZCByZXN0b3JlcyBEUyBpbiB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsLgorCitNQUNSTyAgIHVzZV9kcworaWZuZGVmIGZsYXRtb2RlbAorICAgICAgICBwdXNoICAgIGRzCitlbmRpZgorRU5ETQorCitNQUNSTyAgIHVudXNlX2RzCitpZm5kZWYgZmxhdG1vZGVsCisgICAgICAgIHBvcCAgICAgZHMKK2VuZGlmCitFTkRNCisKK01BQ1JPICAgdXNlX2VzCitpZm5kZWYgZmxhdG1vZGVsCisgICAgICAgIHB1c2ggICAgZXMKK2VuZGlmCitFTkRNCisKK01BQ1JPICAgdW51c2VfZXMKK2lmbmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcG9wICAgICBlcworZW5kaWYKK0VORE0KKworOyBNYWNyb3MgZm9yIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBkYXRhIHBvaW50ZXIgaW50byBhIHNlZ21lbnQgYW5kCis7IGluZGV4IHJlZ2lzdGVyIHBhaXIuIFRoZSBtYWNybyBleHBsaWNpdGx5IGxvYWRzIERTIG9yIEVTIGluIHRoZSAxNiBiaXQKKzsgbWVtb3J5IG1vZGVsLCBvciBpdCBzaW1wbHkgbG9hZHMgdGhlIG9mZnNldCBpbnRvIHRoZSByZWdpc3RlciBpbiB0aGUgZmxhdAorOyBtZW1vcnkgbW9kZWwgc2luY2UgRFMgYW5kIEVTIGFsd2F5cyBwb2ludCB0byBhbGwgYWRkcmVzc2FibGUgbWVtb3J5LiBZb3UKKzsgbXVzdCB1c2UgdGhlIGNvcnJlY3QgX1JFRyAoaWU6IF9CWCkgbWFjcm9zIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzLgorCitNQUNSTyAgIF9sZHMgICAgcmVnLCBhZGRyCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICByZWcsYWRkcgorZWxzZQorICAgICAgICBsZHMgICAgIHJlZyxhZGRyCitlbmRpZgorRU5ETQorCitNQUNSTyAgIF9sZXMgICAgcmVnLCBhZGRyCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICByZWcsYWRkcgorZWxzZQorICAgICAgICBsZXMgICAgIHJlZyxhZGRyCitlbmRpZgorRU5ETQorCis7IE1hY3JvcyBmb3IgYWRkaW5nIGFuZCBzdWJ0cmFjdGluZyBhIHZhbHVlIGZyb20gcmVnaXN0ZXJzLiBUd28gdmFsdWUgYXJlCis7IHByb3ZpZGVkLCBvbmUgZm9yIDE2IGJpdCBtb2RlcyBhbmQgYW5vdGhlciBmb3IgMzIgYml0IG1vZGVzICh0aGUgZXh0ZW5kZWQKKzsgcmVnaXN0ZXIgaXMgdXNlZCBpbiAzMiBiaXQgbW9kZXMpLgorCitNQUNSTyAgIF9hZGQgICAgcmVnLCB2YWwxNiwgdmFsMzIKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBhZGQgICAgIGUmcmVnJiwgdmFsMzIKK2Vsc2UKKyAgICAgICAgYWRkICAgICByZWcsIHZhbDE2CitlbmRpZgorRU5ETQorCitNQUNSTyAgIF9zdWIgICAgcmVnLCB2YWwxNiwgdmFsMzIKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBzdWIgICAgIGUmcmVnJiwgdmFsMzIKK2Vsc2UKKyAgICAgICAgc3ViICAgICByZWcsIHZhbDE2CitlbmRpZgorRU5ETQorCis7IE1hY3JvIHRvIGNsZWFyIHRoZSBoaWdoIG9yZGVyIHdvcmQgZm9yIHRoZSAzMiBiaXQgZXh0ZW5kZWQgcmVnaXN0ZXJzLgorOyBUaGlzIGlzIHVzZWQgdG8gY29udmVydCBhbiB1bnNpZ25lZCAxNiBiaXQgdmFsdWUgdG8gYW4gdW5zaWduZWQgMzIgYml0Cis7IHZhbHVlLCBhbmQgd2lsbCBldmFsdWF0ZSB0byBub3RoaW5nIGluIDE2IGJpdCBtb2Rlcy4KKworTUFDUk8gICBjbHJoaSAgIHJlZworaWZkZWYgICBmbGF0bW9kZWwKKyAgICAgICAgbW92enggICBlJnJlZyYscmVnCitlbmRpZgorRU5ETQorCitNQUNSTyAgIHNnbmhpICAgcmVnCitpZmRlZiAgIGZsYXRtb2RlbAorICAgICAgICBtb3ZzeCAgIGUmcmVnJixyZWcKK2VuZGlmCitFTkRNCisKKzsgTWFjcm8gdG8gbG9hZCBhbiBleHRlbmRlZCByZWdpc3RlciB3aXRoIGFuIGludGVnZXIgdmFsdWUgaW4gZWl0aGVyIG1vZGUKKworTUFDUk8gICBsb2FkaW50IHJlZyx2YWwKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgIGUmcmVnJix2YWwKK2Vsc2UKKyAgICAgICAgeG9yICAgICBlJnJlZyYsZSZyZWcmCisgICAgICAgIG1vdiAgICAgcmVnLHZhbAorZW5kaWYKK0VORE0KKworOyBNYWNyb3MgdG8gbG9hZCBhbmQgc3RvcmUgaW50ZWdlciB2YWx1ZXMgd2l0aCBzdHJpbmcgaW5zdHJ1Y3Rpb25zCisKK01BQ1JPICAgTE9EU0lOVAoraWZkZWYgZmxhdG1vZGVsCisgICAgICAgIGxvZHNkCitlbHNlCisgICAgICAgIGxvZHN3CitlbmRpZgorRU5ETQorCitNQUNSTyAgIFNUT1NJTlQKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBzdG9zZAorZWxzZQorICAgICAgICBzdG9zdworZW5kaWYKK0VORE0KKworOyBNYWNyb3MgdG8gcHJvdmlkZSByZXNiLCByZXN3LCByZXNkIGNvbXBhdGliaWxpdHkgd2l0aCBOQVNNCisKK01BQ1JPICAgZGNsYiAgICBjb3VudAorZGIgIGNvdW50IGR1cCAoMCkKK0VORE0KKworTUFDUk8gICBkY2x3ICAgIGNvdW50CitkdyAgY291bnQgZHVwICgwKQorRU5ETQorCitNQUNSTyAgIGRjbGQgICAgY291bnQKK2RkICBjb3VudCBkdXAgKDApCitFTkRNCisKKzsgTWFjcm9zIHRvIHByb3ZpZGUgcmVzYiwgcmVzdywgcmVzZCBjb21wYXRpYmlsaXR5IHdpdGggTkFTTQorCitNQUNSTyAgIHJlc2IgICAgY291bnQKK2RiICBjb3VudCBkdXAgKD8pCitFTkRNCisKK01BQ1JPICAgcmVzdyAgICBjb3VudAorZHcgIGNvdW50IGR1cCAoPykKK0VORE0KKworTUFDUk8gICByZXNkICAgIGNvdW50CitkZCAgY291bnQgZHVwICg/KQorRU5ETQorCis7IE1hY3JvcyB0byBkZWNsYXJlIGFzc2VtYmxlciBzdHVicyBmb3IgZnVuY3Rpb24gc3RydWN0dXJlcworCitNQUNSTyAgIEJFR0lOX1NUVUJTX0RFRiBuYW1lLCBmaXJzdE9mZnNldAorYmVnZGF0YXNlZyAgX1NUVUJTCitpZmRlZiAgIF9fTk9VX1ZBUl9fCisgICAgICAgIEVYVFJOICAgbmFtZTpEV09SRAorU1RVQlNfU1RBUlQgPSAgIG5hbWUKK2Vsc2UKKyAgICAgICAgRVhUUk4gICBfJm5hbWUmOkRXT1JECituYW1lICAgIEVRVSAgICAgXyZuYW1lJgorU1RVQlNfU1RBUlQgPSAgIF8mbmFtZQorZW5kaWYKK2VuZGRhdGFzZWcgIF9TVFVCUworYmVnY29kZXNlZyAgX1NUVUJTCitvZmYgPSBmaXJzdE9mZnNldAorRU5ETQorCitNQUNSTyAgIERFQ0xBUkVfU1RVQiAgICBuYW1lCitpZmRlZiAgIF9fTk9VX18KK25hbWU6CisgICAgICAgIFBVQkxJQyAgbmFtZQorZWxzZQorXyZuYW1lOgorICAgICAgICBQVUJMSUMgIF8mbmFtZQorZW5kaWYKKyAgICAgICAgam1wICAgICBbRFdPUkQgU1RVQlNfU1RBUlQrb2ZmXQorb2ZmID0gb2ZmICsgNAorRU5ETQorCitNQUNSTyAgIFNLSVBfU1RVQiAgICBuYW1lCitvZmYgPSBvZmYgKyA0CitFTkRNCisKK01BQ1JPICAgREVDTEFSRV9TVERDQUxMIG5hbWUsbnVtX2FyZ3MKK2lmZGVmICAgU1REQ0FMTF9NQU5HTEUKK18mbmFtZSZAJm51bV9hcmdzJjoKKyAgICAgICAgUFVCTElDICBfJm5hbWUmQCZudW1fYXJncyYKK2Vsc2UKK25hbWU6CisgICAgICAgIFBVQkxJQyAgbmFtZQorZW5kaWYKKyAgICAgICAgam1wICAgICBbRFdPUkQgU1RVQlNfU1RBUlQrb2ZmXQorb2ZmID0gb2ZmICsgNAorRU5ETQorCitNQUNSTyAgIEVORF9TVFVCU19ERUYKK2VuZGNvZGVzZWcgIF9TVFVCUworRU5ETQorCitNQUNSTyAgIEJFR0lOX0lNUE9SVFNfREVGICAgbmFtZQorQkVHSU5fU1RVQlNfREVGIG5hbWUsNAorRU5ETQorCitpZm5kZWYgTE9DQUxfREVDTEFSRV9JTVAKK01BQ1JPICAgREVDTEFSRV9JTVAgbmFtZSwgbnVtQXJncworREVDTEFSRV9TVFVCICAgIG5hbWUKK0VORE0KKworTUFDUk8gICBTS0lQX0lNUCBuYW1lCitTS0lQX1NUVUIgICAgICAgbmFtZQorRU5ETQorCitNQUNSTyAgIFNLSVBfSU1QMiBuYW1lLCBudW1BcmdzCitERUNMQVJFX1NUVUIgICAgbmFtZQorRU5ETQorCitNQUNSTyAgIFNLSVBfSU1QMyBuYW1lCitTS0lQX1NUVUIgICAgICAgbmFtZQorRU5ETQorZW5kaWYKKworTUFDUk8gICBFTkRfSU1QT1JUU19ERUYKK0VORF9TVFVCU19ERUYKK0VORE0KKworTUFDUk8gICBMRUFfTCAgICByZWcsbmFtZQorICAgICAgICBsZWEgICAgIHJlZyxbbmFtZV0KK0VORE0KKworTUFDUk8gICBMRUFfRyAgICByZWcsbmFtZQorICAgICAgICBsZWEgICAgIHJlZyxbbmFtZV0KK0VORE0KKworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODdkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11LmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBwdWJsaWMgc3BlY2lmaWMgZnVuY3Rpb25zLgorKiAgICAgICAgICAgICAgIEFueSBhcHBsaWNhdGlvbiBsaW5raW5nIGFnYWluc3QgdXMgc2hvdWxkIG9ubHkKKyogICAgICAgICAgICAgICBpbmNsdWRlIHRoaXMgaGVhZGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX1g4NkVNVV9ICisjZGVmaW5lIF9fWDg2RU1VX1g4NkVNVV9ICisKKyNpZmRlZiBTQ0lURUNICisjaW5jbHVkZSAic2NpdGVjaC5oIgorI2RlZmluZSBYODZBUEkgIF9BU01BUEkKKyNkZWZpbmUgWDg2QVBJUCBfQVNNQVBJUAordHlwZWRlZiBpbnQgWDg2RU1VX3Bpb0FkZHI7CisjZWxzZQorI2luY2x1ZGUgIng4NmVtdS90eXBlcy5oIgorI2RlZmluZSBYODZBUEkKKyNkZWZpbmUgWDg2QVBJUCAqCisjZW5kaWYKKyNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvbnRlcnMgdG8gcHJvZ3JhbW1lZCBJL08gZnVuY3Rpb25zIHVzZWQgYnkgdGhlCitlbXVsYXRvci4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHVzZXIgcHJvZ3JhbSBjYW4gaG9vayBhbGwgcHJvZ3JhbW1lZAorSS9PIGZvciB0aGUgZW11bGF0b3IgdG8gaGFuZGxlZCBhcyBuZWNlc3NhcnkgYnkgdGhlIHVzZXIgcHJvZ3JhbS4gQnkKK2RlZmF1bHQgdGhlIGVtdWxhdG9yIGNvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBkbyBub3QgZG8gYWNjZXNzIHRoZQoraGFyZHdhcmUgaW4gYW55IHdheS4gVG8gYWxsb3cgdGhlIGVtdWFsdG9yIGFjY2VzcyB0aGUgaGFyZHdhcmUsIHlvdSB3aWxsCituZWVkIHRvIG92ZXJyaWRlIHRoZSBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNpbmcgdGhlIFg4NkVNVV9zZXR1cFBpb0Z1bmNzCitmdW5jdGlvbi4KKworSEVBREVSOgoreDg2ZW11LmgKKworTUVNQkVSUzoKK2luYiAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgYnl0ZSBmcm9tIGFuIEkvTyBwb3J0CitpbncgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBJL08gcG9ydAoraW5sICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBkd29yZCBmcm9tIGFuIEkvTyBwb3J0CitvdXRiICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBieXRlIHRvIGFuIEkvTyBwb3J0CitvdXR3ICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIEkvTyBwb3J0CitvdXRsICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBkd29yZCB0byBhbiBJL08gcG9ydAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1OCAgICAgIChYODZBUElQIGluYikoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisgICAgdTE2ICAgICAoWDg2QVBJUCBpbncpKFg4NkVNVV9waW9BZGRyIGFkZHIpOworICAgIHUzMiAgICAgKFg4NkFQSVAgaW5sKShYODZFTVVfcGlvQWRkciBhZGRyKTsKKyAgICB2b2lkICAgIChYODZBUElQIG91dGIpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCk7CisgICAgdm9pZCAgICAoWDg2QVBJUCBvdXR3KShYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKKyAgICB2b2lkICAgIChYODZBUElQIG91dGwpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpOworICAgIH0gWDg2RU1VX3Bpb0Z1bmNzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZQorZW11bGF0b3IuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSB1c2VyIHByb2dyYW0gY2FuIGhvb2sgYWxsIG1lbW9yeQorYWNjZXNzIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBlbXVsYXRvci4gQnkgZGVmYXVsdCB0aGUgZW11bGF0b3IKK2NvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBvbmx5IGFjY2VzcyB0aGUgaW50ZXJuYWwgbWVtb3J5IG9mIHRoZQorZW11bGF0b3IuIElmIHlvdSBuZWVkIHNwZWNpYWxpc2VkIGZ1bmN0aW9ucyB0byBoYW5kbGUgYWNjZXNzIHRvIGRpZmZlcmVudAordHlwZXMgb2YgbWVtb3J5IChpZTogaGFyZHdhcmUgZnJhbWVidWZmZXIgYWNjZXNzZXMgYW5kIEJJT1MgbWVtb3J5IGFjY2VzcworZXRjKSwgeW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIHVzaW5nIHRoZSBYODZFTVVfc2V0dXBNZW1GdW5jcworZnVuY3Rpb24uCisKK0hFQURFUjoKK3g4NmVtdS5oCisKK01FTUJFUlM6CityZGIgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGJ5dGUgZnJvbSBhbiBhZGRyZXNzCityZHcgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBhZGRyZXNzCityZGwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gYWRkcmVzcword3JiICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgYnl0ZSB0byBhbiBhZGRyZXNzCit3cncgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIGFkZHJlc3MKK3dybCAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdTggICAgICAoWDg2QVBJUCByZGIpKHUzMiBhZGRyKTsKKyAgICB1MTYgICAgIChYODZBUElQIHJkdykodTMyIGFkZHIpOworICAgIHUzMiAgICAgKFg4NkFQSVAgcmRsKSh1MzIgYWRkcik7CisgICAgdm9pZCAgICAoWDg2QVBJUCB3cmIpKHUzMiBhZGRyLCB1OCB2YWwpOworICAgIHZvaWQgICAgKFg4NkFQSVAgd3J3KSh1MzIgYWRkciwgdTE2IHZhbCk7CisgICAgdm9pZCAgICAoWDg2QVBJUCB3cmwpKHUzMiBhZGRyLCB1MzIgdmFsKTsKKyAgICB9IFg4NkVNVV9tZW1GdW5jczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgSGVyZSBhcmUgdGhlIGRlZmF1bHQgbWVtb3J5IHJlYWQgYW5kIHdyaXRlCisgIGZ1bmN0aW9uIGluIGNhc2UgdGhleSBhcmUgbmVlZGVkIGFzIGZhbGxiYWNrcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB1OCBYODZBUEkgcmRiKHUzMiBhZGRyKTsKK2V4dGVybiB1MTYgWDg2QVBJIHJkdyh1MzIgYWRkcik7CitleHRlcm4gdTMyIFg4NkFQSSByZGwodTMyIGFkZHIpOworZXh0ZXJuIHZvaWQgWDg2QVBJIHdyYih1MzIgYWRkciwgdTggdmFsKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cncodTMyIGFkZHIsIHUxNiB2YWwpOworZXh0ZXJuIHZvaWQgWDg2QVBJIHdybCh1MzIgYWRkciwgdTMyIHZhbCk7CisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHZvaWQgKFg4NkFQSVAgWDg2RU1VX2ludHJGdW5jcykoaW50IG51bSk7CitleHRlcm4gWDg2RU1VX2ludHJGdW5jcyBfWDg2RU1VX2ludHJUYWJbMjU2XTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCit2b2lkICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKFg4NkVNVV9tZW1GdW5jcyAqZnVuY3MpOwordm9pZCAgICBYODZFTVVfc2V0dXBQaW9GdW5jcyhYODZFTVVfcGlvRnVuY3MgKmZ1bmNzKTsKK3ZvaWQgICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKFg4NkVNVV9pbnRyRnVuY3MgZnVuY3NbXSk7Cit2b2lkICAgIFg4NkVNVV9wcmVwYXJlRm9ySW50KGludCBudW0pOworCisvKiBkZWNvZGUuYyAqLworCit2b2lkICAgIFg4NkVNVV9leGVjKHZvaWQpOwordm9pZCAgICBYODZFTVVfaGFsdF9zeXModm9pZCk7CisKKyNpZmRlZiAgREVCVUcKKyNkZWZpbmUgSEFMVF9TWVMoKSAgXAorICAgIHByaW50aygiaGFsdF9zeXM6IGZpbGUgJXMsIGxpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyksIFwKKyAgICBYODZFTVVfaGFsdF9zeXMoKQorI2Vsc2UKKyNkZWZpbmUgSEFMVF9TWVMoKSAgWDg2RU1VX2hhbHRfc3lzKCkKKyNlbmRpZgorCisvKiBEZWJ1ZyBvcHRpb25zICovCisKKyNkZWZpbmUgREVCVUdfREVDT0RFX0YgICAgICAgICAgMHgwMDAxICAvKiBwcmludCBkZWNvZGVkIGluc3RydWN0aW9uICAqLworI2RlZmluZSBERUJVR19UUkFDRV9GICAgICAgICAgICAweDAwMDIgIC8qIGR1bXAgcmVncyBiZWZvcmUvYWZ0ZXIgZXhlY3V0aW9uICovCisjZGVmaW5lIERFQlVHX1NURVBfRiAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBERUJVR19ESVNBU1NFTUJMRV9GICAgICAweDAwMDgKKyNkZWZpbmUgREVCVUdfQlJFQUtfRiAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIERFQlVHX1NWQ19GICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBERUJVR19TQVZFX0NTX0lQICAgICAgICAweDAwNDAKKyNkZWZpbmUgREVCVUdfRlNfRiAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIERFQlVHX1BST0NfRiAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBERUJVR19TWVNJTlRfRiAgICAgICAgICAweDAyMDAgLyogYmlvcyBzeXN0ZW0gaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX0YgICAgICAgMHgwNDAwCisjZGVmaW5lIERFQlVHX0lOU1RSVU1FTlRfRiAgICAgIDB4MDgwMAorI2RlZmluZSBERUJVR19NRU1fVFJBQ0VfRiAgICAgICAweDEwMDAKKyNkZWZpbmUgREVCVUdfSU9fVFJBQ0VfRiAgICAgICAgMHgyMDAwCisjZGVmaW5lIERFQlVHX1RSQUNFQ0FMTF9SRUdTX0YgIDB4NDAwMAorI2RlZmluZSBERUJVR19ERUNPREVfTk9QUklOVF9GICAweDgwMDAKKyNkZWZpbmUgREVCVUdfRVhJVCAgICAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBERUJVR19TWVNfRiAgICAgICAgICAgICAoREVCVUdfU1ZDX0Z8REVCVUdfRlNfRnxERUJVR19QUk9DX0YpCisKK3ZvaWQgICAgWDg2RU1VX3RyYWNlX3JlZ3Modm9pZCk7Cit2b2lkICAgIFg4NkVNVV90cmFjZV94cmVncyh2b2lkKTsKK3ZvaWQgICAgWDg2RU1VX2R1bXBfbWVtb3J5KHUxNiBzZWcsIHUxNiBvZmYsIHUzMiBhbXQpOworaW50ICAgICBYODZFTVVfdHJhY2Vfb24odm9pZCk7CitpbnQgICAgIFg4NkVNVV90cmFjZV9vZmYodm9pZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWDg2RU1VX1g4NkVNVV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3YjAzYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvZnB1X3JlZ3MuaApAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIEZQVSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfRlBVX1JFR1NfSAorI2RlZmluZSBfX1g4NkVNVV9GUFVfUkVHU19ICisKKyNpZmRlZiBYODZfRlBVX1NVUFBPUlQKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIEJhc2ljIDgwODcgcmVnaXN0ZXIgY2FuIGhvbGQgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAqLworCit1bmlvbiB4ODZfZnB1X3JlZ191IHsKKyAgICBzOCAgICAgICAgICAgICAgICAgIHRlbmJ5dGVzWzEwXTsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR2YWw7CisgICAgZmxvYXQgICAgICAgICAgICAgICBmdmFsOworICAgIHMxNiAgICAgICAgICAgICAgICAgc3ZhbDsKKyAgICBzMzIgICAgICAgICAgICAgICAgIGx2YWw7CisgICAgfTsKKworc3RydWN0IHg4Nl9mcHVfcmVnIHsKKyAgICB1bmlvbiB4ODZfZnB1X3JlZ191IHJlZzsKKyAgICBjaGFyICAgICAgICAgICAgICAgIHRhZzsKKyAgICB9OworCisvKgorICogU2luY2Ugd2UgYXJlIG5vdCBnb2luZyB0byB3b3JyeSBhYm91dCB0aGUgcHJvYmxlbXMgb2YgYWxpYXNpbmcKKyAqIHJlZ2lzdGVycywgZXZlcnkgdGltZSBhIHJlZ2lzdGVyIGlzIG1vZGlmaWVkLCBpdHMgcmVzdWx0IHR5cGUgaXMKKyAqIHNldCBpbiB0aGUgdGFnIGZpZWxkcyBmb3IgdGhhdCByZWdpc3Rlci4gIElmIHNvbWUgb3BlcmF0aW9uCisgKiBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHR5cGUgaW4gYSB3YXkgaW5jb25zaXN0ZW50IHdpdGggaXRzIGN1cnJlbnQKKyAqIHN0b3JhZ2UgZm9ybWF0LCB0aGVuIHdlIGZsYWcgdGhlIG9wZXJhdGlvbi4gIElmIGNvbW1vbiwgd2UnbGwKKyAqIGF0dGVtcHQgdGhlIGNvbnZlcnNpb24uCisgKi8KKworI2RlZmluZSAgWDg2X0ZQVV9WQUxJRCAgICAgICAgICAweDgwCisjZGVmaW5lICBYODZfRlBVX1JFR1RZUChyKSAgICAgICgocikgJiAweDdGKQorCisjZGVmaW5lICBYODZfRlBVX1dPUkQgICAgICAgICAgIDB4MAorI2RlZmluZSAgWDg2X0ZQVV9TSE9SVCAgICAgICAgICAweDEKKyNkZWZpbmUgIFg4Nl9GUFVfTE9ORyAgICAgICAgICAgMHgyCisjZGVmaW5lICBYODZfRlBVX0ZMT0FUICAgICAgICAgIDB4MworI2RlZmluZSAgWDg2X0ZQVV9ET1VCTEUgICAgICAgICAweDQKKyNkZWZpbmUgIFg4Nl9GUFVfTERCTCAgICAgICAgICAgMHg1CisjZGVmaW5lICBYODZfRlBVX0JTRCAgICAgICAgICAgIDB4NgorCisjZGVmaW5lICBYODZfRlBVX1NUS1RPUCAgMAorCitzdHJ1Y3QgeDg2X2ZwdV9yZWdpc3RlcnMgeworICAgIHN0cnVjdCB4ODZfZnB1X3JlZyAgeDg2X2ZwdV9zdGFja1s4XTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHg4Nl9mcHVfZmxhZ3M7CisgICAgaW50ICAgICAgICAgICAgICAgICB4ODZfZnB1X2NvbmZpZzsgICAgICAgICAvKiByb3VuZGluZyBtb2RlcywgZXRjLiAqLworICAgIHNob3J0ICAgICAgICAgICAgICAgeDg2X2ZwdV90b3MsIHg4Nl9mcHVfYm9zOworICAgIH07CisKKyNwcmFnbWEgcGFjaygpCisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm8uCisgKgorICogT25lIHZlcnNpb24gaXMgZm9yIG9wY29kZSBEOSwgZm9yIHdoaWNoIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIKKyAqIGluc3RydWN0aW9ucyBlbmNvZGVkIGluIHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgb3Bjb2RlLgorICoKKyAqIFRoZSBvdGhlciB2ZXJzaW9uLCBkZWFscyB3aXRoIGFsbCB0aGUgb3RoZXIgNyBpODcgb3Bjb2RlcywgZm9yCisgKiB3aGljaCB0aGVyZSBhcmUgb25seSAzMiBzdHJpbmdzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUKKyAqIGluc3RydWN0aW9ucy4KKyAqLworCisjZW5kaWYgLyogWDg2X0ZQVV9TVVBQT1JUICovCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgREVDT0RFX1BSSU5USU5TVFIzMih0LG1vZCxyaCxybCkgICAgICAgXAorICAgIERFQ09ERV9QUklOVEYodFsobW9kPDwzKSsocmgpXSk7CisjIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkgICAgICBcCisgICAgREVDT0RFX1BSSU5URih0Wyhtb2Q8PDYpKyhyaDw8MykrKHJsKV0pOworI2Vsc2UKKyMgZGVmaW5lIERFQ09ERV9QUklOVElOU1RSMzIodCxtb2QscmgscmwpCisjIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkKKyNlbmRpZgorCisjZW5kaWYgLyogX19YODZFTVVfRlBVX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmNlODg0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmgKQEAgLTAsMCArMSwzMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB4ODYgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX1JFR1NfSAorI2RlZmluZSBfX1g4NkVNVV9SRUdTX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBwYWNrKDEpCisKKy8qCisgKiBHZW5lcmFsIEVBWCwgRUJYLCBFQ1gsIEVEWCB0eXBlIHJlZ2lzdGVycy4gIE5vdGUgdGhhdCBmb3IKKyAqIHBvcnRhYmlsaXR5LCBhbmQgc3BlZWQsIHRoZSBpc3N1ZSBvZiBieXRlIHN3YXBwaW5nIGlzIG5vdCBhZGRyZXNzZWQKKyAqIGluIHRoZSByZWdpc3RlcnMuICBBbGwgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIGRlZmF1bHQgZm9ybWF0CisgKiBhdmFpbGFibGUgb24gdGhlIGhvc3QgbWFjaGluZS4gIFRoZSBvbmx5IGNyaXRpY2FsIGlzc3VlIGlzIHRoYXQgdGhlCisgKiByZWdpc3RlcnMgc2hvdWxkIGxpbmUgdXAgRVhBQ1RMWSBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdGhleSBkbyBpbgorICogdGhlIDM4Ni4gIFRoYXQgaXM6CisgKgorICogRUFYICYgMHhmZiAgPT09IEFMCisgKiBFQVggJiAweGZmZmYgPT0gQVgKKyAqCisgKiBldGMuICBUaGUgcmVzdWx0IGlzIHRoYXQgYWxvdCBvZiB0aGUgY2FsY3VsYXRpb25zIGNhbiB0aGVuIGJlCisgKiBkb25lIHVzaW5nIHRoZSBuYXRpdmUgaW5zdHJ1Y3Rpb24gc2V0IGZ1bGx5LgorICovCisKKyNpZmRlZiAgX19CSUdfRU5ESUFOX18KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUzMiBlX3JlZzsKKyAgICB9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUxNiBmaWxsZXIwLCB4X3JlZzsKKyAgICB9IEkxNl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4IGZpbGxlcjAsIGZpbGxlcjEsIGhfcmVnLCBsX3JlZzsKKyAgICB9IEk4X3JlZ190OworCisjZWxzZSAvKiAhX19CSUdfRU5ESUFOX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUzMiBlX3JlZzsKKyAgICB9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUxNiB4X3JlZzsKKyAgICB9IEkxNl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4IGxfcmVnLCBoX3JlZzsKKyAgICB9IEk4X3JlZ190OworCisjZW5kaWYgLyogQklHX0VORElBTiAqLworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBJMzJfcmVnX3QgICBJMzJfcmVnOworICAgIEkxNl9yZWdfdCAgIEkxNl9yZWc7CisgICAgSThfcmVnX3QgICAgSThfcmVnOworICAgIH0gaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyOworCitzdHJ1Y3QgaTM4Nl9nZW5lcmFsX3JlZ3MgeworICAgIGkzODZfZ2VuZXJhbF9yZWdpc3RlciBBLCBCLCBDLCBEOworICAgIH07CisKK3R5cGVkZWYgc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIEdlbl9yZWdfdDsKKworc3RydWN0IGkzODZfc3BlY2lhbF9yZWdzIHsKKyAgICBpMzg2X2dlbmVyYWxfcmVnaXN0ZXIgU1AsIEJQLCBTSSwgREksIElQOworICAgIHUzMiBGTEFHUzsKKyAgICB9OworCisvKiAgCisgKiBTZWdtZW50IHJlZ2lzdGVycyBoZXJlIHJlcHJlc2VudCB0aGUgMTYgYml0IHF1YW50aXRpZXMKKyAqIENTLCBEUywgRVMsIFNTLgorICovCisKK3N0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyB7CisgICAgdTE2IENTLCBEUywgU1MsIEVTLCBGUywgR1M7CisgICAgfTsKKworLyogOCBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfQUggIGdlbi5BLkk4X3JlZy5oX3JlZworI2RlZmluZSBSX0FMICBnZW4uQS5JOF9yZWcubF9yZWcKKyNkZWZpbmUgUl9CSCAgZ2VuLkIuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfQkwgIGdlbi5CLkk4X3JlZy5sX3JlZworI2RlZmluZSBSX0NIICBnZW4uQy5JOF9yZWcuaF9yZWcKKyNkZWZpbmUgUl9DTCAgZ2VuLkMuSThfcmVnLmxfcmVnCisjZGVmaW5lIFJfREggIGdlbi5ELkk4X3JlZy5oX3JlZworI2RlZmluZSBSX0RMICBnZW4uRC5JOF9yZWcubF9yZWcKKworLyogMTYgYml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0FYICBnZW4uQS5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfQlggIGdlbi5CLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9DWCAgZ2VuLkMuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0RYICBnZW4uRC5JMTZfcmVnLnhfcmVnCisKKy8qIDMyIGJpdCBleHRlbmRlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9FQVggIGdlbi5BLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FQlggIGdlbi5CLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FQ1ggIGdlbi5DLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FRFggIGdlbi5ELkkzMl9yZWcuZV9yZWcKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfU1AgIHNwYy5TUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfQlAgIHNwYy5CUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfU0kgIHNwYy5TSS5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfREkgIHNwYy5ESS5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfSVAgIHNwYy5JUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfRkxHIHNwYy5GTEFHUworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0VTUCAgc3BjLlNQLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FQlAgIHNwYy5CUC5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRVNJICBzcGMuU0kuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VESSAgc3BjLkRJLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FSVAgIHNwYy5JUC5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRUZMRyBzcGMuRkxBR1MKKworLyogc2VnbWVudCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9DUyAgc2VnLkNTCisjZGVmaW5lIFJfRFMgIHNlZy5EUworI2RlZmluZSBSX1NTICBzZWcuU1MKKyNkZWZpbmUgUl9FUyAgc2VnLkVTCisjZGVmaW5lIFJfRlMgIHNlZy5GUworI2RlZmluZSBSX0dTICBzZWcuR1MKKworLyogZmxhZyBjb25kaXRpb25zICAgKi8KKyNkZWZpbmUgRkJfQ0YgMHgwMDAxICAgICAgICAgICAgLyogQ0FSUlkgZmxhZyAgKi8KKyNkZWZpbmUgRkJfUEYgMHgwMDA0ICAgICAgICAgICAgLyogUEFSSVRZIGZsYWcgKi8KKyNkZWZpbmUgRkJfQUYgMHgwMDEwICAgICAgICAgICAgLyogQVVYICBmbGFnICAgKi8KKyNkZWZpbmUgRkJfWkYgMHgwMDQwICAgICAgICAgICAgLyogWkVSTyBmbGFnICAgKi8KKyNkZWZpbmUgRkJfU0YgMHgwMDgwICAgICAgICAgICAgLyogU0lHTiBmbGFnICAgKi8KKyNkZWZpbmUgRkJfVEYgMHgwMTAwICAgICAgICAgICAgLyogVFJBUCBmbGFnICAgKi8KKyNkZWZpbmUgRkJfSUYgMHgwMjAwICAgICAgICAgICAgLyogSU5URVJSVVBUIEVOQUJMRSBmbGFnICovCisjZGVmaW5lIEZCX0RGIDB4MDQwMCAgICAgICAgICAgIC8qIERJUiBmbGFnICAgICovCisjZGVmaW5lIEZCX09GIDB4MDgwMCAgICAgICAgICAgIC8qIE9WRVJGTE9XIGZsYWcgKi8KKworLyogODAyODYgYW5kIGFib3ZlIGFsd2F5cyBoYXZlIGJpdCMxIHNldCAqLworI2RlZmluZSBGX0FMV0FZU19PTiAgKDB4MDAwMikgICAvKiBmbGFnIGJpdHMgYWx3YXlzIG9uICovCisKKy8qCisgKiBEZWZpbmUgYSBtYXNrIGZvciBvbmx5IHRob3NlIGZsYWcgYml0cyB3ZSB3aWxsIGV2ZXIgcGFzcyBiYWNrIAorICogKHZpYSBQVVNIRikgCisgKi8KKyNkZWZpbmUgRl9NU0sgKEZCX0NGfEZCX1BGfEZCX0FGfEZCX1pGfEZCX1NGfEZCX1RGfEZCX0lGfEZCX0RGfEZCX09GKQorCisvKiBmb2xsb3dpbmcgYml0cyBtYXNrZWQgaW4gdG8gYSAxNmJpdCBxdWFudGl0eSAqLworCisjZGVmaW5lIEZfQ0YgMHgwMDAxICAgICAgICAgICAgIC8qIENBUlJZIGZsYWcgICovCisjZGVmaW5lIEZfUEYgMHgwMDA0ICAgICAgICAgICAgIC8qIFBBUklUWSBmbGFnICovCisjZGVmaW5lIEZfQUYgMHgwMDEwICAgICAgICAgICAgIC8qIEFVWCAgZmxhZyAgICovCisjZGVmaW5lIEZfWkYgMHgwMDQwICAgICAgICAgICAgIC8qIFpFUk8gZmxhZyAgICovCisjZGVmaW5lIEZfU0YgMHgwMDgwICAgICAgICAgICAgIC8qIFNJR04gZmxhZyAgICovCisjZGVmaW5lIEZfVEYgMHgwMTAwICAgICAgICAgICAgIC8qIFRSQVAgZmxhZyAgICovCisjZGVmaW5lIEZfSUYgMHgwMjAwICAgICAgICAgICAgIC8qIElOVEVSUlVQVCBFTkFCTEUgZmxhZyAqLworI2RlZmluZSBGX0RGIDB4MDQwMCAgICAgICAgICAgICAvKiBESVIgZmxhZyAgICAqLworI2RlZmluZSBGX09GIDB4MDgwMCAgICAgICAgICAgICAvKiBPVkVSRkxPVyBmbGFnICovCisKKyNkZWZpbmUgVE9HR0xFX0ZMQUcoZmxhZykgICAgICAgKE0ueDg2LlJfRkxHIF49IChmbGFnKSkKKyNkZWZpbmUgU0VUX0ZMQUcoZmxhZykgICAgICAgICAgKE0ueDg2LlJfRkxHIHw9IChmbGFnKSkKKyNkZWZpbmUgQ0xFQVJfRkxBRyhmbGFnKSAgICAgICAgKE0ueDg2LlJfRkxHICY9IH4oZmxhZykpCisjZGVmaW5lIEFDQ0VTU19GTEFHKGZsYWcpICAgICAgIChNLng4Ni5SX0ZMRyAmIChmbGFnKSkKKyNkZWZpbmUgQ0xFQVJBTExfRkxBRyhtKSAgICAgICAgKE0ueDg2LlJfRkxHID0gMCkKKworI2RlZmluZSBDT05ESVRJT05BTF9TRVRfRkxBRyhDT05ELEZMQUcpIFwKKyAgaWYgKENPTkQpIFNFVF9GTEFHKEZMQUcpOyBlbHNlIENMRUFSX0ZMQUcoRkxBRykKKworI2RlZmluZSBGX1BGX0NBTEMgMHgwMTAwMDAgICAgICAvKiBQQVJJVFkgZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgKi8KKyNkZWZpbmUgRl9aRl9DQUxDIDB4MDIwMDAwICAgICAgLyogWkVSTyBmbGFnIGhhcyBiZWVuIGNhbGNlZCAgICAgICovCisjZGVmaW5lIEZfU0ZfQ0FMQyAweDA0MDAwMCAgICAgIC8qIFNJR04gZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgICAqLworCisjZGVmaW5lIEZfQUxMX0NBTEMgICAgICAweGZmMDAwMCAgICAgICAgLyogQWxsIGhhdmUgYmVlbiBjYWxjZWQgICAqLworCisvKgorICogRW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KKyAqIFNlZ21lbnQgdXNhZ2UgY29udHJvbC4KKyAqLworI2RlZmluZSBTWVNNT0RFX1NFR19EU19TUyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0NTICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRFMgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9FUyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0ZTICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfR1MgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9TUyAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUEUgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfUkVQTkUgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9EQVRBICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX0FERFIgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU1lTTU9ERV9JTlRSX1BFTkRJTkcgICAgMHgxMDAwMDAwMAorI2RlZmluZSBTWVNNT0RFX0VYVFJOX0lOVFIgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIFNZU01PREVfSEFMVEVEICAgICAgICAgIDB4NDAwMDAwMDAKKworI2RlZmluZSBTWVNNT0RFX1NFR01BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01PREVfU0VHT1ZSX1NTKQorI2RlZmluZSBTWVNNT0RFX0NMUk1BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01PREVfU0VHT1ZSX1NTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTU9ERV9QUkVGSVhfREFUQSAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNT0RFX1BSRUZJWF9BRERSKQorCisjZGVmaW5lICBJTlRSX1NZTkNIICAgICAgICAgICAweDEKKyNkZWZpbmUgIElOVFJfQVNZTkNIICAgICAgICAgIDB4MgorI2RlZmluZSAgSU5UUl9IQUxURUQgICAgICAgICAgMHg0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzdHJ1Y3QgaTM4Nl9nZW5lcmFsX3JlZ3MgICAgZ2VuOworICAgIHN0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyAgICBzcGM7CisgICAgc3RydWN0IGkzODZfc2VnbWVudF9yZWdzICAgIHNlZzsKKyAgICAvKgorICAgICAqIE1PREUgY29udGFpbnMgaW5mb3JtYXRpb24gb246CisgICAgICogIFJFUEUgcHJlZml4ICAgICAgICAgICAgIDIgYml0cyAgcmVwZSxyZXBuZQorICAgICAqICBTRUdNRU5UIG92ZXJyaWRlcyAgICAgICA1IGJpdHMgIG5vcm1hbCxEUyxTUyxDUyxFUworICAgICAqICBEZWxheWVkIGZsYWcgc2V0ICAgICAgICAzIGJpdHMgICh6ZXJvLCBzaWduZWQsIHBhcml0eSkKKyAgICAgKiAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgNiBiaXRzCisgICAgICogIGludGVycnVwdCAjICAgICAgICAgICAgIDggYml0cyAgaW5zdHJ1Y3Rpb24gcmFpc2VkIGludGVycnVwdAorICAgICAqICBCSU9TIHZpZGVvIHNlZ3JlZ3MgICAgICA0IGJpdHMgIAorICAgICAqICBJbnRlcnJ1cHQgUGVuZGluZyAgICAgICAxIGJpdHMgIAorICAgICAqICBFeHRlcm4gaW50ZXJydXB0ICAgICAgICAxIGJpdHMKKyAgICAgKiAgSGFsdGVkICAgICAgICAgICAgICAgICAgMSBiaXRzCisgICAgICovCisgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7CisgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIGludG5vOworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICAgICBpbnRyOyAgIC8qIG1hc2sgb2YgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOworI2lmZGVmIERFQlVHCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOworICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9pcDsKKyAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfY3M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19wb3M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJfcG9zOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmWzMyXTsgLyogZW5jb2RlZCBieXRlIHN0cmVhbSAgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF9idWZbMjU2XTsgLyogZGlzYXNzZW1ibGVkIHN0cmluZ3MgKi8KKyNlbmRpZgorICAgIH0gWDg2RU1VX3JlZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIG1haW50YWluaW5nIHRoZSBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorCitNRU1CRVJTOgoreDg2ICAgICAgICAgICAgIC0gWDg2IHJlZ2lzdGVycworbWVtX2Jhc2UgICAgICAgIC0gQmFzZSByZWFsIG1vZGUgbWVtb3J5IGZvciB0aGUgZW11bGF0b3IKK21lbV9zaXplICAgICAgICAtIFNpemUgb2YgdGhlIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgZm9yIHRoZSBlbXVsYXRvcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYODZFTVVfcmVncyAgICAgeDg2OworICAgIHVuc2lnbmVkIGxvbmcgICBtZW1fYmFzZTsKKyAgICB1bnNpZ25lZCBsb25nICAgbWVtX3NpemU7CisgICAgdm9pZCogICAgICAgICAgIHByaXZhdGU7CisgICAgfSBYODZFTVVfc3lzRW52OworCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorICoKKyAqIFdlIGtlZXAgaXQgZ2xvYmFsIHRvIGF2b2lkIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGluIHRoZSBjb2RlIGZvciBzcGVlZC4KKyAqLworCitleHRlcm4gICAgWDg2RU1VX3N5c0VudiBfWDg2RU1VX2VudjsKKyNkZWZpbmUgICBNICAgICAgICAgICAgIF9YODZFTVVfZW52CisgICAgICAgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRnVuY3Rpb24gdG8gbG9nIGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUgKi8KKworLy92b2lkICAgIHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWDg2RU1VX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTdjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3R5cGVzLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHg4NiBlbXVsYXRvciB0eXBlIGRlZmluaXRpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9UWVBFU19ICisjZGVmaW5lIF9fWDg2RU1VX1RZUEVTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDdXJyZW50bHkgb25seSBmb3IgTGludXgvMzJiaXQgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChOT19MT05HX0xPTkcpCisjZGVmaW5lIF9fSEFTX0xPTkdfTE9OR19fCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHU4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHUxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1MzI7CisjaWZkZWYgX19IQVNfTE9OR19MT05HX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1NjQ7CisjZW5kaWYKKwordHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIHM4OwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIHMxNjsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICBzMzI7CisjaWZkZWYgX19IQVNfTE9OR19MT05HX18KK3R5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBzNjQ7CisjZW5kaWYKKworLyp0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgIHVpbnQ7Ki8KK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBzaW50OworCit0eXBlZGVmIHUxNiBYODZFTVVfcGlvQWRkcjsKKworI2VuZGlmICAvKiBfX1g4NkVNVV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODdlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg3ZWZmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg3ZWZmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4N2VmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0ZmU3NgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMxNi5tawpAQCAtMCwwICsxLDEzNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIEJvcmxhbmQgQysrIDQueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUywKKyMgICAgICAgICAgICAgICBEUE1JMTYgRE9TIGV4dGVuZGVyIGFuZCAxNiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogVVNFX1dJTjE2IFVTRV9CQzUgQkNfTElCQkFTRSBVU0VfV0lOOTUKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCisgICBDQyAgICAgICAgICAgOj0gYmNjCisgICBDRkxBR1MgICAgICAgOj0gLW1sIC1IPWJjYy5zeW0gLWk2MCAtZCAtZGMgLTQgLWYyODcKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL2lJTkNMVURFIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQorICAgTEQgICAgICAgICAgIDo9IGJjbGluayB0bGluay5leGUKKyAgIExERkxBR1MgICAgICA6PSAtYworICAgUkMgICAgICAgICAgIDo9IGJyYworICAgUkNGTEFHUyAgICAgIDo9CisuSUYgJChVU0VfQkM1KQorLklGICQoVVNFX1dJTjk1KQorICAgV0lOX1ZFUlNJT04gIDo9IC1WNC4wCisuRU5ESUYKKy5FTkRJRgorICAgTElCUiAgICAgICAgIDo9IHRsaWIKKyAgIExJQkZMQUdTICAgICA6PSAvQyAvUDMyCisgICBJTElCICAgICAgICAgOj0gaW1wbGliCisgICBJTElCRkxBR1MgICAgOj0gLWMKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCisuSUYgJChEQkcpCisgICBDRkxBR1MgICAgICAgKz0gLXYKKyAgIExERkxBR1MgICAgICArPSAtdgorICAgQVNGTEFHUyAgICAgICs9IC96aQorICAgTElCRkxBR1MgICAgICs9IC9QMTI4CisuRUxTRQorICAgTERGTEFHUyAgICAgICs9IC14CisgICBBU0ZMQUdTICAgICAgKz0gL3EKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMiAtay0KKy5FTElGICQoT1BUX1NJWkUpCisgICBDRkxBR1MgICAgICAgKz0gLU8xIC1rLQorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQorLkVORAorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBhcyBXaW4xNgorLklGICQoVVNFX1dJTjE2KQorLklGICQoQlVJTERfRExMKQorICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtRnMtIC1EQlVJTERfRExMCisgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLVcgLUZzLQorLkVORElGCisgICBERUZfTElCUwkJOj0gaW1wb3J0LmxpYiBtYXRod2wubGliIGN3bC5saWIKKyAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KKyAgIExJQl9PUyAgICAgICA9IFdJTjE2CisuRUxTRQorICAgVVNFX1JFQUxET1MJOj0gMQorICAgREVGX0xJQlMgICAgIDo9IG1hdGhsLmxpYiBmcDg3LmxpYiBjbC5saWIKKyAgIExJQl9PUyAgICAgICA9IERPUzE2CisuRU5ECisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfRFBNSTE2KQorUE1MSUIgICAgICAgICAgIDo9IGRwbWkxNlxwbS5saWIKKy5FTFNFCitQTUxJQiAgICAgICAgICAgOj0gcG0ubGliCisuRU5ECisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoQkNfTElCQkFTRSkKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gYmMxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNkODBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsKQEAgLTAsMCArMSwxMDIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBCb3JsYW5kIEMrKyAzLjEgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUyBkZXZlbG9wbWVudC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGJjYworICAgQ0ZMQUdTICAgICAgIDo9IC1tbCAtSD1iY2Muc3ltIC1pNjAgLWQKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisgICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rLmV4ZQorICAgTERGTEFHUyAgICAgIDo9IC1jCisgICBMSUIgICAgICAgICAgOj0gdGxpYgorICAgTElCRkxBR1MgICAgIDo9IC9DCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC12CisgICBMREZMQUdTICAgICAgKz0gLXYKKyAgIEFTRkxBR1MgICAgICArPSAvemkKKyAgIExJQkZMQUdTICAgICArPSAvUDEyOAorLkVMU0UKKyAgIExERkxBR1MgICAgICArPSAteAorICAgQVNGTEFHUyAgICAgICs9IC9xCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKKy5JRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAtMyAtTzIKKy5FTElGICQoT1BUX1NJWkUpCisgICBDRkxBR1MgICAgICAgKz0gLTMgLU8xCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKworLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC1mMjg3IC1ERlBVMzg3CisgICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gLURCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCisuRU5ECisgICBVU0VfUkVBTERPUwk6PSAxCisKKyMgRGVmaW5lIHRoZSBkZWZhdWx0IGxpYnJhcmllcyB0byBsaW5rIHdpdGgKKyAgIERFRl9MSUJTCQk6PSBtYXRobC5saWIgY2wubGliCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcZG9zMTZcYmMzCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSBiYzMubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZkZTFkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMyLm1rCkBAIC0wLDAgKzEsMjAxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgNC4wIDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyBCb3JsYW5kJ3MgRE9TIFBvd2VyCisjICAgICAgICAgICAgICAgUGFjayBEUE1JMzIgRE9TIGV4dGVuZGVyLCBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIgYW5kCisjICAgICAgICAgICAgICAgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9TTVgzMiBVU0VfVE5UIFVTRV9XSU4zMiBVU0VfQkM1IFVTRV9WWEQgQkNfTElCQkFTRQorLklNUE9SVCAuSUdOT1JFIDogVlRPT0xTRAorCisjIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKKyAgIF8zMkJJVF8gICAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGJjYzMyCisuSUYgJChVU0VfVlhEKQorICAgQ0ZMQUdTICAgICAgIDo9IC00IC1pNjAgLWQgLXctc3R1CisuRUxTRQorICAgQ0ZMQUdTICAgICAgIDo9IC00IC1IPWJjYzMyLnN5bSAtaTYwIC1kIC13LXN0dQorLkVORElGCisuSUYgJChVU0VfTkFTTSkKKyAgIEFTCQkJOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQorLkVMU0UKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQorLkVORElGCisgICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rMzIuZXhlCisgICBMREZMQUdTICAgICAgOj0gLWMKKyAgIFJDICAgICAgICAgICA6PSBicmMzMgorLklGICQoVVNFX0JDNSkKKyAgIFdJTl9WRVJTSU9OICA6PSAtVjQuMAorICAgUkNGTEFHUyAgICAgIDo9IC0zMgorLkVMU0UKKyAgIFJDRkxBR1MgICAgICA6PSAtdzMyCisuRU5ESUYKKyAgIExJQiAgICAgICAgICA6PSB0bGliCisgICBMSUJGTEFHUyAgICAgOj0gL0MKKyAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKKyAgIElMSUJGTEFHUyAgICA6PSAtYworICAgSU5URUxfWDg2CTo9IDEKKyAgIE5NU1lNICAgCQk6PSAkKFNPRlRJQ0VfUEFUSClcbm1zeW0uZXhlCisgICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKFNDSVRFQ0gpXHNyY1xwbTskKFNDSVRFQ0gpXHNyY1xwbVxjb21tb247JChTQ0lURUNIKVxzcmNccG1cd2luMzIKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCisuSUYgJChEQkcpCisgICBDRkxBR1MgICAgICAgKz0gLXYKKyAgIExERkxBR1MgICAgICArPSAtdgorICAgTElCRkxBR1MgICAgICs9IC9QMjU2CisuSUYgJChVU0VfTkFTTSkKKyAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kIC1nCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC96aQorLkVORElGCisuRUxTRQorICAgTERGTEFHUyAgICAgICs9IC14CisgICBMSUJGTEFHUwkJKz0gL1AxMjgKKy5JRiAkKFVTRV9OQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC1GIG51bGwKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgKz0gL3EKKy5FTkRJRgorLkVORAorCisjIE9wdGlvbmFsbHkgZGlzYWJsZSBuYWdnaW5nIHdhcm5pbmdzIGlmIE1BWF9XQVJOIGlzIG5vdCBvbgorLklGICQoTUFYX1dBUk4pCisuRUxTRQorICAgQ0ZMQUdTCQkrPSAtdy1hdXMgLXctcGFyIC13LWhpZCAtdy1waWEKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zICgtNSAtTzIgYnJlYWtzIEJDKysgNC4wLTQuNSBzb21ldGltZXMpCisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gLTUgLU8yIC1rLQorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtNSAtTzEgLWstCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORAorCisjIE9wdGlvbmFsbHkgdXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlciwgb3RoZXJ3aXNlIHVzZSB0aGUgRE9TIFBvd2VyIFBhY2sKKy5JRiAkKFVTRV9UTlQpCisgICBDRkxBR1MgICAgICAgKz0gLURfX01TRE9TX18KKyAgIERYX0NGTEFHUyAgICArPSAtRFROVAorICAgRFhfQVNGTEFHUyAgICs9IC1kVE5UCisgICBMSUJfT1MgICAgICAgPSBET1MzMgorICAgREVGX0xJQlMJCTo9IGltcG9ydDMyLmxpYiBjdzMyLmxpYiBkb3N4MzIubGliIHRudGFwaS5saWIKKy5FTElGICQoVVNFX1ZYRCkKKyAgIExERkxBR1MJCSs9IC1uIC1QLSAteAorICAgQ0ZMQUdTICAgICAgICs9IC1SVC0gLXgtIC1PaSAtVkMgLUkkKFZUT09MU0QpXElOQ0xVREUgLURJU18zMiAtRFdBTlRWWERXUkFQUyAtRFZUT09MU0QgLURXSU40MCAtRFdJTjQwX09SX0xBVEVSIC1EREVGU0VHPTEgLXpDX0xURVhUIC16QUxDT0RFIC16Ul9MREFUQSAtelRMQ09ERQorICAgREVGX0xJQlMJCTo9ICQoVlRPT0xTRClcbGliXGNmYmM0NDBkLmxpYiAkKFZUT09MU0QpXGxpYlx3cjBiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJcd3IxYmM0NDAubGliICQoVlRPT0xTRClcbGliXHdyMmJjNDQwLmxpYiAkKFZUT09MU0QpXGxpYlx3cjNiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJccnRiYzQ0MGQubGliCisgICBEWF9BU0ZMQUdTICAgKz0gLWRfX1ZYRF9fIC1kX19CT1JMQU5EQ19fPTEgLUkkKFZUT09MU0QpXElOQ0xVREUgLUkkKFZUT09MU0QpXExJQlxJTkNMVURFCisgICBMSUJfT1MgICAgICAgPSBWWEQKKy5FTElGICQoVVNFX1dJTjMyKQorLklGICQoV0lOMzJfR1VJKQorLkVMU0UKKyAgICBDRkxBR1MgICAgICAgKz0gLURfX0NPTlNPTEVfXworLkVORElGCisuSUYgJChCVUlMRF9ETEwpCisgICBDRkxBR1MgICAgICAgKz0gLVdEIC1EQlVJTERfRExMCisgICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLVcgLVdNCisuRU5ESUYKKy5JRiAkKFVTRV9CQzUpCisuRUxTRQorICAgQ0ZMQUdTCQkrPSAtRF9XSU4zMgorLkVORElGCisgICBERUZfTElCUwkJOj0gaW1wb3J0MzIubGliIGN3MzJtdC5saWIKKyAgIERYX0FTRkxBR1MgICArPSAtZF9fV0lORE9XUzMyX18KKyAgIExJQl9PUyAgICAgICA9IFdJTjMyCisuRUxJRiAkKFVTRV9TTVgzMikKKyAgIENGTEFHUyAgICAgICArPSAtRF9fU01YMzJfXyAtRFBNRTMyCisgICBEWF9DRkxBR1MgICAgKz0KKyAgIERYX0FTRkxBR1MgICArPSAtZF9fU01YMzJfXyAtZERQTUkzMiAtZFBNRTMyCisgICBVU0VfUkVBTERPUwk6PSAxCisgICBMSUJfT1MgICAgICAgPSBTTVgzMgorICAgREVGX0xJQlMgICAgIDo9IGN3MzJtdC5saWIKKy5FTFNFCisgICBVU0VfRFBNSTMyICAgOj0gMQorICAgQ0ZMQUdTICAgICAgICs9IC1EX19NU0RPU19fCisgICBEWF9DRkxBR1MgICAgKz0gLVdYIC1ERFBNSTMyCisgICBEWF9BU0ZMQUdTICAgKz0gLWREUE1JMzIKKyAgIFVTRV9SRUFMRE9TCTo9IDEKKyAgIExJQl9PUyAgICAgICA9IERPUzMyCisgICBERUZfTElCUwkJOj0KKy5FTkQKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfVE5UKQorUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHRudFxwbS5saWIKKy5FTElGICQoVVNFX0RQTUkzMikKK1BNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMzJccG0ubGliCisuRUxTRQorUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHBtLmxpYgorLkVORAorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gYmMzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iY29zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhZWI3YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsKQEAgLTAsMCArMSwxMzcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBCb3JsYW5kIEMrKyAyLjAgMzItYml0IE9TLzIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogVVNFX09TMkdVSSBCQ19MSUJCQVNFCisKKyMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAorICAgXzMyQklUXyAgICAgIDo9IDEKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCisgICBDQyAgICAgICAgICAgOj0gYmNjCisgICBDRkxBR1MgICAgICAgOj0gLXctIC00IC1IPWJjYzMyLnN5bSAtaTYwIC1kCisuSUYgJChVU0VfTkFTTSkKKyAgIEFTICAgICAgICAgICA6PSBuYXNtCisgICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1kX19GTEFUX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCisuRUxTRQorICAgQVMgICAgICAgICAgIDo9IHRhc20KKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvRF9fT1MyX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisuRU5ESUYKKyAgIExEICAgICAgICAgICA6PSBiY2xpbmsgdGxpbmsuZXhlCisgICBMREZMQUdTICAgICAgOj0gLWMKKyAgIFJDICAgICAgICAgICA6PSBicmNjCisgICBSQ0ZMQUdTICAgICAgOj0KKyAgIExJQiAgICAgICAgICA6PSB0bGliCisgICBMSUJGTEFHUyAgICAgOj0gL0MgL1AzMgorICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgorICAgSUxJQkZMQUdTICAgIDo9IC1jCisuSUYgJChVU0VfT1MyR1VJKQorICAgQ0ZMQUdTCQkrPSAtRF9fT1MyX1BNX18KKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtdgorICAgTERGTEFHUyAgICAgICs9IC12CisgICBMSUJGTEFHUyAgICAgKz0gL1AxMjgKKy5JRiAkKFVTRV9OQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC1GIGJvcmxhbmQKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgKz0gL3ppCisuRU5ESUYKKy5FTFNFCisgICBMREZMQUdTICAgICAgKz0gLXgKKy5JRiAkKFVTRV9OQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC1GIG51bGwKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgKz0gL3EKKy5FTkRJRgorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gLTUgLU8yIC1rLQorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtNSAtTzEgLWstCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORAorCisjIE9wdGlvbmFsbHkgdXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlciwgb3RoZXJ3aXNlIHVzZSB0aGUgRE9TIFBvd2VyIFBhY2sKKy5JRiAkKEJVSUxEX0RMTCkKKyAgIENGTEFHUyAgICAgICArPSAtc2QgLXNtIC1EQlVJTERfRExMCisgICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLXNtCisuRU5ESUYKKyAgIERFRl9MSUJTCTo9IG9zMi5saWIgYzJtdC5saWIKKyAgIERYX0FTRkxBR1MgICArPSAtZF9fT1MyX18KKyAgIExJQl9PUyAgICAgICA9IG9zMjMyCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTICAgICAgICAgICs9IC1EQ0hFQ0tFRD0xCisuRUxTRQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKEJDX0xJQkJBU0UpCisgICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKKworIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKFVTRV9PUzJHVUkpCitERUZfTElCUyAgICAgICAgKz0gcG1fcG0ubGliCisuRUxTRQorREVGX0xJQlMgICAgICAgICs9IHBtLmxpYgorLkVORElGCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSBiY29zMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDE2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjlhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMTYubWsKQEAgLTAsMCArMSwxMzIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBNaWNyb3NvZnQgQyA2LjAgMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdAorIyAgICAgICAgICAgICAgIE9TLzIgZGV2ZWxvcG1lbnQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IFZDX0xJQkJBU0UKKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9NQVNNCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGNsICAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKKyAgIENGTEFHUyAgICAgICA6PSAvdyAvR3MKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTElGICQoVVNFX01BU00pCisgICBBUyAgICAgICAgICAgOj0gbWFzbSAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKyAgIEFTRkxBR1MgICAgICA6PSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTkRJRgorICAgTEQgICAgICAgICAgIDo9IGNsICAgICAgICMgTG9hZGVyIGFuZCBmbGFncworICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQorICAgUkMgICAgICAgICAgIDo9IHJjICAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgorICAgUkNGTEFHUyAgICAgIDo9CisgICBMSUIgICAgICAgICAgOj0gbGliICAgICAgIyBMaWJyYXJpYW4KKyAgIExJQkZMQUdTICAgICA6PSAvTk9JIC9OT0UKKyAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KKyAgIElMSUJGTEFHUyAgICA6PSAvbm9pZ25vcmVjYXNlCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC9aaSAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgorICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgorLkVMU0UKKyAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC9PeAorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAvRlBpODcgL0RGUFUzODcKKyAgIEFTRkxBR1MgICAgICArPSAvREZQVTM4NyAvREZQVV9SRUdfUlROCisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC9EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC9EQkVUQQorLkVORAorCisjIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQgPz8/PyBIb3cgdGhlIGZ1Y2sgZG8geW91CisjIHNwZWNpZnkgbGlua2VyIG9wdGlvbnMgb24gdGhlIENMIGNvbW1hbmQgbGluZT8/Pz8/CisKKy5JRiAkKFNUS1NJWkUpCisuRU5ESUYKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgZm9yIDE2IGJpdCBXaW5kb3dzCisuSUYgJChVU0VfV0lOMTYpCisuSUYgJChCVUlMRF9ETEwpCisgICBDRkxBR1MgICAgICAgKz0gL0dEIC9BbGZ3IC9EQlVJTERfRExMCisgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gL0dBIC9BTAorLkVORElGCisgICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCisgICBMSUJfT1MgICAgICAgPSBXSU4xNgorLkVMU0UKKyAgIFVTRV9SRUFMRE9TCTo9IDEKKyAgIENGTEFHUyAgICAgICArPSAvQUwKKyAgIExJQl9PUyAgICAgICA9IERPUzE2CisuRU5ECisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCitQTUxJQiAgICAgICAgICAgOj0gcG0ubGliCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkNfTElCQkFTRSkKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gY2wxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDM4Ni5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wzODYubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxNTdmOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wzODYubWsKQEAgLTAsMCArMSwxMjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgTWljcm9zb2Z0IDM4NiBDIDYuMCAzMiBiaXQuIFN1cHBvcnRzIDMyIGJpdAorIyAgICAgICAgICAgICAgIE9TLzIgZGV2ZWxvcG1lbnQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IENMX0xJQkJBU0UgVVNFX1ZERAorLklNUE9SVCAuSUdOT1JFIDogVVNFX01BU00KKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCisgICBDQyAgICAgICAgICAgOj0gY2wzODYgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncworICAgIyBOQjogVGhlIC1aZiBmbGFnIGlzIEFCU09MVVRFTFkgTkVDRVNTQVJZIHRvIGNvbXBpbGUgSUJNJ3MgT1MvMiBoZWFkZXJzLgorICAgIyAgICAgSXQgaXNuJ3QgZG9jdW1lbnRlZCBhbnl3aGVyZSBidXQgb2J2aW91c2x5IGFkZHMgc3VwcG9ydCBmb3IgNDgtYml0CisgICAjICAgICBmYXIgcG9pbnRlcnMgKGllLiBfZmFyIGlzIHZhbGlkIGluIDMyLWJpdCBjb2RlKS4gR3JlYXQuCisgICBDRkxBR1MgICAgICAgOj0gLUczcyAtWmYgLURfXzM4Nl9fCisgICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9vaSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworLkVMSUYgJChVU0VfTUFTTSkKKyAgIEFTICAgICAgICAgICA6PSBtYXNtICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5FTFNFCisgICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRU5ESUYKKyAgIExEICAgICAgICAgICA6PSBsaW5rMzg2ICAjIExpbmtlciBhbmQgZmxhZ3MKKyAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKKyAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyAgIFJDRkxBR1MgICAgICA6PQorICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCisgICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCisgICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtWmkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCisgICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZworLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gL094CisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKworLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCisuRU5ECisKKyMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKKyMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KKworLklGICQoU1RLU0laRSkKKy5FTkRJRgorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgorCisjIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKKworLklGICQoQ0hFQ0tFRCkKK0xJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKK0NGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1EQ0hFQ0tFRD0xCisuRUxTRQorTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfT1MgICAgICAgPSBvczIzMgorICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChDTF9MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSyAgICA6PSBjbDM4Ni5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NvbW1vbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTIzNjRmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsKQEAgLTAsMCArMSwxODEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgQ29tbW9uIG1ha2VmaWxlIHRhcmdldHMgdXNlZCBieSBhbGwgU2NpVGVjaCBTb2Z0d2FyZQorIyAgICAgICAgICAgICAgIG1ha2VmaWxlcy4gVGhpcyBmaWxlIGluY2x1ZGVzIHRhcmdldHMgZm9yIGNsZWFuaW5nIHRoZQorIyAgICAgICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgbWFpbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcyB3aXRoCisjICAgICAgICAgICAgICAgUkNTLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBPdmVycmlkZSBnbG9iYWwgT3BlbkdMIGluY2x1ZGVzIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgTUdMIHZlcnNpb24KKworLklGICQoVVNFX01HTF9PUEVOR0wpCisuSUYgJChVTklYX0hPU1QpCitDRkxBR1MJCSs9IC1JJChTQ0lURUNIKS9pbmNsdWRlL21nbGdsCitERVBFTkRfSU5DCSs9ICQoU0NJVEVDSCkvaW5jbHVkZS9tZ2xnbAorLkVMU0UKK0NGTEFHUwkJKz0gLUkkKFNDSVRFQ0gpXGluY2x1ZGVcbWdsZ2wKK0RFUEVORF9JTkMJKz0gJChTQ0lURUNIKVxpbmNsdWRlL21nbGdsCisuRU5ESUYKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGFsbCBjb21waWxlZCBETEwgZmlsZXMKKworLklGICQoVU5JWF9IT1NUKQorLklGICQoQ0hFQ0tFRCkKK0RMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpL3JlZGlzdC9kZWJ1ZworLkVMU0UKK0RMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpL3JlZGlzdC9yZWxlYXNlCisuRU5ESUYKKy5FTFNFCisuSUYgJChDSEVDS0VEKQorRExMX0RFU1QgICAgOj0gJChTQ0lURUNIX0xJQilccmVkaXN0XGRlYnVnCisuRUxTRQorRExMX0RFU1QgICAgOj0gJChTQ0lURUNIX0xJQilccmVkaXN0XHJlbGVhc2UKKy5FTkRJRgorLkVORElGCisKKyMgVGFyZ2V0IHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGFuZCBETEwgZmlsZSBpZiBzcGVjaWZpZWQKKworLklGICQoTElCRklMRSkKKworbGliOiAkKExJQkZJTEUpCisKKy5JRiAkKERMTEZJTEUpCisKKyMgQnVpbGQgYW5kIGluc3RhbGwgYSBETEwgZmlsZSwgb3Igc2ltcGx5IGJ1aWxkIGltcG9ydCBsaWJyYXJ5IGFuZCBpbnN0YWxsCisKKy5JRiAkKEJVSUxEX0RMTCkKKworJChETExGSUxFKTogJChPQkpFQ1RTKQorJChMSUJGSUxFKTogJChETExGSUxFKQoraW5zdGFsbDogJChMSUJGSUxFKSAkKERMTEZJTEUpCisJJChJTlNUQUxMKSAkKExJQkZJTEUpICQoTElCX0RFU1QpJChMSUJfRVhURU5ERVIpCisJJChJTlNUQUxMKSAkKERMTEZJTEUpICQoRExMX0RFU1QpCisuSUYgJChVU0VfU09GVElDRSkKKwkkKElOU1RBTEwpICQoRExMRklMRTpzLy5kbGwvLm5tcykgJChETExfREVTVCkKKy5FTkRJRgorLkVMU0UKKworJChMSUJGSUxFKTogJChETExfREVTVClcJChETExGSUxFKQoraW5zdGFsbDogJChMSUJGSUxFKQorCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQorCisuRU5ESUYKKy5FTFNFCisKKy5JRiAkKEJVSUxEX0RMTCkKKworIyBCdWlsZCBhbmQgaW5zdGFsbCBhIFVuaXggc2hhcmVkIGxpYnJhcnkKKworJChMSUJGSUxFKTogJChPQkpFQ1RTKQoraW5zdGFsbDogJChMSUJGSUxFKQorCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQorCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKERMTF9ERVNUKS8kKExJQkZJTEUpLiQoVkVSU0lPTikKKworLkVMU0UKKworIyBCdWlsZCBhbmQgaW5zdGFsbCBhIG5vcm1hbCBsaWJyYXJ5IGZpbGUKKworLklGICQoVVNFX0RMTCkKKy5FTFNFCiskKExJQkZJTEUpOiAkKE9CSkVDVFMpCitpbnN0YWxsOiAkKExJQkZJTEUpCisJJChJTlNUQUxMKSAkKExJQkZJTEUpICQoTElCX0RFU1QpJChMSUJfRVhURU5ERVIpCisuRU5ESUYKKy5FTkRJRgorLkVORElGCisuRU5ESUYKKworIyBCdWlsZCBhbmQgaW5zdGFsbCBhIFZ4RCBmaWxlLCBpbmNsdWRpbmcgZGVidWcgaW5mb3JtYXRpb24KKworLklGICQoVlhERklMRSkKKyQoVlhERklMRTpzLy52eGQvLmRsbCk6ICQoT0JKRUNUUykKKyQoVlhERklMRSk6ICQoVlhERklMRTpzLy52eGQvLmRsbCkKK2luc3RhbGw6ICQoVlhERklMRSkKKwkkKElOU1RBTEwpICQoVlhERklMRSkgJChETExfREVTVCkKKy5JRiAkKERCRykKKwkkKElOU1RBTEwpICQoVlhERklMRTpzLy52eGQvLm5tcykgJChETExfREVTVCkKKy5FTkRJRgorLkVORElGCisKKyMgQ2xlYW4gdXAgZGlyZWN0b3J5IHJlbW92aW5nIGFsbCBmaWxlcyBub3QgbmVlZGVkIHRvIG1ha2UgdGhlIGxpYnJhcnkuCisKK19fQ0xFQU5fRklMRVMgOj0gKi5vYmogKi5vICouc3ltICouYmFrICoudGRrICouc3dwICoubWFwICouZXJyICouY3NtICoubGliICouYXBzICoubm1zICouc3lzCitfX0NMRUFOX0ZJTEVTICs9ICoufiogKi50ZCAqLnRyICoudHI/ICoudGQ/ICoucndzICoucmVzICouZXhwICouaWxrICoucGRiICoucGNoICouYSBiY2MzMi4qCitfX0NMRUFOX0ZJTEVTICs9ICQoTElCQ0xFQU4pCitfX0NMRUFORVhFX0ZJTEVTIDo9ICQoX19DTEVBTl9GSUxFUykgKiRFICouZHJ2ICoucmV4ICouZGxsICoudnhkICoubm1zICoucGVsICouc21mICouc28uKgorCisuUEhPTlkgY2xlYW46CisJQCQoUk0pIC1mIC1TICQobWt0bXAgJChfX0NMRUFOX0ZJTEVTOnQiXG4iKSkKKworLlBIT05ZIGNsZWFuZXhlOgorCUAkKFJNKSAtZiAtUyAkKG1rdG1wICQoX19DTEVBTkVYRV9GSUxFUzp0IlxuIikpCisKKyMgRGVmaW5lIHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgdG8gZmluZCBjb21tb24gZmlsZXMKKworLklGICQoTk9fU0NJVEVDSF9DT01NT04pCisuRUxTRQorLlNPVVJDRToJCSAgICQoU0NJVEVDSCkvc3JjL2NvbW1vbgorLkVORElGCisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIGZpbGUgZGVwZW5kZW5jaWVzIHVzaW5nIHRoZSBNS1VUSUwgbWFrZWRlcCBwcm9ncmFtIGlmCisjIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBvYmplY3QgZmlsZXMgaXMgZGVmaW5lZAorCisuSUYgJChERVBFTkRfT0JKKQorZGVwZW5kOgorCUAkKFJNKSAtZiBtYWtlZmlsZS5kZXAKKy5JRiAkKERFUEVORF9TUkMpCisuSUYgJChERVBFTkRfSU5DKQorCUBtYWtlZGVwIC1hbWFrZWZpbGUuZGVwIC1yIC1zIC1JQCQobWt0bXAgJChERVBFTkRfSU5DOnMvXC9cXCkpIC1TQCQobWt0bXAgJChERVBFTkRfU1JDOnMvXC9cXCk7JChTQ0lURUNIKS9zcmMvY29tbW9uKSBAJChta3RtcCAkKERFUEVORF9PQko6dCJcbiIpXG4pCisuRUxTRQorCUBtYWtlZGVwIC1hbWFrZWZpbGUuZGVwIC1yIC1zIC1TQCQobWt0bXAgJChERVBFTkRfU1JDOnMvXC9cXCk7JChTQ0lURUNIKS9zcmMvY29tbW9uKSBAJChta3RtcCAkKERFUEVORF9PQko6dCJcbiIpXG4pCisuRU5ESUYKKy5FTFNFCisuSUYgJChERVBFTkRfSU5DKQorCUBtYWtlZGVwIC1hbWFrZWZpbGUuZGVwIC1yIC1zIC1JQCQobWt0bXAgJChERVBFTkRfSU5DOnMvXC9cXCkpIC1TQCQobWt0bXAgJChTQ0lURUNIKS9zcmMvY29tbW9uKSBAJChta3RtcCAkKERFUEVORF9PQko6dCJcbiIpXG4pCisuRUxTRQorCUBtYWtlZGVwIC1hbWFrZWZpbGUuZGVwIC1yIC1zIC1TQCQobWt0bXAgJChTQ0lURUNIKS9zcmMvY29tbW9uKSBAJChta3RtcCAkKERFUEVORF9PQko6dCJcbiIpXG4pCisuRU5ESUYKKy5FTkRJRgorCUAkKEVDSE8pIE9iamVjdCBmaWxlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZ2VuZXJhdGVkLgorLkVORElGCisKKyMgU2V0IHVwIGZvciBjb21waWxpbmcgU25hcCBleGVjdXRlYWJsZXMgYW5kIGR5bmFtaWMgbGluayBsaWJyYXJpZXMKKworLklGICQoVVNFX1NOQVApCisjQ0ZMQUdTICAgICAJKz0gLUkkKFBSSVZBVEUpXGluY2x1ZGVcZHJ2bGliIC1JJChTQ0lURUNIKVxpbmNsdWRlXGRydmxpYiAtRF9fU05BUF9fCitDRkxBR1MgICAgIAkrPSAtRF9fU05BUF9fCitBU0ZMQUdTICAgCSs9IC1kX19TTkFQX18KKyNFWEVMSUJTCQkrPSBzbmFwJEwKKy5FTkRJRgorCisjIEluY2x1ZGUgcnVsZSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbXBpbGVyCisKKy5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9ydWxlcy8kKFJVTEVTX01BSykiCisKKyMgSW5jbHVkZSBmaWxlIGRlcGVuZGVuY2llcworCisuSU5DTFVERSAuSUdOT1JFOiAibWFrZWZpbGUuZGVwIgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2VteC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZW14Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Njk3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2VteC5tawpAQCAtMCwwICsxLDE5NCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIE9TLzIgdmVyc2lvbiBmb3IgRU1YL0dOVSBDL0MrKy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgorIyBvbiB0aGUgY29tbWFuZCBsaW5lLgorX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKKy5TSUxFTlQgICAgICAgICA6PSB5ZXMKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCisuSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgorLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBDUlRETEwgU0hXIEJFVEEgQ0hFQ0tFRCBOT19FWENFUFQgTk9fUlRUSQorLklNUE9SVCAuSUdOT1JFIDogRlVMTFNDUkVFTiBTSE9XX0FSR1MKKyAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCisKKyMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKKyAgIEwgICAgICAgICAgICA6PSAubGliICAgICAgICAgIyBMaWJyYXJpZXMKKyAgIEUgICAgICAgICAgICA6PSAuZXhlICAgICAgICAgIyBFeGVjdXRhYmxlcworICAgTyAgICAgICAgICAgIDo9IC5vYmogICAgICAgICAjIE9iamVjdHMKKyAgIEEgICAgICAgICAgICA6PSAuYXNtICAgICAgICAgIyBBc3NlbWJsZXIgc291cmNlcworICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcworICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAgICAgICAjIEMrKyBzb3VyY2VzCisKKyMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCisjIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgorIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCisgICBMUCAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKKyAgIExMICAgICAgICAgICA6PSAtbCAgICAgICAgICAgIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogRU1YX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkKKworIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50CisgICBfMzJCSVRfICAgICAgOj0gMQorCisjIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCisuUkVNT1ZFIDo7ICQoUk0pIC1mICQ8CisKKyMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCisuU0lMRU5UIDo9ICQoX18uU0lMRU5UKQorCisjIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcworLk5PVEFCUyAgICAgICAgIDo9IHllcworCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCisgICBDQyAgICAgICAgICAgOj0gZ2NjCisgICBDRkxBR1MgICAgICAgOj0gLVptdCAtWm9tZiAtV2FsbCAtSS4gLUkkKElOQ0xVREUpCisgICBDWFggICAgICAgICAgOj0gZ2NjIC14IGMrKyAtZm5vLWV4Y2VwdGlvbnMgLWZuby1ydHRpCisuSUYgJChVU0VfTkFTTSkKKyAgIEFTICAgICAgICAgICA6PSBuYXNtCisgICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZF9fTk9VX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCisuRUxTRQorICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvb2kgL0RfX0ZMQVRfXyAvRF9fTk9VX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisuRU5ESUYKKyAgIExEICAgICAgICAgICA6PSBnY2MKKyAgIExEWFggICAgICAgICA6PSBnY2MgLXggYysrCisgICBMREZMQUdTICAgICAgOj0gLUwuIC1ab21mIC1abXQKKyAgIExJQiAgICAgICAgICA6PSBlbXhvbWZhcgorICAgTElCRkxBR1MgICAgIDo9IC1wMzIgcmN2CisKKyAgIFlBQ0MgICAgICAgICA6PSBiaXNvbiAteQorICAgTEVYICAgICAgICAgIDo9IGZsZXgKKyAgIFNFRCAgICAgICAgICA6PSBzZWQKKworIyBPcHRpb25hbGx5IHR1cm4gb2ZmIGV4Y2VwdGlvbnMgYW5kIFJUVEkgZm9yIEMrKyBjb2RlCisuSUYgJChOT19FWENFUFQpCisgICBDWFggICAgICAgICAgKz0gLWZuby1leGNlcHRpb25zCisuRU5ESUYKKy5JRiAkKE5PX1JUVEkpCisgICBDWFggICAgICAgICAgKz0gLWZuby1ydHRpCisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCisuSUYgJChEQkcpCisgICBDRkxBR1MgICAgICAgKz0gLWcKKy5FTFNFCisjIFdpdGhvdXQgLXMsIGVteCBhbHdheXMgcnVucyBMSU5LMzg2IHdpdGggdGhlIC9ERUJVRyBvcHRpb24KKyAgIENGTEFHUyAgICAgICArPSAtcworICAgTERGTEFHUyAgICAgICs9IC1zCisjIE5BU00gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24geWV0CisgICBBU0ZMQUdTICAgICAgKz0KKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFRfTUFYKQorICAgQ0ZMQUdTICAgICAgICs9IC1PNgorLkVMSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyCisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC1PcworLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORElGCisKKyMgRGlzYWJsZSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyeQorLklGICQoTk9fUlVOVElNRSkKK0NGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKKy5FTkRJRgorCisjIExpbmsgYWdhaW5zdCBFTVggRExMcyAoQ1JURExMPTEpIG9yIGxpbmsgd2l0aCBzdGF0aWMgQyBydW50aW1lIGxpYnJhcmllcworLklGICQoQ1JURExMKQorICBMREZMQUdTICAgICAgICs9IC1aY3J0ZGxsCisuRUxTRQorICBDRkxBR1MJCSs9IC1ac3lzCisgIExERkxBR1MgICAgICAgKz0gLVpzeXMKKy5FTkRJRgorCisjIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKKyAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyXzMyX18KKyAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyX18KKyAgIEFTRkxBR1MgICAgICArPSAtZF9fT1MyX18KKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCitDRkxBR1MgICAgICAgICAgKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcT1MyMzJcJChFTVhfTElCQkFTRSkKKyAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCisKKyMgQnVpbGQgMzItYml0IE9TLzIgYXBwcworLklGICQoQlVJTERfRExMKQorICAgQ0ZMQUdTICAgICAgICs9IC1aZGxsIC1EQlVJTERfRExMCisgICBMREZMQUdTICAgICAgKz0gLVpkbGwKKyAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAorLkVMU0UKKy5JRiAkKFVTRV9PUzJHVUkpCisgICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCisgICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpQTQorLkVMU0UKKy5JRiAkKEZVTExTQ1JFRU4pCisgICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpOT1ZJTworLkVMU0UKKyAgIExERkxBR1MgICAgICArPSAtWmxpbmtlciAvUE1UWVBFOlZJTworLkVORElGCisuRU5ESUYKKy5FTkRJRgorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLICAgIDo9IGVteC5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfYmVvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2MmZkZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKQEAgLTAsMCArMSwxNjEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBCZU9TIHZlcnNpb24gZm9yIEdOVSBDL0MrKy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgorIyBvbiB0aGUgY29tbWFuZCBsaW5lLgorX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKKy5TSUxFTlQgICAgICAgICA6PSB5ZXMKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCisuSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgorLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9YMTEgVVNFX0xJTlVYCisuSU1QT1JUIC5JR05PUkUgOiBVU0VfRUdDUyBVU0VfUEdDQyBTVEFUSUNfTElCUyBMSUJDCisgICBUTVBESVIgICAgICAgOj0gJChURU1QKQorCisjIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCisjCisjIE5PVEU6IEJlT1MgZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91CisjICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKKyMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCisjICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAorIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQorIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgorICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCisgICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcworICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cworICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcworICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCisgICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCisKKyMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCisjIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgorIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCisgICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQorICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKyAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorCisjIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKKyAgIFNIRUxMRkxBR1MgICA6PSAtYworCisjIERlZmluaXRpb24gb2YgJChNQUtFKSBtYWNybyBmb3IgcmVjdXJzaXZlIG1ha2VzLgorICAgTUFLRSA9ICQoTUFLRUNNRCkgJChNRkxBR1MpCisKKyMgTWFjcm8gdG8gaW5zdGFsbCBhIGxpYnJhcnkgZmlsZQorICAgSU5TVEFMTCAgICAgIDo9IGNwCisKKyMgRE1BS0UgdXNlcyB0aGlzIHJlY2lwZSB0byByZW1vdmUgaW50ZXJtZWRpYXRlIHRhcmdldHMKKy5SRU1PVkUgOjsgJChSTSkgLWYgJDwKKworIyBUdXJuIHdhcm5pbmdzIGJhY2sgdG8gcHJldmlvdXMgc2V0dGluZy4KKy5TSUxFTlQgOj0gJChfXy5TSUxFTlQpCisKKyMgV2UgZG9udCB1c2UgVEFCUyBpbiBvdXIgbWFrZWZpbGVzCisuTk9UQUJTICAgICAgICAgOj0geWVzCisKKyMgRGVmaW5lIHRoYXQgd2UgYXJlIGNvbXBpbGluZyBmb3IgQmVPUworICAgVVNFX0JFT1MgICAgIDo9IDEKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgorICAgQ0MgICAgICAgICAgIDo9IGdjYworICAgQ0ZMQUdTICAgICAgIDo9IC1XYWxsIC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQorICAgQ1hYICAgICAgICAgIDo9IGcrKworICAgQVMgICAgICAgICAgIDo9IG5hc20KKyAgIEFTRkxBR1MgICAgICA6PSAtZiBlbGYgLWRfX0ZMQVRfXyAtaWluY2x1ZGUgLWkkKFNDSVRFQ0gpL2luY2x1ZGUgLWRfX05PVV9fCisgICBMRCAgICAgICAgICAgOj0gZ2NjCisgICBMREZMQUdTICAgICAgOj0gLUwuCisgICBMSUIgICAgICAgICAgOj0gYXIKKyAgIExJQkZMQUdTICAgICA6PSByY3MKKworIyBMaW5rIHRvIHN0YXRpYyBsaWJyYXJpZXMgaWYgcmVxdWVzdGVkCisuSUYgJChTVEFUSUNfTElCUykKKyAgIExERkxBR1MgICAgICArPSAtc3RhdGljCisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCisuSUYgJChEQkcpCisgICBDRkxBR1MgICAgICAgKz0gLWcKKy5FTFNFCisjIE5BU00gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24geWV0CisgICBBU0ZMQUdTICAgICAgKz0KKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFRfTUFYKQorICAgQ0ZMQUdTICAgICAgICs9IC1PNgorLkVMSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gLU8yCisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMQorLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORElGCisKKyMgRGlzYWJsZSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyeQorCisuSUYgJChOT19SVU5USU1FKQorQ0ZMQUdTCQkJKz0gLWZuby1idWlsdGluIC1ub3N0ZGluYworLkVORElGCisKKyMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncworICAgQ0ZMQUdTICAgICAgICs9IC1EX19CRU9TX18KKyAgIEFTRkxBR1MgICAgICArPSAtZF9fQkVPU19fIC1kX19VTklYX18KKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCitDRkxBR1MJCSs9IC1EQ0hFQ0tFRD0xCisuRUxTRQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCitMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpL2Jlb3MvZ2NjCitMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLCTo9IGdjY19iZW9zLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19kb3MubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19kb3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1ODljOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Rvcy5tawpAQCAtMCwwICsxLDExMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIERKR1BQIFYyIHBvcnQgb2YgR05VIEMvQysrIHRvIERPUyB3aXRoIERQTUkgb25seS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucworICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcworICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKKworIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KKyAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKKyAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IERKX0xJQkJBU0UKKworIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50CisgICBfMzJCSVRfICAgICAgOj0gMQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSBnY2MgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCisgICBDRkxBR1MgICAgICAgOj0gLVdhbGwKKyAgIEFTCQkJOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGNvZmYgLUYgbnVsbCAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWRTVERDQUxMX1VTQ09SRSAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKKyAgIExEICAgICAgICAgICA6PSBkal9sZCAgICAjIExvYWRlciBhbmQgZmxhZ3MKKyAgIExERkxBR1MgICAgICA6PQorICAgTElCICAgICAgICAgIDo9IGFyICAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gcnMKKyAgIFVTRV9OQVNNCQk6PSAxCisgICBVU0VfR0NDCQk6PSAxCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC1nICAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMgorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtTzEKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucworCisuSUYgJChGUFUpCisgICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKKyAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NworLkVORAorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAorLklGICQoQkVUQSkKKyAgIENGTEFHUyAgICAgICArPSAtREJFVEEKKyAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKKy5FTkQKKworIyBET1MgZXh0ZW5kZXIgZGVwZW5kYW50IGZsYWdzCisgICBEWF9DRkxBR1MgICAgKz0KKyAgIERYX0FTRkxBR1MgICArPSAtZERKR1BQCisgICBVU0VfUkVBTERPUwk6PSAxCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcRE9TMzJcJChESl9MSUJCQVNFKQorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLCTo9IGRqMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19mcmVlYnNkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjRiODUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19mcmVlYnNkLm1rCkBAIC0wLDAgKzEsMTc0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgTGludXggdmVyc2lvbiBmb3IgR05VIEMvQysrLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUuCitfXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQorLlNJTEVOVCAgICAgICAgIDo9IHllcworCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKKy5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgSU5DTFVERSBMSUIgU0NJVEVDSCBQUklWQVRFIFNDSVRFQ0hfTElCCisuSU1QT1JUIC5JR05PUkUgOiBEQkcgT1BUIE9QVF9TSVpFIFNIVyBCRVRBIENIRUNLRUQgVVNFX1gxMSBVU0VfRlJFRUJTRAorLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BHQ0MgU1RBVElDX0xJQlMKKyAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCisKKyMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKKyMKKyMgTk9URTogTGludXggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91CisjICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKKyMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCisjICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAorIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQorIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgorICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCisgICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcworICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cworICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcworICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCisgICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCisKKyMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCisjIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgorIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCisgICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQorICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKyAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorCisjIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKKyAgIFNIRUxMCQk6PSAvYmluL3NoCisgICBTSEVMTEZMQUdTICAgOj0gLWMKKworIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KKyAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQorCisjIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKKyAgIElOU1RBTEwgICAgICA6PSBjcAorCisjIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCisuUkVNT1ZFIDo7ICQoUk0pIC1mICQ8CisKKyMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCisuU0lMRU5UIDo9ICQoX18uU0lMRU5UKQorCisjIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcworLk5PVEFCUyAgICAgICAgIDo9IHllcworCisjIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIEZyZWVCU0QKKyAgIFVTRV9MSU5VWCAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KKy5JRiAkKFVTRV9FR0NTKQorICAgQ0MgICAgICAgICAgIDo9IGVnY3MKKy5FTElGICQoVVNFX1BHQ0MpCisgICBDQwkJOj0gcGdjYworLkVMU0UKKyAgIENDICAgICAgICAgICA6PSBnY2MKKy5FTkRJRgorICAgQ0ZMQUdTICAgICAgIDo9IC1XYWxsIC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQorICAgQ1hYICAgICAgICAgIDo9IGcrKworICAgQVMgICAgICAgICAgIDo9IG5hc20KKyMgVE9ETzogT24gZWFybGllciB2ZXJzaW9ucyBvZiBGcmVlQlNEICg8My4wKSBhLm91dCBpcyB1c2VkIGluc3RlYWQgb2YgRUxGCisgICBBU0ZMQUdTICAgICAgOj0gLWYgZWxmIC1kX19GTEFUX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXworICAgTEQgICAgICAgICAgIDo9IGcrKworICAgTERGTEFHUyAgICAgIDo9IC1MLgorICAgTElCICAgICAgICAgIDo9IGFyCisgICBMSUJGTEFHUyAgICAgOj0gcmNzCisKKyMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAorLklGICQoU1RBVElDX0xJQlMpCisgICBMREZMQUdTICAgICAgKz0gLXN0YXRpYworLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC1nCisuRUxTRQorIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAorICAgQVNGTEFHUyAgICAgICs9CisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUX01BWCkKKyAgIENGTEFHUyAgICAgICArPSAtTzYKKy5FTElGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMgorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtTzEKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisuSUYgJChGUFUpCisgICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKKyAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NworLkVORAorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAorLklGICQoQkVUQSkKKyAgIENGTEFHUyAgICAgICArPSAtREJFVEEKKyAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKKy5FTkRJRgorCisjIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKKworLklGICQoTk9fUlVOVElNRSkKK0NGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKKy5FTkRJRgorCisjIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKKy5JRiAkKFVTRV9YMTEpCisgICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCisuRU5ESUYKKworIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCisgICBDRkxBR1MgICAgICAgKz0gLURfX0ZSRUVCU0RfXworICAgQVNGTEFHUyAgICAgICs9IC1kX19GUkVFQlNEX18gLWRfX1VOSVhfXworCisjIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKKworLklGICQoQ0hFQ0tFRCkKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKK0NGTEFHUwkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUikvZnJlZWJzZC9nY2MKKyAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCitQTUxJQiAgICAgICAgICAgOj0gLWxwbQorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gZ2NjX2ZyZWVic2QubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfbGludXgubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxZWQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rCkBAIC0wLDAgKzEsMTgxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgTGludXggdmVyc2lvbiBmb3IgR05VIEMvQysrLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCisuSU1QT1JUOiBTQ0lURUNICisuSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvc3RhcnR1cC5tayIKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCisuSU1QT1JUIC5JR05PUkUgOiBHQ0MyX0xJQkJBU0UKKworIyBPdmVycmlkZSBzb21lIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCisgICBMICAgICAgICAgICAgOj0gLmEgICAgICMgTGlicmFyaWVzCisgICBPICAgICAgICAgICAgOj0gLm8gICAgICMgT2JqZWN0cworCisjIE92ZXJyaWRlIHRoZSBmaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMgZm9yIGxpYnJhcnkgbmFtaW5nLgorICAgTFAgICAgICAgICAgIDo9IGxpYgkJIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQorICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKyAgIExFICAgICAgICAgICA6PQkJCSMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisKKyMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAorICAgXzMyQklUXyAgICAgIDo9IDEKKworIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBMaW51eAorICAgVVNFX0xJTlVYICAgIDo9IDEKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgorICAgQ0MgICAgICAgICAgIDo9IGdjYworICAgQ0ZMQUdTICAgICAgIDo9IC1XYWxsIC1JLiAtSWluY2x1ZGUgLUkkKFNDSVRFQ0g6cyxcLC8pL2luY2x1ZGUgLUkkKFBSSVZBVEU6cyxcLC8pL2luY2x1ZGUKKyAgIFNIT1dfQ0ZMQUdTCTo9IC1jCisgICBDWFggICAgICAgICAgOj0gZysrCisgICBBUyAgICAgICAgICAgOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGVsZiAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXworICAgU0hPV19BU0ZMQUdTCTo9IC1mIGVsZgorICAgTEQgICAgICAgICAgIDo9IGdjYworICAgTERYWAkJCTo9IGcrKworICAgTERGTEFHUyAgICAgIDo9IC1MLgorICAgTElCICAgICAgICAgIDo9IGFyCisgICBMSUJGTEFHUyAgICAgOj0gcmNzCisgICBZQUNDCQkJOj0gYmlzb24gLXkKKyAgIExFWAkJCTo9IGZsZXgKKyAgIFNFRAkJCTo9IHNlZAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtZworICAgU0hPV19DRkxBR1MgICs9IC1nCisuRUxTRQorIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAorICAgQVNGTEFHUyAgICAgICs9CisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUX01BWCkKKyAgIENGTEFHUyAgICAgICArPSAtTzYKKyAgIFNIT1dfQ0ZMQUdTICArPSAtTzYKKy5FTElGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMgorICAgU0hPV19DRkxBR1MgICs9IC1PMgorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtTzEKKyAgIFNIT1dfQ0ZMQUdTICArPSAtTzEKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisuSUYgJChGUFUpCisgICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKKyAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NworLkVORAorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAorLklGICQoQkVUQSkKKyAgIENGTEFHUyAgICAgICArPSAtREJFVEEKKyAgIFNIT1dfQ0ZMQUdTICArPSAtREJFVEEKKyAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKKyAgIFNIT1dfQVNGTEFHUyArPSAtZEJFVEEKKy5FTkRJRgorCisjIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKKworLklGICQoTk9fUlVOVElNRSkKK0NGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKKy5FTkRJRgorCisjIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKKy5JRiAkKFVTRV9YMTEpCisgICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCisuRU5ESUYKKworIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCisgICBDRkxBR1MgICAgICAgKz0gLURfX0xJTlVYX18KKyAgIEFTRkxBR1MgICAgICArPSAtZF9fTElOVVhfXyAtZF9fVU5JWF9fCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZworQ0ZMQUdTCQkgICAgKz0gLURDSEVDS0VEPTEKK1NIT1dfQ0ZMQUdTCSAgICArPSAtRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvcmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworLklGICQoTElCQykKKyAgIExJQl9ERVNUX1NIQVJFRCAgOj0gJChMSUJfQkFTRV9ESVIpL2xpbnV4L2djYy9saWJjLnNvCisgICBMSUJfREVTVF9TVEFUSUMgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvbGliYworLkVMU0UKKyAgIExJQl9ERVNUX1NIQVJFRCAgOj0gJChMSUJfQkFTRV9ESVIpL2xpbnV4L2djYy9nbGliYy5zbworICAgTElCX0RFU1RfU1RBVElDICA6PSAkKExJQl9CQVNFX0RJUikvbGludXgvZ2NjL2dsaWJjCisuRU5ESUYKKworIyBMaW5rIHRvIHN0YXRpYyBsaWJyYXJpZXMgaWYgcmVxdWVzdGVkCisuSUYgJChTVEFUSUNfTElCU19BTEwpCisgICBMREZMQUdTICAgICAgKz0gLXN0YXRpYworICAgU1RBVElDX0xJQlMgIDo9IDEKKy5FTkRJRgorCisjIExpbmsgdG8gc3RhdGljIGxpYnJhcmllcyBpZiByZXF1ZXN0ZWQKKy5JRiAkKFNUQVRJQ19MSUJTKQorICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVF9TVEFUSUMpCisuRUxTRQorICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVF9TSEFSRUQpIC1MJChMSUJfREVTVF9TVEFUSUMpCisuRU5ESUYKKworIyBPcHRpb25hbGx5IGVuYWJsZSBzb21lICBkeW5hbWljIGxpYnJhcmllcyB0byBiZSBidWlsdAorLklGICQoQlVJTERfRExMKQorLklGICQoVkVSU0lPTk1BSikKKy5FTFNFCisgICBWRVJTSU9OTUFKCTo9IDUKKyAgIFZFUlNJT05NSU4JOj0gMAorLkVORElGCisgICBWRVJTSU9OICAgICAgOj0gJChWRVJTSU9OTUFKKS4kKFZFUlNJT05NSU4pCisgICBMSUIJCSAgICA6PSBnY2MgLXNoYXJlZAorICAgTElCRkxBR1MJICAgIDo9CisgICBMCQkgICAgOj0gLnNvCisgICBDRkxBR1MJICAgICs9IC1mUElDCisgICBTSE9XX0NGTEFHUwkrPSAtZlBJQworICAgQVNGTEFHUyAgICAgICs9IC1EX19QSUNfXworICAgU0hPV19BU0ZMQUdTICs9IC1EX19QSUNfXworICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0RFU1RfU0hBUkVEKQorLkVMU0UKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9ERVNUX1NUQVRJQykKKy5FTkRJRgorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLCTo9IGdjY19saW51eC5taworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY193aW4zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX3dpbjMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDlkODgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY193aW4zMi5tawpAQCAtMCwwICsxLDEzNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIEN5Z3dpbiBwb3J0IG9mIEdOVSBDL0MrKyB0byBXaW4zMi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogR0NDMl9MSUJCQVNFCisKKyMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucworICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcworICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKKworIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KKyAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKKyAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorCisjIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKKyAgIF8zMkJJVF8gICAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKKyAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlIC1JJChTQ0lURUNIOnMsXCwvKS9pbmNsdWRlIC1JJChQUklWQVRFOnMsXCwvKS9pbmNsdWRlCisgICBTSE9XX0NGTEFHUwk6PSAtYworICAgQ1hYICAgICAgICAgIDo9IGcrKworICAgQVMJCQk6PSBuYXNtCisgICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgY29mZiAtRiBudWxsIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfVVNDT1JFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQorICAgU0hPV19BU0ZMQUdTCTo9IC1mIGNvZmYKKyAgIExEICAgICAgICAgICA6PSBnY2MgICAgCSMgTG9hZGVyIGFuZCBmbGFncworICAgTERYWAkJCTo9IGcrKworLklGICQoV0lOMzJfR1VJKQorICAgTERGTEFHUyAgICAgIDo9IC1MLiAtbXdpbmRvd3MgLWUgX21haW5DUlRTdGFydHVwCisuRUxTRQorICAgTERGTEFHUyAgICAgIDo9IC1MLgorLkVORElGCisgICBSQyAgICAgICAgICAgOj0gd2luZHJlcworICAgUkNGTEFHUwkJOj0gLU8gY29mZgorICAgTElCICAgICAgICAgIDo9IGFyICAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gcmNzCisgICBZQUNDCQkJOj0gYmlzb24gLXkKKyAgIExFWAkJCTo9IGZsZXgKKyAgIFNFRAkJCTo9IHNlZAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtZworICAgU0hPV19DRkxBR1MgICs9IC1nCisuRUxTRQorIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAorICAgQVNGTEFHUyAgICAgICs9CisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUX01BWCkKKyAgIENGTEFHUyAgICAgICArPSAtTzYKKyAgIFNIT1dfQ0ZMQUdTICArPSAtTzYKKy5FTElGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1PMgorICAgU0hPV19DRkxBR1MgICs9IC1PMgorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtTzEKKyAgIFNIT1dfQ0ZMQUdTICArPSAtTzEKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgU0hPV19DRkxBR1MgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorICAgU0hPV19BU0ZMQUdTICs9IC1kQkVUQQorLkVORElGCisKKyMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncworICAgRFhfQ0ZMQUdTICAgICs9CisgICBEWF9BU0ZMQUdTICAgKz0gLWRHQ0NfV0lOMzIKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQorU0hPV19DRkxBR1MJICAgICs9IC1EQ0hFQ0tFRD0xCisuRUxTRQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpXFdJTjMyXCQoR0NDMl9MSUJCQVNFKQorICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKKworIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCisKK1BNTElCICAgICAgICAgICA6PSAtbHBtCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSBnY2Nfd2luMzIubWsKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9oYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9oYzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjA2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2hjMzIubWsKQEAgLTAsMCArMSwxMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBNZXRhd2FyZSBIaWdoIEMvQysrIDMuMjEgMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFBoYXIgTGFwJ3MKKyMgICAgICAgICAgICAgICBUTlQgRE9TIEV4dGVuZGVyLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCisuSU1QT1JUOiBTQ0lURUNICisuSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKKworIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50CisgICBfMzJCSVRfICAgICAgOj0gMQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSBoYzM4NiAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCisgICBDRkxBR1MgICAgICAgOj0KKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTFNFCisgICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKyAgIExEICAgICAgICAgICA6PSBoYzM4NgorICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQorICAgTElCICAgICAgICAgIDo9IDM4NmxpYiAgICMgVE5UIDM4NnxsaWIgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gLVRDCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC1nICAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKKyAgIEFTRkxBR1MgICAgICArPSAvemkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBhc3NlbWJsZXIKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgKz0gL3EgICAgICAgIyBTdXBwcmVzcyBvYmplY3QgcmVjb3JkcyBub3QgbmVlZGVkIGZvciBsaW5raW5nCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKKy5JRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAtNTg2IC1PCisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC01ODYgLU8xCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC1PMAorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQorLkVORAorCisjIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKKyAgIFVTRV9UTlQgICAgICA6PSAxCisgICBVU0VfUkVBTERPUwk6PSAxCisgICBEWF9DRkxBR1MgICAgKz0gLURUTlQKKyAgIERYX0FTRkxBR1MgICArPSAtRFROVAorICAgTERGTEFHUyAgICAgICs9IC1MSDpcVE5UXExJQgorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVxET1MzMlxIQworICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSBoYzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL21ha2VkZWZzLnByaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvbWFrZWRlZnMucHJqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDg4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL21ha2VkZWZzLnByagpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkZmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54NC5tawpAQCAtMCwwICsxLDE2NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIFFOWCB2ZXJzaW9uIGZvciBXYXRjb20gQy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgorIyBvbiB0aGUgY29tbWFuZCBsaW5lLgorX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKKy5TSUxFTlQgICAgICAgICA6PSB5ZXMKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCisuSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgorLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9RTlggVVNFX1FOWDQKKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9QSE9UT04gVVNFX1gxMSBVU0VfQklPUyBTSE9XX0FSR1MgTUFYX1dBUk4gV0NfTElCQkFTRQorICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKKworIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucworIworIyBOT1RFOiBRbnggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQorIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCisjICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQorIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKKyMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKKyMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KKyAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcworICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcworICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cworICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcworICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCisgICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCisKKyMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCisjIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgorIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCisgICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQorICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKyAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorCisjIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKKyAgIFNIRUxMCQk6PSAvYmluL3NoCisgICBTSEVMTEZMQUdTICAgOj0gLWMKKworIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KKyAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQorCisjIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKKyAgIElOU1RBTEwgICAgICA6PSBjcAorCisjIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCisuUkVNT1ZFIDo7ICQoUk0pIC1mICQ8CisKKyMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCisuU0lMRU5UIDo9ICQoX18uU0lMRU5UKQorCisjIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcworLk5PVEFCUyAgICAgICAgIDo9IHllcworCisjIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIFFOWAorICAgVVNFX1FOWCAgICAJOj0gMQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCisgICBDQyAgICAgICAgICAgOj0gd2NjMzg2CisgICBDRkxBR1MgICAgICAgOj0gLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCisgICBDWFggICAgICAgICAgOj0gd3BwMzg2CisgICBBUyAgICAgICAgICAgOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlCisgICBMRCAgICAgICAgICAgOj0gY2MKKyAgIExERkxBR1MgICAgICA6PSAtTC4KKyAgIExJQiAgICAgICAgICA6PSBhcgorICAgTElCRkxBR1MgICAgIDo9IHJjCisKKyMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCisuSUYgJChNQVhfV0FSTikKKyAgIENGTEFHUyAgICAgICArPSAtdzQKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLXcxCisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCisuSUYgJChEQkcpCisgICBDRkxBR1MgICAgICAgKz0gLWQyCisgICBMREZMQUdTICAgICAgKz0gLWcyCisuRUxTRQorIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAorICAgQVNGTEFHUyAgICAgICs9CisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKKy5FTElGICQoT1BUX1NJWkUpCisgICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1CisuRUxJRiAkKE5PT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgorLkVORAorCisjIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBwaG90b24gb3Igbm9uLXBob3RvbiBsaWIKKy5JRiAkKFVTRV9QSE9UT04pCisgICBDRkxBR1MgICAgICAgKz0gLURfX1BIT1RPTl9fCisuRU5ESUYKKworIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCisuSUYgJChVU0VfWDExKQorICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXworLkVORElGCisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORElGCisKKyMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncworICAgQ0ZMQUdTICAgICAgICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCisgICBBU0ZMQUdTICAgICAgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCisgIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKKyAgQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKKyAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpL3FueDQvJChXQ19MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisgICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLCTo9IHFueDQubWsKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueG50by5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY4ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsKQEAgLTAsMCArMSwxNTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBRTlggTmV1dHJpbm8gdmVyc2lvbiBmb3IgR05VIEMvQysrCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KKyMgb24gdGhlIGNvbW1hbmQgbGluZS4KK19fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCisuU0lMRU5UICAgICAgICAgOj0geWVzCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycworLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKKy5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgQ0hFQ0tFRCBVU0VfUU5YIFVTRV9RTlhOVE8KKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9FR0NTIFVTRV9QSE9UT04gVVNFX1gxMSBVU0VfQklPUworICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKKworIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucworIworIyBOT1RFOiBRbnggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQorIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCisjICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQorIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKKyMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKKyMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KKyAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcworICAgRSAgICAgICAgICAgIDo9IC54ICAgCSMgRXhlY3V0YWJsZXMKKyAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKKyAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKKyAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcworICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcworCisjIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQorIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KKyMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgorICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKKyAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKworIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCisgICBTSEVMTAkJOj0gL2Jpbi9zaAorICAgU0hFTExGTEFHUyAgIDo9IC1jCisKKyMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCisgICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKKworIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCisgICBJTlNUQUxMICAgICAgOj0gY3AKKworIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cworLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAorCisjIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgorLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKKworIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKKy5OT1RBQlMgICAgICAgICA6PSB5ZXMKKworIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBRTlgKKyAgIFVTRV9RTlggICAgCTo9IDEKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgorICAgQ0MgICAgICAgICAgIDo9IHFjYworICAgQ0ZMQUdTICAgICAgIDo9IC1WZ2NjX250b3g4NiAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKKyAgIENQUEZMQUdTICAgICA6PSAtVmdjY19udG94ODYgLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCisgICBDWFggICAgICAgICAgOj0gUUNDCisgICBBUyAgICAgICAgICAgOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGVsZiAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWRTVERDQUxMX01BTkdMRSAtaWluY2x1ZGUgLWkkKFNDSVRFQ0gpL2luY2x1ZGUgLWRfX05PVV9fCisgICBMRCAgICAgICAgICAgOj0gcWNjCisgICBMREZMQUdTICAgICAgOj0gLVZnY2NfbnRveDg2IC1MLiAtbG0KKyAgIExJQiAgICAgICAgICA6PSBhcgorICAgTElCRkxBR1MgICAgIDo9IHJjCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC1nMgorICAgTERGTEFHUyAgICAgICs9IC1nMgorLkVMU0UKKyMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKKyAgIEFTRkxBR1MgICAgICArPQorLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKKy5JRiAkKE9QVF9NQVgpCisgICBDRkxBR1MgICAgICAgKz0gLU90CisuRUxJRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAtTworLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAtT3MKKy5FTkRJRgorCisjIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBwaG90b24gb3Igbm9uLXBob3RvbiBsaWIKKy5JRiAkKFVTRV9QSE9UT04pCisgICBDRkxBR1MgICAgICAgKz0gLURfX1BIT1RPTl9fCisuRU5ESUYKKworIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCisuSUYgJChVU0VfWDExKQorICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXworLkVORElGCisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORElGCisKKyMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncworICAgQ0ZMQUdTICAgICAgICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCisgICBBU0ZMQUdTICAgICAgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCisgIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKKyAgQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKKyAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfREVTVAk6PSAkKExJQl9CQVNFX0RJUikvcW54bnRvCisgICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQorCisjIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKKworUE1MSUIgICAgICAgICAgIDo9IC1scG0KKworIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKKworICAgUlVMRVNfTUFLCTo9IHFueG50by5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWU5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMTYubWsKQEAgLTAsMCArMSw2OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIwkJCQlkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKyUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKKyUkTzogJSRQIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorJSREOiAgICAgIDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2QgYzBkbC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxJRiAkKElNUE9SVF9ETEwpCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMU0UKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoTElCUikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfV0lOMTYpCislJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2UgJChXSU5fVkVSU0lPTikgYzB3bC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQorLkVMU0UKKyUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRkZSBjMGwub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoUE1MSUIpICQoREVGX0xJQlMpICQoRVhFTElCUykpCisuRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkMDcxYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rCkBAIC0wLDAgKzEsNDMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCislJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgLWMgJDwKKyUkTzogJSRQIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1MpKSAtYyAkPAorJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1MpKSAkKDw6cywvLFwpCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorJSRMOiA7CisgICAgQCQoUk0pICRACisgICAgJChMSUJSKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCislJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UZGUgYzBsLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTKSAkKEVYRUxJQlMpKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2UyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMzIubWsKQEAgLTAsMCArMSwxNTEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAorCisuSUYgJChOT19QTUxJQikKK1BNTElCIDo9CisuRU5ESUYKKworLklGICQoVVNFX1ZYRCkKKworIyBJbXBsaWNpdCBydWxlIGdlbmVyYXRpb24gdG8gYnVpbGQgVnhEJ3MKKworJSRPOiAlLmMgOworCSQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKKwlAJChWVE9PTFNEKVxiaW5cc2VnYWxpYXMuZXhlIC1wICQoVlRPT0xTRClcaW5jbHVkZVxkZWZhdWx0LnNlZyAkQAorCislJE86ICUkUCA7CisJJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQorCUAkKFZUT09MU0QpXGJpblxzZWdhbGlhcy5leGUgLXAgJChWVE9PTFNEKVxpbmNsdWRlXGRlZmF1bHQuc2VnICRACisKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKworJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCisKKyUuZGxsOiA7CisJQCQoQ1ApICQobWt0bXAgRVhQT1JUU1xuX1RoZV9EREIgQDEpICQqLmRlZgorCXRsaW5rMzIuZXhlIEAkKG1rdG1wICQoTERGTEFHUykgLVRwZCAkKFZUT09MU0Q6cy9cL1xcKVxsaWJcaWNydGJjNC5vYmorXG4kKCY6cy9cL1xcKVxuJCouZGxsXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTOnMvXC9cXClcbiQqLmRlZikKKwlAJChSTSkgLVMgJChta3RtcCAkKi5kZWYpCisKKyUudnhkOiAlLmRsbCA7CisJQCQoQ1ApICQobWt0bXAgRFlOQU1JQ1xuQVRUUklCIElDT0RFIElOSVRcbkFUVFJJQiBMQ09ERSBMT0NLRURcbkFUVFJJQiBQQ09ERSBQQUdFQUJMRVxuQVRUUklCIFNDT0RFIFNUQVRJQ1xuQVRUUklCIERCT0NPREUgREVCVUdcbk1FUkdFIElDT0RFIElOSVREQVQwIElOSVREQVRBKSAkKi5wZWwKKwlAJChWVE9PTFNEKVxiaW5cdnhkdmVyLmV4ZSAkKi52cmMgJCoucmVzCisJQCQoVlRPT0xTRClcYmluXHBlbGUuZXhlIC1kIC1zICQqLnNtZiAtYyAkKi5wZWwgLW8gJEAgLWsgNDAwICQqLmRsbAorCUAkKFZUT09MU0QpXGJpblxzZXRoZHIuZXhlIC1uICQqIC14ICRAIC1yICQqLnJlcworLklGICQoREJHKQorCSQoTk1TWU0pIC9UUkFOUzpzb3VyY2UscGFja2FnZSAvU09VUkNFOiQoVlhEU09VUkNFKSAkKi5zbWYKKy5FTkRJRgorCUAkKFJNKSAtUyAkKG1rdG1wICQqLnBlbCkKKworLkVMU0UKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzLCBsaWJyYXJpZXMgYW5kIGV4ZSdzCisKKyUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQorJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCisuSUYgJChVU0VfTkFTTSkKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTFNFCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorLklGICQoSU1QT1JUX0RMTCkKKy5FTFNFCisuSUYgJChOT19SVU5USU1FKQorJSREOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBkIC1hYSAkKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKVxuJCouZGVmKQorLkVMU0UKKyUkRDogOworCW1ha2VkZWYgJChAOmIpCisJJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGQgLWFhIGMwZDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKKy5JRiAkKERCRykKKy5JRiAkKFVTRV9TT0ZUSUNFKQorCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACisJdGRzdHJwMzIgJEAKKy5FTkRJRgorLkVORElGCisuRU5ESUYKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxJRiAkKElNUE9SVF9ETEwpCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMU0UKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKworLklGICQoVVNFX1dJTjMyKQorLklGICQoV0lOMzJfR1VJKQorJSRFOiA7CisJJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFhICQoV0lOX1ZFUlNJT04pIGMwdzMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKKy5JRiAkKERCRykKKy5JRiAkKFVTRV9TT0ZUSUNFKQorCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACisJdGRzdHJwMzIgJEAKKy5FTkRJRgorLkVORElGCisuRUxTRQorJSRFOiA7CisJJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKKy5JRiAkKFVTRV9TT0ZUSUNFKQorCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACisJdGRzdHJwMzIgJEAKKy5FTkRJRgorLkVORElGCisuRUxJRiAkKFVTRV9UTlQpCislJEU6IDsKKwlAJChDUCkgJChta3RtcCBzdHViICdnb3RudC5leGUnKSAkKi5kZWYKKwlAJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQorLklGICQoRE9TU1RZTEUpCisJQG1hcmtwaGFyICRACisuRU5ESUYKKwlAJChSTSkgLVMgJChta3RtcCAkKi5kZWYpCisuRUxJRiAkKFVTRV9TTVgzMikKKyUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlMpXG4kKi5kZWYpCisuRUxTRQorJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBlIC1hcCBjMHgzMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKKy5FTkQKKworLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2Jjb3MyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iY29zMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDczZmVjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iY29zMi5tawpAQCAtMCwwICsxLDcwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCislJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKKy5JRiAkKFVTRV9OQVNNKQorJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorLkVMU0UKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCislJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8CisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCislJEQ6IDsKKwltYWtlZGVmICQoQDpiKQorCSQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVG9kIC1hYSBjMDJkLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxJRiAkKElNUE9SVF9ETEwpCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMU0UKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKworLklGICQoVVNFX09TMkdVSSkKKyUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYWEgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQorLkVMU0UKKyUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYXAgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4OWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wxNi5tawpAQCAtMCwwICsxLDY3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAvbm9sb2dvICQoQ0ZMQUdTKSAvYyAkPAorJSRPOiAlJFAgOyAkKENDKSAvbm9sb2dvICQoQ0ZMQUdTKSAvYyAkPAorJSRPOiAlJEEgOyAkKEFTKSAkKEFTRkxBR1MpICQ8ICQqIE5VTCBOVUwKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorIyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1M6cy9cL1xcKSAtZSRAXG4kKCY6dCJcbiI6cy9cL1xcKVxuJChFWEVMSUJTKSkKKyMlJEQ6IDsgJChMRCkgJChMREZMQUdTKSAvRmUkQCAkJiAkKEVYRUxJQlMpCislJEQ6IDsgIGxpbmsgQGRlZmF1bHQucnNwCisKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChCVUlMRF9ETEwpCislJEw6ICAgICAgOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMSUYgJChJTVBPUlRfRExMKQorJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KKy5FTFNFCislJEw6IDsgJChMSUIpIC9ub2xvZ28gJChMSUJGTEFHUykgJEAgQCQobWt0bXAgLSskKD86dCIgJlxuLSsiKSAmXG4sLFxuKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKFVTRV9XSU4xNikKKyMlJEU6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQorJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKKy5FTFNFCislJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMzg2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBiMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5tawpAQCAtMCwwICsxLDY5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAtbm9sb2dvICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJFAgOyAkKENDKSAtbm9sb2dvICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJEEgOyAkKEFTKSAkKEFTRkxBR1MpICQ8ICQqIE5VTCBOVUwKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorIyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1M6cy9cL1xcKSAtZSRAXG4kKCY6dCJcbiI6cy9cL1xcKVxuJChFWEVMSUJTKSkKKyMlJEQ6IDsgJChMRCkgJChMREZMQUdTKSAvRmUkQCAkJiAkKEVYRUxJQlMpCislJEQ6IDsgIGxpbmszODYgQGRlZmF1bHQucnNwCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBkZXZpY2UgZHJpdmVyIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorJS5TWVM6IDsgIGxpbmszODYgQGRlZmF1bHQucnNwCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorLklGICQoQlVJTERfRExMKQorJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KKy5FTElGICQoSU1QT1JUX0RMTCkKKyUkTDogICAgICA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxTRQorJSRMOiA7ICQoTElCKSAvbm9sb2dvICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIikgJlxuLCxcbikKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfV0lOMTYpCisjJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKKyUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCisuRUxTRQorJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKKy5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTE3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2RqMzIubWsKQEAgLTAsMCArMSw0NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIwkJCQlkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKyUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSAtYykgJCg8OnMsLyxcKQorJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpIC1jKSAkKDw6cywvLFwpCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorJSRMOiAgICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpXG4pCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKyUkRTogICAgICA7ICQoTEQpICQoTERGTEFHUykgJEAgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSAkKFBNTElCKSAtbHN0ZGN4eCAtbG0pCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZW14Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDIyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5tawpAQCAtMCwwICsxLDkxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMgICAgICAgICAgICAgICBPUy8yIHZlcnNpb24gZm9yIEVNWC9HTlUgQy9DKysuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKyUkTzogJS5jIDsKKy5JRiAkKFNIT1dfQVJHUykKKwkkKENDKSAtYyAkKENGTEFHUykgJCg8OnMsXCwvKQorLkVMU0UKKwlAZWNobyAkKENDKSAtYyAkKDw6cyxcLC8pCisJQCQoQ0MpIC1jICQoQ0ZMQUdTKSAkKDw6cyxcLC8pCisuRU5ESUYKKworJSRPOiAlJFAgOworLklGICQoU0hPV19BUkdTKQorCSQoQ1hYKSAtYyAkKENGTEFHUykgJCg8OnMsXCwvKQorLkVMU0UKKwlAZWNobyAkKENYWCkgLWMgJCg8OnMsXCwvKQorCUAkKENYWCkgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKKy5FTkRJRgorCislJE86ICUkQSA7CisuSUYgJChVU0VfTkFTTSkKKy5JRiAkKFNIT1dfQVJHUykKKwkkKEFTKSAtbyAkQCAkKEFTRkxBR1MpICQoPDpzLFwsLykKKy5FTFNFCisJQGVjaG8gJChBUykgJCg8OnMsXCwvKQorCUAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1MpKSAkKDw6cyxcLC8pCisuRU5ESUYKKy5FTFNFCisuSUYgJChTSE9XX0FSR1MpCisKKyAgICAkKEFTKSAgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTFNFCisJQGVjaG8gJChBUykgJCg8OnMsLyxcKQorICAgICQoQVMpICBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorLkVORElGCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCislJEw6ICAgICA7CisuSUYgJChTSE9XX0FSR1MpCisJJChMSUIpICQoTElCRkxBR1MpICRAICQoJjpzLFwsLykKKy5FTFNFCisJQGVjaG8gJChMSUIpICRACisJQCQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAkKD86dCJcbiIpKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKyUkRTogICAgIDsKKy5JRiAkKFNIT1dfQVJHUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoJjpzLFwsLykgJChFWEVMSUJTKSAkKFBNTElCKSAtbGdwcCAtbHN0ZGNwcAorLkVMU0UKKwlAZWNobyAkKExEKSAkQAorCUAkKExEKSAkKExERkxBR1MpIC1vICRAICQoJjpzLFwsLykgJChFWEVMSUJTKSAkKFBNTElCKSAtbGdwcCAtbHN0ZGNwcAorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19iZW9zLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjU5MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5tawpAQCAtMCwwICsxLDQ4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKKyUkTzogJSRQIDsgJChDWFgpICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJEEgOyAkKEFTKSAkKEFTRkxBR1MpICQ8CisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKKyUkTDogICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAICQmCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCislJEU6ICAgICA7ICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfZnJlZWJzZC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2ZyZWVic2QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0ZDIzNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2ZyZWVic2QubWsKQEAgLTAsMCArMSw0NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIwkJCQlkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKKyUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8CislJE86ICUkUCA7ICQoQ1hYKSAkKENGTEFHUykgLWMgJDwKKyUkTzogJSRBIDsgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCislJEw6ICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQorJSRFOiAgICAgOyAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgLWxtCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2xpbnV4Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzE5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5tawpAQCAtMCwwICsxLDk0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKy5JRiAkKFVTRV9DWFhfTElOS0VSKQorTEQJOj0gJChMRFhYKQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcworJSRPOiAlLmMgOworLklGICQoU0hPV19BUkdTKQorICAgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAorLkVMU0UKKyAgICBAJChFQ0hPKSAkKENDKSAkKFNIT1dfQ0ZMQUdTKSAkPAorICAgIEAkKENDKSAtYyAkKENGTEFHUykgJDwKKy5FTkRJRgorCislJE86ICUkUCA7CisuSUYgJChTSE9XX0FSR1MpCisgICAgJChDWFgpIC1jICQoQ0ZMQUdTKSAkPAorLkVMU0UKKyAgICBAJChFQ0hPKSAkKENYWCkgJChTSE9XX0NGTEFHUykgJDwKKyAgICBAJChDWFgpIC1jICQoQ0ZMQUdTKSAkPAorLkVORElGCisKKyUkTzogJSRBIDsKKy5JRiAkKFNIT1dfQVJHUykKKyAgICAkKEFTKSAtbyAkQCAkKEFTRkxBR1MpICQ8CisuRUxTRQorICAgIEAkKEVDSE8pICQoQVMpICQoU0hPV19BU0ZMQUdTKSAkPAorICAgIEAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1MpKSAkPAorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogICAgIDsKKy5JRiAkKFNIT1dfQVJHUykKKyAgICAkKExJQikgJChMSUJGTEFHUykgLVdsLC1zb25hbWUsJEAuJChWRVJTSU9OTUFKKSAtbyAkQCAkJiAkKExJQlMpCisuRUxTRQorICAgIEAkKEVDSE8pICQoTElCKSAkQAorICAgIEAkKExJQikgJChMSUJGTEFHUykgLVdsLC1zb25hbWUsJEAuJChWRVJTSU9OTUFKKSAtbyAkQCAkJiAkKExJQlMpCisuRU5ESUYKKy5FTFNFCislJEw6ICAgICA7CisuSUYgJChTSE9XX0FSR1MpCisgICAgJChMSUIpICQoTElCRkxBR1MpICRAICQmCisuRUxTRQorICAgIEAkKEVDSE8pICQoTElCKSAkQAorICAgIEAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKKy5FTkRJRgorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCislJEU6ICAgICA7CisuSUYgJChTSE9XX0FSR1MpCisgICAgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQorLkVMU0UKKyAgICBAJChFQ0hPKSBsZCAkQAorICAgIEAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgLWxtCisuRU5ESUYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2Nfd2luMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY193aW4zMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIyNGIxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2Nfd2luMzIubWsKQEAgLTAsMCArMSw5MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIwkJCQlkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisuSUYgJChVU0VfQ1hYX0xJTktFUikKK0xECTo9ICQoTERYWCkKKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKKyUkTzogJS5jIDsKKy5JRiAkKFNIT1dfQVJHUykKKyAgICAkKENDKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKKy5FTFNFCisgICAgQCQoRUNITykgJChDQykgJChTSE9XX0NGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKKyAgICBAJChDQykgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCisuRU5ESUYKKworJSRPOiAlJFAgOworLklGICQoU0hPV19BUkdTKQorICAgICQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKKy5FTFNFCisgICAgQCQoRUNITykgJChDWFgpICQoU0hPV19DRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCisgICAgQCQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKKy5FTkRJRgorCislJE86ICUkQSA7CisuSUYgJChTSE9XX0FSR1MpCisgICAgJChBUykgLW8gJChBU0ZMQUdTOnMvXC9cXCkgJCg8OnMsLyxcKQorLkVMU0UKKyAgICBAJChFQ0hPKSAkKEFTKSAkKFNIT1dfQVNGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKKyAgICBAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCislJFI6ICUucmMgOyAkKFJDKSAkPCAkKFJDRkxBR1MpIC1vICRACisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwKKyMgVE9ETyEKKyMlJEQ6IDsgK3JjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKKyUkTDogICAgIDsKKy5JRiAkKFNIT1dfQVJHUykKKyAgICAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKKy5FTFNFCisgICAgQCQoRUNITykgJChMSUIpICRACisgICAgQCQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAkKCY6cy9cL1xcKVxuKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCislJEU6ICAgICA7CisuSUYgJChTSE9XX0FSR1MpCisgICAgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQorLkVMU0UKKyAgICBAJChFQ0hPKSBsZCAkQAorICAgIEAkKExEKSAkKExERkxBR1MpIC1vICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykgJChQTUxJQikgLWxtKQorLkVORElGCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvaGMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvaGMzMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFlOWFiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9oYzMyLm1rCkBAIC0wLDAgKzEsNTEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAorCisuSUYgJChOT19QTUxJQikKK1BNTElCIDo9CisuRU5ESUYKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCislJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJFAgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKKy5JRiAkKFVTRV9OQVNNKQorJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorLkVMU0UKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKyUkTDogICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCwkKi5yc3AgLVIgJD8pCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKyUkRTogICAgICA7ICQoTEQpICQoTERGTEFHUykgLW8gJEAgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAtbGRvc3gzMi5saWIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkYzAzNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54NC5tawpAQCAtMCwwICsxLDk0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgV2hldGhlciB0byBsaW5rIGluIHJlYWwgVkJJT1MgbGlicmFyeSwgb3IganVzdCB0aGUgc3R1YiBsaWJyYXJ5CisKKy5JRiAkKFVTRV9CSU9TKQorVkJJT1NMSUIgOj0gLWx2Ymlvcy5saWIKKy5FTFNFCitWQklPU0xJQiA6PSAtbHZic3R1YnMubGliCisuRU5ECisKKyMgUmVxdWlyZSBzcGVjaWFsIHByaXZsZWRnZXMgZm9yIE51Y2xldXMgcHJvZ3JhbXMgKHJlcXVpcmVzIHJvb3QgYWNjZXNzKQorCisuSUYgJChVU0VfTlVDTEVVUykKK0xERkxBR1MJCSs9IC1UMQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcworJSRPOiAlLmMgOworLklGICQoU0hPV19BUkdTKQorICAgICQoQ0MpICQoQ0ZMQUdTKSAkPAorLkVMU0UKKyAgICBAZWNobyAkKENDKSAtYyAkPAorCStAJChDQykgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCisuRU5ESUYKKworJSRPOiAlJFAgOworLklGICQoU0hPV19BUkdTKQorCSQoQ1hYKSAkKENGTEFHUykgJDwKKy5FTFNFCisJQGVjaG8gJChDWFgpIC1jICQ8CisJK0AkKENYWCkgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCisuRU5ESUYKKworJSRPOiAlJEEgOworLklGICQoU0hPV19BUkdTKQorICAgICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKKy5FTFNFCisgICAgQGVjaG8gJChBUykgJDwKKwlAJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKKyUkTDogICAgIDsKKy5JRiAkKFNIT1dfQVJHUykKKyAgICAkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYKKy5FTFNFCisgICAgQGVjaG8gJChMSUIpICRACisJK0AkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYgPiAvZGV2L251bGwKKy5FTkRJRgorCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCislJEU6ICAgICA7CisuSUYgJChTSE9XX0FSR1MpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpCisuRUxTRQorCUBlY2hvIHdsaW5rICRACisJK0AkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgJChWQklPU0xJQikgPiAvZGV2L251bGwKKy5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueG50by5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNhZDFmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsKQEAgLTAsMCArMSw1NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIwkJCQlkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIFdoZXRoZXIgdG8gbGluayBpbiByZWFsIFZCSU9TIGxpYnJhcnksIG9yIGp1c3QgdGhlIHN0dWIgbGlicmFyeQorCisuSUYgJChVU0VfQklPUykKK1ZCSU9TTElCIDo9IC1sdmJpb3MKKy5FTFNFCitWQklPU0xJQiA6PSAtbHZic3R1YnMKKy5FTkQKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCislJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJFAgOyAkKENYWCkgJChDUFBGTEFHUykgLWMgJDwKKyUkTzogJSRBIDsgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCislJEw6ICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQorJSRFOiAgICAgOyAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgJChWQklPU0xJQikKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MxNi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzNiY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzE2Lm1rCkBAIC0wLDAgKzEsNjMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAorCisuSUYgJChOT19QTUxJQikKK1BNTElCIDo9CisuRU5ESUYKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCislJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorJSRPOiAlJFAgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCislJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8CisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCislJEQ6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMSUYgJChJTVBPUlRfRExMKQorJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxTRQorJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorLklGICQoVVNFX1dJTjE2KQorJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKKy5FTFNFCislJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzMTkwNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MzMi5tawpAQCAtMCwwICsxLDY5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKKyUkTzogJSRQIDsgJChDQykgJChDRkxBR1MpIC1jICQ8CisuSUYgJChVU0VfTkFTTSkKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTFNFCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorJSREOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoRVhFTElCUykga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMSUYgJChJTVBPUlRfRExMKQorJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxTRQorJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorLklGICQoVVNFX1ROVCkKKyUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wLCQqLmxuayAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQorLkVMSUYgJChVU0VfV0lOMzIpCislJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCwkKi5sbmsgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2lubW0ubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIpCisuRUxTRQorJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCisuRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODgwMjhmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTMyLm1rCkBAIC0wLDAgKzEsODIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAgLWMgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgICQoPDpzLC8sXCkKKyUkTzogJSRQIDsgJChDUFApIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCisuSUYgJChVU0VfTkFTTSkKKyUkTzogJSRBIDsgJChBUykgIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRUxTRQorJSRPOiAlJEEgOyAkKEFTKSAgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCislJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8CisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgaGVscCBmaWxlcworJS5obHA6ICUuaXBmOyAkKElQRkMpICQoSVBGQ0ZMQUdTKSAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorLklGICQoVVNFX09TMkdVSSkKKyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCisuRUxTRQorJSREOiA7ICQoTEQpIC9ub2ZyZWUgL25vbCBAJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChCVUlMRF9ETEwpCislJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KKy5FTElGICQoSU1QT1JUX0RMTCkKKyUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMU0UKKyUkTDogOyAkKExJQikgJChMSUJGTEFHUykgQCQobWt0bXAgJEAtKyQoPzp0IiZcbi0rIjpzL1wvXFwpOykKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfT1MyR1VJKQorJSRFOiA7CisgICAgICAgIHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKKy5JRiAkKExYTElURSkKKyAgICAgICAgbHhsaXRlICRACisuRU5ESUYKKy5FTFNFCislJEU6IDsKKyAgICAgICAgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcblxuKQorLklGICQoTFhMSVRFKQorICAgICAgICBseGxpdGUgJEAKKy5FTkRJRgorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzY1Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzE0OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5tawpAQCAtMCwwICsxLDc5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRseSkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKyUkTzogJS5jIDsgJChDQykgLWMgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgICQoPDpzLC8sXCkKKyUkTzogJSRQIDsgJChDUFApIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCisuSUYgJChVU0VfTkFTTSkKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTFNFCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcworJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQorLklGICQoVVNFX09TMkdVSSkKKyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCisuRUxTRQorJSREOiA7ICQoTEQpIC9ub2ZyZWUgL25vbCBAJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChCVUlMRF9ETEwpCislJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgL291dDokQCAkPworLkVMSUYgJChJTVBPUlRfRExMKQorJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpIC9vdXQ6JEAgJD8KKy5FTFNFCislJEw6IDsgJChMSUIpICQoTElCRkxBR1MpIC9ub3dhcm46ODYgL291dDokQCBAJChta3RtcCAkKD86dCJcbiI6cy9cL1xcKSkKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfT1MyR1VJKQorJSRFOiA7CisgICAgICAgIHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKKy5JRiAkKExYTElURSkKKyAgICAgICAgbHhsaXRlICRACisuRU5ESUYKKy5FTFNFCislJEU6IDsKKyAgICAgICAgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcblxuKQorLklGICQoTFhMSVRFKQorICAgICAgICBseGxpdGUgJEAKKy5FTkRJRgorLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmYzI3MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMxNi5tawpAQCAtMCwwICsxLDcwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KKyMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKyMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCisjCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCisjCQkJCWRpZmZlcmVudGx5KS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKKworLklGICQoTk9fUE1MSUIpCitQTUxJQiA6PQorLkVORElGCisKKyMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcworJSRPOiAlLmMgOyAkKENDKSAvbm9sb2dvICQoQ0ZMQUdTKSAvYyAkPAorJSRPOiAlJFAgOyAkKENDKSAvbm9sb2dvICQoQ0ZMQUdTKSAvYyAkPAorJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1MpKSAkKDw6cywvLFwpCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKKyUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKKyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpIC1lJEBcbiQoJjp0IlxuIjpzL1wvXFwpXG4kKEVYRUxJQlMpKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKEJVSUxEX0RMTCkKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/CisuRUxJRiAkKElNUE9SVF9ETEwpCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPworLkVMU0UKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoTElCKSAkQCAvbm9sb2dvICQoTElCRkxBR1MpIEAkKG1rdG1wICskKCY6dCIgJlxuKyIpICZcbixcbikKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfV0lOMTYpCislJEU6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQorIyUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCisuRUxTRQorJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKKy5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMzIubWsKQEAgLTAsMCArMSwxMjIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUdXJuIG9uIHByZS1jb21waWxlZCBoZWFkZXJzIGFzIG5lY2Nlc3NhcnkKKy5JRiAkKFBSRUNPTVBfSERSKQorICAgQ0ZMQUdTICAgICAgICs9IC1ZWCIkKFBSRUNPTVBfSERSKSIKKy5FTkRJRgorCisjIFR1cm4gb24gcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFzIG5lY2Vzc2FyeQorLklGICQoVVNFX1JUVEkpCisJQ0ZMQUdTCQkrPSAvR1IKKy5FTkRJRgorCisjIFR1cm4gb24gQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBhcyBuZWNlc3NhcnkKKy5JRiAkKFVTRV9DUFBFWENFUFQpCisJQ0ZMQUdTCQkrPSAvR1gKKy5FTkRJRgorCisjIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0CisKKy5JRiAkKE5PX1BNTElCKQorUE1MSUIgOj0KKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKyUkTzogJS5jIDsgJChDQykgL25vbG9nbyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAvYyAkKDw6cywvLFwpCislJE86ICUkUCA7ICQoQ0MpIC9ub2xvZ28gQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgL2MgJCg8OnMsLyxcKQorLklGICQoVVNFX05BU00pCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRUxTRQorJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKKyUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKKworIyBJbXBsaWNpdCBydWxlcyBmb3IgYnVpbGRpbmcgTlQgZGV2aWNlIGRyaXZlcnMKKworJS5zeXM6IDsKKwkkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCisuSUYgJChEQkcpCisuSUYgJChVU0VfU09GVElDRSkKKwkkKE5NU1lNKSAkKE5NU1lNRkxBR1MpOyQoU0lfU09VUkNFKSAkQAorLkVORElGCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKKy5JRiAkKElNUE9SVF9ETEwpCisuRUxTRQorLklGICQoTk9fUlVOVElNRSkKKyUkRDogOyAkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCisuRUxTRQorJSREOiA7CisJbWFrZWRlZiAtdiAkKgorCSQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKKy5JRiAkKERCRykKKy5JRiAkKFVTRV9TT0ZUSUNFKQorCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACisuRU5ESUYKKy5FTkRJRgorLkVORElGCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlLiBOb3RlIHRoYXQKKyMgd2UgdXNlIGEgc3BlY2lhbCAuVkNEIGZpbGUgdGhhdCBjb250YWlucyB0aGUgRVhQT1JUIGRlZmluaXRpb25zIGZvciB0aGUKKyMgTWljcm9zb2Z0IGNvbXBpbGVyLCBzaW5jZSB0aGUgTElCIHV0aWxpdHkgYXV0b21hdGljYWxseSBhZGRzIGxlYWRpbmcKKyMgdW5kZXJzY29yZXMgdG8gZXhwb3J0ZWQgZnVuY3Rpb25zLgorLklGICQoSU1QT1JUX0RMTCkKKyUkTDogOworCW1ha2VkZWYgLXYgJCg/OmIpCisgICAgQCQoUk0pICRACisJJChJTElCKSAkKElMSUJGTEFHUykgL0RFRjokKD86YikuZGVmIC9PVVQ6JEAKKy5FTFNFCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKExJQikgJChMSUJGTEFHUykgL291dDokQCBAJChta3RtcCAkKCY6dCJcbiIpXG4pCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorLklGICQoVVNFX1dJTjMyKQorJSRFOiA7CisJJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQorLklGICQoREJHKQorLklGICQoVVNFX1NPRlRJQ0UpCisJJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKKy5FTkRJRgorLkVORElGCisuRUxTRQorJSRFOiA7CisJQCQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKKy5JRiAkKERPU1NUWUxFKQorCUBtYXJrcGhhciAkQAorLkVORElGCisuRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNhOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzE2Lm1rCkBAIC0wLDAgKzEsNzkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAorCisuSUYgJChOT19QTUxJQikKK1BNTElCIDo9CisuRU5ESUYKKworIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCislJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKKyUkTzogJSRQIDsgJChDUFApIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCislJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8CisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQorLklGICQoQlVJTERfRExMKQorJSRMOiA7CisgICAgQCQoUk0pICRACisgICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgKyQ/CisuRUxJRiAkKElNUE9SVF9ETEwpCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KKy5FTFNFCislJEw6IDsKKyAgICBAJChSTSkgJEAKKyAgICAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAsJCoucnNwICskKCY6dCJcbisiOnMvXC9cXClcbikKKy5FTkRJRgorCisjIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChVU0VfV0lOMTYpCisuSUYgJChCVUlMRF9ETEwpCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbmRvd3NfZGxsXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKKwlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCisJQCQoUk0pIC1TICQobWt0bXAgJCoubG5rKQorLkVMU0UKKyUkRTogOworCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luZG93c1xuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKKy5FTkRJRgorLkVMU0UKKyUkRTogOworCUB0cmltbGliICQobWt0bXAgT1AgcXVpZXRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSAkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCSQoTEQpICQoTERGTEFHUykgQCQqLmxuaworCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKKy5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmZkODMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3djMzIubWsKQEAgLTAsMCArMSwyNjUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bworIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQorIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKKyMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKKyMJCQkJZGlmZmVyZW50bHkpLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAorCisuSUYgJChOT19QTUxJQikKK1BNTElCIDo9CisuRU5ESUYKKworIyBVc2UgYSBsYXJnZXIgc3RhY2sgZHVyaW5nIGxpbmtpbmcgaWYgcmVxdWVzdGVkLCBvciB1c2UgYSBkZWZhdWx0IHN0YWNrCisjIG9mIDIwMGsuIFRoZSB1c3VhbCBkZWZhdWx0IHN0YWNrIHByb3ZpZGVkIGJ5IFdhdGNvbSBDKysgaXMgKndheSogdG8gc21hbGwKKyMgZm9yIHJlYWwgMzIgYml0IGNvZGUgZGV2ZWxvcG1lbnQuIFdlIGFsc28gbmVlZCBhICpodWdlKiBzdGFjayBmb3IgT3BlbkdMCisjIHNvZnR3YXJlIHJlbmRlcmluZyBhbHNvIQorLklGICQoVVNFX1FOWDQpCisgICAgIyBOb3QgbmVjZXNzYXJ5IGZvciBRTlggY29kZS4KKy5FTFNFCisuSUYgJChTVEtTSVpFKQorICAgIExERkxBR1MJCSs9IE9QIFNUQUNLPSQoU1RLU0laRSkKKy5FTFNFCisJTERGTEFHUwkJKz0gT1AgU1RBQ0s9MjA0ODAwCisuRU5ESUYKKy5FTkRJRgorCisjIFR1cm4gb24gcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFzIG5lY2Vzc2FyeQorLklGICQoVVNFX1JUVEkpCisJQ1BGTEFHUwkJKz0gLXhyCisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gcHJlLWNvbXBpbGVkIGhlYWRlcnMKKy5JRiAkKFBSRUNPTVBfSERSKQorCUNGTEFHUwkJKz0gLWZocQorLkVORElGCisKKy5JRiAkKFVTRV9RTlgpCisjIFdoZXRoZXIgdG8gbGluayBpbiByZWFsIFZCSU9TIGxpYnJhcnksIG9yIGp1c3QgdGhlIHN0dWIgbGlicmFyeQorLklGICQoVVNFX0JJT1MpCitWQklPU0xJQiA6PSB2Ymlvcy5saWIsCisuRUxTRQorVkJJT1NMSUIgOj0gdmJzdHVicy5saWIsCisuRU5ECisjIFJlcXVpcmUgc3BlY2lhbCBwcml2bGVkZ2VzIGZvciBOdWNsZXVzIHByb2dyYW1zIChyZXF1aXJlcyByb290IGFjY2VzcykKKy5JRiAkKFVTRV9OVUNMRVVTKQorTERGTEFHUwkJKz0gT1AgUFJJVj0xCisuRU5ESUYKKy5FTkRJRgorCisjIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKKy5JRiAkKFdDX0xJQkJBU0UpID09IFdDMTBBCislJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAkKDw6cywvLFwpCislJE86ICUkUCA7ICQoQ1BQKSAkKENGTEFHUykgJCg8OnMsLyxcKQorLkVMU0UKKyUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorJSRPOiAlJFAgOyAkKENQUCkgQCQobWt0bXAgJChDUEZMQUdTOnMvXC9cXCkgJChDRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQorLkVORElGCisuSUYgJChVU0VfTkFTTSkKKyUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKy5FTFNFCislJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRU5ESUYKKworIyBJbXBsaXQgcnVsZSB0byBjb21waWxlIC5TIGFzc2VtYmxlciBmaWxlcy4gVGhlIGZpcnN0IHZlcnNpb24KKyMgdXNlcyBHQVMgZGlyZWN0bHkgYW5kIHRoZSBzZWNvbmQgdXNlcyBhIHByZS1wcm9jZXNzb3IgdG8KKyMgcHJvZHVjZSBOQVNNIGNvZGUuCisKKy5JRiAkKFVTRV9HQVMpCisuSUYgJChXQ19MSUJCQVNFKSA9PSBXQzExCislJE86ICUkUyA7ICQoR0FTKSAtYyBAJChta3RtcCAkKEdBU19GTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCisuRUxTRQorIyBCbGFjayBtYWdpYyB0byBidWlsZCBhc20gc291cmNlcyB3aXRoIFdhdGNvbSAxMC42IChyZXF1aXJlcyBzZWQpCislJE86ICUkUyA7CisJJChHQVMpIC1jIEAkKG1rdG1wICQoR0FTX0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKKwl3ZGlzYXNtIFxcIC1hICQoKjpzLC8sXCkubyA+ICQoKjpzLC8sXCkubHN0CisJc2VkIC1lICJzL1wudGV4dC9fVEVYVC87IHMvXC5kYXRhL19EQVRBLzsgcy9cLmJzcy9fQlNTLzsgcy9cLjM4Ni9cLjU4Ni87IHMvbGFyICplY3gsY3gvbGFyIGVjeCxlY3gvIiAkKCo6cywvLFwpLmxzdCA+ICQoKjpzLC8sXCkuYXNtCisJd2FzbSBcXCAkKFdGTEFHUykgLXpxIC1mcj1udWwgLWZwMyAtZm89JEAgJCgqOnMsLyxcKS5hc20KKwkkKFJNKSAtUyAkKG1rdG1wICQoKjpzLC8sXCkubykKKwkkKFJNKSAtUyAkKG1rdG1wICQoKjpzLC8sXCkubHN0KQorCSQoUk0pIC1TICQobWt0bXAgJCgqOnMsLyxcKS5hc20pCisuRU5ESUYKKy5FTFNFCislJE86ICUkUyA7CisJQGdjcHAgLUROQVNNX0FTU0VNQkxFUiAtRF9fV0FUQ09NQ19fIC1FUCAkKDw6cywvLFwpID4gJCgqOnMsLyxcKS5hc20KKwluYXNtIEAkKG1rdG1wIC1mIG9iaiAtbyAkQCkgJCgqOnMsLyxcKS5hc20KKwlAJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLmFzbSkKKy5FTkRJRgkKKworIyBTcGVjaWFsIHRhcmdldCB0byBidWlsZCBkbGxzdGFydC5hc20gdXNpbmcgQm9ybGFuZCBUQVNNCitkbGxzdGFydC5vYmo6IGRsbHN0YXJ0LmFzbQorCSQoRExMX1RBU00pIEAkKG1rdG1wIC90IC9teCAvbSAvRF9fRkxBVF9fIC9pJChTQ0lURUNIKVxJTkNMVURFIC9xKSAkKFBSSVZBVEUpXHNyY1xjb21tb25cZGxsc3RhcnQuYXNtCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKKyUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKKy5JRiAkKElNUE9SVF9ETEwpCisuRUxTRQorLklGICQoVVNFX09TMjMyKQorJSREOiA7CisJQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBvczJ2MiBkbGxcbk4gJEBcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5FTElGICQoVVNFX1dJTjMyKQorJSREOiA7CisJQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBudF9kbGxcbk4gJEBcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChERUZMSUJTKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5FTFNFCislJEQ6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjM4NlxuTiAkKi5yZXhcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworCXdiaW5kICQqIC1kIC1xIC1uCisuSUYgJChMRUFWRV9MSU5LRklMRSkKKy5FTFNFCQorCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQorLkVORElGCQorLkVORElGCisuRU5ESUYKKworIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCisuSUYgJChCVUlMRF9ETEwpCislJEw6IDsKKwlAJChSTSkgJEAKKwkkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KKy5FTElGICQoSU1QT1JUX0RMTCkKKyUkTDogOworCUAkKFJNKSAkQAorCSQoSUxJQikgJChJTElCRkxBR1MpICRAICskPworLkVMU0UKKyUkTDogOworICAgIEAkKFJNKSAkQAorICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCwkKi5yc3AgKyQoJjp0IlxuKyI6cy9cL1xcKVxuKQorLkVORElGCisKKyMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKKy5JRiAkKFVTRV9YMzIpCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCSQoTEQpICQoTERGTEFHUykgQCQqLmxuaworCXgzMmZpeCAkQAorLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5FTElGICQoVVNFX09TMjMyKQorLklGICQoVVNFX09TMkdVSSkKKyUkRTogOworCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgb3MydjJfcG1cbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5JRiAkKExYTElURSkKKyAJbHhsaXRlICRACisuRU5ESUYKKy5FTFNFCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG9zMnYyXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKKy5JRiAkKExFQVZFX0xJTktGSUxFKQorLkVMU0UJCisJQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCisuRU5ESUYJCisuSUYgJChMWExJVEUpCisgCWx4bGl0ZSAkQAorLkVORElGCisuRU5ESUYKKy5FTElGICQoVVNFX1NOQVApCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChERUZMSUJTKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5FTElGICQoVVNFX1dJTjMyKQorLklGICQoV0lOMzJfR1VJKQorJSRFOiA7CisJQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyB3aW45NVxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChERUZMSUJTKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuaworLklGICQoTEVBVkVfTElOS0ZJTEUpCisuRUxTRQkKKwlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKKy5FTkRJRgkKKy5FTFNFCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKERFRkxJQlMpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKKwlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCisuSUYgJChMRUFWRV9MSU5LRklMRSkKKy5FTFNFCQorCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQorLkVORElGCQorLkVORElGCisuRUxJRiAkKFVTRV9XSU4zODYpCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjM4NlxuTiAkKi5yZXhcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCisJcmNsaW5rICQoTEQpIHdiaW5kICQqLnJleCAkKi5sbmsKKy5JRiAkKExFQVZFX0xJTktGSUxFKQorLkVMU0UJCisJQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCisuRU5ESUYJCisuRUxJRiAkKFVTRV9UTlQpCislJEU6IDsKKwlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiBkb3N4MzIubGliLHRudGFwaS5saWIsJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCSQoTEQpIEAkKi5sbmsKKy5JRiAkKExFQVZFX0xJTktGSUxFKQorLkVMU0UJCisJQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCisuRU5ESUYJCisuSUYgJChET1NTVFlMRSkKKwlAbWFya3BoYXIgJEAKKy5FTkRJRgorLkVMSUYgJChVU0VfUU5YNCkKKyUkRTogOworCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChWQklPU0xJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCUAraWYgZXhpc3QgJCouZXhlIGF0dHJpYiAtcyAkKi5leGUgPiBOVUwKKwkkKExEKSBAJCoubG5rCisJQGF0dHJpYiArcyAkKi5leGUKKy5JRiAkKExFQVZFX0xJTktGSUxFKQorLkVMU0UJCisJQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCisuRU5ESUYJCisuRUxTRQorJSRFOiA7CisJQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuaworCSQoTEQpIEAkKi5sbmsKKy5JRiAkKExFQVZFX0xJTktGSUxFKQorLkVMU0UJCisJQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCisuRU5ESUYJCisuRU5ESUYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWFkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMTYubWsKQEAgLTAsMCArMSwxMjggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBTeW1hbnRlYyBDKysgNi54LzcueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUworIyAgICAgICAgICAgICAgIGFuZCAxNiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogU0NfTElCQkFTRQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSBzYyAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCisgICBDRkxBR1MgICAgICAgOj0gLW1sIC1KbQorLklGICQoVVNFX1RBU00zMikKKyAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKKy5FTElGICQoVVNFX1RBU01YKQorICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTkRJRgorICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQorICAgTEQgICAgICAgICAgIDo9IHNjICAgICAgICMgTG9hZGVyIGFuZCBmbGFncworICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQorICAgUkMgICAgICAgICAgIDo9IHJjYyAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgorICAgUkNGTEFHUyAgICAgIDo9ICAgICAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcworICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gL04gL0IKKyAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KKyAgIElMSUJGTEFHUyAgICA6PQorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtZyAgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZworLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gLTUgLW8rYWxsCisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK3NwYWNlCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKworLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC1mZiAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3IC1ERlBVX1JFR19SVE4KKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gLURCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCisuRU5ECisKKyMgVXNlciBhIGxhcmdlciBzdGFjayBpZiByZXF1ZXN0ZWQKKworLklGICQoU1RLU0laRSkKKyAgICBMREZMQUdTICAgICArPSA9JChTVEtTSVpFKQorLkVORElGCisKKyMgT3B0aW9uYWxseSBjb21waWxlIGZvciAxNiBiaXQgV2luZG93cworLklGICQoVVNFX1dJTjE2KQorLklGICQoQlVJTERfRExMKQorICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtREJVSUxEX0RMTAorICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC1XQQorLkVORElGCisgICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCisgICBMSUJfT1MgICAgICAgPSBXSU4xNgorLkVMU0UKKyAgIFVTRV9SRUFMRE9TCTo9IDEKKyAgIExJQl9PUyAgICAgICA9IERPUzE2CisuRU5ECisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCitQTUxJQiAgICAgICAgICAgOj0gcG0ubGliCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoU0NfTElCQkFTRSkKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gc2MxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTc1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMzIubWsKQEAgLTAsMCArMSwxNzggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBTeW1hbnRlYyBDKysgNi54LzcueCAzMiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgdGhlIERPU1gKKyMgICAgICAgICAgICAgICBleHRlbmRlciwgRmxhc2hUZWsgWDMyIGFuZCBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIKKyMgICAgICAgICAgICAgICBhbmQgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9UTlQgVVNFX1gzMiBVU0VfWDMyVk0gU0NfTElCQkFTRQorCisjIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKKyAgIF8zMkJJVF8gICAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IHNjICAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKKyAgIENGTEFHUyAgICAgICA6PSAtSm0KKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTFNFCisgICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRU5ESUYKKy5JRiAkKFVTRV9XSU4zMikKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9ERVNfTk9UX0RTIC9EX19DT01NX18gL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5FTkRJRgorICAgTEQgICAgICAgICAgIDo9IHNjICAgICAgICMgTG9hZGVyIGFuZCBmbGFncworICAgTERfRkxBR1MgICAgICA9CisgICBSQyAgICAgICAgICAgOj0gcmNjICAgICAgIyBXSW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCisgICBSQ0ZMQUdTICAgICAgOj0gLTMyICAgICAgIyBNYXJrIGFzIFdpbjMyIGNvbXBhdGlibGUgcmVzb3VyY2VzCisgICBMSUIgICAgICAgICAgOj0gbGliICAgICAgIyBMaWJyYXJpYW4KKyAgIExJQkZMQUdTICAgICA6PSAvTiAvQgorICAgSUxJQiAgICAgICAgIDo9IGltcGxpYiAgICMgSW1wb3J0IGxpYnJhcmlhbgorICAgSUxJQkZMQUdTICAgIDo9CisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC1nICAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIgKEZsYXNoVmlldykKKy5JRiAkKFVTRV9UTlQpCisgICBMREZMQUdTICAgICAgKz0gLWZ1bGxzeW0gIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgVE5UIDM4NmxpbmsgbGlua2VyCisuRU5ECisuSUYgJChVU0VfWDMyKSBvciAkKFVTRV9YMzJWTSkKKyAgIExERkxBR1MgICAgICArPSAtTC9tYXAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBGbGFzaFZpZXcgZGVidWdnZXIKKy5FTkQKKy5FTFNFCisgICBBU0ZMQUdTICAgICAgKz0gL3EgICAgICAgIyBTdXBwcmVzcyBvYmplY3QgcmVjb3JkcyBub3QgbmVlZGVkIGZvciBsaW5raW5nCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKKy5JRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAtNSAtbythbGwKKy5FTElGICQoT1BUX1NJWkUpCisgICBDRkxBR1MgICAgICAgKz0gLTUgLW8rc3BhY2UKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucworCisuSUYgJChGUFUpCisgICBDRkxBR1MgICAgICAgKz0gLWZmIC1ERlBVMzg3CisgICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcgLURGUFVfUkVHX1JUTgorLkVORAorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAorLklGICQoQkVUQSkKKyAgIENGTEFHUyAgICAgICArPSAtREJFVEEKKyAgIEFTRkxBR1MgICAgICArPSAtREJFVEEKKy5FTkQKKworIyBVc2VyIGEgbGFyZ2VyIHN0YWNrIGlmIHJlcXVlc3RlZAorCisuSUYgJChTVEtTSVpFKQorICAgIExERkxBR1MgICAgICs9ID0kKFNUS1NJWkUpCisuRU5ESUYKKworLklGICQoVVNFX1ROVCkgICAgICAgICAgICAgICAgICAjIFVzZSBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIKKyAgIENGTEFHUyAgICAgICArPSAtbXAKKyAgIERYX0NGTEFHUyAgICArPSAtRFROVAorICAgQVNGTEFHUyAgICAgICs9IC9EX19GTEFUX18KKyAgIERYX0FTRkxBR1MgICArPSAtRFROVAorICAgTEQgICAgICAgICAgIDo9IDM4NmxpbmsKKyAgIExERkxBR1MgICAgICArPSBAc2MzMi5kb3MgLWV4ZSAkQAorICAgTElCX09TICAgICAgID0gRE9TMzIKKy5FTElGICQoVVNFX1gzMlZNKSAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMlZNIERPUyBleHRlbmRlcgorICAgQ0ZMQUdTICAgICAgICs9IC1teAorICAgRFhfQ0ZMQUdTICAgICs9IC1EWDMyVk0KKyAgIEFTRkxBR1MgICAgICArPSAvRF9fWDM4Nl9fCisgICBEWF9BU0ZMQUdTICAgKz0gLURYMzJWTQorICAgTEQgICAgICAgICAgIDo9IHNjCisgICBMREZMQUdTICAgICAgKz0gJChDRkxBR1MpIHgzMnYubGliCisgICBMSUJfT1MgICAgICAgPSBET1MzMgorLkVMSUYgJChVU0VfWDMyKSAgICAgICAgICAgICAgICAjIFVzZSBGbGFzaFRlayBYLTMyIERPUyBleHRlbmRlcgorICAgQ0ZMQUdTICAgICAgICs9IC1teAorICAgRFhfQ0ZMQUdTICAgICs9IC1EWDMyVk0KKyAgIEFTRkxBR1MgICAgICArPSAvRF9fWDM4Nl9fCisgICBEWF9BU0ZMQUdTICAgKz0gLURYMzJWTQorICAgTEQgICAgICAgICAgIDo9IHNjCisgICBMREZMQUdTICAgICAgKz0gJChDRkxBR1MpIHgzMi5saWIKKyAgIExJQl9PUyAgICAgICA9IERPUzMyCisuRUxJRiAkKFVTRV9XSU4zMikgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgYXBwCisuSUYgJChCVUlMRF9ETEwpCisgICBDRkxBR1MgICAgICAgKz0gLVdEIC1tbgorICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC1XQSAtbW4KKy5FTkRJRgorICAgRFhfQVNGTEFHUyAgICs9IC1EX19XSU5ET1dTMzJfXworICAgTElCX09TICAgICAgID0gV0lOMzIKKy5FTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgZGVmYXVsdCBTeW1hbnRlYyBET1NYIGV4dGVuZGVyCisgICBVU0VfRE9TWCAgICAgOj0gMQorICAgVVNFX1JFQUxET1MJOj0gMQorICAgQ0ZMQUdTICAgICAgICs9IC1teAorICAgRFhfQ0ZMQUdTICAgICs9IC1ERE9TWAorICAgQVNGTEFHUyAgICAgICs9IC9EX19YMzg2X18KKyAgIERYX0FTRkxBR1MgICArPSAtRERPU1gKKyAgIExEICAgICAgICAgICA6PSBzYworICAgTERGTEFHUyAgICAgICs9ICQoQ0ZMQUdTKQorICAgTElCX09TICAgICAgID0gRE9TMzIKKy5FTkQKKworIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKFVTRV9UTlQpCitQTUxJQiAgICAgICAgICAgOj0gdG50XHBtLmxpYgorLkVMSUYgJChVU0VfWDMyKQorUE1MSUIgICAgICAgICAgIDo9IHgzMlxwbS5saWIKKy5FTFNFCitQTUxJQiAgICAgICAgICAgOj0gZG9zeFxwbS5saWIKKy5FTkQKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChTQ19MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSBzYzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3N0YXJ0dXAubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3N0YXJ0dXAubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2N2E5NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc3RhcnR1cC5tawpAQCAtMCwwICsxLDE2MiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIENvbW1vbiBzdGFydHVwIHNjcmlwdCB0aGF0IGRlZmluZXMgYWxsIHZhcmlhYmxlcyBjb21tb24gdG8KKyMJCQkJYWxsIHN0YXJ0dXAgc2NyaXB0cy4gVGhlc2UgZGVmaW5lIHRoZSBETUFLRSBydW50aW1lCisjCQkJCWVudmlyb25tZW50IGFuZCB0aGUgdmFsdWVzIGFyZSBkZXBlbmRhbnQgb24gdGhlIHZlcnNpb24gb2YKKyMJCQkJRE1BS0UgaW4gdXNlLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUuCitfXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQorLlNJTEVOVCAgICAgICAgIDo9IHllcworCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKKy5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgQ09NU1BFQyBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKKy5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgVVNFX1dJTjMyIEZQVSBCVUlMRF9ETEwgQlVJTERfRk9SX0RMTAorLklNUE9SVCAuSUdOT1JFIDogSU1QT1JUX0RMTCBVU0VfVEFTTVggV0lOMzJfR1VJIFVTRV9XSU4xNiBVU0VfTkFTTSBDSEVDS0VECisuSU1QT1JUIC5JR05PUkUgOiBPUzJfU0hFTEwgU09GVElDRV9QQVRIIE1BWF9XQVJOIFVTRV9TT0ZUSUNFIFVTRV9UQVNNMzIKKy5JTVBPUlQgLklHTk9SRSA6IERMTF9TVEFSVF9UQVNNIFVTRV9TTkFQIFVTRV9YMTEgVVNFX0xJTlVYIFNUQVRJQ19MSUJTIExJQkMKKy5JTVBPUlQgLklHTk9SRSA6IFNIT1dfQVJHUyBCT09UX1NUUkFQX0RNQUtFCisgICBUTVBESVIgOj0gJChURU1QKQorCisjIERldGVybWluZSBpZiB0aGUgaG9zdCBtYWNoaW5lIGlzIGEgV2luZG93cy9ET1Mgb3IgVW5peCBib3gKKy5JRiAkKENPTVNQRUMpCisgICBXSU4zMl9IT1NUICAgOj0gMQorLkVMU0UKKyAgIFVTRV9OQVNNICAgICA6PSAxCisgICBVTklYX0hPU1QgICAgOj0gMQorLkVORElGCisKKyMgU2V0dXAgdG8gZWl0aGVyIHVzZXIgTkFTTSBvciBUQVNNIGFzIHRoZSBhc3NlbWJsZXIKKy5JRiAkKFVTRV9OQVNNKQorLkVMU0UKKyAgIFVTRV9UQVNNCQk6PSAxCisuRU5ESUYKKworLklGICQoVU5JWF9IT1NUKQorIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucworIworIyBOT1RFOiBMaW51eC9Vbml4IGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQorIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAuZXhlIGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKKyMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCisjICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcyAoZXhlIGFsc28gbWFrZXMgaXQKKyMgICAgICAgZWFzaWVyIGZvciBjcm9zcy1jb21waWxlL2RlYnVnZ2luZyBzaXR1YXRpb25zKS4gV2hlbiB5b3UgaW5zdGFsbAorIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQorIyAgICAgICB0aGUgLmV4ZSBleHRlbnNpb24uCisgICBMICAgICAgICAgICAgOj0gLmEgICAJIyBMaWJyYXJpZXMKKyAgIEUgICAgICAgICAgICA6PSAuZXhlICAgCSMgRXhlY3V0YWJsZXMgZm9yIGdsaWJjCisgICBPICAgICAgICAgICAgOj0gLm8gICAJIyBPYmplY3RzCisgICBBICAgICAgICAgICAgOj0gLmFzbSAgIAkjIEFzc2VtYmxlciBzb3VyY2VzCisgICBTICAgICAgICAgICAgOj0gLnMgICAgICAgIyBHTlUgYXNzZW1ibGVyIHNvdXJjZXMKKyAgIFAgICAgICAgICAgICA6PSAuY3BwICAgCSMgQysrIHNvdXJjZXMKKworIyBGaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMuIFRoZSBmb2xsb3dpbmcgcHJlZml4ZXMgYXJlIGRlZmluZWQsIGFuZCBhcmUKKyMgdXNlZCBwcmltYXJpbHkgdG8gYWJzdHJhY3QgYmV0d2VlbiB0aGUgVW5peCBzdHlsZSBsaWJYWC5hIG5hbWluZyBjb252ZW50aW9uCisjIGFuZCB0aGUgRE9TL1dpbmRvd3MvT1MyIG5hbWluZyBjb252ZW50aW9uIG9mIFhYLmxpYi4KKyAgIExQICAgICAgICAgICA6PSBsaWIgICAgICAjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCisgICBMTCAgICAgICAgICAgOj0gLWwJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQorICAgTEUgICAgICAgICAgIDo9IAkJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisKKyMgV2UgdXNlIHRoZSBVbml4IHNoZWxsIGF0IGFsbCB0aW1lcworICAgU0hFTEwJCTo9IC9iaW4vc2gKKyAgIFNIRUxMRkxBR1MgICA6PSAtYworCisuRUxTRQorIyBTdGFuZGFyZCBmaWxlIERPUy9XaW4vT1MyIHN1ZmZpeCBkZWZpbml0aW9ucworICAgTCAgICAgICAgICAgIDo9IC5saWIgICAJIyBMaWJyYXJpZXMKKy5JRiAkKFVTRV9TTkFQKQorICAgRSAgICAgICAgICAgIDo9IC5zeGUgICAJIyBTbmFwIEV4ZWN1dGFibGVzCisgICBEICAgICAgICAgICAgOj0gLnNsbCAgCSMgU25hcCBEeW5hbWljIExpbmsgTGlicmFyeSBmaWxlCisuRUxTRQorICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcworICAgRCAgICAgICAgICAgIDo9IC5kbGwgICAJIyBEeW5hbWljIExpbmsgTGlicmFyeSBmaWxlCisuRU5ESUYKKyAgIE8gICAgICAgICAgICA6PSAub2JqICAgCSMgT2JqZWN0cworICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcworICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcworICAgUiAgICAgICAgICAgIDo9IC5yZXMgICAJIyBDb21waWxlZCByZXNvdXJjZSBmaWxlCisgICBTCQkJOj0gLnMJCSMgQXNzeW50YXguaCBzdHlsZSBhc3NlbWJsZXIKKworIyBGaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMuIFRoZSBmb2xsb3dpbmcgcHJlZml4ZXMgYXJlIGRlZmluZWQsIGFuZCBhcmUKKyMgdXNlZCBwcmltYXJpbHkgdG8gYWJzdHJhY3QgYmV0d2VlbiB0aGUgVW5peCBzdHlsZSBsaWJYWC5hIG5hbWluZyBjb252ZW50aW9uCisjIGFuZCB0aGUgRE9TL1dpbmRvd3MvT1MyIG5hbWluZyBjb252ZW50aW9uIG9mIFhYLmxpYi4KKyAgIExQICAgICAgICAgICA6PSAJCQkjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCisgICBMTCAgICAgICAgICAgOj0gCQkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0gLmxpYgkJIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKKworIyBXZSB1c2UgdGhlIERPUy9XaW4vT1MyIHN0eWxlIHNoZWxsIGF0IGFsbCB0aW1lcworICAgU0hFTEwgICAgICAgIDo9ICQoQ09NU1BFQykKKyAgIEdST1VQU0hFTEwgICA6PSAkKFNIRUxMKQorICAgU0hFTExGTEFHUyAgIDo9ICQoU1dJVENIQVIpYworICAgR1JPVVBGTEFHUyAgIDo9ICQoU0hFTExGTEFHUykKKyAgIFNIRUxMTUVUQVMgICA6PSAqIj88PgorLklGICQoT1MyX1NIRUxMKQorICAgR1JPVVBTVUZGSVggIDo9IC5jbWQKKy5FTFNFCisgICBHUk9VUFNVRkZJWCAgOj0gLmJhdAorLkVORElGCisgICBESVJTRVBTVFIgICAgOj0gXFwKKyAgIERJVkZJTEUgICAgICAgPSAkKFRNUEZJTEU6cywvLFwpCisKKy5FTkRJRgorCisjIFN0YW5kYXJkIFVuaXggc3R5bGUgc2hlbGwgY29tbWFuZHMuIFNpbmNlIHRoZXNlIGRvIG5vdCBleGlzdCBvbgorIyByZWd1bGFyIERPUy9XaW4vT1MyIGluc3RhbGxhdGlvbnMgd2UgdXNlIG91ciBvd24gJycgdmVyc2lvbnMKKyMgaW5zdGVhZC4gVG8gYm9vc3RydGFwIGEgbmV3IE9TIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlIHJlZ3VsYXIKKyMgdW5peCB2ZXJzaW9ucy4KKworLklGICQoQk9PVF9TVFJBUF9ETUFLRSkKKyAgIENQCQkJOj0gY3AKKyAgIE1ECQkJOj0gbWtkaXIKKyAgIFJNCQkJOj0gcm0KKyAgIEVDSE8JCQk6PSBlY2hvCisuRUxTRQorICAgQ1AJCQk6PSBrX2NwCisgICBNRAkJCTo9IGtfbWQKKyAgIFJNCQkJOj0ga19ybQorICAgRUNITwkJCTo9IGtfZWNobworLkVORElGCisKKyMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCisgICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKKworIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCisgICBJTlNUQUxMICAgICAgOj0gJChDUCkKKworIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cworLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAorCisjIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgorLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKKworIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKKy5OT1RBQlMgICAgICAgICA6PSB5ZXMKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2E1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZhMzIubWsKQEAgLTAsMCArMSwxNjMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgSUJNIFZpc3VhbEFnZSBDKysgMy4wIE9TLzIgMzItYml0IHZlcnNpb24uCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IFZBX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkgRlVMTFNDUkVFTiBOT09QVCBNQVhfV0FSTgorCisjIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKKyAgIF8zMkJJVF8gICAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGljYworICAgQ1BQICAgICAgICAgIDo9IGljYworICAgQ0ZMQUdTICAgICAgIDo9IC9RIC9HNSAvR2wrIC9GaSAvU2kgL0otIC9TcysgL1NwMSAvR20rIC9JLgorLklGICQoVVNFX05BU00pCisgICBBUyAgICAgICAgICAgOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtRiBudWxsIC1kX19GTEFUX18gLWRTVERDQUxMX01BTkdMRSAtZF9fTk9VX1ZBUl9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQorLkVMU0UKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9EX19OT1VfVkFSX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisuRU5ESUYKKyAgIExEICAgICAgICAgICA6PSBpbGluaworICAgTERGTEFHUyAgICAgICA9IC9ub2kgL2V4ZXBhY2s6MiAvcGFja2NvZGUgL3BhY2tkYXRhIC9hbGlnbjozMiAvbWFwIC9ub2UKKyAgIFJDICAgICAgICAgICA6PSByYworICAgUkNGTEFHUyAgICAgIDo9IC1uIC14MgorICAgTElCICAgICAgICAgIDo9IGlsaWIKKyAgIExJQkZMQUdTICAgICA6PSAvbm9sb2dvCisgICBJTElCICAgICAgICAgOj0gaW1wbGliCisgICBJTElCRkxBR1MgICAgOj0gL25vbG9nbworICAgSVBGQyAgICAgICAgIDo9IGlwZmMKKyAgIElQRkNGTEFHUyAgICA6PQorICAgSUJNQ09CSiAgICAgIDo9IDEKKworIyBTZXQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgbGV2ZWwKKy5JRiAkKE1BWF9XQVJOKQorICAgQ0ZMQUdTICAgICAgICs9IC9XMworLkVMU0UKKyAgIENGTEFHUyAgICAgICArPSAvVzEKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAvVGkKKyAgIExERkxBR1MgICAgICArPSAvREUKKy5FTFNFCisuSUYgJChVU0VfVEFTTSkKKyAgIEFTRkxBR1MgICAgICArPSAvcQorLkVORElGCisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKKy5JRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAvR2ZpIC9PIC9PaQorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAvR2ZpIC9PIC9PYworLkVMSUYgJChOT09QVCkKKyAgIENGTEFHUyAgICAgICArPSAvTy0KKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucyBvcHRpbWlzZWQgZm9yIFBlbnRpdW0KKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORAorCisjIEJ1aWxkIDMyLWJpdCBPUy8yIGFwcHMKKy5JRiAkKEJVSUxEX0RMTCkKKyAgIENGTEFHUyAgICAgICArPSAvR2UtIC9EQlVJTERfRExMCisgICBMREZMQUdTICAgICAgKz0gL0RMTCAvTk9FCisgICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisuSUYgJChVU0VfT1MyR1VJKQorICAgQ0ZMQUdTICAgICAgICs9IC1EX19PUzJfUE1fXworICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6UE0KKy5FTFNFCisuSUYgJChGVUxMU0NSRUVOKQorICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6Tk9WSU8KKy5FTFNFCisgICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpWSU8KKy5FTkRJRgorLkVORElGCisuRU5ESUYKKyAgIERYX0FTRkxBR1MgICArPSAtZF9fT1MyX18KKyAgIExJQl9PUyAgICAgICA9IG9zMjMyCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfT1MyR1VJKQorLklGICQoVVNFX1NERFBNRExMKQorI05vdGU6IFRoaXMgaXMgT0sgZm9yIG5vdyBidXQgbWlnaHQgbmVlZCB0byBiZSBjaGFuZ2VkIGlmIHRoZSBHVUkgUE0gbGlicmFyeQorIyAgICAgIHdlcmUgcmVhbGx5IGRpZmZlcmVudAorUE1MSUIgICAgICAgICAgIDo9IHNkZHBtbGliLmxpYgorLkVMU0UKK1BNTElCICAgICAgICAgICA6PSBwbV9wbS5saWIKKy5FTkRJRgorLkVMU0UKKy5JRiAkKFVTRV9TRERQTURMTCkKK1BNTElCICAgICAgICAgICA6PSBzZGRwbWxpYi5saWIKKy5FTFNFCitQTUxJQiAgICAgICAgICAgOj0gcG0ubGliCisuRU5ESUYKKy5FTkRJRgorCisjIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKKworLklGICQoQ0hFQ0tFRCkKK0xJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKK0NGTEFHUyAgICAgICAgICArPSAvRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQV9MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSyAgICA6PSB2YTMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZhMzY1Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJlY2NiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5tawpAQCAtMCwwICsxLDE1MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIAkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisjICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisjICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyMKKyMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisjICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCisjICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKKyMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAorIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCisjCisjICAgICAgICAgICAgICAgSUJNIFZpc3VhbEFnZSBDKysgMy42NSBPUy8yIDMyLWJpdCB2ZXJzaW9uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCisuSU1QT1JUOiBTQ0lURUNICisuSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCisuSU1QT1JUIC5JR05PUkUgOiBWQV9MSUJCQVNFIFVTRV9PUzIzMiBVU0VfT1MyR1VJIEZVTExTQ1JFRU4gTk9PUFQgTUFYX1dBUk4KKworIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50CisgICBfMzJCSVRfICAgICAgOj0gMQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSBpY2MKKyAgIENQUCAgICAgICAgICA6PSBpY2MKKyAgIENGTEFHUyAgICAgICA6PSAvUSAvRzVsIC9GaSAvU2kgL0otIC9TcysgL1NwMSAvR20rIC9JLgorLklGICQoVVNFX05BU00pCisgICBBUyAgICAgICAgICAgOj0gbmFzbQorICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtRiBudWxsIC1kX19GTEFUX18gLWRTVERDQUxMX01BTkdMRSAtZF9fTk9VX1ZBUl9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQorLkVMU0UKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorLkVMU0UKKyAgIEFTICAgICAgICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9EX19OT1VfVkFSX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisuRU5ESUYKKyAgIExEICAgICAgICAgICA6PSBpbGluaworICAgTERGTEFHUyAgICAgICA9IC9ub2kgL2V4ZXBhY2sgL3BhY2tjb2RlIC9wYWNrZGF0YSAvYWxpZ246MzIgL21hcCAvbm9lCisgICBSQyAgICAgICAgICAgOj0gcmMKKyAgIFJDRkxBR1MgICAgICA6PSAvbm9sb2dvCisgICBMSUIgICAgICAgICAgOj0gaWxpYgorICAgTElCRkxBR1MgICAgIDo9IC9ub2xvZ28KKyAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKKyAgIElMSUJGTEFHUyAgICA6PSAvbm9sb2dvCisgICBJQk1DT0JKICAgICAgOj0gMQorCisjIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAorLklGICQoTUFYX1dBUk4pCisgICBDRkxBR1MgICAgICAgKz0gL1czCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC9XMQorLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC9UaQorICAgTERGTEFHUyAgICAgICs9IC9ERQorLkVMU0UKKy5JRiAkKFVTRV9UQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC9xCisuRU5ESUYKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09pCisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09jCisuRUxJRiAkKE5PT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC9PLQorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQorLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3CisgICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gLURCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCisuRU5ECisKKyMgQnVpbGQgMzItYml0IE9TLzIgYXBwcworLklGICQoQlVJTERfRExMKQorICAgQ0ZMQUdTICAgICAgICs9IC9HbWUtIC9EQlVJTERfRExMCisgICBMREZMQUdTICAgICAgKz0gL0RMTCAvTk9FCisgICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisuSUYgJChVU0VfT1MyR1VJKQorICAgQ0ZMQUdTICAgICAgICs9IC1EX19PUzJfUE1fXworICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6UE0KKy5FTFNFCisuSUYgJChGVUxMU0NSRUVOKQorICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6Tk9WSU8KKy5FTFNFCisgICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpWSU8KKy5FTkRJRgorLkVORElGCisuRU5ESUYKKyAgIERYX0FTRkxBR1MgICArPSAtZF9fT1MyX18KKyAgIExJQl9PUyAgICAgICA9IG9zMjMyCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfT1MyR1VJKQorUE1MSUIgICAgICAgICAgIDo9IHBtX3BtLmxpYgorLkVMU0UKK1BNTElCICAgICAgICAgICA6PSBwbS5saWIKKy5FTkRJRgorCisjIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKKworLklGICQoQ0hFQ0tFRCkKK0xJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKK0NGTEFHUyAgICAgICAgICArPSAvRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQV9MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSyAgICA6PSB2YTM2NS5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2JmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMTYubWsKQEAgLTAsMCArMSwxMjggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxLnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdAorIyAgICAgICAgICAgICAgIERPUyBhbmQgV2luZG93cyBkZXZlbG9wbWVudC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogVkNfTElCQkFTRQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSBjbCAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCisgICBDRkxBR1MgICAgICAgOj0gL1lYIC93IC9HMyAvR3MKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKKy5FTFNFCisgICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKyAgIExEICAgICAgICAgICA6PSBjbCAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKKyAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKKyAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdJbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyAgIFJDRkxBR1MgICAgICA6PQorICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCisgICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCisgICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAvWWQgL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCisgICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZworLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gL094CisuRU5ECisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKKworLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCisuRU5ECisKKyMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKKyMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KKworLklGICQoU1RLU0laRSkKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKKy5JRiAkKFVTRV9XSU4xNikKKy5JRiAkKEJVSUxEX0RMTCkKKyAgIENGTEFHUyAgICAgICArPSAvR0QgL0FsZncgL0RCVUlMRF9ETEwKKyAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAorLkVMU0UKKyAgIENGTEFHUyAgICAgICArPSAvR0EgL0FMCisuRU5ESUYKKyAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KKyAgIExJQl9PUyAgICAgICA9IFdJTjE2CisuRUxTRQorICAgVVNFX1JFQUxET1MJOj0gMQorICAgQ0ZMQUdTICAgICAgICs9IC9BTAorICAgTElCX09TICAgICAgID0gRE9TMTYKKy5FTkQKKworIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCisKK1BNTElCICAgICAgICAgICA6PSBwbS5saWIKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSB2YzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjOTA3MQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmMzMi5tawpAQCAtMCwwICsxLDIyNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisjCisjICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisjICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcworIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50CisjICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKKyMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgorIworIyAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIueCAzMiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgUGhhciBMYXAKKyMgICAgICAgICAgICAgICBUTlQgRE9TIEV4dGVuZGVyIGFuZCAzMiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucworLklNUE9SVDogU0NJVEVDSAorLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCisKKyMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQorLklNUE9SVCAuSUdOT1JFIDogVE5UX1BBVEggVkNfTElCQkFTRSBET1NTVFlMRSBVU0VfVE5UIFVTRV9SVFRBUkdFVCBNU1ZDRElSCisuSU1QT1JUIC5JR05PUkUgOiBVU0VfVlhEIFVTRV9OVERSViBVU0VfVzJLRFJWIE5UX0RES1JPT1QgVVNFX1JUVEkgVVNFX0NQUEVYQ0VQVAorCisjIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKKyAgIF8zMkJJVF8gICAgICA6PSAxCisKKyMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZworICAgQ0MgICAgICAgICAgIDo9IGNsICAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKKyAgIENGTEFHUyAgICAgICA6PQorLklGICQoVVNFX05BU00pCisgICBBUwkJCTo9IG5hc20KKyAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiB3aW4zMiAtRiBudWxsIC1kX19GTEFUX18gLWRTVERDQUxMX01BTkdMRSAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKKy5FTFNFCisuSUYgJChVU0VfVEFTTTMyKQorICAgQVMgICAgICAgICAgIDo9IHRhc20zMgorLkVMSUYgJChVU0VfVEFTTVgpCisgICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRUxTRQorICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworLkVORElGCisgICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL0RTVERDQUxMX01BTkdMRSAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKKy5FTkRJRgorICAgTEQgICAgICAgICAgIDo9IGNsCisuSUYgJChVU0VfV0lOMzIpCisgICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCisuSUYgJChVU0VfTlREUlYpCisgICBMREVOREZMQUdTICAgPSAtbGluayAvSU5DUkVNRU5UQUw6Tk8gL0RSSVZFUiAvU1VCU1lTVEVNOk5BVElWRSw0LjAwIC9WRVJTSU9OOjQuMDAgL01BQ0hJTkU6STM4NiAvTk9ERUZBVUxUTElCIC9ERUJVR1RZUEU6Q1YgL1BEQjpOT05FIC9BTElHTjoweDIwIC9CQVNFOjB4MTAwMDAgL0VOVFJZOkRyaXZlckVudHJ5QDgKKwkjL01FUkdFOl9wYWdlPXBhZ2UgL01FUkdFOl90ZXh0PS50ZXh0IC9NRVJHRToucmRhdGE9LnRleHQKKy5FTElGICQoV0lOMzJfR1VJKQorICAgTERFTkRGTEFHUyAgID0gLWxpbmsgL0lOQ1JFTUVOVEFMOk5PIC9ERUY6JChAOmIpLmRlZiAvU1VCU1lTVEVNOldJTkRPV1MgL01BQ0hJTkU6STM4NiAvREVCVUdUWVBFOkNWIC9QREI6Tk9ORQorLkVMU0UKKyAgIExERU5ERkxBR1MgICA9IC1saW5rIC9JTkNSRU1FTlRBTDpOTyAvU1VCU1lTVEVNOkNPTlNPTEUgL01BQ0hJTkU6STM4NiAvREVCVUdUWVBFOkNWIC9QREI6Tk9ORQorLkVORElGCisuRUxTRQorICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQorICAgTERFTkRGTEFHUyAgIDo9IC1saW5rIC1zdHViOiQoVE5UX1BBVEg6cy9cL1xcKVxcYmluXFxnb3RudC5leGUgL1BEQjpOT05FCisuRU5ESUYKKyAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdhdGNvbSByZXNvdXJjZSBjb21waWxlcgorICAgUkNGTEFHUyAgICAgIDo9ICAgICAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcworICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0KKyAgIElMSUIgICAgICAgICA6PSBsaWIgICAgICAjIEltcG9ydCBsaWJyYXJpYW4KKyAgIElMSUJGTEFHUyAgICA6PSAvTUFDSElORTpJWDg2CisgICBJTlRFTF9YODYJOj0gMQorICAgTk1TWU0gICAJCTo9ICQoU09GVElDRV9QQVRIKVxubXN5bS5leGUKKy5JRiAkKFVTRV9OVERSVikKKyAgIE5NU1lNRkxBR1MJOj0gL1RSQU5TTEFURTpzb3VyY2UscGFja2FnZSxhbHdheXMgL1BST01QVCAvU09VUkNFOiQoTVNWQ0RJUilcY3J0XHNyY1xpbnRlbDskKFNDSVRFQ0gpXHNyY1xwbTskKFNDSVRFQ0gpXHNyY1xwbVxjb21tb247JChTQ0lURUNIKVxzcmNccG1cbnRkcnYKKy5FTFNFCisgICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKFNDSVRFQ0gpXHNyY1xwbTskKFNDSVRFQ0gpXHNyY1xwbVxjb21tb247JChTQ0lURUNIKVxzcmNccG1cd2luMzIKKy5FTkRJRgorCisjIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAorLklGICQoTUFYX1dBUk4pCisgICBDRkxBR1MgICAgICAgKz0gLVczCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC1XMQorLkVORElGCisKKyMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLklGICQoREJHKQorICAgQ0ZMQUdTICAgICAgICs9IC9ZZCAvWmkgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKKy5JRiAkKFVTRV9UQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgorLkVORElGCisuRUxTRQorLklGICQoVVNFX1RBU00pCisgICBBU0ZMQUdTICAgICAgKz0gL3EgICAgICAgIyBTdXBwcmVzcyBvYmplY3QgcmVjb3JkcyBub3QgbmVlZGVkIGZvciBsaW5raW5nCisuRU5ESUYKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoVkNfTElCQkFTRSkgPT0gdmM1CisuSUYgJChPUFQpCisgICBDRkxBR1MgICAgICAgKz0gL0c2IC9PMiAvT3ggL09pLQorLkVMSUYgJChPUFRfU0laRSkKKyAgIENGTEFHUyAgICAgICArPSAvRzYgL08xCisuRU5ECisuRUxTRQorLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC9HNSAvTzIgL094CisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC9HNSAvTzEKKy5FTkQKKy5FTkRJRgorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCisKKy5JRiAkKEZQVSkKKyAgIENGTEFHUyAgICAgICArPSAvREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC9EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQorLkVORAorCisjIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQsIG9yIHVzZSBhIGRlZmF1bHQgc3RhY2sKKyMgb2YgNTBrLiBUaGUgdXN1YWwgZGVmYXVsdCBzdGFjayBwcm92aWRlZCBieSBWaXN1YWwgQysrIGlzICp3YXkqIHRvIHNtYWxsCisjIGZvciByZWFsIDMyIGJpdCBjb2RlIGRldmVsb3BtZW50LgorCisuSUYgJChVU0VfV0lOMzIpCisJIyBOb3QgbmVjZXNzYXJ5IGZvciBXaW4zMiBjb2RlLgorLkVMU0UKKy5JRiAkKFNUS1NJWkUpCisJTERFTkRGTEFHUyAgKz0gL1NUQUNLOiQoU1RLU0laRSkKKy5FTFNFCisJTERFTkRGTEFHUyAgKz0gL1NUQUNLOjUxMjAwCisuRU5ESUYKKy5FTkRJRgorCisjIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKKy5JRiAkKFVTRV9OVERSVikJCQkJIyBCdWlsZCAzMiBiaXQgV2luZG93cyBOVCBkcml2ZXIKKyAgIENGTEFHUyAgICAgICArPSAvTEQgL1psIC9HeSAvR3ogL0dGIC9EX19OVF9EUklWRVJfXyAvRF9YODZfPTEgL0RpMzg2PTEKKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAvUUlmCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICArPQorICAgREVGX0xJQlMJCTo9IGludDY0LmxpYiBudG9za3JubC5saWIgaGFsLmxpYgorICAgRFhfQVNGTEFHUyAgICs9IC1kX19OVF9EUklWRVJfXworLklGICQoVVNFX1cyS0RSVikJCQkJIyBCdWlsZCAzMiBiaXQgV2luZG93cyAyMDAwIGRyaXZlcgorICAgTElCX09TICAgICAgID0gVzJLRFJWCisuRUxTRQorICAgTElCX09TICAgICAgID0gTlREUlYKKy5FTkRJRgorLkVMSUYgJChVU0VfV0lOMzIpICAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIE5UIGFwcAorLklGICQoV0lOMzJfR1VJKQorLkVMU0UKKyAgICBDRkxBR1MgICAgICAgKz0gLURfX0NPTlNPTEVfXworLkVORElGCisuSUYgJChCVUlMRF9ETEwpCisgICBDRkxBR1MgICAgICAgKz0gL01UIC9MRCAvREJVSUxEX0RMTAorICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCisuSUYgJChOT19SVU5USU1FKQorICAgTERFTkRGTEFHUyAgICs9IC9OT0RFRkFVTFRMSUIKKyAgIENGTEFHUyAJCSs9IC9abAorICAgREVGX0xJQlMJCTo9CisuRUxTRQorICAgREVGX0xJQlMJCTo9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd2lubW0ubGliIGNvbWRsZzMyLmxpYiBjb21jdGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB2ZXJzaW9uLmxpYiB3aW5zcG9vbC5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgd3NvY2szMi5saWIgcnBjcnQ0LmxpYgorLkVORElGCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC9NVAorICAgREVGX0xJQlMJCTo9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd2lubW0ubGliIGNvbWRsZzMyLmxpYiBjb21jdGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB2ZXJzaW9uLmxpYiB3aW5zcG9vbC5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgd3NvY2szMi5saWIgcnBjcnQ0LmxpYgorLkVORElGCisgICBEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTkRPV1MzMl9fCisgICBMSUJfT1MgICAgICAgPSBXSU4zMgorLkVMSUYgJChVU0VfUlRUQVJHRVQpCisgICBDRkxBR1MgICAgICAgKz0gLURfX1JUVEFSR0VUX18KKyAgIERYX0NGTEFHUyAgICArPQorICAgRFhfQVNGTEFHUyAgICs9IC1kX19SVFRBUkdFVF9fCisgICBVU0VfUkVBTERPUwk6PQorICAgTElCX09TICAgICAgID0gUlRUMzIKKyAgIERFRl9MSUJTICAgICA6PSBjdzMybXQubGliCisuRUxTRQorICAgVVNFX1ROVCAgICAgIDo9IDEKKyAgIFVTRV9SRUFMRE9TCTo9IDEKKyAgIENGTEFHUyAgICAgICArPSAvTVQgL0RfX01TRE9TMzJfXworICAgRFhfQ0ZMQUdTICAgICs9IC1EVE5UCisgICBEWF9BU0ZMQUdTICAgKz0gLWRUTlQKKyAgIExJQl9PUyAgICAgICA9IERPUzMyCisgICBERUZfTElCUwkJOj0gZG9zeDMyLmxpYiB0bnRhcGkubGliCisuRU5ESUYKKworIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCisKKy5JRiAkKENIRUNLRUQpCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCitDRkxBR1MJCQkrPSAvRENIRUNLRUQ9MQorLkVMU0UKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQorLkVORElGCisKKyMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcworICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQorICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfVE5UKQorUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0U6cy9cL1xcKVxcdG50XFxwbS5saWIKKy5FTFNFCitQTUxJQiAgICAgICAgICAgOj0gJChMSUJfQkFTRTpzL1wvXFwpXFxwbS5saWIKKy5FTkRJRgorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gdmMzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzE2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMTYubWsKQEAgLTAsMCArMSwxNDEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBXYXRjb20gQysrIDEwLnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2LWJpdCBET1MsCisjICAgICAgICAgICAgICAgMTYtYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQgYW5kIDE2LWJpdCBPUy8yIGRldmVsb3BtZW50LgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCisuSU1QT1JUOiBTQ0lURUNICisuSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKKworIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCisuSU1QT1JUIC5JR05PUkUgOiBXQ19MSUJCQVNFIFVTRV9XSU4xNiBVU0VfT1MyMTYgVVNFX09TMkdVSQorCisjIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKKyAgIENDICAgICAgICAgICA6PSB3Y2MgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCisgICBDUFAgICAgICAgICAgOj0gd3BwICAgICAgIyBDKystY29tcGlsZXIgYW5kIGZsYWdzCisgICBDRkxBR1MgICAgICAgOj0gLW1sLXpxLWotdzItcy1maCAtZmhxCisuSUYgJChVU0VfVEFTTTMyKQorICAgQVMgICAgICAgICAgIDo9IHRhc20zMgorLkVMSUYgJChVU0VfVEFTTVgpCisgICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisuRUxTRQorICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncworLkVORElGCisgICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCisgICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19MQVJHRV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQorICAgTEQgICAgICAgICAgIDo9IHdsaW5rICAgICMgTG9hZGVyIGFuZCBmbGFncworICAgTERGTEFHUyAgICAgICA9CisgICBSQyAgICAgICAgICAgOj0gd3JjICAgICAgIyBXYXRjb20gcmVzb3VyY2UgY29tcGlsZXIKKyAgIFJDRkxBR1MgICAgICA6PSAvYnQ9d2luZG93cworICAgTElCICAgICAgICAgIDo9IHdsaWIgICAgICMgTGlicmFyaWFuCisgICBMSUJGTEFHUyAgICAgOj0gLXEKKyAgIElMSUIgICAgICAgICA6PSB3bGliICAgICAjIEltcG9ydCBsaWJyYXJpYW4KKyAgIElMSUJGTEFHUyAgICA6PSAtYworCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy5JRiAkKERCRykKKyAgIENGTEFHUyAgICAgICArPSAtZDIgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCisgICBMSUJGTEFHUyAgICAgKz0gLXA9MTI4ICAgIyBMYXJnZXIgcGFnZSBzaXplIGZvciBsaWJyYXJpZXMgd2l0aCBkZWJ1ZyBpbmZvIQorICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgorICAgTERGTEFHUyAgICAgICs9IEQgQSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGxpbmtlcgorLkVMU0UKKyAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucworLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01CisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTUKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucyBvcHRpbWlzZWQgZm9yIFBlbnRpdW0KKworLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC1mcGk4Ny1mcDUtREZQVTM4NworICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3CisuRU5ECisKKyMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0CisuSUYgJChCRVRBKQorICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQorICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQorLkVORAorCisjIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQKKworLklGICQoU1RLU0laRSkKKyAgICBMREZMQUdTICAgICArPSBPUCBTVEFDSz0kKFNUS1NJWkUpCisuRU5ESUYKKworLklGICQoVVNFX09TMjE2KQorLklGICQoQlVJTERfRExMKQorICAgIENGTEFHUyAgICAgICArPSAtYmQtYnQ9b3MyLURCVUlMRF9ETEwKKyAgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKKy5FTFNFCisgICAgQ0ZMQUdTICAgICAgICs9IC1idD1vczIKKy5FTkRJRgorICAgIERYX0FTRkxBR1MgICArPSAtRF9fT1MyMTZfXworICAgIExJQl9PUyAgICAgICA9IG9zMjE2CisuRUxJRiAkKFVTRV9XSU4xNikKKy5JRiAkKEJVSUxEX0RMTCkKKyAgICBDRkxBR1MgICAgICAgKz0gLWJkLWJ0PXdpbmRvd3MtRF9XSU5ET1dTLURCVUlMRF9ETEwKKyAgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKKy5FTFNFCisgICAgQ0ZMQUdTICAgICAgICs9IC1idD13aW5kb3dzLURfV0lORE9XUworLkVORElGCisgICAgRFhfQVNGTEFHUyAgICs9IC1EX19XSU5ET1dTMTZfXworICAgIExJQl9PUyAgICAgICA9IFdJTjE2CisuRUxTRQorICAgIFVTRV9SRUFMRE9TICA6PSAxCisJTElCX09TICAgICAgID0gRE9TMTYKKy5FTkQKKworIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCisKK1BNTElCICAgICAgICAgICA6PSBwbS5saWIsCisKKyMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcworCisuSUYgJChDSEVDS0VEKQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZworQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKKy5FTFNFCitMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKKy5FTkRJRgorCisjIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKKyAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoV0NfTElCQkFTRSkKKyAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQorCisjIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcworCisgICBSVUxFU19NQUsJOj0gd2MxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMzIubWsKQEAgLTAsMCArMSwzNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorIworIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKKyMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAorIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCisjICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KKyMKKyMgICAgICAgICAgICAgICBXYXRjb20gQysrIDEwLnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFJhdGlvbmFsJ3MgRE9TNEdXCisjICAgICAgICAgICAgICAgRE9TIEV4dGVuZGVyLCBQTU9ERS9XLCBDYXVzZXdheSwgRmxhc2hUZWsncyBYMzItVk0sCisjICAgICAgICAgICAgICAgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyLCAzMi1iaXQgV2luZG93cyBkZXZlbG9wbWVudCBhbmQKKyMJCQkJMzItYml0IE9TLzIgZGV2ZWxvcG1lbnQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKKy5JTVBPUlQ6IFNDSVRFQ0gKKy5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgorCisjIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKKy5JTVBPUlQgLklHTk9SRSA6IFVTRV9UTlQgVVNFX1gzMiBVU0VfWDMyVk0gVVNFX1BNT0RFVyBTVEtDQUxMIFVTRV9DQVVTRVdBWQorLklNUE9SVCAuSUdOT1JFIDogVVNFX1dJTjM4NiBVU0VfT1MyMzIgVVNFX09TMkdVSSBXQ19MSUJCQVNFIE5PT1BUIERPU1NUWUxFCisuSU1QT1JUIC5JR05PUkUgOiBPUzJfU0hFTEwgVVNFX0NPREVWSUVXIFVTRV9ET1MzMkEgVVNFX1FOWDQgTEVBVkVfTElOS0ZJTEUKKworIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50CisgICBfMzJCSVRfICAgICAgOj0gMQorCisjIFNldHVwIHNwZWNpYWwgZW52aXJvbm1lbnQgZm9yIFFOWCA0IChVbml4J2lzaCkKKy5JRiAkKFVTRV9RTlg0KQorICAgVVNFX1FOWCAgICAJOj0gMQorICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCisgICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQorICAgTEwgICAgICAgICAgIDo9IGxpYgkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisgICBMRSAgICAgICAgICAgOj0gLmEJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCisuRU5ESUYKKworIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCisgICBDQyAgICAgICAgICAgOj0gd2NjMzg2CisgICBDUFAgICAgICAgICAgOj0gd3BwMzg2CisgICBDRkxBR1MgICAgICAgOj0gLXpxLWotcy1mcGk4NworLklGICQoVVNFX05BU00pCisgICBBUwkJCTo9IG5hc20KKyAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQorLkVMU0UKKy5JRiAkKFVTRV9UQVNNMzIpCisgICBBUyAgICAgICAgICAgOj0gdGFzbTMyCisgICBETExfVEFTTSAgICAgOj0gdGFzbTMyCisuRUxJRiAkKFVTRV9UQVNNWCkKKyAgIEFTICAgICAgICAgICA6PSB0YXNteAorICAgRExMX1RBU00gICAgIDo9IHRhc214CisuRUxTRQorICAgQVMgICAgICAgICAgIDo9IHRhc20KKyAgIERMTF9UQVNNICAgICA6PSB0YXNtCisuRU5ESUYKKyAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCisgICBHQVMJCQk6PSBnY2MKKyAgIEdBU19GTEFHUyAJOj0gLURfX1dBVENPTUNfXyAtRF9fU1dfM1MgLURfX1NXX1MgLVVfX0dOVUNfXyAtVURKR1BQIC1VX191bml4X18gLVdhbGwgLUkuIC1JJChTQ0lURUNIKVxpbmNsdWRlIC14IGFzc2VtYmxlci13aXRoLWNwcAorLkVORElGCisgICBMRCAgICAgICAgICAgOj0gd2xpbmsKKyAgIExERkxBR1MgICAgICAgPQorLklGICQoVVNFX09TMjMyKQorICAgUkMgICAgICAgICAgIDo9IHJjCisuRUxTRQorICAgUkMgICAgICAgICAgIDo9IHdyYworLkVORElGCisuSUYgJChVU0VfV0lOMzIpCisgICBSQ0ZMQUdTICAgICAgOj0gLXEgL2J0PW50CisuRUxJRiAkKFVTRV9PUzIzMikKKy5JRiAkKFVTRV9PUzJHVUkpCisgICBDRkxBR1MJCSs9IC1EX19PUzJfUE1fXworLkVORElGCisuRUxTRQorICAgUkNGTEFHUyAgICAgIDo9IC1xCisuRU5ESUYKKyAgIExJQiAgICAgICAgICA6PSB3bGliCisgICBMSUJGTEFHUyAgICAgOj0gLXEKKyAgIElMSUIgICAgICAgICA6PSB3bGliCisgICBJTElCRkxBR1MgICAgOj0gLWMKKyAgIElOVEVMX1g4Ngk6PSAxCisKKyMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCisuSUYgJChNQVhfV0FSTikKKyAgIENGTEFHUyAgICAgICArPSAtdzQKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLXcxCisuRU5ESUYKKworIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uIChDb2RldmlldyBmb3JtYXQpCisuSUYgJChEQkcpCisuSUYgJChVU0VfV0lOMzIpCisuSUYgJChVU0VfQ09ERVZJRVcpCisgICBDRkxBR1MgICAgICAgKz0gLWQyIC1oYworICAgTERGTEFHUyAgICAgICs9IEQgQ09ERVZJRVcgT1BUIENWUEFDSworLkVMU0UKKyAgIENGTEFHUyAgICAgICArPSAtZDIKKyAgIExERkxBR1MJCSs9IEQgQQorLkVORElGCisuRUxTRQorICAgQ0ZMQUdTICAgICAgICs9IC1kMgorICAgTERGTEFHUwkJKz0gRCBBCisuRU5ESUYKKyAgIExJQkZMQUdTICAgICArPSAtcD03NjgKKy5JRiAkKFVTRV9OQVNNKQorICAgQVNGTEFHUyAgICAgICs9IC1GIGJvcmxhbmQgLWcKKy5FTFNFCisuSUYgJChVU0VfVEFTTTMyKQorICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00zMiBmdWNrcyB1cCBXYXRjb20gQysrIGRlYnVnIGluZm8KKy5FTElGICQoT1MyX1NIRUxMKQorICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00gZm9yIE9TLzIgZnVja3MgdXAgV2F0Y29tIEMrKyBkZWJ1ZyBpbmZvCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC96aQorLkVORElGCisuRU5ESUYKKy5FTFNFCisuSUYgJChVU0VfTkFTTSkKKyAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCisuRUxTRQorICAgQVNGTEFHUyAgICAgICs9IC9xCisuRU5ESUYKKy5FTkQKKworIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucyAod2l0aCBvciB3aXRob3V0IHN0YWNrIGNvbnZlbnRpb25zKQorLklGICQoU1RLQ0FMTCkKKy5JRiAkKE9QVCkKKyAgIENGTEFHUyAgICAgICArPSAtb25hdHgtNXMtZnA1CisuRUxJRiAkKE9QVF9TSVpFKQorICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTVzLWZwNQorLkVMSUYgJChOT09QVCkKKyAgIENGTEFHUyAgICAgICArPSAtb2QtNXMKKy5FTFNFCisgICBDRkxBR1MgICAgICAgKz0gLTNzCisuRU5ECisuRUxTRQorLklGICQoT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKKy5FTElGICQoT1BUX1NJWkUpCisgICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1CisuRUxJRiAkKE5PT1BUKQorICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgorLkVORAorLkVORAorCisjIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQorLklGICQoRlBVKQorICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3CisgICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKKy5FTkQKKworIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKKy5JRiAkKEJFVEEpCisgICBDRkxBR1MgICAgICAgKz0gLURCRVRBCisgICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCisuRU5ECisKKy5JRiAkKFVTRV9UTlQpICAgICAgICAgICAgICAgICAgIyBVc2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCisJQ0ZMQUdTICAgICAgICs9IC1idD1udCAtRFROVAorCUFTRkxBR1MgICAJICs9IC1kVE5UCisJTERGTEFHUyAgICAgICs9IFNZUyBOVCBPUCBTVFVCPUdPVE5ULkVYRQorCUxJQl9PUyAgICAgICA9IERPUzMyCisuRUxJRiAkKFVTRV9YMzJWTSkgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzJWTSBET1MgZXh0ZW5kZXIKKwlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcworCUxERkxBR1MgICAgICArPSBTWVMgWDMyUlYKKyAgICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQorCURYX0FTRkxBR1MgICArPSAtZFgzMlZNCisgICAgTElCX09TICAgICAgID0gRE9TMzIKKy5FTElGICQoVVNFX1gzMikgICAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMiBET1MgZXh0ZW5kZXIKKwlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcworCUxERkxBR1MgICAgICArPSBTWVMgWDMyUgorICAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCisJRFhfQVNGTEFHUyAgICs9IC1kWDMyVk0KKyAgICBMSUJfT1MgICAgICAgPSBET1MzMgorLkVMSUYgJChVU0VfUU5YNCkgICAgICAgICAgICAgICAjIEJ1aWxkIFFOWCA0IGFwcAorCUNGTEFHUyAgICAgICArPSAtYnQ9cW54Mzg2CisJTERGTEFHUyAgICAgICs9IFNZUyBRTlgzODZGTEFUIE9QIENBU0VFWEFDVCBPUCBPRkZTRVQ9NDBrIE9QIFNUQUNLPTMyaworICAgIENGTEFHUyAgICAJICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCisJQVNGTEFHUyAgIAkgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KKyAgICBMSUJfT1MgICAgICAgPSBRTlg0CisuRUxJRiAkKFVTRV9PUzIzMikKKy5JRiAkKEJVSUxEX0RMTCkKKwlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW9zMi1zZy1EQlVJTERfRExMCisJQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCisuRUxTRQorCUNGTEFHUyAgICAgICArPSAtYm0tYnQ9b3MyLXNnCisuRU5ESUYKKwlEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCisgICAgTElCX09TICAgICAgID0gb3MyMzIKKy5FTElGICQoVVNFX1NOQVApICAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAKKy5JRiAkKEJVSUxEX0RMTCkKKwlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LURCVUlMRF9ETEwKKwlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisJQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1EX1dJTjMyCisuRU5ESUYKKwlMREZMQUdTCSAgICAgKz0gT1Agbm9kZWZhdWx0bGlicworLklGICQoU1RLQ0FMTCkKKwlERUZMSUJTCQkgOj0gY2xpYjNzLmxpYixtYXRoM3MubGliLG5vZW11Mzg3LmxpYiwKKy5FTFNFCisJREVGTElCUwkJIDo9IGNsaWIzci5saWIsbWF0aDNyLmxpYixub2VtdTM4Ny5saWIsCisuRU5ESUYKKwlMSUJfT1MgICAgICAgPSBTTkFQCisuRUxJRiAkKFVTRV9XSU4zMikgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgYXBwCisuSUYgJChXSU4zMl9HVUkpCisuRUxTRQorICAgIENGTEFHUyAgICAgICArPSAtRF9fQ09OU09MRV9fCisuRU5ESUYKKy5JRiAkKEJVSUxEX0RMTCkKKwlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LXNnLURCVUlMRF9ETEwgLURfV0lOMzIKKwlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisJQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1zZy1EX1dJTjMyCisuRU5ESUYKKwlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTkRPV1MzMl9fCisJTElCX09TICAgICAgID0gV0lOMzIKKyAgICBERUZMSUJTCSAgICAgOj0ga2VybmVsMzIubGliLHVzZXIzMi5saWIsZ2RpMzIubGliLGFkdmFwaTMyLmxpYixzaGVsbDMyLmxpYix3aW5tbS5saWIsY29tZGxnMzIubGliLGNvbWN0bDMyLmxpYixvbGUzMi5saWIsb2xlYXV0MzIubGliLHZlcnNpb24ubGliLHdpbnNwb29sLmxpYix1dWlkLmxpYix3c29jazMyLmxpYixycGNydDQubGliLAorLkVMSUYgJChVU0VfV0lOMzg2KSAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW4zODYgZXh0ZW5kZWQgYXBwCisuSUYgJChCVUlMRF9ETEwpCisgICAgQ0ZMQUdTICAgICAgICs9IC1iZC1idD13aW5kb3dzLURCVUlMRF9ETEwKKwlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKKy5FTFNFCisgICAgQ0ZMQUdTICAgICAgICs9IC1idD13aW5kb3dzCisuRU5ESUYKKwlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTjM4Nl9fCisgICAgTElCX09TICAgICAgID0gV0lOMzg2CisuRUxJRiAkKFVTRV9QTU9ERVcpICAgICAgICAgICAgICMgUE1PREUvVworCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCisJVVNFX0RPUzRHVyAgIDo9IDEKKwlVU0VfUkVBTERPUyAgOj0gMQorCUxERkxBR1MgICAgICArPSBTWVMgUE1PREVXCisJRFhfQ0ZMQUdTICAgICs9IC1ERE9TNEdXCisJRFhfQVNGTEFHUyAgICs9IC1kRE9TNEdXCisJTElCX09TICAgICAgID0gRE9TMzIKKy5FTElGICQoVVNFX0NBVVNFV0FZKSAgICAgICAgICAgIyBDYXVzZXdheQorCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCisJVVNFX0RPUzRHVyAgIDo9IDEKKwlVU0VfUkVBTERPUyAgOj0gMQorCUxERkxBR1MgICAgICArPSBTWVMgQ0FVU0VXQVkKKwlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKKwlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKKwlMSUJfT1MgICAgICAgPSBET1MzMgorLkVMSUYgJChVU0VfRE9TMzJBKSAgICAgICAgICAgICAjIERPUzMyL0EKKwlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcworCVVTRV9ET1M0R1cgICA6PSAxCisJVVNFX1JFQUxET1MgIDo9IDEKKwlMREZMQUdTICAgICAgKz0gU1lTIERPUzMyQQorCURYX0NGTEFHUyAgICArPSAtRERPUzRHVworCURYX0FTRkxBR1MgICArPSAtZERPUzRHVworCUxJQl9PUyAgICAgICA9IERPUzMyCisuRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIERPUzRHVworCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCisJVVNFX0RPUzRHVyAgIDo9IDEKKwlVU0VfUkVBTERPUyAgOj0gMQorCUxERkxBR1MgICAgICArPSBTWVMgRE9TNEcKKwlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKKwlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKKwlMSUJfT1MgICAgICAgPSBET1MzMgorLkVORAorCisjIERpc2FibGUgbGlua2luZyB0byBkZWZhdWx0IEMgcnVudGltZSBsaWJyYXJ5IGFuZCBQTSBsaWJyYXJ5CisKKy5JRiAkKE5PX1JVTlRJTUUpCitMREZMQUdTCQkJICs9IE9QIG5vZGVmYXVsdGxpYnMKK0RFRkxJQlMgICAgICAgICAgOj0KKy5FTFNFCisKKyMgUGxhY2UgdG8gbG9vayBmb3IgUE0gbGlicmFyeSBmaWxlcworCisuSUYgJChVU0VfU05BUCkgICAgICAgICAgICAgICAJIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAgb3IgZGxsCitQTUxJQiAgICAgICAgICAgOj0KKy5FTElGICQoVVNFX1dJTjMyKQorLklGICQoU1RLQ0FMTCkKK1BNTElCICAgICAgICAgICA6PSBzcG0ubGliLAorLkVMU0UKK1BNTElCICAgICAgICAgICA6PSBwbS5saWIsCisuRU5ESUYKKy5FTElGICQoVVNFX09TMjMyKQorLklGICQoU1RLQ0FMTCkKKy5JRiAkKFVTRV9PUzJHVUkpCitQTUxJQiAgICAgICAgICAgOj0gc3BtX3BtLmxpYiwKKy5FTFNFCitQTUxJQiAgICAgICAgICAgOj0gc3BtLmxpYiwKKy5FTkRJRgorLkVMU0UKKy5JRiAkKFVTRV9PUzJHVUkpCitQTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliLAorLkVMU0UKK1BNTElCICAgICAgICAgICA6PSBwbS5saWIsCisuRU5ESUYKKy5FTkRJRgorLkVMSUYgJChVU0VfUU5YNCkKKy5JRiAkKFNUS0NBTEwpCitQTUxJQiAgICAgICAgICAgOj0gbGlic3BtLmEsCisuRUxTRQorUE1MSUIgICAgICAgICAgIDo9IGxpYnBtLmEsCisuRU5ESUYKKy5FTElGICQoVVNFX1ROVCkKKy5JRiAkKFNUS0NBTEwpCitQTUxJQiAgICAgICAgICAgOj0gdG50XHNwbS5saWIsCisuRUxTRQorUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIsCisuRU5ESUYKKy5FTElGICQoVVNFX1gzMikKKy5JRiAkKFNUS0NBTEwpCitQTUxJQiAgICAgICAgICAgOj0geDMyXHNwbS5saWIsCisuRUxTRQorUE1MSUIgICAgICAgICAgIDo9IHgzMlxwbS5saWIsCisuRU5ESUYKKy5FTFNFCisuSUYgJChTVEtDQUxMKQorUE1MSUIgICAgICAgICAgIDo9IGRvczRnd1xzcG0ubGliLAorLkVMU0UKK1BNTElCICAgICAgICAgICA6PSBkb3M0Z3dccG0ubGliLAorLkVORElGCisuRU5ESUYKKy5FTkRJRgorCisjIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKKworLklGICQoQ0hFQ0tFRCkKK0xJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKK0NGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCisuRUxTRQorTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCisuRU5ESUYKKworIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCisgICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFdDX0xJQkJBU0UpCisgICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKKworICAgIExERkxBR1MgKz0gb3AgbWFwCisKKyMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCisKKyAgIFJVTEVTX01BSwk6PSB3YzMyLm1rCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmVzeXMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmVzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdlYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iZXN5cy5jCkBAIC0wLDAgKzEsNDA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIEJJT1MgZW11bGF0b3IgSS9PIGFuZCBtZW1vcnkgYWNjZXNzCisqICAgICAgICAgICAgICAgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1hY3JvcyB0byByZWFkIGFuZCB3cml0ZSB2YWx1ZXMgdG8geDg2IGJ1cyBtZW1vcnkuIFJlcGxhY2UgdGhlc2UgYXMKKyAqIG5lY2Vzc2FyeSBpZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCB0byBhY2Nlc3MgbWVtb3J5IG92ZXIKKyAqIHRoZSBidXMgb24gYSBwYXJ0aWN1bGFyIHByb2Nlc3NvciBmYW1pbHkuCisgKi8KKworI2RlZmluZSByZWFkYihiYXNlLG9mZikgICAgICooKHU4KikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCisjZGVmaW5lIHJlYWR3KGJhc2Usb2ZmKSAgICAgKigodTE2KikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCisjZGVmaW5lIHJlYWRsKGJhc2Usb2ZmKSAgICAgKigodTMyKikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCisjZGVmaW5lIHdyaXRlYih2LGJhc2Usb2ZmKSAgKigodTgqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKKyNkZWZpbmUgd3JpdGV3KHYsYmFzZSxvZmYpICAqKCh1MTYqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKKyNkZWZpbmUgd3JpdGVsKHYsYmFzZSxvZmYpICAqKCh1MzIqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBERUJVR19NRU0oKSAgICAgICAgKE0ueDg2LmRlYnVnICYgREVCVUdfTUVNX1RSQUNFX0YpCisjZWxzZQorIyBkZWZpbmUgREVCVUdfTUVNKCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitCeXRlIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIGJ5dGUgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggWDg2QVBJIEJFX3JkYigKKyAgICB1MzIgYWRkcikKK3sKKyAgICB1OCB2YWwgPSAwOworCisgICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworICAgICAgICB2YWwgPSAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisgICAgICAgIHZhbCA9IHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMSkgeworREIoICAgICBwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQorICAgICAgICBIQUxUX1NZUygpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHZhbCA9ICoodTgqKShNLm1lbV9iYXNlICsgYWRkcik7CisgICAgICAgIH0KK0RCKCBpZiAoREVCVUdfTUVNKCkpCisgICAgICAgIHByaW50aygiJSMwOHggMSAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQorICAgIHJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKKworUkVUVVJOUzoKK1dvcmQgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KKworUkVNQVJLUzoKK1JlYWRzIGEgd29yZCB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgWDg2QVBJIEJFX3JkdygKKyAgICB1MzIgYWRkcikKK3sKKyAgICB1MTYgdmFsID0gMDsKKworICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgYWRkciAtPSAweEMwMDAwOworICAgICAgICAgICAgdmFsID0gKCAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyKSB8CisgICAgICAgICAgICAgICAgICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgdmFsID0gKih1MTYqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgYWRkciAtPSAweEEwMDAwOworICAgICAgICAgICAgdmFsID0gKCByZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKSB8CisgICAgICAgICAgICAgICAgICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKSA8PCA4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgdmFsID0gcmVhZHcoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOworICAgICAgICB9CisgICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAyKSB7CitEQiggICAgIHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgdmFsID0gKCAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpIHwKKyAgICAgICAgICAgICAgICAgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHZhbCA9ICoodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpOworICAgICAgICB9CitEQiggaWYgKERFQlVHX01FTSgpKQorICAgICAgICBwcmludGsoIiUjMDh4IDIgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKKyAgICByZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSBCRV9yZGwoCisgICAgdTMyIGFkZHIpCit7CisgICAgdTMyIHZhbCA9IDA7CisKKyAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgICAgICAgaWYgKGFkZHIgJiAweDMpIHsKKyAgICAgICAgICAgIGFkZHIgLT0gMHhDMDAwMDsKKyAgICAgICAgICAgIHZhbCA9ICggKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDApIHwKKyAgICAgICAgICAgICAgICAgICAoKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDEpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAoKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAzKSA8PCAyNCkpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHZhbCA9ICoodTMyKikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgICAgICAgaWYgKGFkZHIgJiAweDMpIHsKKyAgICAgICAgICAgIGFkZHIgLT0gMHhBMDAwMDsKKyAgICAgICAgICAgIHZhbCA9ICggcmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkcikgfAorICAgICAgICAgICAgICAgICAgIChyZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSkgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgICAocmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAzKSA8PCAyNCkpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHZhbCA9IHJlYWRsKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gNCkgeworREIoICAgICBwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQorICAgICAgICBIQUxUX1NZUygpOworICAgICAgICB9CisgICAgZWxzZSB7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgICAgICAgaWYgKGFkZHIgJiAweDMpIHsKKyAgICAgICAgICAgIHZhbCA9ICggKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgfAorICAgICAgICAgICAgICAgICAgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpIDw8IDI0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgdmFsID0gKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcik7CisgICAgICAgIH0KK0RCKCBpZiAoREVCVUdfTUVNKCkpCisgICAgICAgIHByaW50aygiJSMwOHggNCAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQorICAgIHJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV93cmIoCisgICAgdTMyIGFkZHIsCisgICAgdTggdmFsKQoreworREIoIGlmIChERUJVR19NRU0oKSkKKyAgICAgICAgcHJpbnRrKCIlIzA4eCAxIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCisgICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworICAgICAgICAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCkgPSB2YWw7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisgICAgICAgIHdyaXRlYih2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTEpIHsKK0RCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3J3KAorICAgIHUzMiBhZGRyLAorICAgIHUxNiB2YWwpCit7CitEQiggaWYgKERFQlVHX01FTSgpKQorICAgICAgICBwcmludGsoIiUjMDh4IDIgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKKyAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgICAgICAgaWYgKGFkZHIgJiAweDEpIHsKKyAgICAgICAgICAgIGFkZHIgLT0gMHhDMDAwMDsKKyAgICAgICAgICAgICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gMCkgJiAweGZmOworICAgICAgICAgICAgKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgKih1MTYqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKSA9IHZhbDsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgYWRkciAtPSAweEEwMDAwOworICAgICAgICAgICAgd3JpdGViKHZhbCA+PiAwLCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKTsKKyAgICAgICAgICAgIHdyaXRlYih2YWwgPj4gOCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHdyaXRldyh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTIpIHsKK0RCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+IDApICYgMHhmZjsKKyAgICAgICAgICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX3dybCgKKyAgICB1MzIgYWRkciwKKyAgICB1MzIgdmFsKQoreworREIoIGlmIChERUJVR19NRU0oKSkKKyAgICAgICAgcHJpbnRrKCIlIzA4eCA0IDwtICUjeFxuIiwgYWRkciwgdmFsKTspCisgICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworI2lmZGVmIF9fQklHX0VORElBTl9fCisgICAgICAgIGlmIChhZGRyICYgMHgxKSB7CisgICAgICAgICAgICBhZGRyIC09IDB4QzAwMDA7CisgICAgICAgICAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gIDApICYgMHhmZjsKKyAgICAgICAgICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiAgOCkgJiAweGZmOworICAgICAgICAgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAzKSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAqKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCkgPSB2YWw7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgICAgICAgaWYgKGFkZHIgJiAweDMpIHsKKyAgICAgICAgICAgIGFkZHIgLT0gMHhBMDAwMDsKKyAgICAgICAgICAgIHdyaXRlYih2YWwgPj4gIDAsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpOworICAgICAgICAgICAgd3JpdGViKHZhbCA+PiAgOCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOworICAgICAgICAgICAgd3JpdGViKHZhbCA+PiAxNiwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOworICAgICAgICAgICAgd3JpdGViKHZhbCA+PiAyNCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHdyaXRlbCh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTQpIHsKK0RCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworICAgICAgICBpZiAoYWRkciAmIDB4MSkgeworICAgICAgICAgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+ICAwKSAmIDB4ZmY7CisgICAgICAgICAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKKyAgICAgICAgICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpID0gKHZhbCA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPSAodmFsID4+IDI0KSAmIDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7CisgICAgICAgIH0KK30KKworLyogRGVidWcgZnVuY3Rpb25zIHRvIGRvIElTQS9QQ0kgYnVzIHBvcnQgSS9PICovCisKKyNpZmRlZiAgREVCVUcKKyNkZWZpbmUgREVCVUdfSU8oKSAgICAgICAgICAoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQorCit1OCBYODZBUEkgQkVfaW5iKGludCBwb3J0KQoreworICAgIHU4IHZhbCA9IFBNX2lucGIocG9ydCk7CisgICAgaWYgKERFQlVHX0lPKCkpCisgICAgICAgIHByaW50aygiJTA0WDolMDRYOiAgaW5iLiUwNFggLT4gJTAyWFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKKyAgICByZXR1cm4gdmFsOworfQorCit1MTYgWDg2QVBJIEJFX2ludyhpbnQgcG9ydCkKK3sKKyAgICB1MTYgdmFsID0gUE1faW5wdyhwb3J0KTsKKyAgICBpZiAoREVCVUdfSU8oKSkKKyAgICAgICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbncuJTA0WCAtPiAlMDRYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOworICAgIHJldHVybiB2YWw7Cit9CisKK3UzMiBYODZBUEkgQkVfaW5sKGludCBwb3J0KQoreworICAgIHUzMiB2YWwgPSBQTV9pbnBkKHBvcnQpOworICAgIGlmIChERUJVR19JTygpKQorICAgICAgICBwcmludGsoIiUwNFg6JTA0WDogIGlubC4lMDRYIC0+ICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKK30KKwordm9pZCBYODZBUEkgQkVfb3V0YihpbnQgcG9ydCwgdTggdmFsKQoreworICAgIGlmIChERUJVR19JTygpKQorICAgICAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0Yi4lMDRYIDwtICUwMlhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7CisgICAgUE1fb3V0cGIocG9ydCx2YWwpOworfQorCit2b2lkIFg4NkFQSSBCRV9vdXR3KGludCBwb3J0LCB1MTYgdmFsKQoreworICAgIGlmIChERUJVR19JTygpKQorICAgICAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0dy4lMDRYIDwtICUwNFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7CisgICAgUE1fb3V0cHcocG9ydCx2YWwpOworfQorCit2b2lkIFg4NkFQSSBCRV9vdXRsKGludCBwb3J0LCB1MzIgdmFsKQoreworICAgIGlmIChERUJVR19JTygpKQorICAgICAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0bC4lMDRYIDwtICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7CisgICAgUE1fb3V0cGQocG9ydCx2YWwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKKyogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIEJJT1Mgc3BlY2lmaWMgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8gICAtIEludGVycnVwdCBudW1iZXIgYmVpbmcgc2VydmljZWQKKworUkVNQVJLUzoKK0hhbmRsZXIgZm9yIHVuZGVmaW5lZCBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSB1bmRlZmluZWRfaW50cigKKyAgICBpbnQgaW50bm8pCit7CisgICAgaWYgKEJFX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykKKyAgICAgICAgcHJpbnRrKCJiaW9zRW11OiB1bmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQhXG4iLGludG5vKTsKKyAgICBlbHNlCisgICAgICAgIFg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGggKHRoZSBkZWZhdWx0IGlzIHN0b3JlZAoraW4gdGhlIEludCA0MmggdmVjdG9yIGJ5IHRoZSBzeXN0ZW0gQklPUyBhdCBib290dXApLiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlCithIHNtYWxsIG51bWJlciBvZiBzcGVjaWFsIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCSU9TIGR1cmluZyBQT1NUIHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKAorICAgIGludCBpbnRubykKK3sKKyAgICBpZiAoTS54ODYuUl9BSCA9PSAweDEyICYmIE0ueDg2LlJfQkwgPT0gMHgzMikgeworICAgICAgICBpZiAoTS54ODYuUl9BTCA9PSAwKSB7CisgICAgICAgICAgICAvKiBFbmFibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworICAgICAgICAgICAgUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpIHwgKHU4KTB4MDIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChNLng4Ni5SX0FMID09IDEpIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworICAgICAgICAgICAgUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpICYgKHU4KX4weDAyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyNpZmRlZiAgREVCVUcKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmludGsoImJpb3NFbXUvYmlvcy5pbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0weDEyLCBCTD0weDMyLCBBTD0lIzAyeFxuIixNLng4Ni5SX0FMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisjaWZkZWYgIERFQlVHCisgICAgZWxzZSB7CisgICAgICAgIHByaW50aygiYmlvc0VtdS9iaW9zLmludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPSUjMDJ4LCBBTD0lIzAyeCwgQkw9JSMwMnhcbiIsTS54ODYuUl9BSCwgTS54ODYuUl9BTCwgTS54ODYuUl9CTCk7CisgICAgICAgIH0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaC4gSWYgdGhlIFBPU1QgY29kZQoraGFzIG5vdCB5ZXQgcmUtdmVjdG9yZWQgdGhlIEludCAxMGggQklPUyBpbnRlcnJ1cHQgdmVjdG9yLCB3ZSBoYW5kbGUgdGhpcworYnkgc2ltcGx5IGNhbGxpbmcgdGhlIGludDQyIGludGVycnVwdCBoYW5kbGVyIGFib3ZlLiBWZXJ5IGVhcmx5IGluIHRoZQorQklPUyBQT1NUIHByb2Nlc3MsIHRoZSB2ZWN0b3IgZ2V0cyByZXBsYWNlZCBhbmQgd2Ugc2ltcGx5IGxldCB0aGUgcmVhbAorbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciBwcm9jZXNzIHRoZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDEwKAorICAgIGludCBpbnRubykKK3sKKyAgICBpZiAoQkVfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQorICAgICAgICBpbnQ0MihpbnRubyk7CisgICAgZWxzZQorICAgICAgICBYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Cit9CisKKy8qIFJlc3VsdCBjb2RlcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MgKi8KKworI2RlZmluZSBTVUNDRVNTRlVMICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRlVOQ19OT1RfU1VQUE9SVCAgICAweDgxCisjZGVmaW5lIEJBRF9WRU5ET1JfSUQgICAgICAgMHg4MworI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgIDB4ODYKKyNkZWZpbmUgQkFEX1JFR0lTVEVSX05VTUJFUiAweDg3CisjZGVmaW5lIFNFVF9GQUlMRUQgICAgICAgICAgMHg4OAorI2RlZmluZSBCVUZGRVJfVE9PX1NNQUxMICAgIDB4ODkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IEludCAxQWggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSByZWFsCittb2RlIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMuIFNpbmNlIHdlIG9ubHkKK3dhbnQgdG8gYWxsb3cgdGhlIHJlYWwgbW9kZSBCSU9TIGNvZGUgKm9ubHkqIHNlZSB0aGUgUENJIGNvbmZpZyBzcGFjZSBmb3IKK2l0cyBvd24gZGV2aWNlLCB3ZSBvbmx5IHJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIFBDSSBjb25maWcKK3NwYWNlIHRoYXQgd2UgaGF2ZSBwYXNzZWQgaW4gdG8gdGhlIGluaXQgZnVuY3Rpb24uIFRoaXMgc29sdmVzIHByb2JsZW1zCit3aGVuIHVzaW5nIHRoZSBCSU9TIHRvIHdhcm0gYm9vdCBhIHNlY29uZGFyeSBhZGFwdGVyIHdoZW4gdGhlcmUgaXMgYW4KK2lkZW50aWNhbCBhZGFwdGVyIGJlZm9yZSBpdCBvbiB0aGUgYnVzIChzb21lIEJJT1MnZXMgZ2V0IGNvbmZ1c2VkIGluIHRoaXMKK2Nhc2UpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBpbnQxQSgKKyAgICB1bnVzZWQpCit7CisgICAgdTE2IHBjaVNsb3Q7CisKKyAgICAvKiBGYWlsIGlmIG5vIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworICAgIGlmICghX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pCisgICAgICAgIHJldHVybjsKKyAgICBwY2lTbG90ID0gKHUxNikoX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPnNsb3QuaSA+PiA4KTsKKyAgICBzd2l0Y2ggKE0ueDg2LlJfQVgpIHsKKyAgICAgICAgY2FzZSAweEIxMDE6ICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgYmlvcyBwcmVzZW50PyAqLworICAgICAgICAgICAgTS54ODYuUl9BTCAgPSAweDAwOyAgICAgICAgIC8qIG5vIGNvbmZpZyBzcGFjZS9zcGVjaWFsIGN5Y2xlIGdlbmVyYXRpb24gc3VwcG9ydCAqLworICAgICAgICAgICAgTS54ODYuUl9FRFggPSAweDIwNDk0MzUwOyAgIC8qICIgSUNQIiAqLworICAgICAgICAgICAgTS54ODYuUl9CWCAgPSAweDAyMTA7ICAgICAgIC8qIFZlcnNpb24gMi4xMCAqLworICAgICAgICAgICAgTS54ODYuUl9DTCAgPSAwOyAgICAgICAgICAgIC8qIE1heCBidXMgbnVtYmVyIGluIHN5c3RlbSAqLworICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QjEwMjogICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgUENJIGRldmljZSAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IERFVklDRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9EWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+VmVuZG9ySUQgJiYKKyAgICAgICAgICAgICAgICAgICAgTS54ODYuUl9DWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+RGV2aWNlSUQgJiYKKyAgICAgICAgICAgICAgICAgICAgTS54ODYuUl9TSSA9PSAwKSB7CisgICAgICAgICAgICAgICAgTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgTS54ODYuUl9CWCA9IHBjaVNsb3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhCMTAzOiAgICAgICAgICAgICAgICAgICAgLyogRmluZCBQQ0kgY2xhc3MgY29kZSAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IERFVklDRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9DTCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+SW50ZXJmYWNlICYmCisgICAgICAgICAgICAgICAgICAgIE0ueDg2LlJfQ0ggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPlN1YkNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICh1OCkoTS54ODYuUl9FQ1ggPj4gMTYpID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5CYXNlQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0JYID0gcGNpU2xvdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEIxMDg6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gYnl0ZSAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisgICAgICAgICAgICAgICAgTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgTS54ODYuUl9DTCA9ICh1OClQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksMCxQQ0lfUkVBRF9CWVRFLF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEIxMDk6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gd29yZCAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisgICAgICAgICAgICAgICAgTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgTS54ODYuUl9DWCA9ICh1MTYpUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLDAsUENJX1JFQURfV09SRCxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhCMTBBOiAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBjb25maWd1cmF0aW9uIGR3b3JkICovCisgICAgICAgICAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKyAgICAgICAgICAgIGlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0VDWCA9ICh1MzIpUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLDAsUENJX1JFQURfRFdPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QjEwQjogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gYnl0ZSAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisgICAgICAgICAgICAgICAgTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfQ0wsUENJX1dSSVRFX0JZVEUsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QjEwQzogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gd29yZCAqLworICAgICAgICAgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisgICAgICAgICAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisgICAgICAgICAgICAgICAgTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisgICAgICAgICAgICAgICAgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfQ1gsUENJX1dSSVRFX1dPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QjEwRDogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gZHdvcmQgKi8KKyAgICAgICAgICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworICAgICAgICAgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworICAgICAgICAgICAgICAgIE0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworICAgICAgICAgICAgICAgIFBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSxNLng4Ni5SX0VDWCxQQ0lfV1JJVEVfRFdPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRrKCJiaW9zRW11L2Jpb3MuaW50MWE6IHVua25vd24gZnVuY3Rpb24gQVg9JSMwNHhcbiIsIE0ueDg2LlJfQVgpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgQklPUyBlbXVsYXRpb24gZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMKK1BDSSBkaXNwbGF5IGRldmljZS4gV2UgaW5zdWxhdGUgdGhlIHJlYWwgbW9kZSBCSU9TIGZyb20gYW55IG90aGVyIGRldmljZXMKK29uIHRoZSBidXMsIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGNvcnJlY3RseSB0aGlua2luZyB0aGF0IGl0IGlzIHRoZSBvbmx5CitkZXZpY2UgcHJlc2VudCBvbiB0aGUgYnVzIChpZTogYXZvaWRpbmcgYW55IGFkYXB0ZXJzIHByZXNlbnQgaW4gZnJvbSBvZgordGhlIGRldmljZSB3ZSBhcmUgdHJ5aW5nIHRvIGNvbnRyb2wpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0JFX2Jpb3NfaW5pdCgKKyAgICB1MzIgKmludHJUYWIpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIFg4NkVNVV9pbnRyRnVuY3MgICAgYmlvc19pbnRyX3RhYlsyNTZdOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgIGludHJUYWJbaV0gPSBCSU9TX1NFRyA8PCAxNjsKKyAgICAgICAgYmlvc19pbnRyX3RhYltpXSA9IHVuZGVmaW5lZF9pbnRyOworICAgICAgICB9CisgICAgYmlvc19pbnRyX3RhYlsweDEwXSA9IGludDEwOworICAgIGJpb3NfaW50cl90YWJbMHgxQV0gPSBpbnQxQTsKKyAgICBiaW9zX2ludHJfdGFiWzB4NDJdID0gaW50NDI7CisgICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKGJpb3NfaW50cl90YWIpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI3MTdjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb25zLiBUaGlzCisqICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudAorKiAgICAgICAgICAgICAgIGxpYnJhcmllcywgYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCRV9zeXNFbnYgICAgICAgICAgIF9CRV9lbnY7CisjaWZkZWYgIF9fRFJJVkVSX18KK1BNX2ltcG9ydHMgIF9WQVJBUEkgX1BNX2ltcG9ydHM7CisjZW5kaWYKK3N0YXRpYyBYODZFTVVfbWVtRnVuY3MgX0JFX21lbSA9IHsKKyAgICBCRV9yZGIsCisgICAgQkVfcmR3LAorICAgIEJFX3JkbCwKKyAgICBCRV93cmIsCisgICAgQkVfd3J3LAorICAgIEJFX3dybCwKKyAgICB9OworI2lmZGVmICBERUJVRworc3RhdGljIFg4NkVNVV9waW9GdW5jcyBfQkVfcGlvID0geworICAgIEJFX2luYiwKKyAgICBCRV9pbncsCisgICAgQkVfaW5sLAorICAgIEJFX291dGIsCisgICAgQkVfb3V0dywKKyAgICBCRV9vdXRsLAorICAgIH07CisjZWxzZQorc3RhdGljIFg4NkVNVV9waW9GdW5jcyBfQkVfcGlvID0geworICAgICh2b2lkKilQTV9pbnBiLAorICAgICh2b2lkKilQTV9pbnB3LAorICAgICh2b2lkKilQTV9pbnBkLAorICAgICh2b2lkKilQTV9vdXRwYiwKKyAgICAodm9pZCopUE1fb3V0cHcsCisgICAgKHZvaWQqKVBNX291dHBkLAorICAgIH07CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBPRkYoYWRkcikgICAgICAgKHUxNikoKChhZGRyKSA+PiAwKSAmIDB4ZmZmZikKKyNkZWZpbmUgU0VHKGFkZHIpICAgICAgICh1MTYpKCgoYWRkcikgPj4gNCkgJiAweGYwMDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZGVidWdGbGFncyAgLSBGbGFncyB0byBlbmFibGUgZGVidWdnaW5nIG9wdGlvbnMgKGRlYnVnIGJ1aWxkcyBvbmx5KQorbWVtU2l6ZSAgICAgLSBBbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciByZWFsIG1vZGUgbWFjaGluZQoraW5mbyAgICAgICAgLSBQb2ludGVyIHRvIGRlZmF1bHQgVkdBIGRldmljZSBpbmZvcm1hdGlvbgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbnMgaW5pdGlhbGlzZXMgdGhlIEJFbGliLCBhbmQgdXNlcyB0aGUgcGFzc2VkIGluCitCSU9TIGltYWdlIGFzIHRoZSBCSU9TIHRoYXQgaXMgdXNlZCBhbmQgZW11bGF0ZWQgYXQgMHhDMDAwMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBCRV9pbml0KAorICAgIHUzMiBkZWJ1Z0ZsYWdzLAorICAgIGludCBtZW1TaXplLAorICAgIEJFX1ZHQUluZm8gKmluZm8pCit7CisjaWZuZGVmIF9fRFJJVkVSX18KKyAgICBQTV9pbml0KCk7CisjZW5kaWYKKyAgICBtZW1zZXQoJk0sMCxzaXplb2YoTSkpOworICAgIGlmIChtZW1TaXplIDwgMjA0ODApCisgICAgICAgIFBNX2ZhdGFsRXJyb3IoIkVtdWxhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IDIwS2Igb2YgbWVtb3J5IVxuIik7CisgICAgaWYgKChNLm1lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKG1lbVNpemUpKSA9PSBOVUxMKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJPdXQgb2YgbWVtb3J5ISIpOworICAgIE0ubWVtX3NpemUgPSBtZW1TaXplOworICAgIF9CRV9lbnYuYnVzbWVtX2Jhc2UgPSAodWxvbmcpUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHg1RkZGRix0cnVlKTsKKyAgICBNLng4Ni5kZWJ1ZyA9IGRlYnVnRmxhZ3M7CisgICAgX0JFX2Jpb3NfaW5pdCgodTMyKilpbmZvLT5Mb3dNZW0pOworICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKCZfQkVfbWVtKTsKKyAgICBYODZFTVVfc2V0dXBQaW9GdW5jcygmX0JFX3Bpbyk7CisgICAgQkVfc2V0VkdBKGluZm8pOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2RlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBlbmFibGUgbG9nZ2luZyBhbmQgZGVidWcgZmxhZ3MKK29uIGEgZnVuY3Rpb24gY2FsbCBiYXNpcywgc28gd2UgY2FuIHNwZWNpZmljYWxseSBlbmFibGUgbG9nZ2luZyBvbmx5Citmb3Igc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQgYXJlIGNhdXNpbmcgcHJvYmxlbXMgaW4gZGVidWcgbW9kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIEJFX3NldERlYnVnRmxhZ3MoCisgICAgdTMyIGRlYnVnRmxhZ3MpCit7CisgICAgTS54ODYuZGVidWcgPSBkZWJ1Z0ZsYWdzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgICAgIC0gUG9pbnRlciB0byBWR0EgZGV2aWNlIGluZm9ybWF0aW9uIHRvIG1ha2UgY3VycmVudAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBWR0EgQklPUyBmdW5jdGlvbnMgaW4gdGhlIGVtdWxhdG9yIHRvIHBvaW50IHRvIHRoZQorc3BlY2lmaWMgVkdBIEJJT1MgaW4gdXNlLiBUaGlzIGluY2x1ZGVzIHN3YXBwaW5nIHRoZSBCSU9TIGludGVycnVwdAordmVjdG9ycywgQklPUyBpbWFnZSBhbmQgQklPUyBkYXRhIGFyZWEgdG8gdGhlIG5ldyBCSU9TLiBUaGlzIGFsbG93cyB0aGUKK3JlYWwgbW9kZSBCSU9TIHRvIGJlIHN3YXBwZWQgd2l0aG91dCByZXNldHRpbmcgdGhlIGVudGlyZSBlbXVsYXRvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIEJFX3NldFZHQSgKKyAgICBCRV9WR0FJbmZvICppbmZvKQoreworICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvID0gaW5mby0+cGNpSW5mbzsKKyAgICBfQkVfZW52LnZnYUluZm8uQklPU0ltYWdlID0gaW5mby0+QklPU0ltYWdlOworICAgIGlmIChpbmZvLT5CSU9TSW1hZ2UpIHsKKyAgICAgICAgX0JFX2Vudi5iaW9zbWVtX2Jhc2UgPSAodWxvbmcpaW5mby0+QklPU0ltYWdlOworICAgICAgICBfQkVfZW52LmJpb3NtZW1fbGltaXQgPSAweEMwMDAwICsgaW5mby0+QklPU0ltYWdlTGVuLTE7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX0JFX2Vudi5iaW9zbWVtX2Jhc2UgPSBfQkVfZW52LmJ1c21lbV9iYXNlICsgMHgyMDAwMDsKKyAgICAgICAgX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDN0ZGRjsKKyAgICAgICAgfQorICAgIGlmICgqKCh1MzIqKWluZm8tPkxvd01lbSkgPT0gMCkKKyAgICAgICAgX0JFX2Jpb3NfaW5pdCgodTMyKilpbmZvLT5Mb3dNZW0pOworICAgIG1lbWNweSgodTgqKU0ubWVtX2Jhc2UsaW5mby0+TG93TWVtLHNpemVvZihpbmZvLT5Mb3dNZW0pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbmZvICAgICAgICAtIFBvaW50ZXIgdG8gVkdBIGRldmljZSBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBjdXJyZW50CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZHQSBCSU9TIGZ1bmN0aW9ucyBjdXJyZW50bHkgYWN0aXZlIGluIHRoZQorZW11bGF0b3IsIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkIGF0IGEgbGF0ZXIgZGF0ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIEJFX2dldFZHQSgKKyAgICBCRV9WR0FJbmZvICppbmZvKQoreworICAgIGluZm8tPnBjaUluZm8gPSBfQkVfZW52LnZnYUluZm8ucGNpSW5mbzsKKyAgICBpbmZvLT5CSU9TSW1hZ2UgPSBfQkVfZW52LnZnYUluZm8uQklPU0ltYWdlOworICAgIG1lbWNweShpbmZvLT5Mb3dNZW0sKHU4KilNLm1lbV9iYXNlLHNpemVvZihpbmZvLT5Mb3dNZW0pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityX3NlZyAgIC0gU2VnbWVudCBmb3IgcG9pbnRlciB0byBjb252ZXJ0CityX29mZiAgIC0gT2Zmc2V0IGZvciBwb2ludGVyIHRvIGNvbnZlcnQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gbWFwcyBhIHJlYWwgbW9kZSBwb2ludGVyIGluIHRoZSBlbXVsYXRvciBtZW1vcnkgdG8gYSBwcm90ZWN0ZWQKK21vZGUgcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpcmVjdGx5IGFjY2VzcyB0aGUgbWVtb3J5LgorCitOT1RFOiAgIFRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisgICAgICAgIHN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCisgICAgICAgIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgQkVfbWFwUmVhbFBvaW50ZXIoCisgICAgdWludCByX3NlZywKKyAgICB1aW50IHJfb2ZmKQoreworICAgIHUzMiBhZGRyID0gKCh1MzIpcl9zZWcgPDwgNCkgKyByX29mZjsKKworICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKKyAgICAgICAgcmV0dXJuICh2b2lkKikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisgICAgICAgIHJldHVybiAodm9pZCopKF9CRV9lbnYuYnVzbWVtX2Jhc2UgKyBhZGRyIC0gMHhBMDAwMCk7CisgICAgICAgIH0KKyAgICByZXR1cm4gKHZvaWQqKShNLm1lbV9iYXNlICsgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbGVuICAgICAtIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBWRVNBIGJ1ZmZlcgorcnNlZyAgICAtIFBsYWNlIHRvIHN0b3JlIFZFU0EgYnVmZmVyIHNlZ21lbnQKK3JvZmYgICAgLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBvZmZzZXQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgaW4gcmVhbAorbW9kZSBlbXVsYXRvciBtZW1vcnkuIFRoZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBpcyBhbHdheXMgMTAyNCBieXRlcyBsb25nLAorYW5kIGxvY2F0ZWQgYXQgMTVLYiBpbnRvIHRoZSBzdGFydCBvZiB0aGUgcmVhbCBtb2RlIG1lbW9yeSAoMTZLYiBpcyB3aGVyZQord2UgcHV0IHRoZSByZWFsIG1vZGUgY29kZSB3ZSBleGVjdXRlIGZvciBpc3N1aW5nIGludGVycnVwdHMpLgorCitOT1RFOiAgIFRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisgICAgICAgIHN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCisgICAgICAgIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgQkVfZ2V0VkVTQUJ1ZigKKyAgICB1aW50ICpsZW4sCisgICAgdWludCAqcnNlZywKKyAgICB1aW50ICpyb2ZmKQoreworICAgICpsZW4gPSAxMDI0OworICAgICpyc2VnID0gU0VHKDB4MDNDMDApOworICAgICpyb2ZmID0gT0ZGKDB4MDNDMDApOworICAgIHJldHVybiAodm9pZCopKE0ubWVtX2Jhc2UgKyAoKHUzMikqcnNlZyA8PCA0KSArICpyb2ZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDbGVhbnMgdXAgYW5kIGV4aXRzIHRoZSBlbXVsYXRvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIEJFX2V4aXQodm9pZCkKK3sKKyAgICBmcmVlKCh2b2lkKilNLm1lbV9iYXNlKTsKKyAgICBQTV9mcmVlUGh5c2ljYWxBZGRyKCh2b2lkKilfQkVfZW52LmJ1c21lbV9iYXNlLDB4NUZGRkYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZyAgICAgLSBTZWdtZW50IG9mIGNvZGUgdG8gY2FsbAorb2ZmICAgICAtIE9mZnNldCBvZiBjb2RlIHRvIGNhbGwKK3JlZ3MgICAgLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK3NyZWdzICAgLSBSZWFsIG1vZGUgc2VnbWVudCByZWdpc3RlcnMgdG8gbG9hZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbnMgY2FsbHMgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcywKK2FuZCBsb2FkcyBhbGwgdGhlIHg4NiByZWdpc3RlcnMgZnJvbSB0aGUgcGFzc2VkIGluIHJlZ2lzdGVycyBzdHJ1Y3R1cmUuCitPbiBleGl0IHRoZSByZWdpc3RlcnMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUKK3N0cnVjdHVyZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBCRV9jYWxsUmVhbE1vZGUoCisgICAgdWludCBzZWcsCisgICAgdWludCBvZmYsCisgICAgUk1SRUdTICpyZWdzLAorICAgIFJNU1JFR1MgKnNyZWdzKQoreworICAgIE0ueDg2LlJfRUFYID0gcmVncy0+ZS5lYXg7CisgICAgTS54ODYuUl9FQlggPSByZWdzLT5lLmVieDsKKyAgICBNLng4Ni5SX0VDWCA9IHJlZ3MtPmUuZWN4OworICAgIE0ueDg2LlJfRURYID0gcmVncy0+ZS5lZHg7CisgICAgTS54ODYuUl9FU0kgPSByZWdzLT5lLmVzaTsKKyAgICBNLng4Ni5SX0VESSA9IHJlZ3MtPmUuZWRpOworICAgIE0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7CisgICAgTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKKyAgICBNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOworICAgIE0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7CisgICAgTS54ODYuUl9DUyA9ICh1MTYpc2VnOworICAgIE0ueDg2LlJfSVAgPSAodTE2KW9mZjsKKyAgICBNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAxKTsKKyAgICBNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAxKTsKKyAgICBYODZFTVVfZXhlYygpOworICAgIHJlZ3MtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOworICAgIHJlZ3MtPmUuZWF4ID0gTS54ODYuUl9FQVg7CisgICAgcmVncy0+ZS5lYnggPSBNLng4Ni5SX0VCWDsKKyAgICByZWdzLT5lLmVjeCA9IE0ueDg2LlJfRUNYOworICAgIHJlZ3MtPmUuZWR4ID0gTS54ODYuUl9FRFg7CisgICAgcmVncy0+ZS5lc2kgPSBNLng4Ni5SX0VTSTsKKyAgICByZWdzLT5lLmVkaSA9IE0ueDg2LlJfRURJOworICAgIHNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7CisgICAgc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKKyAgICBzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOworICAgIHNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8gICAtIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQoraW4gICAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAorb3V0ICAgICAtIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIEJFX2ludDg2KAorICAgIGludCBpbnRubywKKyAgICBSTVJFR1MgKmluLAorICAgIFJNUkVHUyAqb3V0KQoreworICAgIE0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OworICAgIE0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OworICAgIE0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OworICAgIE0ueDg2LlJfRURYID0gaW4tPmUuZWR4OworICAgIE0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOworICAgIE0ueDg2LlJfRURJID0gaW4tPmUuZWRpOworICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOworICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpaW50bm87CisgICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4QzM7CisgICAgTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKyAgICBNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOworICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOworICAgIFg4NkVNVV9leGVjKCk7CisgICAgb3V0LT5lLmNmbGFnID0gTS54ODYuUl9FRkxHICYgRl9DRjsKKyAgICBvdXQtPmUuZWF4ID0gTS54ODYuUl9FQVg7CisgICAgb3V0LT5lLmVieCA9IE0ueDg2LlJfRUJYOworICAgIG91dC0+ZS5lY3ggPSBNLng4Ni5SX0VDWDsKKyAgICBvdXQtPmUuZWR4ID0gTS54ODYuUl9FRFg7CisgICAgb3V0LT5lLmVzaSA9IE0ueDg2LlJfRVNJOworICAgIG91dC0+ZS5lZGkgPSBNLng4Ni5SX0VESTsKKyAgICByZXR1cm4gb3V0LT54LmF4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIHRvIGV4ZWN1dGUKK2luICAgICAgLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK291dCAgICAgLSBQbGFjZSB0byBzdG9yZSByZXN1bHRpbmcgcmVhbCBtb2RlIHJlZ2lzdGVycworc3JlZ3MgICAtIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIEJFX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBNLng4Ni5SX0VBWCA9IGluLT5lLmVheDsKKyAgICBNLng4Ni5SX0VCWCA9IGluLT5lLmVieDsKKyAgICBNLng4Ni5SX0VDWCA9IGluLT5lLmVjeDsKKyAgICBNLng4Ni5SX0VEWCA9IGluLT5lLmVkeDsKKyAgICBNLng4Ni5SX0VTSSA9IGluLT5lLmVzaTsKKyAgICBNLng4Ni5SX0VESSA9IGluLT5lLmVkaTsKKyAgICBNLng4Ni5SX0RTID0gc3JlZ3MtPmRzOworICAgIE0ueDg2LlJfRVMgPSBzcmVncy0+ZXM7CisgICAgTS54ODYuUl9GUyA9IHNyZWdzLT5mczsKKyAgICBNLng4Ni5SX0dTID0gc3JlZ3MtPmdzOworICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOworICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpaW50bm87CisgICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4QzM7CisgICAgTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKyAgICBNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOworICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOworICAgIFg4NkVNVV9leGVjKCk7CisgICAgb3V0LT5lLmNmbGFnID0gTS54ODYuUl9FRkxHICYgRl9DRjsKKyAgICBvdXQtPmUuZWF4ID0gTS54ODYuUl9FQVg7CisgICAgb3V0LT5lLmVieCA9IE0ueDg2LlJfRUJYOworICAgIG91dC0+ZS5lY3ggPSBNLng4Ni5SX0VDWDsKKyAgICBvdXQtPmUuZWR4ID0gTS54ODYuUl9FRFg7CisgICAgb3V0LT5lLmVzaSA9IE0ueDg2LlJfRVNJOworICAgIG91dC0+ZS5lZGkgPSBNLng4Ni5SX0VESTsKKyAgICBzcmVncy0+ZHMgPSBNLng4Ni5SX0RTOworICAgIHNyZWdzLT5lcyA9IE0ueDg2LlJfRVM7CisgICAgc3JlZ3MtPmZzID0gTS54ODYuUl9GUzsKKyAgICBzcmVncy0+Z3MgPSBNLng4Ni5SX0dTOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKKyNpZmRlZiAgX19EUklWRVJfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VtcHR5IGxvZyBmdW5jdGlvbiBmb3IgYmluYXJ5IHBvcnRhYmxlIERMTC4gVGhlIEJQRCBpcyBjb21waWxlZCB3aXRob3V0CitkZWJ1ZyBpbmZvcm1hdGlvbiwgc28gdmVyeSBsaXR0bGUgaXMgbG9nZ2VkIGFueXdheSBzbyBpdCBpcyBzaW1wbGVyIHRoaXMKK3dheS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50ayhjb25zdCBjaGFyICptc2csIC4uLikKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGYXRhbCBlcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgbm9uLWltcG9ydGVkIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUKK2RyaXZlci4gV2UgbGVhdmUgdGhpcyB0byBhIHJ1bnRpbWUgZXJyb3Igc28gdGhhdCBvbGRlciBhcHBsaWNhdGlvbnMgYW5kCitzaGVsbCBkcml2ZXJzIHdpbGwgd29yayB3aXRoIG5ld2VyIGJwZCBkcml2ZXJzIHByb3ZpZGVkIG5vIG5ld2VyIGZ1bmN0aW9ucworYXJlIHJlcXVpcmVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLiBJZiB0aGV5IGFyZSwgdGhlIGFwcGxpY2F0aW9uIG9yIHNoZWxsCitkcml2ZXIgbmVlZHMgdG8gYmUgcmVjb21waWxlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfUE1fZmF0YWxFcnJvckhhbmRsZXIodm9pZCkKK3sKKyAgICBQTV9mYXRhbEVycm9yKCJVbnN1cHBvcnRlZCBQTV9pbXBvcnRzIGltcG9ydCBmdW5jdGlvbiBjYWxsZWQhIFBsZWFzZSByZS1jb21waWxlIVxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmVJbXAgICAtIEJFIGxpYnJhcnkgaW1wb3J0cworYmVJbXAgICAtIEdlbmVyaWMgZW11bGF0b3IgaW1wb3J0cworCitSRVRVUk5TOgorUG9pbnRlciB0byBleHBvcnRlZCBmdW5jdGlvbiBsaXN0CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YKK2xvYWRlciBsaWJyYXJ5IGV4cG9ydGVkIGZ1bmN0aW9ucy4KK3tzZWNyZXR9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQkVfZXhwb3J0cyAqIF9DRVhQT1JUIEJFX2luaXRMaWJyYXJ5KAorICAgIFBNX2ltcG9ydHMgKnBtSW1wKQoreworICAgIHN0YXRpYyBCRV9leHBvcnRzIF9CRV9leHBvcnRzID0geworICAgICAgICBzaXplb2YoQkVfZXhwb3J0cyksCisgICAgICAgIEJFX2luaXQsCisgICAgICAgIEJFX3NldFZHQSwKKyAgICAgICAgQkVfZ2V0VkdBLAorICAgICAgICBCRV9tYXBSZWFsUG9pbnRlciwKKyAgICAgICAgQkVfZ2V0VkVTQUJ1ZiwKKyAgICAgICAgQkVfY2FsbFJlYWxNb2RlLAorICAgICAgICBCRV9pbnQ4NiwKKyAgICAgICAgQkVfaW50ODZ4LAorICAgICAgICBOVUxMLAorICAgICAgICBCRV9leGl0LAorICAgICAgICB9OworICAgIGludCAgICAgaSxtYXg7CisgICAgdWxvbmcgICAqcDsKKworICAgIC8vIEluaXRpYWxpemUgYWxsIGRlZmF1bHQgaW1wb3J0cyB0byBwb2ludCB0byBmYXRhbCBlcnJvciBoYW5kbGVyCisgICAgLy8gZm9yIHVwd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICBtYXggPSBzaXplb2YoX1BNX2ltcG9ydHMpL3NpemVvZihCRV9pbml0TGlicmFyeV90KTsKKyAgICBmb3IgKGkgPSAwLHAgPSAodWxvbmcqKSZfUE1faW1wb3J0czsgaSA8IG1heDsgaSsrKQorICAgICAgICAqcCsrID0gKHVsb25nKV9QTV9mYXRhbEVycm9ySGFuZGxlcjsKKworICAgIC8vIE5vdyBjb3B5IGFsbCBvdXIgaW1wb3J0ZWQgZnVuY3Rpb25zCisgICAgbWVtY3B5KCZfUE1faW1wb3J0cyxwbUltcCxNSU4oc2l6ZW9mKF9QTV9pbXBvcnRzKSxwbUltcC0+ZHdTaXplKSk7CisgICAgcmV0dXJuICZfQkVfZXhwb3J0czsKK30KKworI2VuZGlmICAvKiBfX0RSSVZFUl9fICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXVpLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXVpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZGViYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdWkuaApAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQklPU0VNVUlfSAorI2RlZmluZSBfX0JJT1NFTVVJX0gKKworI2luY2x1ZGUgPGJpb3NlbXUuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCKHgpICAgeAorI2Vsc2UKKyNkZWZpbmUgREIoeCkKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfU0VHICAgICAgICAweGZmZjAKKworI2RlZmluZSBNICAgICAgICAgICAgICAgX1g4NkVNVV9lbnYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogYmlvcy5jICovCisKK3ZvaWQgICAgX0JFX2Jpb3NfaW5pdCh1MzIgKmludHJUYWIpOwordm9pZCAgICBfQkVfc2V0dXBfZnVuY3Modm9pZCk7CisKKy8qIGJlc3lzLmMgKi8KKwordTggICAgICBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKTsKK3UxNiAgICAgWDg2QVBJIEJFX3Jkdyh1MzIgYWRkcik7Cit1MzIgICAgIFg4NkFQSSBCRV9yZGwodTMyIGFkZHIpOwordm9pZCAgICBYODZBUEkgQkVfd3JiKHUzMiBhZGRyLHU4IHZhbCk7Cit2b2lkICAgIFg4NkFQSSBCRV93cncodTMyIGFkZHIsdTE2IHZhbCk7Cit2b2lkICAgIFg4NkFQSSBCRV93cmwodTMyIGFkZHIsdTMyIHZhbCk7CisjaWZkZWYgIERFQlVHCit1OCAgICAgIFg4NkFQSSBCRV9pbmIoaW50IHBvcnQpOwordTE2ICAgICBYODZBUEkgQkVfaW53KGludCBwb3J0KTsKK3UzMiAgICAgWDg2QVBJIEJFX2lubChpbnQgcG9ydCk7Cit2b2lkICAgIFg4NkFQSSBCRV9vdXRiKGludCBwb3J0LCB1OCB2YWwpOwordm9pZCAgICBYODZBUEkgQkVfb3V0dyhpbnQgcG9ydCwgdTE2IHZhbCk7Cit2b2lkICAgIFg4NkFQSSBCRV9vdXRsKGludCBwb3J0LCB1MzIgdmFsKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19CSU9TRU1VSV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDczMGIyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9tYWtlZmlsZQpAQCAtMCwwICsxLDk5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorIyAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorIworIyAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisjICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisjICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisjICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisjICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisjICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LiBSZXF1aXJlcworIyAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFNvZnR3YXJlIG1ha2VmaWxlIGRlZmluaXRpb25zIHBhY2thZ2UgdG8gYmUKKyMgICAgICAgICAgICAgICBpbnN0YWxsZWQsIHdoaWNoIHVzZXMgdGhlIERNQUtFIG1ha2UgcHJvZ3JhbS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5JTVBPUlQgLklHTk9SRTogREVCVUcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIHRoZSBsaXN0cyBvZiBvYmplY3QgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9PQkpTICAgICAgICA9IGRsbHN0YXJ0JE8gX3BtX2ltcCRPCitCSU9TX09CSlMgICAgICAgPSBiaW9zZW11JE8gYmlvcyRPIGJlc3lzJE8KK1g4Nl9PQkpTICAgICAgICA9IHN5cyRPIGRlY29kZSRPIG9wcyRPIG9wczIkTyBwcmltX29wcyRPIGZwdSRPIGRlYnVnJE8KK0NGTEFHUyAgICAgICAgICArPSAtRFNDSVRFQ0ggLUkkKFNDSVRFQ0gpXHNyY1x4ODZlbXUKKworLklGICQoQlVJTERfRExMKQorCitDRkxBR1MgICAgICAgICAgKz0gLUkkKFBSSVZBVEUpXGluY2x1ZGVcZHJ2bGliIC1JJChTQ0lURUNIKVxpbmNsdWRlXGRydmxpYiAtRF9fRFJJVkVSX18KK0FTRkxBR1MgICAgICAgICArPSAtZF9fRFJJVkVSX18KK0VYRUxJQlMgICAgICAgICA9IGRydmxpYiRMCisKKy5FTFNFCisKKy5JRiAkKERFQlVHKQorQ0ZMQUdTICAgICAgICAgICs9IC1EREVCVUcKKy5FTkRJRgorT0JKRUNUUyAgICAgICAgID0gJChCSU9TX09CSlMpICQoWDg2X09CSlMpCitMSUJDTEVBTiAgICAgICAgPSAqLmRsbCAqLmxpYiAqLmEKK0xJQkZJTEUgICAgICAgICA9ICQoTFApYmlvc2VtdSRMCisKKy5FTkRJRgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYW1wbGUgdGVzdCBwcm9ncmFtcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYWxsOiAkKExJQkZJTEUpIHdhcm1ib290JEUKKword2FybWJvb3QkRTogd2FybWJvb3QkTyAkKExJQkZJTEUpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRhcmdldCB0byBidWlsZCB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0YXJnZXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Jpb3NlbXUuZGxsOiAkKERMTF9PQkpTKSAkKEJJT1NfT0JKUykgJChYODZfT0JKUykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGFyZ2V0IHRvIGJ1aWxkIGFsbCBJbnRlbCBiaW5hcnkgZHJpdmVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZIG1rZHJ2OgorICAgIEBidWlsZCB3YzExLXczMiBiaW9zZW11LmRsbCAtdSBCVUlMRF9ETEw9MSBOT19SVU5USU1FPTEgT1BUPTEKKyAgICBAJChDUCkgYmlvc2VtdS5kbGwgJChQUklWQVRFKVxudWNsZXVzXGdyYXBoaWNzXGJpb3NlbXUuYnBkCisgICAgQGRtYWtlIGNsZWFuZXhlCisKKy5QSE9OWSBkYjoKKyAgICBAYnVpbGQgd2MxMS13MzIgYmlvc2VtdS5kbGwgQlVJTERfRExMPTEgTk9fUlVOVElNRT0xIE9QVD0xCisgICAgQCQoQ1ApIGJpb3NlbXUuZGxsICQoUFJJVkFURSlcbnVjbGV1c1xncmFwaGljc1xiaW9zZW11LmJwZAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworREVQRU5EX09CSiAgICAgID0gd2FybWJvb3QkTyAkKEJJT1NfT0JKUykgJChYODZfT0JKUykgJChETExfT0JKUykKK0RFUEVORF9TUkMgICAgICA9ICQoU0NJVEVDSCkvc3JjL3g4NmVtdTskKFBSSVZBVEUpL3NyYy9jb21tb24KKy5TT1VSQ0U6ICAgICAgICAgICQoU0NJVEVDSCkvc3JjL3g4NmVtdSAkKFBSSVZBVEUpL3NyYy9jb21tb24KKworLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUuY3Jvc3MgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDEwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzCkBAIC0wLDAgKzEsMTAgQEAKK0NDID0gcHBjLWVsZjMyLWdjYworQVIgPSBwcGMtZWxmMzItYXIKKworQ0ZMQUdTID0gLURfX0RSSVZFUl9fIC1JLi4vLi4vaW5jbHVkZSAtRERFQlVHIC1JLgorCitCSU9TX09CSlMgPSBiaW9zZW11Lm8gYmlvcy5vIGJlc3lzLm8KK1g4Nl9PQkpTID0gc3lzLm8gZGVjb2RlLm8gb3BzLm8gcHJpbV9vcHMubyBmcHUubyBkZWJ1Zy5vCisKK2xpYmJpb3MuYTogJChCSU9TX09CSlMpCisJJChBUikgcmNzIGxpYmJpb3MuYSAkKEJJT1NfT0JKUykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L3dhcm1ib290LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L3dhcm1ib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmYTVhMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvd2FybWJvb3QuYwpAQCAtMCwwICsxLDU2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKKyogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgd2FybSBib290aW5nIG9mIGFsbCBQQ0kvQUdQIGNvbnRyb2xsZXJzCisqICAgICAgICAgICAgICAgb24gdGhlIGJ1cy4gV2UgdXNlIHRoZSB4ODYgcmVhbCBtb2RlIGVtdWxhdG9yIHRvIHJ1biB0aGUKKyogICAgICAgICAgICAgICBCSU9TIG9uIHRoZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29udHJvbGxlcnMgdG8gYnJpbmcKKyogICAgICAgICAgICAgICB0aGUgY2FyZHMgdXAuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJiaW9zZW11LmgiCisjaWZuZGVmIF9NQVhfUEFUSAorI2RlZmluZSBfTUFYX1BBVEggMjU2CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFBDSURldmljZUluZm8gICAgUENJW01BWF9QQ0lfREVWSUNFU107CitzdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1QQ0kgPSAtMTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIEJyaWRnZUluZGV4W01BWF9QQ0lfREVWSUNFU10gPSB7MH07CitzdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1CcmlkZ2VzOworc3RhdGljIFBDSUJyaWRnZUluZm8gICAgKkFHUEJyaWRnZSA9IE5VTEw7CitzdGF0aWMgaW50ICAgICAgICAgICAgICBEZXZpY2VJbmRleFtNQVhfUENJX0RFVklDRVNdID0gezB9Oworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKK3N0YXRpYyB1MzIgICAgICAgICAgICAgIGRlYnVnRmxhZ3MgPSAwOworc3RhdGljIEJFX1ZHQUluZm8gICAgICAgVkdBSW5mb1tNQVhfUENJX0RFVklDRVNdID0ge3swfX07CitzdGF0aWMgaWJvb2wgICAgICAgICAgICB1c2VWODYgPSBmYWxzZTsKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGZvcmNlUG9zdCA9IGZhbHNlOworCisvKiBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UgKi8KKworI2RlZmluZSBNQVhfQklPU0xFTiAgICAgICAgICg2NCAqIDEwMjRMKQorI2RlZmluZSBGSU5BTF9CSU9TTEVOICAgICAgICgzMiAqIDEwMjRMKQorCisvKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgdGhlIFZHQSBpcyBlbmFibGVkIGFuZCByZXNwb25kaW5nICovCisKKyNkZWZpbmUgVkdBX05PVF9BQ1RJVkUoKSAgICAoZm9yY2VQb3N0IHx8IChQTV9pbnBiKDB4M0NDKSA9PSAweEZGKSB8fCAoKFBNX2lucGIoMHgzQ0MpICYgMHgyKSA9PSAwKSkKKworI2RlZmluZSBFTkFCTEVfREVWSUNFKGRldmljZSkgICBcCisgICAgUENJX3dyaXRlUENJUmVnQigweDQsUENJW0RldmljZUluZGV4W2RldmljZV1dLkNvbW1hbmQgfCAweDcsZGV2aWNlKQorCisjZGVmaW5lIERJU0FCTEVfREVWSUNFKGRldmljZSkgIFwKKyAgICBQQ0lfd3JpdGVQQ0lSZWdCKDB4NCwwLGRldmljZSkKKworLyogTWFjcm9zIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBBR1AgVkdBIHJlc291cmNlcyAqLworCisjZGVmaW5lIEVOQUJMRV9BR1BfVkdBKCkgICAgXAorICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wgfCAweDgsUENJX1dSSVRFX1dPUkQsKFBDSURldmljZUluZm8qKUFHUEJyaWRnZSkKKworI2RlZmluZSBESVNBQkxFX0FHUF9WR0EoKSAgIFwKKyAgICBQQ0lfYWNjZXNzUmVnKDB4M0UsQUdQQnJpZGdlLT5CcmlkZ2VDb250cm9sICYgfjB4OCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQorCisjZGVmaW5lIFJFU1RPUkVfQUdQX1ZHQSgpICAgXAorICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wsUENJX1dSSVRFX1dPUkQsKFBDSURldmljZUluZm8qKUFHUEJyaWRnZSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitUaGUgYWRkcmVzcyB0byB1c2UgdG8gbWFwIHRoZSBzZWNvbmRhcnkgQklPUyAoUENJL0FHUCBkZXZpY2VzKQorCitSRU1BUktTOgorU2VhcmNoZXMgYWxsIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyBmb3IgdGhlIGRldmljZSBsb29raW5nIGZvciBhCittZW1vcnkgbWFwcGluZyB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIG91ciBST00gQklPUy4gV2UgdXN1YWxseSBlbmQgdXAKK2ZpbmRpbmcgdGhlIGZyYW1lYnVmZmVyIG1hcHBpbmcgKHVzdWFsbHkgQkFSIDB4MTApLCBhbmQgd2UgdXNlIHRoaXMgbWFwcGluZwordG8gbWFwIHRoZSBCSU9TIGZvciB0aGUgZGV2aWNlIGludG8uIFdlIHVzZSBhIG1hcHBpbmcgdGhhdCBpcyBhbHJlYWR5Cithc3NpZ25lZCB0byB0aGUgZGV2aWNlIHRvIGVuc3VyZSB0aGUgbWVtb3J5IHJhbmdlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2gKK2J5IGFueSBQQ0ktPlBDSSBvciBBR1AtPlBDSSBicmlkZ2UgdGhhdCBtYXkgYmUgcHJlc2VudC4KKworTk9URTogVXN1YWxseSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgQUdQIGRldmljZXMsIGJ1dCBpdCBtYXkgYmUKKyAgICAgIHVzZWQgZm9yIFBDSSBkZXZpY2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gUE9TVCdlZCBhbmQgdGhlIEJJT1MKKyAgICAgIFJPTSBiYXNlIGFkZHJlc3MgaGFzIGJlZW4gemVybydlZCBvdXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIFBDSV9maW5kQklPU0FkZHIoCisgICAgaW50IGRldmljZSkKK3sKKyAgICB1bG9uZyAgIGJhc2Usc2l6ZTsKKyAgICBpbnQgICAgIGJhcjsKKworICAgIGZvciAoYmFyID0gMHgxMDsgYmFyIDw9IDB4MTQ7IGJhcisrKSB7CisgICAgICAgIGJhc2UgPSBQQ0lfcmVhZFBDSVJlZ0woYmFyLGRldmljZSkgJiB+MHhGRjsKKyAgICAgICAgaWYgKCEoYmFzZSAmIDB4MSkpIHsKKyAgICAgICAgICAgIFBDSV93cml0ZVBDSVJlZ0woYmFyLDB4RkZGRkZGRkYsZGV2aWNlKTsKKyAgICAgICAgICAgIHNpemUgPSBQQ0lfcmVhZFBDSVJlZ0woYmFyLGRldmljZSkgJiB+MHhGRjsKKyAgICAgICAgICAgIHNpemUgPSB+c2l6ZSsxOworICAgICAgICAgICAgUENJX3dyaXRlUENJUmVnTChiYXIsMCxkZXZpY2UpOworICAgICAgICAgICAgaWYgKHNpemUgPj0gTUFYX0JJT1NMRU4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZS13cml0ZXMgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgc2Vjb25kYXJ5IFBDSSBjb250cm9sbGVyCit3aXRoIHRoZSB2YWx1ZXMgZnJvbSBvdXIgaW5pdGlhbCBQQ0kgYnVzIGVudW1lcmF0aW9uLiBUaGlzIGZpeGVzIHVwIHRoZQordmFsdWVzIGFmdGVyIHdlIGhhdmUgUE9TVCdlZCB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlciBCSU9TLCB3aGljaAorbWF5IGhhdmUgaW5jb3JyZWN0bHkgcmUtcHJvZ3JhbW1lZCB0aGUgYmFzZSByZWdpc3RlcnMgdGhlIHNhbWUgYXMgdGhlCitwcmltYXJ5IGRpc3BsYXkgY29udHJvbGxlciAodGhlIGNhc2UgZm9yIGlkZW50aWNhbCBTMyBjYXJkcykuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX1BDSV9maXh1cFNlY29uZGFyeUJBUnModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1EZXZpY2VzOyBpKyspIHsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDEwLFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxMCxpKTsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDE0LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxNCxpKTsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDE4LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxOCxpKTsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDFDLFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxQyxpKTsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDIwLFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MyMCxpKTsKKyAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDI0LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MyNCxpKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1RydWUgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLCBmYWxzZSBpZiBub3QuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBCSU9TIFBPU1QgY29kZSBvbiB0aGUgY29udHJvbGxlci4gV2UgYXNzdW1lIHRoYXQKK2F0IHRoaXMgc3RhZ2UgdGhlIGNvbnRyb2xsZXIgaGFzIGl0cyBJL08gYW5kIG1lbW9yeSBzcGFjZSBlbmFibGVkIGFuZAordGhhdCBhbGwgb3RoZXIgY29udHJvbGxlcnMgYXJlIGluIGEgZGlzYWJsZWQgc3RhdGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUENJX2RvQklPU1BPU1QoCisgICAgaW50IGRldmljZSwKKyAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCisgICAgdm9pZCAqbWFwcGVkQklPUywKKyAgICB1bG9uZyBCSU9TTGVuKQoreworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKKworICAgIC8vIERldGVybWluZSB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gQVggZm9yIEJJT1MgUE9TVAorICAgIHJlZ3MueC5heCA9ICh1MTYpKFBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXS5zbG90LmkgPj4gOCk7CisgICAgaWYgKHVzZVY4NikgeworICAgICAgICAvLyBQb3N0IHRoZSBCSU9TIHVzaW5nIHRoZSBQTSBmdW5jdGlvbnMgKGllOiB2ODYgbW9kZSBvbiBMaW51eCkKKyAgICAgICAgaWYgKCFQTV9kb0JJT1NQT1NUKHJlZ3MueC5heCxCSU9TUGh5c0FkZHIsbWFwcGVkQklPUyxCSU9TTGVuKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIFBNIGZ1bmN0aW9uIGZhaWxzLCB0aGlzIHByb2JhYmx5IG1lYW5zIGFyZSB3ZSBhcmUgb24KKyAgICAgICAgICAgIC8vIERPUyBhbmQgY2FuJ3QgcmUtbWFwIHRoZSByZWFsIG1vZGUgMHhDMDAwMCByZWdpb24uIEluIHRoaXNlCisgICAgICAgICAgICAvLyBjYXNlIGlmIHRoZSBkZXZpY2UgaXMgdGhlIHByaW1hcnksIHdlIGNhbiB1c2UgdGhlIHJlYWwKKyAgICAgICAgICAgIC8vIEJJT1MgYXQgMHhDMDAwMCBkaXJlY3RseS4KKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gMCkKKyAgICAgICAgICAgICAgICBQTV9kb0JJT1NQT1NUKHJlZ3MueC5heCwweEMwMDAwLG1hcHBlZEJJT1MsQklPU0xlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gU2V0dXAgdGhlIFg4NiBlbXVsYXRvciBmb3IgdGhlIFZHQSBCSU9TCisgICAgICAgIEJFX3NldFZHQSgmVkdBSW5mb1tkZXZpY2VdKTsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBCSU9TIFBPU1QgY29kZQorICAgICAgICBCRV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOworCisgICAgICAgIC8vIENsZWFudXAgYW5kIGV4aXQKKyAgICAgICAgQkVfZ2V0VkdBKCZWR0FJbmZvW2RldmljZV0pOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK0xvYWRzIGFuZCBQT1NUJ3MgdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBCSU9TLCBkaXJlY3RseSBmcm9tIHRoZSBCSU9TCitpbWFnZSB3ZSBjYW4gZXh0cmFjdCBvdmVyIHRoZSBQQ0kgYnVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBQQ0lfcG9zdENvbnRyb2xsZXJzKHZvaWQpCit7CisgICAgaW50ICAgICBkZXZpY2U7CisgICAgdWxvbmcgICBCSU9TSW1hZ2VMZW4sbWFwcGVkQklPU1BoeXM7CisgICAgdWNoYXIgICAqbWFwcGVkQklPUywqY29weU9mQklPUzsKKyAgICBjaGFyICAgIGZpbGVuYW1lW19NQVhfUEFUSF07CisgICAgRklMRSAgICAqZjsKKworICAgIC8vIERpc2FibGUgdGhlIHByaW1hcnkgZGlzcGxheSBjb250cm9sbGVyIGFuZCBBR1AgVkdBIHBhc3MtdGhyb3VnaAorICAgIERJU0FCTEVfREVWSUNFKDApOworICAgIGlmIChBR1BCcmlkZ2UpCisgICAgICAgIERJU0FCTEVfQUdQX1ZHQSgpOworCisgICAgLy8gTm93IFBPU1QgYWxsIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlcnMKKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IE51bURldmljZXM7IGRldmljZSsrKSB7CisgICAgICAgIC8vIFNraXAgdGhlIGRldmljZSBpZiBpdCBpcyBub3QgZW5hYmxlZCAocHJvYmFibHkgYW4gSVNBIGRldmljZSkKKyAgICAgICAgaWYgKERldmljZUluZGV4W2RldmljZV0gPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBFbmFibGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlci4gSWYgdGhlIHNlY29uZGFyeSBjb250cm9sbGVyCisgICAgICAgIC8vIGlzIG9uIHRoZSBBR1AgYnVzLCB0aGVuIGVuYWJsZSBWR0EgcmVzb3VyY2VzIGZvciB0aGUgQUdQIGRldmljZS4KKyAgICAgICAgRU5BQkxFX0RFVklDRShkZXZpY2UpOworICAgICAgICBpZiAoQUdQQnJpZGdlICYmIEFHUEJyaWRnZS0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW0RldmljZUluZGV4W2RldmljZV1dLnNsb3QucC5CdXMpCisgICAgICAgICAgICBFTkFCTEVfQUdQX1ZHQSgpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250cm9sbGVyIGhhcyBhbHJlYWR5IGJlZW4gUE9TVCdlZAorICAgICAgICBpZiAoVkdBX05PVF9BQ1RJVkUoKSkgeworICAgICAgICAgICAgLy8gRmluZCBhIHZpYWJsZSBwbGFjZSB0byBtYXAgdGhlIHNlY29uZGFyeSBQQ0kgQklPUyBpbWFnZSBhbmQgbWFwIGl0CisgICAgICAgICAgICBwcmludGsoIkRldmljZSAlZCBub3QgZW5hYmxlZCwgc28gYXR0ZW1wdGluZyB3YXJtIGJvb3QgaXRcbiIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIEZvciBBR1AgZGV2aWNlcyAoYW5kIFBDSSBkZXZpY2VzIHRoYXQgZG8gaGF2ZSB0aGUgUk9NIGJhc2UKKyAgICAgICAgICAgIC8vIGFkZHJlc3MgemVybydlZCBvdXQpIHdlIGhhdmUgdG8gbWFwIHRoZSBCSU9TIHRvIGEgbG9jYXRpb24KKyAgICAgICAgICAgIC8vIHRoYXQgaXMgcGFzc2VkIGJ5IHRoZSBBR1AgYnJpZGdlIHRvIHRoZSBidXMuIFNvbWUgQUdQIGRldmljZXMKKyAgICAgICAgICAgIC8vIGhhdmUgdGhlIFJPTSBiYXNlIGFkZHJlc3MgYWxyZWFkeSBzZXQgdXAgZm9yIHVzLCBhbmQgc29tZQorICAgICAgICAgICAgLy8gZG8gbm90ICh3ZSBtYXAgdG8gb25lIG9mIHRoZSBleGlzdGluZyBCQVIgbG9jYXRpb25zIGluCisgICAgICAgICAgICAvLyB0aGlzIGNhc2UpLgorICAgICAgICAgICAgbWFwcGVkQklPUyA9IE5VTEw7CisgICAgICAgICAgICBpZiAoUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzICE9IDApCisgICAgICAgICAgICAgICAgbWFwcGVkQklPU1BoeXMgPSBQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uUk9NQmFzZUFkZHJlc3MgJiB+MHhGOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1hcHBlZEJJT1NQaHlzID0gUENJX2ZpbmRCSU9TQWRkcihkZXZpY2UpOworICAgICAgICAgICAgcHJpbnRrKCJNYXBwaW5nIEJJT1MgaW1hZ2UgdG8gMHglMDhYXG4iLCBtYXBwZWRCSU9TUGh5cyk7CisgICAgICAgICAgICBtYXBwZWRCSU9TID0gUE1fbWFwUGh5c2ljYWxBZGRyKG1hcHBlZEJJT1NQaHlzLE1BWF9CSU9TTEVOLTEsZmFsc2UpOworICAgICAgICAgICAgUENJX3dyaXRlUENJUmVnTCgweDMwLG1hcHBlZEJJT1NQaHlzIHwgMHgxLGRldmljZSk7CisgICAgICAgICAgICBCSU9TSW1hZ2VMZW4gPSBtYXBwZWRCSU9TWzJdICogNTEyOworICAgICAgICAgICAgaWYgKChjb3B5T2ZCSU9TID0gbWFsbG9jKEJJT1NJbWFnZUxlbikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbWVtY3B5KGNvcHlPZkJJT1MsbWFwcGVkQklPUyxCSU9TSW1hZ2VMZW4pOworICAgICAgICAgICAgUE1fZnJlZVBoeXNpY2FsQWRkcihtYXBwZWRCSU9TLE1BWF9CSU9TTEVOLTEpOworCisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gc2Vjb25kYXJ5IGNvbnRyb2xsZXJzCisgICAgICAgICAgICBWR0FJbmZvW2RldmljZV0ucGNpSW5mbyA9ICZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV07CisgICAgICAgICAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlID0gY29weU9mQklPUzsKKyAgICAgICAgICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2VMZW4gPSBCSU9TSW1hZ2VMZW47CisKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgZGV2aWNlIG1hcHBpbmdzCisgICAgICAgICAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MzAsUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzLGRldmljZSk7CisgICAgICAgICAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MTAsUENJW0RldmljZUluZGV4W2RldmljZV1dLkJhc2VBZGRyZXNzMTAsZGV2aWNlKTsKKyAgICAgICAgICAgIFBDSV93cml0ZVBDSVJlZ0woMHgxNCxQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uQmFzZUFkZHJlc3MxNCxkZXZpY2UpOworCisgICAgICAgICAgICAvLyBOb3cgZXhlY3V0ZSB0aGUgQklPUyBQT1NUIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICBpZiAoY29weU9mQklPU1swXSA9PSAweDU1ICYmIGNvcHlPZkJJT1NbMV0gPT0gMHhBQSkgeworICAgICAgICAgICAgICAgIHByaW50aygiRXhlY3V0aW5nIEJJT1MgUE9TVCBmb3IgY29udHJvbGxlci5cbiIpOworICAgICAgICAgICAgICAgIFBDSV9kb0JJT1NQT1NUKGRldmljZSxtYXBwZWRCSU9TUGh5cyxjb3B5T2ZCSU9TLEJJT1NJbWFnZUxlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgc2l6ZSBvZiB0aGUgQklPUyBpbWFnZSB0byB0aGUgZmluYWwgc2l6ZQorICAgICAgICAgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEZJTkFMX0JJT1NMRU47CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIEJJT1MgYW5kIGludGVycnVwdCB2ZWN0b3IgaW5mb3JtYXRpb24gdG8gZGlzaworICAgICAgICAgICAgc3ByaW50ZihmaWxlbmFtZSwiJXMvYmlvcy4lMDJkIixQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpLGRldmljZSk7CisgICAgICAgICAgICBpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwid2IiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZ3cml0ZShjb3B5T2ZCSU9TLDEsRklOQUxfQklPU0xFTixmKTsKKyAgICAgICAgICAgICAgICBmd3JpdGUoVkdBSW5mb1tkZXZpY2VdLkxvd01lbSwxLHNpemVvZihWR0FJbmZvW2RldmljZV0uTG93TWVtKSxmKTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBjb3B5IG9mIEJJT1MgZnJvbSBzZWNvbmRhcnkgY29udHJvbGxlcnMKKyAgICAgICAgICAgIGlmICgoY29weU9mQklPUyA9IG1hbGxvYyhGSU5BTF9CSU9TTEVOKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBWR0FJbmZvW2RldmljZV0ucGNpSW5mbyA9ICZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV07CisgICAgICAgICAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlID0gY29weU9mQklPUzsKKyAgICAgICAgICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2VMZW4gPSBGSU5BTF9CSU9TTEVOOworCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBCSU9TIGFuZCBpbnRlcnJ1cHQgdmVjdG9yIGluZm9ybWF0aW9uIGZyb20gZGlzaworICAgICAgICAgICAgc3ByaW50ZihmaWxlbmFtZSwiJXMvYmlvcy4lMDJkIixQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpLGRldmljZSk7CisgICAgICAgICAgICBpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwicmIiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWFkKGNvcHlPZkJJT1MsMSxGSU5BTF9CSU9TTEVOLGYpOworICAgICAgICAgICAgICAgIGZyZWFkKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0sMSxzaXplb2YoVkdBSW5mb1tkZXZpY2VdLkxvd01lbSksZik7CisgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBGaXggdXAgYWxsIHRoZSBzZWNvbmRhcnkgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMKKyAgICAgICAgLy8gKHJlc3RvcmVzIHRoZW0gYWxsIGZyb20gdGhlIHZhbHVlcyB3ZSByZWFkIHByZXZpb3VzbHkpCisgICAgICAgIF9QQ0lfZml4dXBTZWNvbmRhcnlCQVJzKCk7CisKKyAgICAgICAgLy8gRGlzYWJsZSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYW5kIEFHUCBWR0EgcGFzcy10aHJvdWdoCisgICAgICAgIERJU0FCTEVfREVWSUNFKGRldmljZSk7CisgICAgICAgIGlmIChBR1BCcmlkZ2UpCisgICAgICAgICAgICBESVNBQkxFX0FHUF9WR0EoKTsKKyAgICAgICAgfQorCisgICAgLy8gUmVlbmFibGUgcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIHJlc2V0IEFHUCBicmlkZ2UgY29udHJvbAorICAgIGlmIChBR1BCcmlkZ2UpCisgICAgICAgIFJFU1RPUkVfQUdQX1ZHQSgpOworICAgIEVOQUJMRV9ERVZJQ0UoMCk7CisKKyAgICAvLyBGcmVlIHBoeXNpY2FsIEJJT1MgaW1hZ2UgbWFwcGluZworICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIobWFwcGVkQklPUyxNQVhfQklPU0xFTi0xKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIFg4NiBlbXVsYXRvciBCSU9TIGluZm8gdG8gcHJpbWFyeSBjb250cm9sbGVyCisgICAgaWYgKCF1c2VWODYpCisgICAgICAgIEJFX3NldFZHQSgmVkdBSW5mb1swXSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRW51bWVyYXRlcyB0aGUgUENJIGJ1cyBhbmQgZHVtcHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZQorbG9nIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRW51bWVyYXRlUENJKHZvaWQpCit7CisgICAgaW50ICAgICAgICAgICAgIGksaW5kZXg7CisgICAgUENJQnJpZGdlSW5mbyAgICppbmZvOworCisgICAgcHJpbnRrKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mIFBDSSBidXMgKCVkIGRldmljZXMsICVkIGRpc3BsYXkgZGV2aWNlcylcbiIsCisgICAgICAgIE51bVBDSSwgTnVtRGV2aWNlcyk7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykKKyAgICAgICAgcHJpbnRrKCIgIERpc3BsYXkgZGV2aWNlICVkIGlzIFBDSSBkZXZpY2UgJWRcbiIsaW5kZXgsRGV2aWNlSW5kZXhbaW5kZXhdKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgcHJpbnRrKCJCdXMgU2xvdCBGbmMgRGV2aWNlSUQgIFN1YlN5c3RlbSBSZXYgQ2xhc3MgSVJRIEludCBDbWRcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICBwcmludGsoIiUyZCAgICUyZCAgJTJkICAlMDRYOiUwNFggJTA0WDolMDRYICUwMlggICUwMlg6JTAyWCAlMDJYICAlMDJYICAlMDRYICAgIiwKKyAgICAgICAgICAgIFBDSVtpXS5zbG90LnAuQnVzLAorICAgICAgICAgICAgUENJW2ldLnNsb3QucC5EZXZpY2UsCisgICAgICAgICAgICBQQ0lbaV0uc2xvdC5wLkZ1bmN0aW9uLAorICAgICAgICAgICAgUENJW2ldLlZlbmRvcklELAorICAgICAgICAgICAgUENJW2ldLkRldmljZUlELAorICAgICAgICAgICAgUENJW2ldLlN1YlN5c3RlbVZlbmRvcklELAorICAgICAgICAgICAgUENJW2ldLlN1YlN5c3RlbUlELAorICAgICAgICAgICAgUENJW2ldLlJldklELAorICAgICAgICAgICAgUENJW2ldLkJhc2VDbGFzcywKKyAgICAgICAgICAgIFBDSVtpXS5TdWJDbGFzcywKKyAgICAgICAgICAgIFBDSVtpXS5JbnRlcnJ1cHRMaW5lLAorICAgICAgICAgICAgUENJW2ldLkludGVycnVwdFBpbiwKKyAgICAgICAgICAgIFBDSVtpXS5Db21tYW5kKTsKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQorICAgICAgICAgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgICAgcHJpbnRrKCJEZXZpY2VJRCAgU3RhdCBJZmMgQ2NoIExhdCBIZHIgQklTVFxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7CisgICAgICAgIHByaW50aygiJTA0WDolMDRYICUwNFggICUwMlggICUwMlggICUwMlggICUwMlggICUwMlggICAiLAorICAgICAgICAgICAgUENJW2ldLlZlbmRvcklELAorICAgICAgICAgICAgUENJW2ldLkRldmljZUlELAorICAgICAgICAgICAgUENJW2ldLlN0YXR1cywKKyAgICAgICAgICAgIFBDSVtpXS5JbnRlcmZhY2UsCisgICAgICAgICAgICBQQ0lbaV0uQ2FjaGVMaW5lU2l6ZSwKKyAgICAgICAgICAgIFBDSVtpXS5MYXRlbmN5VGltZXIsCisgICAgICAgICAgICBQQ0lbaV0uSGVhZGVyVHlwZSwKKyAgICAgICAgICAgIFBDSVtpXS5CSVNUKTsKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQorICAgICAgICAgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgICAgcHJpbnRrKCJEZXZpY2VJRCAgQmFzZTEwaCAgQmFzZTE0aCAgQmFzZTE4aCAgQmFzZTFDaCAgQmFzZTIwaCAgQmFzZTI0aCAgUk9NQmFzZVxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7CisgICAgICAgIHByaW50aygiJTA0WDolMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggIiwKKyAgICAgICAgICAgIFBDSVtpXS5WZW5kb3JJRCwKKyAgICAgICAgICAgIFBDSVtpXS5EZXZpY2VJRCwKKyAgICAgICAgICAgIFBDSVtpXS5CYXNlQWRkcmVzczEwLAorICAgICAgICAgICAgUENJW2ldLkJhc2VBZGRyZXNzMTQsCisgICAgICAgICAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxOCwKKyAgICAgICAgICAgIFBDSVtpXS5CYXNlQWRkcmVzczFDLAorICAgICAgICAgICAgUENJW2ldLkJhc2VBZGRyZXNzMjAsCisgICAgICAgICAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyNCwKKyAgICAgICAgICAgIFBDSVtpXS5ST01CYXNlQWRkcmVzcyk7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKKyAgICAgICAgICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisgICAgcHJpbnRrKCJcbiIpOworICAgIHByaW50aygiRGV2aWNlSUQgIEJBUjEwTGVuIEJBUjE0TGVuIEJBUjE4TGVuIEJBUjFDTGVuIEJBUjIwTGVuIEJBUjI0TGVuIFJPTUxlblxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7CisgICAgICAgIHByaW50aygiJTA0WDolMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggIiwKKyAgICAgICAgICAgIFBDSVtpXS5WZW5kb3JJRCwKKyAgICAgICAgICAgIFBDSVtpXS5EZXZpY2VJRCwKKyAgICAgICAgICAgIFBDSVtpXS5CYXNlQWRkcmVzczEwTGVuLAorICAgICAgICAgICAgUENJW2ldLkJhc2VBZGRyZXNzMTRMZW4sCisgICAgICAgICAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxOExlbiwKKyAgICAgICAgICAgIFBDSVtpXS5CYXNlQWRkcmVzczFDTGVuLAorICAgICAgICAgICAgUENJW2ldLkJhc2VBZGRyZXNzMjBMZW4sCisgICAgICAgICAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyNExlbiwKKyAgICAgICAgICAgIFBDSVtpXS5ST01CYXNlQWRkcmVzc0xlbik7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKKyAgICAgICAgICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisgICAgcHJpbnRrKCJcbiIpOworICAgIHByaW50aygiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiAlZCBicmlkZ2UgZGV2aWNlc1xuIixOdW1CcmlkZ2VzKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgcHJpbnRrKCJEZXZpY2VJRCAgUCMgUyMgQiMgSU9CICBJT0wgIE1lbUJhc2UgIE1lbUxpbWl0IFByZUJhc2UgIFByZUxpbWl0IEN0cmxcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1CcmlkZ2VzOyBpKyspIHsKKyAgICAgICAgaW5mbyA9IChQQ0lCcmlkZ2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2ldXTsKKyAgICAgICAgcHJpbnRrKCIlMDRYOiUwNFggJTAyWCAlMDJYICUwMlggJTA0WCAlMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA0WFxuIiwKKyAgICAgICAgICAgIGluZm8tPlZlbmRvcklELAorICAgICAgICAgICAgaW5mby0+RGV2aWNlSUQsCisgICAgICAgICAgICBpbmZvLT5QcmltYXJ5QnVzTnVtYmVyLAorICAgICAgICAgICAgaW5mby0+U2Vjb25kYXlCdXNOdW1iZXIsCisgICAgICAgICAgICBpbmZvLT5TdWJvcmRpbmF0ZUJ1c051bWJlciwKKyAgICAgICAgICAgICgodTE2KWluZm8tPklPQmFzZSA8PCA4KSAmIDB4RjAwMCwKKyAgICAgICAgICAgIGluZm8tPklPTGltaXQgPworICAgICAgICAgICAgICAgICgodTE2KWluZm8tPklPTGltaXQgPDwgOCkgfCAweEZGRiA6IDAsCisgICAgICAgICAgICAoKHUzMilpbmZvLT5NZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCisgICAgICAgICAgICBpbmZvLT5NZW1vcnlMaW1pdCA/CisgICAgICAgICAgICAgICAgKCh1MzIpaW5mby0+TWVtb3J5TGltaXQgPDwgMTYpIHwgMHhGRkZGRiA6IDAsCisgICAgICAgICAgICAoKHUzMilpbmZvLT5QcmVmZXRjaGFibGVNZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCisgICAgICAgICAgICBpbmZvLT5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA/CisgICAgICAgICAgICAgICAgKCh1MzIpaW5mby0+UHJlZmV0Y2hhYmxlTWVtb3J5TGltaXQgPDwgMTYpIHwgMHhGRkZGRiA6IDAsCisgICAgICAgICAgICBpbmZvLT5CcmlkZ2VDb250cm9sKTsKKyAgICAgICAgfQorICAgIHByaW50aygiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitOdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKK1BDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBpLGo7CisgICAgUENJQnJpZGdlSW5mbyAgICppbmZvOworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsCisgICAgLy8gZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4KKyAgICBpZiAoTnVtUENJID09IC0xKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUENJX0RFVklDRVM7IGkrKykKKyAgICAgICAgICAgIFBDSVtpXS5kd1NpemUgPSBzaXplb2YoUENJW2ldKTsKKyAgICAgICAgaWYgKChOdW1QQ0kgPSBQQ0lfZW51bWVyYXRlKFBDSSxNQVhfUENJX0RFVklDRVMpKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBhbGwgUENJIGJyaWRnZSBkZXZpY2VzCisgICAgICAgIGZvciAoaSA9IDAsTnVtQnJpZGdlcyA9IDAsQnJpZGdlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUENJW2ldLkJhc2VDbGFzcyA9PSBQQ0lfQlJJREdFX0NMQVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKE51bUJyaWRnZXMgPCBNQVhfUENJX0RFVklDRVMpCisgICAgICAgICAgICAgICAgICAgIEJyaWRnZUluZGV4W051bUJyaWRnZXMrK10gPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMKKyAgICAgICAgZm9yIChpID0gMCxOdW1EZXZpY2VzID0gMSxEZXZpY2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgeworICAgICAgICAgICAgICAgIGlmICgoUENJW2ldLkNvbW1hbmQgJiAweDMpID09IDB4MykgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VJbmRleFswXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE51bURldmljZXMgPCBNQVhfUENJX0RFVklDRVMpCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJbmRleFtOdW1EZXZpY2VzKytdID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQQ0lbaV0uc2xvdC5wLkJ1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZGV2aWNlIGlzIG9uIGEgZGlmZmVyZW50IGJ1cyB0aGFuIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAgICAgICAgIC8vIFBDSSBidXMsIHNvIGl0IGlzIHByb2JhYmx5IGFuIEFHUCBkZXZpY2UuIEZpbmQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIEFHUCBidXMgZGV2aWNlIHRoYXQgY29udHJvbHMgdGhhdCBidXMgc28gd2UgY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wgaXQuCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOdW1CcmlkZ2VzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAoUENJQnJpZGdlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtqXV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW2ldLnNsb3QucC5CdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR1BCcmlkZ2UgPSBpbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBFbnVtZXJhdGUgYWxsIFBDSSBhbmQgYnJpZGdlIGRldmljZXMgdG8gbG9nIGZpbGUKKyAgICAgICAgRW51bWVyYXRlUENJKCk7CisgICAgICAgIH0KKyAgICByZXR1cm4gTnVtRGV2aWNlczsKK30KKworRklMRSAqbG9nZmlsZTsKKwordm9pZCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdwdHI7CisgICAgdmFfc3RhcnQoYXJncHRyLCBmbXQpOworICAgIHZmcHJpbnRmKGxvZ2ZpbGUsIGZtdCwgYXJncHRyKTsKKyAgICBmZmx1c2gobG9nZmlsZSk7CisgICAgdmFfZW5kKGFyZ3B0cik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICB3aGlsZSAoYXJnYyA+IDEpIHsKKyAgICAgICAgaWYgKHN0cmljbXAoYXJndlsxXSwiLXVzZXY4NiIpID09IDApIHsKKyAgICAgICAgICAgIHVzZVY4NiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLWZvcmNlIikgPT0gMCkgeworICAgICAgICAgICAgZm9yY2VQb3N0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiAgREVCVUcKKyAgICAgICAgZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItZGVjb2RlIikgPT0gMCkgeworICAgICAgICAgICAgZGVidWdGbGFncyB8PSBERUJVR19ERUNPREVfRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItaW90cmFjZSIpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnRmxhZ3MgfD0gREVCVUdfSU9fVFJBQ0VfRjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiVXNhZ2U6IHdhcm1ib290IFstdXNldjg2XSBbLWZvcmNlXSBbLWRlY29kZV0gWy1pb3RyYWNlXVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CisgICAgICAgIH0KKyAgICBpZiAoKGxvZ2ZpbGUgPSBmb3Blbigid2FybWJvb3QubG9nIiwidyIpKSA9PSBOVUxMKQorICAgICAgICBleGl0KDEpOworCisgICAgUE1faW5pdCgpOworICAgIGlmICghdXNlVjg2KSB7CisgICAgICAgIC8vIEluaXRpYWxpc2UgdGhlIHg4NiBCSU9TIGVtdWxhdG9yCisgICAgICAgIEJFX2luaXQoZmFsc2UsZGVidWdGbGFncyw2NTUzNiwmVkdBSW5mb1swXSk7CisgICAgICAgIH0KKworICAgIC8vIEVudW1lcmF0ZSBhbGwgZGV2aWNlcyAod2hpY2ggUE9TVCdzIHRoZW0gYXQgdGhlIHNhbWUgdGltZSkKKyAgICBpZiAoUENJX2VudW1lcmF0ZURldmljZXMoKSA8IDEpIHsKKyAgICAgICAgcHJpbnRrKCJObyBQQ0kgZGlzcGxheSBkZXZpY2VzIGZvdW5kIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgLy8gUG9zdCBhbGwgdGhlIGRpc3BsYXkgY29udHJvbGxlciBCSU9TJ2VzCisgICAgUENJX3Bvc3RDb250cm9sbGVycygpOworCisgICAgLy8gQ2xlYW51cCBhbmQgZXhpdCB0aGUgZW11bGF0b3IKKyAgICBpZiAoIXVzZVY4NikKKyAgICAgICAgQkVfZXhpdCgpOworICAgIGZjbG9zZShsb2dmaWxlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fYWFfaW1wLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fYWFfaW1wLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE5MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19hYV9pbXAuYXNtCkBAIC0wLDAgKzEsNTEgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgQXVkaW8gQXJjaGl0ZWN0dXJlCis7KgorOyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Cis7KiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorOyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKzsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorOyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKzsqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Cis7KiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Cis7KiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorOyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKzsqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIFRBU00gNC4wIG9yIE5BU00KKzsqIEVudmlyb25tZW50OiBJQk0gUEMgMzIgYml0IFByb3RlY3RlZCBNb2RlLgorOyoKKzsqIERlc2NyaXB0aW9uOiBNb2R1bGUgdG8gaW1wbGVtZW50IHRoZSBpbXBvcnQgc3R1YnMgZm9yIGFsbCB0aGUgTnVjbGV1cworOyogICAgICAgICAgICAgIEF1ZGlvIEFQSSBmdW5jdGlvbnMgZm9yIEludGVsIGJpbmFyeSBjb21wYXRpYmxlIGRyaXZlcnMuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitCRUdJTl9JTVBPUlRTX0RFRiAgIF9BQV9leHBvcnRzCitTS0lQX0lNUCAgICBBQV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQorU0tJUF9JTVAgICAgQUFfZXJyb3JNc2cgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEFBX2dldERheXNMZWZ0ICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCitTS0lQX0lNUCAgICBBQV9yZWdpc3RlckxpY2Vuc2UgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQorU0tJUF9JTVAgICAgQUFfZW51bWVyYXRlRGV2aWNlcyAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEFBX2xvYWREcml2ZXIgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCitERUNMQVJFX0lNUCBBQV91bmxvYWREcml2ZXIKK0RFQ0xBUkVfSU1QIEFBX3NhdmVPcHRpb25zCitFTkRfSU1QT1JUU19ERUYKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE3NjAwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYV9pbXAuYXNtCkBAIC0wLDAgKzEsMTM2IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorOyoKKzsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKzsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKzsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKzsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Cis7KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKzsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKzsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Cis7KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Cis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KKzsqCis7KiBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGltcGxlbWVudCB0aGUgaW1wb3J0IHN0dWJzIGZvciBhbGwgdGhlIE51Y2xldXMKKzsqICAgICAgICAgICAgICBHcmFwaGljcyBBUEkgZnVuY3Rpb25zIGZvciBJbnRlbCBiaW5hcnkgY29tcGF0aWJsZSBkcml2ZXJzLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKKworQkVHSU5fSU1QT1JUU19ERUYgICBfX0dBX2V4cG9ydHMKK1NLSVBfSU1QICAgIEdBX3N0YXR1cywwICAgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2Vycm9yTXNnLDEgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2dldERheXNMZWZ0LDEgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX3JlZ2lzdGVyTGljZW5zZSwyICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2VudW1lcmF0ZURldmljZXMsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2xvYWREcml2ZXIsMiAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK0RFQ0xBUkVfSU1QIEdBX3NldEFjdGl2ZURldmljZSwxCitTS0lQX0lNUCAgICBHQV9yZXNlcnZlZDEsMCAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCitERUNMQVJFX0lNUCBHQV91bmxvYWREcml2ZXIsMQorREVDTEFSRV9JTVAgUkVGMkRfbG9hZERyaXZlciw2CitERUNMQVJFX0lNUCBSRUYyRF91bmxvYWREcml2ZXIsMgorREVDTEFSRV9JTVAgR0FfbG9hZFJlZjJkLDUKK0RFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZjJkLDEKK0RFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9Jbml0LDEKK0RFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9PbiwwCitERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvU2NoZWR1bGVGbGlwLDIKK0RFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzLDAKK0RFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9XYWl0VGlsbEZsaXBwZWQsMAorREVDTEFSRV9JTVAgR0Ffc29mdFN0ZXJlb09mZiwwCitERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvRXhpdCwwCitERUNMQVJFX0lNUCBHQV9zYXZlTW9kZVByb2ZpbGUsMgorREVDTEFSRV9JTVAgR0Ffc2F2ZU9wdGlvbnMsMgorREVDTEFSRV9JTVAgR0Ffc2F2ZUNSVENUaW1pbmdzLDEKK0RFQ0xBUkVfSU1QIEdBX3Jlc3RvcmVDUlRDVGltaW5ncywxCitERUNMQVJFX0lNUCBERENfaW5pdCwxCitERUNMQVJFX0lNUCBERENfcmVhZEVESUQsNQorREVDTEFSRV9JTVAgRURJRF9wYXJzZSwzCitERUNMQVJFX0lNUCBNQ1NfYmVnaW4sMQorREVDTEFSRV9JTVAgTUNTX2dldENhcGFiaWxpdGllc1N0cmluZywyCitERUNMQVJFX0lNUCBNQ1NfaXNDb250cm9sU3VwcG9ydGVkLDEKK0RFQ0xBUkVfSU1QIE1DU19lbmFibGVDb250cm9sLDIKK0RFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sTWF4LDIKK0RFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sVmFsdWUsMgorREVDTEFSRV9JTVAgTUNTX2dldENvbnRyb2xWYWx1ZXMsMworREVDTEFSRV9JTVAgTUNTX3NldENvbnRyb2xWYWx1ZSwyCitERUNMQVJFX0lNUCBNQ1Nfc2V0Q29udHJvbFZhbHVlcywzCitERUNMQVJFX0lNUCBNQ1NfcmVzZXRDb250cm9sLDEKK0RFQ0xBUkVfSU1QIE1DU19zYXZlQ3VycmVudFNldHRpbmdzLDAKK0RFQ0xBUkVfSU1QIE1DU19nZXRUaW1pbmdSZXBvcnQsMworREVDTEFSRV9JTVAgTUNTX2dldFNlbGZUZXN0UmVwb3J0LDMKK0RFQ0xBUkVfSU1QIE1DU19lbmQsMAorU0tJUF9JTVAgICAgR0FfbG9hZEluR1VJLDEgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQorREVDTEFSRV9JTVAgRERDX3dyaXRlRURJRCw2CitERUNMQVJFX0lNUCBHQV91c2VEb3VibGVTY2FuLDEKK0RFQ0xBUkVfSU1QIEdBX2dldE1heFJlZnJlc2hSYXRlLDQKK0RFQ0xBUkVfSU1QIEdBX2NvbXB1dGVDUlRDVGltaW5ncyw2CitERUNMQVJFX0lNUCBHQV9hZGRNb2RlLDUKK0RFQ0xBUkVfSU1QIEdBX2FkZFJlZnJlc2gsNQorREVDTEFSRV9JTVAgR0FfZGVsTW9kZSw1CitERUNMQVJFX0lNUCBOX2dldExvZ05hbWUsMAorU0tJUF9JTVAyICAgTl9sb2cKK0RFQ0xBUkVfSU1QIE1EQlhfZ2V0RXJyQ29kZSwwCitERUNMQVJFX0lNUCBNREJYX2dldEVycm9yTXNnLDAKK0RFQ0xBUkVfSU1QIE1EQlhfb3BlbiwxCitERUNMQVJFX0lNUCBNREJYX2Nsb3NlLDAKK0RFQ0xBUkVfSU1QIE1EQlhfZmlyc3QsMQorREVDTEFSRV9JTVAgTURCWF9sYXN0LDEKK0RFQ0xBUkVfSU1QIE1EQlhfbmV4dCwxCitERUNMQVJFX0lNUCBNREJYX3ByZXYsMQorREVDTEFSRV9JTVAgTURCWF9pbnNlcnQsMQorREVDTEFSRV9JTVAgTURCWF91cGRhdGUsMQorREVDTEFSRV9JTVAgTURCWF9mbHVzaCwwCitERUNMQVJFX0lNUCBNREJYX2ltcG9ydElORiwyCitTS0lQX0lNUCAgICBHQV9nZXRHbG9iYWxPcHRpb25zLDIgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCitERUNMQVJFX0lNUCBHQV9zZXRHbG9iYWxPcHRpb25zLDEKK0RFQ0xBUkVfSU1QIEdBX3NhdmVHbG9iYWxPcHRpb25zLDEKK0RFQ0xBUkVfSU1QIEdBX2dldEludGVybmFsTmFtZSwxCitERUNMQVJFX0lNUCBHQV9nZXROdWNsZXVzQ29uZmlnUGF0aCwwCitERUNMQVJFX0lNUCBHQV9nZXRGYWtlUENJSUQsMAorU0tJUF9JTVAgICAgR0FfbG9hZExpYnJhcnksMyAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQorU0tJUF9JTVAgICAgR0FfaXNPRU1WZXJzaW9uLDEgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQorREVDTEFSRV9JTVAgR0FfaXNMaXRlVmVyc2lvbiwxCitERUNMQVJFX0lNUCBHQV9nZXREaXNwbGF5U2VyaWFsTm8sMQorREVDTEFSRV9JTVAgR0FfZ2V0RGlzcGxheVVzZXJOYW1lLDEKK1NLSVBfSU1QICAgIEdBX2dldEN1cnJlbnREcml2ZXIsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2dldEN1cnJlbnRSZWYyZCwxICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK1NLSVBfSU1QICAgIEdBX2dldExpY2Vuc2VkRGV2aWNlcywxICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKK0RFQ0xBUkVfSU1QIEREQ19pbml0RXh0LDIKK0RFQ0xBUkVfSU1QIE1DU19iZWdpbkV4dCwyCitERUNMQVJFX0lNUCBHQV9sb2FkUmVnaW9uTWdyLDMKK0RFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZ2lvbk1nciwxCitERUNMQVJFX0lNUCBHQV9nZXRQcm9jQWRkcmVzcywyCitERUNMQVJFX0lNUCBHQV9lbmFibGVWQkVNb2RlLDUKK0RFQ0xBUkVfSU1QIEdBX2Rpc2FibGVWQkVNb2RlLDUKK0RFQ0xBUkVfSU1QIEdBX2xvYWRNb2RlUHJvZmlsZSwyCitERUNMQVJFX0lNUCBHQV9nZXRDUlRDVGltaW5ncyw0CitERUNMQVJFX0lNUCBHQV9zZXRDUlRDVGltaW5ncyw0CitERUNMQVJFX0lNUCBHQV9zZXREZWZhdWx0UmVmcmVzaCw2CitERUNMQVJFX0lNUCBHQV9zYXZlTW9uaXRvckluZm8sMgorREVDTEFSRV9JTVAgR0FfZGV0ZWN0UG5QTW9uaXRvciwzCitTS0lQX0lNUDMgICBHQV9xdWVyeUZ1bmN0aW9ucworU0tJUF9JTVAzICAgUkVGMkRfcXVlcnlGdW5jdGlvbnMKK0VORF9JTVBPUlRTX0RFRgorCisgICAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhdGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk0YTYyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbQpAQCAtMCwwICsxLDI0OCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKzsqCis7KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKzsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Cis7KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Cis7KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKzsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKzsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Cis7KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBOQVNNIG9yIFRBU00KKzsqIEVudmlyb25tZW50OiBJQk0gUEMgMzIgYml0IFByb3RlY3RlZCBNb2RlLgorOyoKKzsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIE51Y2xldXMgbGlicmFyeSBmb3IKKzsqICAgICAgICAgICAgICB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWluZyBzdXBwb3J0IGZ1bmN0aW9ucyBwcm92aWRlZCBieQorOyogICAgICAgICAgICAgIHRoZSBJbnRlbCBQZW50aXVtIGFuZCBjb21wYXRpYmxlIHByb2Nlc3NvcnMuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgIF9nYXRpbWVyCisKK2JlZ2NvZGVzZWcgIF9nYXRpbWVyCisKK2lmZGVmICAgVVNFX05BU00KKyVtYWNybyBtQ1BVX0lEIDAKK2RiICAwMEZoLDBBMmgKKyVlbmRtYWNybworZWxzZQorTUFDUk8gICBtQ1BVX0lECitkYiAgMDBGaCwwQTJoCitFTkRNCitlbmRpZgorCitpZmRlZiAgIFVTRV9OQVNNCislbWFjcm8gbVJEVFNDIDAKK2RiICAwMEZoLDAzMWgKKyVlbmRtYWNybworZWxzZQorTUFDUk8gICBtUkRUU0MKK2RiICAwMEZoLDAzMWgKK0VORE0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGJvb2wgX0dBX2hhdmVDUFVJRCh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIHN1cHBvcnQgZm9yIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfR0FfaGF2ZUNQVUlECisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgb3JpZ2luYWwgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIG1vdiAgICAgZWN4LCBlYXgKKyAgICAgICAgeG9yICAgICBlYXgsIDIwMDAwMGggICAgICAgIDsgRmxpcCBJRCBiaXQgaW4gRUZMQUdTCisgICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaworICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCisgICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBuZXcgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCisgICAgICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgICAgICA7IENhbiBub3QgdG9nZ2xlIElEIGJpdCwKKyAgICAgICAgam56ICAgICBAQDEgICAgICAgICAgICAgICAgIDsgUHJvY2Vzc29yPTgwNDg2CisgICAgICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSBDUFVJRCBzdXBwb3J0CisgICAgICAgIGptcCAgICAgQEBEb25lCitAQDE6ICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICA7IFdlIGhhdmUgQ1BVSUQgc3VwcG9ydAorQEBEb25lOiBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1aW50IF9HQV9nZXRDUFVJREZlYXR1cmVzKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0dBX2dldENQVUlERmVhdHVyZXMKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgorICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECisgICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAorICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCisgICAgICAgIHhvciAgICAgZWF4LCBlYXgKKyAgICAgICAgaW5jICAgICBlYXgKKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcworICAgICAgICBtb3YgICAgIGVheCwgZWR4CitAQERvbmU6IGxlYXZlX2MKKyAgICAgICAgcmV0CisKK0BARmFpbDogeG9yICAgICBlYXgsZWF4CisgICAgICAgIGptcCAgICAgQEBEb25lCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgIF9HQV9yZWFkVGltZVN0YW1wKEdBX2xhcmdlSW50ZWdlciAqdGltZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWRzIHRoZSB0aW1lIHN0YW1wIGNvdW50ZXIgYW5kIHJldHVybnMgdGhlIDY0LWJpdCByZXN1bHQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0dBX3JlYWRUaW1lU3RhbXAKKworICAgICAgICBtUkRUU0MKKyAgICAgICAgbW92ICAgICBlY3gsW2VzcCs0XSAgICAgOyBBY2Nlc3MgZGlyZWN0bHkgd2l0aG91dCBzdGFjayBmcmFtZQorICAgICAgICBtb3YgICAgIFtlY3hdLGVheAorICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBOX3VpbnQzMiBHQV9UaW1lckRpZmZlcmVuY2UoR0FfbGFyZ2VJbnRlZ2VyICphLEdBX2xhcmdlSW50ZWdlciAqYikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIDY0LWJpdCBudW1iZXJzIChhLWIpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgR0FfVGltZXJEaWZmZXJlbmNlCisKKyAgICAgICAgQVJHICAgICBhOkRQVFIsIGI6RFBUUiwgdDpEUFRSCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgZWN4LFthXQorICAgICAgICBtb3YgICAgIGVheCxbZWN4XSAgICAgICA7IEVBWCA6PSBiLmxvdworICAgICAgICBtb3YgICAgIGVjeCxbYl0KKyAgICAgICAgc3ViICAgICBlYXgsW2VjeF0KKyAgICAgICAgbW92ICAgICBlZHgsZWF4ICAgICAgICAgOyBFRFggOj0gbG93IGRpZmZlcmVuY2UKKyAgICAgICAgbW92ICAgICBlY3gsW2FdCisgICAgICAgIG1vdiAgICAgZWF4LFtlY3grNF0gICAgIDsgRUNYIDo9IGIuaGlnaAorICAgICAgICBtb3YgICAgIGVjeCxbYl0KKyAgICAgICAgc2JiICAgICBlYXgsW2VjeCs0XSAgICAgOyBFQVggOj0gaGlnaCBkaWZmZXJlbmNlCisgICAgICAgIG1vdiAgICAgZWF4LGVkeCAgICAgICAgIDsgUmV0dXJuIGxvdyBwYXJ0CisKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KKzsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCis7IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KKworaWZkZWYgICBVU0VfTkFTTQorJW1hY3JvICBERUxBWV9USU1FUiAwCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCislZW5kbWFjcm8KK2Vsc2UKK21hY3JvICAgREVMQVlfVElNRVIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKK2VuZG0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX09TX2RlbGF5ODI1MyhOX3VpbnQzMiBtaWNyb1NlY29uZHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGVsYXlzIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMsIGJ5IGRpcmVjdGx5IHByb2dyYW1taW5nCis7IHRoZSA4MjUzIHRpbWVyIGNoaXBzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9PU19kZWxheTgyNTMKKworICAgICAgICBBUkcgICAgIG1pY3JvU2VjOlVJTlQKKworICAgICAgICBlbnRlcl9jCisKKzsgU3RhcnQgdGltZXIgMiBjb3VudGluZworCisgICAgICAgIG1vdiAgICAgX2F4LFttaWNyb1NlY10gICAgICA7IEVBWCA6PSBjb3VudCBpbiBtaWNyb3NlY29uZHMKKyAgICAgICAgbW92ICAgICBlY3gsMTE5NgorICAgICAgICBtdWwgICAgIGVjeAorICAgICAgICBtb3YgICAgIGVjeCwxMDAwCisgICAgICAgIGRpdiAgICAgZWN4CisgICAgICAgIG1vdiAgICAgZWN4LGVheCAgICAgICAgICAgICA7IEVDWCA6PSBjb3VudCBpbiB0aW1lciB0aWNrcworICAgICAgICBpbiAgICAgIGFsLDYxaAorICAgICAgICBvciAgICAgIGFsLDEKKyAgICAgICAgb3V0ICAgICA2MWgsYWwKKworOyBTZXQgdGhlIHRpbWVyIDIgY291bnQgdG8gMCBhZ2FpbiB0byBzdGFydCB0aGUgdGltaW5nIGludGVydmFsLgorCisgICAgICAgIG1vdiAgICAgYWwsMTAxMTAxMDBiICAgICAgICA7IHNldCB1cCB0byBsb2FkIGluaXRpYWwgKHRpbWVyIDIpCisgICAgICAgIG91dCAgICAgNDNoLGFsICAgICAgICAgICAgICA7IHRpbWVyIGNvdW50CisgICAgICAgIERFTEFZX1RJTUVSCisgICAgICAgIHN1YiAgICAgYWwsYWwKKyAgICAgICAgb3V0ICAgICA0MmgsYWwgICAgICAgICAgICAgIDsgbG9hZCBjb3VudCBsc2IKKyAgICAgICAgREVMQVlfVElNRVIKKyAgICAgICAgb3V0ICAgICA0MmgsYWwgICAgICAgICAgICAgIDsgbG9hZCBjb3VudCBtc2IKKyAgICAgICAgeG9yICAgICBkaSxkaSAgICAgICAgICAgICAgIDsgQWxsb3cgbWF4IDY0SyBsb29wIGl0ZXJhdGlvbnMKKworQEBMb29wU3RhcnQ6CisgICAgICAgIGRlYyAgICAgZGkgICAgICAgICAgICAgICAgICA7IFRoaXMgaXMgYSBndWFyZCBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eSB0aGF0CisgICAgICAgIGp6ICAgICAgQEBMb29wRW5kICAgICAgICAgICA7IHNvbWVvbmUgZWcuIHN0b3BwZWQgdGhlIHRpbWVyIGJlaGluZCBvdXIgYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQWZ0ZXIgNjRLIGl0ZXJhdGlvbnMgd2UgYmFpbCBvdXQgbm8gbWF0dGVyIHdoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgKGFuZCBob3BlIGl0IHdhc24ndCB0b28gc29vbikKKyAgICAgICAgbW92ICAgICBhbCwwMDAwMDAwMGIgICAgICAgIDsgbGF0Y2ggdGltZXIgMAorICAgICAgICBvdXQgICAgIDQzaCxhbAorICAgICAgICBERUxBWV9USU1FUgorICAgICAgICBpbiAgICAgIGFsLDQyaCAgICAgICAgICAgICAgOyBsZWFzdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgIERFTEFZX1RJTUVSCisgICAgICAgIG1vdiAgICAgYWgsYWwKKyAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgIHhjaGcgICAgYWgsYWwKKyAgICAgICAgbmVnICAgICBheCAgICAgICAgICAgICAgICAgIDsgQ29udmVydCBmcm9tIGNvdW50ZG93biByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIHRvIGVsYXBzZWQgY291bnQKKyAgICAgICAgY21wICAgICBheCxjeCAgICAgICAgICAgICAgIDsgSGFzIGRlbGF5IGV4cGlyZWQ/CisgICAgICAgIGpiICAgICAgQEBMb29wU3RhcnQgICAgICAgICA7IE5vLCBzbyBsb29wIHRpbGwgZG9uZQorCis7IFN0b3AgdGltZXIgMiBmcm9tIGNvdW50aW5nCitAQExvb3BFbmQ6CisgICAgICAgIGluICAgICAgYWwsNjFICisgICAgICAgIGFuZCAgICAgYWwsMEZFaAorICAgICAgICBvdXQgICAgIDYxSCxhbAorCis7IFNvbWUgcHJvZ3JhbXMgaGF2ZSBhIHByb2JsZW0gaWYgd2UgY2hhbmdlIHRoZSBjb250cm9sIHBvcnQ7IGJldHRlciBjaGFuZ2UgaXQKKzsgdG8gc29tZXRoaW5nIHRoZXkgZXhwZWN0IChtb2RlIDMgLSBzcXVhcmUgd2F2ZSBnZW5lcmF0b3IpLi4uCisgICAgICAgIG1vdiAgICAgYWwsMEI2aAorICAgICAgICBvdXQgICAgIDQzaCxhbAorCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF9nYXRpbWVyCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fcG1faW1wLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fcG1faW1wLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGIxMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19wbV9pbXAuYXNtCkBAIC0wLDAgKzEsMTk1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKzsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Cis7KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Cis7KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKzsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Cis7KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKzsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Cis7KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgVEFTTSA0LjAgb3IgTkFTTQorOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCis7KgorOyogRGVzY3JpcHRpb246IE1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIGltcG9ydCBzdHVicyBmb3IgYWxsIHRoZSBQTQorOyogICAgICAgICAgICAgIEFQSSBmdW5jdGlvbnMgZm9yIEludGVsIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXJzLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKKworQkVHSU5fSU1QT1JUU19ERUYgICBfUE1faW1wb3J0cworREVDTEFSRV9JTVAgUE1fZ2V0TW9kZVR5cGUsMAorREVDTEFSRV9JTVAgUE1fZ2V0QklPU1BvaW50ZXIsMAorREVDTEFSRV9JTVAgUE1fZ2V0QTAwMDBQb2ludGVyLDAKK0RFQ0xBUkVfSU1QIFBNX21hcFBoeXNpY2FsQWRkciwwCitERUNMQVJFX0lNUCBQTV9tYWxsb2NTaGFyZWQsMAorU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMSwwCitERUNMQVJFX0lNUCBQTV9mcmVlU2hhcmVkLDAKK0RFQ0xBUkVfSU1QIFBNX21hcFRvUHJvY2VzcywwCitERUNMQVJFX0lNUCBQTV9tYXBSZWFsUG9pbnRlciwwCitERUNMQVJFX0lNUCBQTV9hbGxvY1JlYWxTZWcsMAorREVDTEFSRV9JTVAgUE1fZnJlZVJlYWxTZWcsMAorREVDTEFSRV9JTVAgUE1fYWxsb2NMb2NrZWRNZW0sMAorREVDTEFSRV9JTVAgUE1fZnJlZUxvY2tlZE1lbSwwCitERUNMQVJFX0lNUCBQTV9jYWxsUmVhbE1vZGUsMAorREVDTEFSRV9JTVAgUE1faW50ODYsMAorREVDTEFSRV9JTVAgUE1faW50ODZ4LDAKK0RFQ0xBUkVfSU1QIERQTUlfaW50ODYsMAorREVDTEFSRV9JTVAgUE1fYXZhaWxhYmxlTWVtb3J5LDAKK0RFQ0xBUkVfSU1QIFBNX2dldFZFU0FCdWYsMAorREVDTEFSRV9JTVAgUE1fZ2V0T1NUeXBlLDAKK0RFQ0xBUkVfSU1QIFBNX2ZhdGFsRXJyb3IsMAorREVDTEFSRV9JTVAgUE1fc2V0QmFua0EsMAorREVDTEFSRV9JTVAgUE1fc2V0QmFua0FCLDAKK0RFQ0xBUkVfSU1QIFBNX3NldENSVFN0YXJ0LDAKK0RFQ0xBUkVfSU1QIFBNX2dldEN1cnJlbnRQYXQsMAorREVDTEFSRV9JTVAgUE1fZ2V0VkJFQUZQYXRoLDAKK0RFQ0xBUkVfSU1QIFBNX2dldE51Y2xldXNQYXRoLDAKK0RFQ0xBUkVfSU1QIFBNX2dldE51Y2xldXNDb25maWdQYXRoLDAKK0RFQ0xBUkVfSU1QIFBNX2dldFVuaXF1ZUlELDAKK0RFQ0xBUkVfSU1QIFBNX2dldE1hY2hpbmVOYW1lLDAKK0RFQ0xBUkVfSU1QIFZGX2F2YWlsYWJsZSwwCitERUNMQVJFX0lNUCBWRl9pbml0LDAKK0RFQ0xBUkVfSU1QIFZGX2V4aXQsMAorREVDTEFSRV9JTVAgUE1fb3BlbkNvbnNvbGUsMAorREVDTEFSRV9JTVAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSwwCitERUNMQVJFX0lNUCBQTV9zYXZlQ29uc29sZVN0YXRlLDAKK0RFQ0xBUkVfSU1QIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUsMAorREVDTEFSRV9JTVAgUE1fY2xvc2VDb25zb2xlLDAKK0RFQ0xBUkVfSU1QIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24sMAorREVDTEFSRV9JTVAgUE1fc2V0T1NTY3JlZW5XaWR0aCwwCitERUNMQVJFX0lNUCBQTV9lbmFibGVXcml0ZUNvbWJpbmUsMAorREVDTEFSRV9JTVAgUE1fYmFja3NsYXNoLDAKK0RFQ0xBUkVfSU1QIFBNX2xvY2tEYXRhUGFnZXMsMAorREVDTEFSRV9JTVAgUE1fdW5sb2NrRGF0YVBhZ2VzLDAKK0RFQ0xBUkVfSU1QIFBNX2xvY2tDb2RlUGFnZXMsMAorREVDTEFSRV9JTVAgUE1fdW5sb2NrQ29kZVBhZ2VzLDAKK0RFQ0xBUkVfSU1QIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyLDAKK0RFQ0xBUkVfSU1QIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3ksMAorREVDTEFSRV9JTVAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyLDAKK0RFQ0xBUkVfSU1QIFBNX2RvQklPU1BPU1QsMAorREVDTEFSRV9JTVAgUE1fZ2V0Qm9vdERyaXZlLDAKK0RFQ0xBUkVfSU1QIFBNX2ZyZWVQaHlzaWNhbEFkZHIsMAorREVDTEFSRV9JTVAgUE1faW5wYiwwCitERUNMQVJFX0lNUCBQTV9pbnB3LDAKK0RFQ0xBUkVfSU1QIFBNX2lucGQsMAorREVDTEFSRV9JTVAgUE1fb3V0cGIsMAorREVDTEFSRV9JTVAgUE1fb3V0cHcsMAorREVDTEFSRV9JTVAgUE1fb3V0cGQsMAorU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMiwwCitERUNMQVJFX0lNUCBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2ssMAorREVDTEFSRV9JTVAgUE1faGF2ZUJJT1NBY2Nlc3MsMAorREVDTEFSRV9JTVAgUE1fa2JoaXQsMAorREVDTEFSRV9JTVAgUE1fZ2V0Y2gsMAorREVDTEFSRV9JTVAgUE1fZmluZEJQRCwwCitERUNMQVJFX0lNUCBQTV9nZXRQaHlzaWNhbEFkZHIsMAorREVDTEFSRV9JTVAgUE1fc2xlZXAsMAorREVDTEFSRV9JTVAgUE1fZ2V0Q09NUG9ydCwwCitERUNMQVJFX0lNUCBQTV9nZXRMUFRQb3J0LDAKK0RFQ0xBUkVfSU1QIFBNX2xvYWRMaWJyYXJ5LDAKK0RFQ0xBUkVfSU1QIFBNX2dldFByb2NBZGRyZXNzLDAKK0RFQ0xBUkVfSU1QIFBNX2ZyZWVMaWJyYXJ5LDAKK0RFQ0xBUkVfSU1QIFBDSV9lbnVtZXJhdGUsMAorREVDTEFSRV9JTVAgUENJX2FjY2Vzc1JlZywwCitERUNMQVJFX0lNUCBQQ0lfc2V0SGFyZHdhcmVJUlEsMAorREVDTEFSRV9JTVAgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUsMAorU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMywwCitERUNMQVJFX0lNUCBQQ0lCSU9TX2dldEVudHJ5LDAKK0RFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JUeXBlLDAKK0RFQ0xBUkVfSU1QIENQVV9oYXZlTU1YLDAKK0RFQ0xBUkVfSU1QIENQVV9oYXZlM0ROb3csMAorREVDTEFSRV9JTVAgQ1BVX2hhdmVTU0UsMAorREVDTEFSRV9JTVAgQ1BVX2hhdmVSRFRTQywwCitERUNMQVJFX0lNUCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsMAorREVDTEFSRV9JTVAgWlRpbWVySW5pdCwwCitERUNMQVJFX0lNUCBMWlRpbWVyT24sMAorREVDTEFSRV9JTVAgTFpUaW1lckxhcCwwCitERUNMQVJFX0lNUCBMWlRpbWVyT2ZmLDAKK0RFQ0xBUkVfSU1QIExaVGltZXJDb3VudCwwCitERUNMQVJFX0lNUCBMWlRpbWVyT25FeHQsMAorREVDTEFSRV9JTVAgTFpUaW1lckxhcEV4dCwwCitERUNMQVJFX0lNUCBMWlRpbWVyT2ZmRXh0LDAKK0RFQ0xBUkVfSU1QIExaVGltZXJDb3VudEV4dCwwCitERUNMQVJFX0lNUCBVTFpUaW1lck9uLDAKK0RFQ0xBUkVfSU1QIFVMWlRpbWVyTGFwLDAKK0RFQ0xBUkVfSU1QIFVMWlRpbWVyT2ZmLDAKK0RFQ0xBUkVfSU1QIFVMWlRpbWVyQ291bnQsMAorREVDTEFSRV9JTVAgVUxaUmVhZFRpbWUsMAorREVDTEFSRV9JTVAgVUxaRWxhcHNlZFRpbWUsMAorREVDTEFSRV9JTVAgVUxaVGltZXJSZXNvbHV0aW9uLDAKK0RFQ0xBUkVfSU1QIFBNX2ZpbmRGaXJzdEZpbGUsMAorREVDTEFSRV9JTVAgUE1fZmluZE5leHRGaWxlLDAKK0RFQ0xBUkVfSU1QIFBNX2ZpbmRDbG9zZSwwCitERUNMQVJFX0lNUCBQTV9tYWtlcGF0aCwwCitERUNMQVJFX0lNUCBQTV9zcGxpdHBhdGgsMAorREVDTEFSRV9JTVAgUE1fZHJpdmVWYWxpZCwwCitERUNMQVJFX0lNUCBQTV9nZXRkY3dkLDAKK0RFQ0xBUkVfSU1QIFBNX3NldEZpbGVBdHRyLDAKK0RFQ0xBUkVfSU1QIFBNX21rZGlyLDAKK0RFQ0xBUkVfSU1QIFBNX3JtZGlyLDAKK0RFQ0xBUkVfSU1QIFBNX2dldEZpbGVBdHRyLDAKK0RFQ0xBUkVfSU1QIFBNX2dldEZpbGVUaW1lLDAKK0RFQ0xBUkVfSU1QIFBNX3NldEZpbGVUaW1lLDAKK0RFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JOYW1lLDAKK0RFQ0xBUkVfSU1QIFBNX2dldFZHQVN0YXRlU2l6ZSwwCitERUNMQVJFX0lNUCBQTV9zYXZlVkdBU3RhdGUsMAorREVDTEFSRV9JTVAgUE1fcmVzdG9yZVZHQVN0YXRlLDAKK0RFQ0xBUkVfSU1QIFBNX3ZnYUJsYW5rRGlzcGxheSwwCitERUNMQVJFX0lNUCBQTV92Z2FVbmJsYW5rRGlzcGxheSwwCitERUNMQVJFX0lNUCBQTV9ibG9ja1VudGlsVGltZW91dCwwCitERUNMQVJFX0lNUCBfUE1fYWRkNjQsMAorREVDTEFSRV9JTVAgX1BNX3N1YjY0LDAKK0RFQ0xBUkVfSU1QIF9QTV9tdWw2NCwwCitERUNMQVJFX0lNUCBfUE1fZGl2NjQsMAorREVDTEFSRV9JTVAgX1BNX3NocjY0LDAKK0RFQ0xBUkVfSU1QIF9QTV9zYXI2NCwwCitERUNMQVJFX0lNUCBfUE1fc2hsNjQsMAorREVDTEFSRV9JTVAgX1BNX25lZzY0LDAKK0RFQ0xBUkVfSU1QIFBDSV9maW5kQkFSU2l6ZSwwCitERUNMQVJFX0lNUCBQQ0lfcmVhZFJlZ0Jsb2NrLDAKK0RFQ0xBUkVfSU1QIFBDSV93cml0ZVJlZ0Jsb2NrLDAKK0RFQ0xBUkVfSU1QIFBNX2ZsdXNoVExCLDAKK0RFQ0xBUkVfSU1QIFBNX3VzZUxvY2FsTWFsbG9jLDAKK0RFQ0xBUkVfSU1QIFBNX21hbGxvYywwCitERUNMQVJFX0lNUCBQTV9jYWxsb2MsMAorREVDTEFSRV9JTVAgUE1fcmVhbGxvYywwCitERUNMQVJFX0lNUCBQTV9mcmVlLDAKK0RFQ0xBUkVfSU1QIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlLDAKK0RFQ0xBUkVfSU1QIFBNX2FsbG9jUGFnZSwwCitERUNMQVJFX0lNUCBQTV9mcmVlUGFnZSwwCitERUNMQVJFX0lNUCBQTV9hZ3BJbml0LDAKK0RFQ0xBUkVfSU1QIFBNX2FncEV4aXQsMAorREVDTEFSRV9JTVAgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsLDAKK0RFQ0xBUkVfSU1QIFBNX2FncFJlbGVhc2VQaHlzaWNhbCwwCitERUNMQVJFX0lNUCBQTV9hZ3BDb21taXRQaHlzaWNhbCwwCitERUNMQVJFX0lNUCBQTV9hZ3BGcmVlUGh5c2ljYWwsMAorREVDTEFSRV9JTVAgUENJX2dldE51bURldmljZXMsMAorREVDTEFSRV9JTVAgUE1fc2V0TG9jYWxCUERQYXRoLDAKK0RFQ0xBUkVfSU1QIFBNX2xvYWREaXJlY3REcmF3LDAKK0RFQ0xBUkVfSU1QIFBNX3VubG9hZERpcmVjdERyYXcsMAorREVDTEFSRV9JTVAgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdywwCitERUNMQVJFX0lNUCBQTV9kb1N1c3BlbmRBcHAsMAorRU5EX0lNUE9SVFNfREVGCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhYmVvcy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAorICAgIGludCBkZXZpY2UpCit7CisgICAgKHZvaWQpZGV2aWNlOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHApCit7CisgICAgKHZvaWQpZ2FFeHA7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQorTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQorICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0FfVGltZXJSZWFkKAorICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCit7CisgICAgaWYgKGhhdmVSRFRTQykKKyAgICAgICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOworICAgIGVsc2UgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0OworICAgICAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOworICAgICAgICB2YWx1ZS0+bG93ID0gdC50dl9zZWMqMTAwMDAwMCArIHQudHZfdXNlYzsKKyAgICAgICAgdmFsdWUtPmhpZ2ggPSAwOworICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFkb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWRvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTRmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFkb3MuYwpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIE1TRE9TCisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIE1TRE9TIG9wZXJhdGluZyBzeXN0ZW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1faGVscC5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUgRE9TCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiZjdiMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWxpYi5jCkBAIC0wLDAgKzEsMjI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBdWRpbyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnZpcm9ubWVudAorKgorKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciB0aGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IgRHJpdmVyIEFQSS4gVXNlcworKiAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFBNIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIHdpdGggRE9TCisqICAgICAgICAgICAgICAgZXh0ZW5kZXIgc3BlY2lmaWMgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm51Y2xldXMvYXVkaW8uaCIKKyNpZmRlZiBfX1dJTjMyX1ZYRF9fCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIFRFU1RfSEFSTkVTUworZXh0ZXJuIFBNX2ltcG9ydHMgICBfVkFSQVBJIF9QTV9pbXBvcnRzOworI2Vsc2UKK0FBX2V4cG9ydHMgIF9WQVJBUEkgX0FBX2V4cG9ydHM7CitzdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOworc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7CisKKyNpZmRlZiAgX19EUklWRVJfXworZXh0ZXJuIFBNX2ltcG9ydHMgX1BNX2ltcG9ydHM7CisjZWxzZQorI2luY2x1ZGUgInBtaW1wLmgiCisjZW5kaWYKKworc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0geworICAgIHNpemVvZihOX2ltcG9ydHMpLAorICAgIF9PU19kZWxheSwKKyAgICB9OworCisjaWZkZWYgIF9fRFJJVkVSX18KK2V4dGVybiBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzOworI2Vsc2UKK3N0YXRpYyBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzID0geworICAgIHNpemVvZihBQV9pbXBvcnRzKSwKKyAgICB9OworI2VuZGlmCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBETExfTkFNRSAgICAgICAgImF1ZGlvLmJwZCIKKworI2lmbmRlZiBURVNUX0hBUk5FU1MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEFBX2V4cG9ydHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0FBX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCit7CisgICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgTnVjbGV1cyBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgTnVjbGV1cyFcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvYWRzIHRoZSBOdWNsZXVzIGJpbmFyeSBwb3J0YWJsZSBETEwgaW50byBtZW1vcnkgYW5kIGluaXRpbGlzZXMgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIExvYWREcml2ZXIodm9pZCkKK3sKKyAgICBBQV9pbml0TGlicmFyeV90ICAgIEFBX2luaXRMaWJyYXJ5OworICAgIEFBX2V4cG9ydHMgICAgICAgICAgKmFhRXhwOworICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOworICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07CisgICAgaW50ICAgICAgICAgICAgICAgICBpLG1heDsKKyAgICB1bG9uZyAgICAgICAgICAgICAgICpwOworCisgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZHJpdmVyICovCisgICAgaWYgKGxvYWRlZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgUE1faW5pdCgpOworICAgIF9BQV9leHBvcnRzLmR3U2l6ZSA9IHNpemVvZihfQUFfZXhwb3J0cyk7CisKKyAgICAvKiBPcGVuIHRoZSBCUEQgZmlsZSAqLworICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKKyAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOworICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLGZhbHNlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgoQUFfaW5pdExpYnJhcnkgPSAoQUFfaW5pdExpYnJhcnlfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kQlBELCJfQUFfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJwZHBhdGhbc3RybGVuKGJwZHBhdGgpLTFdID0gMDsKKyAgICBpZiAoc3RyY21wKGJwZHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSkgPT0gMCkKKyAgICAgICAgc3RyY3B5KGJwZHBhdGgsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSk7CisgICAgZWxzZSB7CisgICAgICAgIFBNX2JhY2tzbGFzaChicGRwYXRoKTsKKyAgICAgICAgc3RyY2F0KGJwZHBhdGgsImNvbmZpZyIpOworICAgICAgICB9CisgICAgaWYgKChhYUV4cCA9IEFBX2luaXRMaWJyYXJ5KGJwZHBhdGgsZmlsZW5hbWUsJl9QTV9pbXBvcnRzLCZfTl9pbXBvcnRzLCZfQUFfaW1wb3J0cykpID09IE5VTEwpCisgICAgICAgIFBNX2ZhdGFsRXJyb3IoIkFBX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIKKyAgICAgKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29weSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLgorICAgICAqLworICAgIG1heCA9IHNpemVvZihfQUFfZXhwb3J0cykvc2l6ZW9mKEFBX2luaXRMaWJyYXJ5X3QpOworICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9BQV9leHBvcnRzOyBpIDwgbWF4OyBpKyspCisgICAgICAgICpwKysgPSAodWxvbmcpX0FBX2ZhdGFsRXJyb3JIYW5kbGVyOworICAgIG1lbWNweSgmX0FBX2V4cG9ydHMsYWFFeHAsTUlOKHNpemVvZihfQUFfZXhwb3J0cyksYWFFeHAtPmR3U2l6ZSkpOworICAgIGxvYWRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCisgKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKKyAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgorICovCisKKy8qIHtzZWNyZXR9ICovCitpbnQgTkFQSSBBQV9zdGF0dXModm9pZCkKK3sKKyAgICBpZiAoIWxvYWRlZCkKKyAgICAgICAgcmV0dXJuIG5Ecml2ZXJOb3RGb3VuZDsKKyAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfc3RhdHVzKCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitjb25zdCBjaGFyICogTkFQSSBBQV9lcnJvck1zZygKKyAgICBOX2ludDMyIHN0YXR1cykKK3sKKyAgICBpZiAoIWxvYWRlZCkKKyAgICAgICAgcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKKyAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfZXJyb3JNc2coc3RhdHVzKTsKK30KKworLyoge3NlY3JldH0gKi8KK2ludCBOQVBJIEFBX2dldERheXNMZWZ0KHZvaWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfZ2V0RGF5c0xlZnQoKTsKK30KKworLyoge3NlY3JldH0gKi8KK2ludCBOQVBJIEFBX3JlZ2lzdGVyTGljZW5zZSh1Y2hhciAqbGljZW5zZSkKK3sKKyAgICBpZiAoIUxvYWREcml2ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX3JlZ2lzdGVyTGljZW5zZShsaWNlbnNlKTsKK30KKworLyoge3NlY3JldH0gKi8KK2ludCBOQVBJIEFBX2VudW1lcmF0ZURldmljZXModm9pZCkKK3sKKyAgICBpZiAoIUxvYWREcml2ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX2VudW1lcmF0ZURldmljZXMoKTsKK30KKworLyoge3NlY3JldH0gKi8KK0FBX2RldkN0eCAqIE5BUEkgQUFfbG9hZERyaXZlcihOX2ludDMyIGRldmljZUluZGV4KQoreworICAgIGlmICghTG9hZERyaXZlcigpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfbG9hZERyaXZlcihkZXZpY2VJbmRleCk7Cit9CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE5fdWludDMyICAgIGxvdzsKKyAgICBOX3VpbnQzMiAgICBoaWdoOworICAgIH0gQUFfbGFyZ2VJbnRlZ2VyOworCit2b2lkICAgIE5BUEkgX09TX2RlbGF5ODI1MyhOX3VpbnQzMiBtaWNyb1NlY29uZHMpOworaWJvb2wgICBOQVBJIF9HQV9oYXZlQ1BVSUQodm9pZCk7Cit1aW50ICAgIE5BUEkgX0dBX2dldENQVUlERmVhdHVyZXModm9pZCk7Cit2b2lkICAgIE5BUEkgX0dBX3JlYWRUaW1lU3RhbXAoQUFfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKKyNkZWZpbmUgQ1BVX0hhdmVSRFRTQyAgIDB4MDAwMDAwMTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGRlbGF5cyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIF9PU19kZWxheSgKKyAgICBOX3VpbnQzMiBtaWNyb1NlY29uZHMpCit7CisgICAgc3RhdGljIGlib29sICAgIGluaXRlZCA9IGZhbHNlOworICAgIExaVGltZXJPYmplY3QgICB0bTsKKworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7CisgICAgICAgIGlmICghaW5pdGVkKSB7CisgICAgICAgICAgICBaVGltZXJJbml0KCk7CisgICAgICAgICAgICBpbml0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICBMWlRpbWVyT25FeHQoJnRtKTsKKyAgICAgICAgd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3JvU2Vjb25kcykKKyAgICAgICAgICAgIDsKKyAgICAgICAgTFpUaW1lck9uRXh0KCZ0bSk7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9PU19kZWxheTgyNTMobWljcm9TZWNvbmRzKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWxpbnV4LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODViMjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCisgICAgaW50IGRldmljZSkKK3sKKyAgICAodm9pZClkZXZpY2U7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKKyAgICBHQV9leHBvcnRzICpnYUV4cCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgICAgIHZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOworICAgICAgICB2YWx1ZS0+aGlnaCA9IDA7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhb3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2Yjk2YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIE9TLzIgMzItYml0CisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIE9TLzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1faGVscC5oIgorI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX1NVQgorI2RlZmluZSBJTkNMX1ZJTworI2RlZmluZSBJTkNMX0tCRAorI2luY2x1ZGUgPG9zMi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgSEZJTEUgICAgICAgIGhTRERIZWxwOworc3RhdGljIHVsb25nICAgICAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KK3N0YXRpYyB1bG9uZyAgICAgICAgcmVzdWx0OyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCitzdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb21tb24gZ3JhcGhpY3MgZHJpdmVyIGxvYWRlZCBpbiB0aGUKK2hlbHBlciBWeEQuIFRoZSBtZW1vcnkgZm9yIHRoZSBWeEQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIHByb2Nlc3NlcyB2aWEKK3RoZSBWeEQsIHNvIHRoYXQgdGhlIFZ4RCwgMTYtYml0IGNvZGUgYW5kIDMyLWJpdCBjb2RlIGFsbCBzZWUgdGhlIHNhbWUKK3N0YXRlIHdoZW4gYWNjZXNzaW5nIHRoZSBncmFwaGljcyBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCisgICAgaW50IGRldmljZSkKK3sKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBydW50aW1lIERMTCdzICovCisgICAgUE1faW5pdCgpOworCisgICAgLyogT3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIgKi8KKyAgICBpZiAoRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCisgICAgICAgICAgICBGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCisgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG9wZW4gU0RESEVMUCQgaGVscGVyIGRldmljZSBkcml2ZXIhIik7CisgICAgb3V0TGVuID0gc2l6ZW9mKHJlc3VsdCk7CisgICAgRG9zRGV2SU9DdGwoaFNEREhlbHAsUE1IRUxQX0lPQ1RMLFBNSEVMUF9HRVRTSEFSRURJTkZPLAorICAgICAgICBOVUxMLCAwLCBOVUxMLAorICAgICAgICAmcmVzdWx0LCBvdXRMZW4sICZvdXRMZW4pOworICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIC8qIFdlIGhhdmUgZm91bmQgdGhlIHNoYXJlZCBOdWNsZXVzIHBhY2tldC4gQmVjYXVzZSBub3QgYWxsIHByb2Nlc3NlcworICAgICAgICAgKiBtYXAgdG8gU0REUE1JLkRMTCwgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBjb25uZWN0IHRvIHRoaXMKKyAgICAgICAgICogRExMIHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSAodGhhdCBpcworICAgICAgICAgKiB3aGVyZSB0aGUgc2hhcmVkIE51Y2xldXMgcGFja2V0IGlzIGxvY2F0ZWQpLiBTaW1wbHkgZG9pbmcgYQorICAgICAgICAgKiBEb3NMb2FkTW9kdWxlIG9uIGl0IGlzIGVub3VnaCBmb3IgdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIEhNT0RVTEUgaE1vZFNERFBNSTsKKyAgICAgICAgY2hhciAgICBidWZbODBdOworICAgICAgICBEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKKyAgICAgICAgfQorICAgIHJldHVybiAoR0Ffc2hhcmVkSW5mbyopcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHApCit7CisgICAgKHZvaWQpZ2FFeHA7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQorTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQorICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0FfVGltZXJSZWFkKAorICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCit7CisgICAgaWYgKGhhdmVSRFRTQykKKyAgICAgICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOworICAgIGVsc2UKKyAgICAgICAgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFxbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTI2YzlhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcW54LmMKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBRTlgKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgUU5YIG9wZXJhdGluZyBzeXN0ZW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCisgICAgaW50IGRldmljZSkKK3sKKyAgICAodm9pZClkZXZpY2U7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKKyAgICBHQV9leHBvcnRzICpnYUV4cCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOworICAgICAgICB2YWx1ZS0+bG93ID0gKHRzLnR2X25zZWMgLyAxMDAwICsgdHMudHZfc2VjICogMTAwMDAwMCk7CisgICAgICAgIHZhbHVlLT5oaWdoID0gMDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcnR0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFydHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2EwNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcnR0LmMKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgorKiAgICAgICAgICAgICAgIHRoZSBSVFRhcmdldC0zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKKyAgICBpbnQgZGV2aWNlKQoreworICAgICh2b2lkKWRldmljZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwKQoreworICAgICh2b2lkKWdhRXhwOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKK051Y2xldXMgbG9hZGVyIGxpYnJhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKK3sKKyAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgeworICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIGlmIChoYXZlUkRUU0MpCisgICAgICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXNteC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhc214LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYmQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXNteC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgc214MzIKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgc214MzIgcGxhdGZvcm0gLS0gbm8gdnhEIHN1cHBvcnQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCisgICAgaW50IGRldmljZSkKK3sKKyAgICAodm9pZClkZXZpY2U7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKKyAgICBHQV9leHBvcnRzICpnYUV4cCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXZ4ZC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhdnhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1NTMzZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXZ4ZC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgV2luMzIgVnhECisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIFdpbjMyIFZ4RCdzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGludGVybmFsIHNoYXJlZCBpbmZvIHN0cnVjdHVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAorICAgIGludCBkZXZpY2UpCit7CisgICAgc3RhdGljIEdBX3NoYXJlZEluZm8gc2hhcmVkID0gezAsLTF9OworICAgIHJldHVybiAmc2hhcmVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHApCit7CisgICAgKHZvaWQpZ2FFeHA7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQorTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7CisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIGlmIChoYXZlUkRUU0MpCisgICAgICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ2YWx1ZS0+aGlnaCwmdmFsdWUtPmxvdyk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF3aW4zMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNmMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhd2luMzIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMgorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgorKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbV9oZWxwLmgiCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBTVFJJQ1QKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIEdBX01BWF9ERVZJQ0VTID4gNAorI2Vycm9yIEdBX01BWF9ERVZJQ0VTIGhhcyBjaGFuZ2VkIQorI2VuZGlmCisKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKK3N0YXRpYyBHQV9sYXJnZUludGVnZXIgIGNvdW50RnJlcTsKK3N0YXRpYyBHQV9sb2FkRHJpdmVyX3QgIE9SR19HQV9sb2FkRHJpdmVyOworZXh0ZXJuIEhBTkRMRSAgICAgICAgICAgX1BNX2hEZXZpY2U7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK0dldCB0aGUgY3VycmVudCBncmFwaGljcyBkcml2ZXIgaW1wb3J0cyBmcm9tIHRoZSBWeEQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbW1vbiBncmFwaGljcyBkcml2ZXIgbG9hZGVkIGluIHRoZQoraGVscGVyIFZ4RC4gVGhlIG1lbW9yeSBmb3IgdGhlIFZ4RCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcHJvY2Vzc2VzIHZpYQordGhlIFZ4RCwgc28gdGhhdCB0aGUgVnhELCAxNi1iaXQgY29kZSBhbmQgMzItYml0IGNvZGUgYWxsIHNlZSB0aGUgc2FtZQorc3RhdGUgd2hlbiBhY2Nlc3NpbmcgdGhlIGdyYXBoaWNzIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKKyAgICBpbnQgZGV2aWNlKQoreworICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsyXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgUE1faW5pdCgpOworICAgIGluQnVmWzBdID0gZGV2aWNlOworICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRTSEFSRURJTkZPMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgeworICAgICAgICByZXR1cm4gKEdBX3NoYXJlZEluZm8qKW91dEJ1ZlswXTsKKyAgICAgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHApCit7CisgICAgKHZvaWQpZ2FFeHA7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIHNvZnR3YXJlIHN0ZXJlbyBtb2R1bGUgYnkgZWl0aGVyIGNhbGxpbmcKK3RoZSBOdWNsZXVzIGxpYnJhcmllcyBkaXJlY3RseSwgb3IgY2FsbGluZyBpbnRvIHRoZSBWeEQgaWYgd2UgYXJlIHJ1bm5pbmcKK29uIHRoZSBzaGFyZWQgTnVjbGV1cyBsaWJyYXJpZXMgbG9hZGVkIGJ5IHRoZSBXaW5kb3dzIFZ4RC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgTkFQSSBfR0Ffc29mdFN0ZXJlb0luaXQoCisgICAgR0FfZGV2Q3R4ICpkYykKK3sKKyAgICBpZiAoX1BNX2hEZXZpY2UpIHsKKyAgICAgICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgICAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgICAgICBpbkJ1ZlswXSA9ICh1bG9uZylkYzsKKyAgICAgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPSU5JVDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0QnVmWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gdHVybnMgb24gc29mdHdhcmUgc3RlcmVvIG1vZGUsIGVpdGhlciBkaXJlY3RseSBvciB2aWEgdGhlIFZ4RC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvT24odm9pZCkKK3sKKyAgICBpZiAoX1BNX2hEZXZpY2UpIHsKKyAgICAgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9PTjMyLCBOVUxMLCAwLAorICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHNvZnR3YXJlIHN0ZXJlbyBtb2RlIHBhZ2UgZmxpcCwgZWl0aGVyIGRpcmVjdGx5CitvciB2aWEgdGhlIFZ4RC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvU2NoZWR1bGVGbGlwKAorICAgIE5fdWludDMyIGxlZnRBZGRyLAorICAgIE5fdWludDMyIHJpZ2h0QWRkcikKK3sKKyAgICBpZiAoX1BNX2hEZXZpY2UpIHsKKyAgICAgICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgICAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICAgICAgaW5CdWZbMF0gPSAodWxvbmcpbGVmdEFkZHI7CisgICAgICAgIGluQnVmWzFdID0gKHVsb25nKXJpZ2h0QWRkcjsKKyAgICAgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9GTElQMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICAgICAgTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gdHVybnMgb2ZmIHNvZnR3YXJlIHN0ZXJlbyBtb2RlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHRoZSBWeEQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIE5faW50MzIgTkFQSSBfR0Ffc29mdFN0ZXJlb0dldEZsaXBTdGF0dXModm9pZCkKK3sKKyAgICBpZiAoX1BNX2hEZXZpY2UpIHsKKyAgICAgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgICAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICAgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPRkxJUFNUQVRVUzMyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRCdWZbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHR1cm5zIG9mZiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9XYWl0VGlsbEZsaXBwZWQodm9pZCkKK3sKKyAgICB3aGlsZSAoIV9HQV9zb2Z0U3RlcmVvR2V0RmxpcFN0YXR1cygpKQorICAgICAgICA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiB0dXJucyBvZmYgc29mdHdhcmUgc3RlcmVvIG1vZGUsIGVpdGhlciBkaXJlY3RseSBvciB2aWEgdGhlIFZ4RC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvT2ZmKHZvaWQpCit7CisgICAgaWYgKF9QTV9oRGV2aWNlKSB7CisgICAgICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPT0ZGMzIsIE5VTEwsIDAsCisgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZGlzYWJsZSB0aGUgc29mdHdhcmUgc3RlcmVvIGhhbmRsZXIsIGVpdGhlciBkaXJlY3RseSBvciB2aWEKK3RoZSBWeEQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgTkFQSSBfR0Ffc29mdFN0ZXJlb0V4aXQodm9pZCkKK3sKKyAgICBpZiAoX1BNX2hEZXZpY2UpIHsKKyAgICAgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9FWElUMzIsIE5VTEwsIDAsCisgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dlIGhvb2sgdGhpcyBmdW5jdGlvbiBpbiBoZXJlIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSBtZW1vcnkgZGV0ZWN0IGFuZAorb3RoZXIgZGVzdHJ1Y3RpdmUgc2VxdWVuY2VzIGluIHRoZSBkcml2ZXJzIGlmIHdlIGFyZSBsb2FkaW5nIHRoZSBkcml2ZXIKK2Zyb20gYSBXaW4zMiBhcHBsaWNhdGlvbiAob3VyIGRpc3BsYXkgZHJpdmVycyBpbiBjb250cmFzdCBsb2FkIHRoZW0gaW5zaWRlCit0aGUgVnhEIGRpcmVjdGx5LCBidXQgdGhlIGNvbnRyb2wgcGFuZWwgYXBwbGV0cyB1c2UgdGhpcyBmdW5jdGlvbikuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEdBX2RldkN0eCAqIE5BUEkgX0dBX2xvYWREcml2ZXIoCisgICAgTl9pbnQzMiBkZXZpY2VJbmRleCwKKyAgICBOX2ludDMyIHNoYXJlZCkKK3sKKyAgICBHQV9kZXZDdHggICAqZGM7CisgICAgRFdPUkQgICAgICAgaW5CdWZbMV07CisgICAgRFdPUkQgICAgICAgb3V0QnVmWzFdOworICAgIE5faW50MzIgICAgIHRvdGFsTWVtb3J5ID0gMCxvbGRJT1BMOworCisgICAgaWYgKGRldmljZUluZGV4ID49IEdBX01BWF9ERVZJQ0VTKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJEZXZpY2VJbmRleCB0b28gbGFyZ2UgaW4gR0FfbG9hZERyaXZlciEiKTsKKyAgICBQTV9pbml0KCk7CisgICAgaW5CdWZbMF0gPSBkZXZpY2VJbmRleDsKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUTUVNU0laRTMyLAorICAgICAgICAgICAgaW5CdWYsIHNpemVvZihpbkJ1ZiksIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksIE5VTEwsIE5VTEwpKQorICAgICAgICB0b3RhbE1lbW9yeSA9IG91dEJ1ZlswXTsKKyAgICBpZiAodG90YWxNZW1vcnkgPT0gMCkKKyAgICAgICAgdG90YWxNZW1vcnkgPSA4MTkyOworICAgIF9HQV9leHBvcnRzLkdBX2ZvcmNlTWVtU2l6ZSh0b3RhbE1lbW9yeSxzaGFyZWQpOworICAgIG9sZElPUEwgPSBQTV9zZXRJT1BMKDMpOworICAgIGRjID0gT1JHX0dBX2xvYWREcml2ZXIoZGV2aWNlSW5kZXgsc2hhcmVkKTsKKyAgICBQTV9zZXRJT1BMKG9sZElPUEwpOworICAgIHJldHVybiBkYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKK051Y2xldXMgbG9hZGVyIGxpYnJhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKK3sKKyAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgeworICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpKSB7CisgICAgICAgIGhhdmVSRFRTQyA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIGlmIChoYXZlUkRUU0MpCisgICAgICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKil2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWdwbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWdwbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4ZjkzMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hZ3BsaWIuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkgMzItYml0IHByb3RlY3RlZCBtb2RlIGVudmlyb25tZW50CisqCisqIERlc2NyaXB0aW9uOiAgQyBtb2R1bGUgZm9yIHRoZSBHcmFwaGljcyBBY2NlbGVyYXRvciBEcml2ZXIgQVBJLiBVc2VzCisqICAgICAgICAgICAgICAgdGhlIFNjaVRlY2ggUE0gbGlicmFyeSBmb3IgaW50ZXJmYWNpbmcgd2l0aCBET1MKKyogICAgICAgICAgICAgICBleHRlbmRlciBzcGVjaWZpYyBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorI2luY2x1ZGUgIm51Y2xldXMvYWdwLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgREVCVUdfQUdQX0RSSVZFUgorc3RhdGljIEFHUF9leHBvcnRzICBfQUdQX2V4cG9ydHM7CitzdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOworc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7CisKK3N0YXRpYyBOX2ltcG9ydHMgX05faW1wb3J0cyA9IHsKKyAgICBzaXplb2YoTl9pbXBvcnRzKSwKKyAgICBfT1NfZGVsYXksCisgICAgfTsKKworc3RhdGljIEFHUF9pbXBvcnRzIF9BR1BfaW1wb3J0cyA9IHsKKyAgICBzaXplb2YoQUdQX2ltcG9ydHMpLAorICAgIH07CisjZW5kaWYKKworI2luY2x1ZGUgInBtaW1wLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRExMX05BTUUgICAgICAgICJhZ3AuYnBkIgorCisjaWZuZGVmIERFQlVHX0FHUF9EUklWRVIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEdBX2V4cG9ydHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0FHUF9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQoreworICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIEFHUCBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgQUdQIVxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2hhcmVkICAtIFRydWUgdG8gbG9hZCB0aGUgZHJpdmVyIGludG8gc2hhcmVkIG1lbW9yeS4KKworUkVNQVJLUzoKK0xvYWRzIHRoZSBOdWNsZXVzIGJpbmFyeSBwb3J0YWJsZSBETEwgaW50byBtZW1vcnkgYW5kIGluaXRpbGlzZXMgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIExvYWREcml2ZXIodm9pZCkKK3sKKyAgICBBR1BfaW5pdExpYnJhcnlfdCAgIEFHUF9pbml0TGlicmFyeTsKKyAgICBBR1BfZXhwb3J0cyAgICAgICAgICphZ3BFeHA7CisgICAgY2hhciAgICAgICAgICAgICAgICBmaWxlbmFtZVtQTV9NQVhfUEFUSF07CisgICAgY2hhciAgICAgICAgICAgICAgICBicGRwYXRoW1BNX01BWF9QQVRIXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGksbWF4OworICAgIHVsb25nICAgICAgICAgICAgICAgKnA7CisKKyAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBkcml2ZXIgKi8KKyAgICBpZiAobG9hZGVkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBQTV9pbml0KCk7CisKKyAgICAvKiBPcGVuIHRoZSBCUEQgZmlsZSAqLworICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKKyAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOworICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLGZhbHNlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgoQUdQX2luaXRMaWJyYXJ5ID0gKEFHUF9pbml0TGlicmFyeV90KVBFX2dldFByb2NBZGRyZXNzKGhNb2RCUEQsIl9BR1BfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJwZHBhdGhbc3RybGVuKGJwZHBhdGgpLTFdID0gMDsKKyAgICBpZiAoc3RyY21wKGJwZHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSkgPT0gMCkKKyAgICAgICAgc3RyY3B5KGJwZHBhdGgsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSk7CisgICAgZWxzZSB7CisgICAgICAgIFBNX2JhY2tzbGFzaChicGRwYXRoKTsKKyAgICAgICAgc3RyY2F0KGJwZHBhdGgsImNvbmZpZyIpOworICAgICAgICB9CisgICAgaWYgKChhZ3BFeHAgPSBBR1BfaW5pdExpYnJhcnkoYnBkcGF0aCxmaWxlbmFtZSxHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKSwmX05faW1wb3J0cywmX0FHUF9pbXBvcnRzKSkgPT0gTlVMTCkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiQUdQX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOworICAgIF9BR1BfZXhwb3J0cy5kd1NpemUgPSBzaXplb2YoX0FHUF9leHBvcnRzKTsKKyAgICBtYXggPSBzaXplb2YoX0FHUF9leHBvcnRzKS9zaXplb2YoQUdQX2luaXRMaWJyYXJ5X3QpOworICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9BR1BfZXhwb3J0czsgaSA8IG1heDsgaSsrKQorICAgICAgICAqcCsrID0gKHVsb25nKV9BR1BfZmF0YWxFcnJvckhhbmRsZXI7CisgICAgbWVtY3B5KCZfQUdQX2V4cG9ydHMsYWdwRXhwLE1JTihzaXplb2YoX0FHUF9leHBvcnRzKSxhZ3BFeHAtPmR3U2l6ZSkpOworICAgIGxvYWRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCisgKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKKyAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgorICovCisKKy8qIHtzZWNyZXR9ICovCitpbnQgTkFQSSBBR1Bfc3RhdHVzKHZvaWQpCit7CisgICAgaWYgKCFsb2FkZWQpCisgICAgICAgIHJldHVybiBuRHJpdmVyTm90Rm91bmQ7CisgICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1Bfc3RhdHVzKCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitjb25zdCBjaGFyICogTkFQSSBBR1BfZXJyb3JNc2coCisgICAgTl9pbnQzMiBzdGF0dXMpCit7CisgICAgaWYgKCFsb2FkZWQpCisgICAgICAgIHJldHVybiAiVW5hYmxlIHRvIGxvYWQgTnVjbGV1cyBkZXZpY2UgZHJpdmVyISI7CisgICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1BfZXJyb3JNc2coc3RhdHVzKTsKK30KKworLyoge3NlY3JldH0gKi8KK0FHUF9kZXZDdHggKiBOQVBJIEFHUF9sb2FkRHJpdmVyKE5faW50MzIgZGV2aWNlSW5kZXgpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBfQUdQX2V4cG9ydHMuQUdQX2xvYWREcml2ZXIoZGV2aWNlSW5kZXgpOworfQorCisvKiB7c2VjcmV0fSAqLwordm9pZCBOQVBJIEFHUF91bmxvYWREcml2ZXIoCisgICAgQUdQX2RldkN0eCAqZGMpCit7CisgICAgaWYgKGxvYWRlZCkKKyAgICAgICAgX0FHUF9leHBvcnRzLkFHUF91bmxvYWREcml2ZXIoZGMpOworfQorCisvKiB7c2VjcmV0fSAqLwordm9pZCBOQVBJIEFHUF9nZXRHbG9iYWxPcHRpb25zKAorICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQoreworICAgIGlmIChMb2FkRHJpdmVyKCkpCisgICAgICAgIF9BR1BfZXhwb3J0cy5BR1BfZ2V0R2xvYmFsT3B0aW9ucyhvcHRpb25zKTsKK30KKworLyoge3NlY3JldH0gKi8KK3ZvaWQgTkFQSSBBR1Bfc2V0R2xvYmFsT3B0aW9ucygKKyAgICBBR1BfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucykKK3sKKyAgICBpZiAoTG9hZERyaXZlcigpKQorICAgICAgICBfQUdQX2V4cG9ydHMuQUdQX3NldEdsb2JhbE9wdGlvbnMob3B0aW9ucyk7Cit9CisKKy8qIHtzZWNyZXR9ICovCit2b2lkIE5BUEkgQUdQX3NhdmVHbG9iYWxPcHRpb25zKAorICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQoreworICAgIGlmIChsb2FkZWQpCisgICAgICAgIF9BR1BfZXhwb3J0cy5BR1Bfc2F2ZUdsb2JhbE9wdGlvbnMob3B0aW9ucyk7Cit9CisjZW5kaWYKKworLyoge3NlY3JldH0gKi8KK3ZvaWQgTkFQSSBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBkZWxheXMgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBfT1NfZGVsYXkoCisgICAgTl91aW50MzIgbWljcm9TZWNvbmRzKQoreworICAgIHN0YXRpYyBpYm9vbCAgICBpbml0ZWQgPSBmYWxzZTsKKyAgICBzdGF0aWMgaWJvb2wgICAgaGF2ZVJEVFNDOworICAgIExaVGltZXJPYmplY3QgICB0bTsKKworICAgIGlmICghaW5pdGVkKSB7CisjaWZuZGVmIF9fV0lOMzJfVlhEX18KKyAgICAgICAgLy8gVGhpcyBoYXMgYmVlbiBjYXVzaW5nIHByb2JsZW1zIGluIFZ4RCdzIGZvciBzb21lIHJlYXNvbiwgc28gZm9yIG5vdworICAgICAgICAvLyB3ZSBhdm9pZCB1c2luZyBpdC4KKyAgICAgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKKyAgICAgICAgICAgIFpUaW1lckluaXQoKTsKKyAgICAgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaGF2ZVJEVFNDID0gZmFsc2U7CisgICAgICAgIGluaXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICBpZiAoaGF2ZVJEVFNDKSB7CisgICAgICAgIExaVGltZXJPbkV4dCgmdG0pOworICAgICAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9TZWNvbmRzKQorICAgICAgICAgICAgOworICAgICAgICBMWlRpbWVyT25FeHQoJnRtKTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgX09TX2RlbGF5ODI1MyhtaWNyb1NlY29uZHMpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViMzY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9jZW50ZXIuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICBEaXNwbGF5IERvY3RvciBXaW5kb3dzIEludGVyZmFjZSBDb2RlCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGlzIGEgcHJvcHJpZXRhcnkgdHJhZGUgc2VjcmV0IG9mICAgICB8CisqICB8U2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsIENoaWNvLCBDQSA5NTkyOCB8CisqICB8VVNBICh3d3cuc2NpdGVjaHNvZnQuY29tKS4gIEFOWSBVTkFVVEhPUklaRUQgUE9TU0VTU0lPTiwgVVNFLCAgICAgICB8CisqICB8VklFV0lORywgQ09QWUlORywgTU9ESUZJQ0FUSU9OIE9SIERJU1NFTUlOQVRJT04gT0YgVEhJUyBDT0RFIElTICAgICB8CisqICB8U1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVcuICBVbmxlc3MgeW91IGhhdmUgY3VycmVudCwgZXhwcmVzcyAgICAgICB8CisqICB8d3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gU2NpVGVjaCB0byBwb3NzZXNzIG9yIHVzZSB0aGlzIGNvZGUsIHlvdSB8CisqICB8bWF5IGJlIHN1YmplY3QgdG8gY2l2aWwgYW5kL29yIGNyaW1pbmFsIHBlbmFsdGllcy4gICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8SWYgeW91IHJlY2VpdmVkIHRoaXMgY29kZSBpbiBlcnJvciBvciB5b3Ugd291bGQgbGlrZSB0byByZXBvcnQgICAgICB8CisqICB8aW1wcm9wZXIgdXNlLCBwbGVhc2UgaW1tZWRpYXRlbHkgY29udGFjdCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIGF0ICB8CisqICB8NTMwLTg5NC04NDAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQysrIDMuMAorKiBFbnZpcm9ubWVudDogIFdpbjE2CisqCisqIERlc2NyaXB0aW9uOiAgRGlhbG9nIGRyaXZlbiBjb25maWd1cmF0aW9uIHByb2dyYW0gZm9yIFVuaVZCRSBhbmQKKyogICAgICAgICAgICAgICBXaW5EaXJlY3QgUHJvZmVzc2lvbmFsIHByb2R1Y3RzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNlbnRlci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIF9FWFBPUlQgQ2VudGVyV2luZG93KEhXTkQgaFduZENlbnRlciwgSFdORCBwYXJlbnQsIEJPT0wgcmVwYWludCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgQ2VudGVyV2luZG93CisqIFBhcmFtZXRlcnM6ICAgaFduZENlbnRlciAgLSBXaW5kb3cgdG8gY2VudGVyCisqICAgICAgICAgICAgICAgcGFyZW50ICAgICAgLSBIYW5kbGUgZm9yIHBhcmVudCB3aW5kb3cKKyogICAgICAgICAgICAgICByZXBhaW50ICAgICAtIHRydWUgaWYgd2luZG93IHNob3VsZCBiZSByZS1wYWludGVkCisqCisqIERlc2NyaXB0aW9uOiAgQ2VudGVycyB0aGUgc3BlY2lmaWVkIHdpbmRvdyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKKyogICAgICAgICAgICAgICBzcGVjaWZpZWQgcGFyZW50IHdpbmRvdy4gSWYgdGhlIHBhcmVudCB3aW5kb3cgaXMgTlVMTCwgdGhlbgorKiAgICAgICAgICAgICAgIHdlIGNlbnRlciBpdCB1c2luZyB0aGUgRGVza3RvcCB3aW5kb3cuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIEhXTkQgICAgaFduZFBhcmVudCA9IChwYXJlbnQgPyBwYXJlbnQgOiBHZXREZXNrdG9wV2luZG93KCkpOworICAgIFJFQ1QgICAgUmVjdFBhcmVudDsKKyAgICBSRUNUICAgIFJlY3RDZW50ZXI7CisgICAgaW50ICAgICBDZW50ZXJYLENlbnRlclksSGVpZ2h0LFdpZHRoOworCisgICAgR2V0V2luZG93UmVjdChoV25kUGFyZW50LCAmUmVjdFBhcmVudCk7CisgICAgR2V0V2luZG93UmVjdChoV25kQ2VudGVyLCAmUmVjdENlbnRlcik7CisKKyAgICBXaWR0aCA9IChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KTsKKyAgICBIZWlnaHQgPSAoUmVjdENlbnRlci5ib3R0b20gLSBSZWN0Q2VudGVyLnRvcCk7CisgICAgQ2VudGVyWCA9ICgoUmVjdFBhcmVudC5yaWdodCAtIFJlY3RQYXJlbnQubGVmdCkgLSBXaWR0aCkgLyAyOworICAgIENlbnRlclkgPSAoKFJlY3RQYXJlbnQuYm90dG9tIC0gUmVjdFBhcmVudC50b3ApIC0gSGVpZ2h0KSAvIDI7CisKKyAgICBpZiAoKENlbnRlclggPCAwKSB8fCAoQ2VudGVyWSA8IDApKSB7CisgICAgICAgIC8qIFRoZSBDZW50ZXIgV2luZG93IGlzIHNtYWxsZXIgdGhhbiB0aGUgcGFyZW50IHdpbmRvdy4gKi8KKyAgICAgICAgaWYgKGhXbmRQYXJlbnQgIT0gR2V0RGVza3RvcFdpbmRvdygpKSB7CisgICAgICAgICAgICAvKiBJZiB0aGUgcGFyZW50IHdpbmRvdyBpcyBub3QgdGhlIGRlc2t0b3AgdXNlIHRoZSBkZXNrdG9wIHNpemUuICovCisgICAgICAgICAgICBDZW50ZXJYID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pIC0gV2lkdGgpIC8gMjsKKyAgICAgICAgICAgIENlbnRlclkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgLSBIZWlnaHQpIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgQ2VudGVyWCA9IChDZW50ZXJYIDwgMCkgPyAwOiBDZW50ZXJYOworICAgICAgICBDZW50ZXJZID0gKENlbnRlclkgPCAwKSA/IDA6IENlbnRlclk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQ2VudGVyWCArPSBSZWN0UGFyZW50LmxlZnQ7CisgICAgICAgIENlbnRlclkgKz0gUmVjdFBhcmVudC50b3A7CisgICAgICAgIH0KKworICAgIC8qIENvcHkgdGhlIHZhbHVlcyBpbnRvIFJlY3RDZW50ZXIgKi8KKyAgICBSZWN0Q2VudGVyLmxlZnQgPSBDZW50ZXJYOworICAgIFJlY3RDZW50ZXIucmlnaHQgPSBDZW50ZXJYICsgV2lkdGg7CisgICAgUmVjdENlbnRlci50b3AgPSBDZW50ZXJZOworICAgIFJlY3RDZW50ZXIuYm90dG9tID0gQ2VudGVyWSArIEhlaWdodDsKKworICAgIC8qIE1vdmUgdGhlIHdpbmRvdyB0byB0aGUgbmV3IGxvY2F0aW9uICovCisgICAgTW92ZVdpbmRvdyhoV25kQ2VudGVyLCBSZWN0Q2VudGVyLmxlZnQsIFJlY3RDZW50ZXIudG9wLAorICAgICAgICAgICAgKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpLAorICAgICAgICAgICAgKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApLCByZXBhaW50KTsKK30KKwordm9pZCBfRVhQT1JUIENlbnRlckxvZ28oSFdORCBoV25kTG9nbywgSFdORCBoV25kUGFyZW50LCBpbnQgQ2VudGVyWSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgQ2VudGVyTG9nbworKiBQYXJhbWV0ZXJzOiAgIGhXbmRMb2dvICAgIC0gV2luZG93IHRvIGNlbnRlcgorKiAgICAgICAgICAgICAgIGhXbmRQYXJlbnQgIC0gSGFuZGxlIGZvciBwYXJlbnQgd2luZG93CisqICAgICAgICAgICAgICAgQ2VudGVyWSAgICAgLSBUb3AgY29vcmRpbmF0ZSBmb3IgbG9nbworKgorKiBEZXNjcmlwdGlvbjogIENlbnRlcnMgdGhlIHNwZWNpZmllZCB3aW5kb3cgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCisqICAgICAgICAgICAgICAgc3BlY2lmaWVkIHBhcmVudCB3aW5kb3cgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIG9ubHkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJFQ1QgICAgUmVjdFBhcmVudDsKKyAgICBSRUNUICAgIFJlY3RDZW50ZXI7CisgICAgaW50ICAgICBDZW50ZXJYLEhlaWdodCxXaWR0aDsKKworICAgIEdldFdpbmRvd1JlY3QoaFduZFBhcmVudCwgJlJlY3RQYXJlbnQpOworICAgIEdldFdpbmRvd1JlY3QoaFduZExvZ28sICZSZWN0Q2VudGVyKTsKKyAgICBXaWR0aCA9IChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KTsKKyAgICBIZWlnaHQgPSAoUmVjdENlbnRlci5ib3R0b20gLSBSZWN0Q2VudGVyLnRvcCk7CisgICAgQ2VudGVyWCA9ICgoUmVjdFBhcmVudC5yaWdodCAtIFJlY3RQYXJlbnQubGVmdCkgLSBXaWR0aCkgLyAyOworCisgICAgLyogQ29weSB0aGUgdmFsdWVzIGludG8gUmVjdENlbnRlciAqLworICAgIFJlY3RDZW50ZXIubGVmdCA9IENlbnRlclg7CisgICAgUmVjdENlbnRlci5yaWdodCA9IENlbnRlclggKyBXaWR0aDsKKyAgICBSZWN0Q2VudGVyLnRvcCA9IENlbnRlclk7CisgICAgUmVjdENlbnRlci5ib3R0b20gPSBDZW50ZXJZICsgSGVpZ2h0OworCisgICAgLyogTW92ZSB0aGUgd2luZG93IHRvIHRoZSBuZXcgbG9jYXRpb24gKi8KKyAgICBNb3ZlV2luZG93KGhXbmRMb2dvLCBSZWN0Q2VudGVyLmxlZnQsIFJlY3RDZW50ZXIudG9wLAorICAgICAgICAgICAgKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpLAorICAgICAgICAgICAgKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApLCBmYWxzZSk7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9jbWRsaW5lLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MmZhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jCkBAIC0wLDAgKzEsNDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIG1vZHVsZSBjb250YWlucyBjb2RlIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUsCisqICAgICAgICAgICAgICAgZXh0cmFjdGluZyBvcHRpb25zIGFuZCBwYXJhbWV0ZXJzIGluIHN0YW5kYXJkIFN5c3RlbSBWCisqICAgICAgICAgICAgICAgc3R5bGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNtZGxpbmUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50ICAgICBuZXh0YXJndiAgICA9ICAgMTsgICAgICAgICAgLyogSW5kZXggaW50byBhcmd2IGFycmF5ICAgICAgICAgICAgKi8KK2NoYXIgICAgKm5leHRjaGFyICAgPSAgIE5VTEw7ICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBjaGFyYWN0ZXIgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgSVNfU1dJVENIX0NIQVIoYykgICAgICAgKChjKSA9PSAnLScpCisjZGVmaW5lIElTX05PVF9TV0lUQ0hfQ0hBUihjKSAgICgoYykgIT0gJy0nKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBzcGVjaWZpYyBvcHRpb25zCisKK0hFQURFUjoKK2NtZGxpbmUuaAorCitQQVJBTUVURVJTOgorYXJnYyAgICAgICAgLSBWYWx1ZSBwYXNzZWQgdG8gcHJvZ3JhbSB0aHJvdWdoIGFyZ2MgdmFyaWFibGUKK2FyZ3YgICAgICAgIC0gUG9pbnRlciB0byB0aGUgYXJndiBhcnJheSBwYXNzZWQgdG8gdGhlIHByb2dyYW0KK2Zvcm1hdCAgICAgIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGNvbW1hbmQgbGluZQorYXJndW1lbnQgICAgLSBQb2ludGVyIHRvIG9wdGlvbmFsIGFyZ3VtZW50IG9uIGNvbW1hbmQgbGluZQorCitSRVRVUk5TOgorQ2hhcmFjdGVyIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBuZXh0IG9wdGlvbiBwYXJzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5CitnZXRjbWRvcHQuIFJldHVybnMgQUxMRE9ORSAoLTEpIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcGFyYW1ldGVycyB0byBiZSBwYXJzZWQKK29uIHRoZSBjb21tYW5kIGxpbmUsIFBBUkFNRVRFUiAoLTIpIHdoZW4gdGhlIGFyZ3VtZW50IGJlaW5nIHBhcnNlZCBpcyBhCitwYXJhbWV0ZXIgYW5kIG5vdCBhbiBvcHRpb24gc3dpdGNoIGFuZCBsYXN0bHkgSU5WQUxJRCAoLTMpIGlmIGFuIGVycm9yCitvY2N1cmVkIHdoaWxlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZS4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHN3aXRjaGVzIGluIFVOSVggU3lzdGVtIFYgc3R5bGUuCitXaGVuIGdldGNtZG9wdCBpcyBjYWxsZWQsIGl0IHJldHVybnMgdGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSBuZXh0IHZhbGlkCitvcHRpb24gdGhhdCBpcyBwYXJzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzIHNwZWNpZmllZCBieSB0aGUgRm9ybWF0CitzdHJpbmcuIFRoZSBmb3JtYXQgc3RyaW5nIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06CisKKyAgICAiYWJjZDplOmY6IgorCit3aGVyZSBhLGIgYW5kIGMgcmVwcmVzZW50IHNpbmdsZSBzd2l0Y2ggc3R5bGUgb3B0aW9ucyBhbmQgdGhlIGNoYXJhY3RlcgorY29kZSByZXR1cm5lZCBieSBnZXRjbWRvcHQgaXMgdGhlIG9ubHkgdmFsdWUgcmV0dXJuZWQuIEFsc28gZCwgZSBhbmQgZgorcmVwcmVzZW50IG9wdGlvbnMgdGhhdCBleHBlY3QgYXJndW1lbnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZW0gb24gdGhlCitjb21tYW5kIGxpbmUuIFRoZSBhcmd1bWVudCB0aGF0IGZvbGxvd3MgdGhlIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzCityZXR1cm5lZCB2aWEgYSByZWZlcmVuY2UgaW4gdGhlIHBvaW50ZXIgYXJndW1lbnQuIFRodXMgYSB2YWxpZCBjb21tYW5kIGxpbmUKK2ZvciB0aGlzIGZvcm1hdCBzdHJpbmcgbWlnaHQgYmU6CisKKyAgICBteXByb2dyYW0gLWFkbGluZXMgLWIgLWYgZm9ybWF0IGluZmlsZSBvdXRmaWxlCisKK3doZXJlIGEgYW5kIGIgd2lsbCBiZSByZXR1cm5lZCBhcyBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbnMgd2l0aCBubyBhcmd1bWVudCwKK3doaWxlIGQgaXMgcmV0dXJuZWQgd2l0aCB0aGUgYXJndW1lbnQgbGluZXMgYW5kIGYgaXMgcmV0dXJuZWQgd2l0aCB0aGUKK2FyZ3VtZW50IGZvcm1hdC4KKworV2hlbiBnZXRjbWRvcHQgcmV0dXJucyB3aXRoIFBBUkFNRVRFUiAod2UgYXR0ZW1wdGVkIHRvIHBhcnNlIGEgcGFyYW10ZXIsIG5vdAorYW4gb3B0aW9uKSwgdGhlIGdsb2JhbCB2YXJpYWJsZSBOZXh0QXJndiB3aWxsIGhvbGQgYW4gaW5kZXggaW4gdGhlIGFyZ3YKK2FycmF5IHRvIHRoZSBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lIEFGVEVSIHRoZSBvcHRpb25zLCBpZSBpbiB0aGUKK2Fib3ZlIGV4YW1wbGUgdGhlIHN0cmluZyAnaW5maWxlJy4gSWYgdGhlIHBhcmFtZXRlciBpcyBzdWNjZXNzZnVsbHkgdXNlZCwKK05leHRBcmd2IHNob3VsZCBiZSBpbmNyZW1lbnRlZCBhbmQgZ2V0Y21kb3B0IGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gcGFyc2UgYW55Cittb3JlIG9wdGlvbnMuIFRodXMgeW91IGNhbiBhbHNvIGhhdmUgb3B0aW9ucyBpbnRlcnNwZXJzZWQgdGhyb3VnaHQgdGhlCitjb21tYW5kIGxpbmUuIGVnOgorCisgICAgbXlwcm9ncmFtIC1hZGxpbmVzIGluZmlsZSAtYiBvdXRmaWxlIC1mIGZvcm1hdAorCitjYW4gYmUgbWFkZSB0byBiZSBhIHZhbGlkIGZvcm0gb2YgdGhlIGFib3ZlIGNvbW1hbmQgbGluZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZ2V0Y21kb3B0KAorICAgIGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2LAorICAgIGNoYXIgKmZvcm1hdCwKKyAgICBjaGFyICoqYXJndW1lbnQpCit7CisgICAgY2hhciAgICBjaDsKKyAgICBjaGFyICAgICpmb3JtYXRjaGFyOworCisgICAgaWYgKGFyZ2MgPiBuZXh0YXJndikgeworICAgICAgICBpZiAobmV4dGNoYXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbmV4dGNoYXIgPSBhcmd2W25leHRhcmd2XTsgICAgICAvKiBJbmRleCBuZXh0IGFyZ3VtZW50ICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZXh0Y2hhciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmV4dGFyZ3YrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUxMRE9ORTsgICAgICAgICAgICAgLyogTm8gbW9yZSBvcHRpb25zICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKElTX05PVF9TV0lUQ0hfQ0hBUigqbmV4dGNoYXIpKSB7CisgICAgICAgICAgICAgICAgbmV4dGNoYXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBQQVJBTUVURVI7ICAgICAgICAgICAvKiBXZSBoYXZlIGEgcGFyYW1ldGVyICAgICAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Y2hhcisrOyAgICAgICAgICAgICAgICAgICAgIC8qIE1vdmUgcGFzdCBzd2l0Y2ggb3BlcmF0b3IgKi8KKyAgICAgICAgICAgIGlmIChJU19TV0lUQ0hfQ0hBUigqbmV4dGNoYXIpKSB7CisgICAgICAgICAgICAgICAgbmV4dGNoYXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOyAgICAgICAgICAgICAvKiBJZ25vcmUgcmVzdCBvZiBsaW5lICAgICAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGlmICgoY2ggPSAqKG5leHRjaGFyKyspKSA9PSAwKSB7CisgICAgICAgICAgICBuZXh0Y2hhciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsgICAgICAgICAgICAgICAgIC8qIE5vIG9wdGlvbnMgb24gbGluZSAgICAgICAqLworICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChjaCA9PSAnOicgfHwgIChmb3JtYXRjaGFyID0gc3RyY2hyKGZvcm1hdCwgY2gpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisKKyAgICAgICAgaWYgKCooKytmb3JtYXRjaGFyKSA9PSAnOicpIHsgICAvKiBFeHBlY3QgYW4gYXJndW1lbnQgYWZ0ZXIgb3B0aW9uICovCisgICAgICAgICAgICBuZXh0YXJndisrOworICAgICAgICAgICAgaWYgKCpuZXh0Y2hhciA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ2MgPD0gbmV4dGFyZ3YpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOworICAgICAgICAgICAgICAgIG5leHRjaGFyID0gYXJndltuZXh0YXJndisrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAqYXJndW1lbnQgPSBuZXh0Y2hhcjsKKyAgICAgICAgICAgIG5leHRjaGFyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBzd2l0Y2ggc3R5bGUgb3B0aW9uICAgICovCisgICAgICAgICAgICBpZiAoKm5leHRjaGFyID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXh0YXJndisrOworICAgICAgICAgICAgICAgIG5leHRjaGFyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAqYXJndW1lbnQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7ICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBvcHRpb24gc3BlY2lmaWVyICAgICAgKi8KKyAgICAgICAgfQorICAgIG5leHRjaGFyID0gTlVMTDsKKyAgICBuZXh0YXJndisrOworICAgIHJldHVybiBBTExET05FOyAgICAgICAgICAgICAgICAgLyogbm8gYXJndW1lbnRzIG9uIGNvbW1hbmQgbGluZSAgICAgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvcHRhcnIgICAgICAtIERlc2NyaXB0aW9uIGZvciB0aGUgb3B0aW9uIHdlIGFyZSBwYXJzaW5nCithcmd1bWVudCAgICAtIFN0cmluZyB0byBwYXJzZQorCitSRVRVUk5TOgorSU5WQUxJRCBvbiBlcnJvciwgQUxMRE9ORSBvbiBzdWNjZXNzLgorCitSRU1BUktTOgorUGFyc2VzIHRoZSBhcmd1bWVudCBzdHJpbmcgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGFyZ3VtZW50IHRoYXQgaXMKK2V4cGVjdGVkLCBmaWxsaW5nIGluIHRoZSBhcmd1bWVudCBmb3IgdGhhdCBvcHRpb24uIE5vdGUgdGhhdCB0byBwYXJzZSBhCitzdHJpbmcsIHdlIHNpbXBseSByZXR1cm4gYSBwb2ludGVyIHRvIGFyZ3VtZW50LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9uKAorICAgIE9wdGlvbiAqb3B0YXJyLAorICAgIGNoYXIgKmFyZ3VtZW50KQoreworICAgIGludCAgICAgbnVtX3JlYWQ7CisKKyAgICBzd2l0Y2ggKChpbnQpKG9wdGFyci0+dHlwZSkpIHsKKyAgICAgICAgY2FzZSBPUFRfSU5URUdFUjoKKyAgICAgICAgICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlZCIsKGludCopb3B0YXJyLT5hcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BUX0hFWDoKKyAgICAgICAgICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIleCIsKGludCopb3B0YXJyLT5hcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BUX09DVEFMOgorICAgICAgICAgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVvIiwoaW50KilvcHRhcnItPmFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUFRfVU5TSUdORUQ6CisgICAgICAgICAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJXUiLCh1aW50KilvcHRhcnItPmFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUFRfTElOVEVHRVI6CisgICAgICAgICAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWxkIiwobG9uZyopb3B0YXJyLT5hcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BUX0xIRVg6CisgICAgICAgICAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWx4IiwobG9uZyopb3B0YXJyLT5hcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BUX0xPQ1RBTDoKKyAgICAgICAgICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbG8iLChsb25nKilvcHRhcnItPmFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUFRfTFVOU0lHTkVEOgorICAgICAgICAgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVsdSIsKHVsb25nKilvcHRhcnItPmFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUFRfRkxPQVQ6CisgICAgICAgICAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWYiLChmbG9hdCopb3B0YXJyLT5hcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BUX0RPVUJMRToKKyAgICAgICAgICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbGYiLChkb3VibGUqKW9wdGFyci0+YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QVF9MRE9VQkxFOgorICAgICAgICAgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVMZiIsKGxvbmcgZG91YmxlKilvcHRhcnItPmFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUFRfU1RSSU5HOgorICAgICAgICAgICAgbnVtX3JlYWQgPSAxOyAgICAgICAgICAgLyogVGhpcyBhbHdheXMgd29ya3MgICAgKi8KKyAgICAgICAgICAgICooKGNoYXIqKilvcHRhcnItPmFyZykgPSBhcmd1bWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisgICAgICAgIH0KKworICAgIGlmIChudW1fcmVhZCA9PSAwKQorICAgICAgICByZXR1cm4gSU5WQUxJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBTExET05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSEVBREVSOgorY21kbGluZS5oCisKK1BBUkFNRVRFUlM6CithcmdjICAgICAgICAtIE51bWJlciBvZiBhcmd1bWVudHMgb24gY29tbWFuZCBsaW5lCithcmd2ICAgICAgICAtIEFycmF5IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK251bV9vcHQgICAgIC0gTnVtYmVyIG9mIG9wdGlvbnMgaW4gb3B0aW9uIGFycmF5CitvcHRhcnIgICAgICAtIEFycmF5IHRvIHNwZWNpZnkgaG93IHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUKK2RvX3BhcmFtICAgIC0gUm91dGluZSB0byBoYW5kbGUgYSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCisKK1JFVFVSTlM6CitBTExET05FLCBJTlZBTElEIG9yIEhFTFAKKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYWNjb3JkaW5nIHRvIGEgdGFibGUgb2Ygb3B0aW9ucy4gVGhpcworcm91dGluZSBjYWxscyBnZXRjbWRvcHQgYWJvdmUgdG8gcGFyc2UgZWFjaCBpbmRpdmlkdWFsIG9wdGlvbiBhbmQgYXR0ZW1wdHMKK3RvIHBhcnNlIGVhY2ggb3B0aW9uIGludG8gYSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuIFRoZSByb3V0aW5lCitjYW4gcGFyc2UgaW50ZWdlcnMgYW5kIGxvbmcgaW50ZWdlcnMgaW4gZWl0aGVyIGRlY2ltYWwsIG9jdGFsLCBoZXhhZGVjaW1hbAorbm90YXRpb24sIHVuc2lnbmVkIGludGVnZXJzIGFuZCB1bnNpZ25lZCBsb25ncywgc3RyaW5ncyBhbmQgb3B0aW9uIHN3aXRjaGVzLgorT3B0aW9uIHN3aXRjaGVzIGFyZSBzaW1wbHkgYm9vbGVhbiB2YXJpYWJsZXMgdGhhdCBnZXQgdHVybmVkIG9uIGlmIHRoZQorc3dpdGNoIHdhcyBwYXJzZWQuCisKK1BhcmFtZXRlcnMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkgY2FsbGluZyBhIHVzZXIgc3VwcGxpZWQKK3JvdXRpbmUgZG9fcGFyYW0oKSB0byBoYW5kbGUgZWFjaCBwYXJhbWV0ZXIgYXMgaXQgaXMgZW5jb3VudGVyZWQuIFRoZQorcm91dGluZSBkb19wYXJhbSgpIHNob3VsZCBhY2NlcHQgYSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIgb24gdGhlIGNvbW1hbmQKK2xpbmUgYW5kIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIGhvdyBtYW55IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGVuY291bnRlcmVkCisoaWU6IDEgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCAxMCBpZiBpdCBpcyB0aGUgMTB0aCBldGMpLCBhbmQgcmV0dXJuCitBTExET05FIHVwb24gc3VjY2Vzc2Z1bGx5IHBhcnNpbmcgaXQgb3IgSU5WQUxJRCBpZiB0aGUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgorCitXZSByZXR1cm4gZWl0aGVyIEFMTERPTkUgaWYgYWxsIHRoZSBvcHRpb25zIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwKK0lOVkFMSUQgaWYgYW4gaW52YWxpZCBvcHRpb24gd2FzIGVuY291bnRlcmVkIG9yIEhFTFAgaWYgYW55IG9mIC1oLCAtSCBvcgorLT8gd2VyZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGdldGFyZ3MoCisgICAgaW50IGFyZ2MsCisgICAgY2hhciAqYXJndltdLAorICAgIGludCBudW1fb3B0LAorICAgIE9wdGlvbiBvcHRhcnJbXSwKKyAgICBpbnQgKCpkb19wYXJhbSkoCisgICAgICAgIGNoYXIgKnBhcmFtLAorICAgICAgICBpbnQgbnVtKSkKK3sKKyAgICBpbnQgICAgIGksb3B0OworICAgIGNoYXIgICAgKmFyZ3VtZW50OworICAgIGludCAgICAgcGFyYW1fbnVtID0gMTsKKyAgICBjaGFyICAgIGNtZHN0cltNQVhBUkcqMiArIDRdOworCisgICAgLyogQnVpbGQgdGhlIGNvbW1hbmQgc3RyaW5nIGZyb20gdGhlIGFycmF5IG9mIG9wdGlvbnMgICAqLworCisgICAgc3RyY3B5KGNtZHN0ciwiaEg/Iik7CisgICAgZm9yIChpID0gMCxvcHQgPSAzOyBpIDwgbnVtX29wdDsgaSsrLG9wdCsrKSB7CisgICAgICAgIGNtZHN0cltvcHRdID0gb3B0YXJyW2ldLm9wdDsKKyAgICAgICAgaWYgKG9wdGFycltpXS50eXBlICE9IE9QVF9TV0lUQ0gpIHsKKyAgICAgICAgICAgIGNtZHN0clsrK29wdF0gPSAnOic7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBjbWRzdHJbb3B0XSA9ICdcMCc7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIG9wdCA9IGdldGNtZG9wdChhcmdjLGFyZ3YsY21kc3RyLCZhcmd1bWVudCk7CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEhFTFA7CisgICAgICAgICAgICBjYXNlIEFMTERPTkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFMTERPTkU7CisgICAgICAgICAgICBjYXNlIElOVkFMSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisgICAgICAgICAgICBjYXNlIFBBUkFNRVRFUjoKKyAgICAgICAgICAgICAgICBpZiAoZG9fcGFyYW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisgICAgICAgICAgICAgICAgaWYgKGRvX3BhcmFtKGFyZ3ZbbmV4dGFyZ3ZdLHBhcmFtX251bSkgPT0gSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisgICAgICAgICAgICAgICAgbmV4dGFyZ3YrKzsKKyAgICAgICAgICAgICAgICBwYXJhbV9udW0rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIHRoZSBvcHRpb24gaW4gdGhlIG9wdGlvbiBhcnJheS4gV2UgYXJlCisgICAgICAgICAgICAgICAgICogZ3VhcmFudGVlZCB0byBmaW5kIGl0LgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9vcHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3B0YXJyW2ldLm9wdCA9PSBvcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcHRhcnJbaV0udHlwZSA9PSBPUFRfU1dJVENIKQorICAgICAgICAgICAgICAgICAgICAqKChpYm9vbCopb3B0YXJyW2ldLmFyZykgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2Vfb3B0aW9uKCZvcHRhcnJbaV0sYXJndW1lbnQpID09IElOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitIRUFERVI6CitjbWRsaW5lLmgKKworUEFSQU1FVEVSUzoKK251bV9vcHQgLSBOdW1iZXIgb2Ygb3B0aW9ucyBpbiB0aGUgdGFibGUKK29wdGFyciAgLSBUYWJsZSBvZiBvcHRpb24gZGVzY3JpcHRpb25zCisKK1JFTUFSS1M6CitQcmludHMgdGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggb3B0aW9uIGluIGEgc3RhbmRhcmQgZm9ybWF0IHRvIHRoZSBzdGFuZGFyZAorb3V0cHV0IGRldmljZS4gVGhlIGRlc2NyaXB0aW9uIGZvciBlYWNoIG9wdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSB0YWJsZQorb2Ygb3B0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50X2Rlc2MoCisgICAgaW50IG51bV9vcHQsCisgICAgT3B0aW9uIG9wdGFycltdKQoreworICAgIGludCAgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fb3B0OyBpKyspIHsKKyAgICAgICAgaWYgKG9wdGFycltpXS50eXBlID09IE9QVF9TV0lUQ0gpCisgICAgICAgICAgICBwcmludGYoIiAgLSVjICAgICAgICVzXG4iLG9wdGFycltpXS5vcHQsb3B0YXJyW2ldLmRlc2MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiAgLSVjPGFyZz4gICVzXG4iLG9wdGFycltpXS5vcHQsb3B0YXJyW2ldLmRlc2MpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitIRUFERVI6CitjbWRsaW5lLmgKKworUEFSQU1FVEVSUzoKK21vZHVsZU5hbWUgIC0gTW9kdWxlIG5hbWUgZm9yIHByb2dyYW0KK2NtZExpbmUgICAgIC0gQ29tbWFuZCBsaW5lIHRvIHBhcnNlCitwYXJnYyAgICAgICAtIFBvaW50ZXIgdG8gJ2FyZ2MnIHBhcmFtZXRlcgorcGFyZ3YgICAgICAgLSBQb2ludGVyIHRvICdhcmd2JyBwYXJhbWV0ZXIKK21heEFyZ2MgICAgIC0gTWF4aW11bSBhcmd2IGFycmF5IGluZGV4CisKK1JFTUFSS1M6CitQYXJzZXMgYSBjb21tYW5kIGxpbmUgZnJvbSBhIHNpbmdsZSBzdHJpbmcgaW50byB0aGUgQyBzdHlsZSAnYXJnYycgYW5kCisnYXJndicgZm9ybWF0LiBNb3N0IHVzZWZ1bCBmb3IgV2luZG93cyBwcm9ncmFtcyB3aGVyZSB0aGUgY29tbWFuZCBsaW5lCitpcyBwYXNzZWQgaW4gdmVyYmF0aW0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBhcnNlX2NvbW1hbmRsaW5lKAorICAgIGNoYXIgKm1vZHVsZU5hbWUsCisgICAgY2hhciAqY21kTGluZSwKKyAgICBpbnQgKnBhcmdjLAorICAgIGNoYXIgKmFyZ3ZbXSwKKyAgICBpbnQgbWF4QXJndikKK3sKKyAgICBzdGF0aWMgY2hhciBzdHJbNTEyXTsKKyAgICBzdGF0aWMgY2hhciBmaWxlbmFtZVsyNjBdOworICAgIGNoYXIgICAgICAgICpwcmV2V29yZCA9IE5VTEw7CisgICAgaWJvb2wgICAgICAgIGluUXVvdGUgPSBGQUxTRTsKKyAgICBpYm9vbCAgICAgICAgbm9TdHJpcCA9IEZBTFNFOworICAgIGludCAgICAgICAgIGFyZ2M7CisKKyAgICBhcmdjID0gMDsKKyAgICBzdHJjcHkoZmlsZW5hbWUsbW9kdWxlTmFtZSk7CisgICAgYXJndlthcmdjKytdID0gZmlsZW5hbWU7CisgICAgY21kTGluZSA9IHN0cm5jcHkoc3RyLCBjbWRMaW5lLCBzaXplb2Yoc3RyKS0xKTsKKyAgICB3aGlsZSAoKmNtZExpbmUpIHsKKyAgICAgICAgc3dpdGNoICgqY21kTGluZSkgeworICAgICAgICAgICAgY2FzZSAnIicgOgorICAgICAgICAgICAgICAgIGlmIChwcmV2V29yZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vU3RyaXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNtZExpbmUgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgYXJndiBbYXJnYysrXSA9IHByZXZXb3JkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldldvcmQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBub1N0cmlwID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyAnIDoKKyAgICAgICAgICAgIGNhc2UgJ1x0JyA6CisgICAgICAgICAgICAgICAgaWYgKCFpblF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2V29yZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqY21kTGluZSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmd2IFthcmdjKytdID0gcHJldldvcmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2V29yZCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBub1N0cmlwID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIGlmIChwcmV2V29yZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBwcmV2V29yZCA9IGNtZExpbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoYXJnYyA+PSBtYXhBcmd2IC0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbWRMaW5lKys7CisgICAgICAgIH0KKworICAgIGlmICgocHJldldvcmQgIT0gTlVMTCB8fCAoaW5RdW90ZSAmJiBwcmV2V29yZCAhPSBOVUxMKSkgJiYgYXJnYyA8IG1heEFyZ3YgLSAxKSB7CisgICAgICAgICpjbWRMaW5lID0gJ1wwJzsKKyAgICAgICAgYXJndiBbYXJnYysrXSA9IHByZXZXb3JkOworICAgICAgICB9CisgICAgYXJndlthcmdjXSA9IE5VTEw7CisKKyAgICAvKiBSZXR1cm4gdXBkYXRlZCBwYXJhbWV0ZXJzICovCisgICAgcmV0dXJuICgqcGFyZ2MgPSBhcmdjKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhhNTQzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhYmVvcy5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIExpbnV4CisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCitvZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKK3dpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJworZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQordG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCisgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCisKK1JFTUFSS1M6CitJbiBvcmRlciB0byBzdXBwb3J0IGRlcGxveWluZyBuZXcgTnVjbGV1cyBkcml2ZXJzIHRoYXQgbWF5IHJlcXVpcmUgdXBkYXRlZAorUE0gbGlicmFyeSBmdW5jdGlvbnMsIHdlIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3lzdGVtIHdpZGUgdmVyc2lvbgorb2YgdGhlIFBNIGZ1bmN0aW9ucyBhdmFpbGFibGUuIElmIHNvIHdlIHJldHVybiB0aG9zZSBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoCit0aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVkIGluIHZlcnNpb24gb2YgdGhlIFBNCitsaWJyYXJ5IGlzIHVzZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gbG9jYWwgdmVyc2lvbiBvZiBOdWNsZXVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQoreworICAgIC8vIFRPRE86IFdlIG1heSB2ZXJ5IHdlbGwgd2FudCB0byBwcm92aWRlIGEgc3lzdGVtIHNoYXJlZCBsaWJyYXJ5CisgICAgLy8gICAgICAgdGhhdCBlcG9ydHMgdGhlIFBNIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgTnVjbGV1cyBsaWJyYXJ5CisgICAgLy8gICAgICAgZm9yIEJlT1MgaGVyZS4gVGhhdCB3aWxsIGVsaW1pbmF0ZSBmYXRhbCBlcnJvcnMgbG9hZGluZyBuZXcKKyAgICAvLyAgICAgICBkcml2ZXJzIG9uIEJlT1MhCisgICAgcmV0dXJuICZfUE1faW1wb3J0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICAodm9pZClzaGFyZWQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIFRFU1RfSEFSTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgICAgIHZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOworICAgICAgICB2YWx1ZS0+aGlnaCA9IDA7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MGU4MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIE1TRE9TCisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIE1TRE9TIG9wZXJhdGluZyBzeXN0ZW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1faGVscC5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCitvZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKK3dpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJworZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQordG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCisgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCisKK1JFTUFSS1M6CitOb3RoaW5nIHRvIGRvIGhlcmUgZm9yIERPUy4gQmFzaWNhbGx5IHNpbmNlIERPUyBoYXMgbm8gc3lzdGVtIHdpZGUgc2hhcmVkCitsaWJyYXJ5IG1lY2hhbmlzbSB3ZSBhcmUgZXNzZW50aWFsbHkgc2NyZXdlZCBpZiB0aGUgYmluYXJ5IEFQSSBjaGFuZ2VzLgorQnkgZGVmYXVsdCBmb3IgMzItYml0IERPUyBhcHBzIHRoZSBsb2NhbCBOdWNsZXVzIGRyaXZlcnMgc2hvdWxkIGFsd2F5cyBiZQordXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCit7CisgICAgcmV0dXJuICZfUE1faW1wb3J0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICAodm9pZClzaGFyZWQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWYgIWRlZmluZWQoVEVTVF9IQVJORVNTKSAmJiAhZGVmaW5lZChWQkVURVNUKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIERPUworTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jCkBAIC0wLDAgKzEsMjY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgZW52aXJvbm1lbnQKKyoKKyogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgdGhlIEdyYXBoaWNzIEFjY2VsZXJhdG9yIERyaXZlciBBUEkuIFVzZXMKKyogICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB3aXRoIERPUworKiAgICAgICAgICAgICAgIGV4dGVuZGVyIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisjaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFRFU1RfSEFSTkVTUworR0FfZXhwb3J0cyAgX1ZBUkFQSSBfX0dBX2V4cG9ydHM7CitzdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOworc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7CisKK3N0YXRpYyBOX2ltcG9ydHMgX05faW1wb3J0cyA9IHsKKyAgICBzaXplb2YoTl9pbXBvcnRzKSwKKyAgICBfT1NfZGVsYXksCisgICAgfTsKKworc3RhdGljIEdBX2ltcG9ydHMgX0dBX2ltcG9ydHMgPSB7CisgICAgc2l6ZW9mKEdBX2ltcG9ydHMpLAorICAgIEdBX2dldFNoYXJlZEluZm8sCisgICAgR0FfVGltZXJJbml0LAorICAgIEdBX1RpbWVyUmVhZCwKKyAgICBHQV9UaW1lckRpZmZlcmVuY2UsCisgICAgfTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIERMTF9OQU1FICAgICAgICAiZ3JhcGhpY3MuYnBkIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIHVzZWQgYnV0IHdlIG11c3QgaW1wbGVtZW50IGl0IGFuZCByZXR1cm4gTlVMTAorZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBiaW5hcnkgZHJpdmVycy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAorICAgIGludCBkZXZpY2UpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZm5kZWYgVEVTVF9IQVJORVNTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZhdGFsIGVycm9yIGhhbmRsZXIgZm9yIG5vbi1leHBvcnRlZCBHQV9leHBvcnRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9HQV9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQoreworICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIE51Y2xldXMgZXhwb3J0IGZ1bmN0aW9uIGNhbGxlZCEgUGxlYXNlIHVwZ3JhZGUgeW91ciBjb3B5IG9mIE51Y2xldXMhXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzaGFyZWQgIC0gVHJ1ZSB0byBsb2FkIHRoZSBkcml2ZXIgaW50byBzaGFyZWQgbWVtb3J5LgorCitSRU1BUktTOgorTG9hZHMgdGhlIE51Y2xldXMgYmluYXJ5IHBvcnRhYmxlIERMTCBpbnRvIG1lbW9yeSBhbmQgaW5pdGlsaXNlcyBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgTG9hZERyaXZlcigKKyAgICBpYm9vbCBzaGFyZWQpCit7CisgICAgR0FfaW5pdExpYnJhcnlfdCAgICBHQV9pbml0TGlicmFyeTsKKyAgICBHQV9leHBvcnRzICAgICAgICAgICpnYUV4cDsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOworICAgIGludCAgICAgICAgICAgICAgICAgaSxtYXg7CisgICAgdWxvbmcgICAgICAgICAgICAgICAqcDsKKworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRyaXZlciAqLworICAgIGlmIChsb2FkZWQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIFBNX2luaXQoKTsKKworICAgIC8qIEZpcnN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIHN5c3RlbSB3aWRlIHNoYXJlZCBleHBvcnRzCisgICAgICogaWYgdGhleSBhcmUgYXZhaWxhYmxlLiBVbmRlciBPUy8yIHRoaXMgY29ubmVjdHMgdG8gb3VyIGdsb2JhbAorICAgICAqIHNoYXJlZCBOdWNsZXVzIGxvYWRlciBpbiBTRERQTUkuRExMLgorICAgICAqLworICAgIF9fR0FfZXhwb3J0cy5kd1NpemUgPSBzaXplb2YoX19HQV9leHBvcnRzKTsKKyAgICBpZiAoR0FfZ2V0U2hhcmVkRXhwb3J0cygmX19HQV9leHBvcnRzLHNoYXJlZCkpCisgICAgICAgIHJldHVybiBsb2FkZWQgPSB0cnVlOworCisgICAgLyogT3BlbiB0aGUgQlBEIGZpbGUgKi8KKyAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7CisgICAgc3RyY2F0KGZpbGVuYW1lLERMTF9OQU1FKTsKKyAgICBpZiAoKGhNb2RCUEQgPSBQRV9sb2FkTGlicmFyeShmaWxlbmFtZSxzaGFyZWQpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKChHQV9pbml0TGlicmFyeSA9IChHQV9pbml0TGlicmFyeV90KVBFX2dldFByb2NBZGRyZXNzKGhNb2RCUEQsIl9HQV9pbml0TGlicmFyeSIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOworICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQorICAgICAgICBzdHJjcHkoYnBkcGF0aCxQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUE1fYmFja3NsYXNoKGJwZHBhdGgpOworICAgICAgICBzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7CisgICAgICAgIH0KKyAgICBpZiAoKGdhRXhwID0gR0FfaW5pdExpYnJhcnkoc2hhcmVkLGJwZHBhdGgsZmlsZW5hbWUsR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCksJl9OX2ltcG9ydHMsJl9HQV9pbXBvcnRzKSkgPT0gTlVMTCkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiR0FfaW5pdExpYnJhcnkgZmFpbGVkIVxuIik7CisKKyAgICAvKiBJbml0aWFsaXplIGFsbCBkZWZhdWx0IGltcG9ydHMgdG8gcG9pbnQgdG8gZmF0YWwgZXJyb3IgaGFuZGxlcgorICAgICAqIGZvciB1cHdhcmRzIGNvbXBhdGliaWxpdHksIGFuZCBjb3B5IHRoZSBleHBvcnRlZCBmdW5jdGlvbnMuCisgICAgICovCisgICAgbWF4ID0gc2l6ZW9mKF9fR0FfZXhwb3J0cykvc2l6ZW9mKEdBX2luaXRMaWJyYXJ5X3QpOworICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9fR0FfZXhwb3J0czsgaSA8IG1heDsgaSsrKQorICAgICAgICAqcCsrID0gKHVsb25nKV9HQV9mYXRhbEVycm9ySGFuZGxlcjsKKyAgICBtZW1jcHkoJl9fR0FfZXhwb3J0cyxnYUV4cCxNSU4oc2l6ZW9mKF9fR0FfZXhwb3J0cyksZ2FFeHAtPmR3U2l6ZSkpOworICAgIGxvYWRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCisgKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKKyAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgorICovCisKKy8qIHtzZWNyZXR9ICovCitpbnQgTkFQSSBHQV9zdGF0dXModm9pZCkKK3sKKyAgICBpZiAoIWxvYWRlZCkKKyAgICAgICAgcmV0dXJuIG5Ecml2ZXJOb3RGb3VuZDsKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3N0YXR1cygpOworfQorCisvKiB7c2VjcmV0fSAqLworY29uc3QgY2hhciAqIE5BUEkgR0FfZXJyb3JNc2coCisgICAgTl9pbnQzMiBzdGF0dXMpCit7CisgICAgaWYgKCFsb2FkZWQpCisgICAgICAgIHJldHVybiAiVW5hYmxlIHRvIGxvYWQgTnVjbGV1cyBkZXZpY2UgZHJpdmVyISI7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9lcnJvck1zZyhzdGF0dXMpOworfQorCisvKiB7c2VjcmV0fSAqLworaW50IE5BUEkgR0FfZ2V0RGF5c0xlZnQoTl9pbnQzMiBzaGFyZWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2dldERheXNMZWZ0KHNoYXJlZCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitpbnQgTkFQSSBHQV9yZWdpc3RlckxpY2Vuc2UodWNoYXIgKmxpY2Vuc2UsTl9pbnQzMiBzaGFyZWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcmVnaXN0ZXJMaWNlbnNlKGxpY2Vuc2Usc2hhcmVkKTsKK30KKworLyoge3NlY3JldH0gKi8KK2lib29sIE5BUEkgR0FfbG9hZEluR1VJKE5faW50MzIgc2hhcmVkKQoreworICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9sb2FkSW5HVUkoc2hhcmVkKTsKK30KKworLyoge3NlY3JldH0gKi8KK2ludCBOQVBJIEdBX2VudW1lcmF0ZURldmljZXMoTl9pbnQzMiBzaGFyZWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZW51bWVyYXRlRGV2aWNlcyhzaGFyZWQpOworfQorCisvKiB7c2VjcmV0fSAqLworR0FfZGV2Q3R4ICogTkFQSSBHQV9sb2FkRHJpdmVyKE5faW50MzIgZGV2aWNlSW5kZXgsTl9pbnQzMiBzaGFyZWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfbG9hZERyaXZlcihkZXZpY2VJbmRleCxzaGFyZWQpOworfQorCisvKiB7c2VjcmV0fSAqLwordm9pZCBOQVBJIEdBX2dldEdsb2JhbE9wdGlvbnMoCisgICAgR0FfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucywKKyAgICBpYm9vbCBzaGFyZWQpCit7CisgICAgaWYgKExvYWREcml2ZXIoc2hhcmVkKSkKKyAgICAgICAgX19HQV9leHBvcnRzLkdBX2dldEdsb2JhbE9wdGlvbnMob3B0aW9ucyxzaGFyZWQpOworfQorCisvKiB7c2VjcmV0fSAqLworUEVfTU9EVUxFICogTkFQSSBHQV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekJQRE5hbWUsCisgICAgdWxvbmcgKnNpemUsCisgICAgaWJvb2wgc2hhcmVkKQoreworICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2xvYWRMaWJyYXJ5KHN6QlBETmFtZSxzaXplLHNoYXJlZCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitHQV9kZXZDdHggKiBOQVBJIEdBX2dldEN1cnJlbnREcml2ZXIoCisgICAgTl9pbnQzMiBkZXZpY2VJbmRleCkKK3sKKyAgICAvKiBCYWlsIGZvciBvbGRlciBkcml2ZXJzIHRoYXQgZGlkbid0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uISAqLworICAgIGlmICghX19HQV9leHBvcnRzLkdBX2dldEN1cnJlbnREcml2ZXIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZ2V0Q3VycmVudERyaXZlcihkZXZpY2VJbmRleCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitSRUYyRF9kcml2ZXIgKiBOQVBJIEdBX2dldEN1cnJlbnRSZWYyZCgKKyAgICBOX2ludDMyIGRldmljZUluZGV4KQoreworICAgIC8qIEJhaWwgZm9yIG9sZGVyIGRyaXZlcnMgdGhhdCBkaWRuJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24hICovCisgICAgaWYgKCFfX0dBX2V4cG9ydHMuR0FfZ2V0Q3VycmVudFJlZjJkKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2dldEN1cnJlbnRSZWYyZChkZXZpY2VJbmRleCk7Cit9CisKKy8qIHtzZWNyZXR9ICovCitpbnQgTkFQSSBHQV9pc09FTVZlcnNpb24oaWJvb2wgc2hhcmVkKQoreworICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2lzT0VNVmVyc2lvbihzaGFyZWQpOworfQorCisvKiB7c2VjcmV0fSAqLworTl91aW50MzIgKiBOQVBJIEdBX2dldExpY2Vuc2VkRGV2aWNlcyhpYm9vbCBzaGFyZWQpCit7CisgICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZ2V0TGljZW5zZWREZXZpY2VzKHNoYXJlZCk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGludXguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgorb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCit3aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKK2RpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKK3RvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAorICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQorCitSRU1BUktTOgorSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKK1BNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KK29mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAordGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQorbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKK3sKKyAgICAvLyBUT0RPOiBXZSBtYXkgdmVyeSB3ZWxsIHdhbnQgdG8gcHJvdmlkZSBhIHN5c3RlbSBzaGFyZWQgbGlicmFyeQorICAgIC8vICAgICAgIHRoYXQgZXBvcnRzIHRoZSBQTSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIE51Y2xldXMgbGlicmFyeQorICAgIC8vICAgICAgIGZvciBMaW51eCBoZXJlLiBUaGF0IHdpbGwgZWxpbWluYXRlIGZhdGFsIGVycm9ycyBsb2FkaW5nIG5ldworICAgIC8vICAgICAgIGRyaXZlcnMgb24gTGludXghCisgICAgcmV0dXJuICZfUE1faW1wb3J0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICAodm9pZClzaGFyZWQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIFRFU1RfSEFSTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgICAgIHZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOworICAgICAgICB2YWx1ZS0+aGlnaCA9IDA7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW50ZHJ2LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIE5UIGRldmljZSBkcml2ZXIKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgTlQgZGV2aWNlIGRyaXZlcnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KK29mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQord2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCitkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCit0byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKKyAgICBjb25zdCBjaGFyICpwYXRoKQoreworICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKKworUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKK3sKKyAgICByZXR1cm4gJl9QTV9pbXBvcnRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHAsCisgICAgaWJvb2wgc2hhcmVkKQoreworICAgICh2b2lkKWdhRXhwOworICAgICh2b2lkKXNoYXJlZDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZm5kZWYgVEVTVF9IQVJORVNTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCisgICAgR0FfZGV2Q3R4ICpkYywKKyAgICBOX3VpbnQzMiBpZCwKKyAgICB2b2lkIF9GQVJfICpmdW5jcykKK3sKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAorICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKK051Y2xldXMgbG9hZGVyIGxpYnJhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKK3sKKyAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgeworICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZQorICAgICAgICBLZVF1ZXJ5U3lzdGVtVGltZSgoTEFSR0VfSU5URUdFUiopdmFsdWUpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW9zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmU5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKKyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKKyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKKyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKKyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKKyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKKyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKKyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKKyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBPUy8yIDMyLWJpdAorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgorKiAgICAgICAgICAgICAgIHRoZSBPUy8yIG9wZXJhdGluZyBzeXN0ZW0gZW52aXJvbm1lbnRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtX2hlbHAuaCIKKyNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKKyNkZWZpbmUgSU5DTF9ET1MKKyNkZWZpbmUgSU5DTF9TVUIKKyNkZWZpbmUgSU5DTF9WSU8KKyNkZWZpbmUgSU5DTF9LQkQKKyNpbmNsdWRlIDxvczIuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sICAgIGhhdmVSRFRTQyA9IGZhbHNlOworc3RhdGljIHVsb25nICAgIHBhcm1zWzNdOyAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLworc3RhdGljIHVsb25nICAgIHJlc3VsdFs0XTsgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Z1bmMgICAgICAgIC0gSGVscGVyIGRldmljZSBkcml2ZXIgZnVuY3Rpb24gdG8gY2FsbAorCitSRVRVUk5TOgorRmlyc3QgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgaW4gcGFybXNPdXRbMF0KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIG9wZW4gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCBjYWxsIGl0IGFuZCBjbG9zZSB0aGUgZmlsZQoraGFuZGxlLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBvcGVuIHRoZSBkZXZpY2UgZHJpdmVyIGZvciBldmVyeSBjYWxsIGJlY2F1c2UKK29mIHR3byBwcm9ibGVtczoKKworIDEuIFdlIGNhbm5vdCBvcGVuIGEgc2luZ2xlIGZpbGUgaGFuZGxlIGluIGEgRExMIHRoYXQgaXMgc2hhcmVkIGFtb25nc3QKKyAgICBwcm9ncmFtcywgc2luY2UgZXZlcnkgcHJvY2VzcyBtdXN0IGhhdmUgaXQncyBvd24gb3BlbiBmaWxlIGhhbmRsZS4KKworIDIuIEZvciBzb21lIHJlYXNvbiB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGltaXQgb2YgYWJvdXQgMTIgb3BlbiBmaWxlCisgICAgaGFuZGxlcyBvbiBhIGRldmljZSBkcml2ZXIgaW4gdGhlIHN5c3RlbS4gSGVuY2Ugd2hlbiB3ZSBvcGVuIG1vcmUKKyAgICB0aGFuIGFib3V0IDEyIGZpbGUgaGFuZGxlcyB0aGluZ3Mgc3RhcnQgdG8gZ28gdmVyeSBzdHJhbmdlLgorCitIZW5jZSB3ZSBzaW1wbHkgb3BlbiB0aGUgZmlsZSBoYW5kbGUgZXZlcnkgdGltZSB0aGF0IHdlIG5lZWQgdG8gY2FsbCB0aGUKK2RldmljZSBkcml2ZXIgdG8gd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIENhbGxTRERIZWxwKAorICAgIGludCBmdW5jKQoreworICAgIHN0YXRpYyB1bG9uZyAgICBpbkxlbjsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KKyAgICBzdGF0aWMgdWxvbmcgICAgb3V0TGVuOyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCisgICAgSEZJTEUgICAgICAgICAgIGhTRERIZWxwOworCisgICAgLyogSWYgdGhpcyBjb2RlIGluIGhlcmUgZmFpbHMsIHdlIGFyZSBzY3Jld2VkISBNYW55IG9mIG91ciBkcml2ZXJzCisgICAgICogdXNlIHRoaXMgY29kZSBhbmQgZG9uJ3QgaGF2ZSBhIEMgbGlicmFyeSwgc28gd2Ugc2ltcGx5IGFzc3VtZSB3ZQorICAgICAqIGNhbid0IGZhaWwgaGVyZS4KKyAgICAgKi8KKyAgICBEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0WzBdLDAsMCwKKyAgICAgICAgICAgIEZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKKyAgICAgICAgICAgIE5VTEwpOworICAgIERvc0RldklPQ3RsKGhTRERIZWxwLFBNSEVMUF9JT0NUTCxmdW5jLAorICAgICAgICAgICAgICZwYXJtcywgaW5MZW4gPSBzaXplb2YocGFybXMpLCAmaW5MZW4sCisgICAgICAgICAgICAmcmVzdWx0LCBvdXRMZW4gPSBzaXplb2YocmVzdWx0KSwgJm91dExlbik7CisgICAgRG9zQ2xvc2UoaFNEREhlbHApOworICAgIHJldHVybiByZXN1bHRbMF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgorb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCit3aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKK2RpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKK3RvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAorICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQorCitSRU1BUktTOgorRm9yIE9TLzIgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGJlY2F1c2UgTnVjbGV1cyBpcyBhbHdheXMKK2xvYWRlZCB2aWEgdGhlIHNoYXJlZCBTRERQTUkgZHJpdmVyIHdoZW4gU0REIGlzIGxvYWRlZCBzbyB3ZSBkb24ndCBuZWVkCithIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cyBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKK3sKKyAgICByZXR1cm4gJl9QTV9pbXBvcnRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2dhRXhwICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zCitzaGFyZWQgIC0gVHJ1ZSBpZiBjb25uZWN0aW5nIHRvIHRoZSBzaGFyZWQsIGdsb2JhbCBOdWNsZXVzIGRyaXZlcgorCitSRU1BUktTOgorRm9yIE9TLzIgaWYgU0REIGlzIGxvYWRlZCB3ZSAqYWx3YXlzKiBjb25uZWN0IHRvIHRoZSBzaGFyZWQgTnVjbGV1cyBmdW5jdGlvbnMKK2NvbnRhaW5lZCB3aXRoaW4gdGhlIFNERFBNSSBkcml2ZXIuIFRoaXMgYWxsb3dzIHRoZSBOdWNsZXVzIGZ1bmN0aW9ucyBjb250YWluZWQKK3dpdGhpbiB0aGlzIGRyaXZlciB0byBiZSB1dGlsaXNlZCBieSBhbGwgTnVjbGV1cyBhcHBzIGluIHRoZSBzeXN0ZW0gYW5kCittYWludGFpbnMgYSBjb25zaXN0ZW50IHN0YXRlIGJldHdlZW4gdmVyc2lvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAvKiBJbiB0ZXN0IGhhcm5lc3MgbW9kZSwgd2UgbmVlZCB0byBsb2FkIGEgbG9jYWwgY29weSBvZiBOdWNsZXVzICovCisjaWYgIWRlZmluZWQgKFRFU1RfSEFSTkVTUykgfHwgZGVmaW5lZCAoREVCVUdfU0REUE1JKQorICAgIEhNT0RVTEUgICAgIGhNb2RTRERQTUk7CisgICAgY2hhciAgICAgICAgYnVmWzgwXTsKKyAgICBHQV9leHBvcnRzICAqZXhwOworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeSBhbmQgY29ubmVjdCB0byBvdXIgcnVudGltZSBETEwncyAqLworICAgIFBNX2luaXQoKTsKKyAgICBpZiAoQ2FsbFNEREhlbHAoUE1IRUxQX0dFVFNIQVJFREVYUCkgIT0gMCkgeworICAgICAgICAvKiBXZSBoYXZlIGZvdW5kIHRoZSBzaGFyZWQgTnVjbGV1cyBleHBvcnRzLiBCZWNhdXNlIG5vdCBhbGwgcHJvY2Vzc2VzCisgICAgICAgICAqIG1hcCB0byBTRERQTUkuRExMLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGNvbm5lY3QgdG8gdGhpcworICAgICAgICAgKiBETEwgc28gdGhhdCBpdCBnZXRzIG1hcHBlZCBpbnRvIG91ciBhZGRyZXNzIHNwYWNlICh0aGF0IGlzCisgICAgICAgICAqIHdoZXJlIHRoZSBzaGFyZWQgTnVjbGV1cyBsb2FkZXIgY29kZSBpcyBsb2NhdGVkKS4gU2ltcGx5IGRvaW5nIGEKKyAgICAgICAgICogRG9zTG9hZE1vZHVsZSBvbiBpdCBpcyBlbm91Z2ggZm9yIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKKyAgICAgICAgZXhwID0gKEdBX2V4cG9ydHMqKXJlc3VsdFswXTsKKyAgICAgICAgbWVtY3B5KGdhRXhwLGV4cCxNSU4oZ2FFeHAtPmR3U2l6ZSxleHAtPmR3U2l6ZSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgKHZvaWQpc2hhcmVkOworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmbmRlZiBURVNUX0hBUk5FU1MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKKyAgICBHQV9kZXZDdHggKmRjLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCisgICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKKyAgICBOX3VpbnQzMiBpZCwKKyAgICB2b2lkIF9GQVJfICpmdW5jcykKK3sKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQorTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQorICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0FfVGltZXJSZWFkKAorICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCit7CisgICAgaWYgKGhhdmVSRFRTQykKKyAgICAgICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOworICAgIGVsc2UKKyAgICAgICAgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK09uIE9TLzIsIHdlIG5lZWQgc3BlY2lhbCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgaWYgd2UgYnVpbGQgU0REUE1JIGluCit0ZXN0IGhhcm5lc3MgbW9kZS4gQnV0IGlmIHdlIGJ1aWxkIEdBVGVzdCBldGMuIGluIHRlc3QgbW9kZSwgd2Ugd2FudCB0byB1c2UKK3RoZSBub3JtYWwgQyBydW50aW1lIGZ1bmN0aW9ucywgc28gcm91dGUgdGhlbSBiYWNrIGhlcmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCAoVEVTVF9IQVJORVNTKSAmJiAhZGVmaW5lZCAoREVCVUdfU0REUE1JKQorCisvKiBVbmRlZmluZSB0aGVzZSBtYWNyb3MgZmlyc3Qgb3Igd2UnbGwgcmVjdXJzZSB0byBoZWxsISAqLworI3VuZGVmIG1hbGxvYworI3VuZGVmIGNhbGxvYworI3VuZGVmIHJlYWxsb2MKKyN1bmRlZiBmcmVlCisKK3ZvaWQgKlNERFBNSV9tYWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCit2b2lkICpTRERQTUlfY2FsbG9jKHNpemVfdCBudW0sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIGNhbGxvYyhudW0sIHNpemUpOworfQorCit2b2lkIFNERFBNSV9mcmVlKHZvaWQgKnB0cikgeworICAgIGZyZWUocHRyKTsKK30KKwordm9pZCAqU0REUE1JX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiByZWFsbG9jKHB0ciwgc2l6ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FxbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQ2Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcW54LmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUU5YCisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIFFOWCBvcGVyYXRpbmcgc3lzdGVtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KK29mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQord2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCitkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCit0byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKKyAgICBjb25zdCBjaGFyICpwYXRoKQoreworICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKKworUkVNQVJLUzoKK0luIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCitQTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCitvZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKK3RoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KK2xpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCit7CisgICAgLy8gVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkKKyAgICAvLyAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkKKyAgICAvLyAgICAgICBmb3IgUU5YIGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3CisgICAgLy8gICAgICAgZHJpdmVycyBvbiBRTlghCisgICAgcmV0dXJuICZfUE1faW1wb3J0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICAodm9pZClzaGFyZWQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIFRFU1RfSEFSTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOworICAgICAgICB2YWx1ZS0+bG93ID0gKHRzLnR2X25zZWMgLyAxMDAwICsgdHMudHZfc2VjICogMTAwMDAwMCk7CisgICAgICAgIHZhbHVlLT5oaWdoID0gMDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcnR0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FydHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDNlMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcnR0LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8CisqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8CisqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8CisqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8CisqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8CisqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8CisqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8CisqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8CisqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKKyogICAgICAgICAgICAgICB0aGUgUlRUYXJnZXQtMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgorb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCit3aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKK2RpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKK3RvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAorICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQorCitSRU1BUktTOgorSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKK1BNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KK29mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAordGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQorbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKK3sKKyAgICByZXR1cm4gJl9QTV9pbXBvcnRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCisgICAgR0FfZXhwb3J0cyAqZ2FFeHAsCisgICAgaWJvb2wgc2hhcmVkKQoreworICAgICh2b2lkKWdhRXhwOworICAgICh2b2lkKXNoYXJlZDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZm5kZWYgVEVTVF9IQVJORVNTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCisgICAgR0FfZGV2Q3R4ICpkYywKKyAgICBOX3VpbnQzMiBpZCwKKyAgICB2b2lkIF9GQVJfICpmdW5jcykKK3sKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAorICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKK051Y2xldXMgbG9hZGVyIGxpYnJhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKK3sKKyAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgeworICAgICAgICBoYXZlUkRUU0MgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIGlmIChoYXZlUkRUU0MpCisgICAgICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXNteC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhc214LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlNjhkYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXNteC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIHNteDMyCisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIHNteDMyIHBsYXRmb3JtIC0tIG5vIHZ4RCBzdXBwb3J0LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KK29mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQord2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCitkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCit0byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKKyAgICBjb25zdCBjaGFyICpwYXRoKQoreworICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKKworUkVNQVJLUzoKK0luIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCitQTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCitvZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKK3RoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KK2xpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCit7CisgICAgcmV0dXJuICZfUE1faW1wb3J0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICAodm9pZClnYUV4cDsKKyAgICAodm9pZClzaGFyZWQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIFRFU1RfSEFSTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXZ4ZC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhdnhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxNzNjYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXZ4ZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFdpbjMyIFZ4RAorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgorKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBWeEQncy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgorb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCit3aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKK2RpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKK3RvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAorICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQorCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQoreworICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKKyAgICBHQV9leHBvcnRzICpnYUV4cCwKKyAgICBpYm9vbCBzaGFyZWQpCit7CisgICAgKHZvaWQpZ2FFeHA7CisgICAgKHZvaWQpc2hhcmVkOworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmbmRlZiBURVNUX0hBUk5FU1MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKKyAgICBHQV9kZXZDdHggKmRjLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCisgICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKKyAgICBOX3VpbnQzMiBpZCwKKyAgICB2b2lkIF9GQVJfICpmdW5jcykKK3sKKyAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQorTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQoreworICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7CisgICAgICAgIGhhdmVSRFRTQyA9IHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKKyAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQoreworICAgIGlmIChoYXZlUkRUU0MpCisgICAgICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ2YWx1ZS0+aGlnaCwmdmFsdWUtPmxvdyk7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXdpbjMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTQxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAorKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAorKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAorKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAorKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAorKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAorKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAorKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAorKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFdpbjMyCisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCisqICAgICAgICAgICAgICAgdGhlIFdpbjMyIG9wZXJhdGluZyBzeXN0ZW0gZW52aXJvbm1lbnRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtX2hlbHAuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZGVmaW5lIFNUUklDVAorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIERMTF9OQU1FICAgICAgICAibmdhX3czMi5kbGwiCisKK2V4dGVybiBIQU5ETEUgICAgICAgICAgIF9QTV9oRGV2aWNlOworc3RhdGljIEhNT0RVTEUgICAgICAgICAgaE1vZERMTCA9IE5VTEw7CitzdGF0aWMgaWJvb2wgICAgICAgICAgICB1c2VSaW5nMERyaXZlciA9IGZhbHNlOworc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOworc3RhdGljIEdBX2xhcmdlSW50ZWdlciAgY291bnRGcmVxOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvYWRzIHRoZSBzaGFyZWQgIm5nYV93MzIuZGxsIiBsaWJyYXJ5IGZyb20gZGlzayBhbmQgY29ubmVjdHMgdG8gaXQuIFRoaXMKK2xpYnJhcnkgaXMgKmFsd2F5cyogbG9jYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIE51Y2xldXMKK2dyYXBoaWNzLmJwZCBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBMb2FkU2hhcmVkRExMKHZvaWQpCit7CisgICAgY2hhciAgICAgICAgICAgICAgICBmaWxlbmFtZVtQTV9NQVhfUEFUSF07CisgICAgY2hhciAgICAgICAgICAgICAgICBicGRwYXRoW1BNX01BWF9QQVRIXTsKKworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIERMTCAqLworICAgIGlmIChoTW9kRExMKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBQTV9pbml0KCk7CisKKyAgICAvKiBPcGVuIHRoZSBETEwgZmlsZSAqLworICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKKyAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOworICAgIGlmICgoaE1vZERMTCA9IExvYWRMaWJyYXJ5KGZpbGVuYW1lKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KK29mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQord2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCitkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCit0byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK05vdGUgdGhhdCBmb3IgV2luMzIgd2UgYWxzbyBjYWxsIGludG8gdGhlIGxvYWRlZCBQTUhFTFAgZGV2aWNlIGRyaXZlcgorYXMgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgbG9jYWwgTnVjbGV1cyBwYXRoIGZvciBzeXN0ZW0gd2lkZSBOdWNsZXVzCitkcml2ZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCisgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBEV09SRCAgIGluQnVmWzFdOworICAgIERXT1JEICAgb3V0QnVmWzFdLG91dENudDsKKworICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKKyAgICBpZiAoX1BNX2hEZXZpY2UgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgaW5CdWZbMF0gPSAoRFdPUkQpcGF0aDsKKyAgICAgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTRVRMT0NBTFBBVEgzMiwKKyAgICAgICAgICAgIGluQnVmLCBzaXplb2YoaW5CdWYpLCBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmb3V0Q250LCBOVUxMKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQorCitSRU1BUktTOgorSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKK1BNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KK29mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAordGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQorbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKK3sKKyAgICBQTV9pbXBvcnRzICogcG1JbXA7CisgICAgUE1faW1wb3J0cyAqIChOQVBJUCBfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKSh2b2lkKTsKKworICAgIGlmIChMb2FkU2hhcmVkRExMKCkpIHsKKyAgICAgICAgLyogTm90ZSB0aGF0IFZpc3VhbCBDKysgYnVpbGQgRExMJ3Mgd2l0aCBvbmx5IGEgc2luZ2xlIHVuZGVyc2NvcmUgaW4gZnJvbnQKKyAgICAgICAgICogb2YgdGhlIGV4cG9ydGVkIG5hbWUgd2hpbGUgV2F0Y29tIEMgcHJvdmlkZXMgdHdvIG9mIHRoZW0uIFdlIGNoZWNrIGZvcgorICAgICAgICAgKiBib3RoIHRvIGFsbG93IHdvcmtpbmcgd2l0aCBlaXRoZXIgY29tcGlsZWQgRExMLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9HQV9nZXRTeXN0ZW1QTUltcG9ydHMiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKChfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfZ2V0U3lzdGVtUE1JbXBvcnRzIikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwbUltcCA9IF9HQV9nZXRTeXN0ZW1QTUltcG9ydHMoKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJl9QTV9pbXBvcnRzLHBtSW1wLE1JTihfUE1faW1wb3J0cy5kd1NpemUscG1JbXAtPmR3U2l6ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBwbUltcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gJl9QTV9pbXBvcnRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2dhRXhwICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zCitzaGFyZWQgIC0gVHJ1ZSBpZiBjb25uZWN0aW5nIHRvIHRoZSBzaGFyZWQsIGdsb2JhbCBOdWNsZXVzIGRyaXZlcgorCitSRU1BUktTOgorRm9yIFdpbjMyIGlmIHdlIGFyZSBjb25uZWN0aW5nIHRvIHRoZSBzaGFyZWQsIGdsb2JhbCBOdWNsZXVzIGRyaXZlciAobG9hZGVkCithdCByaW5nIDApIHRoZW4gd2UgbmVlZCB0byBsb2FkIGEgc3BlY2lhbCBuZ2FfdzMyLmRsbCBsaWJyYXJ5IHdoaWNoIGNvbnRhaW5zCit0aHVua3MgdG8gY2FsbCBkb3duIGludG8gdGhlIFJpbmcgMCBkZXZpY2UgZHJpdmVyIGFzIG5lY2Vzc2FyeS4gSWYgd2UgYXJlCitjb25uZWN0aW5nIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCBOdWNsZXVzIGRyaXZlcnMgKGllOiBOdWNsZXVzIG9uIERpcmVjdERyYXcKK2VtdWxhdGlvbiBsYXllcikgdGhlbiB3ZSBkbyBub3RoaW5nIGhlcmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAorICAgIEdBX2V4cG9ydHMgKmdhRXhwLAorICAgIGlib29sIHNoYXJlZCkKK3sKKyAgICBHQV9leHBvcnRzICogZXhwOworICAgIEdBX2V4cG9ydHMgKiAoTkFQSVAgX0dBX2dldFN5c3RlbUdBRXhwb3J0cykodm9pZCk7CisKKyAgICB1c2VSaW5nMERyaXZlciA9IGZhbHNlOworICAgIGlmIChzaGFyZWQpIHsKKyAgICAgICAgaWYgKCFMb2FkU2hhcmVkRExMKCkpCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbG9hZCAiIERMTF9OQU1FICIhIik7CisgICAgICAgIGlmICgoX0dBX2dldFN5c3RlbUdBRXhwb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzIikpID09IE5VTEwpCisgICAgICAgICAgICBpZiAoKF9HQV9nZXRTeXN0ZW1HQUV4cG9ydHMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX19HQV9nZXRTeXN0ZW1HQUV4cG9ydHMiKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbG9hZCAiIERMTF9OQU1FICIhIik7CisgICAgICAgIGV4cCA9IF9HQV9nZXRTeXN0ZW1HQUV4cG9ydHMoKTsKKyAgICAgICAgbWVtY3B5KGdhRXhwLGV4cCxNSU4oZ2FFeHAtPmR3U2l6ZSxleHAtPmR3U2l6ZSkpOworICAgICAgICB1c2VSaW5nMERyaXZlciA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIFRFU1RfSEFSTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOb3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAorICAgIEdBX2RldkN0eCAqZGMsCisgICAgTl91aW50MzIgaWQsCisgICAgdm9pZCBfRkFSXyAqZnVuY3MpCit7CisgICAgc3RhdGljIGlib29sIChOQVBJUCBfR0FfcXVlcnlGdW5jdGlvbnMpKEdBX2RldkN0eCAqZGMsTl91aW50MzIgaWQsdm9pZCBfRkFSXyAqZnVuY3MpID0gTlVMTDsKKworICAgIGlmICh1c2VSaW5nMERyaXZlcikgeworICAgICAgICAvLyBDYWxsIHRoZSB2ZXJzaW9uIGluIG5nYV93MzIuZGxsIGlmIGl0IGlzIGxvYWRlZAorICAgICAgICBpZiAoIV9HQV9xdWVyeUZ1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKChfR0FfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX0dBX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKChfR0FfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX19HQV9xdWVyeUZ1bmN0aW9ucyIpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IGV4cG9ydHMgZnJvbSAiIERMTF9OQU1FICIhIik7CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBfR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOworICAgICAgICB9CisgICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKKyAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAorICAgIE5fdWludDMyIGlkLAorICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQoreworICAgIHN0YXRpYyBpYm9vbCAoTkFQSVAgX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zKShSRUYyRF9kcml2ZXIgKnJlZjJkLE5fdWludDMyIGlkLHZvaWQgX0ZBUl8gKmZ1bmNzKSA9IE5VTEw7CisKKyAgICBpZiAodXNlUmluZzBEcml2ZXIpIHsKKyAgICAgICAgLy8gQ2FsbCB0aGUgdmVyc2lvbiBpbiBuZ2FfdzMyLmRsbCBpZiBpdCBpcyBsb2FkZWQKKyAgICAgICAgaWYgKCFfUkVGMkRfcXVlcnlGdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICgoX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9SRUYyRF9xdWVyeUZ1bmN0aW9ucyIpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmICgoX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fUkVGMkRfcXVlcnlGdW5jdGlvbnMiKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGdldCBleHBvcnRzIGZyb20gIiBETExfTkFNRSAiISIpOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKKyAgICAgICAgfQorICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCitOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCit7CisgICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKKyAgICAgICAgaGF2ZVJEVFNDID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKikmY291bnRGcmVxKSkgeworICAgICAgICBoYXZlUkRUU0MgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCisgICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKK3sKKyAgICBpZiAoaGF2ZVJEVFNDKQorICAgICAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7CisgICAgZWxzZQorICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdmFsdWUpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ3RmY2FsYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAzYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgVkVTQSBHZW5lcmFsaXplZCBUaW1pbmcgRm9ybXVsYSAoR1RGKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogRGV2ZWxvcGVkIGJ5OiBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55LgorKgorKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciBnZW5lcmF0aW5nIEdURiBjb21wYXRpYmxlIHRpbWluZ3MgZ2l2ZW4gYSBzZXQKKyogICAgICAgICAgICAgICBvZiBpbnB1dCByZXF1aXJlbWVudHMuIFRyYW5zbGF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgR1RGCisqICAgICAgICAgICAgICAgMS4xNCBzcHJlYWRzaGVldCBkZWZpbml0aW9uLgorKgorKiAgICAgICAgICAgICAgIENvbXBpbGUgd2l0aCAjZGVmaW5lIFRFU1RJTkcgdG8gYnVpbGQgYSBjb21tYW5kIGxpbmUgdGVzdAorKiAgICAgICAgICAgICAgIHByb2dyYW0uCisqCisqICAgICAgICAgICAgICAgTk9URTogVGhlIGNvZGUgaW4gaGVyZSBoYXMgYmVlbiB3cml0dGVuIGZvciBjbGFyaXR5IGFuZAorKiAgICAgICAgICAgICAgICAgICAgIHRvIGZvbGxvdyB0aGUgb3JpZ2luYWwgR1RGIHNwZWMgYXMgY2xvc2VseSBhcworKiAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImd0Zi5oIgorI2lmbmRlZiBfX1dJTjMyX1ZYRF9fCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgR1RGX2NvbnN0YW50cyBHQyA9IHsKKyAgICAxLjgsICAgICAgICAgICAgICAgICAgICAvKiBNYXJnaW4gc2l6ZSBhcyBwZXJjZW50YWdlIG9mIGRpc3BsYXkgICAgICovCisgICAgOCwgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGNlbGwgZ3JhbnVsYXJpdHkgICAgICAgICAgICAgICAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgIC8qIE1pbmltdW0gZnJvbnQgcG9yY2ggaW4gbGluZXMvY2hhcnMgICAgICAgKi8KKyAgICAzLCAgICAgICAgICAgICAgICAgICAgICAvKiBXaWR0aCBvZiBWIHN5bmMgaW4gbGluZXMgICAgICAgICAgICAgICAgICovCisgICAgOCwgICAgICAgICAgICAgICAgICAgICAgLyogV2lkdGggb2YgSCBzeW5jIGFzIHBlcmNlbnQgb2YgdG90YWwgICAgICAqLworICAgIDU1MCwgICAgICAgICAgICAgICAgICAgIC8qIE1pbmltdW0gdmVydGljYWwgc3luYyArIGJhY2sgcG9yY2ggKHVzKSAgKi8KKyAgICA2MDAsICAgICAgICAgICAgICAgICAgICAvKiBCbGFua2luZyBmb3JtdWxhIGdyYWRpZW50ICAgICAgICAgICAgICAgICovCisgICAgNDAsICAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBvZmZzZXQgICAgICAgICAgICAgICAgICAqLworICAgIDEyOCwgICAgICAgICAgICAgICAgICAgIC8qIEJsYW5raW5nIGZvcm11bGEgc2NhbGluZyBmYWN0b3IgICAgICAgICAgKi8KKyAgICAyMCwgICAgICAgICAgICAgICAgICAgICAvKiBCbGFua2luZyBmb3JtdWxhIHNjYWxpbmcgZmFjdG9yIHdlaWdodCAgICovCisgICAgfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fV0lOMzJfVlhEX18KKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhIFZ4RCwgc28gd2Ugc3R1YiB0aGVtIG91dCBzbyB0aGlzCisgKiBtb2R1bGUgd2lsbCBhdCBsZWFzdCBjb21waWxlLiBDYWxsaW5nIHRoZSBmdW5jdGlvbnMgaW4gaGVyZSB3aWxsIGRvCisgKiBzb21ldGhpbmcgd2llcmQhCisgKi8KK2RvdWJsZSBzcXJ0KGRvdWJsZSB4KQoreyByZXR1cm4geDsgfQorCitkb3VibGUgZmxvb3IoZG91YmxlIHgpCit7IHJldHVybiB4OyB9CisKK2RvdWJsZSBwb3coZG91YmxlIHgsZG91YmxlIHkpCit7IHJldHVybiB4Knk7IH0KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlIHJvdW5kKGRvdWJsZSB2KQoreworICAgIHJldHVybiBmbG9vcih2ICsgMC41KTsKK30KKworc3RhdGljIHZvaWQgR2V0SW50ZXJuYWxDb25zdGFudHMoR1RGX2NvbnN0YW50cyAqYykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgR2V0SW50ZXJuYWxDb25zdGFudHMKKyogUGFyYW1ldGVyczogICBjICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgaW50ZXJuYWwgY29uc3RhbnRzCisqCisqIERlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyB0aGUgcm91bmRlZCwgaW50ZXJuYWwgc2V0IG9mIEdURiBjb25zdGFudHMuCisqICAgICAgICAgICAgICAgVGhlc2UgY29uc3RhbnRzIGFyZSBkaWZmZXJlbnQgdG8gdGhlIHJlYWwgR1RGIGNvbnN0YW50cworKiAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIHNldCB1cCBmb3IgdGhlIG1vbml0b3IuIFRoZSBjYWxjdWxhdGlvbnMgdG8KKyogICAgICAgICAgICAgICBnZXQgdGhlc2UgcmVhbCBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlICdXb3JrIEFyZWEnCisqICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgRXhjZWwgc3ByZWFkc2hlZXQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIGMtPm1hcmdpbiA9IEdDLm1hcmdpbjsKKyAgICBjLT5jZWxsR3JhbiA9IHJvdW5kKEdDLmNlbGxHcmFuKTsKKyAgICBjLT5taW5Qb3JjaCA9IHJvdW5kKEdDLm1pblBvcmNoKTsKKyAgICBjLT52U3luY1JxZCA9IHJvdW5kKEdDLnZTeW5jUnFkKTsKKyAgICBjLT5oU3luYyA9IEdDLmhTeW5jOworICAgIGMtPm1pblZTeW5jQlAgPSBHQy5taW5WU3luY0JQOworICAgIGlmIChHQy5rID09IDApCisgICAgICAgIGMtPmsgPSAwLjAwMTsKKyAgICBlbHNlCisgICAgICAgIGMtPmsgPSBHQy5rOworICAgIGMtPm0gPSAoYy0+ayAvIDI1NikgKiBHQy5tOworICAgIGMtPmMgPSAoR0MuYyAtIEdDLmopICogKGMtPmsgLyAyNTYpICsgR0MuajsKKyAgICBjLT5qID0gR0MuajsKK30KKwordm9pZCBHVEZfY2FsY1RpbWluZ3MoZG91YmxlIGhQaXhlbHMsZG91YmxlIHZMaW5lcyxkb3VibGUgZnJlcSwKKyAgICBpbnQgdHlwZSxpYm9vbCB3YW50TWFyZ2lucyxpYm9vbCB3YW50SW50ZXJsYWNlLEdURl90aW1pbmdzICp0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBHVEZfY2FsY1RpbWluZ3MKKyogUGFyYW1ldGVyczogICBoUGl4ZWxzICAgICAtIFggcmVzb2x1dGlvbgorKiAgICAgICAgICAgICAgIHZMaW5lcyAgICAgIC0gWSByZXNvbHV0aW9uCisqICAgICAgICAgICAgICAgZnJlcSAgICAgICAgLSBGcmVxdWVuY3kgKEh6LCBLSHogb3IgTUh6IGRlcGVuZGluZyBvbiB0eXBlKQorKiAgICAgICAgICAgICAgIHR5cGUgICAgICAgIC0gMSAtIHZlcnRpY2FsLCAyIC0gaG9yaXpvbnRhbCwgMyAtIGRvdCBjbG9jaworKiAgICAgICAgICAgICAgIG1hcmdpbnMgICAgIC0gVHJ1ZSBpZiBtYXJnaW5zIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyogICAgICAgICAgICAgICBpbnRlcmxhY2UgICAtIFRydWUgaWYgaW50ZXJsYWNlZCB0aW1pbmdzIHRvIGJlIGdlbmVyYXRlZAorKiAgICAgICAgICAgICAgIHQgICAgICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB0aW1pbmdzCisqCisqIERlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBhIHNldCBvZiBHVEYgdGltaW5nIHBhcmFtZXRlcnMgZ2l2ZW4gYSBzcGVjaWZpZWQKKyogICAgICAgICAgICAgICByZXNvbHV0aW9uIGFuZCB2ZXJ0aWNhbCBmcmVxdWVuY3kuIFRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeQorKiAgICAgICAgICAgICAgIGFuZCBkb3QgY2xvY2sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGlzCisqICAgICAgICAgICAgICAgcm91dGluZXMuCisqCisqICAgICAgICAgICAgICAgRm9yIGludGVybGFjZWQgbW9kZXMgdGhlIENSVEMgcGFyYW1ldGVycyBhcmUgY2FsY3VsYXRlZCBmb3IKKyogICAgICAgICAgICAgICBhIHNpbmdsZSBmaWVsZCwgc28gd2lsbCBiZSBoYWxmIHdoYXQgd291bGQgYmUgdXNlZCBpbgorKiAgICAgICAgICAgICAgIGEgbm9uLWludGVybGFjZWQgbW9kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgZG91YmxlICAgICAgICAgIGludGVybGFjZSx2RmllbGRSYXRlLGhQZXJpb2Q7CisgICAgZG91YmxlICAgICAgICAgIHRvcE1hcmdpbkxpbmVzLGJvdE1hcmdpbkxpbmVzOworICAgIGRvdWJsZSAgICAgICAgICBsZWZ0TWFyZ2luUGl4ZWxzLHJpZ2h0TWFyZ2luUGl4ZWxzOworICAgIGRvdWJsZSAgICAgICAgICBoUGVyaW9kRXN0LHZTeW5jQlAsdkJhY2tQb3JjaDsKKyAgICBkb3VibGUgICAgICAgICAgdlRvdGFsTGluZXMsdkZpZWxkUmF0ZUVzdDsKKyAgICBkb3VibGUgICAgICAgICAgaFRvdGFsUGl4ZWxzLGhUb3RhbEFjdGl2ZVBpeGVscyxoQmxhbmtQaXhlbHM7CisgICAgZG91YmxlICAgICAgICAgIGlkZWFsRHV0eUN5Y2xlLGhTeW5jV2lkdGgsaFN5bmNCUCxoQmFja1BvcmNoOworICAgIGRvdWJsZSAgICAgICAgICBpZGVhbEhQZXJpb2Q7CisgICAgZG91YmxlICAgICAgICAgIHZGcmVxLGhGcmVxLGRvdENsb2NrOworICAgIEdURl9jb25zdGFudHMgICBjOworCisgICAgLyogR2V0IHJvdW5kZWQgR1RGIGNvbnN0YW50cyB1c2VkIGZvciBpbnRlcm5hbCBjYWxjdWxhdGlvbnMgKi8KKyAgICBHZXRJbnRlcm5hbENvbnN0YW50cygmYyk7CisKKyAgICAvKiBNb3ZlIGlucHV0IHBhcmFtZXRlcnMgaW50byBhcHByb3ByaWF0ZSB2YXJpYWJsZXMgKi8KKyAgICB2RnJlcSA9IGhGcmVxID0gZG90Q2xvY2sgPSBmcmVxOworCisgICAgLyogUm91bmQgcGl4ZWxzIHRvIGNoYXJhY3RlciBjZWxsIGdyYW51bGFyaXR5ICovCisgICAgaFBpeGVscyA9IHJvdW5kKGhQaXhlbHMgLyBjLmNlbGxHcmFuKSAqIGMuY2VsbEdyYW47CisKKyAgICAvKiBGb3IgaW50ZXJsYWNlZCBtb2RlIGhhbHZlIHRoZSB2ZXJ0aWNhbCBwYXJhbWV0ZXJzLCBhbmQgZG91YmxlCisgICAgICogdGhlIHJlcXVpcmVkIGZpZWxkIHJlZnJlc2ggcmF0ZS4KKyAgICAgKi8KKyAgICB2RmllbGRSYXRlID0gdkZyZXE7CisgICAgaW50ZXJsYWNlID0gMDsKKyAgICBpZiAod2FudEludGVybGFjZSkKKyAgICAgICAgZG90Q2xvY2sgKj0gMjsKKworICAgIC8qIERldGVybWluZSB0aGUgbGluZXMgZm9yIG1hcmdpbnMgKi8KKyAgICBpZiAod2FudE1hcmdpbnMpIHsKKyAgICAgICAgdG9wTWFyZ2luTGluZXMgPSByb3VuZChjLm1hcmdpbiAvIDEwMCAqIHZMaW5lcyk7CisgICAgICAgIGJvdE1hcmdpbkxpbmVzID0gcm91bmQoYy5tYXJnaW4gLyAxMDAgKiB2TGluZXMpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRvcE1hcmdpbkxpbmVzID0gMDsKKyAgICAgICAgYm90TWFyZ2luTGluZXMgPSAwOworICAgICAgICB9CisKKyAgICBpZiAodHlwZSAhPSBHVEZfbG9ja1BGKSB7CisgICAgICAgIGlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKKyAgICAgICAgICAgIC8qIEVzdGltYXRlIHRoZSBob3Jpem9udGFsIHBlcmlvZCAqLworICAgICAgICAgICAgaFBlcmlvZEVzdCA9ICgoMS92RmllbGRSYXRlKSAtIChjLm1pblZTeW5jQlAvMTAwMDAwMCkpIC8KKyAgICAgICAgICAgICAgICAodkxpbmVzICsgKDIqdG9wTWFyZ2luTGluZXMpICsgYy5taW5Qb3JjaCArIGludGVybGFjZSkgKiAxMDAwMDAwOworCisgICAgICAgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdlN5bmMgKyBiYWNrIHBvcmNoICovCisgICAgICAgICAgICB2U3luY0JQID0gcm91bmQoYy5taW5WU3luY0JQIC8gaFBlcmlvZEVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgeworICAgICAgICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLworICAgICAgICAgICAgdlN5bmNCUCA9IHJvdW5kKChjLm1pblZTeW5jQlAgKiBoRnJlcSkgLyAxMDAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLworICAgICAgICB2QmFja1BvcmNoID0gdlN5bmNCUCAtIGMudlN5bmNScWQ7CisKKyAgICAgICAgLyogRmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSB2ZXJ0aWNhbCBwZXJpb2QgKi8KKyAgICAgICAgdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAorICAgICAgICAgICAgKyBpbnRlcmxhY2UgKyBjLm1pblBvcmNoOworCisgICAgICAgIGlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKKyAgICAgICAgICAgIC8qIEVzdGltYXRlIHRoZSB2ZXJ0aWNhbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIHZGaWVsZFJhdGVFc3QgPSAxMDAwMDAwIC8gKGhQZXJpb2RFc3QgKiB2VG90YWxMaW5lcyk7CisKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIGFjdHVhbCBob3Jpem9udGFsIHBlcmlvZCAqLworICAgICAgICAgICAgaFBlcmlvZCA9IChoUGVyaW9kRXN0ICogdkZpZWxkUmF0ZUVzdCkgLyB2RmllbGRSYXRlOworCisgICAgICAgICAgICAvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCisgICAgICAgICAgICB2RmllbGRSYXRlID0gMTAwMDAwMCAvIChoUGVyaW9kICogdlRvdGFsTGluZXMpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIGFjdHVhbCB2ZXJ0aWNhbCBmaWVsZCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIHZGaWVsZFJhdGUgPSAoaEZyZXEgLyB2VG90YWxMaW5lcykgKiAxMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIHRoZSBsZWZ0IGFuZCByaWdodCBtYXJnaW5zICovCisgICAgaWYgKHdhbnRNYXJnaW5zKSB7CisgICAgICAgIGxlZnRNYXJnaW5QaXhlbHMgPSByb3VuZChoUGl4ZWxzICogYy5tYXJnaW4pIC8gKDEwMCAqIGMuY2VsbEdyYW4pOworICAgICAgICByaWdodE1hcmdpblBpeGVscyA9IHJvdW5kKGhQaXhlbHMgKiBjLm1hcmdpbikgLyAoMTAwICogYy5jZWxsR3Jhbik7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGVmdE1hcmdpblBpeGVscyA9IDA7CisgICAgICAgIHJpZ2h0TWFyZ2luUGl4ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgLyogRmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBwaXhlbHMgaW4gaW1hZ2UgKyBtYXJnaW5zICovCisgICAgaFRvdGFsQWN0aXZlUGl4ZWxzID0gaFBpeGVscyArIGxlZnRNYXJnaW5QaXhlbHMgKyByaWdodE1hcmdpblBpeGVsczsKKworICAgIGlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKKyAgICAgICAgLyogRmluZCB0aGUgaWRlYWwgYmxhbmtpbmcgZHV0eSBjeWNsZSAqLworICAgICAgICBpZGVhbER1dHlDeWNsZSA9IGMuYyAtICgoYy5tICogaFBlcmlvZCkgLyAxMDAwKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgeworICAgICAgICAvKiBGaW5kIHRoZSBpZGVhbCBibGFua2luZyBkdXR5IGN5Y2xlICovCisgICAgICAgIGlkZWFsRHV0eUN5Y2xlID0gYy5jIC0gKGMubSAvIGhGcmVxKTsKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tQRikgeworICAgICAgICAvKiBGaW5kIGlkZWFsIGhvcml6b250YWwgcGVyaW9kIGZyb20gYmxhbmtpbmcgZHV0eSBjeWNsZSBmb3JtdWxhICovCisgICAgICAgIGlkZWFsSFBlcmlvZCA9ICgoKGMuYyAtIDEwMCkgKyAoc3FydCgocG93KDEwMC1jLmMsMikpICsKKyAgICAgICAgICAgICgwLjQgKiBjLm0gKiAoaFRvdGFsQWN0aXZlUGl4ZWxzICsgcmlnaHRNYXJnaW5QaXhlbHMgKworICAgICAgICAgICAgbGVmdE1hcmdpblBpeGVscykgLyBkb3RDbG9jaykpKSkgLyAoMiAqIGMubSkpICogMTAwMDsKKworICAgICAgICAvKiBGaW5kIHRoZSBpZGVhbCBibGFua2luZyBkdXR5IGN5Y2xlICovCisgICAgICAgIGlkZWFsRHV0eUN5Y2xlID0gYy5jIC0gKChjLm0gKiBpZGVhbEhQZXJpb2QpIC8gMTAwMCk7CisgICAgICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYmxhbmtpbmcgdGltZSAqLworICAgIGhCbGFua1BpeGVscyA9IHJvdW5kKChoVG90YWxBY3RpdmVQaXhlbHMgKiBpZGVhbER1dHlDeWNsZSkgLworICAgICAgICAoKDEwMCAtIGlkZWFsRHV0eUN5Y2xlKSAqIGMuY2VsbEdyYW4pKSAqIGMuY2VsbEdyYW47CisKKyAgICAvKiBGaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgcGl4ZWxzICovCisgICAgaFRvdGFsUGl4ZWxzID0gaFRvdGFsQWN0aXZlUGl4ZWxzICsgaEJsYW5rUGl4ZWxzOworCisgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBiYWNrIHBvcmNoICovCisgICAgaEJhY2tQb3JjaCA9IHJvdW5kKChoQmxhbmtQaXhlbHMgLyAyKSAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKKworICAgIC8qIEZpbmQgdGhlIGhvcml6b250YWwgc3luYyB3aWR0aCAqLworICAgIGhTeW5jV2lkdGggPSByb3VuZCgoKGMuaFN5bmMvMTAwKSAqIGhUb3RhbFBpeGVscykgLyBjLmNlbGxHcmFuKSAqIGMuY2VsbEdyYW47CisKKyAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIHN5bmMgKyBiYWNrIHBvcmNoICovCisgICAgaFN5bmNCUCA9IGhCYWNrUG9yY2ggKyBoU3luY1dpZHRoOworCisgICAgaWYgKHR5cGUgPT0gR1RGX2xvY2tQRikgeworICAgICAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeSAqLworICAgICAgICBoRnJlcSA9IChkb3RDbG9jayAvIGhUb3RhbFBpeGVscykgKiAxMDAwOworCisgICAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB2U3luYyArIGJhY2sgcG9yY2ggKi8KKyAgICAgICAgdlN5bmNCUCA9IHJvdW5kKChjLm1pblZTeW5jQlAgKiBoRnJlcSkgLyAxMDAwKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLworICAgICAgICB2QmFja1BvcmNoID0gdlN5bmNCUCAtIGMudlN5bmNScWQ7CisKKyAgICAgICAgLyogRmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSB2ZXJ0aWNhbCBwZXJpb2QgKi8KKyAgICAgICAgdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAorICAgICAgICAgICAgKyBpbnRlcmxhY2UgKyBjLm1pblBvcmNoOworCisgICAgICAgIC8qIEZpbmQgdGhlIGFjdHVhbCB2ZXJ0aWNhbCBmaWVsZCBmcmVxdWVuY3kgKi8KKyAgICAgICAgdkZpZWxkUmF0ZSA9IChoRnJlcSAvIHZUb3RhbExpbmVzKSAqIDEwMDA7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gR1RGX2xvY2tWRikgeworICAgICAgICAgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIGhGcmVxID0gMTAwMCAvIGhQZXJpb2Q7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgeworICAgICAgICAgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIGhQZXJpb2QgPSAxMDAwIC8gaEZyZXE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgcGl4ZWwgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgICAgIGRvdENsb2NrID0gaFRvdGFsUGl4ZWxzIC8gaFBlcmlvZDsKKyAgICAgICAgfQorCisgICAgLyogUmV0dXJuIHRoZSBjb21wdXRlZCBmcmVxdWVuY2llcyAqLworICAgIHQtPnZGcmVxID0gdkZpZWxkUmF0ZTsKKyAgICB0LT5oRnJlcSA9IGhGcmVxOworICAgIHQtPmRvdENsb2NrID0gZG90Q2xvY2s7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCisgICAgdC0+aC5oVG90YWwgPSAoaW50KWhUb3RhbFBpeGVsczsKKyAgICB0LT5oLmhEaXNwID0gKGludCloVG90YWxBY3RpdmVQaXhlbHM7CisgICAgdC0+aC5oU3luY1N0YXJ0ID0gdC0+aC5oVG90YWwgLSAoaW50KWhTeW5jQlA7CisgICAgdC0+aC5oU3luY0VuZCA9IHQtPmguaFRvdGFsIC0gKGludCloQmFja1BvcmNoOworICAgIHQtPmguaEZyb250UG9yY2ggPSB0LT5oLmhTeW5jU3RhcnQgLSB0LT5oLmhEaXNwOworICAgIHQtPmguaFN5bmNXaWR0aCA9IChpbnQpaFN5bmNXaWR0aDsKKyAgICB0LT5oLmhCYWNrUG9yY2ggPSAoaW50KWhCYWNrUG9yY2g7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCisgICAgdC0+di52VG90YWwgPSAoaW50KXZUb3RhbExpbmVzOworICAgIHQtPnYudkRpc3AgPSAoaW50KXZMaW5lczsKKyAgICB0LT52LnZTeW5jU3RhcnQgPSB0LT52LnZUb3RhbCAtIChpbnQpdlN5bmNCUDsKKyAgICB0LT52LnZTeW5jRW5kID0gdC0+di52VG90YWwgLSAoaW50KXZCYWNrUG9yY2g7CisgICAgdC0+di52RnJvbnRQb3JjaCA9IHQtPnYudlN5bmNTdGFydCAtIHQtPnYudkRpc3A7CisgICAgdC0+di52U3luY1dpZHRoID0gKGludCljLnZTeW5jUnFkOworICAgIHQtPnYudkJhY2tQb3JjaCA9IChpbnQpdkJhY2tQb3JjaDsKKyAgICBpZiAod2FudEludGVybGFjZSkgeworICAgICAgICAvKiBIYWx2ZSB0aGUgdGltaW5ncyBmb3IgaW50ZXJsYWNlZCBtb2RlcyAqLworICAgICAgICB0LT52LnZUb3RhbCAvPSAyOworICAgICAgICB0LT52LnZEaXNwIC89IDI7CisgICAgICAgIHQtPnYudlN5bmNTdGFydCAvPSAyOworICAgICAgICB0LT52LnZTeW5jRW5kIC89IDI7CisgICAgICAgIHQtPnYudkZyb250UG9yY2ggLz0gMjsKKyAgICAgICAgdC0+di52U3luY1dpZHRoIC89IDI7CisgICAgICAgIHQtPnYudkJhY2tQb3JjaCAvPSAyOworICAgICAgICB0LT5kb3RDbG9jayAvPSAyOworICAgICAgICB9CisKKyAgICAvKiBNYXJrIGFzIEdURiB0aW1pbmcgdXNpbmcgdGhlIHN5bmMgcG9sYXJpdGllcyAqLworICAgIHQtPmludGVybGFjZSA9ICh3YW50SW50ZXJsYWNlKSA/ICdJJyA6ICdOJzsKKyAgICB0LT5oU3luY1BvbCA9ICctJzsKKyAgICB0LT52U3luY1BvbCA9ICcrJzsKK30KKwordm9pZCBHVEZfZ2V0Q29uc3RhbnRzKEdURl9jb25zdGFudHMgKmNvbnN0YW50cykKK3sgKmNvbnN0YW50cyA9IEdDOyB9CisKK3ZvaWQgR1RGX3NldENvbnN0YW50cyhHVEZfY29uc3RhbnRzICpjb25zdGFudHMpCit7IEdDID0gKmNvbnN0YW50czsgfQorCisjaWZkZWYgIFRFU1RJTkdfR1RGCisKK3ZvaWQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCit7CisgICAgRklMRSAgICAgICAgKmY7CisgICAgZG91YmxlICAgICAgeFBpeGVscyx5UGl4ZWxzLGZyZXE7CisgICAgaWJvb2wgICAgICAgaW50ZXJsYWNlOworICAgIEdURl90aW1pbmdzIHQ7CisKKyAgICBpZiAoYXJnYyAhPSA1ICYmIGFyZ2MgIT0gNikgeworICAgICAgICBwcmludGYoIlVzYWdlOiBHVEZDQUxDIDx4UGl4ZWxzPiA8eVBpeGVscz4gPGZyZXE+IFtbSHpdIFtLSHpdIFtNSHpdXSBbSV1cbiIpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50Zigid2hlcmUgPHhQaXhlbHM+IGlzIHRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gb2YgdGhlIG1vZGUsIDx5UGl4ZWxzPiBpcyB0aGVcbiIpOworICAgICAgICBwcmludGYoInZlcnRpY2FsIHJlc29sdXRpb24gb2YgdGhlIG1vZGUuIFRoZSA8ZnJlcT4gdmFsdWUgd2lsbCBiZSB0aGUgZnJlcXVlbmN5IHRvXG4iKTsKKyAgICAgICAgcHJpbnRmKCJkcml2ZSB0aGUgY2FsY3VsYXRpb25zLCBhbmQgd2lsbCBiZSBlaXRoZXIgdGhlIHZlcnRpY2FsIGZyZXF1ZW5jeSAoaW4gSHopXG4iKTsKKyAgICAgICAgcHJpbnRmKCJ0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKGluIEtIeikgb3IgdGhlIGRvdCBjbG9jayAoaW4gTUh6KS4gVG8gZ2VuZXJhdGVcbiIpOworICAgICAgICBwcmludGYoInRpbWluZ3MgZm9yIGFuIGludGVybGFjZWQgbW9kZSwgYWRkICdJJyB0byB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBwcmludGYoIkZvciBleGFtcGxlIHRvIGdlbmVyYXRlIHRpbWluZ3MgZm9yIDY0MHg0ODAgYXQgNjBIeiB2ZXJ0aWNhbDpcbiIpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCA2MCBIelxuIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJGb3IgZXhhbXBsZSB0byBnZW5lcmF0ZSB0aW1pbmdzIGZvciA2NDB4NDgwIGF0IDMxLjVLSHogaG9yaXpvbnRhbDpcbiIpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCAzMS41IEtIelxuIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJGb3IgZXhhbXBsZSB0byBnZW5lcmF0ZSB0aW1pbmdzIGZvciA2NDB4NDgwIHdpdGggYSAyNS4xNzVNaHogZG90IGNsb2NrOlxuIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgR1RGQ0FMQyA2NDAgNDgwIDI1LjE3NSBNSHpcbiIpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiR1RGQ0FMQyB3aWxsIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBmb3VuZCwgYW5kIGR1bXAgdGhlIENSVENcbiIpOworICAgICAgICBwcmludGYoInZhbHVlcyB0byB0aGUgVVZDT05GSUcuQ1JUIGZpbGUgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IFNjaVRlY2ggRGlzcGxheSBEb2N0b3IuXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgLyogR2V0IHZhbHVlcyBmcm9tIGNvbW1hbmQgbGluZSAqLworICAgIHhQaXhlbHMgPSBhdG9mKGFyZ3ZbMV0pOworICAgIHlQaXhlbHMgPSBhdG9mKGFyZ3ZbMl0pOworICAgIGZyZXEgPSBhdG9mKGFyZ3ZbM10pOworICAgIGludGVybGFjZSA9ICgoYXJnYyA9PSA2KSAmJiAoYXJndls1XVswXSA9PSAnSScpKTsKKworICAgIC8qIENvbXB1dGUgdGhlIENSVEMgdGltaW5ncyAqLworICAgIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdIJykKKyAgICAgICAgR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrVkYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKKyAgICBlbHNlIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdLJykKKyAgICAgICAgR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrSEYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKKyAgICBlbHNlIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdNJykKKyAgICAgICAgR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrUEYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIGNvbW1hbmQgbGluZSFcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAvKiBEdW1wIHN1bW1hcnkgaW5mbyB0byBzdGFuZGFyZCBvdXRwdXQgKi8KKyAgICBwcmludGYoIkNSVEMgdmFsdWVzIGZvciAlLjBmeCUuMGYgQCAlLjJmICVzXG4iLCB4UGl4ZWxzLCB5UGl4ZWxzLCBmcmVxLCBhcmd2WzRdKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgIGhUb3RhbCAgICAgID0gJS00ZCAgICB2VG90YWwgICAgICA9ICUtNGRcbiIsCisgICAgICAgIHQuaC5oVG90YWwsIHQudi52VG90YWwpOworICAgIHByaW50ZigiICBoRGlzcCAgICAgICA9ICUtNGQgICAgdkRpc3AgICAgICAgPSAlLTRkXG4iLAorICAgICAgICB0LmguaERpc3AsIHQudi52RGlzcCk7CisgICAgcHJpbnRmKCIgIGhTeW5jU3RhcnQgID0gJS00ZCAgICB2U3luY1N0YXJ0ICA9ICUtNGRcbiIsCisgICAgICAgIHQuaC5oU3luY1N0YXJ0LCB0LnYudlN5bmNTdGFydCk7CisgICAgcHJpbnRmKCIgIGhTeW5jRW5kICAgID0gJS00ZCAgICB2U3luY0VuZCAgICA9ICUtNGRcbiIsCisgICAgICAgIHQuaC5oU3luY0VuZCwgdC52LnZTeW5jRW5kKTsKKyAgICBwcmludGYoIiAgaEZyb250UG9yY2ggPSAlLTRkICAgIHZGcm9udFBvcmNoID0gJS00ZFxuIiwKKyAgICAgICAgdC5oLmhGcm9udFBvcmNoLCB0LnYudkZyb250UG9yY2gpOworICAgIHByaW50ZigiICBoU3luY1dpZHRoICA9ICUtNGQgICAgdlN5bmNXaWR0aCAgPSAlLTRkXG4iLAorICAgICAgICB0LmguaFN5bmNXaWR0aCwgdC52LnZTeW5jV2lkdGgpOworICAgIHByaW50ZigiICBoQmFja1BvcmNoICA9ICUtNGQgICAgdkJhY2tQb3JjaCAgPSAlLTRkXG4iLAorICAgICAgICB0LmguaEJhY2tQb3JjaCwgdC52LnZCYWNrUG9yY2gpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIiAgSW50ZXJsYWNlZCAgPSAlc1xuIiwgKHQuaW50ZXJsYWNlID09ICdJJykgPyAiWWVzIiA6ICJObyIpOworICAgIHByaW50ZigiICBIIHN5bmMgcG9sICA9ICVjXG4iLCB0LmhTeW5jUG9sKTsKKyAgICBwcmludGYoIiAgViBzeW5jIHBvbCAgPSAlY1xuIiwgdC52U3luY1BvbCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiICBWZXJ0IGZyZXEgICA9ICUuMmYgSHpcbiIsIHQudkZyZXEpOworICAgIHByaW50ZigiICBIb3JpeiBmcmVxICA9ICUuMmYgS0h6XG4iLCB0LmhGcmVxKTsKKyAgICBwcmludGYoIiAgRG90IENsb2NrICAgPSAlLjJmIE1oelxuIiwgICAgdC5kb3RDbG9jayk7CisKKyAgICAvKiBEdW1wIHRvIGZpbGUgaW4gZm9ybWF0IHVzZWQgYnkgU2NpVGVjaCBEaXNwbGF5IERvY3RvciAqLworICAgIGlmICgoZiA9IGZvcGVuKCJVVkNPTkZJRy5DUlQiLCJ3IikpICE9IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihmLCAiWyUuMGYgJS4wZl1cbiIsIHhQaXhlbHMsIHlQaXhlbHMpOworICAgICAgICBmcHJpbnRmKGYsICIlZCAlZCAlZCAlZCAnJWMnICVzXG4iLAorICAgICAgICAgICAgdC5oLmhUb3RhbCwgdC5oLmhEaXNwLAorICAgICAgICAgICAgdC5oLmhTeW5jU3RhcnQsIHQuaC5oU3luY0VuZCwKKyAgICAgICAgICAgIHQuaFN5bmNQb2wsICh0LmludGVybGFjZSA9PSAnSScpID8gIkkiIDogIk5JIik7CisgICAgICAgIGZwcmludGYoZiwgIiVkICVkICVkICVkICclYydcbiIsCisgICAgICAgICAgICB0LnYudlRvdGFsLCB0LnYudkRpc3AsCisgICAgICAgICAgICB0LnYudlN5bmNTdGFydCwgdC52LnZTeW5jRW5kLAorICAgICAgICAgICAgdC52U3luY1BvbCk7CisgICAgICAgIGZwcmludGYoZiwgIiUuMmZcbiIsIHQuZG90Q2xvY2spOworICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KK30KKworI2VuZGlmICAvKiBURVNUSU5HICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbGliY2ltcC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFjZDEyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYwpAQCAtMCwwICsxLDgyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTUdMIEdyYXBoaWNzIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIHRoZSBPUyBzcGVjaWZpYyBzaWRlIG9mIHRoZSBCaW5hcnkKKyogICAgICAgICAgICAgICBQb3J0YWJsZSBETEwgQyBydW50aW1lIGxpYnJhcnkuIFRoZSBmdW5jdGlvbnMgaW4gaGVyZQorKiAgICAgICAgICAgICAgIGFyZSBpbXBvcnRlZCBpbnRvIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMJ3MgdG8gaW1wbGVtZW50CisqICAgICAgICAgICAgICAgT1Mgc3BlY2lmaWMgc2VydmljZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKKyNpbmNsdWRlICJkcnZsaWIvcGVsb2FkZXIuaCIKKyNpbmNsdWRlICJkcnZsaWIvYXR0cmliLmgiCisjaW5jbHVkZSAiZHJ2bGliL2xpYmMvaW5pdC5oIgorI2RlZmluZSBfX0JVSUxESU5HX1BFX0xPQURFUl9fCisjaW5jbHVkZSAiZHJ2bGliL2xpYmMvZmlsZS5oIgorI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykKKyNpbmNsdWRlICJ2eGRmaWxlLmgiCisjZW5kaWYKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fVU5JWF9fKQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZWxzZQorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKyNpbmNsdWRlICJkcnZsaWIvYXR0cmliLmgiCisjaW5jbHVkZSAiZHJ2bGliL2xpYmMvaW5pdC5oIgorI2RlZmluZSBfX0JVSUxESU5HX1BFX0xPQURFUl9fCisjaW5jbHVkZSAiZHJ2bGliL2xpYmMvZmlsZS5oIgorI2lmIGRlZmluZWQoX19XSU5ET1dTX18pIHx8IGRlZmluZWQoVE5UKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBTVFJJQ1QKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKyNpZmRlZiAgX19NU0RPU19fCisjaW5jbHVkZSA8ZG9zLmg+CisjZW5kaWYKKyNpZmRlZiAgX19PUzJfXworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX1NVQgorI2luY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisjZW5kaWYKKworLyogTm8gdGV4dCBvciBiaW5hcnkgbW9kZXMgZm9yIFVuaXggKi8KKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAgICAwCisjZGVmaW5lIE9fVEVYVCAgICAgIDAKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisjZGVmaW5lIE1BWF9GSUxFUyAgIDE2CitzdGF0aWMgRklMRSAqb3BlbkhhbmRsZXNbTUFYX0ZJTEVTXSA9IHtOVUxMfTsKKyNlbmRpZgorCisvKiA8c3RkbGliLmg+IHN0dWIgZnVuY3Rpb25zICovCit2b2lkICAgIF9DREVDTCBzdHViX2Fib3J0KHZvaWQpOworaW50ICAgICBfQ0RFQ0wgc3R1Yl9hdGV4aXQodm9pZCAoKikodm9pZCkpOwordm9pZCAqICBfQ0RFQ0wgc3R1Yl9jYWxsb2Moc2l6ZV90IF9uZWxlbSwgc2l6ZV90IF9zaXplKTsKK3ZvaWQgICAgX0NERUNMIHN0dWJfZXhpdChpbnQgX3N0YXR1cyk7Cit2b2lkICAgIF9DREVDTCBzdHViX2ZyZWUodm9pZCAqX3B0cik7CitjaGFyICogIF9DREVDTCBzdHViX2dldGVudihjb25zdCBjaGFyICpfbmFtZSk7Cit2b2lkICogIF9DREVDTCBzdHViX21hbGxvYyhzaXplX3QgX3NpemUpOwordm9pZCAqICBfQ0RFQ0wgc3R1Yl9yZWFsbG9jKHZvaWQgKl9wdHIsIHNpemVfdCBfc2l6ZSk7CitpbnQgICAgIF9DREVDTCBzdHViX3N5c3RlbShjb25zdCBjaGFyICpfcyk7CitpbnQgICAgIF9DREVDTCBzdHViX3B1dGVudihjb25zdCBjaGFyICpfdmFsKTsKKworLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLworaW50ICAgICBfQ0RFQ0wgc3R1Yl9vcGVuKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX29mbGFnLCB1bnNpZ25lZCBfbW9kZSk7CitpbnQgICAgIF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSk7CitpbnQgICAgIF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKTsKK29mZl90ICAgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKTsKK3NpemVfdCAgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSk7CitpbnQgICAgIF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCk7CitzaXplX3QgIF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKTsKK2ludCAgICAgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKTsKKworLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCitpbnQgICAgIF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpOworaW50ICAgICBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldyk7CisKKy8qIDx0aW1lLmg+IHN0dWIgZnVuY3Rpb25zICovCit0aW1lX3QgIF9DREVDTCBzdHViX3RpbWUodGltZV90ICpfdG9kKTsKKworLyogPHNpZ25hbC5oPiBzdHViIGZ1bmN0aW9ucyAqLworaW50ICAgICBfQ0RFQ0wgc3R1Yl9yYWlzZShpbnQpOwordm9pZCAqICBfQ0RFQ0wgc3R1Yl9zaWduYWwoaW50LCB2b2lkICopOworCisvKiA8ZHJ2bGliL2F0dHJpYi5oPiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgc3R1Yl9PU19zZXRmaWxlYXR0ciAgICBfT1Nfc2V0ZmlsZWF0dHIKKyNkZWZpbmUgc3R1Yl9PU19nZXRjdXJyZW50ZGF0ZSBfT1NfZ2V0Y3VycmVudGRhdGUKKworTElCQ19pbXBvcnRzICAgIF9WQVJBUEkgX19faW1wb3J0cyA9IHsKKyAgICBzaXplb2YoTElCQ19pbXBvcnRzKSwKKworICAgIC8qIDxzdGRsaWIuaD4gZXhwb3J0cyAqLworICAgIHN0dWJfYWJvcnQsCisgICAgc3R1Yl9hdGV4aXQsCisgICAgc3R1Yl9jYWxsb2MsCisgICAgc3R1Yl9leGl0LAorICAgIHN0dWJfZnJlZSwKKyAgICBzdHViX2dldGVudiwKKyAgICBzdHViX21hbGxvYywKKyAgICBzdHViX3JlYWxsb2MsCisgICAgc3R1Yl9zeXN0ZW0sCisgICAgc3R1Yl9wdXRlbnYsCisKKyAgICAvKiA8bGliYy9maWxlLmg+IGV4cG9ydHMgKi8KKyAgICBzdHViX29wZW4sCisgICAgc3R1Yl9hY2Nlc3MsCisgICAgc3R1Yl9jbG9zZSwKKyAgICBzdHViX2xzZWVrLAorICAgIHN0dWJfcmVhZCwKKyAgICBzdHViX3VubGluaywKKyAgICBzdHViX3dyaXRlLAorICAgIHN0dWJfaXNhdHR5LAorCisgICAgLyogPHN0ZGlvLmg+IGV4cG9ydHMgKi8KKyAgICBzdHViX3JlbW92ZSwKKyAgICBzdHViX3JlbmFtZSwKKworICAgIC8qIDxzaWduYWwuaD4gZnVuY3Rpb25zICovCisgICAgc3R1Yl9yYWlzZSwKKyAgICBzdHViX3NpZ25hbCwKKworICAgIC8qIDx0aW1lLmg+IGV4cG9ydHMgKi8KKyAgICBzdHViX3RpbWUsCisKKyAgICAvKiA8ZHJ2bGliL2F0dHJpYi5oPiBleHBvcnRzICovCisgICAgc3R1Yl9PU19zZXRmaWxlYXR0ciwKKyAgICBzdHViX09TX2dldGN1cnJlbnRkYXRlLAorICAgIH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdHViIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIDxzdGRsaWIuaD4gc3R1YiBmdW5jdGlvbnMgKi8KK3ZvaWQgX0NERUNMIHN0dWJfYWJvcnQodm9pZCkKK3sKKyNpZiAhZGVmaW5lZCggX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKK2ludCBfQ0RFQ0wgc3R1Yl9hdGV4aXQodm9pZCAoKmZ1bmMpKHZvaWQpKQoreworI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQorICAgIHJldHVybiBhdGV4aXQoKHZvaWQoKikodm9pZCkpZnVuYyk7CisjZWxzZQorICAgIHJldHVybiAtMTsKKyNlbmRpZgorfQorCit2b2lkICogX0NERUNMIHN0dWJfY2FsbG9jKHNpemVfdCBfbmVsZW0sIHNpemVfdCBfc2l6ZSkKK3sgcmV0dXJuIF9fUE1fY2FsbG9jKF9uZWxlbSxfc2l6ZSk7IH0KKwordm9pZCBfQ0RFQ0wgc3R1Yl9leGl0KGludCBfc3RhdHVzKQoreworI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQorICAgIGV4aXQoX3N0YXR1cyk7CisjZW5kaWYKK30KKwordm9pZCBfQ0RFQ0wgc3R1Yl9mcmVlKHZvaWQgKl9wdHIpCit7IF9fUE1fZnJlZShfcHRyKTsgfQorCitjaGFyICogX0NERUNMIHN0dWJfZ2V0ZW52KGNvbnN0IGNoYXIgKl9uYW1lKQoreworI2lmIGRlZmluZWQoIF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgcmV0dXJuIGdldGVudihfbmFtZSk7CisjZW5kaWYKK30KKwordm9pZCAqIF9DREVDTCBzdHViX21hbGxvYyhzaXplX3QgX3NpemUpCit7IHJldHVybiBfX1BNX21hbGxvYyhfc2l6ZSk7IH0KKwordm9pZCAqIF9DREVDTCBzdHViX3JlYWxsb2Modm9pZCAqX3B0ciwgc2l6ZV90IF9zaXplKQoreyByZXR1cm4gX19QTV9yZWFsbG9jKF9wdHIsX3NpemUpOyB9CisKK2ludCBfQ0RFQ0wgc3R1Yl9zeXN0ZW0oY29uc3QgY2hhciAqX3MpCit7CisjaWYgZGVmaW5lZChfX1dJTkRPV1NfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKKyAgICAodm9pZClfczsKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIHJldHVybiBzeXN0ZW0oX3MpOworI2VuZGlmCit9CisKK2ludCBfQ0RFQ0wgc3R1Yl9wdXRlbnYoY29uc3QgY2hhciAqX3ZhbCkKK3sKKyNpZiBkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICByZXR1cm4gcHV0ZW52KChjaGFyKilfdmFsKTsKKyNlbmRpZgorfQorCit0aW1lX3QgX0NERUNMIHN0dWJfdGltZSh0aW1lX3QgKl90b2QpCit7CisjaWYgZGVmaW5lZCggX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorICAgIHJldHVybiAwOworI2Vsc2UKKyAgICByZXR1cm4gdGltZShfdG9kKTsKKyNlbmRpZgorfQorCisjaWYgICAgIGRlZmluZWQoX19NU0RPU19fKQorCisjaWYgZGVmaW5lZChUTlQpICYmIGRlZmluZWQoX01TQ19WRVIpCisKK3ZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCit7IFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgKERXT1JEKWF0dHJpYik7IH0KKworI2Vsc2UKKwordm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKK3sgX2Rvc19zZXRmaWxlYXR0cihmaWxlbmFtZSxhdHRyaWIpOyB9CisKKyNlbmRpZgorCisjZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKKworI2RlZmluZSBVU0VfTE9DQUxfRklMRUlPCisjZGVmaW5lIFVTRV9MT0NBTF9HRVREQVRFCisKKy8qIDxsaWJjL2ZpbGUuaD4gc3R1YiBmdW5jdGlvbnMgKi8KK2ludCBfQ0RFQ0wgc3R1Yl9vcGVuKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX29mbGFnLCB1bnNpZ25lZCBfbW9kZSkKK3sKKyAgICBjaGFyICAgIG1vZGVbMTBdOworICAgIGludCAgICAgaTsKKworICAgIC8qIEZpbmQgYW4gZW1wdHkgZmlsZSBoYW5kbGUgdG8gdXNlICovCisgICAgZm9yIChpID0gMzsgaSA8IE1BWF9GSUxFUzsgaSsrKSB7CisgICAgICAgIGlmICghb3BlbkhhbmRsZXNbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmIChvcGVuSGFuZGxlc1tpXSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogRmluZCB0aGUgb3BlbiBmbGFncyB0byB1c2UgKi8KKyAgICBpZiAoX29mbGFnICYgX19fT19UUlVOQykKKyAgICAgICAgc3RyY3B5KG1vZGUsInciKTsKKyAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX0NSRUFUKQorICAgICAgICBzdHJjcHkobW9kZSwiYSIpOworICAgIGVsc2UKKyAgICAgICAgc3RyY3B5KG1vZGUsInIiKTsKKyAgICBpZiAoX29mbGFnICYgX19fT19CSU5BUlkpCisgICAgICAgIHN0cmNhdChtb2RlLCJiIik7CisgICAgaWYgKF9vZmxhZyAmIF9fX09fVEVYVCkKKyAgICAgICAgc3RyY2F0KG1vZGUsInQiKTsKKworICAgIC8qIE9wZW4gdGhlIGZpbGUgYW5kIHN0b3JlIHRoZSBmaWxlIGhhbmRsZSAqLworICAgIGlmICgob3BlbkhhbmRsZXNbaV0gPSBmb3BlbihfcGF0aCxtb2RlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBpOworfQorCitpbnQgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKQoreyByZXR1cm4gLTE7IH0KKworaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQoreworICAgIGlmIChfZmlsZGVzID49IDMgJiYgb3BlbkhhbmRsZXNbX2ZpbGRlc10pIHsKKyAgICAgICAgZmNsb3NlKG9wZW5IYW5kbGVzW19maWxkZXNdKTsKKyAgICAgICAgb3BlbkhhbmRsZXNbX2ZpbGRlc10gPSBOVUxMOworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK29mZl90IF9DREVDTCBzdHViX2xzZWVrKGludCBfZmlsZGVzLCBvZmZfdCBfb2Zmc2V0LCBpbnQgX3doZW5jZSkKK3sKKyAgICBpZiAoX2ZpbGRlcyA+PSAzKSB7CisgICAgICAgIGZzZWVrKG9wZW5IYW5kbGVzW19maWxkZXNdLF9vZmZzZXQsX3doZW5jZSk7CisgICAgICAgIHJldHVybiBmdGVsbChvcGVuSGFuZGxlc1tfZmlsZGVzXSk7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc2l6ZV90IF9DREVDTCBzdHViX3JlYWQoaW50IF9maWxkZXMsIHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCit7CisgICAgaWYgKF9maWxkZXMgPj0gMykKKyAgICAgICAgcmV0dXJuIGZyZWFkKF9idWYsMSxfbmJ5dGUsb3BlbkhhbmRsZXNbX2ZpbGRlc10pOworICAgIHJldHVybiAwOworfQorCitpbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQoreworICAgIFdPUkQgZXJyb3I7CisKKyAgICBpZiAoaW5pdENvbXBsZXRlKSB7CisgICAgICAgIGlmIChSMF9EZWxldGVGaWxlKChjaGFyKilfcGF0aCwwLCZlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaV9yZW1vdmUoX3BhdGgpOworfQorCitzaXplX3QgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCit7CisgICAgaWYgKF9maWxkZXMgPj0gMykKKyAgICAgICAgcmV0dXJuIGZ3cml0ZShfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKKyAgICByZXR1cm4gX25ieXRlOworfQorCitpbnQgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKQoreyByZXR1cm4gMDsgfQorCisvKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KK2ludCBfQ0RFQ0wgc3R1Yl9yZW1vdmUoY29uc3QgY2hhciAqX2ZpbGVuYW1lKQoreyByZXR1cm4gc3R1Yl91bmxpbmsoX2ZpbGVuYW1lKTsgfQorCitpbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCit7IHJldHVybiAtMTsgfQorCit2b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoreworICAgIFdPUkQgZXJyb3I7CisgICAgaWYgKGluaXRDb21wbGV0ZSkKKyAgICAgICAgUjBfU2V0RmlsZUF0dHJpYnV0ZXMoKGNoYXIqKWZpbGVuYW1lLGF0dHJpYiwmZXJyb3IpOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCit1bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCit7CisgICAgRFdPUkQgICBkYXRlOworICAgIFZURF9HZXRfRGF0ZV9BbmRfVGltZSgmZGF0ZSk7CisgICAgcmV0dXJuIGRhdGU7Cit9CisKKyNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorCisjZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KKyNkZWZpbmUgVVNFX0xPQ0FMX0dFVERBVEUKKworLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLworaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQoreworICAgIGNoYXIgICAgbW9kZVsxMF07CisgICAgaW50ICAgICBpOworCisgICAgLyogRmluZCBhbiBlbXB0eSBmaWxlIGhhbmRsZSB0byB1c2UgKi8KKyAgICBmb3IgKGkgPSAzOyBpIDwgTUFYX0ZJTEVTOyBpKyspIHsKKyAgICAgICAgaWYgKCFvcGVuSGFuZGxlc1tpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKG9wZW5IYW5kbGVzW2ldKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBGaW5kIHRoZSBvcGVuIGZsYWdzIHRvIHVzZSAqLworICAgIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQorICAgICAgICBzdHJjcHkobW9kZSwidyIpOworICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fQ1JFQVQpCisgICAgICAgIHN0cmNweShtb2RlLCJhIik7CisgICAgZWxzZQorICAgICAgICBzdHJjcHkobW9kZSwiciIpOworICAgIGlmIChfb2ZsYWcgJiBfX19PX0JJTkFSWSkKKyAgICAgICAgc3RyY2F0KG1vZGUsImIiKTsKKyAgICBpZiAoX29mbGFnICYgX19fT19URVhUKQorICAgICAgICBzdHJjYXQobW9kZSwidCIpOworCisgICAgLyogT3BlbiB0aGUgZmlsZSBhbmQgc3RvcmUgdGhlIGZpbGUgaGFuZGxlICovCisgICAgaWYgKChvcGVuSGFuZGxlc1tpXSA9IGZvcGVuKF9wYXRoLG1vZGUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIGk7Cit9CisKK2ludCBfQ0RFQ0wgc3R1Yl9jbG9zZShpbnQgX2ZpbGRlcykKK3sKKyAgICBpZiAoX2ZpbGRlcyA+PSAzICYmIG9wZW5IYW5kbGVzW19maWxkZXNdKSB7CisgICAgICAgIGZjbG9zZShvcGVuSGFuZGxlc1tfZmlsZGVzXSk7CisgICAgICAgIG9wZW5IYW5kbGVzW19maWxkZXNdID0gTlVMTDsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCitvZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCit7CisgICAgaWYgKF9maWxkZXMgPj0gMykgeworICAgICAgICBmc2VlayhvcGVuSGFuZGxlc1tfZmlsZGVzXSxfb2Zmc2V0LF93aGVuY2UpOworICAgICAgICByZXR1cm4gZnRlbGwob3BlbkhhbmRsZXNbX2ZpbGRlc10pOworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQoreworICAgIGlmIChfZmlsZGVzID49IDMpCisgICAgICAgIHJldHVybiBmcmVhZChfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKKyAgICByZXR1cm4gMDsKK30KKworc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQoreworICAgIGlmIChfZmlsZGVzID49IDMpCisgICAgICAgIHJldHVybiBmd3JpdGUoX2J1ZiwxLF9uYnl0ZSxvcGVuSGFuZGxlc1tfZmlsZGVzXSk7CisgICAgcmV0dXJuIF9uYnl0ZTsKK30KKworaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKK3sgcmV0dXJuIC0xOyB9CisKK2ludCBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpCit7IHJldHVybiAwOyB9CisKK2ludCBfQ0RFQ0wgc3R1Yl91bmxpbmsoY29uc3QgY2hhciAqX3BhdGgpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIC0xOworfQorCisvKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KK2ludCBfQ0RFQ0wgc3R1Yl9yZW1vdmUoY29uc3QgY2hhciAqX2ZpbGVuYW1lKQoreyByZXR1cm4gc3R1Yl91bmxpbmsoX2ZpbGVuYW1lKTsgfQorCitpbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoreworICAgIHVpbnQgX2F0dHIgPSAwOworICAgIGlmIChhdHRyaWIgJiBfX0FfUkRPTkxZKQorICAgICAgICBfYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKKyAgICBpZiAoYXR0cmliICYgX19BX0hJRERFTikKKyAgICAgICAgX2F0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOworICAgIGlmIChhdHRyaWIgJiBfX0FfU1lTVEVNKQorICAgICAgICBfYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07CisgICAgUE1fc2V0RmlsZUF0dHIoZmlsZW5hbWUsX2F0dHIpOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCit1bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCit7CisgICAgVElNRV9GSUVMRFMgdG07CisgICAgX2ludDY0ICAgICAgY291bnQsY291bnRfMV8xXzE5ODA7CisKKyAgICB0bS5ZZWFyICAgICAgICAgPSAxOTgwOworICAgIHRtLk1vbnRoICAgICAgICA9IDE7CisgICAgdG0uRGF5ICAgICAgICAgID0gMTsKKyAgICB0bS5Ib3VyICAgICAgICAgPSAwOworICAgIHRtLk1pbnV0ZSAgICAgICA9IDA7CisgICAgdG0uU2Vjb25kICAgICAgID0gMDsKKyAgICB0bS5NaWxsaXNlY29uZHMgPSAwOworICAgIHRtLldlZWtkYXkgICAgICA9IDA7CisgICAgUnRsVGltZUZpZWxkc1RvVGltZSgmdG0sKFBMQVJHRV9JTlRFR0VSKSZjb3VudF8xXzFfMTk4MCk7CisgICAgS2VRdWVyeVN5c3RlbVRpbWUoKFBMQVJHRV9JTlRFR0VSKSZjb3VudCk7CisgICAgcmV0dXJuICh1bG9uZykoIChjb3VudCAtIGNvdW50XzFfMV8xOTgwKSAvICgoX2ludDY0KTI0ICogKF9pbnQ2NCkzNjAwICogKF9pbnQ2NCkxMDAwMDAwMCkgKTsKK30KKworI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQorCit2b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoreyBTZXRGaWxlQXR0cmlidXRlcygoTFBTVFIpZmlsZW5hbWUsIChEV09SRClhdHRyaWIpOyB9CisKKyNlbGlmICAgZGVmaW5lZChfX09TMl9fKQorCisjZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KKworI2lmbmRlZiBXX09LCisjZGVmaW5lIFdfT0sgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNlbmRpZgorCit2b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoreworICAgIEZJTEVTVEFUVVMzIHM7CisgICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZzLHNpemVvZihzKSkpCisgICAgICAgIHJldHVybjsKKyAgICBzLmF0dHJGaWxlID0gYXR0cmliOworICAgIERvc1NldFBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmcyxzaXplb2YocyksMEwpOworfQorCisvKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgQlVGX1NJWkUgICAgNDA5NgorCisvKiBOb3RlOiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIFVuaXgtaXNoIGhhbmRsZS1iYXNlZCBJL08gaXNuJ3QKKyAqICAgICAgIGNvbXBsZXRlIC0gYnV0IHRoYXQgd2Fzbid0IHRoZSBpbnRlbnQgZWl0aGVyLiBOb3RlIGFsc28gdGhhdCB3ZQorICogICAgICAgZG9uJ3QgcHJlc2VudGx5IHN1cHBvcnQgdGV4dCBmaWxlIEkvTywgc28gYWxsIHRleHQgZmlsZXMgZW5kCisgKiAgICAgICB1cCBpbiBVbml4IGZvcm1hdCAoYW5kIGFyZSBub3QgdHJhbnNsYXRlZCEpLgorICovCitpbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCit7CisgICAgSEZJTEUgICBoYW5kbGU7CisgICAgVUxPTkcgICBlcnJvciwgYWN0aW9udGFrZW4sIG9wZW5mbGFnLCBvcGVubW9kZTsKKyAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOworCisgICAgLyogRGV0ZXJtaW5lIG9wZW4gZmxhZ3MgKi8KKyAgICBpZiAoX29mbGFnICYgX19fT19DUkVBVCkgeworICAgICAgICBpZiAoX29mbGFnICYgX19fT19FWENMKQorICAgICAgICAgICAgb3BlbmZsYWcgPSBPUEVOX0FDVElPTl9GQUlMX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7CisgICAgICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fVFJVTkMpCisgICAgICAgICAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3BlbmZsYWcgPSBPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQorICAgICAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTOworICAgIGVsc2UKKyAgICAgICAgb3BlbmZsYWcgPSBPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUzsKKworICAgIC8qIERldGVybWluZSBvcGVuIG1vZGUgZmxhZ3MgKi8KKyAgICBpZiAoX29mbGFnICYgX19fT19SRE9OTFkpCisgICAgICAgIG9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0RFTllOT05FOworICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fV1JPTkxZKQorICAgICAgICBvcGVubW9kZSA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfREVOWVdSSVRFOworICAgIGVsc2UKKyAgICAgICAgb3Blbm1vZGUgPSBPUEVOX0FDQ0VTU19SRUFEV1JJVEUgfCBPUEVOX1NIQVJFX0RFTllXUklURTsKKworICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcworICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKKyAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCisgICAgICogdGhpcyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBzdHJjcHkocGF0aCxfcGF0aCk7CisgICAgaWYgKERvc09wZW4ocGF0aCwgJmhhbmRsZSwgJmFjdGlvbnRha2VuLCAwLCBGSUxFX05PUk1BTCwKKyAgICAgICAgICAgIG9wZW5mbGFnLCBvcGVubW9kZSwgTlVMTCkgIT0gTk9fRVJST1IpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIEhhbmRsZSBhcHBlbmQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyAgICBpZiAoX29mbGFnICYgX19fT19BUFBFTkQpIHsKKyAgICAgICAgaWYgKERvc1NldEZpbGVQdHIoaGFuZGxlLCAwLCBGSUxFX0VORCwgJmVycm9yKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK2ludCBfQ0RFQ0wgc3R1Yl9hY2Nlc3MoY29uc3QgY2hhciAqX3BhdGgsIGludCBfYW1vZGUpCit7CisgICAgY2hhciAgICAgICAgcGF0aFtQTV9NQVhfUEFUSF07CisgICAgRklMRVNUQVRVUyAgZnM7CisKKyAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKKyAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCisgICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bworICAgICAqIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgc3RyY3B5KHBhdGgsX3BhdGgpOworICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKHBhdGgsIEZJTF9TVEFOREFSRCwgJmZzLCBzaXplb2YoZnMpKSAhPSBOT19FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICgoX2Ftb2RlICYgV19PSykgJiYgKGZzLmF0dHJGaWxlICYgRklMRV9SRUFET05MWSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQoreworICAgIGlmIChEb3NDbG9zZShfZmlsZGVzKSAhPSBOT19FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitvZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCit7CisgICAgVUxPTkcgIGNiQWN0dWFsLCBvcmlnaW47CisKKyAgICBzd2l0Y2ggKF93aGVuY2UpIHsKKyAgICAgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgICAgIG9yaWdpbiA9IEZJTEVfQ1VSUkVOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFRUtfRU5EOgorICAgICAgICAgICAgb3JpZ2luID0gRklMRV9FTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yaWdpbiA9IEZJTEVfQkVHSU47CisgICAgICAgIH0KKyAgICBpZiAoRG9zU2V0RmlsZVB0cihfZmlsZGVzLCBfb2Zmc2V0LCBvcmlnaW4sICZjYkFjdHVhbCkgIT0gTk9fRVJST1IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gY2JBY3R1YWw7Cit9CisKK3NpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQoreworICAgIFVMT05HICAgY2JBY3R1YWwgPSAwLGNiUmVhZDsKKyAgICB1Y2hhciAgICpwID0gX2J1ZjsKKyAgICB1Y2hhciAgIGZpbGVfaW9fYnVmW0JVRl9TSVpFXTsKKworICAgIC8qIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGUgcGh5c2ljYWwgcmVhZCBpbiBjaHVua3MgaW50byBhCisgICAgICogYSB0ZW1wb3Jhcnkgc3RhdGljIGJ1ZmZlciwgc2luY2UgdGhlIGJ1ZmZlciBwYXNzZWQgaW4gbWF5IGJlCisgICAgICogaW4ga2VybmVsIHNwYWNlIGFuZCB3aWxsIGNhdXNlIERvc1JlYWQgdG8gYmFpbCBpbnRlcm5hbGx5LgorICAgICAqLworICAgIHdoaWxlIChfbmJ5dGUgPiBCVUZfU0laRSkgeworICAgICAgICBpZiAoRG9zUmVhZChfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgQlVGX1NJWkUsICZjYlJlYWQpICE9IE5PX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYkFjdHVhbCArPSBjYlJlYWQ7CisgICAgICAgIG1lbWNweShwLGZpbGVfaW9fYnVmLEJVRl9TSVpFKTsKKyAgICAgICAgcCArPSBCVUZfU0laRTsKKyAgICAgICAgX25ieXRlIC09IEJVRl9TSVpFOworICAgICAgICB9CisgICAgaWYgKF9uYnl0ZSkgeworICAgICAgICBpZiAoRG9zUmVhZChfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgX25ieXRlLCAmY2JSZWFkKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2JBY3R1YWwgKz0gY2JSZWFkOworICAgICAgICBtZW1jcHkocCxmaWxlX2lvX2J1ZixfbmJ5dGUpOworICAgICAgICB9CisgICAgcmV0dXJuIGNiQWN0dWFsOworfQorCitzaXplX3QgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCit7CisgICAgVUxPTkcgICBjYkFjdHVhbCA9IDAsY2JXcml0ZTsKKyAgICB1Y2hhciAgICpwID0gKFBWT0lEKV9idWY7CisgICAgdWNoYXIgICBmaWxlX2lvX2J1ZltCVUZfU0laRV07CisKKyAgICAvKiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHBoeXNpY2FsIHdyaXRlIGluIGNodW5rcyBmcm9tIGEKKyAgICAgKiBhIHRlbXBvcmFyeSBzdGF0aWMgYnVmZmVyLCBzaW5jZSB0aGUgYnVmZmVyIHBhc3NlZCBpbiBtYXkgYmUKKyAgICAgKiBpbiBrZXJuZWwgc3BhY2UgYW5kIHdpbGwgY2F1c2UgRG9zV3JpdGUgdG8gYmFpbCBpbnRlcm5hbGx5LgorICAgICAqLworICAgIHdoaWxlIChfbmJ5dGUgPiBCVUZfU0laRSkgeworICAgICAgICBtZW1jcHkoZmlsZV9pb19idWYscCxCVUZfU0laRSk7CisgICAgICAgIGlmIChEb3NXcml0ZShfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgQlVGX1NJWkUsICZjYldyaXRlKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2JBY3R1YWwgKz0gY2JXcml0ZTsKKyAgICAgICAgcCArPSBCVUZfU0laRTsKKyAgICAgICAgX25ieXRlIC09IEJVRl9TSVpFOworICAgICAgICB9CisgICAgaWYgKF9uYnl0ZSkgeworICAgICAgICBtZW1jcHkoZmlsZV9pb19idWYscCxfbmJ5dGUpOworICAgICAgICBpZiAoRG9zV3JpdGUoX2ZpbGRlcywgZmlsZV9pb19idWYsIF9uYnl0ZSwgJmNiV3JpdGUpICE9IE5PX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYkFjdHVhbCArPSBjYldyaXRlOworICAgICAgICB9CisgICAgcmV0dXJuIGNiQWN0dWFsOworfQorCitpbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQoreworICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07CisKKyAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKKyAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCisgICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bworICAgICAqIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgc3RyY3B5KHBhdGgsX3BhdGgpOworICAgIGlmIChEb3NEZWxldGUocGF0aCkgIT0gTk9fRVJST1IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKK3sKKyAgICBVTE9ORyAgaHR5cGUsIGZsYWdzOworCisgICAgaWYgKERvc1F1ZXJ5SFR5cGUoX2ZpbGRlcywgJmh0eXBlLCAmZmxhZ3MpICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKChodHlwZSAmIDB4RkYpID09IEhBTkRUWVBFX0RFVklDRSk7Cit9CisKKy8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLworaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfcGF0aCkKK3sKKyAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOworCisgICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCisgICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAorICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KKyAgICAgKiB0aGlzIGZ1bmN0aW9uLgorICAgICAqLworICAgIHN0cmNweShwYXRoLF9wYXRoKTsKKyAgICBpZiAoRG9zRGVsZXRlKHBhdGgpICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldykKK3sKKyAgICBjaGFyICAgIG9sZFtQTV9NQVhfUEFUSF07CisgICAgY2hhciAgICBuZXdbUE1fTUFYX1BBVEhdOworCisgICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCisgICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAorICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KKyAgICAgKiB0aGlzIGZ1bmN0aW9uLgorICAgICAqLworICAgIHN0cmNweShvbGQsX29sZCk7CisgICAgc3RyY3B5KG5ldyxfbmV3KTsKKyAgICBpZiAoRG9zTW92ZShvbGQsIG5ldykgIT0gTk9fRVJST1IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKwordm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKK3sgLyogVW5hYmxlIHRvIHNldCBoaWRkZW4sIHN5c3RlbSBhdHRyaWJ1dGVzIG9uIFVuaXguICovIH0KKworI2VuZGlmCisKKyNpZm5kZWYgVVNFX0xPQ0FMX0ZJTEVJTworCisvKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCitpbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCit7CisgICAgaW50IG9mbGFnX3RhYltdID0geworICAgICAgICBfX19PX1JET05MWSwgICAgT19SRE9OTFksCisgICAgICAgIF9fX09fV1JPTkxZLCAgICBPX1dST05MWSwKKyAgICAgICAgX19fT19SRFdSLCAgICAgIE9fUkRXUiwKKyAgICAgICAgX19fT19CSU5BUlksICAgIE9fQklOQVJZLAorICAgICAgICBfX19PX1RFWFQsICAgICAgT19URVhULAorICAgICAgICBfX19PX0NSRUFULCAgICAgT19DUkVBVCwKKyAgICAgICAgX19fT19FWENMLCAgICAgIE9fRVhDTCwKKyAgICAgICAgX19fT19UUlVOQywgICAgIE9fVFJVTkMsCisgICAgICAgIF9fX09fQVBQRU5ELCAgICBPX0FQUEVORCwKKyAgICAgICAgfTsKKyAgICBpbnQgaSxvZmxhZyA9IDA7CisKKyAgICAvKiBUcmFuc2xhdGUgdGhlIG9mbGFnJ3MgdG8gdGhlIE9TIGRlcGVuZGVudCB2ZXJzaW9ucyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yob2ZsYWdfdGFiKSAvIHNpemVvZihpbnQpOyBpICs9IDIpIHsKKyAgICAgICAgaWYgKF9vZmxhZyAmIG9mbGFnX3RhYltpXSkKKyAgICAgICAgICAgIG9mbGFnIHw9IG9mbGFnX3RhYltpKzFdOworICAgICAgICB9CisgICAgcmV0dXJuIG9wZW4oX3BhdGgsb2ZsYWcsX21vZGUpOworfQorCitpbnQgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKQoreyByZXR1cm4gYWNjZXNzKF9wYXRoLF9hbW9kZSk7IH0KKworaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQoreyByZXR1cm4gY2xvc2UoX2ZpbGRlcyk7IH0KKworb2ZmX3QgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKQoreyByZXR1cm4gbHNlZWsoX2ZpbGRlcyxfb2Zmc2V0LF93aGVuY2UpOyB9CisKK3NpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQoreyByZXR1cm4gcmVhZChfZmlsZGVzLF9idWYsX25ieXRlKTsgfQorCitpbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQoreyByZXR1cm4gdW5saW5rKF9wYXRoKTsgfQorCitzaXplX3QgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCit7IHJldHVybiB3cml0ZShfZmlsZGVzLF9idWYsX25ieXRlKTsgfQorCitpbnQgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKQoreyByZXR1cm4gaXNhdHR5KF9maWxkZXMpOyB9CisKKy8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLworaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpCit7IHJldHVybiByZW1vdmUoX2ZpbGVuYW1lKTsgfQorCitpbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCit7IHJldHVybiByZW5hbWUoX29sZCxfbmV3KTsgfQorCisjZW5kaWYKKworI2lmbmRlZiBVU0VfTE9DQUxfR0VUREFURQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCit1bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCit7CisgICAgc3RydWN0IHRtIHJlZlRpbWU7CisgICAgcmVmVGltZS50bV95ZWFyID0gODA7CisgICAgcmVmVGltZS50bV9tb24gID0gMDsKKyAgICByZWZUaW1lLnRtX21kYXkgPSAxOworICAgIHJlZlRpbWUudG1faG91ciA9IDA7CisgICAgcmVmVGltZS50bV9taW4gID0gMDsKKyAgICByZWZUaW1lLnRtX3NlYyAgPSAwOworICAgIHJlZlRpbWUudG1faXNkc3QgPSAtMTsKKyAgICByZXR1cm4gKHRpbWUoTlVMTCkgLSBta3RpbWUoJnJlZlRpbWUpKSAvICgyNCAqIDM2MDBMKTsKK30KKworI2VuZGlmCisKK2ludCBfQ0RFQ0wgc3R1Yl9yYWlzZShpbnQgc2lnKQoreworI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIHJldHVybiByYWlzZShzaWcpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1dJTkRPV1MzMl9fCit0eXBlZGVmIHZvaWQgKCpfX2NvZGVfcHRyKShpbnQpOworI2Vsc2UKK3R5cGVkZWYgdm9pZCAoKl9fY29kZV9wdHIpKCk7CisjZW5kaWYKKwordm9pZCAqIF9DREVDTCBzdHViX3NpZ25hbChpbnQgc2lnLCB2b2lkICpoYW5kbGVyKQoreworI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgcmV0dXJuICh2b2lkKilzaWduYWwoc2lnLChfX2NvZGVfcHRyKWhhbmRsZXIpOworI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWFjMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL21ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5NiBTY2lUZWNoIFNvZnR3YXJlLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIERlc2NyaXB0b246ICAgTWFrZWZpbGUgZm9yIFVuaVZCRSh0bSksIFVuaVBPV0VSKHRtKSwgVVZCRUxpYih0bSkgYW5kCisjICAgICAgICAgICAgICAgRFBNU0xpYiBsaWJyYXJ5IGZpbGVzLiBSZXF1aXJlcyBCb3JsYW5kIEMrKyA0LjUyIHRvIGJ1aWxkCisjICAgICAgICAgICAgICAgc29tZSBjb21wb25lbnRzLgorIworIyAkRGF0ZTogMjAwMi8xMC8wMiAxNTozNToyMCAkICRBdXRob3I6IGhmcmllZGVuICQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NGTEFHUyArPSAtRFRFU1RJTkdfR1RGCisKK2d0ZmNhbGMkRTogIGd0ZmNhbGMkTworCisuSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvY29tbW9uLm1rIgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vcGVsb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJlYzRhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE1HTCBHcmFwaGljcyBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgYSBzaW1wbGUgUG9ydGFibGUgQmluYXJ5IERMTCBsb2FkZXIKKyogICAgICAgICAgICAgICBsaWJyYXJ5LiBUaGlzIGxpYnJhcnkgY2FuIGJlIHVzZWQgdG8gbG9hZCBQRSBETEwncyB1bmRlcgorKiAgICAgICAgICAgICAgIGFueSBJbnRlbCBiYXNlZCBPUywgcHJvdmlkZWQgdGhlIERMTCdzIGRvIG5vdCBoYXZlIGFueQorKiAgICAgICAgICAgICAgIGltcG9ydHMgaW4gdGhlIGltcG9ydCB0YWJsZS4KKyoKKyogICAgICAgICAgICAgICBOT1RFOiBUaGlzIGxvYWRlciBtb2R1bGUgZXhwZWN0cyB0aGUgRExMJ3MgdG8gYmUgYnVpbHQgd2l0aAorKiAgICAgICAgICAgICAgICAgICAgIFdhdGNvbSBDKysgYW5kIG1heSBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aXRoCisqICAgICAgICAgICAgICAgICAgICAgRExMJ3MgbGlua2VkIGJ5IGFub3RoZXIgY29tcGlsZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJ2bGliL3BlbG9hZGVyLmgiCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKKyNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCisjaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgImRydmxpYi9wZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50ICAgICAgICAgIHJlc3VsdCA9IFBFX29rOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2YgICAgICAgICAgIC0gSGFuZGxlIHRvIG9wZW4gZmlsZSB0byByZWFkIGRyaXZlciBmcm9tCitzdGFydE9mZnNldCAtIE9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGRyaXZlciB3aXRoaW4gdGhlIGZpbGUKKworUkVUVVJOUzoKK0hhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBsaWJyYXJ5IGZyb20gZGlzaywgcmVsb2NhdGVzCit0aGUgY29kZSBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gaXMgdGhlCitzYW1lIGFzIHRoZSByZWd1bGFyIFBFX2xvYWRMaWJyYXJ5IGV4Y2VwdCB0aGF0IGl0IHRha2UgYSBoYW5kbGUgdG8gYW4KK29wZW4gZmlsZSBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUgZm9yIHRoZSBETEwgdG8gbG9hZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBFX3JlYWRIZWFkZXIoCisgICAgRklMRSAqZiwKKyAgICBsb25nIHN0YXJ0T2Zmc2V0LAorICAgIEZJTEVfSERSICpmaWxlaGRyLAorICAgIE9QVElPTkFMX0hEUiAqb3B0aGRyKQoreworICAgIEVYRV9IRFIgZXhlaGRyOworICAgIHVsb25nICAgb2Zmc2V0LHNpZ25hdHVyZTsKKworICAgIC8qIFJlYWQgdGhlIEVYRSBoZWFkZXIgYW5kIGNoZWNrIGZvciB2YWxpZCBoZWFkZXIgc2lnbmF0dXJlICovCisgICAgcmVzdWx0ID0gUEVfaW52YWxpZERMTEltYWdlOworICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKGZyZWFkKCZleGVoZHIsIDEsIHNpemVvZihleGVoZHIpLCBmKSAhPSBzaXplb2YoZXhlaGRyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChleGVoZHIuc2lnbmF0dXJlICE9IDB4NUE0RCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogTm93IHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBQRSBoZWFkZXIgZGVmaW5lZCBhdCBvZmZzZXQgMHgzQworICAgICAqIGluIHRoZSBNUy1ET1MgRVhFIGhlYWRlciwgYW5kIHJlYWQgdGhlIHNpZ25hdHVyZSBhbmQgY2hlY2sgaXQuCisgICAgICovCisgICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrMHgzQywgU0VFS19TRVQpOworICAgIGlmIChmcmVhZCgmb2Zmc2V0LCAxLCBzaXplb2Yob2Zmc2V0KSwgZikgIT0gc2l6ZW9mKG9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmc2VlayhmLCBzdGFydE9mZnNldCtvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAoZnJlYWQoJnNpZ25hdHVyZSwgMSwgc2l6ZW9mKHNpZ25hdHVyZSksIGYpICE9IHNpemVvZihzaWduYXR1cmUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNpZ25hdHVyZSAhPSAweDAwMDA0NTUwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvKiBOb3cgcmVhZCB0aGUgUEUgZmlsZSBoZWFkZXIgYW5kIGNoZWNrIHRoYXQgaXQgaXMgY29ycmVjdCAqLworICAgIGlmIChmcmVhZChmaWxlaGRyLCAxLCBzaXplb2YoKmZpbGVoZHIpLCBmKSAhPSBzaXplb2YoKmZpbGVoZHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGZpbGVoZHItPk1hY2hpbmUgIT0gSU1BR0VfRklMRV9NQUNISU5FX0kzODYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIShmaWxlaGRyLT5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEoZmlsZWhkci0+Q2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGZyZWFkKG9wdGhkciwgMSwgc2l6ZW9mKCpvcHRoZHIpLCBmKSAhPSBzaXplb2YoKm9wdGhkcikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAob3B0aGRyLT5NYWdpYyAhPSAweDEwQikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogU3VjY2Vzcywgc28gcmV0dXJuIHRydWUhICovCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KK3N0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQorCitSRVRVUk5TOgorU2l6ZSBvZiB0aGUgRExMIGZpbGUgb24gZGlzaywgb3IgLTEgb24gZXJyb3IKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gc2NhbnMgdGhlIGhlYWRlcnMgZm9yIGEgUG9ydGFibGUgQmluYXJ5IERMTCB0byBkZXRlcm1pbmUgdGhlCitsZW5ndGggb2YgdGhlIERMTCBmaWxlIG9uIGRpc2suCit7c2VjcmV0fQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFBFQVBJIFBFX2dldEZpbGVTaXplKAorICAgIEZJTEUgKmYsCisgICAgdWxvbmcgc3RhcnRPZmZzZXQpCit7CisgICAgRklMRV9IRFIgICAgICAgIGZpbGVoZHI7CisgICAgT1BUSU9OQUxfSERSICAgIG9wdGhkcjsKKyAgICBTRUNUSU9OX0hEUiAgICAgc2VjdGhkcjsKKyAgICB1bG9uZyAgICAgICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgaTsKKworICAgIC8qIFJlYWQgdGhlIFBFIGZpbGUgaGVhZGVycyBmcm9tIGRpc2sgKi8KKyAgICBpZiAoIVBFX3JlYWRIZWFkZXIoZixzdGFydE9mZnNldCwmZmlsZWhkciwmb3B0aGRyKSkKKyAgICAgICAgcmV0dXJuIDB4RkZGRkZGRkY7CisKKyAgICAvKiBTY2FuIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIHN1bW1pbmcgdXAgdGhlIHRvdGFsIHNpemUgKi8KKyAgICBzaXplID0gb3B0aGRyLlNpemVPZkhlYWRlcnM7CisgICAgZm9yIChpID0gMDsgaSA8IGZpbGVoZHIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgICAgIGlmIChmcmVhZCgmc2VjdGhkciwgMSwgc2l6ZW9mKHNlY3RoZHIpLCBmKSAhPSBzaXplb2Yoc2VjdGhkcikpCisgICAgICAgICAgICByZXR1cm4gMHhGRkZGRkZGRjsKKyAgICAgICAgc2l6ZSArPSBzZWN0aGRyLlNpemVPZlJhd0RhdGE7CisgICAgICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorTG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGludG8gbWVtb3J5IGZyb20gYW4gb3BlbiBmaWxlCisKK0hFQURFUjoKK3BlbG9hZGVyLmgKKworUEFSQU1FVEVSUzoKK2YgICAgICAgICAgIC0gSGFuZGxlIHRvIG9wZW4gZmlsZSB0byByZWFkIGRyaXZlciBmcm9tCitzdGFydE9mZnNldCAtIE9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGRyaXZlciB3aXRoaW4gdGhlIGZpbGUKK3NpemUgICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHNpemUgb2YgdGhlIGRyaXZlciBsb2FkZWQKK3NoYXJlZCAgICAgIC0gVHJ1ZSB0byBsb2FkIG1vZHVsZSBpbnRvIHNoYXJlZCBtZW1vcnkKKworUkVUVVJOUzoKK0hhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBsaWJyYXJ5IGZyb20gZGlzaywgcmVsb2NhdGVzCit0aGUgY29kZSBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gaXMgdGhlCitzYW1lIGFzIHRoZSByZWd1bGFyIFBFX2xvYWRMaWJyYXJ5IGV4Y2VwdCB0aGF0IGl0IHRha2UgYSBoYW5kbGUgdG8gYW4KK29wZW4gZmlsZSBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUgZm9yIHRoZSBETEwgdG8gbG9hZC4KKworU0VFIEFMU086CitQRV9sb2FkTGlicmFyeSwgUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2ZyZWVMaWJyYXJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUEVfTU9EVUxFICogUEVBUEkgUEVfbG9hZExpYnJhcnlFeHQoCisgICAgRklMRSAqZiwKKyAgICB1bG9uZyBzdGFydE9mZnNldCwKKyAgICB1bG9uZyAqc2l6ZSwKKyAgICBpYm9vbCBzaGFyZWQpCit7CisgICAgRklMRV9IRFIgICAgICAgIGZpbGVoZHI7CisgICAgT1BUSU9OQUxfSERSICAgIG9wdGhkcjsKKyAgICBTRUNUSU9OX0hEUiAgICAgc2VjdGhkcjsKKyAgICB1bG9uZyAgICAgICAgICAgb2Zmc2V0LHBhZ2VPZmZzZXQ7CisgICAgdWxvbmcgICAgICAgICAgIHRleHRfb2ZmLHRleHRfYWRkcix0ZXh0X3NpemU7CisgICAgdWxvbmcgICAgICAgICAgIGRhdGFfb2ZmLGRhdGFfYWRkcixkYXRhX3NpemUsZGF0YV9lbmQ7CisgICAgdWxvbmcgICAgICAgICAgIGV4cG9ydF9vZmYsZXhwb3J0X2FkZHIsZXhwb3J0X3NpemUsZXhwb3J0X2VuZDsKKyAgICB1bG9uZyAgICAgICAgICAgcmVsb2Nfb2ZmLHJlbG9jX3NpemU7CisgICAgdWxvbmcgICAgICAgICAgIGltYWdlX3NpemU7CisgICAgaW50ICAgICAgICAgICAgIGksZGVsdGEsbnVtRml4dXBzOworICAgIHVzaG9ydCAgICAgICAgICByZWxvY1R5cGUsKmZpeHVwOworICAgIFBFX01PRFVMRSAgICAgICAqaE1vZCA9IE5VTEw7CisgICAgdm9pZCAgICAgICAgICAgICpyZWxvYyA9IE5VTEw7CisgICAgQkFTRV9SRUxPQ0FUSU9OICpiYXNlUmVsb2M7CisgICAgSW5pdExpYkNfdCAgICAgIEluaXRMaWJDOworCisgICAgLyogUmVhZCB0aGUgUEUgZmlsZSBoZWFkZXJzIGZyb20gZGlzayAqLworICAgIGlmICghUEVfcmVhZEhlYWRlcihmLHN0YXJ0T2Zmc2V0LCZmaWxlaGRyLCZvcHRoZHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFNjYW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIGZpbmQgdGhlIG5lY2Vzc2FyeSBzZWN0aW9ucyAqLworICAgIHRleHRfb2ZmID0gZGF0YV9vZmYgPSByZWxvY19vZmYgPSBleHBvcnRfb2ZmID0gMDsKKyAgICB0ZXh0X2FkZHIgPSB0ZXh0X3NpemUgPSAwOworICAgIGRhdGFfYWRkciA9IGRhdGFfc2l6ZSA9IGRhdGFfZW5kID0gMDsKKyAgICBleHBvcnRfYWRkciA9IGV4cG9ydF9zaXplID0gZXhwb3J0X2VuZCA9IDA7CisgICAgcmVsb2Nfc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGZpbGVoZHIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgICAgIGlmIChmcmVhZCgmc2VjdGhkciwgMSwgc2l6ZW9mKHNlY3RoZHIpLCBmKSAhPSBzaXplb2Yoc2VjdGhkcikpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBpZiAoc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5lZGF0YSIpID09IDAgfHwgc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5yZGF0YSIpID09IDApIHsKKyAgICAgICAgICAgIC8qIEV4cG9ydHMgc2VjdGlvbiAqLworICAgICAgICAgICAgZXhwb3J0X29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKKyAgICAgICAgICAgIGV4cG9ydF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKKyAgICAgICAgICAgIGV4cG9ydF9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOworICAgICAgICAgICAgZXhwb3J0X2VuZCA9IGV4cG9ydF9hZGRyICsgZXhwb3J0X3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChzZWN0aGRyLk5hbWUsICIuaWRhdGEiKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBJbXBvcnRzIHNlY3Rpb24sIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoc2VjdGhkci5OYW1lLCAiLnJlbG9jIikgPT0gMCkgeworICAgICAgICAgICAgLyogUmVsb2NhdGlvbnMgc2VjdGlvbiAqLworICAgICAgICAgICAgcmVsb2Nfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOworICAgICAgICAgICAgcmVsb2Nfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXRleHRfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9DT0RFKSB7CisgICAgICAgICAgICAvKiBDb2RlIHNlY3Rpb24gKi8KKyAgICAgICAgICAgIHRleHRfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOworICAgICAgICAgICAgdGV4dF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKKyAgICAgICAgICAgIHRleHRfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWRhdGFfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBKSB7CisgICAgICAgICAgICAvKiBEYXRhIHNlY3Rpb24gKi8KKyAgICAgICAgICAgIGRhdGFfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOworICAgICAgICAgICAgZGF0YV9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKKyAgICAgICAgICAgIGRhdGFfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKKyAgICAgICAgICAgIGRhdGFfZW5kID0gZGF0YV9hZGRyICsgZGF0YV9zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgc2VjdGlvbnMgd2UgbmVlZCAqLworICAgIGlmICghdGV4dF9vZmYgfHwgIWRhdGFfb2ZmIHx8ICFleHBvcnRfb2ZmIHx8ICFyZWxvY19vZmYpIHsKKyAgICAgICAgcmVzdWx0ID0gUEVfaW52YWxpZERMTEltYWdlOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBpbWFnZSB0byBsb2FkIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgKi8KKyAgICBpbWFnZV9zaXplID0gTUFYKGV4cG9ydF9lbmQsZGF0YV9lbmQpIC0gdGV4dF9hZGRyOworICAgICpzaXplID0gc2l6ZW9mKFBFX01PRFVMRSkgKyBpbWFnZV9zaXplICsgNDA5NjsKKyAgICBpZiAoc2hhcmVkKQorICAgICAgICBoTW9kID0gUE1fbWFsbG9jU2hhcmVkKCpzaXplKTsKKyAgICBlbHNlCisgICAgICAgIGhNb2QgPSBQTV9tYWxsb2MoKnNpemUpOworICAgIHJlbG9jID0gUE1fbWFsbG9jKHJlbG9jX3NpemUpOworICAgIGlmICghaE1vZCB8fCAhcmVsb2MpIHsKKyAgICAgICAgcmVzdWx0ID0gUEVfb3V0T2ZNZW1vcnk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgIGhNb2QtPnRleHQgPSAodWNoYXIqKVJPVU5EXzRLKCh1bG9uZyloTW9kICsgc2l6ZW9mKFBFX01PRFVMRSkpOworICAgIGhNb2QtPmRhdGEgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChkYXRhX2FkZHIgLSB0ZXh0X2FkZHIpKTsKKyAgICBoTW9kLT5leHBvcnQgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChleHBvcnRfYWRkciAtIHRleHRfYWRkcikpOworICAgIGhNb2QtPnRleHRCYXNlID0gdGV4dF9hZGRyOworICAgIGhNb2QtPmRhdGFCYXNlID0gZGF0YV9hZGRyOworICAgIGhNb2QtPmV4cG9ydEJhc2UgPSBleHBvcnRfYWRkcjsKKyAgICBoTW9kLT5leHBvcnREaXIgPSBvcHRoZHIuRGF0YURpcmVjdG9yeVswXS5SZWxWaXJ0dWFsQWRkcmVzcyAtIGV4cG9ydF9hZGRyOworICAgIGhNb2QtPnNoYXJlZCA9IHNoYXJlZDsKKworICAgIC8qIE5vdyByZWFkIHRoZSBzZWN0aW9uIGltYWdlcyBmcm9tIGRpc2sgKi8KKyAgICByZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7CisgICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrdGV4dF9vZmYsIFNFRUtfU0VUKTsKKyAgICBpZiAoZnJlYWQoaE1vZC0+dGV4dCwgMSwgdGV4dF9zaXplLCBmKSAhPSB0ZXh0X3NpemUpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrZGF0YV9vZmYsIFNFRUtfU0VUKTsKKyAgICBpZiAoZnJlYWQoaE1vZC0+ZGF0YSwgMSwgZGF0YV9zaXplLCBmKSAhPSBkYXRhX3NpemUpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrZXhwb3J0X29mZiwgU0VFS19TRVQpOworICAgIGlmIChmcmVhZChoTW9kLT5leHBvcnQsIDEsIGV4cG9ydF9zaXplLCBmKSAhPSBleHBvcnRfc2l6ZSkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBmc2VlayhmLCBzdGFydE9mZnNldCtyZWxvY19vZmYsIFNFRUtfU0VUKTsKKyAgICBpZiAoZnJlYWQocmVsb2MsIDEsIHJlbG9jX3NpemUsIGYpICE9IHJlbG9jX3NpemUpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvKiBOb3cgcGVyZm9ybSByZWxvY2F0aW9ucyBvbiBhbGwgc2VjdGlvbnMgaW4gdGhlIGltYWdlICovCisgICAgZGVsdGEgPSAodWxvbmcpaE1vZC0+dGV4dCAtIG9wdGhkci5JbWFnZUJhc2UgLSB0ZXh0X2FkZHI7CisgICAgYmFzZVJlbG9jID0gKEJBU0VfUkVMT0NBVElPTiopcmVsb2M7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBDaGVjayBmb3IgdGVybWluYXRpb24gY29uZGl0aW9uICovCisgICAgICAgIGlmICghYmFzZVJlbG9jLT5QYWdlUlZBIHx8ICFiYXNlUmVsb2MtPkJsb2NrU2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIERvIGZpeHVwcyAqLworICAgICAgICBwYWdlT2Zmc2V0ID0gYmFzZVJlbG9jLT5QYWdlUlZBIC0gaE1vZC0+dGV4dEJhc2U7CisgICAgICAgIG51bUZpeHVwcyA9IChiYXNlUmVsb2MtPkJsb2NrU2l6ZSAtIHNpemVvZihCQVNFX1JFTE9DQVRJT04pKSAvIHNpemVvZih1c2hvcnQpOworICAgICAgICBmaXh1cCA9ICh1c2hvcnQqKShiYXNlUmVsb2MgKyAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUZpeHVwczsgaSsrKSB7CisgICAgICAgICAgICByZWxvY1R5cGUgPSAqZml4dXAgPj4gMTI7CisgICAgICAgICAgICBpZiAocmVsb2NUeXBlKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcGFnZU9mZnNldCArICgqZml4dXAgJiAweDBGRkYpOworICAgICAgICAgICAgICAgICoodWxvbmcqKShoTW9kLT50ZXh0ICsgb2Zmc2V0KSArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXh1cCsrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIE1vdmUgdG8gbmV4dCByZWxvY2F0aW9uIGJsb2NrICovCisgICAgICAgIGJhc2VSZWxvYyA9IChCQVNFX1JFTE9DQVRJT04qKSgodWxvbmcpYmFzZVJlbG9jICsgYmFzZVJlbG9jLT5CbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBmb3IgdGhlIGxvYWRlZCBETEwgKi8KKyAgICByZXN1bHQgPSBQRV91bmFibGVUb0luaXRMaWJDOworICAgIGlmICgoSW5pdExpYkMgPSAoSW5pdExpYkNfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kLCJfSW5pdExpYkMiKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBpZiAoIUluaXRMaWJDKCZfX19pbXBvcnRzLFBNX2dldE9TVHlwZSgpKSkKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIC8qIENsZWFuIHVwLCBjbG9zZSB0aGUgZmlsZSBhbmQgcmV0dXJuIHRoZSBsb2FkZWQgbW9kdWxlIGhhbmRsZSAqLworICAgIFBNX2ZyZWUocmVsb2MpOworICAgIHJlc3VsdCA9IFBFX29rOworICAgIHJldHVybiBoTW9kOworCitFcnJvcjoKKyAgICBpZiAoc2hhcmVkKQorICAgICAgICBQTV9mcmVlU2hhcmVkKGhNb2QpOworICAgIGVsc2UKKyAgICAgICAgUE1fZnJlZShoTW9kKTsKKyAgICBQTV9mcmVlKHJlbG9jKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorTG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGludG8gbWVtb3J5CisKK0hFQURFUjoKK3BlbG9hZGVyLmgKKworUEFSQU1FVEVSUzoKK3N6RExMTmFtZSAgIC0gTmFtZSBvZiB0aGUgUEUgRExMIGxpYnJhcnkgdG8gbG9hZAorc2hhcmVkICAgICAgLSBUcnVlIHRvIGxvYWQgbW9kdWxlIGludG8gc2hhcmVkIG1lbW9yeQorCitSRVRVUk5TOgorSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gbG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGxpYnJhcnkgZnJvbSBkaXNrLCByZWxvY2F0ZXMKK3RoZSBjb2RlIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgbGlicmFyeS4gVGhpcyBmdW5jdGlvbgord2lsbCBvbmx5IHdvcmsgb24gRExMJ3MgdGhhdCBkbyBub3QgaGF2ZSBhbnkgaW1wb3J0cywgc2luY2Ugd2UgZG9uJ3QKK3Jlc29sdmUgaW1wb3J0IGRlcGVuZGVuY2llcyBpbiB0aGlzIGZ1bmN0aW9uLgorCitTRUUgQUxTTzoKK1BFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5KAorICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSwKKyAgICBpYm9vbCBzaGFyZWQpCit7CisgICAgUEVfTU9EVUxFICAgKmhNb2Q7CisKKyNpZiAoZGVmaW5lZChfX1dJTkRPV1MzMl9fKSB8fCBkZWZpbmVkKF9fRFJJVkVSX18pKSAmJiBkZWZpbmVkKENIRUNLRUQpCisgICAgaWYgKCFzaGFyZWQpIHsKKyAgICAgICAgUE1fTU9EVUxFICAgICAgIGhJbnN0OworICAgICAgICBJbml0TGliQ190ICAgICAgSW5pdExpYkM7CisKKyAgICAgICAgLyogRm9yIFdpbjMyIGlmIGFyZSBidWlsZGluZyBjaGVja2VkIGxpYnJhcmllcyBmb3IgZGVidWdnaW5nLCB3ZSB1c2UKKyAgICAgICAgICogdGhlIHJlYWwgV2luMzIgRExMIGZ1bmN0aW9ucyBzbyB0aGF0IHdlIGNhbiBkZWJ1ZyB0aGUgcmVzdWx0aW5nIERMTAorICAgICAgICAgKiBmaWxlcyB3aXRoIHRoZSBXaW4zMiBkZWJ1Z2dlcnMuIE5vdGUgdGhhdCB3ZSBjYW4ndCBkbyB0aGlzIGlmCisgICAgICAgICAqIHdlIG5lZWQgdG8gbG9hZCB0aGUgZmlsZXMgaW50byBhIHNoYXJlZCBtZW1vcnkgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoaEluc3QgPSBQTV9sb2FkTGlicmFyeShzekRMTE5hbWUpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgPSBQRV9maWxlTm90Rm91bmQ7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBmb3IgdGhlIGxvYWRlZCBETEwgKi8KKyAgICAgICAgcmVzdWx0ID0gUEVfdW5hYmxlVG9Jbml0TGliQzsKKyAgICAgICAgaWYgKChJbml0TGliQyA9ICh2b2lkKilQTV9nZXRQcm9jQWRkcmVzcyhoSW5zdCwiX0luaXRMaWJDIikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFJbml0TGliQygmX19faW1wb3J0cyxQTV9nZXRPU1R5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgUEVfTU9EVUxFIHN0cnVjdHVyZSAqLworICAgICAgICBpZiAoKGhNb2QgPSBQTV9tYWxsb2Moc2l6ZW9mKCpoTW9kKSkpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaE1vZC0+dGV4dCA9ICh2b2lkKiloSW5zdDsKKyAgICAgICAgaE1vZC0+c2hhcmVkID0gLTE7CisKKyAgICAgICAgLyogRExMIGxvYWRlZCBzdWNjZXNzZnVsbHkgc28gcmV0dXJuIG1vZHVsZSBoYW5kbGUgKi8KKyAgICAgICAgcmVzdWx0ID0gUEVfb2s7CisgICAgICAgIHJldHVybiBoTW9kOworICAgICAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgRklMRSAgICAgICAgKmY7CisgICAgICAgIHVsb25nICAgICAgIHNpemU7CisKKyAgICAgICAgLyogQXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIG9uIGRpc2sgKi8KKyAgICAgICAgaWYgKHNoYXJlZCA8IDApCisgICAgICAgICAgICBzaGFyZWQgPSAwOworICAgICAgICBpZiAoKGYgPSBmb3BlbihzekRMTE5hbWUsInJiIikpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFBFX2ZpbGVOb3RGb3VuZDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICBoTW9kID0gUEVfbG9hZExpYnJhcnlFeHQoZiwwLCZzaXplLHNoYXJlZCk7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgcmV0dXJuIGhNb2Q7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorTG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGludG8gbWVtb3J5CisKK0hFQURFUjoKK3BlbG9hZGVyLmgKKworUEFSQU1FVEVSUzoKK3N6RExMTmFtZSAgIC0gTmFtZSBvZiB0aGUgUEUgRExMIGxpYnJhcnkgdG8gbG9hZAorc2hhcmVkICAgICAgLSBUcnVlIHRvIGxvYWQgbW9kdWxlIGludG8gc2hhcmVkIG1lbW9yeQorCitSRVRVUk5TOgorSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZnVuY3Rpb24sIGV4Y2VwdAordGhhdCBpdCBsb29rcyBmb3IgdGhlIGRyaXZlcnMgaW4gdGhlIE1HTF9ST09UL2RyaXZlcnMgZGlyZWN0b3J5IG9yIGEKKy9kcml2ZXJzIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK1NFRSBBTFNPOgorUEVfbG9hZExpYnJhcnlNR0wsIFBFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5TUdMKAorICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSwKKyAgICBpYm9vbCBzaGFyZWQpCit7CisjaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKKyAgICBQRV9NT0RVTEUgICAqaE1vZDsKKyNlbmRpZgorICAgIGNoYXIgICAgICAgIHBhdGhbMjU2XSA9ICIiOworCisgICAgLyogV2UgbG9vayBpbiB0aGUgJ2RyaXZlcnMnIGRpcmVjdG9yeSwgb3B0aW9uYWxseSB1bmRlciB0aGUgTUdMX1JPT1QKKyAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBkaXJlY3RvcnkuCisgICAgICovCisjaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKKyAgICBpZiAoZ2V0ZW52KCJNR0xfUk9PVCIpKSB7CisgICAgICAgIHN0cmNweShwYXRoLGdldGVudigiTUdMX1JPT1QiKSk7CisgICAgICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICAgICAgfQorICAgIHN0cmNhdChwYXRoLCJkcml2ZXJzIik7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLHN6RExMTmFtZSk7CisgICAgaWYgKChoTW9kID0gUEVfbG9hZExpYnJhcnkocGF0aCxzaGFyZWQpKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gaE1vZDsKKyNlbmRpZgorICAgIHN0cmNweShwYXRoLCJkcml2ZXJzIik7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLHN6RExMTmFtZSk7CisgICAgcmV0dXJuIFBFX2xvYWRMaWJyYXJ5KHBhdGgsc2hhcmVkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorR2V0cyBhIGZ1bmN0aW9uIGFkZHJlc3MgZnJvbSBhIFBvcnRhYmxlIEJpbmFyeSBETEwKKworSEVBREVSOgorcGVsb2FkZXIuaAorCitQQVJBTUVURVJTOgoraE1vZHVsZSAgICAgLSBIYW5kbGUgdG8gYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkKK3N6UHJvY05hbWUgIC0gTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhZGRyZXNzIG9mCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiwgb3IgTlVMTCBvbiBmYWlsdXJlLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG5hbWVkLCBleHBvcnRlZCBmdW5jdGlvbiBpbiBhIGxvYWRlZCBQRQorRExMIGxpYnJhcnksIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGlzCitub3QgZm91bmQgaW4gdGhlIGxpYnJhcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJuIE5VTEwuCisKK1NFRSBBTFNPOgorUEVfbG9hZExpYnJhcnksIFBFX2ZyZWVMaWJyYXJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBFQVBJIFBFX2dldFByb2NBZGRyZXNzKAorICAgIFBFX01PRFVMRSAqaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworI2lmIChkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19EUklWRVJfXykpICYmIGRlZmluZWQoQ0hFQ0tFRCkKKyAgICBpZiAoaE1vZHVsZS0+c2hhcmVkID09IC0xKQorICAgICAgICByZXR1cm4gKHZvaWQqKVBNX2dldFByb2NBZGRyZXNzKGhNb2R1bGUtPnRleHQsc3pQcm9jTmFtZSk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgdWludCAgICAgICAgICAgICAgICBpOworICAgICAgICBFWFBPUlRfRElSRUNUT1JZICAgICpleHBvcnRzOworICAgICAgICB1bG9uZyAgICAgICAgICAgICAgIGZ1bmNPZmZzZXQ7CisgICAgICAgIHVsb25nICAgICAgICAgICAgICAgKkFkZHJlc3NUYWJsZTsKKyAgICAgICAgdWxvbmcgICAgICAgICAgICAgICAqTmFtZVRhYmxlOworICAgICAgICB1c2hvcnQgICAgICAgICAgICAgICpPcmRpbmFsVGFibGU7CisgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgKm5hbWU7CisKKyAgICAgICAgLyogRmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgZXhwb3J0IHRhYmxlcyBmcm9tIHRoZSBleHBvcnQgc2VjdGlvbiAqLworICAgICAgICBpZiAoIWhNb2R1bGUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZXhwb3J0cyA9IChFWFBPUlRfRElSRUNUT1JZKikoaE1vZHVsZS0+ZXhwb3J0ICsgaE1vZHVsZS0+ZXhwb3J0RGlyKTsKKyAgICAgICAgQWRkcmVzc1RhYmxlID0gKHVsb25nKikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+QWRkcmVzc1RhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7CisgICAgICAgIE5hbWVUYWJsZSA9ICh1bG9uZyopKGhNb2R1bGUtPmV4cG9ydCArIGV4cG9ydHMtPk5hbWVUYWJsZVJWQSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOworICAgICAgICBPcmRpbmFsVGFibGUgPSAodXNob3J0KikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+T3JkaW5hbFRhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7CisKKyAgICAgICAgLyogU2VhcmNoIHRoZSBleHBvcnQgbmFtZSB0YWJsZSB0byBmaW5kIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHBvcnRzLT5OdW1iZXJPZk5hbWVQb2ludGVyczsgaSsrKSB7CisgICAgICAgICAgICBuYW1lID0gKGNoYXIqKShoTW9kdWxlLT5leHBvcnQgKyBOYW1lVGFibGVbaV0gLSBoTW9kdWxlLT5leHBvcnRCYXNlKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSxzelByb2NOYW1lKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSBleHBvcnRzLT5OdW1iZXJPZk5hbWVQb2ludGVycykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmdW5jT2Zmc2V0ID0gQWRkcmVzc1RhYmxlW09yZGluYWxUYWJsZVtpXV07CisgICAgICAgIGlmICghZnVuY09mZnNldCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gKHZvaWQqKShoTW9kdWxlLT50ZXh0ICsgZnVuY09mZnNldCAtIGhNb2R1bGUtPnRleHRCYXNlKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitGcmVlcyBhIGxvYWRlZCBQb3J0YWJsZSBCaW5hcnkgRExMCisKK0hFQURFUjoKK3BlbG9hZGVyLmgKKworUEFSQU1FVEVSUzoKK2hNb2R1bGUgICAgIC0gSGFuZGxlIHRvIGEgbG9hZGVkIFBFIERMTCBsaWJyYXJ5IHRvIGZyZWUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZnJlZXMgYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkgZnJvbSBtZW1vcnkuCisKK1NFRSBBTFNPOgorUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2xvYWRMaWJyYXJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQRUFQSSBQRV9mcmVlTGlicmFyeSgKKyAgICBQRV9NT0RVTEUgKmhNb2R1bGUpCit7CisgICAgVGVybWluYXRlTGliQ190IFRlcm1pbmF0ZUxpYkM7CisKKyNpZiAoZGVmaW5lZChfX1dJTkRPV1MzMl9fKSB8fCBkZWZpbmVkKF9fRFJJVkVSX18pKSAmJiBkZWZpbmVkKENIRUNLRUQpCisgICAgaWYgKGhNb2R1bGUtPnNoYXJlZCA9PSAtMSkgeworICAgICAgICAvKiBSdW4gdGhlIEMgcnVudGltZSBsaWJyYXJ5IGV4aXQgY29kZSBvbiBtb2R1bGUgdW5sb2FkICovCisgICAgICAgIGlmICgoVGVybWluYXRlTGliQyA9IChUZXJtaW5hdGVMaWJDX3QpUE1fZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZS0+dGV4dCwiX1Rlcm1pbmF0ZUxpYkMiKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIFRlcm1pbmF0ZUxpYkMoKTsKKyAgICAgICAgUE1fZnJlZUxpYnJhcnkoaE1vZHVsZS0+dGV4dCk7CisgICAgICAgIFBNX2ZyZWUoaE1vZHVsZSk7CisgICAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICBpZiAoaE1vZHVsZSkgeworICAgICAgICAgICAgLyogUnVuIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBleGl0IGNvZGUgb24gbW9kdWxlIHVubG9hZCAqLworICAgICAgICAgICAgaWYgKChUZXJtaW5hdGVMaWJDID0gKFRlcm1pbmF0ZUxpYkNfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kdWxlLCJfVGVybWluYXRlTGliQyIpKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIFRlcm1pbmF0ZUxpYkMoKTsKKyAgICAgICAgICAgIGlmIChoTW9kdWxlLT5zaGFyZWQpCisgICAgICAgICAgICAgICAgUE1fZnJlZVNoYXJlZChoTW9kdWxlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQTV9mcmVlKGhNb2R1bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoZSBsYXN0IG9wZXJhdGlvbgorCitIRUFERVI6CitwZWxvYWRlci5oCisKK1JFVFVSTlM6CitFcnJvciBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24uCisKK1NFRSBBTFNPOgorUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2xvYWRMaWJyYXJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBFQVBJIFBFX2dldEVycm9yKHZvaWQpCit7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3Zlc2F2YmUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlNTdlMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMKQEAgLTAsMCArMSwxMjE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgVGhlIFN1cGVyVkdBIEtpdCAtIFVuaVZCRSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBLaXQKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgSUJNIFBDIFJlYWwgTW9kZSBhbmQgMTYvMzIgYml0IFByb3RlY3RlZCBNb2RlLgorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgYSBDIGNhbGxhYmxlIGludGVyZmFjZSB0byB0aGUgc3RhbmRhcmQKKyogICAgICAgICAgICAgICBWRVNBIFZCRSByb3V0aW5lcy4gWW91IHNob3VsZCByaXAgb3V0IHRoaXMgbW9kdWxlIGFuZCB1c2UgaXQKKyogICAgICAgICAgICAgICBkaXJlY3RseSBpbiB5b3VyIG93biBhcHBsaWNhdGlvbnMsIG9yIHlvdSBjYW4gdXNlIHRoZQorKiAgICAgICAgICAgICAgIGhpZ2ggbGV2ZWwgU0RLIGZ1bmN0aW9ucy4KKyoKKyogICAgICAgICAgICAgICBNVVNUIGJlIGNvbXBpbGVkIGluIHRoZSBMQVJHRSBvciBGTEFUIG1vZGVscy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInZlc2F2YmUuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZCRV9TVUNDRVNTICAgICAweDAwNEYKKyNkZWZpbmUgTUFYX0xJTl9QVFJTICAgIDEwCisKK3N0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0Oy8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICovCitzdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSaXZhMTI4OyAgICAvKiBUcnVlIGlmIHdlIGhhdmUgYSBSaXZhMTI4ICAgICAgICAqLworc3RhdGljIFZCRV9zdGF0ZSAgICBkZWZTdGF0ZSA9IHswfTsgLyogRGVmYXVsdCBzdGF0ZSBidWZmZXIgICAgICAgICAgICAgKi8KK3N0YXRpYyBWQkVfc3RhdGUgICAgKnN0YXRlID0gJmRlZlN0YXRlOyAvKiBQb2ludGVyIHRvIGN1cnJlbnQgYnVmZmVyICAgICovCitzdGF0aWMgaW50ICAgICAgICAgIFZCRV9zaGFyZWQgPSAwOworI2lmbmRlZiBSRUFMTU9ERQorc3RhdGljIGNoYXIgICAgICAgICBsb2NhbEJ1Zls1MTJdOyAgLyogR2xvYmFsIFBNIHN0cmluZyB0cmFuc2xhdGUgYnVmICAgKi8KKyNkZWZpbmUgTUFYX0xPQ0FMX0JVRiAmbG9jYWxCdWZbNTExXQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0YXRpYyBmdW5jdGlvbiBpbiBXaW5EaXJlY3QgZm9yIHBhc3NpbmcgMzItYml0IHJlZ2lzdGVycyB0byBCSU9TICovCitpbnQgUE1BUEkgV0RfaW50Mzg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpOworCit2b2lkIFZCRUFQSSBWQkVfaW5pdCh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfaW5pdAorKgorKiBEZXNjcmlwdGlvbjogIEluaXRpYWxpc2VzIHRoZSBWQkUgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwgbW9kZSBEQy5tZW1vcnkuCisqICAgICAgICAgICAgICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVkVTQVZCRSBtb2R1bGUgZXZlcnkgdGltZQorKiAgICAgICAgICAgICAgIGl0IG5lZWRzIHRvIHVzZSB0aGUgdHJhbnNmZXIgYnVmZmVyLCBzbyB3ZSBzaW1wbHkgYWxsb2NhdGUKKyogICAgICAgICAgICAgICBpdCBvbmNlIGFuZCB0aGVuIHJldHVybi4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgaWYgKCFzdGF0ZS0+VkVTQUJ1Zl9wdHIpIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCisgICAgICAgIGlmICgoc3RhdGUtPlZFU0FCdWZfcHRyID0gUE1fZ2V0VkVTQUJ1ZigmVkVTQUJ1Zl9sZW4sICZzdGF0ZS0+VkVTQUJ1Zl9yc2VnLCAmc3RhdGUtPlZFU0FCdWZfcm9mZikpID09IE5VTEwpCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJWRVNBVkJFLkM6IFJlYWwgbW9kZSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQhIik7CisgICAgICAgIH0KK30KKwordm9pZCAqIFZCRUFQSSBWQkVfZ2V0Uk1CdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldFJNQnVmCisqCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsb2NhdGlvbiBhbmQgbGVuZ3RoIG9mIHRoZSByZWFsCisqICAgICAgICAgICAgICAgbW9kZSBtZW1vcnkgYnVmZmVyIGZvciBjYWxsaW5nIHJlYWwgbW9kZSBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKKyAgICAqcnNlZyA9IHN0YXRlLT5WRVNBQnVmX3JzZWc7CisgICAgKnJvZmYgPSBzdGF0ZS0+VkVTQUJ1Zl9yb2ZmOworICAgIHJldHVybiBzdGF0ZS0+VkVTQUJ1Zl9wdHI7Cit9CisKK3ZvaWQgVkJFQVBJIFZCRV9zZXRTdGF0ZUJ1ZmZlcihWQkVfc3RhdGUgKnMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRTdGF0ZUJ1ZmZlcgorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb25zIHNldHMgdGhlIGludGVybmFsIHN0YXRlIGJ1ZmZlciBmb3IgdGhlCisqICAgICAgICAgICAgICAgVkJFIG1vZHVsZSB0byB0aGUgcGFzc2VkIGluIGJ1ZmZlci4gQnkgZGVmYXVsdCB0aGUgaW50ZXJuYWwKKyogICAgICAgICAgICAgICBnbG9iYWwgYnVmZmVyIGlzIHVzZWQsIGJ1dCB5b3UgbXVzdCB1c2Ugc2VwYXJhdGUgYnVmZmVycworKiAgICAgICAgICAgICAgIGZvciBlYWNoIGRldmljZSBpbiBhIG11bHRpLWNvbnRyb2xsZXIgZW52aXJvbm1lbnQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIHN0YXRlID0gczsKK30KKwordm9pZCBWQkVBUEkgVkJFX2NhbGxFU0RJKFJNUkVHUyAqcmVncywgdm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2NhbGxFU0RJCisqIFBhcmFtZXRlcnM6ICAgcmVncyAgICAtIFJlZ2lzdGVycyB0byBsb2FkIHdoZW4gY2FsbGluZyBWQkUKKyogICAgICAgICAgICAgICBidWZmZXIgIC0gQnVmZmVyIHRvIGNvcHkgVkJFIGluZm8gYmxvY2sgdG8KKyogICAgICAgICAgICAgICBzaXplICAgIC0gU2l6ZSBvZiBidWZmZXIgdG8gZmlsbAorKgorKiBEZXNjcmlwdGlvbjogIENhbGxzIHRoZSBWRVNBIFZCRSBhbmQgcGFzc2VzIGluIGEgYnVmZmVyIGZvciB0aGUgVkJFIHRvCisqICAgICAgICAgICAgICAgc3RvcmUgaW5mb3JtYXRpb24gaW4sIHdoaWNoIGlzIHRoZW4gY29waWVkIGludG8gdGhlIHVzZXJzCisqICAgICAgICAgICAgICAgYnVmZmVyIHNwYWNlLiBUaGlzIHdvcmtzIGluIHByb3RlY3RlZCBtb2RlIGFzIHRoZSBidWZmZXIKKyogICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIFZFU0EgVkJFIGlzIGFsbG9jYXRlZCBpbiBjb252ZW50aW9uYWwKKyogICAgICAgICAgICAgICBtZW1vcnksIGFuZCBpcyB0aGVuIGNvcGllZCBpbnRvIHRoZSB1c2VycyBtZW1vcnkgYmxvY2suCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNU1JFR1Mgc3JlZ3M7CisKKyAgICBpZiAoIXN0YXRlLT5WRVNBQnVmX3B0cikKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91ICpNVVNUKiBjYWxsIFZCRV9pbml0KCkgYmVmb3JlIHlvdSBjYW4gY2FsbCB0aGUgVkVTQVZCRS5DIG1vZHVsZSEiKTsKKyAgICBzcmVncy5lcyA9ICh1c2hvcnQpc3RhdGUtPlZFU0FCdWZfcnNlZzsKKyAgICByZWdzLT54LmRpID0gKHVzaG9ydClzdGF0ZS0+VkVTQUJ1Zl9yb2ZmOworICAgIG1lbWNweShzdGF0ZS0+VkVTQUJ1Zl9wdHIsIGJ1ZmZlciwgc2l6ZSk7CisgICAgUE1faW50ODZ4KDB4MTAsIHJlZ3MsIHJlZ3MsICZzcmVncyk7CisgICAgbWVtY3B5KGJ1ZmZlciwgc3RhdGUtPlZFU0FCdWZfcHRyLCBzaXplKTsKK30KKworI2lmbmRlZiBSRUFMTU9ERQorc3RhdGljIGNoYXIgKlZCRV9jb3B5U3RyVG9Mb2NhbChjaGFyICpwLGNoYXIgKnJlYWxQdHIsY2hhciAqbWF4KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfY29weVN0clRvTG9jYWwKKyogUGFyYW1ldGVyczogICBwICAgICAgIC0gRmxhdCBtb2RlbCBidWZmZXIgdG8gY29weSB0bworKiAgICAgICAgICAgICAgIHJlYWxQdHIgLSBSZWFsIG1vZGUgcG9pbnRlciB0byBjb3B5CisqIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgbmV4dCBieXRlIGFmdGVyIHN0cmluZworKgorKiBEZXNjcmlwdGlvbjogIENvcGllcyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlYWwgbW9kZSBsb2NhdGlvbiBwb2ludGVkIHRvCisqICAgICAgICAgICAgICAgYnkgJ3JlYWxQdHInIGludG8gdGhlIGZsYXQgbW9kZWwgYnVmZmVyIHBvaW50ZWQgdG8gYnkKKyogICAgICAgICAgICAgICAncCcuIFdlIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgYnl0ZSBwYXN0IHRoZSBjb3BpZWQKKyogICAgICAgICAgICAgICBzdHJpbmcuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIHVjaGFyICAgKnY7CisKKyAgICB2ID0gUE1fbWFwUmVhbFBvaW50ZXIoKHVpbnQpKCh1bG9uZylyZWFsUHRyID4+IDE2KSwgKHVpbnQpKCh1bG9uZylyZWFsUHRyICYgMHhGRkZGKSk7CisgICAgd2hpbGUgKCp2ICE9IDAgJiYgcCA8IG1heCkKKyAgICAgICAgKnArKyA9ICp2Kys7CisgICAgKnArKyA9IDA7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkIFZCRV9jb3B5U2hvcnRUb0xvY2FsKHVzaG9ydCAqcCx1c2hvcnQgKnJlYWxQdHIpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9jb3B5U2hvcnRUb0xvY2FsCisqIFBhcmFtZXRlcnM6ICAgcCAgICAgICAtIEZsYXQgbW9kZWwgYnVmZmVyIHRvIGNvcHkgdG8KKyogICAgICAgICAgICAgICByZWFsUHRyIC0gUmVhbCBtb2RlIHBvaW50ZXIgdG8gY29weQorKgorKiBEZXNjcmlwdGlvbjogIENvcGllcyB0aGUgbW9kZSB0YWJsZSBmcm9tIHJlYWwgbW9kZSBtZW1vcnkgdG8gdGhlIGZsYXQKKyogICAgICAgICAgICAgICBtb2RlbCBidWZmZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIHVzaG9ydCAgKnY7CisKKyAgICB2ID0gUE1fbWFwUmVhbFBvaW50ZXIoKHVpbnQpKCh1bG9uZylyZWFsUHRyID4+IDE2KSwodWludCkoKHVsb25nKXJlYWxQdHIgJiAweEZGRkYpKTsKKyAgICB3aGlsZSAoKnYgIT0gMHhGRkZGKQorICAgICAgICAqcCsrID0gKnYrKzsKKyAgICAqcCA9IDB4RkZGRjsKK30KKyNlbmRpZgorCitpbnQgVkJFQVBJIFZCRV9kZXRlY3RFWFQoVkJFX3ZnYUluZm8gKnZnYUluZm8saWJvb2wgZm9yY2VVbmlWQkUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9kZXRlY3QKKyogUGFyYW1ldGVyczogICB2Z2FJbmZvIC0gUGxhY2UgdG8gc3RvcmUgdGhlIFZHQSBpbmZvcm1hdGlvbiBibG9jaworKiBSZXR1cm5zOiAgICAgIFZCRSB2ZXJzaW9uIG51bWJlciwgb3IgMCBpZiBub3QgZGV0ZWN0ZWQuCisqCisqIERlc2NyaXB0aW9uOiAgRGV0ZWN0cyBpZiBhIFZFU0EgVkJFIGlzIG91dCB0aGVyZSBhbmQgZnVuY3Rpb25pbmcKKyogICAgICAgICAgICAgICBjb3JyZWN0bHkuIElmIHdlIGRldGVjdCBhIFZCRSBpbnRlcmZhY2Ugd2UgcmV0dXJuIHRoZQorKiAgICAgICAgICAgICAgIFZHQUluZm9CbG9jayByZXR1cm5lZCBieSB0aGUgVkJFIGFuZCB0aGUgVkJFIHZlcnNpb24gbnVtYmVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDRGMDA7ICAgICAvKiBHZXQgU3VwZXJWR0EgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoZm9yY2VVbmlWQkUpIHsKKyAgICAgICAgcmVncy54LmJ4ID0gMHgxMjM0OworICAgICAgICByZWdzLnguY3ggPSAweDQzMjE7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVncy54LmJ4ID0gMDsKKyAgICAgICAgcmVncy54LmN4ID0gMDsKKyAgICAgICAgfQorICAgIHN0cm5jcHkodmdhSW5mby0+VkVTQVNpZ25hdHVyZSwiVkJFMiIsNCk7CisgICAgVkJFX2NhbGxFU0RJKCZyZWdzLCB2Z2FJbmZvLCBzaXplb2YoKnZnYUluZm8pKTsKKyAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RybmNtcCh2Z2FJbmZvLT5WRVNBU2lnbmF0dXJlLCJWRVNBIiw0KSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIENoZWNrIGZvciBib2d1cyBCSU9TZXMgdGhhdCByZXR1cm4gYSBWQkUgdmVyc2lvbiBudW1iZXIgdGhhdCBpcworICAgICAqIG5vdCBjb3JyZWN0LCBhbmQgZml4IGl0IHVwLiBXZSBhbHNvIGNoZWNrIHRoZSBPZW1WZW5kb3JOYW1lUHRyIGZvciBhCisgICAgICogdmFsaWQgdmFsdWUsIGFuZCBpZiBpdCBpcyBpbnZhbGlkIHRoZW4gd2UgYWxzbyByZXNldCB0byBWQkUgMS4yLgorICAgICAqLworICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDIwMCAmJiB2Z2FJbmZvLT5PZW1WZW5kb3JOYW1lUHRyID09IDApCisgICAgICAgIHZnYUluZm8tPlZFU0FWZXJzaW9uID0gMHgxMDI7CisjaWZuZGVmIFJFQUxNT0RFCisgICAgLyogUmVsb2NhdGUgYWxsIHRoZSBpbmRpcmVjdCBpbmZvcm1hdGlvbiAobW9kZSB0YWJsZXMsIE9FTSBzdHJpbmdzCisgICAgICogZXRjKSBmcm9tIHRoZSBsb3cgMU1iIG1lbW9yeSByZWdpb24gaW50byBhIHN0YXRpYyBidWZmZXIgaW4KKyAgICAgKiBvdXIgZGVmYXVsdCBkYXRhIHNlZ21lbnQuIFdlIGRvIHRoaXMgdG8gaW5zdWxhdGUgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZnJvbSBtYXBwaW5nIHRoZSBzdHJpbmdzIGZyb20gcmVhbCBtb2RlIHRvIHByb3RlY3RlZCBtb2RlLgorICAgICAqLworICAgIHsKKyAgICAgICAgY2hhciAqcCwqcDI7CisgICAgIHAyID0gVkJFX2NvcHlTdHJUb0xvY2FsKGxvY2FsQnVmLHZnYUluZm8tPk9lbVN0cmluZ1B0cixNQVhfTE9DQUxfQlVGKTsKKyAgICAgdmdhSW5mby0+T2VtU3RyaW5nUHRyID0gbG9jYWxCdWY7CisgICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDIwMCkgeworICAgICAgICAgcCA9IFZCRV9jb3B5U3RyVG9Mb2NhbChwMix2Z2FJbmZvLT5PZW1WZW5kb3JOYW1lUHRyLE1BWF9MT0NBTF9CVUYpOworICAgICAgICAgdmdhSW5mby0+T2VtVmVuZG9yTmFtZVB0ciA9IHAyOworICAgICAgICAgcDIgPSBWQkVfY29weVN0clRvTG9jYWwocCx2Z2FJbmZvLT5PZW1Qcm9kdWN0TmFtZVB0cixNQVhfTE9DQUxfQlVGKTsKKyAgICAgICAgIHZnYUluZm8tPk9lbVByb2R1Y3ROYW1lUHRyID0gcDsKKyAgICAgICAgIHAgPSBWQkVfY29weVN0clRvTG9jYWwocDIsdmdhSW5mby0+T2VtUHJvZHVjdFJldlB0cixNQVhfTE9DQUxfQlVGKTsKKyAgICAgICAgIHZnYUluZm8tPk9lbVByb2R1Y3RSZXZQdHIgPSBwMjsKKyAgICAgICAgIFZCRV9jb3B5U2hvcnRUb0xvY2FsKCh1c2hvcnQqKXAsdmdhSW5mby0+VmlkZW9Nb2RlUHRyKTsKKyAgICAgICAgIHZnYUluZm8tPlZpZGVvTW9kZVB0ciA9ICh1c2hvcnQqKXA7CisgICAgICAgICB9CisgICAgIGVsc2UgeworICAgICAgICAgVkJFX2NvcHlTaG9ydFRvTG9jYWwoKHVzaG9ydCopcDIsdmdhSW5mby0+VmlkZW9Nb2RlUHRyKTsKKyAgICAgICAgIHZnYUluZm8tPlZpZGVvTW9kZVB0ciA9ICh1c2hvcnQqKXAyOworICAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIHN0YXRlLT5WQkVNZW1vcnkgPSB2Z2FJbmZvLT5Ub3RhbE1lbW9yeSAqIDY0OworCisgICAgLyogQ2hlY2sgZm9yIFJpdmExMjggYmFzZWQgY2FyZHMgc2luY2UgdGhleSBoYXZlIGJyb2tlbiB0cmlwbGUgYnVmZmVyaW5nCisgICAgICogYW5kIHN0ZXJlbyBzdXBwb3J0LgorICAgICAqLworICAgIGhhdmVSaXZhMTI4ID0gZmFsc2U7CisgICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MzAwICYmCisgICAgICAgICAgIChzdHJzdHIodmdhSW5mby0+T2VtU3RyaW5nUHRyLCJOVmlkaWEiKSAhPSBOVUxMIHx8CisgICAgICAgICAgICBzdHJzdHIodmdhSW5mby0+T2VtU3RyaW5nUHRyLCJSaXZhIikgIT0gTlVMTCkpIHsKKyAgICAgICAgaGF2ZVJpdmExMjggPSB0cnVlOworICAgICAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgTWF0cm94IEc0MDAgY2FyZHMgd2hpY2ggY2xhaW0gdG8gYmUgVkJFIDMuMAorICAgICAqIGNvbXBsaWFudCB5ZXQgdGhleSBkb24ndCBpbXBsZW1lbnQgdGhlIHJlZnJlc2ggcmF0ZSBjb250cm9sCisgICAgICogZnVuY3Rpb25zLgorICAgICAqLworICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDMwMCAmJiAoc3RyY21wKHZnYUluZm8tPk9lbVByb2R1Y3ROYW1lUHRyLCJNYXRyb3ggRzQwMCIpID09IDApKQorICAgICAgICB2Z2FJbmZvLT5WRVNBVmVyc2lvbiA9IDB4MjAwOworICAgIHJldHVybiAoc3RhdGUtPlZCRVZlcnNpb24gPSB2Z2FJbmZvLT5WRVNBVmVyc2lvbik7Cit9CisKK2ludCBWQkVBUEkgVkJFX2RldGVjdChWQkVfdmdhSW5mbyAqdmdhSW5mbykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2RldGVjdAorKiBQYXJhbWV0ZXJzOiAgIHZnYUluZm8gLSBQbGFjZSB0byBzdG9yZSB0aGUgVkdBIGluZm9ybWF0aW9uIGJsb2NrCisqIFJldHVybnM6ICAgICAgVkJFIHZlcnNpb24gbnVtYmVyLCBvciAwIGlmIG5vdCBkZXRlY3RlZC4KKyoKKyogRGVzY3JpcHRpb246ICBEZXRlY3RzIGlmIGEgVkVTQSBWQkUgaXMgb3V0IHRoZXJlIGFuZCBmdW5jdGlvbmluZworKiAgICAgICAgICAgICAgIGNvcnJlY3RseS4gSWYgd2UgZGV0ZWN0IGEgVkJFIGludGVyZmFjZSB3ZSByZXR1cm4gdGhlCisqICAgICAgICAgICAgICAgVkdBSW5mb0Jsb2NrIHJldHVybmVkIGJ5IHRoZSBWQkUgYW5kIHRoZSBWQkUgdmVyc2lvbiBudW1iZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIHJldHVybiBWQkVfZGV0ZWN0RVhUKHZnYUluZm8sZmFsc2UpOworfQorCitpYm9vbCBWQkVBUEkgVkJFX2dldE1vZGVJbmZvKGludCBtb2RlLFZCRV9tb2RlSW5mbyAqbW9kZUluZm8pCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9nZXRNb2RlSW5mbworKiBQYXJhbWV0ZXJzOiAgIG1vZGUgICAgICAgIC0gVkJFIG1vZGUgdG8gZ2V0IGluZm9ybWF0aW9uIGZvcgorKiAgICAgICAgICAgICAgIG1vZGVJbmZvICAgIC0gUGxhY2UgdG8gc3RvcmUgVkJFIG1vZGUgaW5mb3JtYXRpb24KKyogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGZ1bmN0aW9uIGZhaWxlZC4KKyoKKyogRGVzY3JpcHRpb246ICBPYnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgdmlkZW8gbW9kZSBmcm9tIHRoZQorKiAgICAgICAgICAgICAgIFZCRS4gWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB0byBmaW5kIHRoZSB2aWRlbyBtb2RlCisqICAgICAgICAgICAgICAgeW91IHdpc2ggdG8gc2V0LCBhcyB0aGUgbmV3IFZCRSAyLjAgbW9kZSBudW1iZXJzIG1heSBiZQorKiAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgaW50ICAgICBiaXRzOworCisgICAgcmVncy54LmF4ID0gMHg0RjAxOyAgICAgICAgICAgICAvKiBHZXQgbW9kZSBpbmZvcm1hdGlvbiAgICAgICAgICovCisgICAgcmVncy54LmN4ID0gKHVzaG9ydCltb2RlOworICAgIFZCRV9jYWxsRVNESSgmcmVncywgbW9kZUluZm8sIHNpemVvZigqbW9kZUluZm8pKTsKKyAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKChtb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJiB2YmVNZEF2YWlsYWJsZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogTWFwIG91dCB0cmlwbGUgYnVmZmVyIGFuZCBzdGVyZW8gZmxhZ3MgZm9yIE5WaWRpYSBSaXZhMTI4CisgICAgICogY2hpcHMuCisgICAgICovCisgICAgaWYgKGhhdmVSaXZhMTI4KSB7CisgICAgICAgIG1vZGVJbmZvLT5Nb2RlQXR0cmlidXRlcyAmPSB+dmJlTWRUcmlwbGVCdWY7CisgICAgICAgIG1vZGVJbmZvLT5Nb2RlQXR0cmlidXRlcyAmPSB+dmJlTWRTdGVyZW87CisgICAgICAgIH0KKworICAgIC8qIFN1cHBvcnQgb2xkIHN0eWxlIFJHQiBkZWZpbml0aW9ucyBmb3IgVkJFIDEuMSBCSU9TZXMgKi8KKyAgICBiaXRzID0gbW9kZUluZm8tPkJpdHNQZXJQaXhlbDsKKyAgICBpZiAobW9kZUluZm8tPk1lbW9yeU1vZGVsID09IHZiZU1lbVBLICYmIGJpdHMgPiA4KSB7CisgICAgICAgIG1vZGVJbmZvLT5NZW1vcnlNb2RlbCA9IHZiZU1lbVJHQjsKKyAgICAgICAgc3dpdGNoIChiaXRzKSB7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIG1vZGVJbmZvLT5SZWRNYXNrU2l6ZSA9IDU7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPlJlZEZpZWxkUG9zaXRpb24gPSAxMDsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDU7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkdyZWVuRmllbGRQb3NpdGlvbiA9IDU7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkJsdWVNYXNrU2l6ZSA9IDU7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMTsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAxNTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPlJlZE1hc2tTaXplID0gNTsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDExOworICAgICAgICAgICAgICAgIG1vZGVJbmZvLT5HcmVlbk1hc2tTaXplID0gNTsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+R3JlZW5GaWVsZFBvc2l0aW9uID0gNTsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gNTsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+Qmx1ZUZpZWxkUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgPSAwOworICAgICAgICAgICAgICAgIG1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIG1vZGVJbmZvLT5SZWRNYXNrU2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPlJlZEZpZWxkUG9zaXRpb24gPSAxNjsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkdyZWVuRmllbGRQb3NpdGlvbiA9IDg7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkJsdWVNYXNrU2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBDb252ZXJ0IHRoZSAzMmsgZGlyZWN0IGNvbG9yIG1vZGVzIG9mIFZCRSAxLjIrIEJJT1NlcyB0bworICAgICAqIGJlIHJlY29nbmlzZWQgYXMgMTUgYml0cyBwZXIgcGl4ZWwgbW9kZXMuCisgICAgICovCisgICAgaWYgKGJpdHMgPT0gMTYgJiYgbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9PSAxKQorICAgICAgICBtb2RlSW5mby0+Qml0c1BlclBpeGVsID0gMTU7CisKKyAgICAvKiBGaXggdXAgYm9ndXMgQklPUydlcyB0aGF0IHJlcG9ydCBpbmNvcnJlY3QgcmVzZXJ2ZWQgcGl4ZWwgbWFza3MKKyAgICAgKiBmb3IgMzJLIGNvbG9yIG1vZGVzLiBRdWl0ZSBhIG51bWJlciBvZiBCSU9TJ2VzIGhhdmUgdGhpcyBwcm9ibGVtLAorICAgICAqIGFuZCB0aGlzIGFmZmVjdHMgb3VyIE9TLzIgZHJpdmVycyBpbiBWQkUgZmFsbGJhY2sgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoYml0cyA9PSAxNSAmJiAobW9kZUluZm8tPlJzdmRNYXNrU2l6ZSAhPSAxIHx8IG1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiAhPSAxNSkpIHsKKyAgICAgICAgbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDE7CisgICAgICAgIG1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDE1OworICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2xvbmcgVkJFQVBJIFZCRV9nZXRQYWdlU2l6ZShWQkVfbW9kZUluZm8gKm1pKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZ2V0UGFnZVNpemUKKyogUGFyYW1ldGVyczogICBtaSAgLSBQb2ludGVyIHRvIG1vZGUgaW5mb3JtYXRpb24gYmxvY2sKKyogUmV0dXJuczogICAgICBDYWN1bGF0ZWQgcGFnZSBzaXplIGluIGJ5dGVzIHJvdW5kZWQgdG8gY29ycmVjdCBib3VuZGFyeQorKgorKiBEZXNjcmlwdGlvbjogIENvbXB1dGVzIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZQorKiAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGJsb2NrLCByb3VuZGVkIHVwIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeQorKiAgICAgICAgICAgICAgICg4aywgMTZrLCAzMmsgb3IgNjRrKS4gUGFnZXMgPj0gNjRrIGluIHNpemUgYXJlIGFsd2F5cworKiAgICAgICAgICAgICAgIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgNjRrIGJvdW5kYXJ5IChzbyB0aGUgc3RhcnQgb2YgYQorKiAgICAgICAgICAgICAgIHBhZ2UgaXMgYWx3YXlzIGJhbmsgYWxpZ25lZCkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIGxvbmcgc2l6ZTsKKworICAgIHNpemUgPSAobG9uZyltaS0+Qnl0ZXNQZXJTY2FuTGluZSAqIChsb25nKW1pLT5ZUmVzb2x1dGlvbjsKKyAgICBpZiAobWktPkJpdHNQZXJQaXhlbCA9PSA0KSB7CisgICAgICAgIC8qIFdlIGhhdmUgYSAxNiBjb2xvciB2aWRlbyBtb2RlLCBzbyByb3VuZCB1cCB0aGUgcGFnZSBzaXplIHRvCisgICAgICAgICAqIDhrLCAxNmssIDMyayBvciA2NGsgYm91bmRhcmllcyBkZXBlbmRpbmcgb24gaG93IGxhcmdlIGl0IGlzLgorICAgICAgICAgKi8KKworICAgICAgICBzaXplID0gKHNpemUgKyAweDFGRkZMKSAmIDB4RkZGRkUwMDBMOworICAgICAgICBpZiAoc2l6ZSAhPSAweDIwMDApIHsKKyAgICAgICAgICAgIHNpemUgPSAoc2l6ZSArIDB4M0ZGRkwpICYgMHhGRkZGQzAwMEw7CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAweDQwMDApIHsKKyAgICAgICAgICAgICAgICBzaXplID0gKHNpemUgKyAweDdGRkZMKSAmIDB4RkZGRjgwMDBMOworICAgICAgICAgICAgICAgIGlmIChzaXplICE9IDB4ODAwMCkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IChzaXplICsgMHhGRkZGTCkgJiAweEZGRkYwMDAwTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBlbHNlIHNpemUgPSAoc2l6ZSArIDB4RkZGRkwpICYgMHhGRkZGMDAwMEw7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2lib29sIFZCRUFQSSBWQkVfc2V0VmlkZW9Nb2RlRXh0KGludCBtb2RlLFZCRV9DUlRDSW5mbyAqY3J0YykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX3NldFZpZGVvTW9kZUV4dAorKiBQYXJhbWV0ZXJzOiAgIG1vZGUgICAgLSBTdXBlclZHQSB2aWRlbyBtb2RlIHRvIHNldC4KKyogUmV0dXJuczogICAgICBUcnVlIGlmIHRoZSBtb2RlIHdhcyBzZXQsIGZhbHNlIGlmIG5vdC4KKyoKKyogRGVzY3JpcHRpb246ICBBdHRlbXB0cyB0byBzZXQgdGhlIHNwZWNpZmllZCB2aWRlbyBtb2RlLiBUaGlzIHZlcnNpb24KKyogICAgICAgICAgICAgICBpbmNsdWRlcyBzdXBwb3J0IGZvciB0aGUgVkJFL0NvcmUgMy4wIHJlZnJlc2ggcmF0ZSBjb250cm9sCisqICAgICAgICAgICAgICAgbWVjaGFuaXNtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPCAweDIwMCAmJiBtb2RlIDwgMHgxMDApIHsKKyAgICAgICAgLyogU29tZSBWQkUgaW1wbGVtZW50YXRpb25zIGJhcmYgdGVycmlibHkgaWYgeW91IHRyeSB0byBzZXQgbm9uLVZCRQorICAgICAgICAgKiB2aWRlbyBtb2RlcyB3aXRoIHRoZSBWQkUgc2V0IG1vZGUgY2FsbC4gVkJFIDIuMCBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgICogbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgcmVncy5oLmFsID0gKHVzaG9ydCltb2RlOworICAgICAgICByZWdzLmguYWggPSAwOworICAgICAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPCAweDMwMCAmJiAobW9kZSAmIHZiZVJlZnJlc2hDdHJsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmVncy54LmF4ID0gMHg0RjAyOworICAgICAgICByZWdzLnguYnggPSAodXNob3J0KW1vZGU7CisgICAgICAgIGlmICgobW9kZSAmIHZiZVJlZnJlc2hDdHJsKSAmJiBjcnRjKQorICAgICAgICAgICAgVkJFX2NhbGxFU0RJKCZyZWdzLCBjcnRjLCBzaXplb2YoKmNydGMpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaWJvb2wgVkJFQVBJIFZCRV9zZXRWaWRlb01vZGUoaW50IG1vZGUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRWaWRlb01vZGUKKyogUGFyYW1ldGVyczogICBtb2RlICAgIC0gU3VwZXJWR0EgdmlkZW8gbW9kZSB0byBzZXQuCisqIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0LCBmYWxzZSBpZiBub3QuCisqCisqIERlc2NyaXB0aW9uOiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBzcGVjaWZpZWQgdmlkZW8gbW9kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgcmV0dXJuIFZCRV9zZXRWaWRlb01vZGVFeHQobW9kZSxOVUxMKTsKK30KKworaW50IFZCRUFQSSBWQkVfZ2V0VmlkZW9Nb2RlKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9nZXRWaWRlb01vZGUKKyogUmV0dXJuczogICAgICBDdXJyZW50IHZpZGVvIG1vZGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHg0RjAzOworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gcmVncy54LmJ4OworfQorCitpYm9vbCBWQkVBUEkgVkJFX3NldEJhbmsoaW50IHdpbmRvdyxpbnQgYmFuaykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX3NldEJhbmsKKyogUGFyYW1ldGVyczogICB3aW5kb3cgIC0gV2luZG93IHRvIHNldAorKiAgICAgICAgICAgICAgIGJhbmsgICAgLSBCYW5rIG51bWJlciB0byBzZXQgd2luZG93IHRvCisqIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDRGMDU7CisgICAgcmVncy5oLmJoID0gMDsKKyAgICByZWdzLmguYmwgPSB3aW5kb3c7CisgICAgcmVncy54LmR4ID0gYmFuazsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOworfQorCitpbnQgVkJFQVBJIFZCRV9nZXRCYW5rKGludCB3aW5kb3cpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRCYW5rCisqIFBhcmFtZXRlcnM6ICAgd2luZG93ICAtIFdpbmRvdyB0byByZWFkCisqIFJldHVybnM6ICAgICAgQmFuayBudW1iZXIgZm9yIHRoZSB3aW5kb3cgKC0xIG9uIGZhaWx1cmUpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNUkVHUyAgcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKKyAgICByZWdzLmguYmggPSAxOworICAgIHJlZ3MuaC5ibCA9IHdpbmRvdzsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHJlZ3MueC5keDsKK30KKworaWJvb2wgVkJFQVBJIFZCRV9zZXRQaXhlbHNQZXJMaW5lKGludCBwaXhlbHNQZXJMaW5lLGludCAqbmV3Qnl0ZXMsCisgICAgaW50ICpuZXdQaXhlbHMsaW50ICptYXhTY2FubGluZXMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRQaXhlbHNQZXJMaW5lCisqIFBhcmFtZXRlcnM6ICAgcGl4ZWxzUGVyTGluZSAgIC0gUGl4ZWxzIHBlciBzY2FubGluZQorKiAgICAgICAgICAgICAgIG5ld0J5dGVzICAgICAgICAtIFN0b3JhZ2UgZm9yIGJ5dGVzIHBlciBsaW5lIHZhbHVlIHNldAorKiAgICAgICAgICAgICAgIG5ld1BpeGVscyAgICAgICAtIFN0b3JhZ2UgZm9yIHBpeGVscyBwZXIgbGluZSB2YWx1ZSBzZXQKKyogICAgICAgICAgICAgICBtYXhTY2FuTGluZXMgICAgLSBTdG9yYWdlIGZvciBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKKyogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKKyoKKyogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBzY2FubGluZSBsZW5ndGggZm9yIHRoZSB2aWRlbyBtb2RlIHRvIHRoZSBzcGVjaWZpZWQKKyogICAgICAgICAgICAgICBudW1iZXIgb2YgcGl4ZWxzIHBlciBzY2FubGluZS4gSWYgeW91IG5lZWQgbW9yZSBncmFudWxhcml0eQorKiAgICAgICAgICAgICAgIGluIFRydWVDb2xvciBtb2RlcywgdXNlIHRoZSBWQkVfc2V0Qnl0ZXNQZXJMaW5lIHJvdXRpbmUKKyogICAgICAgICAgICAgICAob25seSB2YWxpZCBmb3IgVkJFIDIuMCkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNUkVHUyAgcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4NEYwNjsKKyAgICByZWdzLmguYmwgPSAwOworICAgIHJlZ3MueC5jeCA9IHBpeGVsc1BlckxpbmU7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgKm5ld0J5dGVzID0gcmVncy54LmJ4OworICAgICpuZXdQaXhlbHMgPSByZWdzLnguY3g7CisgICAgKm1heFNjYW5saW5lcyA9IHJlZ3MueC5keDsKKyAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOworfQorCitpYm9vbCBWQkVBUEkgVkJFX3NldEJ5dGVzUGVyTGluZShpbnQgYnl0ZXNQZXJMaW5lLGludCAqbmV3Qnl0ZXMsCisgICAgaW50ICpuZXdQaXhlbHMsaW50ICptYXhTY2FubGluZXMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRCeXRlc1BlckxpbmUKKyogUGFyYW1ldGVyczogICBwaXhlbHNQZXJMaW5lICAgLSBQaXhlbHMgcGVyIHNjYW5saW5lCisqICAgICAgICAgICAgICAgbmV3Qnl0ZXMgICAgICAgIC0gU3RvcmFnZSBmb3IgYnl0ZXMgcGVyIGxpbmUgdmFsdWUgc2V0CisqICAgICAgICAgICAgICAgbmV3UGl4ZWxzICAgICAgIC0gU3RvcmFnZSBmb3IgcGl4ZWxzIHBlciBsaW5lIHZhbHVlIHNldAorKiAgICAgICAgICAgICAgIG1heFNjYW5MaW5lcyAgICAtIFN0b3JhZ2UgZm9yIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcworKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQorKgorKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIHNjYW5saW5lIGxlbmd0aCBmb3IgdGhlIHZpZGVvIG1vZGUgdG8gdGhlIHNwZWNpZmllZAorKiAgICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUgKHZhbGlkIGZvciBWQkUgMi4wIG9ubHkpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDRGMDY7CisgICAgcmVncy5oLmJsID0gMjsKKyAgICByZWdzLnguY3ggPSBieXRlc1BlckxpbmU7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgKm5ld0J5dGVzID0gcmVncy54LmJ4OworICAgICpuZXdQaXhlbHMgPSByZWdzLnguY3g7CisgICAgKm1heFNjYW5saW5lcyA9IHJlZ3MueC5keDsKKyAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOworfQorCitpYm9vbCBWQkVBUEkgVkJFX2dldFNjYW5saW5lTGVuZ3RoKGludCAqYnl0ZXNQZXJMaW5lLGludCAqcGl4ZWxzUGVyTGluZSwKKyAgICBpbnQgKm1heFNjYW5saW5lcykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldFNjYW5saW5lTGVuZ3RoCisqIFBhcmFtZXRlcnM6ICAgYnl0ZXNQZXJMaW5lICAgIC0gU3RvcmFnZSBmb3IgYnl0ZXMgcGVyIHNjYW5saW5lCisqICAgICAgICAgICAgICAgcGl4ZWxzUGVyTGluZSAgIC0gU3RvcmFnZSBmb3IgcGl4ZWxzIHBlciBzY2FubGluZQorKiAgICAgICAgICAgICAgIG1heFNjYW5MaW5lcyAgICAtIFN0b3JhZ2UgZm9yIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcworKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDRGMDY7CisgICAgcmVncy5oLmJsID0gMTsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAqYnl0ZXNQZXJMaW5lID0gcmVncy54LmJ4OworICAgICpwaXhlbHNQZXJMaW5lID0gcmVncy54LmN4OworICAgICptYXhTY2FubGluZXMgPSByZWdzLnguZHg7CisgICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKK30KKworaWJvb2wgVkJFQVBJIFZCRV9nZXRNYXhTY2FubGluZUxlbmd0aChpbnQgKm1heEJ5dGVzLGludCAqbWF4UGl4ZWxzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZ2V0TWF4U2NhbmxpbmVMZW5ndGgKKyogUGFyYW1ldGVyczogICBtYXhCeXRlcyAgICAtIE1heGltdW0gc2NhbmxpbmUgd2lkdGggaW4gYnl0ZXMKKyogICAgICAgICAgICAgICBtYXhQaXhlbHMgICAtIE1heGltdW0gc2NhbmxpbmUgd2lkdGggaW4gcGl4ZWxzCisqIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBmdW5jdGlvbiBmYWlsZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHg0RjA2OworICAgIHJlZ3MuaC5ibCA9IDM7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgKm1heEJ5dGVzID0gcmVncy54LmJ4OworICAgICptYXhQaXhlbHMgPSByZWdzLnguY3g7CisgICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKK30KKworaWJvb2wgVkJFQVBJIFZCRV9zZXREaXNwbGF5U3RhcnQoaW50IHgsaW50IHksaWJvb2wgd2FpdFZSVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX3NldERpc3BsYXlTdGFydAorKiBQYXJhbWV0ZXJzOiAgIHgseSAgICAgLSBQb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZGlzcGxheQorKiAgICAgICAgICAgICAgIHdhaXRWUlQgLSBUcnVlIHRvIHdhaXQgZm9yIHJldHJhY2UsIGZhbHNlIGlmIG5vdAorKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisqCisqIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgbmV3IHN0YXJ0aW5nIGRpc3BsYXkgcG9zaXRpb24gdG8gaW1wbGVtZW50CisqICAgICAgICAgICAgICAgaGFyZHdhcmUgc2Nyb2xsaW5nLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDRGMDc7CisgICAgaWYgKHdhaXRWUlQpCisgICAgICAgIHJlZ3MueC5ieCA9IDB4ODA7CisgICAgZWxzZSByZWdzLnguYnggPSAweDAwOworICAgIHJlZ3MueC5jeCA9IHg7CisgICAgcmVncy54LmR4ID0geTsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOworfQorCitpYm9vbCBWQkVBUEkgVkJFX2dldERpc3BsYXlTdGFydChpbnQgKngsaW50ICp5KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZ2V0RGlzcGxheVN0YXJ0CisqIFBhcmFtZXRlcnM6ICAgeCx5IC0gUGxhY2UgdG8gc3RvcmUgc3RhcnRpbmcgYWRkcmVzcyB2YWx1ZQorKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNUkVHUyAgcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKKyAgICByZWdzLnguYnggPSAweDAxOworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworICAgICp4ID0gcmVncy54LmN4OworICAgICp5ID0gcmVncy54LmR4OworICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Cit9CisKK2lib29sIFZCRUFQSSBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0KHVsb25nIHN0YXJ0QWRkcixpYm9vbCB3YWl0VlJUKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0CisqIFBhcmFtZXRlcnM6ICAgc3RhcnRBZGRyICAgLSAzMi1iaXQgc3RhcnRpbmcgYWRkcmVzcyBpbiBkaXNwbGF5IG1lbW9yeQorKiAgICAgICAgICAgICAgIHdhaXRWUlQgICAgIC0gVHJ1ZSB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlLCBmYWxzZSBpZiBub3QKKyogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgorKgorKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIG5ldyBzdGFydGluZyBkaXNwbGF5IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQKKyogICAgICAgICAgICAgICAzMi1iaXQgZGlzcGxheSBzdGFydCBhZGRyZXNzLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcworKiAgICAgICAgICAgICAgIGRpZmZlcmVudCB0aGUgdGhlIHZlcnNpb24gYWJvdmUsIHNpbmNlIGl0IHRha2VzIGEgMzItYml0CisqICAgICAgICAgICAgICAgYnl0ZSBvZmZzZXQgaW4gdmlkZW8gbWVtb3J5IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIHdoaWNoCisqICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIHByb2dyYW1tZXIgbWF4aW11bSBjb250cm9sIG92ZXIgdGhlIHN0YXQgYWRkcmVzcy4KKyoKKyogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKKyAgICAgICAgcmVncy54LmJ4ID0gd2FpdFZSVCA/IDB4ODIgOiAweDAyOworICAgICAgICByZWdzLmUuZWN4ID0gc3RhcnRBZGRyOworICAgICAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50IFZCRUFQSSBWQkVfZ2V0RGlzcGxheVN0YXJ0U3RhdHVzKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9nZXREaXNwbGF5U3RhcnRTdGF0dXMKKyogUmV0dXJuczogICAgICAwIGlmIGxhc3QgZmxpcCBub3Qgb2NjdXJyZWQsIDEgaWYgYWxyZWFkeSBmbGlwcGVkCisqICAgICAgICAgICAgICAgLTEgaWYgbm90IHN1cHBvcnRlZAorKgorKiBEZXNjcmlwdGlvbjogIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgcHJldmlvdXMgZGlzcGxheSBzdGFydCByZXF1ZXN0LgorKiAgICAgICAgICAgICAgIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIHRoZSBwcm9ncmFtbWVyIGNhbiBpbXBsZW1lbnQKKyogICAgICAgICAgICAgICBoYXJkd2FyZSB0cmlwbGUgYnVmZmVyaW5nIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisqCisqICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNUkVHUyAgcmVnczsKKworICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgeworICAgICAgICByZWdzLnguYXggPSAweDRGMDc7CisgICAgICAgIHJlZ3MueC5ieCA9IDB4MDAwNDsKKyAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIGlmIChyZWdzLnguYXggPT0gVkJFX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gKHJlZ3MueC5jeCAhPSAwKTsKKyAgICAgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaWJvb2wgVkJFQVBJIFZCRV9lbmFibGVTdGVyZW9Nb2RlKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9lbmFibGVTdGVyZW9Nb2RlCisqIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBzdGVyZW8gbW9kZSBlbmFibGVkLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgorKgorKiBEZXNjcmlwdGlvbjogIFB1dHMgdGhlIHN5c3RlbSBpbnRvIGhhcmR3YXJlIHN0ZXJlbyBtb2RlIGZvciBMQyBzaHV0dGVyCisqICAgICAgICAgICAgICAgZ2xhc3Nlcywgd2hlcmUgdGhlIGRpc3BsYXkgc3dhcHMgYmV0d2VlbiB0d28gZGlzcGxheSBzdGFydAorKiAgICAgICAgICAgICAgIGFkZHJlc3NlcyBldmVyeSB2ZXJ0aWNhbCByZXRyYWNlLgorKgorKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKKyAgICAgICAgcmVncy54LmF4ID0gMHg0RjA3OworICAgICAgICByZWdzLnguYnggPSAweDAwMDU7CisgICAgICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworICAgICAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOworICAgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpYm9vbCBWQkVBUEkgVkJFX2Rpc2FibGVTdGVyZW9Nb2RlKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9kaXNhYmxlU3RlcmVvTW9kZQorKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgc3RlcmVvIG1vZGUgZGlzYWJsZWQsIGZhbHNlIGlmIG5vdCBzdXBwb3J0ZWQuCisqCisqIERlc2NyaXB0aW9uOiAgUHV0cyB0aGUgc3lzdGVtIGJhY2sgaW50byBub3JtYWwsIG5vbi1zdGVyZW8gZGlzcGxheSBtb2RlCisqICAgICAgICAgICAgICAgYWZ0ZXIgaGF2aW5nIHN0ZXJlbyBtb2RlIGVuYWJsZWQuCisqCisqICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFJNUkVHUyAgcmVnczsKKworICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgeworICAgICAgICByZWdzLnguYXggPSAweDRGMDc7CisgICAgICAgIHJlZ3MueC5ieCA9IDB4MDAwNjsKKyAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lib29sIFZCRUFQSSBWQkVfc2V0U3RlcmVvRGlzcGxheVN0YXJ0KHVsb25nIGxlZnRBZGRyLHVsb25nIHJpZ2h0QWRkciwKKyAgICBpYm9vbCB3YWl0VlJUKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfc2V0U3RlcmVvRGlzcGxheVN0YXJ0CisqIFBhcmFtZXRlcnM6ICAgbGVmdEFkZHIgICAgLSAzMi1iaXQgc3RhcnQgYWRkcmVzcyBmb3IgbGVmdCBpbWFnZQorKiAgICAgICAgICAgICAgIHJpZ2h0QWRkciAgIC0gMzItYml0IHN0YXJ0IGFkZHJlc3MgZm9yIHJpZ2h0IGltYWdlCisqICAgICAgICAgICAgICAgd2FpdFZSVCAgICAgLSBUcnVlIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UsIGZhbHNlIGlmIG5vdAorKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIG5vdCBzdXBwb3J0ZWQuCisqCisqIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgbmV3IHN0YXJ0aW5nIGRpc3BsYXkgcG9zaXRpb24gdG8gdGhlIHNwZWNpZmllZAorKiAgICAgICAgICAgICAgIDMyLWJpdCBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCisqICAgICAgICAgICAgICAgZGlmZmVyZW50IHRoZSB0aGUgdmVyc2lvbiBhYm92ZSwgc2luY2UgaXQgdGFrZXMgYSAzMi1iaXQKKyogICAgICAgICAgICAgICBieXRlIG9mZnNldCBpbiB2aWRlbyBtZW1vcnkgYXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2hpY2gKKyogICAgICAgICAgICAgICBnaXZlcyB0aGUgcHJvZ3JhbW1lciBtYXhpbXVtIGNvbnRyb2wgb3ZlciB0aGUgc3RhdCBhZGRyZXNzLgorKgorKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKKyAgICAgICAgcmVncy54LmF4ID0gMHg0RjA3OworICAgICAgICByZWdzLnguYnggPSB3YWl0VlJUID8gMHg4MyA6IDB4MDM7CisgICAgICAgIHJlZ3MuZS5lY3ggPSBsZWZ0QWRkcjsKKyAgICAgICAgcmVncy5lLmVkeCA9IHJpZ2h0QWRkcjsKKyAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Vsb25nIFZCRUFQSSBWQkVfZ2V0Q2xvc2VzdENsb2NrKHVzaG9ydCBtb2RlLHVsb25nIHBpeGVsQ2xvY2spCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9nZXRDbG9zZXN0Q2xvY2sKKyogUGFyYW1ldGVyczogICBtb2RlICAgICAgICAtIFZCRSBtb2RlIHRvIGJlIHVzZWQgKGluY2x1ZGUgdmJlTGluZWFyQnVmZmVyKQorKiAgICAgICAgICAgICAgIHBpeGVsQ2xvY2sgIC0gRGVzaXJlZCBwaXhlbCBjbG9jaworKiBSZXR1cm5zOiAgICAgIENsb3Nlc3QgcGl4ZWwgY2xvY2sgdG8gZGVzaXJlZCBjbG9jayAoLTEgaWYgbm90IHN1cHBvcnRlZCkKKyoKKyogRGVzY3JpcHRpb246ICBDYWxscyB0aGUgVkJFL0NvcmUgMy4wIGludGVyZmFjZSB0byBkZXRlcm1pbmUgdGhlIGNsb3Nlc3QKKyogICAgICAgICAgICAgICBwaXhlbCBjbG9jayB0byB0aGUgcmVxdWVzdGVkIHZhbHVlLiBUaGUgQklPUyB3aWxsIGFsd2F5cworKiAgICAgICAgICAgICAgIHNlYXJjaCBmb3IgYSBwaXhlbCBjbG9jayB0aGF0IGlzIG5vIG1vcmUgdGhhbiAxJSBiZWxvdyB0aGUKKyogICAgICAgICAgICAgICByZXF1ZXN0ZWQgY2xvY2sgb3Igc29tZXdoZXJlIGhpZ2hlciB0aGFuIHRoZSBjbG9jay4gSWYgdGhlCisqICAgICAgICAgICAgICAgY2xvY2sgaXMgaGlnaGVyIG5vdGUgdGhhdCBpdCBtYXkgd2VsbCBiZSBtYW55IE1oeiBoaWdoZXIKKyogICAgICAgICAgICAgICB0aGF0IHJlcXVlc3RlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgaGF2ZSB0byBjaGVjayB0aGF0CisqICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIHZhbHVlIGlzIHN1aXRhYmxlIGZvciBpdCdzIG5lZWRzLiBUaGlzIGZ1bmN0aW9uCisqICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgYWN0dWFsIHBpeGVsIGNsb2NrIHRoYXQgd2lsbCBiZSBwcm9ncmFtbWVkIGJ5CisqICAgICAgICAgICAgICAgdGhlIGhhcmR3YXJlLgorKgorKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgcGl4ZWwgY2xvY2sgd2lsbCBiZSB1c2VkIHdpdGggYSBsaW5lYXIKKyogICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBtb2RlLCBtYWtlIHN1cmUgeW91IHBhc3MgaW4gdGhlIGxpbmVhcgorKiAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGZsYWcgdG8gdGhpcyBmdW5jdGlvbi4KKyoKKyogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDB4NEYwQjsKKyAgICAgICAgcmVncy5oLmJsID0gMHgwMDsKKyAgICAgICAgcmVncy5lLmVjeCA9IHBpeGVsQ2xvY2s7CisgICAgICAgIHJlZ3MueC5keCA9IG1vZGU7CisgICAgICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworICAgICAgICBpZiAocmVncy54LmF4ID09IFZCRV9TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIHJlZ3MuZS5lY3g7CisgICAgICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2lib29sIFZCRUFQSSBWQkVfc2V0REFDV2lkdGgoaW50IHdpZHRoKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfc2V0REFDV2lkdGgKKyogUGFyYW1ldGVyczogICB3aWR0aCAgIC0gV2lkdGggdG8gc2V0IHRoZSBEQUMgdG8KKyogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHg0RjA4OworICAgIHJlZ3MuaC5ibCA9IDB4MDA7CisgICAgcmVncy5oLmJoID0gd2lkdGg7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKK30KKworaW50IFZCRUFQSSBWQkVfZ2V0REFDV2lkdGgodm9pZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldERBQ1dpZHRoCisqIFJldHVybnM6ICAgICAgQ3VycmVudCB3aWR0aCBvZiB0aGUgcGFsZXR0ZSBEQUMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHg0RjA4OworICAgIHJlZ3MuaC5ibCA9IDB4MDE7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiByZWdzLmguYmg7Cit9CisKK2lib29sIFZCRUFQSSBWQkVfc2V0UGFsZXR0ZShpbnQgc3RhcnQsaW50IG51bSxWQkVfcGFsZXR0ZSAqcGFsLGlib29sIHdhaXRWUlQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zZXRQYWxldHRlCisqIFBhcmFtZXRlcnM6ICAgc3RhcnQgICAtIFN0YXJ0aW5nIHBhbGV0dGUgaW5kZXggdG8gcHJvZ3JhbQorKiAgICAgICAgICAgICAgIG51bSAgICAgLSBOdW1iZXIgb2YgcGFsZXR0ZSBpbmRleGVzIHRvIHByb2dyYW0KKyogICAgICAgICAgICAgICBwYWwgICAgIC0gUGFsZXR0ZSBidWZmZXIgY29udGFpbmluZyB2YWx1ZXMKKyogICAgICAgICAgICAgICB3YWl0VlJUIC0gV2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBmbGFnCisqIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCisqCisqIERlc2NyaXB0aW9uOiAgU2V0cyBhIGJsb2NrIG9mIHBhbGV0dGUgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIFZCRSAyLjAKKyogICAgICAgICAgICAgICBCSU9TLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCBvbiBWQkUgMS4yIGltcGxlbWVudGF0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHg0RjA5OworICAgIHJlZ3MuaC5ibCA9IHdhaXRWUlQgPyAweDgwIDogMHgwMDsKKyAgICByZWdzLnguY3ggPSBudW07CisgICAgcmVncy54LmR4ID0gc3RhcnQ7CisgICAgVkJFX2NhbGxFU0RJKCZyZWdzLCBwYWwsIHNpemVvZihWQkVfcGFsZXR0ZSkgKiBudW0pOworICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Cit9CisKK3ZvaWQgKiBWQkVBUEkgVkJFX2dldEJhbmtlZFBvaW50ZXIoVkJFX21vZGVJbmZvICptb2RlSW5mbykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldEJhbmtlZFBvaW50ZXIKKyogUGFyYW1ldGVyczogICBtb2RlSW5mbyAgICAtIE1vZGUgaW5mbyBibG9jayBmb3IgdmlkZW8gbW9kZQorKiBSZXR1cm5zOiAgICAgIFNlbGVjdG9yIHRvIHRoZSBsaW5lYXIgZnJhbWVidWZmZXIgKDAgb24gZmFpbHVyZSkKKyoKKyogRGVzY3JpcHRpb246ICBSZXR1cm5zIGEgbmVhciBwb2ludGVyIHRvIHRoZSBWR0EgZnJhbWVidWZmZXIgYXJlYS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgLyogV2UganVzdCBtYXAgdGhlIHBvaW50ZXIgZXZlcnkgdGltZSwgc2luY2UgdGhlIHBvaW50ZXIgd2lsbCBhbHdheXMKKyAgICAgKiBiZSBpbiByZWFsIG1vZGUgbWVtb3J5LCBzbyB3ZSB3b250IGFjdHVhbGx5IGJlIG1hcHBpbmcgYW55IHJlYWwKKyAgICAgKiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBOT1RFOiBXZSBjYW5ub3QgY3VycmVudGx5IG1hcCBhIG5lYXIgcG9pbnRlciB0byB0aGUgYmFua2VkIGZyYW1lCisgICAgICogICAgICAgYnVmZmVyIGZvciBXYXRjb20gV2luMzg2LCBzbyB3ZSBjcmVhdGUgYSAxNjoxNiBmYXIgcG9pbnRlciB0bworICAgICAqICAgICAgIHRoZSB2aWRlbyBtZW1vcnkuIEFsbCB0aGUgYXNzZW1ibGVyIGNvZGUgd2lsbCByZW5kZXIgdG8gdGhlCisgICAgICogICAgICAgdmlkZW8gbWVtb3J5IGJ5IGxvYWRpbmcgdGhlIHNlbGVjdG9yIHJhdGhlciB0aGFuIHVzaW5nIGEKKyAgICAgKiAgICAgICBuZWFyIHBvaW50ZXIuCisgICAgICovCisgICAgdWxvbmcgc2VnID0gKHVzaG9ydCltb2RlSW5mby0+V2luQVNlZ21lbnQ7CisgICAgaWYgKHNlZyAhPSAwKSB7CisgICAgICAgIGlmIChzZWcgPT0gMHhBMDAwKQorICAgICAgICAgICAgcmV0dXJuICh2b2lkKilQTV9nZXRBMDAwMFBvaW50ZXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICh2b2lkKilQTV9tYXBQaHlzaWNhbEFkZHIoc2VnIDw8IDQsMHhGRkZGLHRydWUpOworICAgICAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZm5kZWYgUkVBTE1PREUKKwordm9pZCAqIFZCRUFQSSBWQkVfZ2V0TGluZWFyUG9pbnRlcihWQkVfbW9kZUluZm8gKm1vZGVJbmZvKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZ2V0TGluZWFyUG9pbnRlcgorKiBQYXJhbWV0ZXJzOiAgIG1vZGVJbmZvICAgIC0gTW9kZSBpbmZvIGJsb2NrIGZvciB2aWRlbyBtb2RlCisqIFJldHVybnM6ICAgICAgU2VsZWN0b3IgdG8gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciAoMCBvbiBmYWlsdXJlKQorKgorKiBEZXNjcmlwdGlvbjogIFJldHVybnMgYSBuZWFyIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciBmb3IgdGhlIHZpZGVvCisqICAgICAgICAgICAgICAgbW9kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgc3RhdGljIHVsb25nIHBoeXNQdHJbTUFYX0xJTl9QVFJTXSA9IHswfTsKKyAgICBzdGF0aWMgdm9pZCAqbGluUHRyW01BWF9MSU5fUFRSU10gPSB7MH07CisgICAgc3RhdGljIGludCBudW1QdHJzID0gMDsKKyAgICBpbnQgaTsKKworICAgIC8qIFNlYXJjaCBmb3IgYW4gYWxyZWFkeSBtYXBwZWQgcG9pbnRlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHJzOyBpKyspIHsKKyAgICAgICAgaWYgKHBoeXNQdHJbaV0gPT0gbW9kZUluZm8tPlBoeXNCYXNlUHRyKQorICAgICAgICAgICAgcmV0dXJuIGxpblB0cltpXTsKKyAgICAgICAgfQorICAgIGlmIChudW1QdHJzIDwgTUFYX0xJTl9QVFJTKSB7CisgICAgICAgIHBoeXNQdHJbbnVtUHRyc10gPSBtb2RlSW5mby0+UGh5c0Jhc2VQdHI7CisgICAgICAgIGxpblB0cltudW1QdHJzXSA9IFBNX21hcFBoeXNpY2FsQWRkcihtb2RlSW5mby0+UGh5c0Jhc2VQdHIsKHN0YXRlLT5WQkVNZW1vcnkgKiAxMDI0TCktMSx0cnVlKTsKKyAgICAgICAgcmV0dXJuIGxpblB0cltudW1QdHJzKytdOworICAgICAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIEluaXRQTUNvZGUodm9pZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgSW5pdFBNQ29kZSAgLSAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgdmVyc2lvbgorKgorKiBEZXNjcmlwdGlvbjogIEZpbmRzIHRoZSBhZGRyZXNzIG9mIGFuZCByZWxvY2F0ZXMgdGhlIHByb3RlY3RlZCBtb2RlCisqICAgICAgICAgICAgICAgY29kZSBibG9jayBmcm9tIHRoZSBWQkUgMi4wIGludG8gYSBsb2NhbCBtZW1vcnkgYmxvY2suIFRoZQorKiAgICAgICAgICAgICAgIG1lbW9yeSBibG9jayBpcyBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKSBhbmQgbXVzdCBiZSBmcmVlZAorKiAgICAgICAgICAgICAgIHdpdGggVkJFX2ZyZWVQTUNvZGUoKSBhZnRlciBncmFwaGljcyBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLgorKgorKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGJ1ZmZlciBfbXVzdF8gYmUgcmVjb3BpZWQgYWZ0ZXIgZWFjaCBtb2RlIHNldCwKKyogICAgICAgICAgICAgICBhcyB0aGUgcm91dGluZXMgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nCisqICAgICAgICAgICAgICAgdmlkZW8gbW9kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgUk1SRUdTICAgICAgcmVnczsKKyAgICBSTVNSRUdTICAgICBzcmVnczsKKyAgICB1Y2hhciAgICAgICAqY29kZTsKKyAgICBpbnQgICAgICAgICBwbUxlbjsKKworICAgIGlmICghc3RhdGUtPnBtSW5mbyAmJiBzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDIwMCkgeworICAgICAgICByZWdzLnguYXggPSAweDRGMEE7CisgICAgICAgIHJlZ3MueC5ieCA9IDA7CisgICAgICAgIFBNX2ludDg2eCgweDEwLCZyZWdzLCZyZWdzLCZzcmVncyk7CisgICAgICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChWQkVfc2hhcmVkKQorICAgICAgICAgICAgc3RhdGUtPnBtSW5mbyA9IFBNX21hbGxvY1NoYXJlZChyZWdzLnguY3gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0ZS0+cG1JbmZvID0gUE1fbWFsbG9jKHJlZ3MueC5jeCk7CisgICAgICAgIGlmIChzdGF0ZS0+cG1JbmZvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLT5wbUluZm8zMiA9IHN0YXRlLT5wbUluZm87CisgICAgICAgIHBtTGVuID0gcmVncy54LmN4OworCisgICAgICAgIC8qIFJlbG9jYXRlIHRoZSBibG9jayBpbnRvIG91ciBsb2NhbCBkYXRhIHNlZ21lbnQgKi8KKyAgICAgICAgY29kZSA9IFBNX21hcFJlYWxQb2ludGVyKHNyZWdzLmVzLHJlZ3MueC5kaSk7CisgICAgICAgIG1lbWNweShzdGF0ZS0+cG1JbmZvLGNvZGUscG1MZW4pOworCisgICAgICAgIC8qIE5vdyBkbyBhIHNhbml0eSBjaGVjayBvbiB0aGUgaW5mb3JtYXRpb24gd2UgcmVjaWV2ZSB0byBlbnN1cmUKKyAgICAgICAgICogdGhhdCBpcyBpcyBjb3JyZWN0LiBTb21lIEJJT1MgcmV0dXJuIHRvdGFsbHkgYm9ndXMgaW5mb3JtYXRpb24KKyAgICAgICAgICogaW4gaGVyZSAoTWF0cm94IGlzIG9uZSkhIFVuZGVyIERPUyB0aGlzIHdvcmtzIE9LLCBidXQgdW5kZXIgT1MvMgorICAgICAgICAgKiB3ZSBhcmUgc2NyZXdlZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzdGF0ZS0+cG1JbmZvLT5zZXRXaW5kb3cgPj0gcG1MZW4gfHwKKyAgICAgICAgICAgIHN0YXRlLT5wbUluZm8tPnNldERpc3BsYXlTdGFydCA+PSBwbUxlbiB8fAorICAgICAgICAgICAgc3RhdGUtPnBtSW5mby0+c2V0UGFsZXR0ZSA+PSBwbUxlbiB8fAorICAgICAgICAgICAgc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyA+PSBwbUxlbikgeworICAgICAgICAgICAgaWYgKFZCRV9zaGFyZWQpCisgICAgICAgICAgICAgICAgUE1fZnJlZVNoYXJlZChzdGF0ZS0+cG1JbmZvKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQTV9mcmVlKHN0YXRlLT5wbUluZm8pOworICAgICAgICAgICAgc3RhdGUtPnBtSW5mbzMyID0gc3RhdGUtPnBtSW5mbyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB0aGUgSU8gcHJpdmVsZWRnZSBpbmZvIGFuZCBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0bworICAgICAgICAgKiBwYXNzIGEgc2VsZWN0b3IgdG8gTU1JTyByZWdpc3RlcnMgdG8gdGhlIGJhbmsgc3dpdGNoIGNvZGUuCisgICAgICAgICAqIFNpbmNlIHdlIG5vIGxvbmdlciBzdXBwb3J0IHNlbGVjdG9yIGFsbG9jYXRpb24sIHdlIG5vIGxvbmdlcgorICAgICAgICAgKiBzdXBwb3J0IHRoaXMgbWVjaGFuaXNtIHNvIHdlIGRpc2FibGUgdGhlIHByb3RlY3RlZCBtb2RlCisgICAgICAgICAqIGludGVyZmFjZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAqLworICAgICAgICBpZiAoc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyAmJiAhc3RhdGUtPk1NSU9TZWwpIHsKKyAgICAgICAgICAgIHVzaG9ydCAqcCA9ICh1c2hvcnQqKSgodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5JT1ByaXZJbmZvKTsKKyAgICAgICAgICAgIHdoaWxlICgqcCAhPSAweEZGRkYpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgaWYgKCpwICE9IDB4RkZGRikKKyAgICAgICAgICAgICAgICBWQkVfZnJlZVBNQ29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3ZvaWQgKiBWQkVBUEkgVkJFX2dldFNldEJhbmsodm9pZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldFNldEJhbmsKKyogUmV0dXJuczogICAgICBQb2ludGVyIHRvIHRoZSAzMiBWQkUgMi4wIGJpdCBiYW5rIHN3aXRjaGluZyByb3V0aW5lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKKyAgICAgICAgSW5pdFBNQ29kZSgpOworICAgICAgICBpZiAoc3RhdGUtPnBtSW5mbykKKyAgICAgICAgICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXRXaW5kb3c7CisgICAgICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0RGlzcGxheVN0YXJ0KHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXREaXNwbGF5U3RhcnQKKyogUmV0dXJuczogICAgICBQb2ludGVyIHRvIHRoZSAzMiBWQkUgMi4wIGJpdCBDUlQgc3RhcnQgYWRkcmVzcyByb3V0aW5lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKKyAgICAgICAgSW5pdFBNQ29kZSgpOworICAgICAgICBpZiAoc3RhdGUtPnBtSW5mbykKKyAgICAgICAgICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXREaXNwbGF5U3RhcnQ7CisgICAgICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0UGFsZXR0ZSh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZ2V0U2V0UGFsZXR0ZQorKiBSZXR1cm5zOiAgICAgIFBvaW50ZXIgdG8gdGhlIDMyIFZCRSAyLjAgYml0IHBhbGV0dGUgcHJvZ3JhbW1pbmcgcm91dGluZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7CisgICAgICAgIEluaXRQTUNvZGUoKTsKKyAgICAgICAgaWYgKHN0YXRlLT5wbUluZm8pCisgICAgICAgICAgICByZXR1cm4gKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+c2V0UGFsZXR0ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFZCRUFQSSBWQkVfZnJlZVBNQ29kZSh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246ICAgICBWQkVfZnJlZVBNQ29kZQorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgcm91dGluZSBmcmVlcyB0aGUgcHJvdGVjdGVkIG1vZGUgY29kZSBibG9ja3MgdGhhdAorKiAgICAgICAgICAgICAgIHdlIGNvcGllZCBmcm9tIHRoZSBWQkUgMi4wIGludGVyZmFjZS4gVGhpcyByb3V0aW5lIG11c3QKKyogICAgICAgICAgICAgICBiZSBhZnRlciB5b3UgaGF2ZSBmaW5pc2hlZCBncmFwaGljcyBwcm9jZXNzaW5nIHRvIGZyZWUgdXAKKyogICAgICAgICAgICAgICB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByb3V0aW5lcy4gVGhpcyBpcyBuZWNlc3NhcnkKKyogICAgICAgICAgICAgICBiZWNhdXNlIHRoZSBQTSBpbmZvIG1lbW9yeSBibG9jayBtdXN0IGJlIHJlLWNvcGllZCBhZnRlcgorKiAgICAgICAgICAgICAgIGV2ZXJ5IHZpZGVvIG1vZGUgc2V0IGZyb20gdGhlIFZCRSAyLjAgaW1wbGVtZW50YXRpb24uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIGlmIChzdGF0ZS0+cG1JbmZvKSB7CisgICAgICAgIGlmIChWQkVfc2hhcmVkKQorICAgICAgICAgICAgUE1fZnJlZVNoYXJlZChzdGF0ZS0+cG1JbmZvKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUE1fZnJlZShzdGF0ZS0+cG1JbmZvKTsKKyAgICAgICAgc3RhdGUtPnBtSW5mbyA9IE5VTEw7CisgICAgICAgIHN0YXRlLT5wbUluZm8zMiA9IE5VTEw7CisgICAgICAgIH0KK30KKwordm9pZCBWQkVBUEkgVkJFX3NoYXJlUE1Db2RlKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZCRV9zaGFyZVBNQ29kZQorKgorKiBEZXNjcmlwdGlvbjogIEVuYWJsZXMgaW50ZXJuYWwgc2hhcmluZyBvZiB0aGUgUE0gY29kZSBidWZmZXIgZm9yIE9TLzIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFZCRV9zaGFyZWQgPSB0cnVlOworfQorCisvKiBTZXQgb2YgY29kZSBzdHVicyB1c2VkIHRvIGJ1aWxkIHRoZSBmaW5hbCBiYW5rIHN3aXRjaCBjb2RlICovCisKKyNkZWZpbmUgVkJFMjBfYWRqdXN0T2Zmc2V0ICA3CisKK3N0YXRpYyB1Y2hhciBWQkUyMEFfYmFua0Z1bmMzMl9TdGFydFtdID0geworICAgIDB4NTMsMHg1MSwgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICBlYngsZWN4ICAgICAqLworICAgIDB4OEIsMHhEMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBlZHgsZWF4ICAgICAqLworICAgIDB4MzMsMHhEQiwgICAgICAgICAgICAgICAgICAvKiAgeG9yICAgICBlYngsZWJ4ICAgICAqLworICAgIDB4QjEsMHgwMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBjbCwwICAgICAgICAqLworICAgIDB4RDIsMHhFMiwgICAgICAgICAgICAgICAgICAvKiAgc2hsICAgICBkbCxjbCAgICAgICAqLworICAgIH07CisKK3N0YXRpYyB1Y2hhciBWQkUyMF9iYW5rRnVuYzMyX0VuZFtdID0geworICAgIDB4NTksMHg1QiwgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBlY3gsZWJ4ICAgICAqLworICAgIH07CisKK3N0YXRpYyB1Y2hhciBiYW5rRnVuYzMyWzEwMF07CisKKyNkZWZpbmUgY29weShwLGIsYSkgbWVtY3B5KGIsYSxzaXplb2YoYSkpOyAocCkgPSAoYikgKyBzaXplb2YoYSkKKworaWJvb2wgVkJFQVBJIFZCRV9nZXRCYW5rRnVuYzMyKGludCAqY29kZUxlbix2b2lkICoqYmFua0Z1bmMsaW50IGR1YWxCYW5rcywKKyAgICBpbnQgYmFua0FkanVzdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkJFX2dldEJhbmtGdW5jMzIKKyogUGFyYW1ldGVyczogICBjb2RlTGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIGxlbmd0aCBvZiBjb2RlCisqICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQbGFjZSB0byBzdG9yZSBwb2ludGVyIHRvIGJhbmsgc3dpdGNoIGNvZGUKKyogICAgICAgICAgICAgICBkdWFsQmFua3MgICAtIFRydWUgaWYgZHVhbCBiYW5rcyBhcmUgaW4gZWZmZWN0CisqICAgICAgICAgICAgICAgYmFua0FkanVzdCAgLSBCYW5rIHNoaWZ0IGFkanVzdG1lbnQgZmFjdG9yCisqIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBub3QgY29tcGF0aWJsZS4KKyoKKyogRGVzY3JpcHRpb246ICBDcmVhdGVzIGEgbG9jYWwgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGZyb20gdGhlCisqICAgICAgICAgICAgICAgVkJFIDIuMCBiYW5rIHN3aXRjaCBjb2RlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorKiAgICAgICAgICAgICAgIHZpcnR1YWwgZmxhdCBmcmFtZWJ1ZmZlciBkZXZpY2VzIChkb2VzIG5vdCBoYXZlIGEgcmV0dXJuCisqICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZCBhbmQgdGFrZXMgdGhlIGJhbmsgbnVtYmVyIGluIEVBWAorKiAgICAgICAgICAgICAgIG5vdCBFRFgpLiBOb3RlIHRoYXQgdGhpcyAzMiBiaXQgY29kZSBjYW5ub3QgaW5jbHVkZSBpbnQgMTBoCisqICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgVkJFIDIuMAorKiAgICAgICAgICAgICAgIG9yIGxhdGVyLgorKgorKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgMzIgYml0CisqICAgICAgICAgICAgICAgYmFuayBzd2l0Y2ggZnVuY3Rpb24sIHdoaWNoIHRoZSBzdGFuZGFyZCBWQkUgMi4wIHNwZWMKKyogICAgICAgICAgICAgICBkb2VzIG5vdCBwcm92aWRlLiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgaGF2ZQorKiAgICAgICAgICAgICAgIGV4dGVuZGVkIHRoZSBWQkUgMi4wIHN0YXRlLT5wbUluZm8gc3RydWN0dXJlIGluIFVuaVZCRSA1LjIgaW4gYQorKiAgICAgICAgICAgICAgIHdheSB0byBzdXBwb3J0IHRoaXMsIGFuZCB3ZSBob3BlIHRoYXQgdGhpcyB3aWxsIGJlY29tZQorKiAgICAgICAgICAgICAgIGEgVkJFIDIuMCBhbW1lbmRtZW50LgorKgorKiAgICAgICAgICAgICAgIE5vdGUgYWxzbyB0aGF0IHdlIGNhbm5vdCBydW4gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlcgorKiAgICAgICAgICAgICAgIGVtdWxhdGlvbiBjb2RlIHdpdGggYmFuayBzd2l0Y2hpbmcgcm91dGluZXMgdGhhdCByZXF1aXJlCisqICAgICAgICAgICAgICAgYSBzZWxlY3RvciB0byB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgcGFzc2VkIGluIEVTLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBpbnQgICAgIGxlbjsKKyAgICB1Y2hhciAgICpjb2RlOworICAgIHVjaGFyICAgKnA7CisKKyAgICBJbml0UE1Db2RlKCk7CisgICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwICYmIHN0YXRlLT5wbUluZm8zMiAmJiAhc3RhdGUtPk1NSU9TZWwpIHsKKyAgICAgICAgY29kZSA9ICh1Y2hhciopc3RhdGUtPnBtSW5mbzMyICsgc3RhdGUtPnBtSW5mbzMyLT5zZXRXaW5kb3c7CisgICAgICAgIGlmIChzdGF0ZS0+cG1JbmZvMzItPmV4dGVuc2lvblNpZyA9PSBWQkUyMF9FWFRfU0lHKQorICAgICAgICAgICAgbGVuID0gc3RhdGUtPnBtSW5mbzMyLT5zZXRXaW5kb3dMZW4tMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBXZSBhcmUgcnVubmluZyBvbiBhIHN5c3RlbSB3aXRob3V0IHRoZSBVbmlWQkUgNS4yIGV4dGVuc2lvbi4KKyAgICAgICAgICAgICAqIFdlIGRvIGFzIGJlc3Qgd2UgY2FuIGJ5IHNjYW5uaW5nIHRocm91Z2ggdGhlIGNvZGUgZm9yIHRoZQorICAgICAgICAgICAgICogcmV0IGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoLiBUaGlzIGlzIG5vdCBmb29scHJvb2YsCisgICAgICAgICAgICAgKiBidXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwID0gY29kZTsKKyAgICAgICAgICAgIHdoaWxlICgqcCAhPSAweEMzKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGxlbiA9IHAgLSBjb2RlOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoKGxlbiArIHNpemVvZihWQkUyMEFfYmFua0Z1bmMzMl9TdGFydCkgKyBzaXplb2YoVkJFMjBfYmFua0Z1bmMzMl9FbmQpKSA+IHNpemVvZihiYW5rRnVuYzMyKSkKKyAgICAgICAgICAgIFBNX2ZhdGFsRXJyb3IoIjMyLWJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbiB0b28gbG9uZyEiKTsKKyAgICAgICAgY29weShwLGJhbmtGdW5jMzIsVkJFMjBBX2JhbmtGdW5jMzJfU3RhcnQpOworICAgICAgICBtZW1jcHkocCxjb2RlLGxlbik7CisgICAgICAgIHAgKz0gbGVuOworICAgICAgICBjb3B5KHAscCxWQkUyMF9iYW5rRnVuYzMyX0VuZCk7CisgICAgICAgICpjb2RlTGVuID0gcCAtIGJhbmtGdW5jMzI7CisgICAgICAgIGJhbmtGdW5jMzJbVkJFMjBfYWRqdXN0T2Zmc2V0XSA9ICh1Y2hhciliYW5rQWRqdXN0OworICAgICAgICAqYmFua0Z1bmMgPSBiYW5rRnVuYzMyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvY3B1aW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjgyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYwpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKKyogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPE9TLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCit7CisgICAgdGhyZWFkX2lkIHRoaWQgPSBmaW5kX3RocmVhZChOVUxMKTsKKyAgICB0aHJlYWRfaW5mbyB0aW5mbzsKKyAgICBnZXRfdGhyZWFkX2luZm8odGhpZCwgJnRpbmZvKTsKKyAgICBzZXRfdGhyZWFkX3ByaW9yaXR5KHRoaWQsIEJfUkVBTF9USU1FX1BSSU9SSVRZKTsKKyAgICByZXR1cm4gdGluZm8ucHJpb3JpdHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFJlc3RvcmVUaHJlYWRQcmlvcml0eSgKKyAgICBpbnQgcHJpb3JpdHkpCit7CisgICAgdGhyZWFkX2lkIHRoaWQgPSBmaW5kX3RocmVhZChOVUxMKTsKKyAgICBzZXRfdGhyZWFkX3ByaW9yaXR5KHRoaWQsIHByaW9yaXR5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAorICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCit7CisgICAgLy8gVE9ETzogUmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIgaW4gaGVyZS4gWW91IHNob3VsZCB0cnkgdG8KKyAgICAvLyAgICAgICBub3JtYWxpc2UgdGhpcyB2YWx1ZSB0byBiZSBhcm91bmQgMTAwLDAwMCB0aWNrcyBwZXIgc2Vjb25kLgorICAgIGZyZXEtPmxvdyA9IDEwMDAwMDA7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorCitUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byByZWFkIHRoZSBjb3VudGVyLiBJdCBzaG91bGQgYmUgZG9uZSBhcyBhIG1hY3JvCisgICAgICBmb3IgYWNjdXJhY3kuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpIHsgKigoYmlndGltZV90KikgdCkgPSBzeXN0ZW1fdGltZSgpOyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMmNlNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvZXZlbnQuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQmVPUworKgorKiBEZXNjcmlwdGlvbjogIEJlT1MgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCisqICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCitzdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCisjZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKKyNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKKworUkVNQVJLUzoKK1RoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCit0aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQorc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KK3RoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KK2V2ZW50cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIHlvdXIgT1MhCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBtZXNzYWdlIHF1ZXVlIGludG8gb3VyIGV2ZW50IHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCit7CisgICAgLy8gVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UKKyAgICAvLyAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0CisgICAgLy8gICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLgorICAgIC8vCisgICAgLy8gTk9URTogVGhlcmUgYXJlIGEgY291cGxlIG9mIGltcG9ydGFudCB0aGluZ3MgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICAvLyAgICAgICB0YWtlIGNhcmUgb2Y6CisgICAgLy8KKyAgICAvLyAgMS4gU3VwcG9ydCBmb3IgS0VZRE9XTiwgS0VZUkVQRUFUIGFuZCBLRVlVUCBpcyByZXF1aXJlZC4KKyAgICAvLworICAgIC8vICAyLiBTdXBwb3J0IGZvciByZWFkaW5nIGhhcmR3YXJlIHNjYW4gY29kZSBhcyB3ZWxsIGFzIEFTQ0lJCisgICAgLy8gICAgIHRyYW5zbGF0ZWQgdmFsdWVzIGlzIHJlcXVpcmVkLiBHYW1lcyB1c2UgdGhlIHNjYW4gY29kZXMgcmF0aGVyCisgICAgLy8gICAgIHRoYW4gQVNDSUkgdmFsdWVzLiBTY2FuIGNvZGVzIGdvIGludG8gdGhlIGhpZ2ggb3JkZXIgYnl0ZSBvZiB0aGUKKyAgICAvLyAgICAga2V5Ym9hcmQgbWVzc2FnZSBmaWVsZC4KKyAgICAvLworICAgIC8vICAzLiBTdXBwb3J0IGZvciBhdCBsZWFzdCByZWFkaW5nIG1vdXNlIG1vdGlvbiBkYXRhIChtaWNrZXlzKSBmcm9tIHRoZQorICAgIC8vICAgICBtb3VzZSBpcyByZXF1aXJlZC4gVXNpbmcgdGhlIG1pY2tleSB2YWx1ZXMsIHdlIGNhbiB0aGVuIHRyYW5zbGF0ZQorICAgIC8vICAgICB0byBtb3VzZSBjdXJzb3IgY29vcmRpbmF0ZXMgc2NhbGVkIHRvIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudAorICAgIC8vICAgICBncmFwaGljcyBkaXNwbGF5IG1vZGUuIE1vdXNlIHZhbHVlcyBhcmUgc2NhbGVkIGJhc2VkIG9uIHRoZQorICAgIC8vICAgICBnbG9iYWwgJ3JhbmdlWCcgYW5kICdyYW5nZVknLgorICAgIC8vCisgICAgLy8gIDQuIFN1cHBvcnQgZm9yIGEgdGltZXN0YW1wIGZvciB0aGUgZXZlbnRzIGlzIHJlcXVpcmVkLCB3aGljaCBpcworICAgIC8vICAgICBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHNvbWUgZXZlbnQgKHVzdWFsbHkKKyAgICAvLyAgICAgc3lzdGVtIHN0YXJ0dXApLiBUaGlzIGlzIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKKyAgICAvLyAgICAgKGllOiBhdCBpbnRlcnJ1cHQgdGltZSkgbm90IHdoZW4gaXQgd2FzIHN0dWZmIGludG8gdGhlIFNjaVRlY2gKKyAgICAvLyAgICAgZXZlbnQgcXVldWUuCisgICAgLy8KKyAgICAvLyAgNS4gU3VwcG9ydCBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cy4gSWYgdGhlIE9TIGhhcyBhIG5hdGl2ZQorICAgIC8vICAgICBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoaXMsIGl0IHNob3VsZCBiZSB1c2VkLiBPdGhlcndpc2UgdGhlCisgICAgLy8gICAgIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmljIGV2ZW50IGNvZGUKKyAgICAvLyAgICAgdG8gZ2VuZXJhdGUgZG91YmxlIGNsaWNrIGV2ZW50cy4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCitrZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KK2NvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQorQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCitidXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawordG8gdGhlIHJhdyBmb3JtYXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX2Fib3J0KCkKK3sKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOworICAgIGluaXRFdmVudFF1ZXVlKCk7CisgICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7CisKKyAgICAvLyBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gaGVyZQorCisgICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLworICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0NoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCitzcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCittb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKKyAgICBpbnQgeFJlcywKKyAgICBpbnQgeVJlcykKK3sKKyAgICByYW5nZVggPSB4UmVzOworICAgIHJhbmdlWSA9IHlSZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KK2NhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAorYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3Jlc3VtZSh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bworZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9zdXNwZW5kKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitFeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfZXhpdCh2b2lkKQoreworICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCisgICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisgICAgLy8gVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGNsZWFudXAgaW4gaGVyZQorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDIzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL29zaGRyLmgKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQmVPUworKgorKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBUaGlzIGlzIHdoZXJlIHlvdSBpbmNsdWRlIE9TIHNwZWNpZmljIGhlYWRlcnMgZm9yIHRoZSBldmVudCBoYW5kbGluZworLy8gbGlicmFyeS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdkODJhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9wbS5jCkBAIC0wLDAgKzEsNTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBCZU9TCisqCisqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCisqICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCisqICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQorKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCisqICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBUT0RPOiBJbmNsdWRlIGFueSBCZU9TIHNwZWNpZmljIGhlYWRlcnMgaGVyZSEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBEbyBhbnkgaW5pdGlhbGlzYXRpb24gaW4gaGVyZS4gVGhpcyBpbmNsdWRlcyBnZXR0aW5nIElPUEwKKyAgICAvLyAgICAgICBhY2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNhbGxpbmcgUE1faW5pdC4gVGhpcyB3aWxsIGdldCBjYWxsZWQKKyAgICAvLyAgICAgICBtb3JlIHRoYW4gb25jZS4KKworICAgIC8vIFRPRE86IElmIHlvdSBzdXBwb3J0IHRoZSBzdXBwbGllZCBNVFJSIHJlZ2lzdGVyIHN0dWZmICh5b3UgbmVlZCB0bworICAgIC8vICAgICAgIGJlIGF0IHJpbmcgMCBmb3IgdGhpcyEpLCB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgaXQgaW4gaGVyZS4KKworLyogTVRSUl9pbml0KCk7ICovCit9CisKK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7IHJldHVybiBfT1NfQkVPUzsgfQorCitpbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKK3sgcmV0dXJuIFBNXzM4NjsgfQorCit2b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQoreworICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOworICAgIGlmIChzW3Bvcy0xXSAhPSAnLycpIHsKKyAgICAgICAgc1twb3NdID0gJy8nOworICAgICAgICBzW3BvcysxXSA9ICdcMCc7CisgICAgICAgIH0KK30KKwordm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKKyAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCit7CisgICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOworfQorCit2b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICAgIC8vIFRPRE86IElmIHlvdSBhcmUgcnVubmluZyBpbiBhIEdVSSBlbnZpcm9ubWVudCB3aXRob3V0IGEgY29uc29sZSwKKyAgICAvLyAgICAgICB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYnJpbmcgdXAgYSBmYXRhbCBlcnJvciBtZXNzYWdlCisgICAgLy8gICAgICAgYm94IGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uCisgICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQorICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKKyAgICBleGl0KDEpOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQoreworICAgIC8vIE5vIEJJT1MgYWNjZXNzIGZvciB0aGUgQmVPUworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGtleSBpcyBhdmFpbGFibGUgdG8gYmUgcmVhZC4gVGhpcworICAgIC8vICAgICAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCwgYnV0IGlzIG1vc3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHByb2dyYW1zCisgICAgLy8gICAgICAgdGhlc2UgZGF5cy4KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCit7CisgICAgLy8gVE9ETzogVGhpcyByZXR1cm5zIHRoZSBBU0NJSSBjb2RlIG9mIHRoZSBrZXkgcHJlc3NlZC4gVGhpcworICAgIC8vICAgICAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCwgYnV0IGlzIG1vc3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHByb2dyYW1zCisgICAgLy8gICAgICAgdGhlc2UgZGF5cy4KKyAgICByZXR1cm4gMHhEOworfQorCitpbnQgUE1BUEkgUE1fb3BlbkNvbnNvbGUodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBPcGVucyB1cCBhIGZ1bGxzY3JlZW4gY29uc29sZSBmb3IgZ3JhcGhpY3Mgb3V0cHV0LiBJZiB5b3VyCisgICAgLy8gICAgICAgY29uc29sZSBkb2VzIG5vdCBoYXZlIGdyYXBoaWNzL3RleHQgbW9kZXMsIHRoaXMgY2FuIGJlIGxlZnQKKyAgICAvLyAgICAgICBlbXB0eS4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGRpc2FibGUgY29uc29sZSBzd2l0Y2hpbmcKKyAgICAvLyAgICAgICB3aGVuIGluIGdyYXBoaWNzIG1vZGVzIGlmIHlvdSBjYW4gc3dpdGNoIGF3YXkgZnJvbSBmdWxsc2NyZWVuCisgICAgLy8gICAgICAgY29uc29sZXMgKGlmIHlvdSB3YW50IHRvIGFsbG93IHN3aXRjaGluZywgdGhpcyBjYW4gYmUgZG9uZQorICAgIC8vICAgICAgIGVsc2V3aGVyZSB3aXRoIGEgZnVsbCBzYXZlL3Jlc3RvcmUgc3RhdGUgb2YgdGhlIGdyYXBoaWNzIG1vZGUpLgorICAgIHJldHVybiAwOworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQoreworICAgIC8vIFRPRE86IFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIHVzZWQgdG8gc2F2ZSB0aGUKKyAgICAvLyAgICAgICBzdGF0ZSBvZiB0aGUgY29uc29sZSBiZWZvcmUgZ29pbmcgaW50byBncmFwaGljcyBtb2RlLiBUaGlzIGlzCisgICAgLy8gICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixpbnQgY29uc29sZV9pZCkKK3sKKyAgICAvLyBUT0RPOiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgaW50byB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzCisgICAgLy8gICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuCisgICAgLy8gICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MKKyAgICAvLyAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbgorICAgIC8vICAgICAgIGJlIGxlZnQgZW1wdHkuCit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixpbnQgY29uc29sZV9pZCkKK3sKKyAgICAvLyBUT0RPOiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBmcm9tIHRoZSBzdGF0ZSBidWZmZXIuIFRoaXMgaXMKKyAgICAvLyAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4KKyAgICAvLyAgICAgICBXZSB3aWxsIGFsd2F5cyByZXN0b3JlIDgweDI1IHRleHQgbW9kZSBhZnRlciBiZWluZyBpbiBncmFwaGljcworICAgIC8vICAgICAgIG1vZGUsIHNvIGlmIHJlc3RvcmluZyB0ZXh0IG1vZGUgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRoaXMgY2FuCisgICAgLy8gICAgICAgYmUgbGVmdCBlbXB0eS4KK30KKwordm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoaW50IGNvbnNvbGVfaWQpCit7CisgICAgLy8gVE9ETzogQ2xvc2UgdGhlIGNvbnNvbGUgd2hlbiB3ZSBhcmUgZG9uZSwgZ29pbmcgYmFjayB0byB0ZXh0IG1vZGUuCit9CisKK3ZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKK3sKKyAgICAvLyBUT0RPOiBTZXQgdGhlIE9TIGNvbnNvbGUgY3Vyc29yIGxvY2F0aW9uIHRvIHRoZSBuZXcgdmFsdWUuIFRoaXMgaXMKKyAgICAvLyAgICAgICBnZW5lcmFsbHkgdXNlZCBmb3IgbmV3IE9TIHBvcnRzICh1c2VkIG1vc3RseSBmb3IgRE9TKS4KK30KKwordm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQoreworICAgIC8vIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBzY3JlZW4gd2lkdGguIFRoaXMgaXMgZ2VuZXJhbGx5IHVudXNlZCBmb3IKKyAgICAvLyAgICAgICBuZXcgT1MgcG9ydHMuCit9CisKK2lib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgsIGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW5zdGFsbCBhIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4gTm9ybWFsbHkgdGhpcworICAgIC8vICAgICAgIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBmcm9tIG1vc3QgT1MnZXMgaW4gdXNlciBsYW5kLCBzbyBhbgorICAgIC8vICAgICAgIGFsdGVybmF0aXZlIG1lY2hhbmlzbSBpcyBuZWVkZWQgdG8gZW5hYmxlIHNvZnR3YXJlIHN0ZXJlby4KKyAgICAvLyAgICAgICBIZW5jZSBsZWF2ZSB0aGlzIHVuaW1wbGVtZW50ZWQgdW5sZXNzIHlvdSBoYXZlIGEgaGlnaCBwcmlvcml0eQorICAgIC8vICAgICAgIG1lY2hhbmlzbSB0byBjYWxsIHRoZSAzMi1iaXQgY2FsbGJhY2sgd2hlbiB0aGUgcmVhbCB0aW1lIGNsb2NrCisgICAgLy8gICAgICAgaW50ZXJydXB0IGZpcmVzLgorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGZyZXF1ZW5jeS4gVXNlZCBmb3Igc3RlcmVvCisgICAgLy8gICAgICAgTEMgc2h1dHRlciBnbGFzc2VzIHdoZW4gZG9pbmcgc29mdHdhcmUgc3RlcmVvLiBVc3VhbGx5IHNldHMKKyAgICAvLyAgICAgICB0aGUgZnJlcXVlbmN5IHRvIGFyb3VuZCAyMDQ4IEh6LgorfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIC8vIFRPRE86IFJlc3RvcmVzIHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KK30KKworY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAorICAgIGNoYXIgKnBhdGgsCisgICAgaW50IG1heExlbikKK3sKKyAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKK30KKworY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKK3sgcmV0dXJuICcvJzsgfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCit7IHJldHVybiBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpOyB9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIGNoYXIgKmVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIik7CisgICAgcmV0dXJuIGVudiA/IGVudiA6ICIvdXNyL2xpYi9udWNsZXVzIjsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOworICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOworICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoreworICAgIC8vIFRPRE86IFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhlIG1hY2hpbmUuIElmIGEgdW5pcXVlIElEIGlzIG5vdAorICAgIC8vICAgICAgIGF2YWlsYWJsZSwgcmV0dXJuIHRoZSBtYWNoaW5lIG5hbWUuCisgICAgc3RhdGljIGNoYXIgYnVmWzEyOF07CisgICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOworICAgIHJldHVybiBidWY7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoreworICAgIC8vIFRPRE86IFJldHVybiB0aGUgbmV0d29yayBtYWNoaW5lIG5hbWUgZm9yIHRoZSBtYWNoaW5lLgorICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKKyAgICByZXR1cm4gYnVmOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICAvLyBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCit7CisgICAgc3RhdGljIHZvaWQgKmJhbmtQdHI7CisgICAgaWYgKCFiYW5rUHRyKQorICAgICAgICBiYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOworICAgIHJldHVybiBiYW5rUHRyOworfQorCit2b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBtYXBzIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgdG8gYSBsaW5lYXIKKyAgICAvLyAgICAgICBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisKKyAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhYmxlIHRvIGhhbmRsZSBhbnkgcGhzeWljYWwgYmFzZQorICAgIC8vICAgICAgIGFkZHJlc3MsIGFuZCBoZW5jZSB5b3Ugd2lsbCBoYXZlIHRvIGhhbmRsZSByb3VuZGluZyBvZgorICAgIC8vICAgICAgIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgdG8gYSBwYWdlIGJvdW5kYXJ5IChpZTogNEtiIG9uCisgICAgLy8gICAgICAgeDg2IENQVSdzKSB0byBiZSBhYmxlIHRvIHByb3Blcmx5IG1hcCBpbiB0aGUgbWVtb3J5CisgICAgLy8gICAgICAgcmVnaW9uLgorCisgICAgLy8gTk9URTogSWYgcG9zc2libGUgdGhlIGlzQ2FjaGVkIGJpdCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdAorICAgIC8vICAgICAgIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYW5kIFBXVCAoUGFnZSBXcml0ZSBUaHJvdWdoKQorICAgIC8vICAgICAgIGJpdHMgYXJlIHNldCB0byBkaXNhYmxlIGNhY2hpbmcgZm9yIGEgbWVtb3J5IG1hcHBpbmcgdXNlZAorICAgIC8vICAgICAgIGZvciBNTUlPIHJlZ2lzdGVyIGFjY2Vzcy4gV2UgYWxzbyBkaXNhYmxlIGNhY2hpbmcgdXNpbmcKKyAgICAvLyAgICAgICB0aGUgTVRSUiByZWdpc3RlcnMgZm9yIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBjaGlwc2V0cyBzbyBpZgorICAgIC8vICAgICAgIE1UUlIgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB5b3VyIE9TIHRoZW4geW91IGNhbiBzYWZlbHkgaWdub3JlCisgICAgLy8gICAgICAgdGhlIGlzQ2FjaGVkIGZsYWcgYW5kIGFsd2F5cyBlbmFibGUgY2FjaGluZyBpbiB0aGUgcGFnZQorICAgIC8vICAgICAgIHRhYmxlcy4KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHByZXZpb3VzbHkKKyAgICAvLyAgICAgICBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIoKSBpZiBhdCBhbGwgcG9zc2libGUuIElmCisgICAgLy8gICAgICAgeW91IGNhbid0IGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBzaW1wbHkgZG8gbm90aGluZy4KK30KKwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhcgorICAgIC8vICAgICAgIGFkZHJlc3MuCisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKwordm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCit7CisgICAgLy8gVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMKK30KKworaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIC8vIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkKKyAgICAvLyAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuCisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0JDOworICAgICAgICBjYXNlIDE6IHJldHVybiAweDM3ODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgyNzg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCit7CisgICAgLy8gVE9ETzogVGhpcyBpcyB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3MKKyAgICAvLyAgICAgICB0aGF0IGFsbCBhY2Nlc3MgdGhlIGNvbW1vbiBOdWNsZXVzIGRyaXZlcnMgdmlhIGEgY29tbW9uIGRpc3BsYXkKKyAgICAvLyAgICAgICBkcml2ZXIgRExMLiBJZiB5b3VyIE9TIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIG1lbW9yeSAob3IgaWYKKyAgICAvLyAgICAgICB0aGUgZGlzcGxheSBkcml2ZXIgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5CisgICAgLy8gICAgICAgZm9yIGVhY2ggcHJvY2VzcyBhZGRyZXNzIHNwYWNlKSwgdGhpcyBzaG91bGQganVzdCBjYWxsIFBNX21hbGxvYy4KKyAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQoreworICAgIC8vIFRPRE86IEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmxvY2suIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQKKyAgICAvLyAgICAgICBvZiB0aGUgb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHRoYXQgYWxsb2NhdGVkIHRoZSBzaGFyZWQKKyAgICAvLyAgICAgICBtZW1vcnkgd2l0aCBQTV9tYWxsb2NTaGFyZWQuIFNpbXBseSBjYWxsIGZyZWUgaWYgeW91IGRvIG5vdAorICAgIC8vICAgICAgIG5lZWQgdGhpcy4KKyAgICBQTV9mcmVlKHB0cik7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFwIGEgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcKKyAgICAvLyAgICAgICBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIFBNX21hcFBoeXNpY2FsQWRkciBpbnRvIHRoZQorICAgIC8vICAgICAgIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gSWYgdGhlIG1lbW9yeSBtYXBwaW5nCisgICAgLy8gICAgICAgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkciBpcyBnbG9iYWwgdG8gYWxsIHByb2Nlc3NlcywKKyAgICAvLyAgICAgICBzaW1wbHkgcmV0dXJuIHRoZSBwb2ludGVyLgorICAgIHJldHVybiBiYXNlOworfQorCit2b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQoreworICAgIC8vIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQoreworICAgIC8vIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQoreworICAgIC8vIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TCit9CisKK3ZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKK3sKKyAgICAvLyBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUworfQorCitpbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKK3sKKyAgICAvLyBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUworICAgIHJldHVybiAwOworfQorCitpbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgLy8gTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqaW4sCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgLy8gTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MKK30KKwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKK3sKKyAgICAvLyBUT0RPOiBSZXBvcnQgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LCBib3RoIHRoZSBhbW91bnQgb2YKKyAgICAvLyAgICAgICBwaHlzaWNhbCBtZW1vcnkgbGVmdCBhbmQgdGhlIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSBsZWZ0LgorICAgIC8vICAgICAgIElmIHRoZSBPUyBkb2VzIG5vdCBwcm92aWRlIHRoZXNlIHNlcnZpY2VzLCByZXBvcnQgMCdzLgorICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZykKK3sKKyAgICAvLyBUT0RPOiBBbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLyAgICAgICBzaXplLiBUaGlzIGlzIHVzZWQgZm9yIGJ1cyBtYXN0ZXIgb3BlcmF0aW9ucy4gSWYgdGhpcyBpcyBub3QKKyAgICAvLyAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9TLCByZXR1cm4gTlVMTCBhbmQgYnVzIG1hc3RlcmluZyB3aWxsIG5vdAorICAgIC8vICAgICAgIGJlIHVzZWQuCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQoreworICAgIC8vIFRPRE86IEZyZWUgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggUE1fYWxsb2NMb2NrZWRNZW0uCit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspCit7CisgICAgLy8gTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MKK30KKwordm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspCit7CisgICAgLy8gTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MKK30KKwordm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKK3sKKyAgICAvLyBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUworfQorCitpYm9vbCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGVuYWJsZSBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBNVFJSCisgICAgLy8gICAgICAgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgcGFzc2VkIGluIHBoeXNpY2FsIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAgICAvLyAgICAgICBhbmQgbGVuZ3RoLiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgdmlhIGNhbGxzIHRvIGFuIE9TIHNwZWNpZmljCisgICAgLy8gICAgICAgZGV2aWNlIGRyaXZlciBhcyB0aGlzIGNhbiBvbmx5IGJlIGRvbmUgYXQgcmluZyAwLgorICAgIC8vCisgICAgLy8gTk9URTogVGhpcyBpcyBhICp2ZXJ5KiBpbXBvcnRhbnQgZnVuY3Rpb24gdG8gaW1wbGVtZW50ISBJZiB5b3UgZG8KKyAgICAvLyAgICAgICBub3QgaW1wbGVtZW50LCBncmFwaGljcyBwZXJmb3JtYW5jZSBvbiB0aGUgbGF0ZXN0IEludGVsIGNoaXBzCisgICAgLy8gICAgICAgd2lsbCBiZSBzZXZlcmx5IGltcGFpcmVkLiBGb3Igc2FtcGxlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZAorICAgIC8vICAgICAgIGRpcmVjdGx5IGluIGEgcmluZyAwIGRldmljZSBkcml2ZXIsIHNlZSB0aGUgTVNET1MgaW1wbGVtZW50YXRpb24KKyAgICAvLyAgICAgICB3aGljaCBpbmNsdWRlcyBhc3NlbWJsZXIgY29kZSB0byBkbyB0aGlzIGRpcmVjdGx5IChpZiB0aGUKKyAgICAvLyAgICAgICBwcm9ncmFtIGlzIHJ1bm5pbmcgYXQgcmluZyAwKS4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICptYXBwZWRCSU9TKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBydW4gdGhlIEJJT1MgUE9TVCBjb2RlIG9uIGEgc2Vjb25kYXJ5CisgICAgLy8gICAgICAgY29udHJvbGxlciB0byBpbml0aWFsaXNlIGl0IGZvciB1c2UuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeQorICAgIC8vICAgICAgIGZvciBtdWx0aS1jb250cm9sbGVyIG9wZXJhdGlvbiwgYnV0IGl0IHdpbGwgbWFrZSBpdCBhIGxvdAorICAgIC8vICAgICAgIG1vcmUgY29udmVuaWNlbnQgZm9yIGVuZCB1c2VycyAob3RoZXJ3aXNlIHRoZXkgaGF2ZSB0byBib290CisgICAgLy8gICAgICAgdGhlIHN5c3RlbSBvbmNlIHdpdGggdGhlIHNlY29uZGFyeSBjb250cm9sbGVyIGFzIHByaW1hcnksIGFuZAorICAgIC8vICAgICAgIHRoZW4gYm9vdCB3aXRoIGJvdGggY29udHJvbGxlcnMgaW5zdGFsbGVkKS4KKyAgICAvLworICAgIC8vICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHN1cHBvcnQgZnVsbCBCSU9TIGFjY2VzcywgaXQgd291bGQgYmUKKyAgICAvLyAgICAgICBhZHZpc2VhYmxlIHRvIGJlIGFibGUgdG8gUE9TVCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGluIHRoZQorICAgIC8vICAgICAgIHN5c3RlbSB1c2luZyB0aGlzIGZ1bmN0aW9uIGFzIGEgbWluaW11bSByZXF1aXJlbWVudC4gU29tZQorICAgIC8vICAgICAgIGdyYXBoaWNzIGhhcmR3YXJlIGhhcyByZWdpc3RlcnMgdGhhdCBjb250YWluIHZhbHVlcyB0aGF0IG9ubHkKKyAgICAvLyAgICAgICB0aGUgQklPUyBrbm93cyBhYm91dCwgd2hpY2ggbWFrZXMgYnJpbmcgdXAgYSBjYXJkIGZyb20gY29sZAorICAgIC8vICAgICAgIHJlc2V0IGRpZmZpY3VsdCBpZiB0aGUgQklPUyBoYXMgbm90IFBPU1QnZWQgaXQuCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpZmluZERhdGE7CisgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAorICAgIHVsb25nIGhhbmRsZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgKHZvaWQpaGFuZGxlOworICAgICh2b2lkKWZpbmREYXRhOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdWxvbmcgaGFuZGxlKQoreworICAgICh2b2lkKWhhbmRsZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCitmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAordGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCitudW1iZXJpbmcgaXM6CisKKyAgICAxICAgLSBEcml2ZSBBOgorICAgIDIgICAtIERyaXZlIEI6CisgICAgMyAgIC0gRHJpdmUgQzoKKyAgICBldGMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCisgICAgY2hhciBkcml2ZSkKK3sKKyAgICBpZiAoZHJpdmUgPT0gMykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCitVbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKK29mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9nZXRkY3dkKAorICAgIGludCBkcml2ZSwKKyAgICBjaGFyICpkaXIsCisgICAgaW50IGxlbikKK3sKKyAgICAodm9pZClkcml2ZTsKKyAgICBnZXRjd2QoZGlyLGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIHVpbnQgYXR0cmliKQoreworICAgIC8vIFRPRE86IFNldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIGZpbGUKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClhdHRyaWI7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3ZmbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZWYyYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvdmZsYXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKK3sKKyAgICBiYXNlQWRkciA9IGJhc2VBZGRyOworICAgIGJhbmtTaXplID0gYmFua1NpemU7CisgICAgY29kZUxlbiA9IGNvZGVMZW47CisgICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy96dGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYzN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy96dGltZXIuYwpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1pUaW1lckluaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBEbyBhbnkgc3BlY2lmaWMgaW50ZXJuYWwgaW5pdGlhbGlzYXRpb24gaW4gaGVyZQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0xaVGltZXJPbigKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICAvLyBUT0RPOiBTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvIGlmCisgICAgLy8gICAgICAgcG9zc2libGUuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfTFpUaW1lckxhcCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICAvLyBUT0RPOiBDb21wdXRlIHRoZSBsYXAgdGltZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHdoZW4gdGhlCisgICAgLy8gICAgICAgdGltZXIgd2FzIHN0YXJ0ZWQuCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9MWlRpbWVyT2ZmKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIC8vIFRPRE86IFN0b3AgdGhlIHRpbWVyIGNvdW50aW5nLiBTaG91bGQgYmUgYSBtYWNybyBpZiBwb3NzaWJsZS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfTFpUaW1lckNvdW50KAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIC8vIFRPRE86IENvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBhbmQgcmV0dXJuIGl0LiBBbHdheXMgbWljcm9zZWNvbmRzLgorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgLy8gVE9ETzogUmVhZCB0aGUgbG9uZyBwZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MuIFRoZSByZXNvbHV0aW9uIG9mIHRoaXMKKyAgICAvLyAgICAgICB0aW1lciBzaG91bGQgYmUgYXJvdW5kIDEvMjAgb2YgYSBzZWNvbmQgZm9yIHRpbWluZyBsb25nCisgICAgLy8gICAgICAgcGVyaW9kcyBpZiBwb3NzaWJsZS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCit7IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb2RlcGFnZS91c19lbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE4NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIEtleWJvYXJkIHRyYW5zbGF0aW9uIGNvZGUgcGFnZXMgZm9yIFVTIEVuZ2xpc2gga2V5Ym9hcmRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImV2ZW50LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgYWxsIG5vcm1hbCBrZXkgdHJhbnNsYXRpb25zLCBhbmQgaXMgdGhlIGZhbGxiYWNrCisgKiB0YWJsZSBpZiB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiBhbnkgb2YgdGhlIG90aGVyIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLCB0aGUgQVNDSUkgY29kZSBpcyBzZXQgdG8gMCB0bworICogaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBBU0NJSSBjb2RlIGVxdWl2YWxlbnQgZm9yIHRoaXMga2V5LgorICovCitzdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19ub3JtYWxbXSA9IHsKKyAgICB7MHgwMSwgIDB4MUJ9LAorICAgIHsweDAyLCAgJzEnfSwKKyAgICB7MHgwMywgICcyJ30sCisgICAgezB4MDQsICAnMyd9LAorICAgIHsweDA1LCAgJzQnfSwKKyAgICB7MHgwNiwgICc1J30sCisgICAgezB4MDcsICAnNid9LAorICAgIHsweDA4LCAgJzcnfSwKKyAgICB7MHgwOSwgICc4J30sCisgICAgezB4MEEsICAnOSd9LAorICAgIHsweDBCLCAgJzAnfSwKKyAgICB7MHgwQywgICctJ30sCisgICAgezB4MEQsICAnPSd9LAorICAgIHsweDBFLCAgMHgwOH0sCisgICAgezB4MEYsICAweDA5fSwKKyAgICB7MHgxMCwgICdxJ30sCisgICAgezB4MTEsICAndyd9LAorICAgIHsweDEyLCAgJ2UnfSwKKyAgICB7MHgxMywgICdyJ30sCisgICAgezB4MTQsICAndCd9LAorICAgIHsweDE1LCAgJ3knfSwKKyAgICB7MHgxNiwgICd1J30sCisgICAgezB4MTcsICAnaSd9LAorICAgIHsweDE4LCAgJ28nfSwKKyAgICB7MHgxOSwgICdwJ30sCisgICAgezB4MUEsICAnWyd9LAorICAgIHsweDFCLCAgJ10nfSwKKyAgICB7MHgxQywgIDB4MER9LAorICAgIHsweDFFLCAgJ2EnfSwKKyAgICB7MHgxRiwgICdzJ30sCisgICAgezB4MjAsICAnZCd9LAorICAgIHsweDIxLCAgJ2YnfSwKKyAgICB7MHgyMiwgICdnJ30sCisgICAgezB4MjMsICAnaCd9LAorICAgIHsweDI0LCAgJ2onfSwKKyAgICB7MHgyNSwgICdrJ30sCisgICAgezB4MjYsICAnbCd9LAorICAgIHsweDI3LCAgJzsnfSwKKyAgICB7MHgyOCwgICdcJyd9LAorICAgIHsweDI5LCAgJ2AnfSwKKyAgICB7MHgyQiwgICdcXCd9LAorICAgIHsweDJDLCAgJ3onfSwKKyAgICB7MHgyRCwgICd4J30sCisgICAgezB4MkUsICAnYyd9LAorICAgIHsweDJGLCAgJ3YnfSwKKyAgICB7MHgzMCwgICdiJ30sCisgICAgezB4MzEsICAnbid9LAorICAgIHsweDMyLCAgJ20nfSwKKyAgICB7MHgzMywgICcsJ30sCisgICAgezB4MzQsICAnLid9LAorICAgIHsweDM1LCAgJy8nfSwKKyAgICB7MHgzNywgICcqJ30sICAgICAgICAgICAvKiBLZXlwYWQgKi8KKyAgICB7MHgzOSwgICcgJ30sCisgICAgezB4NEEsICAnLSd9LCAgICAgICAgICAgLyogS2V5cGFkICovCisgICAgezB4NEUsICAnKyd9LCAgICAgICAgICAgLyogS2V5cGFkICovCisgICAgezB4NjAsICAweDBEfSwgICAgICAgICAgLyogS2V5cGFkICovCisgICAgezB4NjEsICAnLyd9LCAgICAgICAgICAgLyogS2V5cGFkICovCisgICAgfTsKKworLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciB3aGVuIENBUFNMT0NLIGlzIGFjdGl2ZSBhbmQgdGhlIHNoaWZ0IG9yIGN0cmwKKyAqIGtleXMgYXJlIG5vdCBkb3duLiBJZiB0aGUgY29kZSBpcyBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwgdGhlIG5vcm1hbAorICogdGFibGUgYWJvdmUgaXMgdGhlbiBzZWFyY2hlZC4KKyAqLworc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfY2Fwc1tdID0geworICAgIHsweDEwLCAgJ1EnfSwKKyAgICB7MHgxMSwgICdXJ30sCisgICAgezB4MTIsICAnRSd9LAorICAgIHsweDEzLCAgJ1InfSwKKyAgICB7MHgxNCwgICdUJ30sCisgICAgezB4MTUsICAnWSd9LAorICAgIHsweDE2LCAgJ1UnfSwKKyAgICB7MHgxNywgICdJJ30sCisgICAgezB4MTgsICAnTyd9LAorICAgIHsweDE5LCAgJ1AnfSwKKyAgICB7MHgxRSwgICdBJ30sCisgICAgezB4MUYsICAnUyd9LAorICAgIHsweDIwLCAgJ0QnfSwKKyAgICB7MHgyMSwgICdGJ30sCisgICAgezB4MjIsICAnRyd9LAorICAgIHsweDIzLCAgJ0gnfSwKKyAgICB7MHgyNCwgICdKJ30sCisgICAgezB4MjUsICAnSyd9LAorICAgIHsweDI2LCAgJ0wnfSwKKyAgICB7MHgyQywgICdaJ30sCisgICAgezB4MkQsICAnWCd9LAorICAgIHsweDJFLCAgJ0MnfSwKKyAgICB7MHgyRiwgICdWJ30sCisgICAgezB4MzAsICAnQid9LAorICAgIHsweDMxLCAgJ04nfSwKKyAgICB7MHgzMiwgICdNJ30sCisgICAgfTsKKworLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciB3aGVuIHNoaWZ0IGtleSBpcyBkb3duLCBidXQgdGhlIGN0cmwga2V5IGlzIG5vdAorICogZG93biBhbmQgQ0FQU0xPQ0sgaXMgbm90IGFjdGl2ZS4gSWYgdGhlIGNvZGUgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsCisgKiB0aGUgbm9ybWFsIHRhYmxlIGFib3ZlIGlzIHRoZW4gc2VhcmNoZWQuCisgKi8KK3N0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX3NoaWZ0W10gPSB7CisgICAgezB4MDIsICAnISd9LAorICAgIHsweDAzLCAgJ0AnfSwKKyAgICB7MHgwNCwgICcjJ30sCisgICAgezB4MDUsICAnJCd9LAorICAgIHsweDA2LCAgJyUnfSwKKyAgICB7MHgwNywgICdeJ30sCisgICAgezB4MDgsICAnJid9LAorICAgIHsweDA5LCAgJyonfSwKKyAgICB7MHgwQSwgICcoJ30sCisgICAgezB4MEIsICAnKSd9LAorICAgIHsweDBDLCAgJ18nfSwKKyAgICB7MHgwRCwgICcrJ30sCisgICAgezB4MTAsICAnUSd9LAorICAgIHsweDExLCAgJ1cnfSwKKyAgICB7MHgxMiwgICdFJ30sCisgICAgezB4MTMsICAnUid9LAorICAgIHsweDE0LCAgJ1QnfSwKKyAgICB7MHgxNSwgICdZJ30sCisgICAgezB4MTYsICAnVSd9LAorICAgIHsweDE3LCAgJ0knfSwKKyAgICB7MHgxOCwgICdPJ30sCisgICAgezB4MTksICAnUCd9LAorICAgIHsweDFBLCAgJ3snfSwKKyAgICB7MHgxQiwgICd9J30sCisgICAgezB4MUUsICAnQSd9LAorICAgIHsweDFGLCAgJ1MnfSwKKyAgICB7MHgyMCwgICdEJ30sCisgICAgezB4MjEsICAnRid9LAorICAgIHsweDIyLCAgJ0cnfSwKKyAgICB7MHgyMywgICdIJ30sCisgICAgezB4MjQsICAnSid9LAorICAgIHsweDI1LCAgJ0snfSwKKyAgICB7MHgyNiwgICdMJ30sCisgICAgezB4MjcsICAnOid9LAorICAgIHsweDI4LCAgJyInfSwKKyAgICB7MHgyOSwgICd+J30sCisgICAgezB4MkIsICAnfCd9LAorICAgIHsweDJDLCAgJ1onfSwKKyAgICB7MHgyRCwgICdYJ30sCisgICAgezB4MkUsICAnQyd9LAorICAgIHsweDJGLCAgJ1YnfSwKKyAgICB7MHgzMCwgICdCJ30sCisgICAgezB4MzEsICAnTid9LAorICAgIHsweDMyLCAgJ00nfSwKKyAgICB7MHgzMywgICc8J30sCisgICAgezB4MzQsICAnPid9LAorICAgIHsweDM1LCAgJz8nfSwKKyAgICB9OworCisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHdoZW4gQ0FQU0xPQ0sgaXMgYWN0aXZlIGFuZCB0aGUgc2hpZnQga2V5IGlzCisgKiBkb3duLCBidXQgdGhlIGN0cmwga2V5IGlzIG5vdC4gSWYgdGhlIGNvZGUgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsCisgKiB0aGUgc2hpZnQgdGFibGUgYWJvdmUgaXMgdGhlbiBzZWFyY2hlZC4KKyAqLworc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfc2hpZnRDYXBzW10gPSB7CisgICAgezB4MTAsICAncSd9LAorICAgIHsweDExLCAgJ3cnfSwKKyAgICB7MHgxMiwgICdlJ30sCisgICAgezB4MTMsICAncid9LAorICAgIHsweDE0LCAgJ3QnfSwKKyAgICB7MHgxNSwgICd5J30sCisgICAgezB4MTYsICAndSd9LAorICAgIHsweDE3LCAgJ2knfSwKKyAgICB7MHgxOCwgICdvJ30sCisgICAgezB4MTksICAncCd9LAorICAgIHsweDFFLCAgJ2EnfSwKKyAgICB7MHgxRiwgICdzJ30sCisgICAgezB4MjAsICAnZCd9LAorICAgIHsweDIxLCAgJ2YnfSwKKyAgICB7MHgyMiwgICdnJ30sCisgICAgezB4MjMsICAnaCd9LAorICAgIHsweDI0LCAgJ2onfSwKKyAgICB7MHgyNSwgICdrJ30sCisgICAgezB4MjYsICAnbCd9LAorICAgIHsweDJDLCAgJ3onfSwKKyAgICB7MHgyRCwgICd4J30sCisgICAgezB4MkUsICAnYyd9LAorICAgIHsweDJGLCAgJ3YnfSwKKyAgICB7MHgzMCwgICdiJ30sCisgICAgezB4MzEsICAnbid9LAorICAgIHsweDMyLCAgJ20nfSwKKyAgICB9OworCisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIGFsbCBrZXkgdHJhbnNsYXRpb25zIHdoZW4gdGhlIGN0cmwga2V5IGlzIGRvd24sCisgKiByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgc2hpZnQga2V5IGFuZCBDQVBTTE9DSy4gSWYgdGhlIGNvZGUgaXMKKyAqIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLCB0aGUgQVNDSUkgY29kZSBpcyBzZXQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0CisgKiB0aGVyZSBpcyBubyBBU0NJSSBjb2RlIGVxdWl2YWxlbnQgZm9yIHRoaXMga2V5LgorICovCitzdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19jdHJsW10gPSB7CisgICAgezB4MDEsICAweDFCfSwKKyAgICB7MHgwNiwgIDB4MUV9LAorICAgIHsweDBDLCAgMHgxRn0sCisgICAgezB4MEUsICAweDdGfSwKKyAgICB7MHgxMCwgIDB4MTF9LAorICAgIHsweDExLCAgMHgxN30sCisgICAgezB4MTIsICAweDA1fSwKKyAgICB7MHgxMywgIDB4MTJ9LAorICAgIHsweDE0LCAgMHgxNH0sCisgICAgezB4MTUsICAweDE5fSwKKyAgICB7MHgxNiwgIDB4MTZ9LAorICAgIHsweDE3LCAgMHgwOX0sCisgICAgezB4MTgsICAweDBGfSwKKyAgICB7MHgxOSwgIDB4MTB9LAorICAgIHsweDFBLCAgMHgxQn0sCisgICAgezB4MUIsICAweDFEfSwKKyAgICB7MHgxQywgIDB4MEF9LAorICAgIHsweDFFLCAgMHgwMX0sCisgICAgezB4MUYsICAweDEzfSwKKyAgICB7MHgyMCwgIDB4MDR9LAorICAgIHsweDIxLCAgMHgwNn0sCisgICAgezB4MjIsICAweDA3fSwKKyAgICB7MHgyMywgIDB4MDh9LAorICAgIHsweDI0LCAgMHgwQX0sCisgICAgezB4MjUsICAweDBCfSwKKyAgICB7MHgyNiwgIDB4MEN9LAorICAgIHsweDJCLCAgMHgxQ30sCisgICAgezB4MkMsICAweDFBfSwKKyAgICB7MHgyRCwgIDB4MTh9LAorICAgIHsweDJFLCAgMHgwM30sCisgICAgezB4MkYsICAweDE2fSwKKyAgICB7MHgzMCwgIDB4MDJ9LAorICAgIHsweDMxLCAgMHgwRX0sCisgICAgezB4MzIsICAweDBEfSwKKyAgICB7MHgzOSwgICcgJ30sCisgICAgfTsKKworc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfbnVtUGFkW10gPSB7CisgICAgezB4NEMsICAnNSd9LAorICAgIHsweDYyLCAgJzQnfSwKKyAgICB7MHg2MywgICc2J30sCisgICAgezB4NjQsICAnOCd9LAorICAgIHsweDY1LCAgJzInfSwKKyAgICB7MHg2NiwgICcwJ30sCisgICAgezB4NjcsICAnLid9LAorICAgIHsweDY4LCAgJzcnfSwKKyAgICB7MHg2OSwgICcxJ30sCisgICAgezB4NkEsICAnOSd9LAorICAgIHsweDZCLCAgJzMnfSwKKyAgICB9OworCitjb2RlcGFnZV90IF9DUF9VU19FbmdsaXNoID0geworICAgICJVUyBFbmdsaXNoIiwKKyAgICBVU19ub3JtYWwsICAgICAgRVZUX0FSUl9TSVpFKFVTX25vcm1hbCksCisgICAgVVNfY2FwcywgICAgICAgIEVWVF9BUlJfU0laRShVU19jYXBzKSwKKyAgICBVU19zaGlmdCwgICAgICAgRVZUX0FSUl9TSVpFKFVTX3NoaWZ0KSwKKyAgICBVU19zaGlmdENhcHMsICAgRVZUX0FSUl9TSVpFKFVTX3NoaWZ0Q2FwcyksCisgICAgVVNfY3RybCwgICAgICAgIEVWVF9BUlJfU0laRShVU19jdHJsKSwKKyAgICBVU19udW1QYWQsICAgICAgRVZUX0FSUl9TSVpFKFVTX251bVBhZCksCisgICAgfTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwMGI4YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jCkBAIC0wLDAgKzEsNDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgY29udGFpbmluZyBjb2RlIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fT1MyX1ZERF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB7c2VjcmV0fSAqLworbG9uZyBfVkFSQVBJICAgIF9fX2Rydl9vc190eXBlID0gX09TX1VOU1VQUE9SVEVEOworc3RhdGljIGNoYXIgICAgIGxvY2FsQlBEUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBCUEQgZHJpdmVyIGZpbGVzLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgorb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCit3aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKK2RpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKK3RvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gQnkgZGVmYXVsdCB0aGUgbG9jYWwgQlBEIHBhdGggaXMKK2Fsd2F5cyBzZXQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vdCBpbml0aWFsaXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldExvY2FsQlBEUGF0aCgKKyAgICBjb25zdCBjaGFyICpwYXRoKQoreworICAgIFBNX2luaXQoKTsKKyAgICBzdHJuY3B5KGxvY2FsQlBEUGF0aCxwYXRoLHNpemVvZihsb2NhbEJQRFBhdGgpKTsKKyAgICBsb2NhbEJQRFBhdGhbc2l6ZW9mKGxvY2FsQlBEUGF0aCktMV0gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2JwZHBhdGggICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFjdHVhbCBwYXRoIHRvIHRoZSBmaWxlCitjYWNoZWRwYXRoICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBjYWNoZWQgQlBEIGRyaXZlciBwYXRoCit0cnlwYXRoICAgICAtIFBhdGggdG8gdHJ5IHRvIGZpbmQgdGhlIEJQRCBmaWxlIGluCitzdWJwYXRoICAgICAtIE9wdGlvbmFsIHN1YiBwYXRoIHRvIGFwcGVuZCB0byB0cnlwYXRoCitkbGxuYW1lICAgICAtIE5hbWUgb2YgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgdG8gbG9hZAorCitSRVRVUk5TOgorVHJ1ZSBpZiBmb3VuZCwgZmFsc2UgaWYgbm90LgorCitSRU1BUktTOgorVHJ5cyB0aGUgc3BlY2lmaWVkIHBhdGggdG8gc2VlIGlmIHRoZSBCUEQgZmlsZSBjYW4gYmUgZm91bmQgb3Igbm90LiBJZiBzbywKK3RoZSBwYXRoIHVzZWQgaXMgcmV0dXJuZWQgaW4gYnBkcGF0aCBhbmQgY2FjaGVkcGF0aC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgVHJ5UGF0aCgKKyAgICBjaGFyICpicGRwYXRoLAorICAgIGNoYXIgKmNhY2hlZHBhdGgsCisgICAgY29uc3QgY2hhciAqdHJ5cGF0aCwKKyAgICBjb25zdCBjaGFyICpzdWJwYXRoLAorICAgIGNvbnN0IGNoYXIgKmRsbG5hbWUpCit7CisgICAgY2hhciAgICBmaWxlbmFtZVsyNTZdOworICAgIEZJTEUgICAgKmY7CisKKyAgICBzdHJjcHkoYnBkcGF0aCwgdHJ5cGF0aCk7CisgICAgUE1fYmFja3NsYXNoKGJwZHBhdGgpOworICAgIHN0cmNhdChicGRwYXRoLHN1YnBhdGgpOworICAgIFBNX2JhY2tzbGFzaChicGRwYXRoKTsKKyAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7CisgICAgc3RyY2F0KGZpbGVuYW1lLGRsbG5hbWUpOworICAgIGlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCJyYiIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNhY2hlZHBhdGgpCisgICAgICAgIHN0cmNweShjYWNoZWRwYXRoLGJwZHBhdGgpOworICAgIGZjbG9zZShmKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitUcnVlIGlmIGxvY2FsIG92ZXJyaWRlIGVuYWJsZWQsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK1Rlc3RzIHRvIHNlZSBpZiB0aGUgbG9jYWwgb3ZlcnJpZGUgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBpZiBzbyBpdCB3aWxsCitsb29rIGZvciB0aGUgTnVjbGV1cyBkcml2ZXJzIGluIHRoZSBsb2NhbCBhcHBsaWNhdGlvbiBkaXJlY3RvcmllcyBpbgorcHJlZmVyZW5jZSB0byB0aGUgTnVjbGV1cyBzeXN0ZW0gZGlyZWN0b3JpZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIEdldExvY2FsT3ZlcnJpZGUodm9pZCkKK3sKKyAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVbMjU2XTsKKyAgICBGSUxFICAgICAgICAgICAgKmY7CisgICAgc3RhdGljIGlib29sICAgIGxvY2FsX292ZXJyaWRlID0gLTE7CisKKyAgICBpZiAobG9jYWxfb3ZlcnJpZGUgPT0gLTEpIHsKKyAgICAgICAgbG9jYWxfb3ZlcnJpZGUgPSBmYWxzZTsKKyAgICAgICAgc3RyY3B5KGZpbGVuYW1lLFBNX2dldE51Y2xldXNQYXRoKCkpOworICAgICAgICBQTV9iYWNrc2xhc2goZmlsZW5hbWUpOworICAgICAgICBzdHJjYXQoZmlsZW5hbWUsImdyYXBoaWNzLmluaSIpOworICAgICAgICBpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwiciIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikgJiYgZmdldHMoZmlsZW5hbWUsc2l6ZW9mKGZpbGVuYW1lKSxmKSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJuaWNtcChmaWxlbmFtZSwidXNlbG9jYWwiLDgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfb3ZlcnJpZGUgPSAoKCooZmlsZW5hbWUrOSkgLSAnMCcpID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiBsb2NhbF9vdmVycmlkZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLgorCitIRUFERVI6CitwbWFwaS5oCisKK1BBUkFNRVRFUlM6CitkbGxuYW1lIC0gTmFtZSBvZiB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0byBsb2FkCiticGRwYXRoIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFjdHVhbCBwYXRoIHRvIHRoZSBmaWxlCisKK1JFVFVSTlM6CitUcnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QuCisKK1JFTUFSS1M6CitGaW5kcyB0aGUgbG9jYXRpb24gb2YgYSBzcGVjaWZpYyBCaW5hcnkgUG9ydGFibGUgRExMLCBieSBzZWFyY2hpbmcgYWxsCit0aGUgc3RhbmRhcmQgU2NpVGVjaCBOdWNsZXVzIGRyaXZlciBsb2NhdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZEJQRCgKKyAgICBjb25zdCBjaGFyICpkbGxuYW1lLAorICAgIGNoYXIgKmJwZHBhdGgpCit7CisgICAgc3RhdGljIGNoYXIgY2FjaGVkcGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKKworICAgIC8qIE9uIHRoZSBmaXJzdCBjYWxsIGRldGVybWluZSB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXJzICovCisgICAgaWYgKGNhY2hlZHBhdGhbMF0gPT0gMCkgeworICAgICAgICAvKiBGaXJzdCB0cnkgaW4gdGhlIGdsb2JhbCBzeXN0ZW0gTnVjbGV1cyBkcml2ZXIgcGF0aCBpZgorICAgICAgICAgKiB0aGUgbG9jYWwgb3ZlcnJpZGUgc2V0dGluZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgICAgICovCisgICAgICAgIFBNX2luaXQoKTsKKyAgICAgICAgaWYgKCFHZXRMb2NhbE92ZXJyaWRlKCkpIHsKKyAgICAgICAgICAgIGlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpLCIiLGRsbG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgdHJ5IGluIHRoZSBsb2NhbCBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChsb2NhbEJQRFBhdGhbMF0gIT0gMCkgeworICAgICAgICAgICAgaWYgKFRyeVBhdGgoYnBkcGF0aCxjYWNoZWRwYXRoLGxvY2FsQlBEUGF0aCwiIixkbGxuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKKyAgICAgICAgICAgIGNoYXIgICAgKm1nbF9yb290OworICAgICAgICAgICAgaWYgKChtZ2xfcm9vdCA9IGdldGVudigiTUdMX1JPT1QiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxtZ2xfcm9vdCwiZHJpdmVycyIsZGxsbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgUE1fZ2V0Q3VycmVudFBhdGgoYnBkcGF0aCxQTV9NQVhfUEFUSCk7CisgICAgICAgICAgICBpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsYnBkcGF0aCwiZHJpdmVycyIsZGxsbmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogRmluYWxseSB0cnkgaW4gdGhlIGdsb2JhbCBzeXN0ZW0gcGF0aCBhZ2FpbiBzbyB0aGF0IHdlCisgICAgICAgICAqIHdpbGwgc3RpbGwgZmluZCB0aGUgZHJpdmVycyBpbiB0aGUgZ2xvYmFsIHN5c3RlbSBwYXRoIGlmCisgICAgICAgICAqIHRoZSBsb2NhbCBvdmVycmlkZSBvcHRpb24gaXMgb24sIGJ1dCB0aGUgYXBwbGljYXRpb24gZG9lcworICAgICAgICAgKiBub3QgaGF2ZSBhbnkgbG9jYWwgb3ZlcnJpZGUgZHJpdmVycy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpLCIiLGRsbG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLyogV2hvb3BzLCB3ZSBjYW4ndCBmaW5kIHRoZSBCUEQgZmlsZSEgKi8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAvKiBBbHdheXMgdHJ5IGluIHRoZSBwcmV2aW91c2x5IGRpc2NvdmVyZWQgcGF0aCAqLworICAgIHJldHVybiBUcnlQYXRoKGJwZHBhdGgsTlVMTCxjYWNoZWRwYXRoLCIiLGRsbG5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvcGllcyBhIHN0cmluZyBpbnRvIGFub3RoZXIsIGFuZCByZXR1cm5zIGRlc3QgKyBzdHJsZW4oc3JjKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY2hhciAqX3N0cGNweSgKKyAgICBjaGFyICpfZGVzdCwKKyAgICBjb25zdCBjaGFyICpfc3JjKQoreworICAgIGlmICghX2Rlc3QgfHwgIV9zcmMpCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlICgoKl9kZXN0KysgPSAqX3NyYysrKSAhPSAwKQorICAgICAgICA7CisgICAgcmV0dXJuIC0tX2Rlc3Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29waWVzIGEgc3RyaW5nIGludG8gYW5vdGhlciwgc3RvcHBpbmcgYXQgdGhlIG1heGltdW0gbGVuZ3RoLiBUaGUgc3RyaW5nCitpcyBwcm9wZXJseSB0ZXJtaW5hdGVkICh1bmxpa2Ugc3RybmNweSkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2FmZV9zdHJuY3B5KAorICAgIGNoYXIgKmRzdCwKKyAgICBjb25zdCBjaGFyICpzcmMsCisgICAgdW5zaWduZWQgbWF4bGVuKQoreworICAgIGlmIChkc3QpIHsKKyAgICAgICAgaWYoc3RybGVuKHNyYykgPj0gbWF4bGVuKSB7CisgICAgICAgICAgICBzdHJuY3B5KGRzdCwgc3JjLCBtYXhsZW4pOworICAgICAgICAgICAgZHN0W21heGxlbl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJjcHkoZHN0LCBzcmMpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGV0ZXJtaW5zIGlmIHRoZSBkb3Qgc2VwYXJhdG9yIGlzIHByZXNlbnQgaW4gdGhlIHN0cmluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZpbmREb3QoCisgICAgY2hhciAqcCkKK3sKKyAgICBpZiAoKihwLTEpID09ICcuJykKKyAgICAgICAgcC0tOworICAgIHN3aXRjaCAoKi0tcCkgeworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIGlmICgqKHAtMikgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK01ha2UgYSBmdWxsIHBhdGhuYW1lIGZyb20gc3BsaXQgY29tcG9uZW50cy4KKworSEVBREVSOgorcG1hcGkuaAorCitQQVJBTUVURVJTOgorcGF0aCAgICAtIFBsYWNlIHRvIHN0b3JlIGZ1bGwgcGF0aAorZHJpdmUgICAtIERyaXZlIGNvbXBvbmVudCBmb3IgcGF0aAorZGlyICAgICAtIERpcmVjdG9yeSBjb21wb25lbnQgZm9yIHBhdGgKK25hbWUgICAgLSBGaWxlbmFtZSBjb21wb25lbnQgZm9yIHBhdGgKK2V4dCAgICAgLSBFeHRlbnNpb24gY29tcG9uZW50IGZvciBwYXRoCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBtYWtlIGEgZnVsbCBwYXRobmFtZSBmcm9tIHNwbGl0IGNvbXBvbmVudHMuIFVuZGVyIFVuaXggdGhlCitkcml2ZSBjb21wb25lbnQgd2lsbCB1c3VhbGx5IGJlIGVtcHR5LiBJZiB0aGUgZHJpdmUsIGRpciwgbmFtZSwgb3IgZXh0CitwYXJhbWV0ZXJzIGFyZSBudWxsIG9yIGVtcHR5LCB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgaW4gdGhlIHBhdGggc3RyaW5nLgorT3RoZXJ3aXNlLCBpZiB0aGUgZHJpdmUgZG9lc24ndCBlbmQgd2l0aCBhIGNvbG9uLCBvbmUgaXMgaW5zZXJ0ZWQgaW4gdGhlCitwYXRoLiBJZiB0aGUgZGlyIGRvZXNuJ3QgZW5kIGluIGEgc2xhc2gsIG9uZSBpcyBpbnNlcnRlZCBpbiB0aGUgcGF0aC4KK0lmIHRoZSBleHQgZG9lc24ndCBzdGFydCB3aXRoIGEgZG90LCBvbmUgaXMgaW5zZXJ0ZWQgaW4gdGhlIHBhdGguCisKK1RoZSBtYXhpbXVtIHNpemVzIGZvciB0aGUgcGF0aCBzdHJpbmcgaXMgZ2l2ZW4gYnkgdGhlIGNvbnN0YW50IFBNX01BWF9QQVRILAord2hpY2ggaW5jbHVkZXMgc3BhY2UgZm9yIHRoZSBudWxsLXRlcm1pbmF0b3IuCisKK1NFRSBBTFNPOgorUE1fc3BsaXRQYXRoCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9tYWtlcGF0aCgKKyAgICBjaGFyICpwYXRoLAorICAgIGNvbnN0IGNoYXIgKmRyaXZlLAorICAgIGNvbnN0IGNoYXIgKmRpciwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGNoYXIgKmV4dCkKK3sKKyAgICBpZiAoZHJpdmUgJiYgKmRyaXZlKSB7CisgICAgICAgICpwYXRoKysgPSAqZHJpdmU7CisgICAgICAgICpwYXRoKysgPSAnOic7CisgICAgICAgIH0KKyAgICBpZiAoZGlyICYmICpkaXIpIHsKKyAgICAgICAgcGF0aCA9IF9zdHBjcHkocGF0aCxkaXIpOworICAgICAgICBpZiAoKihwYXRoLTEpICE9ICdcXCcgJiYgKihwYXRoLTEpICE9ICcvJykKKyNpZmRlZiAgX19VTklYX18KKyAgICAgICAgICAgICpwYXRoKysgPSAnLyc7CisjZWxzZQorICAgICAgICAgICAgKnBhdGgrKyA9ICdcXCc7CisjZW5kaWYKKyAgICAgICAgfQorICAgIGlmIChuYW1lKQorICAgICAgICBwYXRoID0gX3N0cGNweShwYXRoLG5hbWUpOworICAgIGlmIChleHQgJiYgKmV4dCkgeworICAgICAgICBpZiAoKmV4dCAhPSAnLicpCisgICAgICAgICAgICAqcGF0aCsrID0gJy4nOworICAgICAgICBwYXRoID0gX3N0cGNweShwYXRoLGV4dCk7CisgICAgICAgIH0KKyAgICAqcGF0aCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1NwbGl0IGEgZnVsbCBwYXRobmFtZSBpbnRvIGNvbXBvbmVudHMuCisKK0hFQURFUjoKK3BtYXBpLmgKKworUEFSQU1FVEVSUzoKK3BhdGggICAgLSBGdWxsIHBhdGggdG8gc3BsaXQKK2RyaXZlICAgLSBEcml2ZSBjb21wb25lbnQgZm9yIHBhdGgKK2RpciAgICAgLSBEaXJlY3RvcnkgY29tcG9uZW50IGZvciBwYXRoCituYW1lICAgIC0gRmlsZW5hbWUgY29tcG9uZW50IGZvciBwYXRoCitleHQgICAgIC0gRXh0ZW5zaW9uIGNvbXBvbmVudCBmb3IgcGF0aAorCitSRVRVUk5TOgorRmxhZ3MgaW5kaWNhdGluZyB3aGF0IGNvbXBvbmVudHMgd2VyZSBwYXJzZWQuCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBzcGxpdCBhIGZ1bGwgcGF0aG1hbWUgaW50byBzZXBhcmF0ZSBjb21wb25lbnRzIGluIHRoZSBmb3JtCisKKyAgICBYOlxESVJcU1VCRElSXE5BTUUuRVhUCisKK2FuZCBzcGxpdHMgcGF0aCBpbnRvIGl0cyBmb3VyIGNvbXBvbmVudHMuIEl0IHRoZW4gc3RvcmVzIHRob3NlIGNvbXBvbmVudHMKK2luIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgZHJpdmUsIGRpciwgbmFtZSBhbmQgZXh0LiAoRWFjaCBjb21wb25lbnQgaXMKK3JlcXVpcmVkIGJ1dCBjYW4gYmUgYSBOVUxMLCB3aGljaCBtZWFucyB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgd2lsbCBiZQorcGFyc2VkIGJ1dCBub3Qgc3RvcmVkKS4KKworVGhlIG1heGltdW0gc2l6ZXMgZm9yIHRoZXNlIHN0cmluZ3MgYXJlIGdpdmVuIGJ5IHRoZSBjb25zdGFudHMgUE1fTUFYX0RSSVZFCithbmQgUE1fTUFYX1BBVEguIFBNX01BWF9EUklWRSBpcyBhbHdheXMgNCwgYW5kIFBNX01BWF9QQVRIIGlzIHVzdWFsbHkgYXQKK2xlYXN0IDI1NiBjaGFyYWN0ZXJzLiBVbmRlciBVbml4IHRoZSBkaXIsIG5hbWUgYW5kIGV4dCBjb21wb25lbnRzIG1heSBiZQordXAgdG8gdGhlIGZ1bGwgcGF0aCBpbiBsZW5ndGguCisKK1NFRSBBTFNPOgorUE1fbWFrZVBhdGgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fc3BsaXRwYXRoKAorICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgY2hhciAqZHJpdmUsCisgICAgY2hhciAqZGlyLAorICAgIGNoYXIgKm5hbWUsCisgICAgY2hhciAqZXh0KQoreworICAgIGNoYXIgICAgKnA7CisgICAgaW50ICAgICB0ZW1wLHJldDsKKyAgICBjaGFyICAgIGJ1ZltQTV9NQVhfUEFUSCsyXTsKKworICAgIC8qIFNldCBhbGwgc3RyaW5nIHRvIGRlZmF1bHQgdmFsdWUgemVybyAqLworICAgIHJldCA9IDA7CisgICAgaWYgKGRyaXZlKSAgKmRyaXZlID0gMDsKKyAgICBpZiAoZGlyKSAgICAqZGlyID0gMDsKKyAgICBpZiAobmFtZSkgICAqbmFtZSA9IDA7CisgICAgaWYgKGV4dCkgICAgKmV4dCA9IDA7CisKKyAgICAvKiBDb3B5IGZpbGVuYW1lIGludG8gdGVtcGxhdGUgdXAgdG8gUE1fTUFYX1BBVEggY2hhcmFjdGVycyAqLworICAgIHAgPSBidWY7CisgICAgaWYgKCh0ZW1wID0gc3RybGVuKHBhdGgpKSA+IFBNX01BWF9QQVRIKQorICAgICAgICB0ZW1wID0gUE1fTUFYX1BBVEg7CisgICAgKnArKyA9IDA7CisgICAgc3RybmNweShwLCBwYXRoLCB0ZW1wKTsKKyAgICAqKHAgKz0gdGVtcCkgPSAwOworCisgICAgLyogU3BsaXQgdGhlIGZpbGVuYW1lIGFuZCBmaWxsIGNvcnJlc3BvbmRpbmcgbm9uemVybyBwb2ludGVycyAqLworICAgIHRlbXAgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3dpdGNoICgqLS1wKSB7CisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgICAgICBpZiAoIXRlbXAgJiYgKCoocCsxKSA9PSAnXDAnKSkKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGZpbmREb3QocCk7CisgICAgICAgICAgICAgICAgaWYgKCghdGVtcCkgJiYgKChyZXQgJiBQTV9IQVNfRVhURU5TSU9OKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICByZXQgfD0gUE1fSEFTX0VYVEVOU0lPTjsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJuY3B5KGV4dCwgcCwgUE1fTUFYX1BBVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgKnAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgICAgICBpZiAocCAhPSAmYnVmWzJdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgICAgICBpZiAodGVtcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKisrcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCB8PSBQTV9IQVNfRElSRUNUT1JZOworICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cm5jcHkoZGlyLCBwLCBQTV9NQVhfUEFUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICAqcC0tID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIGlmICghdGVtcCkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgICAgIGlmICgqKytwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0IHw9IFBNX0hBU19GSUxFTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJuY3B5KG5hbWUsIHAsIFBNX01BWF9QQVRIIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICpwLS0gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoKnAgPT0gMCB8fCAoKnAgPT0gJzonICYmIHAgPT0gJmJ1ZlsyXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICBpZiAoIXRlbXApCisgICAgICAgICAgICAgICAgICAgIHJldCB8PSBQTV9IQVNfV0lMRENBUkRTOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBpZiAoKnAgPT0gJzonKSB7CisgICAgICAgIGlmIChidWZbMV0pCisgICAgICAgICAgICByZXQgfD0gUE1fSEFTX0RSSVZFOworICAgICAgICBzYWZlX3N0cm5jcHkoZHJpdmUsICZidWZbMV0sIFBNX01BWF9EUklWRSAtIDEpOworICAgICAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQmxvY2sgdW50aWwgYSBzcGVjaWZpYyB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwKKworSEVBREVSOgorcG1hcGkuaAorCitQQVJBTUVURVJTOgorbWlsbGlzZWNvbmRzICAgIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmb3IgZGVsYXkKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB0aGUgY2FsbGluZyB0aHJlYWQgb3IgcHJvY2VzcyB1bnRpbCB0aGUgc3BlY2lmaWVkCitudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhdmUgcGFzc2VkIHNpbmNlIHRoZSAvbGFzdC8gY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorVGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBPbgorc3Vic3F1ZW50IGNhbGxzIGl0IHdpbGwgYmxvY2sgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIGhhcyBlbGFwc2VkLCBvciBpdAord2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHRpbWUgaGFzIGFscmVhZHkgZWxhcHNlZC4KKworVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gcHJvdmlkZSBjb25zdGFudCB0aW1lIGZ1bmN0aW9uYWxpdHkgaW4gYQorcHJvZ3JhbSwgc3VjaCBhcyBhIGZyYW1lIHJhdGUgbGltaXRlciBmb3IgZ3JhcGhpY3MgYXBwbGljYXRpb25zIGV0Yy4KKworU0VFIEFMU086CitQTV9zbGVlcAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYmxvY2tVbnRpbFRpbWVvdXQoCisgICAgdWxvbmcgbWlsbGlzZWNvbmRzKQoreworICAgIHVsb25nICAgICAgICAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAqIDEwMDBMLG1zRGVsYXk7CisgICAgc3RhdGljIExaVGltZXJPYmplY3QgICAgdG07CisgICAgc3RhdGljIGlib29sICAgICAgICAgICAgZmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgIExaVGltZXJPbkV4dCgmdG0pOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICgobXNEZWxheSA9IChtaWNyb3NlY29uZHMgLSBMWlRpbWVyTGFwRXh0KCZ0bSkpIC8gMTAwMEwpID4gMCkKKyAgICAgICAgICAgIFBNX3NsZWVwKG1zRGVsYXkpOworICAgICAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQorICAgICAgICAgICAgOworICAgICAgICBMWlRpbWVyT2ZmRXh0KCZ0bSk7CisgICAgICAgIExaVGltZXJPbkV4dCgmdG0pOworICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2NwdWluZm8uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGViZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbQpAQCAtMCwwICsxLDYwMCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgTkFTTSBvciBUQVNNIEFzc2VtYmxlcgorOyogRW52aXJvbm1lbnQ6IEludGVsIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KKzsqCis7KiBEZXNjcmlwdGlvbjogQ29kZSB0byBkZXRlcm1pbmUgdGhlIEludGVsIHByb2Nlc3NvciB0eXBlLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiCisKK2hlYWRlciAgICAgIF9jcHVpbmZvCisKK2JlZ2RhdGFzZWcgIF9jcHVpbmZvICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgZGF0YSBzZWdtZW50CisKK2NhY2hlX2lkICAgIGRiICAiMDEyMzQ1Njc4OTAxMjM0NTYiCitpbnRlbF9pZCAgICBkYiAgIkdlbnVpbmVJbnRlbCIgICAgICA7IEludGVsIHZlbmRvciBJRAorY3lyaXhfaWQgICAgZGIgICJDeXJpeEluc3RlYWQiICAgICAgOyBDeXJpeCB2ZW5kb3IgSUQKK2FtZF9pZCAgICAgIGRiICAiQXV0aGVudGljQU1EIiAgICAgIDsgQU1EIHZlbmRvciBJRAoraWR0X2lkICAgICAgZGIgICJDZW50YXVySGF1bHMiICAgICAgOyBJRFQgdmVuZG9yIElECisKK0NQVV9JRFQgICAgIEVRVSAwMTAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgSURUIHByb2Nlc3NvcnMKK0NQVV9DeXJpeCAgIEVRVSAwMjAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgQ3lyaXggcHJvY2Vzc29ycworQ1BVX0FNRCAgICAgRVFVIDA0MDAwaCAgICAgICAgICAgICAgOyBGbGFnIGZvciBBTUQgcHJvY2Vzc29ycworQ1BVX0ludGVsICAgRVFVIDA4MDAwaCAgICAgICAgICAgICAgOyBGbGFnIGZvciBJbnRlbCBwcm9jZXNzb3JzCisKK2VuZGRhdGFzZWcgIF9jcHVpbmZvCisKK2JlZ2NvZGVzZWcgIF9jcHVpbmZvICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKK2lmZGVmICAgVVNFX05BU00KKyVtYWNybyBtQ1BVX0lEIDAKK2RiICAwMEZoLDBBMmgKKyVlbmRtYWNybworZWxzZQorTUFDUk8gICBtQ1BVX0lECitkYiAgMDBGaCwwQTJoCitFTkRNCitlbmRpZgorCitpZmRlZiAgIFVTRV9OQVNNCislbWFjcm8gbVJEVFNDIDAKK2RiICAwMEZoLDAzMWgKKyVlbmRtYWNybworZWxzZQorTUFDUk8gICBtUkRUU0MKK2RiICAwMEZoLDAzMWgKK0VORE0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGJvb2wgX0NQVV9jaGVjazgwMzg2KHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEZXRlcm1pbmVzIGlmIHdlIGhhdmUgYW4gaTM4NiBwcm9jZXNzb3IuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9jaGVjazgwMzg2CisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIHhvciAgICAgZWR4LGVkeCAgICAgICAgICAgICA7IEVEWCA9IDAsIG5vdCBhbiA4MDM4NgorICAgICAgICBtb3YgICAgIGJ4LCBzcAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBhbmQgICAgIHNwLCB+MworZWxzZQorICAgICAgICBhbmQgICAgIHNwLCBub3QgMworZW5kaWYKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgUHVzaCBvcmlnaW5hbCBFRkxBR1MKKyAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUworICAgICAgICBtb3YgICAgIGVjeCwgZWF4ICAgICAgICAgICAgOyBTYXZlIG9yaWdpbmFsIEVGTEFHUworICAgICAgICB4b3IgICAgIGVheCwgNDAwMDBoICAgICAgICAgOyBGbGlwIEFDIGJpdCBpbiBFRkxBR1MKKyAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgc3RhY2sKKyAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQorICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUworICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAorICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4ndCB0b2dnbGUgQUMgYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIHByb2Nlc3Nvcj04MDM4NgorICAgICAgICBqbnogICAgIEBARG9uZSAgICAgICAgICAgICAgOyBKdW1wIGlmIG5vdCBhbiA4MDM4NiBwcm9jZXNzb3IKKyAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgIDsgV2UgaGF2ZSBhbiA4MDM4NgorCitAQERvbmU6IHB1c2ggICAgZWN4CisgICAgICAgIHBvcGZkCisgICAgICAgIG1vdiAgICAgc3AsIGJ4CisgICAgICAgIG1vdiAgICAgZWF4LCBlZHgKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgYm9vbCBfQ1BVX2NoZWNrODA0ODYodm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERldGVybWluZXMgaWYgd2UgaGF2ZSBhbiBpNDg2IHByb2Nlc3Nvci4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrODA0ODYKKworICAgICAgICBlbnRlcl9jCisKKzsgRGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgaTQ4NiBhbmQgUGVudGl1bSBieSB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIElEIGZsYWcKKzsgaW4gdGhlIEVGTEFHUyByZWdpc3Rlci4gSWYgdGhlIElEIGZsYWcgaXMgc2V0LCB0aGVuIHdlIGNhbiB1c2UgdGhlIENQVUlECis7IGluc3RydWN0aW9uIHRvIGRldGVybWluZSB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgY2hpcC4gT3RoZXJ3aXNlIHdlCis7IHNpbXBseSBoYXZlIGFuIDgwNDg2LgorCis7IERpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGk0ODYgYW5kIFBlbnRpdW0gYnkgdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSBJRCBmbGFnCis7IGluIHRoZSBFRkxBR1MgcmVnaXN0ZXIuIElmIHRoZSBJRCBmbGFnIGlzIHNldCwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBDUFVJRAorOyBpbnN0cnVjdGlvbiB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIGNoaXAuIE90aGVyd2lzZSB3ZQorOyBzaW1wbHkgaGF2ZSBhbiA4MDQ4Ni4KKworICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgb3JpZ2luYWwgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIG1vdiAgICAgZWN4LCBlYXgKKyAgICAgICAgeG9yICAgICBlYXgsIDIwMDAwMGggICAgICAgIDsgRmxpcCBJRCBiaXQgaW4gRUZMQUdTCisgICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaworICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCisgICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBuZXcgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCisgICAgICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgICAgICA7IENhbiBub3QgdG9nZ2xlIElEIGJpdCwKKyAgICAgICAgam56ICAgICBAQDEgICAgICAgICAgICAgICAgIDsgUHJvY2Vzc29yPTgwNDg2CisgICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSBhIFBlbnRpdW0KKyAgICAgICAgam1wICAgICBAQERvbmUKK0BAMTogICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgICAgIDsgV2UgaGF2ZSBQZW50aXVtIG9yIGxhdGVyCitAQERvbmU6IGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGJvb2wgX0NQVV9jaGVja0Nsb25lKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDaGVja3MgaWYgdGhlIGkzODYgb3IgaTQ4NiBwcm9jZXNzb3IgaXMgYSBjbG9uZSBvciBnZW51aW5lIEludGVsLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfY2hlY2tDbG9uZQorCisgICAgICAgIGVudGVyX2MKKworICAgICAgICBtb3YgICAgIGF4LDU1NTVoICAgICAgICAgICAgOyBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpcyBhIDMyLWJpdCBwcm9jZXNzb3IKKyAgICAgICAgeG9yICAgICBkeCxkeAorICAgICAgICBtb3YgICAgIGN4LDJoCisgICAgICAgIGRpdiAgICAgY3ggICAgICAgICAgICAgICAgICA7IFBlcmZvcm0gRGl2aXNpb24KKyAgICAgICAgY2xjCisgICAgICAgIGpueiAgICAgQEBOb0Nsb25lCisgICAgICAgIGptcCAgICAgQEBDbG9uZQorQEBOb0Nsb25lOgorICAgICAgICBzdGMKK0BAQ2xvbmU6CisgICAgICAgIHB1c2hmZAorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBHZXQgdGhlIGZsYWdzCisgICAgICAgIGFuZCAgICAgZWF4LDEKKyAgICAgICAgeG9yICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgRUFYPTAgaXMgcHJvYmFibHkgSW50ZWwsIEVBWD0xIGlzIGEgQ2xvbmUKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBib29sIF9DUFVfaGF2ZUNQVUlEKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEZXRlcm1pbmVzIGlmIHdlIGhhdmUgc3VwcG9ydCBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfaGF2ZUNQVUlECisKKyAgICAgICAgZW50ZXJfYworCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUworICAgICAgICBwb3AgICAgIGVheAorICAgICAgICBtb3YgICAgIGVjeCwgZWF4CisgICAgICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgICAgICA7IEZsaXAgSUQgYml0IGluIEVGTEFHUworICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKKyAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQorICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUworICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAorICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4gbm90IHRvZ2dsZSBJRCBiaXQsCisgICAgICAgIGpueiAgICAgQEAxICAgICAgICAgICAgICAgICA7IFByb2Nlc3Nvcj04MDQ4NgorICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgQ1BVSUQgc3VwcG9ydAorICAgICAgICBqbXAgICAgIEBARG9uZQorQEAxOiAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBXZSBoYXZlIENQVUlEIHN1cHBvcnQKK2Vsc2UKKyAgICAgICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgICAgIDsgQ1BVSUQgcmVxdWlyZXMgMzItYml0IHBtb2RlCitlbmRpZgorQEBEb25lOiBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1aW50IF9DUFVfY2hlY2tDUFVJRCh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfY2hlY2tDUFVJRAorCisgICAgICAgIGVudGVyX2MKKworICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCisgICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKKyAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECisgICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgICAgIDsgQXNzdW1lIHZlbmRvciBpcyB1bmtub3duCisKKzsgQ2hlY2sgZm9yIEdlbnVpbmVJbnRlbCBwcm9jZXNzb3JzCisKKyAgICAgICAgTEVBX0wgICBlc2ksaW50ZWxfaWQKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpXSwgZWJ4CisgICAgICAgIGpuZSAgICAgQEBOb3RJbnRlbAorICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krNF0sIGVkeAorICAgICAgICBqbmUgICAgIEBATm90SW50ZWwKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzhdLCBlY3gKKyAgICAgICAgam5lICAgICBAQE5vdEludGVsCisgICAgICAgIG1vdiAgICAgZWF4LENQVV9JbnRlbCAgICAgICA7IEZsYWcgdGhhdCB3ZSBoYXZlIEdlbnVpbmVJbnRlbAorICAgICAgICBqbXAgICAgIEBARm91bmRWZW5kb3IKKworOyBDaGVjayBmb3IgQ3lyaXhJbnN0ZWFkIHByb2Nlc3NvcnMKKworQEBOb3RJbnRlbDoKKyAgICAgICAgTEVBX0wgICBlc2ksY3lyaXhfaWQKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpXSwgZWJ4CisgICAgICAgIGpuZSAgICAgQEBOb3RDeXJpeAorICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krNF0sIGVkeAorICAgICAgICBqbmUgICAgIEBATm90Q3lyaXgKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzhdLCBlY3gKKyAgICAgICAgam5lICAgICBAQE5vdEN5cml4CisgICAgICAgIG1vdiAgICAgZWF4LENQVV9DeXJpeCAgICAgICA7IEZsYWcgdGhhdCB3ZSBoYXZlIEN5cml4SW5zdGVhZAorICAgICAgICBqbXAgICAgIEBARm91bmRWZW5kb3IKKworOyBDaGVjayBmb3IgQXV0aGVudGljQU1EIHByb2Nlc3NvcnMKKworQEBOb3RDeXJpeDoKKyAgICAgICAgTEVBX0wgICBlc2ksYW1kX2lkCisgICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAorICAgICAgICBqbmUgICAgIEBATm90QU1ECisgICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs0XSwgZWR4CisgICAgICAgIGpuZSAgICAgQEBOb3RBTUQKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzhdLCBlY3gKKyAgICAgICAgam5lICAgICBAQE5vdEFNRAorICAgICAgICBtb3YgICAgIGVheCxDUFVfQU1EICAgICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBBdXRoZW50aWNBTUQKKyAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCisKKzsgQ2hlY2sgZm9yIENlbnRhdXJIYXVscyBwcm9jZXNzb3JzCisKK0BATm90QU1EOgorICAgICAgICBMRUFfTCAgIGVzaSxpZHRfaWQKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpXSwgZWJ4CisgICAgICAgIGpuZSAgICAgQEBOb3RJRFQKKyAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKKyAgICAgICAgam5lICAgICBAQE5vdElEVAorICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krOF0sIGVjeAorICAgICAgICBqbmUgICAgIEBATm90SURUCisgICAgICAgIG1vdiAgICAgZWF4LENQVV9JRFQgICAgICAgICA7IEZsYWcgdGhhdCB3ZSBoYXZlIEF1dGhlbnRpY0lEVAorICAgICAgICBqbXAgICAgIEBARm91bmRWZW5kb3IKKworQEBOb3RJRFQ6CisKK0BARm91bmRWZW5kb3I6CisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIHhvciAgICAgZWF4LCBlYXgKKyAgICAgICAgaW5jICAgICBlYXgKKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcworICAgICAgICBhbmQgICAgIGVheCwgMEYwMGgKKyAgICAgICAgc2hyICAgICBlYXgsIDggICAgICAgICAgICAgIDsgSXNvbGF0ZSBmYW1pbHkKKyAgICAgICAgYW5kICAgICBlYXgsIDBGaAorICAgICAgICBwb3AgICAgIGVjeAorICAgICAgICBvciAgICAgIGVheCxlY3ggICAgICAgICAgICAgOyBDb21iaW5lIGluIHRoZSBjbG9uZSBmbGFnCitAQERvbmU6IGxlYXZlX2MKKyAgICAgICAgcmV0CisKK0BARmFpbDogeG9yICAgICBlYXgsZWF4CisgICAgICAgIGptcCAgICAgQEBEb25lCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVpbnQgX0NQVV9nZXRDUFVJRE1vZGVsKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9nZXRDUFVJRE1vZGVsCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAorICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKKyAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgorICAgICAgICB4b3IgICAgIGVheCwgZWF4CisgICAgICAgIGluYyAgICAgZWF4CisgICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKKyAgICAgICAgYW5kICAgICBlYXgsIDBGMGgKKyAgICAgICAgc2hyICAgICBlYXgsIDQgICAgICAgICAgICAgIDsgSXNvbGF0ZSBtb2RlbAorQEBEb25lOiBsZWF2ZV9jCisgICAgICAgIHJldAorCitAQEZhaWw6IHhvciAgICAgZWF4LGVheAorICAgICAgICBqbXAgICAgIEBARG9uZQorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1aW50IF9DUFVfZ2V0Q1BVSURTdGVwcGluZyh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfZ2V0Q1BVSURTdGVwcGluZworCisgICAgICAgIGVudGVyX2MKKworICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCisgICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKKyAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECisgICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgeG9yICAgICBlYXgsIGVheAorICAgICAgICBpbmMgICAgIGVheAorICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCisgICAgICAgIGFuZCAgICAgZWF4LCAwMEZoICAgICAgICAgICA7IElzb2xhdGUgc3RlcHBpbmcKK0BARG9uZTogbGVhdmVfYworICAgICAgICByZXQKKworQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKKyAgICAgICAgam1wICAgICBAQERvbmUKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWludCBfQ1BVX2dldENQVUlERmVhdHVyZXModm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfQ1BVX2dldENQVUlERmVhdHVyZXMKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgorICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECisgICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAorICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCisgICAgICAgIHhvciAgICAgZWF4LCBlYXgKKyAgICAgICAgaW5jICAgICBlYXgKKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcworICAgICAgICBtb3YgICAgIGVheCwgZWR4CitAQERvbmU6IGxlYXZlX2MKKyAgICAgICAgcmV0CisKK0BARmFpbDogeG9yICAgICBlYXgsZWF4CisgICAgICAgIGptcCAgICAgQEBEb25lCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVpbnQgX0NQVV9nZXRDYWNoZVNpemUodm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERldGVybWluZXMgdGhlIENQVSBjYWNoZSBzaXplIGZvciBJbnRlbCBwcm9jZXNzb3JzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9nZXRDYWNoZVNpemUKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAorICAgICAgICBjbXAgICAgIGVheCwyICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMiBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKKyAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgorICAgICAgICBtb3YgICAgIGVheCwyCisgICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBjYWNoZSBkZXNjcmlwdG9ycworICAgICAgICBMRUFfTCAgIGVzaSxjYWNoZV9pZCAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBjYWNoZSBJRCAoLWZQSUMgYXdhcmUpCisgICAgICAgIHNociAgICAgZWF4LDgKKyAgICAgICAgbW92ICAgICBbZXNpKzBdLGVheAorICAgICAgICBtb3YgICAgIFtlc2krM10sZWJ4CisgICAgICAgIG1vdiAgICAgW2VzaSs3XSxlY3gKKyAgICAgICAgbW92ICAgICBbZXNpKzExXSxlZHgKKyAgICAgICAgeG9yICAgICBlYXgsZWF4CisgICAgICAgIExFQV9MICAgZXNpLGNhY2hlX2lkICAgICAgICA7IEdldCBhZGRyZXNzIG9mIGNhY2hlIElEICgtZlBJQyBhd2FyZSkKKyAgICAgICAgbW92ICAgICBlZGksMTUKK0BAU2Nhbkxvb3A6CisgICAgICAgIGNtcCAgICAgW0JZVEUgZXNpXSw0MWgKKyAgICAgICAgbW92ICAgICBlYXgsMTI4CisgICAgICAgIGplICAgICAgQEBEb25lCisgICAgICAgIGNtcCAgICAgW0JZVEUgZXNpXSw0MmgKKyAgICAgICAgbW92ICAgICBlYXgsMjU2CisgICAgICAgIGplICAgICAgQEBEb25lCisgICAgICAgIGNtcCAgICAgW0JZVEUgZXNpXSw0M2gKKyAgICAgICAgbW92ICAgICBlYXgsNTEyCisgICAgICAgIGplICAgICAgQEBEb25lCisgICAgICAgIGNtcCAgICAgW0JZVEUgZXNpXSw0NGgKKyAgICAgICAgbW92ICAgICBlYXgsMTAyNAorICAgICAgICBqZSAgICAgIEBARG9uZQorICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDVoCisgICAgICAgIG1vdiAgICAgZWF4LDIwNDgKKyAgICAgICAgamUgICAgICBAQERvbmUKKyAgICAgICAgaW5jICAgICBlc2kKKyAgICAgICAgZGVjICAgICBlZGkKKyAgICAgICAgam56ICAgICBAQFNjYW5Mb29wCisKK0BARG9uZTogbGVhdmVfYworICAgICAgICByZXQKKworQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKKyAgICAgICAgam1wICAgICBAQERvbmUKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWludCBfQ1BVX2hhdmUzRE5vdyh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfaGF2ZTNETm93CisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAwaCAgICAgICA7IFF1ZXJ5IGZvciBleHRlbmRlZCBmdW5jdGlvbnMKKyAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGV4dGVuZGVkIGZ1bmN0aW9uIGxpbWl0CisgICAgICAgIGNtcCAgICAgZWF4LDgwMDAwMDAxaAorICAgICAgICBqYmUgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBOb3BlLCB3ZSBkb250IGhhdmUgZnVuY3Rpb24gODAwMDAwMDAxaAorICAgICAgICBtb3YgICAgIGVheCw4MDAwMDAwMWggICAgICAgOyBTZXR1cCBleHRlbmRlZCBmdW5jdGlvbiA4MDAwMDAwMDFoCisgICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IGFuZCBnZXQgdGhlIGluZm9ybWF0aW9uCisgICAgICAgIHRlc3QgICAgZWR4LDgwMDAwMDAwaCAgICAgICA7IEJpdCAzMSBpcyBzZXQgaWYgM0ROb3chIHByZXNlbnQKKyAgICAgICAganogICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgTm9wZSwgd2UgZG9udCBoYXZlIDNETm93IHN1cHBvcnQKKyAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgWWVwLCB3ZSBoYXZlIDNETm93ISBzdXBwb3J0IQorQEBEb25lOiBsZWF2ZV9jCisgICAgICAgIHJldAorCitAQEZhaWw6IHhvciAgICAgZWF4LGVheAorICAgICAgICBqbXAgICAgIEBARG9uZQorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1bG9uZyBfQ1BVX3F1aWNrUkRUU0Modm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWRzIHRoZSB0aW1lIHN0YW1wIGNvdW50ZXIgYW5kIHJldHVybnMgdGhlIGxvdyBvcmRlciAzMi1iaXRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9xdWlja1JEVFNDCisKKyAgICAgICAgbVJEVFNDCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIF9DUFVfcnVuQlNGTG9vcCh1bG9uZyBpbnRlcmF0aW9ucykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJ1bnMgYSBsb29wIG9mIEJTRiBpbnN0cnVjdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfQ1BVX3J1bkJTRkxvb3AKKworICAgICAgICBBUkcgICAgIGl0ZXJhdGlvbnM6VUxPTkcKKworICAgICAgICBwdXNoICAgIF9icAorICAgICAgICBtb3YgICAgIF9icCxfc3AKKyAgICAgICAgcHVzaCAgICBfYngKKworICAgICAgICBtb3YgICAgIGVkeCxbaXRlcmF0aW9uc10KKyAgICAgICAgbW92ICAgICBlYXgsODAwMDAwMDBoCisgICAgICAgIG1vdiAgICAgZWJ4LGVkeAorCisgICAgICAgIEFMSUdOICAgNAorCitAQGxvb3A6IGJzZiAgICAgZWN4LGVheAorICAgICAgICBkZWMgICAgIGVieAorICAgICAgICBqbnogICAgIEBAbG9vcAorCisgICAgICAgIHBvcCAgICAgX2J4CisgICAgICAgIHBvcCAgICAgX2JwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkICBfQ1BVX3JlYWRUaW1lU3RhbXAoQ1BVX2xhcmdlSW50ZWdlciAqdGltZSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkcyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSA2NC1iaXQgcmVzdWx0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfcmVhZFRpbWVTdGFtcAorCisgICAgICAgIG1SRFRTQworICAgICAgICBtb3YgICAgIGVjeCxbZXNwKzRdICAgICA7IEFjY2VzcyBkaXJlY3RseSB3aXRob3V0IHN0YWNrIGZyYW1lCisgICAgICAgIG1vdiAgICAgW2VjeF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVsb25nIF9DUFVfZGlmZlRpbWU2NChDUFVfbGFyZ2VJbnRlZ2VyICp0MSxDUFVfbGFyZ2VJbnRlZ2VyICp0MixDUFVfbGFyZ2VJbnRlZ2VyICp0KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gNjQtYml0IG51bWJlcnMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9kaWZmVGltZTY0CisKKyAgICAgICAgQVJHICAgICB0MTpEUFRSLCB0MjpEUFRSLCB0OkRQVFIKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBlY3gsW3QyXQorICAgICAgICBtb3YgICAgIGVheCxbZWN4XSAgICAgICA7IEVBWCA6PSB0Mi5sb3cKKyAgICAgICAgbW92ICAgICBlY3gsW3QxXQorICAgICAgICBzdWIgICAgIGVheCxbZWN4XQorICAgICAgICBtb3YgICAgIGVkeCxlYXggICAgICAgICA7IEVEWCA6PSBsb3cgZGlmZmVyZW5jZQorICAgICAgICBtb3YgICAgIGVjeCxbdDJdCisgICAgICAgIG1vdiAgICAgZWF4LFtlY3grNF0gICAgIDsgRUNYIDo9IHQyLmhpZ2gKKyAgICAgICAgbW92ICAgICBlY3gsW3QxXQorICAgICAgICBzYmIgICAgIGVheCxbZWN4KzRdICAgICA7IEVBWCA6PSBoaWdoIGRpZmZlcmVuY2UKKworICAgICAgICBtb3YgICAgIGVieCxbdF0gICAgICAgICA7IFN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgbW92ICAgICBbZWJ4XSxlZHggICAgICAgOyBTdG9yZSBsb3cgcGFydAorICAgICAgICBtb3YgICAgIFtlYngrNF0sZWF4ICAgICA7IFN0b3JlIGhpZ2ggcGFydAorICAgICAgICBtb3YgICAgIGVheCxlZHggICAgICAgICA7IFJldHVybiBsb3cgcGFydAoraWZuZGVmIGZsYXRtb2RlbAorICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiBpbiBEWDpBWAorZW5kaWYKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWxvbmcgX0NQVV9jYWxjTWljcm9TZWMoQ1BVX2xhcmdlSW50ZWdlciAqY291bnQsdWxvbmcgZnJlcSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDb21wdXRlcyB0aGUgdmFsdWUgaW4gbWljcm9zZWNvbmRzIGZvciB0aGUgZWxhcHNlZCB0aW1lIHdpdGggbWF4aW11bQorOyBwcmVjaXNpb24uIFRoZSBmb3JtdWxhIHdlIHVzZSBpczoKKzsKKzsgICB1cyA9ICgoKGRpZmYgKiAweDEwMDAwMCkgLyBmcmVxKSAqIDEwMDAwMDApIC8gMHgxMDAwMDApCis7Cis7IFRoZSBwb3dlciBvZiB0d28gbXVsdGlwbGUgYmVmb3JlIHRoZSBmaXJzdCBkaXZpZGUgYWxsb3dzIHVzIHRvIHNjYWxlIHRoZQorOyA2NC1iaXQgZGlmZmVyZW5jZSB1c2luZyBzaW1wbGUgc2hpZnRzLCBhbmQgdGhlbiB0aGUgZGl2aWRlIGJyaW5ncyB0aGUKKzsgZmluYWwgcmVzdWx0IGludG8gdGhlIHJhbmdlIHRvIGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0NQVV9jYWxjTWljcm9TZWMKKworICAgICAgICBBUkcgICAgIGNvdW50OkRQVFIsIGZyZXE6VUxPTkcKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBlY3gsW2NvdW50XQorICAgICAgICBtb3YgICAgIGVheCxbZWN4XSAgICAgICA7IEVBWCA6PSBsb3cgcGFydAorICAgICAgICBtb3YgICAgIGVkeCxbZWN4KzRdICAgICA7IEVEWCA6PSBoaWdoIHBhcnQKKyAgICAgICAgc2hsZCAgICBlZHgsZWF4LDIwCisgICAgICAgIHNobCAgICAgZWF4LDIwICAgICAgICAgIDsgZGlmZiAqIDB4MTAwMDAwCisgICAgICAgIGRpdiAgICAgW0RXT1JEIGZyZXFdICAgIDsgKGRpZmYgKiAweDEwMDAwMCkgLyBmcmVxCisgICAgICAgIG1vdiAgICAgZWN4LDEwMDAwMDAKKyAgICAgICAgeG9yICAgICBlZHgsZWR4CisgICAgICAgIG11bCAgICAgZWN4ICAgICAgICAgICAgIDsgKChkaWZmICogMHgxMDAwMDApIC8gZnJlcSkgKiAxMDAwMDAwKQorICAgICAgICBzaHJkICAgIGVheCxlZHgsMjAgICAgICA7ICgoZGlmZiAqIDB4MTAwMDAwKSAvIGZyZXEpICogMTAwMDAwMCkgLyAweDEwMDAwMAoraWZuZGVmIGZsYXRtb2RlbAorICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiBpbiBEWDpBWAorZW5kaWYKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWxvbmcgX0NQVV9tdWxEaXYodWxvbmcgYSx1bG9uZyBiLHVsb25nIGMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ29tcHV0ZXMgdGhlIGZvbGxvd2luZyB3aXRoIDY0LWJpdCBpbnRlZ2VyIHByZWNpc2lvbjoKKzsKKzsgICByZXN1bHQgPSAoYSAqIGIpIC8gYworOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9DUFVfbXVsRGl2CisKKyAgICAgICAgQVJHICAgICBhOlVMT05HLCBiOlVMT05HLCBjOlVMT05HCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVheCxbYV0KKyAgICAgICAgaW11bCAgICBbVUxPTkcgYl0KKyAgICAgICAgaWRpdiAgICBbVUxPTkcgY10KK2lmbmRlZiBmbGF0bW9kZWwKKyAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gaW4gRFg6QVgKK2VuZGlmCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF9jcHVpbmZvCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2RtYS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2RtYS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ZTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fZG1hLmFzbQpAQCAtMCwwICsxLDI0NiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogMTYvMzIgYml0IFJpbmcgMCBkZXZpY2UgZHJpdmVyCis7KgorOyogRGVzY3JpcHRpb246IEFzc2VtYmxlciBzdXBwb3J0IHJvdXRpbmVzIGZvciBJU0EgRE1BIGNvbnRyb2xsZXIuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfZG1hICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitiZWdkYXRhc2VnICBfZG1hICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgZGF0YSBzZWdtZW50CisKK2NwdWJsaWMgX1BNX0RNQURhdGFTdGFydAorCis7IERNQSByZWdpc3RlciBJL08gYWRkcmVzc2VzIGZvciBjaGFubmVscyAwLTcgKGV4Y2VwdCA0KQorCitETUFDX3BhZ2UgICAgICAgZGIgMDg3aCwwODNoLDA4MWgsMDgyaCwgLTEsMDhCaCwwODloLDA4QWgKK0RNQUNfYWRkciAgICAgICBkYiAwMDBoLDAwMmgsMDA0aCwwMDZoLCAtMSwwQzRoLDBDOGgsMENDaAorRE1BQ19jbnQgICAgICAgIGRiIDAwMWgsMDAzaCwwMDVoLDAwN2gsIC0xLDBDNmgsMENBaCwwQ0VoCitETUFDX21hc2sgICAgICAgZGIgMDBBaCwwMEFoLDAwQWgsMDBBaCwgLTEsMEQ0aCwwRDRoLDBENGgKK0RNQUNfbW9kZSAgICAgICBkYiAwMEJoLDAwQmgsMDBCaCwwMEJoLCAtMSwwRDZoLDBENmgsMEQ2aAorRE1BQ19GRiAgICAgICAgIGRiIDAwQ2gsMDBDaCwwMENoLDAwQ2gsIC0xLDBEOGgsMEQ4aCwwRDhoCisKK2NwdWJsaWMgX1BNX0RNQURhdGFFbmQKKworZW5kZGF0YXNlZyAgX2RtYQorCitiZWdjb2Rlc2VnICBfZG1hICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKK2lmZGVmICAgZmxhdG1vZGVsCisKK2NwdWJsaWMgX1BNX0RNQUNvZGVTdGFydAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX0RNQUNEaXNhYmxlKGludCBjaGFubmVsKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1hc2tzIERNQSBjaGFubmVsLCBpbmhpYml0aW5nIERNQSB0cmFuc2ZlcnMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9ETUFDRGlzYWJsZQorCisgICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCisgICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcworICAgICAgICBtb3YgICAgIGFsLGNsCisgICAgICAgIGFuZCAgICAgYWwsMTFiCisgICAgICAgIG9yICAgICAgYWwsMTAwYiAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSB8ICJzZXQgbWFzayBiaXQiCisgICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlY3hdCisgICAgICAgIG91dCAgICAgZHgsYWwKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fRE1BQ0VuYWJsZShpbnQgY2hhbm5lbCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBVbm1hc2tzIERNQSBjaGFubmVsLCBlbmFibGluZyBETUEgdHJhbnNmZXJzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fRE1BQ0VuYWJsZQorCisgICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCisgICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcworICAgICAgICBtb3YgICAgIGFsLGNsCisgICAgICAgIGFuZCAgICAgYWwsMTFiICAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSwgInNldCBtYXNrIGJpdCI9MAorICAgICAgICBtb3YgICAgIGRsLFtETUFDX21hc2srZWN4XQorICAgICAgICBvdXQgICAgIGR4LGFsCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX0RNQUNQcm9ncmFtKGludCBjaGFubmVsLGludCBtb2RlLHVsb25nIGJ1ZmZlclBoeXMsaW50IGNvdW50KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFB1cnBvc2U6IFByb2dyYW0gRE1BIGNvbnRyb2xsZXIgdG8gcGVyZm9ybSB0cmFuc2ZlciBmcm9tIGZpcnN0IDE2TUIKKzsgYmFzZWQgb24gcHJldmlvdXNseSBzZWxlY3RlZCBtb2RlIGFuZCBjaGFubmVsLiBETUEgdHJhbnNmZXIgbWF5IGJlIGVuYWJsZWQKKzsgYnkgc3Vic2VxdWVudCBjYWxsIHRvIFBNX0RNQUNFbmFibGUuCis7Cis7IEVudHJ5OiAgICBjaGFubmVsIC0gRE1BIGNoYW5uZWwgaW4gdXNlICgwLTcpCis7ICAgICAgICAgICBtb2RlICAgIC0gU2VsZWN0ZWQgRE1BTU9ERSB0eXBlIGZvciB0cmFuc2ZlcgorOyAgICAgICAgICAgYnVmZmVyICAtIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERNQSBidWZmZXIKKzsgICAgICAgICAgIGNvdW50ICAgLSBETUEgYnl0ZSBjb3VudCAoMS02NTUzNiBieXRlcykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9ETUFDUHJvZ3JhbQorCisgICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5ULCBtb2RlOlVJTlQsIGJ1ZmZlclBoeXM6VUxPTkcsIGNvdW50OlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2hmZAorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMKKworOyBNYXNrIERNQSBjaGFubmVsIHRvIGRpc2FibGUgaXQKKworICAgICAgICBtb3YgICAgIGVieCxbY2hhbm5lbF0gICAgICAgOyBFQlggaW5kZXhlcyBETUFDIHJlZ2lzdGVyIHRhYmxlcworICAgICAgICBtb3YgICAgIGRoLDAgICAgICAgICAgICAgICAgOyBESCA9IDAgZm9yIERNQUMgcmVnaXN0ZXIgcG9ydCBhY2Nlc3MKKyAgICAgICAgbW92ICAgICBhbCxibAorICAgICAgICBhbmQgICAgIGFsLDExYgorICAgICAgICBvciAgICAgIGFsLDEwMGIgICAgICAgICAgICAgOyBBTCA9IChjaGFubmVsICYgMykgfCAic2V0IG1hc2sgYml0IgorICAgICAgICBtb3YgICAgIGRsLFtETUFDX21hc2srZWJ4XQorICAgICAgICBvdXQgICAgIGR4LGFsCisKKzsgR2VuZXJhdGUgSU9XIHRvIGNsZWFyIEZGIHRvZ2dsZSBzdGF0ZQorCisgICAgICAgIG1vdiAgICAgYWwsMAorICAgICAgICBtb3YgICAgIGRsLFtETUFDX0ZGK2VieF0KKyAgICAgICAgb3V0ICAgICBkeCxhbAorCis7IENvbXB1dGUgYnVmZmVyIGFkZHJlc3MgdG8gcHJvZ3JhbQorCisgICAgICAgIG1vdiAgICAgZWF4LFtidWZmZXJQaHlzXSAgICA7IEFYIDo9IERNQSBhZGRyZXNzIG9mZnNldAorICAgICAgICBtb3YgICAgIGVjeCxlYXgKKyAgICAgICAgc2hyICAgICBlY3gsMTYgICAgICAgICAgICAgIDsgQ0wgOj0gYnVmZmVyUGh5cyA+PiAxNiAoRE1BIHBhZ2UpCisgICAgICAgIG1vdiAgICAgZXNpLFtjb3VudF0gICAgICAgICA7IEVTSSA9ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAgICAgICAgY21wICAgICBlYngsNCAgICAgICAgICAgICAgIDsgMTYtYml0IGNoYW5uZWw/CisgICAgICAgIGpiICAgICAgQEBXcml0ZURNQUMgICAgICAgICA7IE5vLCBwcm9ncmFtIERNQUMKKyAgICAgICAgc2hyICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgWWVzLCBjb252ZXJ0IGFkZHJlc3MgYW5kIGNvdW50CisgICAgICAgIHNociAgICAgZXNpLDEgICAgICAgICAgICAgICA7IHRvIDE2LWJpdCwgMTI4Sy9wYWdlIGZvcm1hdAorCis7IFNldCB0aGUgRE1BIGFkZHJlc3Mgd29yZCAoYml0cyAwLTE1KQorCitAQFdyaXRlRE1BQzoKKyAgICAgICAgbW92ICAgICBkbCxbRE1BQ19hZGRyK2VieF0KKyAgICAgICAgb3V0ICAgICBkeCxhbAorICAgICAgICBtb3YgICAgIGFsLGFoCisgICAgICAgIG91dCAgICAgZHgsYWwKKworOyBTZXQgRE1BIHRyYW5zZmVyIGNvdW50CisKKyAgICAgICAgbW92ICAgICBlYXgsZXNpCisgICAgICAgIGRlYyAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEVTSSA9ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgLSAxCisgICAgICAgIG1vdiAgICAgZGwsW0RNQUNfY250K2VieF0KKyAgICAgICAgb3V0ICAgICBkeCxhbAorICAgICAgICBtb3YgICAgIGFsLGFoCisgICAgICAgIG91dCAgICAgZHgsYWwKKworOyBTZXQgRE1BIHBhZ2UgYnl0ZSAoYml0cyAxNi0yMykKKworICAgICAgICBtb3YgICAgIGFsLGNsCisgICAgICAgIG1vdiAgICAgZGwsW0RNQUNfcGFnZStlYnhdCisgICAgICAgIG91dCAgICAgZHgsYWwKKworOyBTZXQgdGhlIERNQSBjaGFubmVsIG1vZGUKKworICAgICAgICBtb3YgICAgIGFsLGJsCisgICAgICAgIGFuZCAgICAgYWwsMTFiCisgICAgICAgIG9yICAgICAgYWwsW0JZVEUgbW9kZV0gICAgICA7IEVBWCA9IChjaGFubmVsICYgMykgfCBtb2RlCisgICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbW9kZStlYnhdCisgICAgICAgIG91dCAgICAgZHgsYWwKKworICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTTVAgc2FmZSBpbnRlcnJ1cHQgc3RhdGUgcmVzdG9yZSEKKyAgICAgICAgdGVzdCAgICBlYXgsMjAwaAorICAgICAgICBqeiAgICAgIEBAMQorICAgICAgICBzdGkKK0BAMTogICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWxvbmcgUE1BUEkgUE1fRE1BQ1Bvc2l0aW9uKGludCBjaGFubmVsKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gYSBkbWEgdHJhbnNmZXIuIEludGVycnVwdHMgc2hvdWxkIGJlCis7IGRpc2FibGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fRE1BQ1Bvc2l0aW9uCisKKyAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCisgICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcworCis7IEdlbmVyYXRlIElPVyB0byBjbGVhciBGRiB0b2dnbGUgc3RhdGUKKworICAgICAgICBtb3YgICAgIGFsLDAKKyAgICAgICAgbW92ICAgICBkbCxbRE1BQ19GRitlYnhdCisgICAgICAgIG91dCAgICAgZHgsYWwKKyAgICAgICAgeG9yICAgICBlYXgsZWF4CisgICAgICAgIHhvciAgICAgZWN4LGVjeAorCis7IE5vdyByZWFkIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZvciB0aGUgY2hhbm5lbAorCitAQFJlYWRMb29wOgorICAgICAgICBtb3YgICAgIGRsLFtETUFDX2NudCtlYnhdCisgICAgICAgIG91dCAgICAgZHgsYWwKKyAgICAgICAgaW4gICAgICBhbCxkeAorICAgICAgICBtb3YgICAgIGNsLGFsCisgICAgICAgIGluICAgICAgYWwsZHgKKyAgICAgICAgbW92ICAgICBjaCxhbCAgICAgICAgICAgICAgIDsgRUNYIDo9IGZpcnN0IGNvdW50IHJlYWQKKyAgICAgICAgaW4gICAgICBhbCxkeAorICAgICAgICBtb3YgICAgIGFoLGFsCisgICAgICAgIGluICAgICAgYWwsZHgKKyAgICAgICAgeGNoZyAgICBhbCxhaCAgICAgICAgICAgICAgIDsgRUFYIDo9IHNlY29uZCBjb3VudCByZWFkCisgICAgICAgIHN1YiAgICAgZWN4LGVheAorICAgICAgICBjbXAgICAgIGVjeCw0MGgKKyAgICAgICAgamcgICAgICBAQFJlYWRMb29wCisgICAgICAgIGNtcCAgICAgZWJ4LDQgICAgICAgICAgICAgICA7IDE2LWJpdCBjaGFubmVsPworICAgICAgICBqYiAgICAgIEBARXhpdCAgICAgICAgICAgICAgOyBObywgd2UgYXJlIGRvbmUKKyAgICAgICAgc2hsICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgWWVzLCBhZGp1c3QgdG8gYnl0ZSBhZGRyZXNzCisKK0BARXhpdDogbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworCitjcHVibGljIF9QTV9ETUFDb2RlRW5kCisKK2VuZGlmCisKK2VuZGNvZGVzZWcgIF9kbWEKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9faW50NjQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19pbnQ2NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlYzFiNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9faW50NjQuYXNtCkBAIC0wLDAgKzEsMzA5IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCis7KiBFbnZpcm9ubWVudDogSW50ZWwgMzIgYml0IFByb3RlY3RlZCBNb2RlLgorOyoKKzsqIERlc2NyaXB0aW9uOiBDb2RlIGZvciA2NC1iaXQgYXJoaXRobWV0aWMKKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIgorCitoZWFkZXIgICAgICBfaW50NjQKKworYmVnY29kZXNlZyAgX2ludDY0ICAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKKworYV9sb3cgICAgICAgRVFVIDA0aCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYV9sb3cgZGlyZWN0bHkgb24gc3RhY2sKK2FfaGlnaCAgICAgIEVRVSAwOGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGFfaGlnaCBkaXJlY3RseSBvbiBzdGFjaworYl9sb3cgICAgICAgRVFVIDBDaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYl9sb3cgZGlyZWN0bHkgb24gc3RhY2sKK3NoaWZ0ICAgICAgIEVRVSAwQ2ggICAgICAgICAgICAgICAgIDsgQWNjZXNzIHNoaWZ0IGRpcmVjdGx5IG9uIHN0YWNrCityZXN1bHRfMiAgICBFUVUgMENoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKK2JfaGlnaCAgICAgIEVRVSAxMGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGJfaGlnaCBkaXJlY3RseSBvbiBzdGFjaworcmVzdWx0XzMgICAgRVFVIDEwaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgcmVzdWx0IGRpcmVjdGx5IG9uIHN0YWNrCityZXN1bHRfNCAgICBFUVUgMTRoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfUE1fYWRkNjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBBZGRzIHR3byA2NC1iaXQgbnVtYmVycy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fYWRkNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQorICAgICAgICBhZGQgICAgIGVheCxbZXNwK2JfbG93XQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KKyAgICAgICAgYWRjICAgICBlZHgsW2VzcCtiX2hpZ2hdCisgICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCisgICAgICAgIG1vdiAgICAgW2VjeF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3N1YjY0KHUzMiBhX2xvdyx1MzIgYV9oaWdoLHUzMiBiX2xvdyx1MzIgYl9oaWdoLF9fdTY0ICpyZXN1bHQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU3VidHJhY3RzIHR3byA2NC1iaXQgbnVtYmVycy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fc3ViNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQorICAgICAgICBzdWIgICAgIGVheCxbZXNwK2JfbG93XQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KKyAgICAgICAgc2JiICAgICBlZHgsW2VzcCtiX2hpZ2hdCisgICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCisgICAgICAgIG1vdiAgICAgW2VjeF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX211bDY0KHUzMiBhX2hpZ2gsdTMyIGFfbG93LHUzMiBiX2hpZ2gsdTMyIGJfbG93LF9fdTY0ICpyZXN1bHQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTXVsdGlwbGVzIHR3byA2NC1iaXQgbnVtYmVycy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fbXVsNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaF0KKyAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2hpZ2hdCisgICAgICAgIG9yICAgICAgZWN4LGVheAorICAgICAgICBtb3YgICAgIGVjeCxbZXNwK2JfbG93XQorICAgICAgICBqbnogICAgIEBARnVsbE11bHRpcGx5CisgICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3ddICAgICAgICAgOyBFRFg6RUFYID0gYi5sb3cgKiBhLmxvdworICAgICAgICBtdWwgICAgIGVjeAorICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQorICAgICAgICBtb3YgICAgIFtlY3hdLGVheAorICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4CisgICAgICAgIHJldAorCitAQEZ1bGxNdWx0aXBseToKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgbXVsICAgICBlY3ggICAgICAgICAgICAgICAgICAgICA7IEVEWDpFQVggPSBhLmhpZ2ggKiBiLmxvdworICAgICAgICBtb3YgICAgIGVieCxlYXgKKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdys0XQorICAgICAgICBtdWwgICAgIFtEV09SRCBlc3ArYl9oaWdoKzRdICAgIDsgRURYOkVBWCA9IGIuaGlnaCAqIGEubG93CisgICAgICAgIGFkZCAgICAgZWJ4LGVheAorICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93KzRdCisgICAgICAgIG11bCAgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgOyBFRFg6RUFYID0gYS5sb3cgKiBiLmxvdworICAgICAgICBhZGQgICAgIGVkeCxlYngKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfNF0KKyAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKKyAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfUE1fZGl2NjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEaXZpZGVzIHR3byA2NC1iaXQgbnVtYmVycy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fZGl2NjQKKworICAgICAgICBwdXNoICAgIGVkaQorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICB4b3IgICAgIGVkaSxlZGkKKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2hpZ2grMENoXQorICAgICAgICBvciAgICAgIGVheCxlYXgKKyAgICAgICAgam5zICAgICBAQEFOb3ROZWcKKworOyBEaXZpZGVuZCBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKKworICAgICAgICBpbmMgICAgIGVkaQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfbG93KzBDaF0KKyAgICAgICAgbmVnICAgICBlYXgKKyAgICAgICAgbmVnICAgICBlZHgKKyAgICAgICAgc2JiICAgICBlYXgsMAorICAgICAgICBtb3YgICAgIFtlc3ArYV9oaWdoKzBDaF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VzcCthX2xvdyswQ2hdLGVkeAorCitAQEFOb3ROZWc6CisgICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYl9oaWdoKzBDaF0KKyAgICAgICAgb3IgICAgICBlYXgsZWF4CisgICAgICAgIGpucyAgICAgQEBCTm90TmVnCisKKzsgRGl2aXNvciBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKKworICAgICAgICBpbmMgICAgIGVkaQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2JfbG93KzBDaF0KKyAgICAgICAgbmVnICAgICBlYXgKKyAgICAgICAgbmVnICAgICBlZHgKKyAgICAgICAgc2JiICAgICBlYXgsMAorICAgICAgICBtb3YgICAgIFtlc3ArYl9oaWdoKzBDaF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VzcCtiX2xvdyswQ2hdLGVkeAorCitAQEJOb3ROZWc6CisgICAgICAgIG9yICAgICAgZWF4LGVheAorICAgICAgICBqbnogICAgIEBAQkhpZ2hOb3RaZXJvCisKKzsgYi5oaWdoIGlzIHplcm8sIHNvIGhhbmRsZSB0aGlzIGZhc3RlcgorCisgICAgICAgIG1vdiAgICAgZWN4LFtlc3ArYl9sb3crMENoXQorICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaCswQ2hdCisgICAgICAgIHhvciAgICAgZWR4LGVkeAorICAgICAgICBkaXYgICAgIGVjeAorICAgICAgICBtb3YgICAgIGVieCxlYXgKKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCisgICAgICAgIGRpdiAgICAgZWN4CisgICAgICAgIG1vdiAgICAgZWR4LGVieAorICAgICAgICBqbXAgICAgIEBAQkhpZ2haZXJvCisKK0BAQkhpZ2hOb3RaZXJvOgorICAgICAgICBtb3YgICAgIGVieCxlYXgKKyAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2xvdyswQ2hdCisgICAgICAgIG1vdiAgICAgZWR4LFtlc3ArYV9oaWdoKzBDaF0KKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCisKKzsgU2hpZnQgdmFsdWVzIHJpZ2h0IHVudGlsIGIuaGlnaCBiZWNvbWVzIHplcm8KKworQEBTaGlmdExvb3A6CisgICAgICAgIHNociAgICAgZWJ4LDEKKyAgICAgICAgcmNyICAgICBlY3gsMQorICAgICAgICBzaHIgICAgIGVkeCwxCisgICAgICAgIHJjciAgICAgZWF4LDEKKyAgICAgICAgb3IgICAgICBlYngsZWJ4CisgICAgICAgIGpueiAgICAgQEBTaGlmdExvb3AKKworOyBOb3cgY29tcGxldGUgdGhlIGRpdmlkZSBwcm9jZXNzCisKKyAgICAgICAgZGl2ICAgICBlY3gKKyAgICAgICAgbW92ICAgICBlc2ksZWF4CisgICAgICAgIG11bCAgICAgW0RXT1JEIGVzcCtiX2hpZ2grMENoXQorICAgICAgICBtb3YgICAgIGVjeCxlYXgKKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCtiX2xvdyswQ2hdCisgICAgICAgIG11bCAgICAgZXNpCisgICAgICAgIGFkZCAgICAgZWR4LGVjeAorICAgICAgICBqYiAgICAgIEBAOAorICAgICAgICBjbXAgICAgIGVkeCxbZXNwK2FfaGlnaCswQ2hdCisgICAgICAgIGphICAgICAgQEA4CisgICAgICAgIGpiICAgICAgQEA5CisgICAgICAgIGNtcCAgICAgZWF4LFtlc3ArYV9sb3crMENoXQorICAgICAgICBqYmUgICAgIEBAOQorQEA4OiAgICBkZWMgICAgIGVzaQorQEA5OiAgICB4b3IgICAgIGVkeCxlZHgKKyAgICAgICAgbW92ICAgICBlYXgsZXNpCisKK0BAQkhpZ2haZXJvOgorICAgICAgICBkZWMgICAgIGVkaQorICAgICAgICBqbnogICAgIEBARG9uZQorCis7IFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgbmVnYXRlZCBhcyBlaXRoZXIgYSBvciBiIHdhcyBuZWdhdGl2ZQorCisgICAgICAgIG5lZyAgICAgZWR4CisgICAgICAgIG5lZyAgICAgZWF4CisgICAgICAgIHNiYiAgICAgZWR4LDAKKworQEBEb25lOiBwb3AgICAgIGVieAorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQorICAgICAgICBtb3YgICAgIFtlY3hdLGVheAorICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBfX2k2NCBfUE1fc2hyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIHJpZ2h0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3NocjY0CisKKyAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KKyAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCisgICAgICAgIG1vdiAgICAgY2wsW2VzcCtzaGlmdF0KKyAgICAgICAgc2hyZCAgICBlZHgsZWF4LGNsCisgICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzNdCisgICAgICAgIG1vdiAgICAgW2VjeF0sZWF4CisgICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IF9faTY0IF9QTV9zYXI2NCh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX191NjQgKnJlc3VsdCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTaGlmdCBhIDY0LWJpdCBudW1iZXIgcmlnaHQgKHNpZ25lZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fc2FyNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KKyAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQorICAgICAgICBzYXIgICAgIGVkeCxjbAorICAgICAgICByY3IgICAgIGVheCxjbAorICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8zXQorICAgICAgICBtb3YgICAgIFtlY3hdLGVheAorICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBfX2k2NCBfUE1fc2hsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fc2hsNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KKyAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQorICAgICAgICBzaGxkICAgIGVkeCxlYXgsY2wKKyAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfM10KKyAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKKyAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgX19pNjQgX1BNX25lZzY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9fdTY0ICpyZXN1bHQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fbmVnNjQKKworICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQorICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KKyAgICAgICAgbmVnICAgICBlYXgKKyAgICAgICAgbmVnICAgICBlZHgKKyAgICAgICAgc2JiICAgICBlYXgsMAorICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8yXQorICAgICAgICBtb3YgICAgIFtlY3hdLGVheAorICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCisKK2VuZGNvZGVzZWcgIF9pbnQ2NAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjFlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2pveS5hc20KQEAgLTAsMCArMSwyMzAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlcgorOyogRW52aXJvbm1lbnQ6IEludGVsIHg4NiwgYW55IE9TCis7KgorOyogRGVzY3JpcHRpb246IEFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5hbG9ndWUKKzsqICAgICAgICAgICAgICBqb3lzdGlja3MuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBpZGVhbAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitpZmRlZiBmbGF0bW9kZWwKKworaGVhZGVyICBfam95ICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnY29kZXNlZyAgX2pveSAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbml0VGltZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNldHMgdXAgODI1MyB0aW1lciAyIChQQyBzcGVha2VyKSB0byBzdGFydCB0aW1pbmcsIGJ1dCBub3QgcHJvZHVjZSBvdXRwdXQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgaW5pdFRpbWVyCisKKzsgU3RhcnQgdGltZXIgMiBjb3VudGluZworCisgICAgICAgIGluICAgICAgYWwsNjFoCisgICAgICAgIGFuZCAgICAgYWwsMEZEaCAgICAgICAgICAgICA7IERpc2FibGUgc3BlYWtlciBvdXRwdXQgKGp1c3QgaW4gY2FzZSkKKyAgICAgICAgb3IgICAgICBhbCwxCisgICAgICAgIG91dCAgICAgNjFoLGFsCisKKzsgU2V0IHRoZSB0aW1lciAyIGNvdW50IHRvIDAgYWdhaW4gdG8gc3RhcnQgdGhlIHRpbWluZyBpbnRlcnZhbC4KKworICAgICAgICBtb3YgICAgIGFsLDEwMTEwMTAwYiAgICAgICAgOyBzZXQgdXAgdG8gbG9hZCBpbml0aWFsICh0aW1lciAyKQorICAgICAgICBvdXQgICAgIDQzaCxhbCAgICAgICAgICAgICAgOyB0aW1lciBjb3VudAorICAgICAgICBzdWIgICAgIGFsLGFsCisgICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbHNiCisgICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbXNiCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyByZWFkVGltZXIyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkcyB0aGUgbnVtYmVyIG9mIHRpY2tzIGZyb20gdGhlIDgyNTMgdGltZXIgY2hpcCB1c2luZyBjaGFubmVsIDIgKFBDCis7IHNwZWFrZXIpLiBUaGlzIGlzIG5vbi1kZXN0cnVjdGl2ZSBhbmQgZG9lcyBub3Qgc2NyZXcgdXAgb3RoZXIgbGlicmFyaWVzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhdGljIHJlYWRUaW1lcgorCisgICAgICAgIHhvciAgICAgYWwsYWwgICAgICAgICAgICAgICA7IExhdGNoIHRpbWVyIDAgY29tbWFuZAorICAgICAgICBvdXQgICAgIDQzaCxhbCAgICAgICAgICAgICAgOyBMYXRjaCB0aW1lcgorICAgICAgICBpbiAgICAgIGFsLDQyaCAgICAgICAgICAgICAgOyBsZWFzdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgIG1vdiAgICAgYWgsYWwKKyAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgIHhjaGcgICAgYWgsYWwKKyAgICAgICAgYW5kICAgICBlYXgsMEZGRkZoCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBleGl0VGltZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFN0b3BzIHRoZSA4MjUzIHRpbWVyIDIgKFBDIHNwZWFrZXIpIGNvdW50aW5nCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgZXhpdFRpbWVyCisKKzsgU3RvcCB0aW1lciAyIGZyb20gY291bnRpbmcKKworICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBpbiAgICAgIGFsLDYxaAorICAgICAgICBhbmQgICAgIGFsLDBGRWgKKyAgICAgICAgb3V0ICAgICA2MWgsYWwKKyAgICAgICAgCis7IFNvbWUgcHJvZ3JhbXMgaGF2ZSBhIHByb2JsZW0gaWYgd2UgY2hhbmdlIHRoZSBjb250cm9sIHBvcnQ7IGJldHRlciBjaGFuZ2UgaXQKKzsgdG8gc29tZXRoaW5nIHRoZXkgZXhwZWN0IChtb2RlIDMgLSBzcXVhcmUgd2F2ZSBnZW5lcmF0b3IpLi4uCisgICAgICAgIG1vdiAgICAgYWwsMEI2aAorICAgICAgICBvdXQgICAgIDQzaCxhbAorICAgICAgICAKKyAgICAgICAgcG9wICAgICBlYXgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBfRVZUX3JlYWRKb3lBeGlzKGludCBqbWFzayxpbnQgKmF4aXMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRnVuY3Rpb24gdG8gcG9sbCB0aGUgam95c3RpY2sgdG8gcmVhZCB0aGUgY3VycmVudCBheGlzIHBvc2l0aW9ucy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfRVZUX3JlYWRKb3lBeGlzCisKKyAgICAgICAgQVJHICAgICBqbWFzazpVSU5ULCBheGlzOkRQVFIKKworICAgICAgICBMT0NBTCAgIGZpcnN0VGljazpVSU5ULCBsYXN0VGljazpVSU5ULCB0b3RhbFRpY2tzOlVJTlQgPSBMb2NhbFNpemUKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBlYngsW2ptYXNrXQorICAgICAgICBtb3YgICAgIGVkaSxbYXhpc10KKyAgICAgICAgbW92ICAgICBlY3gsKDExOTMxODAvMTAwKQorICAgICAgICBhbmQgICAgIGVieCwwMTExMWIgICAgICAgICAgOyBNYXNrIG91dCBzdXBwb3J0ZWQgYXhlcworICAgICAgICBtb3YgICAgIGR4LDIwMWggICAgICAgICAgICAgOyBEWCA6PSBqb3lzdGljayBJL08gcG9ydAorICAgICAgICBjYWxsICAgIGluaXRUaW1lciAgICAgICAgICAgOyBTdGFydCB0aW1lciAyIGNvdW50aW5nCisgICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKKyAgICAgICAgbW92ICAgICBbbGFzdFRpY2tdLGVheAorCitAQFdhaXRTdGFibGU6CisgICAgICAgIGluICAgICAgYWwsZHgKKyAgICAgICAgYW5kICAgICBhbCxibCAgICAgICAgICAgICAgIDsgV2FpdCBmb3IgdGhlIGF4ZXMgaW4gcXVlc3Rpb24gdG8gYmUKKyAgICAgICAganogICAgICBAQFN0YWJsZSAgICAgICAgICAgIDsgIGRvbmUgcmVhZGluZy4uLgorICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCisgICAgICAgIHhjaGcgICAgZWF4LFtsYXN0VGlja10KKyAgICAgICAgY21wICAgICBlYXgsW2xhc3RUaWNrXQorICAgICAgICBqYiAgICAgIEBAMQorICAgICAgICBzdWIgICAgIGVheCxbbGFzdFRpY2tdCitAQDE6ICAgIGFkZCAgICAgW3RvdGFsVGlja3NdLGVheAorICAgICAgICBjbXAgICAgIFt0b3RhbFRpY2tzXSxlY3ggICAgOyBDaGVjayBmb3IgdGltZW91dAorICAgICAgICBqYWUgICAgIEBAU3RhYmxlCisgICAgICAgIGptcCAgICAgQEBXYWl0U3RhYmxlCisKK0BAU3RhYmxlOgorICAgICAgICBtb3YgICAgIGFsLDBGRmgKKyAgICAgICAgb3V0ICAgICBkeCxhbCAgICAgICAgICAgICAgIDsgU3RhcnQgam95c3RpY2sgcmVhZGluZworICAgICAgICBjYWxsICAgIGluaXRUaW1lciAgICAgICAgICAgOyBTdGFydCB0aW1lciAyIGNvdW50aW5nCisgICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKKyAgICAgICAgbW92ICAgICBbZmlyc3RUaWNrXSxlYXggICAgIDsgU3RvcmUgaW5pdGlhbCBjb3VudAorICAgICAgICBtb3YgICAgIFtsYXN0VGlja10sZWF4CisgICAgICAgIG1vdiAgICAgW0RXT1JEIHRvdGFsVGlja3NdLDAKKyAgICAgICAgY2xpCisKK0BAUG9sbExvb3A6CisgICAgICAgIGluICAgICAgYWwsZHggICAgICAgICAgICAgICA7IFJlYWQgSm95c3RpY2sgcG9ydAorICAgICAgICBub3QgICAgIGFsCisgICAgICAgIGFuZCAgICAgYWwsYmwgICAgICAgICAgICAgICA7IE1hc2sgb2ZmIGNoYW5uZWxzIHdlIGRvbid0IHdhbnQgdG8gcmVhZAorICAgICAgICBqbnogICAgIEBAQXhpc0ZsaXBwZWQgICAgICAgOyBTZWUgaWYgYW55IG9mIHRoZSBjaGFubmVscyBmbGlwcGVkCisgICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKKyAgICAgICAgeGNoZyAgICBlYXgsW2xhc3RUaWNrXQorICAgICAgICBjbXAgICAgIGVheCxbbGFzdFRpY2tdCisgICAgICAgIGpiICAgICAgQEAyCisgICAgICAgIHN1YiAgICAgZWF4LFtsYXN0VGlja10KK0BAMjogICAgYWRkICAgICBbdG90YWxUaWNrc10sZWF4CisgICAgICAgIGNtcCAgICAgW3RvdGFsVGlja3NdLGVjeCAgICA7IENoZWNrIGZvciB0aW1lb3V0CisgICAgICAgIGphZSAgICAgQEBUaW1lZE91dAorICAgICAgICBqbXAgICAgIEBAUG9sbExvb3AKKworQEBBeGlzRmxpcHBlZDoKKyAgICAgICAgeG9yICAgICBlc2ksZXNpCisgICAgICAgIG1vdiAgICAgYWgsMQorICAgICAgICB0ZXN0ICAgIGFsLGFoCisgICAgICAgIGpueiAgICAgQEBTdG9yZUNvdW50ICAgICAgICA7IEpveXN0aWNrIDEsIFggYXhpcyBmbGlwcGVkCisgICAgICAgIGFkZCAgICAgZXNpLDQKKyAgICAgICAgbW92ICAgICBhaCwyCisgICAgICAgIHRlc3QgICAgYWwsYWgKKyAgICAgICAgam56ICAgICBAQFN0b3JlQ291bnQgICAgICAgIDsgSm95c3RpY2sgMSwgWSBheGlzIGZsaXBwZWQKKyAgICAgICAgYWRkICAgICBlc2ksNAorICAgICAgICBtb3YgICAgIGFoLDQKKyAgICAgICAgdGVzdCAgICBhbCxhaAorICAgICAgICBqbnogICAgIEBAU3RvcmVDb3VudCAgICAgICAgOyBKb3lzdGljayAyLCBYIGF4aXMgZmxpcHBlZAorICAgICAgICBhZGQgICAgIGVzaSw0ICAgICAgICAgICAgICAgOyBKb3lzdGljayAyLCBZIGF4aXMgZmxpcHBlZAorICAgICAgICBtb3YgICAgIGFoLDgKKworQEBTdG9yZUNvdW50OgorICAgICAgICBvciAgICAgIGJoLGFoICAgICAgICAgICAgICAgOyBJbmRpY2F0ZSB0aGlzIGF4aXMgaXMgYWN0aXZlCisgICAgICAgIHhvciAgICAgYmwsYWggICAgICAgICAgICAgICA7IFVubWFyayB0aGUgY2hhbm5lbHMgdGhhdCBqdXN0IHRyaXBwZWQKKyAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAorICAgICAgICB4Y2hnICAgIGVheCxbbGFzdFRpY2tdCisgICAgICAgIGNtcCAgICAgZWF4LFtsYXN0VGlja10KKyAgICAgICAgamIgICAgICBAQDMKKyAgICAgICAgc3ViICAgICBlYXgsW2xhc3RUaWNrXQorQEAzOiAgICBhZGQgICAgIFt0b3RhbFRpY2tzXSxlYXgKKyAgICAgICAgbW92ICAgICBlYXgsW3RvdGFsVGlja3NdCisgICAgICAgIG1vdiAgICAgW2VkaStlc2ldLGVheCAgICAgICA7IFJlY29yZCB0aGUgdGltZSB0aGlzIGNoYW5uZWwgZmxpcHBlZAorICAgICAgICBjbXAgICAgIGJsLDAgICAgICAgICAgICAgICAgOyBJZiB0aGVyZSBhcmUgbW9yZSBjaGFubmVscyB0byByZWFkLAorICAgICAgICBqbmUgICAgIEBAUG9sbExvb3AgICAgICAgICAgOyAgIGtlZXAgbG9vcGluZworCitAQFRpbWVkT3V0OgorICAgICAgICBzdGkKKyAgICAgICAgY2FsbCAgICBleGl0VGltZXIgICAgICAgICAgIDsgU3RvcCB0aW1lciAyIGNvdW50aW5nCisgICAgICAgIG1vdnp4ICAgZWF4LGJoICAgICAgICAgICAgICA7IFJldHVybiB0aGUgbWFzayBvZiB3b3JraW5nIGF4ZXMKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IF9FVlRfcmVhZEpveUJ1dHRvbnModm9pZCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGdW5jdGlvbiB0byBwb2xsIHRoZSBjdXJyZW50IGpveXN0aWNrIGJ1dHRvbnMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfRVZUX3JlYWRKb3lCdXR0b25zCisKKyAgICAgICAgbW92ICAgICBkeCwwMjAxaAorICAgICAgICBpbiAgICAgIGFsLGR4CisgICAgICAgIHNociAgICAgYWwsNAorICAgICAgICBub3QgICAgIGFsCisgICAgICAgIGFuZCAgICAgZWF4LDBGaAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworZW5kY29kZXNlZyAgX2pveQorCitlbmRpZgorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fbXRyci5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGE2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtCkBAIC0wLDAgKzEsMjcyIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KKzsqIEVudmlyb25tZW50OiAxNi8zMiBiaXQgUmluZyAwIGRldmljZSBkcml2ZXIKKzsqCis7KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcgorOyogICAgICAgICAgICAgIChNVFJSKSBtb2R1bGUuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfbXRyciAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitiZWdkYXRhc2VnICBfbXRycgorCitpZmRlZiAgIERPUzRHVworICAgIGNleHRlcm4gX1BNX2hhdmVDYXVzZVdheSxVSU5UCitlbmRpZgorCitlbmRkYXRhc2VnICBfbXRycgorCitiZWdjb2Rlc2VnICBfbXRyciAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKK1A1ODYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaWJvb2wgX01UUlJfaXNSaW5nMCh2b2lkKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENoZWNrcyB0byBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgYXQgcmluZyAwLiBUaGlzIGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQKKzsgZm9yIDMyLWJpdCBET1M0R1cgYW5kIGNvbXBhdGlibGUgcHJvZ3JhbXMuIElmIHdlIGFyZSBub3QgcnVubmluZyB1bmRlcgorOyBET1M0R1csIHRoZW4gd2Ugc2ltcGx5IGFzc3VtZSB3ZSBhcmUgYSByaW5nIDAgZGV2aWNlIGRyaXZlci4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY25lYXIgICBfTVRSUl9pc1JpbmcwCisKKzsgQXJlIHdlIHJ1bm5pbmcgdW5kZXIgQ2F1c2VXYXk/CisKK2lmZGVmICAgRE9TNEdXCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgbW92ICAgICBheCxjcworICAgICAgICBhbmQgICAgIGVheCwzCisgICAgICAgIHhvciAgICAgZWF4LDMKKyAgICAgICAgam56ICAgICBAQEV4aXQKKworOyBDYXVzZVdheSBydW5zIHRoZSBhcHBzIGF0IHJpbmcgMywgYnV0IGltcGxlbWVudHMgc3VwcG9ydCBmb3Igc3BlY2lmaWMKKzsgcmluZyAwIGluc3RydWN0aW9ucyB0aGF0IHdlIG5lZWQgdG8gZ2V0IHN0dWZmIGRvbmUgdW5kZXIgcmVhbCBET1MuCisKKyAgICAgICAgbW92ICAgICBlYXgsMQorICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKKyAgICAgICAgam56ICAgICBAQEV4aXQKK0BARmFpbDogeG9yICAgICBlYXgsZWF4CitAQEV4aXQ6IGxlYXZlX2MKKyAgICAgICAgcmV0CitlbHNlCitpZmRlZiBfX1NNWDMyX18KKyAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgICAgICA7IFNNWCBpcyByaW5nIDAhCisgICAgICAgIHJldAorZWxzZQoraWZkZWYgX19WWERfXworICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgICAgIDsgVnhEIGlzIHJpbmcgMCEKKyAgICAgICAgcmV0CitlbHNlCitpZmRlZiBfX05UX0RSSVZFUl9fCisgICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICAgICAgOyBOVC9XMksgaXMgcmluZyAwIQorICAgICAgICByZXQKK2Vsc2UKK2Vsc2UKKyAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEFzc3VtZSByaW5nIDMgZm9yIDMyLWJpdCBET1MKKyAgICAgICAgcmV0CitlbmRpZgorZW5kaWYKK2VuZGlmCitlbmRpZgorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1bG9uZyBfTVRSUl9kaXNhYmxlSW50KHZvaWQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfZGlzYWJsZUludAorCisgICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHV0IGZsYWcgd29yZCBvbiBzdGFjaworICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cyEKKyAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBkZXBvc2l0IGZsYWcgd29yZCBpbiByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX01UUlJfcmVzdG9yZUludCh1bG9uZyBwcyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9NVFJSX3Jlc3RvcmVJbnQKKworICAgICAgICBBUkcgICAgIHBzOlVMT05HCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKKyAgICAgICAgbW92ICAgICBlY3gsW3BzXQorICAgICAgICB0ZXN0ICAgIGVjeCwyMDBoICAgICAgICA7IFNNUCBzYWZlIGludGVycnVwdCBmbGFnIHJlc3RvcmUhCisgICAgICAgIGp6ICAgICAgQEAxCisgICAgICAgIHN0aQorQEAxOiAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWxvbmcgX01UUlJfc2F2ZUNSNCh2b2lkKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNhdmUgdGhlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgdGhlIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpLiBXZSBhbHNvCis7IGRpc2FibGUgYW5kIGZsdXNoIHRoZSBjYWNoZXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfc2F2ZUNSNAorCisgICAgICAgIGVudGVyX2MKKworOyBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykKKworICAgICAgICBtb3YgICAgIGVieCxjcjQKKyAgICAgICAgbW92ICAgICBlYXgsZWJ4CisgICAgICAgIGFuZCAgICAgYWwsN0ZoCisgICAgICAgIG1vdiAgICAgY3I0LGVheAorCis7IERpc2FibGUgYW5kIGZsdXNoIGNhY2hlcworCisgICAgICAgIG1vdiAgICAgZWF4LGNyMAorICAgICAgICBvciAgICAgIGVheCw0MDAwMDAwMGgKKyAgICAgICAgd2JpbnZkCisgICAgICAgIG1vdiAgICAgY3IwLGVheAorICAgICAgICB3YmludmQKKworOyBSZXR1cm4gdmFsdWUgZnJvbSBDUjQKKworICAgICAgICBtb3YgICAgIGVheCxlYngKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfTVRSUl9yZXN0b3JlQ1I0KHVsb25nIGNyNFZhbCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNhdmUgdGhlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgdGhlIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpLiBXZSBhbHNvCis7IGRpc2FibGUgYW5kIGZsdXNoIHRoZSBjYWNoZXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUNSNAorCisgICAgICAgIEFSRyAgICAgY3I0VmFsOlVMT05HCisKKyAgICAgICAgZW50ZXJfYworCis7IEVuYWJsZSBjYWNoZXMKKworICAgICAgICBtb3YgICAgIGVheCxjcjAKKyAgICAgICAgYW5kICAgICBlYXgsMEJGRkZGRkZGaAorICAgICAgICBtb3YgICAgIGNyMCxlYXgKKyAgICAgICAgbW92ICAgICBlYXgsW2NyNFZhbF0KKyAgICAgICAgbW92ICAgICBjcjQsZWF4CisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVjaGFyIF9NVFJSX2dldEN4ODYodWNoYXIgcmVnKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgYSBDeXJpeCBDUFUgaW5kZXhlZCByZWdpc3RlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9NVFJSX2dldEN4ODYKKworICAgICAgICBBUkcgICAgIHJlZzpVQ0hBUgorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgbW92ICAgICBhbCxbcmVnXQorICAgICAgICBvdXQgICAgIDIyaCxhbAorICAgICAgICBpbiAgICAgIGFsLDIzaAorICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1Y2hhciBfTVRSUl9zZXRDeDg2KHVjaGFyIHJlZyx1Y2hhciB2YWwpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGUgYSBDeXJpeCBDUFUgaW5kZXhlZCByZWdpc3RlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9NVFJSX3NldEN4ODYKKworICAgICAgICBBUkcgICAgIHJlZzpVQ0hBUiwgdmFsOlVDSEFSCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGFsLFtyZWddCisgICAgICAgIG91dCAgICAgMjJoLGFsCisgICAgICAgIG1vdiAgICAgYWwsW3ZhbF0KKyAgICAgICAgb3V0ICAgICAyM2gsYWwKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfTVRSUl9yZWFkTVNSKHVvbmcgcmVnLCB1bG9uZyBGQVIgKmVheCwgdWxvbmcgRkFSICplZHgpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGVzIHRoZSBzcGVjaWZpYyBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB1c2VkIG9uIHRoZSBuZXdlciBJbnRlbAorOyBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBtb3RoZXJib2FyZHMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NuZWFyICAgX01UUlJfcmVhZE1TUgorCisgICAgICAgIEFSRyAgICAgcmVnOlVMT05HLCB2X2VheDpEUFRSLCB2X2VkeDpEUFRSCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVjeCxbcmVnXQorICAgICAgICByZG1zcgorICAgICAgICBtb3YgICAgIGVieCxbdl9lYXhdCisgICAgICAgIG1vdiAgICAgW2VieF0sZWF4CisgICAgICAgIG1vdiAgICAgZWJ4LFt2X2VkeF0KKyAgICAgICAgbW92ICAgICBbZWJ4XSxlZHgKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfTVRSUl93cml0ZU1TUih1b25nIHJlZywgdWxvbmcgZWF4LCB1bG9uZyBlZHgpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGVzIHRoZSBzcGVjaWZpYyBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB1c2VkIG9uIHRoZSBuZXdlciBJbnRlbAorOyBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBtb3RoZXJib2FyZHMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NuZWFyICAgX01UUlJfd3JpdGVNU1IKKworICAgICAgICBBUkcgICAgIHJlZzpVTE9ORywgdl9lYXg6VUxPTkcsIHZfZWR4OlVMT05HCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVjeCxbcmVnXQorICAgICAgICBtb3YgICAgIGVheCxbdl9lYXhdCisgICAgICAgIG1vdiAgICAgZWR4LFt2X2VkeF0KKyAgICAgICAgd3Jtc3IKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworZW5kY29kZXNlZyAgX210cnIKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fcGNpaGVscC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX3BjaWhlbHAuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOGRiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX3BjaWhlbHAuYXNtCkBAIC0wLDAgKzEsMzU4IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KKzsqIEVudmlyb25tZW50OiBBbnkKKzsqCis7KiBEZXNjcmlwdGlvbjogSGVscGVyIGFzc2VtYmxlciBmdW5jdGlvbnMgZm9yIFBDSSBhY2Nlc3MgbW9kdWxlLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKKworaGVhZGVyICBfcGNpbGliCisKK2JlZ2NvZGVzZWcgIF9wY2lsaWIKKworaWZkZWYgZmxhdG1vZGVsCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVjaGFyIF9BU01BUEkgX0JJT1MzMl9zZXJ2aWNlKAorOyAgIHVsb25nIHNlcnZpY2UsCis7ICAgdWxvbmcgZnVuYywKKzsgICB1bG9uZyAqcGh5c0Jhc2UsCis7ICAgdWxvbmcgKmxlbmd0aCwKKzsgICB1bG9uZyAqc2VydmljZU9mZnNldCwKKzsgICBQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENhbGwgdGhlIEJJT1MzMiBzZXJ2aWNlcyBkaXJlY3RvcnkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgX0JJT1MzMl9zZXJ2aWNlCisKKyAgICAgICAgQVJHICAgICBzZXJ2aWNlOlVMT05HLCBmdW5jOlVMT05HLCBwaHlzQmFzZTpEUFRSLCBsZW46RFBUUiwgb2ZmOkRQVFIsIGVudHJ5OlFXT1JECisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVheCxbc2VydmljZV0KKyAgICAgICAgbW92ICAgICBlYngsW2Z1bmNdCitpZmRlZiAgIFVTRV9OQVNNCisgICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KK2Vsc2UKKyAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCitlbmRpZgorICAgICAgICBtb3YgICAgIGVzaSxbcGh5c0Jhc2VdCisgICAgICAgIG1vdiAgICAgW2VzaV0sZWJ4CisgICAgICAgIG1vdiAgICAgZXNpLFtsZW5dCisgICAgICAgIG1vdiAgICAgW2VzaV0sZWN4CisgICAgICAgIG1vdiAgICAgZXNpLFtvZmZdCisgICAgICAgIG1vdiAgICAgW2VzaV0sZWR4CisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVzaG9ydCBfQVNNQVBJIF9QQ0lCSU9TX2lzUHJlc2VudCh1bG9uZyBpX2VheCx1bG9uZyAqb19lZHgsdXNob3J0ICpvZWF4LAorOyAgIHVjaGFyICpvX2NsLFBDSUJJT1NfZW50cnkgZW50cnkpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDYWxsIHRoZSBQQ0kgQklPUyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcHJlc2VudC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgX1BDSUJJT1NfaXNQcmVzZW50CisKKyAgICAgICAgQVJHICAgICBpX2VheDpVTE9ORywgb19lZHg6RFBUUiwgb2VheDpEUFRSLCBvX2NsOkRQVFIsIGVudHJ5OlFXT1JECisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVheCxbaV9lYXhdCitpZmRlZiAgIGZsYXRtb2RlbAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCitlbHNlCisgICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQorZW5kaWYKK2Vsc2UKKyAgICAgICAgaW50ICAgICAxQWgKK2VuZGlmCisgICAgICAgIF9sZXMgICAgX3NpLFtvX2VkeF0KKyAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sZWR4CisgICAgICAgIF9sZXMgICAgX3NpLFtvZWF4XQorICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAorICAgICAgICBfbGVzICAgIF9zaSxbb19jbF0KKyAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sY2wKKyAgICAgICAgbW92ICAgICBheCxieAorICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1bG9uZyBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LAorOyAgIFBDSUJJT1NfZW50cnkgZW50cnkpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDYWxsIHRoZSBQQ0kgQklPUyBzZXJ2aWNlcywgZWl0aGVyIHZpYSB0aGUgMzItYml0IHByb3RlY3RlZCBtb2RlIGVudHJ5Cis7IHBvaW50IG9yIHZpYSB0aGUgSW50IDFBaCAxNi1iaXQgaW50ZXJydXB0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgICBfUENJQklPU19zZXJ2aWNlCisKKyAgICAgICAgQVJHICAgICByX2VheDpVTE9ORywgcl9lYng6VUxPTkcsIHJfZWRpOlVMT05HLCByX2VjeDpVTE9ORywgZW50cnk6UVdPUkQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgZWF4LFtyX2VheF0KKyAgICAgICAgbW92ICAgICBlYngsW3JfZWJ4XQorICAgICAgICBtb3YgICAgIGVkaSxbcl9lZGldCisgICAgICAgIG1vdiAgICAgZWN4LFtyX2VjeF0KK2lmZGVmICAgZmxhdG1vZGVsCitpZmRlZiAgIFVTRV9OQVNNCisgICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KK2Vsc2UKKyAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCitlbmRpZgorZWxzZQorICAgICAgICBpbnQgICAgIDFBaAorZW5kaWYKKyAgICAgICAgbW92ICAgICBlYXgsZWN4CitpZm5kZWYgIGZsYXRtb2RlbAorICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiByZXN1bHQgaW4gRFg6QVgKK2VuZGlmCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBfUENJQklPU19nZXRSb3V0aW5nKFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyICpidWYsUENJQklPU19lbnRyeSBlbnRyeSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBHZXQgdGhlIHJvdXRpbmcgb3B0aW9ucyBmb3IgUENJIGRldmljZXMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgX1BDSUJJT1NfZ2V0Um91dGluZworCisgICAgICAgIEFSRyAgICAgYnVmOkRQVFIsIGVudHJ5OlFXT1JECisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGVheCwwQjEwRWgKKyAgICAgICAgbW92ICAgICBieCwwCisgICAgICAgIF9sZXMgICAgX2RpLFtidWZdCitpZmRlZiAgIGZsYXRtb2RlbAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCitlbHNlCisgICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQorZW5kaWYKK2Vsc2UKKyAgICAgICAgaW50ICAgICAxQWgKK2VuZGlmCisgICAgICAgIG1vdnp4ICAgZWF4LGFoCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGlib29sIF9QQ0lCSU9TX3NldElSUShpbnQgYnVzRGV2LGludCBpbnRQaW4saW50IElSUSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENoYW5nZSB0aGUgSVJRIHJvdXRpbmcgZm9yIHRoZSBQQ0kgZGV2aWNlCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgIF9QQ0lCSU9TX3NldElSUQorCisgICAgICAgIEFSRyAgICAgYnVzRGV2OlVJTlQsIGludFBpbjpVSU5ULCBJUlE6VUlOVCwgZW50cnk6UVdPUkQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgZWF4LDBCMTBGaAorICAgICAgICBtb3YgICAgIGJ4LFtVU0hPUlQgYnVzRGV2XQorICAgICAgICBtb3YgICAgIGNsLFtCWVRFIGludFBpbl0KKyAgICAgICAgbW92ICAgICBjaCxbQllURSBJUlFdCitpZmRlZiAgIGZsYXRtb2RlbAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCitlbHNlCisgICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQorZW5kaWYKK2Vsc2UKKyAgICAgICAgaW50ICAgICAxQWgKK2VuZGlmCisgICAgICAgIG1vdiAgICAgZWF4LDEKKyAgICAgICAgam5jICAgICBAQDEKKyAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgOyBGdW5jdGlvbiBmYWlsZWQhCitAQDE6ICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVsb25nIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZShpbnQgYnVzLHVsb25nIGRhdGEsUENJQklPU19lbnRyeSBlbnRyeSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBHZW5lcmF0ZSBhIHNwZWNpYWwgY3ljbGUgdmlhIHRoZSBQQ0kgQklPUy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlCisKKyAgICAgICAgQVJHICAgICBidXM6VUlOVCwgZGF0YTpVTE9ORywgZW50cnk6UVdPUkQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgZWF4LDBCMTA2aAorICAgICAgICBtb3YgICAgIGJoLFtCWVRFIGJ1c10KKyAgICAgICAgbW92ICAgICBlY3gsW2RhdGFdCitpZmRlZiAgIGZsYXRtb2RlbAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCitlbHNlCisgICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQorZW5kaWYKK2Vsc2UKKyAgICAgICAgaW50ICAgICAxQWgKK2VuZGlmCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVzaG9ydCBfUENJX2dldENTKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgIF9QQ0lfZ2V0Q1MKKworICAgICAgICBtb3YgICAgIGF4LGNzCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgUE1faW5wYihpbnQgcG9ydCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2lucGIKKworICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICB4b3IgICAgIF9heCxfYXgKKyAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCisgICAgICAgIGluICAgICAgYWwsZHgKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9pbnB3KGludCBwb3J0KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmVhZHMgYSB3b3JkIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1faW5wdworCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIHhvciAgICAgX2F4LF9heAorICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KKyAgICAgICAgaW4gICAgICBheCxkeAorICAgICAgICBwb3AgICAgIF9icAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWxvbmcgUE1faW5wZChpbnQgcG9ydCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2lucGQKKworICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KKyAgICAgICAgaW4gICAgICBlYXgsZHgKK2lmbmRlZiBmbGF0bW9kZWwKKyAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBEWDpBWCA9IHJlc3VsdAorZW5kaWYKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fb3V0cGIoaW50IHBvcnQsaW50IHZhbHVlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9vdXRwYgorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQorICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgZHgsYWwKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fb3V0cHcoaW50IHBvcnQsaW50IHZhbHVlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGUgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9vdXRwdworCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQorICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgZHgsYXgKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fb3V0cGQoaW50IHBvcnQsdWxvbmcgdmFsdWUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBXcml0ZSBhIHdvcmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX291dHBkCisKKyAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIHZhbHVlOlVMT05HCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQorICAgICAgICBtb3YgICAgIGVheCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgZHgsZWF4CisgICAgICAgIHBvcCAgICAgX2JwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCitlbmRjb2Rlc2VnICBfcGNpbGliCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmN2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9hZ3AuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFJpbmcgMCBkZXZpY2UgZHJpdmVyCisqCisqIERlc2NyaXB0aW9uOiAgR2VuZXJpYyBtb2R1bGUgdG8gaW1wbGVtZW50IEFHUCBzdXBwb3J0IGZ1bmN0aW9ucyB1c2luZyB0aGUKKyogICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgQUdQIHN1cHBvcnQgZHJpdmVycy4gSWYgdGhlIE9TIHByb3ZpZGVzCisqICAgICAgICAgICAgICAgbmF0aXZlIEFHUCBzdXBwb3J0LCB0aGlzIG1vZHVsZSBzaG91bGQgKk5PVCogYmUgdXNlZC4gSW5zdGVhZAorKiAgICAgICAgICAgICAgIHdyYXBwZXJzIHNob3VsZCBiZSBwbGFjZWQgYXJvdW5kIHRoZSBPUyBzdXBwb3J0IGZ1bmN0aW9ucworKiAgICAgICAgICAgICAgIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpZm5kZWYgUkVBTE1PREUKKyNpbmNsdWRlICJudWNsZXVzL2FncC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgQUdQX2RldkN0eCAgICAgICAqYWdwOworc3RhdGljIEFHUF9kcml2ZXJGdW5jcyAgZHJpdmVyOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK1NpemUgb2YgQUdQIGFwZXJ0dXJlIGluIE1CIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEFHUCBkcml2ZXIgaW4gdGhlIHN5c3RlbSBhbmQgcmV0dXJucyB0aGUKK3NpemUgb2YgdGhlIGF2YWlsYWJsZSBBR1AgYXBlcnR1cmUgaW4gbWVnYWJ5dGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFBNQVBJIFBNX2FncEluaXQodm9pZCkKK3sKKyAgICBpZiAoKGFncCA9IEFHUF9sb2FkRHJpdmVyKDApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkcml2ZXIuZHdTaXplID0gc2l6ZW9mKGRyaXZlcik7CisgICAgaWYgKCFhZ3AtPlF1ZXJ5RnVuY3Rpb25zKEFHUF9HRVRfRFJJVkVSRlVOQ1MsJmRyaXZlcikpCisgICAgICAgIHJldHVybiAwOworICAgIHN3aXRjaCAoZHJpdmVyLkdldEFwZXJ0dXJlU2l6ZSgpKSB7CisgICAgICAgIGNhc2UgYWdwU2l6ZTRNQjogICAgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgYWdwU2l6ZThNQjogICAgcmV0dXJuIDg7CisgICAgICAgIGNhc2UgYWdwU2l6ZTE2TUI6ICAgcmV0dXJuIDE2OworICAgICAgICBjYXNlIGFncFNpemUzMk1COiAgIHJldHVybiAzMjsKKyAgICAgICAgY2FzZSBhZ3BTaXplNjRNQjogICByZXR1cm4gNjQ7CisgICAgICAgIGNhc2UgYWdwU2l6ZTEyOE1COiAgcmV0dXJuIDEyODsKKyAgICAgICAgY2FzZSBhZ3BTaXplMjU2TUI6ICByZXR1cm4gMjU2OworICAgICAgICBjYXNlIGFncFNpemU1MTJNQjogIHJldHVybiA1MTI7CisgICAgICAgIGNhc2UgYWdwU2l6ZTFHQjogICAgcmV0dXJuIDEwMjQ7CisgICAgICAgIGNhc2UgYWdwU2l6ZTJHQjogICAgcmV0dXJuIDIwNDg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNsb3NlcyBkb3duIHRoZSBsb2FkZWQgQUdQIGRyaXZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2FncEV4aXQodm9pZCkKK3sKKyAgICBBR1BfdW5sb2FkRHJpdmVyKGFncCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbnVtUGFnZXMgICAgLSBOdW1iZXIgb2YgbWVtb3J5IHBhZ2VzIHRoYXQgc2hvdWxkIGJlIHJlc2VydmVkCit0eXBlICAgICAgICAtIFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlCitwaHlzQ29udGV4dCAtIFJldHVybnMgdGhlIHBoeXNpY2FsIGNvbnRleHQgaGFuZGxlIGZvciB0aGUgbWFwcGluZworcGh5c0FkZHIgICAgLSBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbWFwcGluZworCitSRVRVUk5TOgorVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBhIHJhbmdlIG9mIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzZXMgb24gdGhlIHN5c3RlbQorYnVzIHdoaWNoIHRoZSBBR1AgY29udHJvbGxlciB3aWxsIHJlc3BvbmQgdG8uIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsCit0aGUgQUdQIGNvbnRyb2xsZXIgY2FuIHJlc3BvbmQgdG8gdGhlIHJlc2VydmVkIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugb24KK3RoZSBidXMuIEhvd2V2ZXIgeW91IG11c3QgZmlyc3QgY2FsbCBBR1BfY29tbWl0UGh5c2ljYWwgdG8gY2F1c2UgdGhpcyBtZW1vcnkKK3RvIGFjdHVhbGx5IGJlIGNvbW1pdHRlZCBmb3IgdXNlIGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsKAorICAgIHVsb25nIG51bVBhZ2VzLAorICAgIGludCB0eXBlLAorICAgIHZvaWQgKipwaHlzQ29udGV4dCwKKyAgICBQTV9waHlzQWRkciAqcGh5c0FkZHIpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgUE1fYWdwVW5jYWNoZWQ6ICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBhZ3BVbmNhY2hlZDsgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fYWdwV3JpdGVDb21iaW5lOiAgICAKKyAgICAgICAgICAgIHR5cGUgPSBhZ3BXcml0ZUNvbWJpbmU7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fYWdwSW50ZWxEQ0FDSEU6ICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBhZ3BJbnRlbERDQUNIRTsgICAgICAKKyAgICAgICAgICAgIGJyZWFrOyAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICByZXR1cm4gZHJpdmVyLlJlc2VydmVQaHlzaWNhbChudW1QYWdlcyx0eXBlLHBoeXNDb250ZXh0LHBoeXNBZGRyKSA9PSBuT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byByZWxlYXNlCisKK1JFVFVSTlM6CitUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3NlcyBvbiB0aGUgc3lzdGVtCitidXMgd2hpY2ggdGhlIEFHUCBjb250cm9sbGVyIHdpbGwgcmVzcG9uZCB0by4gQWxsIGNvbW1pdHRlZCBtZW1vcnkgZm9yCit0aGUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBjb3ZlcmVkIGJ5IHRoZSBjb250ZXh0IHdpbGwgYmUgcmVsZWFzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fYWdwUmVsZWFzZVBoeXNpY2FsKAorICAgIHZvaWQgKnBoeXNDb250ZXh0KQoreworICAgIHJldHVybiBkcml2ZXIuUmVsZWFzZVBoeXNpY2FsKHBoeXNDb250ZXh0KSA9PSBuT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byBjb21taXQgbWVtb3J5IGZvcgorbnVtUGFnZXMgICAgLSBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgY29tbWl0dGVkCitzdGFydE9mZnNldCAtIE9mZnNldCBpbiBwYWdlcyBpbnRvIHRoZSByZXNlcnZlZCBwaHlzaWNhbCBjb250ZXh0CitwaHlzQWRkciAgICAtIFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbW1pdHRlZCBtZW1vcnkKKworUkVUVVJOUzoKK1RydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gY29tbWl0cyBpbnRvIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgY29udGV4dCB0aGF0IHdhcyBwcmV2aW91c2x5CityZXNlcnZlZCBieSBhIGNhbGwgdG8gUmVzZXJ2ZVBoeXNpY2FsLiBZb3UgY2FuIHVzZSB0aGUgc3RhcnRPZmZzZXQgYW5kCitudW1QYWdlcyBwYXJhbWV0ZXJzIHRvIG9ubHkgY29tbWl0IHBvcnRpb25zIG9mIHRoZSByZXNlcnZlZCBtZW1vcnkgcmFuZ2UgYXQKK2EgdGltZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9hZ3BDb21taXRQaHlzaWNhbCgKKyAgICB2b2lkICpwaHlzQ29udGV4dCwKKyAgICB1bG9uZyBudW1QYWdlcywKKyAgICB1bG9uZyBzdGFydE9mZnNldCwKKyAgICBQTV9waHlzQWRkciAqcGh5c0FkZHIpCit7CisgICAgcmV0dXJuIGRyaXZlci5Db21taXRQaHlzaWNhbChwaHlzQ29udGV4dCxudW1QYWdlcyxzdGFydE9mZnNldCxwaHlzQWRkcikgPT0gbk9LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BoeXNDb250ZXh0IC0gUGh5c2ljYWwgQUdQIGNvbnRleHQgdG8gZnJlZSBtZW1vcnkgZm9yCitudW1QYWdlcyAgICAtIE51bWJlciBvZiBwYWdlcyB0byBiZSBmcmVlZAorc3RhcnRPZmZzZXQgLSBPZmZzZXQgaW4gcGFnZXMgaW50byB0aGUgcmVzZXJ2ZWQgcGh5c2ljYWwgY29udGV4dAorCitSRVRVUk5TOgorVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBmcmVlcyBtZW1vcnkgcHJldmlvdXNseSBjb21taXR0ZWQgYnkgdGhlIENvbW1pdFBoeXNpY2FsCitmdW5jdGlvbi4gTm90ZSB0aGF0IHlvdSBjYW4gZnJlZSBhIHBvcnRpb24gb2YgYSBtZW1vcnkgcmFuZ2UgdGhhdCB3YXMKK3ByZXZpb3VzbHkgY29tbWl0dGVkIGlmIHlvdSB3aXNoLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2FncEZyZWVQaHlzaWNhbCgKKyAgICB2b2lkICpwaHlzQ29udGV4dCwKKyAgICB1bG9uZyBudW1QYWdlcywKKyAgICB1bG9uZyBzdGFydE9mZnNldCkKK3sKKyAgICByZXR1cm4gZHJpdmVyLkZyZWVQaHlzaWNhbChwaHlzQ29udGV4dCxudW1QYWdlcyxzdGFydE9mZnNldCkgPT0gbk9LOworfQorCisjZW5kaWYgIC8qICFSRUFMTU9ERSAqLworCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9rZXlib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjQwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgRGlyZWN0IGtleWJvYXJkIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gVGhpcyBtb2R1bGUgY29udGFpbnMKKyogICAgICAgICAgICAgICBjb2RlIHRvIHByb2Nlc3MgcmF3IHNjYW4gY29kZSBpbmZvcm1hdGlvbiwgY29udmVydCBpdCB0bworKiAgICAgICAgICAgICAgIHZpcnR1YWwgc2NhbiBjb2RlcyBhbmQgZG8gY29kZSBwYWdlIHRyYW5zbGF0aW9uIHRvIEFTQ0lJCisqICAgICAgICAgICAgICAgZm9yIGRpZmZlcmVudCBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gS2V5Ym9hcmQgc2NhbiBjb2RlIHRvIHRyYW5zbGF0ZQordGFibGUgICAgICAgLSBDb2RlIHBhZ2UgdGFibGUgdG8gc2VhcmNoCitjb3VudCAgICAgICAtIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2RlIHBhZ2UgdGFibGUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc2NhbiBjb2RlcyBmcm9tIGtleWJvYXJkIHNjYW4gY29kZXMgdG8gQVNDSUkKK2NvZGVzIHVzaW5nIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgY29kZSBwYWdlIHRhYmxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1Y2hhciB0cmFuc2xhdGVTY2FuKAorICAgIHVjaGFyIHNjYW5Db2RlLAorICAgIGNvZGVwYWdlX2VudHJ5X3QgKnRhYmxlLAorICAgIGludCBjb3VudCkKK3sKKyAgICBjb2RlcGFnZV9lbnRyeV90ICAgICp0ZXN0OworICAgIGludCAgICAgICAgICAgICAgICAgbixwaXZvdCx2YWw7CisKKyAgICBmb3IgKG4gPSBjb3VudDsgbiA+IDA7ICkgeworICAgICAgICBwaXZvdCA9IG4gPj4gMTsKKyAgICAgICAgdGVzdCA9IHRhYmxlICsgcGl2b3Q7CisgICAgICAgIHZhbCA9IHNjYW5Db2RlIC0gdGVzdC0+c2NhbkNvZGU7CisgICAgICAgIGlmICh2YWwgPCAwKQorICAgICAgICAgICAgbiA9IHBpdm90OworICAgICAgICBlbHNlIGlmICh2YWwgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0ZXN0LT5hc2NpaUNvZGU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGFibGUgPSB0ZXN0ICsgMTsKKyAgICAgICAgICAgIG4gLT0gcGl2b3QgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0Lgore3NlY3JldH0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfbWFza0tleUNvZGUoCisgICAgZXZlbnRfdCAqZXZ0KQoreworICAgIGludCBhc2NpaSxzY2FuID0gRVZUX3NjYW5Db2RlKGV2dC0+bWVzc2FnZSk7CisKKyAgICBldnQtPm1lc3NhZ2UgJj0gfjB4RkY7CisgICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX05VTUxPQ0spIHsKKyAgICAgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPm51bVBhZCxFVlQuY29kZVBhZ2UtPm51bVBhZExlbikpICE9IDApIHsKKyAgICAgICAgICAgIGV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9DVFJMU1RBVEUpIHsKKyAgICAgICAgZXZ0LT5tZXNzYWdlIHw9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPmN0cmwsRVZULmNvZGVQYWdlLT5jdHJsTGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0NBUFNMT0NLKSB7CisgICAgICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkgeworICAgICAgICAgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0Q2FwcyxFVlQuY29kZVBhZ2UtPnNoaWZ0Q2Fwc0xlbikpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldnQtPm1lc3NhZ2UgfD0gYXNjaWk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKGFzY2lpID0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+Y2FwcyxFVlQuY29kZVBhZ2UtPmNhcHNMZW4pKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXZ0LT5tZXNzYWdlIHw9IGFzY2lpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHsKKyAgICAgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0LEVWVC5jb2RlUGFnZS0+c2hpZnRMZW4pKSAhPSAwKSB7CisgICAgICAgICAgICBldnQtPm1lc3NhZ2UgfD0gYXNjaWk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBldnQtPm1lc3NhZ2UgfD0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+bm9ybWFsLEVWVC5jb2RlUGFnZS0+bm9ybWFsTGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3aXRoIHRoZSBzcGVjaWZpZWQgc2NhbiBjb2RlIGlzIGJlaW5nIGhlbGQgZG93bi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgX0VWVF9pc0tleURvd24oCisgICAgdWNoYXIgc2NhbkNvZGUpCit7CisgICAgaWYgKHNjYW5Db2RlID4gMHg3RikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEVWVC5rZXlUYWJsZVtzY2FuQ29kZV0gIT0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cit3aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKK21lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZSAoQVNDSUkgY29kZSBhbmQgc2NhbiBjb2RlKQorCitSRU1BUktTOgorQWRkcyBhIG5ldyBrZXlib2FyZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbQord2l0aGluIHRoZSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSEKKworTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCisgICAgICAgIGFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWRkS2V5RXZlbnQoCisgICAgdWludCB3aGF0LAorICAgIHVpbnQgbWVzc2FnZSkKK3sKKyAgICBldmVudF90IGV2dDsKKworICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgIC8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkICovCisgICAgICAgIGV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOworICAgICAgICBldnQud2hhdCA9IHdoYXQ7CisgICAgICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZSB8IDB4MTAwMDBVTDsKKyAgICAgICAgZXZ0LndoZXJlX3ggPSAwOworICAgICAgICBldnQud2hlcmVfeSA9IDA7CisgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gMDsKKyAgICAgICAgZXZ0LnJlbGF0aXZlX3kgPSAwOworICAgICAgICBldnQubW9kaWZpZXJzID0gRVZULmtleU1vZGlmaWVyczsKKyAgICAgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlSRVBFQVQpIHsKKyAgICAgICAgICAgIGlmIChFVlQub2xkS2V5ICE9IC0xKQorICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRLZXldLm1lc3NhZ2UgKz0gMHgxMDAwMFVMOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgRVZULm9sZEtleSA9IEVWVC5mcmVlSGVhZDsKKyAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyNpZmRlZiBfX1FOWF9fCisgICAgICAgICAgICBfRVZUX21hc2tLZXlDb2RlKCZldnQpOworI2VuZGlmCisgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLworICAgICAgICAgICAgfQorICAgICAgICBFVlQub2xkTW92ZSA9IC0xOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgdG8gc2V0IHRoZSByZWFkeS1mb3Itd3JpdGUKK2JpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGtiV2FpdEZvcldyaXRlUmVhZHkodm9pZCkKK3sKKyAgICBpbnQgdGltZW91dCA9IDgxOTI7CisgICAgd2hpbGUgKCh0aW1lb3V0ID4gMCkgJiYgKFBNX2lucGIoMHg2NCkgJiAweDAyKSkKKyAgICAgICAgdGltZW91dC0tOworICAgIHJldHVybiAodGltZW91dCA+IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIHRoZSBrZXlib2FyZCBjb250cm9sbGVyIHRvIHNldCB0aGUgcmVhZHktZm9yLXJlYWQKK2JpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGtiV2FpdEZvclJlYWRSZWFkeSh2b2lkKQoreworICAgIGludCB0aW1lb3V0ID0gODE5MjsKKyAgICB3aGlsZSAoKHRpbWVvdXQgPiAwKSAmJiAoIShQTV9pbnBiKDB4NjQpICYgMHgwMSkpKQorICAgICAgICB0aW1lb3V0LS07CisgICAgcmV0dXJuICh0aW1lb3V0ID4gMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZGF0YSAgICAtIERhdGEgdG8gc2VuZCB0byB0aGUga2V5Ym9hcmQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gc2VuZHMgYSBkYXRhIGJ5dGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBrYlNlbmREYXRhKAorICAgIHVjaGFyIGRhdGEpCit7CisgICAgaW50IHJlc2VuZHMgPSA0OworICAgIGludCB0aW1lb3V0LCB0ZW1wOworCisgICAgZG8geworICAgICAgICBpZiAoIWtiV2FpdEZvcldyaXRlUmVhZHkoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBQTV9vdXRwYigweDYwLGRhdGEpOworICAgICAgICB0aW1lb3V0ID0gODE5MjsKKyAgICAgICAgd2hpbGUgKC0tdGltZW91dCA+IDApIHsKKyAgICAgICAgICAgIGlmICgha2JXYWl0Rm9yUmVhZFJlYWR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB0ZW1wID0gUE1faW5wYigweDYwKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDB4RkEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBpZiAodGVtcCA9PSAweEZFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgocmVzZW5kcy0tID4gMCkgJiYgKHRpbWVvdXQgPiAwKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW9kaWZpZXJzICAgLSBLZXlib2FyZCBtb2RpZmllciBmbGFncworCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZS1wcm9ncmFtcyB0aGUgTEVEJ3Mgb24gdGhlIGtleWJvYXJkIHRvIHRoZSB2YWx1ZXMgc3RvcmVkCitpbiB0aGUgcGFzc2VkIGluIG1vZGlmaWVyIGZsYWdzLiBJZiB0aGUgJ2FsbG93TEVEUycgZmxhZyBpcyBmYWxzZSwgdGhpcworZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNldExFRFMoCisgICAgdWludCBtb2RpZmllcnMpCit7CisgICAgaWYgKEVWVC5hbGxvd0xFRFMpIHsKKyAgICAgICAgaWYgKCFrYlNlbmREYXRhKDB4RUQpIHx8ICFrYlNlbmREYXRhKChtb2RpZmllcnM+PjkpICYgNykpIHsKKyAgICAgICAgICAgIGtiU2VuZERhdGEoMHhGNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBwcm9jZXNzIHJhdyBzY2FuIGNvZGVzIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQgY29udHJvbGxlci4KKworTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCisgICAgICAgIGFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuCit7c2VjcmV0fQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJvY2Vzc1Jhd1NjYW5Db2RlKAorICAgIGludCBzY2FuKQoreworICAgIHN0YXRpYyBpbnQgIHBhdXNlTG9vcCA9IDA7CisgICAgc3RhdGljIGludCAgZXh0ZW5kZWQgPSAwOworICAgIGludCAgICAgICAgIHdoYXQ7CisKKyAgICBpZiAocGF1c2VMb29wKSB7CisgICAgICAgIC8qIFNraXAgc2NhbiBjb2RlcyB1bnRpbCB0aGUgcGF1c2Uga2V5IHNlcXVlbmNlIGhhcyBiZWVuIHJlYWQgKi8KKyAgICAgICAgcGF1c2VMb29wLS07CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChzY2FuID09IDB4RTApIHsKKyAgICAgICAgLyogVGhpcyBzaWduYWxzIHRoZSBzdGFydCBvZiBhbiBleHRlbmRlZCBzY2FuIGNvZGUgc2VxdWVuY2UgKi8KKyAgICAgICAgZXh0ZW5kZWQgPSAxOworICAgICAgICB9CisgICAgZWxzZSBpZiAoc2NhbiA9PSAweEUxKSB7CisgICAgICAgIC8qIFRoZSBQYXVzZSBrZXkgc2VuZHMgYSBzdHJhbmdlIHNjYW4gY29kZSBzZXF1ZW5jZSwgd2hpY2ggaXM6CisgICAgICAgICAqCisgICAgICAgICAqICBFMSAxRCA1MiBFMSA5RCBEMgorICAgICAgICAgKgorICAgICAgICAgKiBIb3dldmVyIHRoZXJlIGlzIG5ldmVyIGFueSByZWxlYXNlIGNvZGUgbm9yIGFueSBhdXRvLXJlcGVhdCBmb3IKKyAgICAgICAgICogdGhpcyBrZXkuIEZvciB0aGlzIHJlYXNvbiB3ZSBzaW1wbHkgaWdub3JlIHRoZSBrZXkgYW5kIHNraXAgdGhlCisgICAgICAgICAqIG5leHQgNSBzY2FuIGNvZGVzIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQuCisgICAgICAgICAqLworICAgICAgICBwYXVzZUxvb3AgPSA1OworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFByb2Nlc3MgdGhlIHNjYW4gY29kZSBub3JtYWxseSAoaXQgbWF5IGJlIGFuIGV4dGVuZGVkIGNvZGUKKyAgICAgICAgICogaG93ZXZlciEpLiBCaXQgNyBtZWFucyBrZXkgd2FzIHJlbGVhc2VkLCBhbmQgYml0cyAwLTYgYXJlIHRoZQorICAgICAgICAgKiBzY2FuIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB3aGF0ID0gKHNjYW4gJiAweDgwKSA/IEVWVF9LRVlVUCA6IEVWVF9LRVlET1dOOworICAgICAgICBzY2FuICY9IDB4N0Y7CisgICAgICAgIGlmIChleHRlbmRlZCkgeworICAgICAgICAgICAgZXh0ZW5kZWQgPSAwOworICAgICAgICAgICAgaWYgKHNjYW4gPT0gMHgyQSB8fCBzY2FuID09IDB4MzYpIHsKKyAgICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlc2UgZXh0ZW5kZWQgc2NhbiBjb2RlIHNlcXVlbmNlcy4gVGhlc2UgYXJlCisgICAgICAgICAgICAgICAgICogdXNlZCBieSB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byB3cmFwIGFyb3VuZCBjZXJ0YWluCisgICAgICAgICAgICAgICAgICoga2V5IHNlcXVlbmNlcyBmb3IgdGhlIGtleXBhZCAoYW5kIHdoZW4gTlVNTE9DSyBpcyBkb3duCisgICAgICAgICAgICAgICAgICogaW50ZXJuYWxseSkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29udmVydCBleHRlbmRlZCBjb2RlcyBmb3Iga2V5IHNlcXVlbmNlcyB0aGF0IHdlIG1hcCB0bworICAgICAgICAgICAgICogdmlydHVhbCBzY2FuIGNvZGVzIHNvIHRoZSB1c2VyIGNhbiBkZXRlY3QgdGhlbSBpbiB0aGVpcgorICAgICAgICAgICAgICogY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChzY2FuKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9sZWZ0Q3RybDogICBzY2FuID0gS0JfcmlnaHRDdHJsOyAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRBbHQ6ICAgIHNjYW4gPSBLQl9yaWdodEFsdDsgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS0JfZGl2aWRlOiAgICAgc2NhbiA9IEtCX3BhZERpdmlkZTsgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9lbnRlcjogICAgICBzY2FuID0gS0JfcGFkRW50ZXI7ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX3BhZFRpbWVzOiAgIHNjYW4gPSBLQl9zeXNSZXE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHJlZ3VsYXIgc2NhbiBjb2RlcyBmb3Iga2V5IHNlcXVlbmNlcyB0aGF0IHdlIG1hcCB0bworICAgICAgICAgICAgICogdmlydHVhbCBzY2FuIGNvZGVzIHNvIHRoZSB1c2VyIGNhbiBkZXRlY3QgdGhlbSBpbiB0aGVpcgorICAgICAgICAgICAgICogY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChzY2FuKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9sZWZ0OiAgICAgICBzY2FuID0gS0JfcGFkTGVmdDsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX3JpZ2h0OiAgICAgIHNjYW4gPSBLQl9wYWRSaWdodDsgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS0JfdXA6ICAgICAgICAgc2NhbiA9IEtCX3BhZFVwOyAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9kb3duOiAgICAgICBzY2FuID0gS0JfcGFkRG93bjsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2luc2VydDogICAgIHNjYW4gPSBLQl9wYWRJbnNlcnQ7ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS0JfZGVsZXRlOiAgICAgc2NhbiA9IEtCX3BhZERlbGV0ZTsgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9ob21lOiAgICAgICBzY2FuID0gS0JfcGFkSG9tZTsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2VuZDogICAgICAgIHNjYW4gPSBLQl9wYWRFbmQ7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS0JfcGFnZVVwOiAgICAgc2NhbiA9IEtCX3BhZFBhZ2VVcDsgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9wYWdlRG93bjogICBzY2FuID0gS0JfcGFkUGFnZURvd247ICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBrZXkgaXMgYW4gVVAsIERPV04gb3IgUkVQRUFUIGFuZCBtYWludGFpbiB0aGUKKyAgICAgICAgICogdXAvZG93biBzdGF0dXMgb2YgYWxsIGtleXMgaW4gb3VyIGdsb2JhbCBrZXkgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBpZiAod2hhdCA9PSBFVlRfS0VZRE9XTikgeworICAgICAgICAgICAgaWYgKEVWVC5rZXlUYWJsZVtzY2FuXSkKKyAgICAgICAgICAgICAgICB3aGF0ID0gRVZUX0tFWVJFUEVBVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBFVlQua2V5VGFibGVbc2Nhbl0gPSBzY2FuOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEVWVC5rZXlUYWJsZVtzY2FuXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogSGFuZGxlIHNoaWZ0IGtleSBtb2RpZmllcnMgKi8KKyAgICAgICAgaWYgKHdoYXQgIT0gRVZUX0tFWVJFUEVBVCkgeworICAgICAgICAgICAgc3dpdGNoIChzY2FuKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9jYXBzTG9jazoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9DQVBTTE9DSzsKKyAgICAgICAgICAgICAgICAgICAgc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLQl9udW1Mb2NrOgorICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBFVlRfS0VZRE9XTikKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5rZXlNb2RpZmllcnMgXj0gRVZUX05VTUxPQ0s7CisgICAgICAgICAgICAgICAgICAgIHNldExFRFMoRVZULmtleU1vZGlmaWVycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS0Jfc2Nyb2xsTG9jazoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9TQ1JPTExMT0NLOworICAgICAgICAgICAgICAgICAgICBzZXRMRURTKEVWVC5rZXlNb2RpZmllcnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRTaGlmdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQorICAgICAgICAgICAgICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX0xFRlRTSElGVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfTEVGVFNISUZUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX3JpZ2h0U2hpZnQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9SSUdIVFNISUZUOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRDdHJsOgorICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfTEVGVENUUkw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX3JpZ2h0Q3RybDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQorICAgICAgICAgICAgICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX1JJR0hUQ1RSTDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfUklHSFRDVFJMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRBbHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9MRUZUQUxUOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtCX3JpZ2h0QWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfUklHSFRBTFQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTVVBQT1JUX0NUUkxfQUxUX0RFTAorICAgICAgICAgICAgICAgIGNhc2UgS0JfZGVsZXRlOgorICAgICAgICAgICAgICAgICAgICBpZiAoKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ1RSTFNUQVRFKSAmJiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkpCisgICAgICAgICAgICAgICAgICAgICAgICBSZWJvb3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogQWRkIHRoZSB1bnRyYW5zbGF0ZWQga2V5IGNvZGUgdG8gdGhlIGV2ZW50IHF1ZXVlLiBBbGwKKyAgICAgICAgICogdHJhbnNsYXRpb24gdG8gQVNDSUkgZnJvbSB0aGUga2V5IGNvZGVzIG9jY3VycyB3aGVuIHRoZSBrZXkKKyAgICAgICAgICogaXMgZXh0cmFjdGVkIGZyb20gdGhlIHF1ZXVlLCBzYXZpbmcgdGltZSBpbiB0aGUgbG93IGxldmVsCisgICAgICAgICAqIGludGVycnVwdCBoYW5kbGVyLgorICAgICAgICAgKi8KKyAgICAgICAgYWRkS2V5RXZlbnQod2hhdCxzY2FuIDw8IDgpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK0VuYWJsZXMvZGlzYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLgorCitIRUFERVI6CitldmVudC5oCisKK1BBUkFNRVRFUlM6CitlbmFibGUgIC0gVHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKKworUkVNQVJLUzoKK0VuYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLiBTb21ldGltZXMgaXQgbWF5CitiZSBjb252ZW5pZW50IGluIHRoZSBhcHBsaWNhdGlvbiB0byB0dXJuIG9mZiB0aGUgdXBkYXRpbmcgb2YgdGhlIExFRAorc3RhdHVzIGluZGljYXRvcnMgKHN1Y2ggYXMgaWYgYSBnYW1lIGlzIHVzaW5nIHRoZSBDQVBTTE9DSyBrZXkgZm9yIHNvbWUKK2Z1bmN0aW9uKS4gUGFzc2luZyBpbiBhIHZhbHVlIG9mIEZBTFNFIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiBhbGwKK3RoZSBMRURTLCBhbmQgc3RvcCB1cGRhdGluZyB0aGVtIHdoZW4gdGhlIGludGVybmFsIHN0YXR1cyBjaGFuZ2VzIChub3RlCitob3dldmVyIHRoYXQgaW50ZXJuYWxseSB3ZSBzdGlsbCBrZWVwIHRyYWNrIG9mIHRoZSB0b2dnbGUga2V5IHN0YXR1cyEpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9hbGxvd0xFRFMoCisgICAgaWJvb2wgZW5hYmxlKQoreworICAgIEVWVC5hbGxvd0xFRFMgPSB0cnVlOworICAgIGlmIChlbmFibGUpCisgICAgICAgIHNldExFRFMoRVZULmtleU1vZGlmaWVycyk7CisgICAgZWxzZQorICAgICAgICBzZXRMRURTKDApOworICAgIEVWVC5hbGxvd0xFRFMgPSBlbmFibGU7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VmMjIxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL21hbGxvYy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgZm9yIGltcGxlbWVudGluZyB0aGUgUE0gbGlicmFyeSBvdmVycmlkZWFibGUgbWVtb3J5CisqICAgICAgICAgICAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICogKCpfX1BNX21hbGxvYykoc2l6ZV90IHNpemUpICAgICAgICAgICAgICA9IG1hbGxvYzsKK3ZvaWQgKiAoKl9fUE1fY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpID0gY2FsbG9jOwordm9pZCAqICgqX19QTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpICAgPSByZWFsbG9jOwordm9pZCAoKl9fUE1fZnJlZSkodm9pZCAqcCkgICAgICAgICAgICAgICAgICAgICAgPSBmcmVlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitVc2UgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKK0hFQURFUjoKK3BtYXBpLmgKKworUEFSQU1FVEVSUzoKK21hbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBtYWxsb2Mgcm91dGluZSB0byB1c2UKK2NhbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBjYWFsbG9jIHJvdXRpbmUgdG8gdXNlCityZWFsbG9jIC0gUG9pbnRlciB0byBuZXcgcmVhbGxvYyByb3V0aW5lIHRvIHVzZQorZnJlZSAgICAtIFBvaW50ZXIgdG8gbmV3IGZyZWUgcm91dGluZSB0byB1c2UKKworUkVNQVJLUzoKK1RlbGxzIHRoZSBQTSBsaWJyYXJ5IHRvIHVzZSBhIHNldCBvZiB1c2VyIHNwZWNpZmllZCBtZW1vcnkgYWxsb2NhdGlvbgorcm91dGluZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgbm9ybWFsIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9mcmVlIHN0YW5kYXJkCitDIGxpYnJhcnkgZnVuY3Rpb25zLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byB1c2UgYSB0aGlyZCBwYXJ0eQorZGVidWdnaW5nIG1hbGxvYyBsaWJyYXJ5IG9yIHBlcmhhcHMgYSBzZXQgb2YgZmFzdGVyIG1lbW9yeSBhbGxvY2F0aW9uCitmdW5jdGlvbnMgd2l0aCB0aGUgUE0gbGlicmFyeSwgb3IgYW55IGFwcHMgdGhhdCB1c2UgdGhlIFBNIGxpYnJhcnkgKHN1Y2ggYXMKK3RoZSBNR0wpLiBPbmNlIHlvdSBoYXZlIHJlZ2lzdGVyZWQgeW91ciBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywgYWxsCitjYWxscyB0byBQTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYyBhbmQgUE1fZnJlZSB3aWxsIGJlIHJldmVjdG9yZWQgdG8KK3lvdXIgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKK1RoaXMgaXMgYWxzbyB1c2VmdWwgaWYgeW91IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBqdXN0IGhvdyBtdWNoIHBoeXNpY2FsCittZW1vcnkgeW91ciBwcm9ncmFtIGhhcyBiZWVuIHVzaW5nLiBZb3UgY2FuIHVzZSB0aGUgUE1fYXZhaWxhYmxlTWVtb3J5CitmdW5jdGlvbiB0byBmaW5kIG91dCBob3cgbXVjaCBwaHlzaWNhbCBtZW1vcnkgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHByb2dyYW0KK3N0YXJ0cywgYW5kIHRoZW4geW91IGNhbiB1c2UgeW91ciBvd24gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdG8KK2tlZXAgdHJhY2sgb2YgaG93IG11Y2ggbWVtb3J5IGhhcyBiZWVuIHVzZWQgYW5kIGZyZWVkLgorCitOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYXQgdGhlIHN0YXJ0IG9mIHlvdXIgYXBwbGljYXRpb24sCisgICAgICBiZWZvcmUgeW91IGluaXRpYWxpc2UgYW55IG90aGVyIGNvbXBvbmVudHMgb3IgbGlicmFyaWVzLgorCitOT1RFOiBDb2RlIGNvbXBpbGVkIGludG8gQmluYXJ5IFBvcnRhYmxlIERMTCdzIGFuZCBEcml2ZXJzIGF1dG9tYXRpY2FsbHkKKyAgICAgIGVuZCB1cCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyB2aWEgdGhlIEJQRCBDIHJ1bnRpbWUgbGlicmFyeS4KKworU0VFIEFMU086CitQTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYywgUE1fZnJlZSwgUE1fYXZhaWxhYmxlTWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV91c2VMb2NhbE1hbGxvYygKKyAgICB2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSwKKyAgICB2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksCisgICAgdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSwKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqcCkpCit7CisgICAgX19QTV9tYWxsb2MgPSBtYWxsb2M7CisgICAgX19QTV9jYWxsb2MgPSBjYWxsb2M7CisgICAgX19QTV9yZWFsbG9jID0gcmVhbGxvYzsKKyAgICBfX1BNX2ZyZWUgPSBmcmVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitBbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KKworSEVBREVSOgorcG1hcGkuaAorCitQQVJBTUVURVJTOgorc2l6ZSAgICAtIFNpemUgb2YgYmxvY2sgdG8gYWxsb2NhdGUgaW4gYnl0ZXMKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gYWxsb2NhdGVkIGJsb2NrLCBvciBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCisKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIHNpemUuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeQorYWxsb2NhdGlvbiByb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzCitmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCit0aGF0IHlvdSBoYXZlIHJlZ2lzdGVyZWQuCisKK1NFRSBBTFNPOgorUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYWxsb2MoCisgICAgc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuIF9fUE1fbWFsbG9jKHNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitBbGxvY2F0ZSBhbmQgY2xlYXIgYSBsYXJnZSBtZW1vcnkgYmxvY2suCisKK0hFQURFUjoKK3BtYXBpLmgKKworUEFSQU1FVEVSUzoKK25lbGVtICAgLSBudW1iZXIgb2YgY29udGlndW91cyBzaXplLWJ5dGUgdW5pdHMgdG8gYWxsb2NhdGUKK3NpemUgICAgLSBzaXplIG9mIHVuaXQgaW4gYnl0ZXMKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBpZiBzdWNjZXNzZnVsLCBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCisKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIChzaXplICogbmVsZW0pLCBhbmQgY2xlYXJzIHRoZQorYWxsb2NhdGVkIGFyZWEgd2l0aCB6ZXJvcyAoMCkuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCityb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uCit3aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRoYXQgeW91CitoYXZlIHJlZ2lzdGVyZWQuCisKK1NFRSBBTFNPOgorUE1fbWFsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9jYWxsb2MoCisgICAgc2l6ZV90IG5lbGVtLAorICAgIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBfX1BNX2NhbGxvYyhuZWxlbSxzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmUtYWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkKKworSEVBREVSOgorcG1hcGkuaAorCitQQVJBTUVURVJTOgorcHRyICAgICAtIFBvaW50ZXIgdG8gYmxvY2sgdG8gcmVzaXplCitzaXplICAgIC0gc2l6ZSBvZiB1bml0IGluIGJ5dGVzCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZWFsbG9jYXRlcyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgYmVlbgorYWxsb2NhdGVkIHRvIHRoZSBuZXcgb2Ygc2l6ZS4gVGhlIG5ldyBzaXplIG1heSBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuCit0aGUgb3JpZ2luYWwgYmxvY2sgb2YgbWVtb3J5LiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBtZW1vcnkgYWxsb2NhdGlvbgorcm91dGluZXMgd2l0aCB0aGUgUE1fdXNlTG9jYWxNYWxsb2MgZnVuY3Rpb24sIHRoZW4gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgord2lsbCBhY3R1YWxseSBtYWtlIGNhbGxzIHRvIHRoZSBsb2NhbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0IHlvdQoraGF2ZSByZWdpc3RlcmVkLgorCitTRUUgQUxTTzoKK1BNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9yZWFsbG9jKAorICAgIHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gX19QTV9yZWFsbG9jKHB0cixzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorRnJlZXMgYSBibG9jayBvZiBtZW1vcnkuCisKK0hFQURFUjoKK3BtYXBpLmgKKworUEFSQU1FVEVSUzoKK3AgICAtIFBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRvIGZyZWUKKworUkVNQVJLUzoKK0ZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggZWl0aGVyIFBNX21hbGxvYywKK1BNX2NhbGxvYyBvciBQTV9yZWFsbG9jLgorCitTRUUgQUxTTzoKK1BNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV91c2VMb2NhbE1hbGxvYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZSgKKyAgICB2b2lkICpwKQoreworICAgIF9fUE1fZnJlZShwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tdHJyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2VkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jCkBAIC0wLDAgKzEsODY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgICAgICAgICAgICBIZWF2aWx5IGJhc2VkIG9uIGNvZGUgY29weXJpZ2h0IChDKSBSaWNoYXJkIEdvb2NoCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFJpbmcgMCBkZXZpY2UgZHJpdmVyCisqCisqIERlc2NyaXB0aW9uOiAgR2VuZXJpYyBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlciAoTVRSUikgZnVuY3Rpb25zIHRvCisqICAgICAgICAgICAgICAgbWFuaXB1bGF0ZSB0aGUgTVRSUiByZWdpc3RlcnMgb24gc3VwcG9ydGVkIENQVSdzLiBUaGlzIGNvZGUKKyogICAgICAgICAgICAgICAqbXVzdCogcnVuIGF0IHJpbmcgMCwgc28geW91IGNhbid0IG5vcm1hbGx5IGluY2x1ZGUgdGhpcworKiAgICAgICAgICAgICAgIGNvZGUgZGlyZWN0bHkgaW4gbm9ybWFsIGFwcGxpY2F0aW9ucyAodGhlIGV4Y2VwdCBpcyBET1M0R1cKKyogICAgICAgICAgICAgICBhcHBzIHdoaWNoIHJ1biBhdCByaW5nIDAgdW5kZXIgcmVhbCBET1MpLiBUaHVzIHRoaXMgY29kZQorKiAgICAgICAgICAgICAgIHdpbGwgbm9ybWFsbHkgYmUgY29tcGlsZWQgaW50byBhIHJpbmcgMCBkZXZpY2UgZHJpdmVyIGZvcgorKiAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgb3BlcmF0aW5nIHN5c3RlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgInp0aW1lcmMuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisKKyNpZm5kZWYgUkVBTE1PREUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW50ZWwgcHJlLWRlZmluZWQgTVRSUiByZWdpc3RlcnMgKi8KKworI2RlZmluZSBOVU1fRklYRURfUkFOR0VTICAgICAgICA4OAorI2RlZmluZSBJTlRFTF9jYXBfTVNSICAgICAgICAgICAweDBGRQorI2RlZmluZSBJTlRFTF9kZWZUeXBlX01TUiAgICAgICAweDJGRgorI2RlZmluZSBJTlRFTF9maXg2NEtfMDAwMDBfTVNSICAweDI1MAorI2RlZmluZSBJTlRFTF9maXgxNktfODAwMDBfTVNSICAweDI1OAorI2RlZmluZSBJTlRFTF9maXgxNktfQTAwMDBfTVNSICAweDI1OQorI2RlZmluZSBJTlRFTF9maXg0S19DMDAwMF9NU1IgICAweDI2OAorI2RlZmluZSBJTlRFTF9maXg0S19DODAwMF9NU1IgICAweDI2OQorI2RlZmluZSBJTlRFTF9maXg0S19EMDAwMF9NU1IgICAweDI2QQorI2RlZmluZSBJTlRFTF9maXg0S19EODAwMF9NU1IgICAweDI2QgorI2RlZmluZSBJTlRFTF9maXg0S19FMDAwMF9NU1IgICAweDI2QworI2RlZmluZSBJTlRFTF9maXg0S19FODAwMF9NU1IgICAweDI2RAorI2RlZmluZSBJTlRFTF9maXg0S19GMDAwMF9NU1IgICAweDI2RQorI2RlZmluZSBJTlRFTF9maXg0S19GODAwMF9NU1IgICAweDI2RgorCisvKiBNYWNyb3MgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiBhIHBhcmljdWxhciBNU1IgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBJTlRFTF9waHlzQmFzZV9NU1IocmVnKSAoMHgyMDAgKyAyICogKHJlZykpCisjZGVmaW5lIElOVEVMX3BoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKy8qIEN5cml4IENQVSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZGV4ZXMgKi8KKyNkZWZpbmUgQ1g4Nl9DQ1IwIDB4QzAKKyNkZWZpbmUgQ1g4Nl9DQ1IxIDB4QzEKKyNkZWZpbmUgQ1g4Nl9DQ1IyIDB4QzIKKyNkZWZpbmUgQ1g4Nl9DQ1IzIDB4QzMKKyNkZWZpbmUgQ1g4Nl9DQ1I0IDB4RTgKKyNkZWZpbmUgQ1g4Nl9DQ1I1IDB4RTkKKyNkZWZpbmUgQ1g4Nl9DQ1I2IDB4RUEKKyNkZWZpbmUgQ1g4Nl9ESVIwIDB4RkUKKyNkZWZpbmUgQ1g4Nl9ESVIxIDB4RkYKKyNkZWZpbmUgQ1g4Nl9BUlJfQkFTRSAweEM0CisjZGVmaW5lIENYODZfUkNSX0JBU0UgMHhEQworCisvKiBTdHJ1Y3R1cmUgdG8gbWFpbnRhaW4gbWFjaGluZSBzdGF0ZSB3aGlsZSB1cGRhdGluZyBNVFJSIHJlZ2lzdGVycyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBmbGFnczsKKyAgICB1bG9uZyAgIGRlZlR5cGVMbzsKKyAgICB1bG9uZyAgIGRlZlR5cGVIaTsKKyAgICB1bG9uZyAgIGNyNFZhbDsKKyAgICB1bG9uZyAgIGNjcjM7CisgICAgfSBNVFJSQ29udGV4dDsKKworc3RhdGljIGludCAgICAgIG51bU1UUlIgPSAtMTsKK3N0YXRpYyBpbnQgICAgICBjcHVGYW1pbHksY3B1VHlwZSxjcHVTdGVwcGluZzsKK3N0YXRpYyB2b2lkICAgICAoKmdldE1UUlIpKHVpbnQgcmVnLHVsb25nICpiYXNlLHVsb25nICpzaXplLGludCAqdHlwZSkgPSBOVUxMOworc3RhdGljIHZvaWQgICAgICgqc2V0TVRSUikodWludCByZWcsdWxvbmcgYmFzZSx1bG9uZyBzaXplLGludCB0eXBlKSA9IE5VTEw7CitzdGF0aWMgaW50ICAgICAgKCpnZXRGcmVlUmVnaW9uKSh1bG9uZyBiYXNlLHVsb25nIHNpemUpID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitSZXR1cm5zIG5vbi16ZXJvIGlmIHdlIGhhdmUgdGhlIHdyaXRlLWNvbWJpbmluZyBtZW1vcnkgdHlwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgTVRSUl9oYXZlV3JpdGVDb21iaW5lKHZvaWQpCit7CisgICAgdWxvbmcgICBjb25maWcsZHVtbXk7CisKKyAgICBzd2l0Y2ggKGNwdUZhbWlseSkgeworICAgICAgICBjYXNlIENQVV9BTUQ6CisgICAgICAgICAgICBpZiAoY3B1VHlwZSA8IENQVV9BTURBdGhsb24pIHsKKyAgICAgICAgICAgICAgICAvKiBBTUQgSzYtMiBzdGVwcGluZyA4IGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycy4KKyAgICAgICAgICAgICAgICAgKiBUaGUgZWFybGllciBLNi0yIHN0ZXBwaW5ncyAoMzAwTWh6IG1vZGVscykgZG8gbm90CisgICAgICAgICAgICAgICAgICogc3VwcG9ydCBNVFJSJ3MuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKChjcHVUeXBlIDwgQ1BVX0FNREs2XzIpIHx8IChjcHVUeXBlID09IENQVV9BTURLNl8yICYmIGNwdVN0ZXBwaW5nIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCBmb3IgQU1EIEF0aGxvbiB3aGljaCB1c2VzIFA2IHN0eWxlIE1UUlIncyAqLworICAgICAgICBjYXNlIENQVV9JbnRlbDoKKyAgICAgICAgICAgIF9NVFJSX3JlYWRNU1IoSU5URUxfY2FwX01TUiwmY29uZmlnLCZkdW1teSk7CisgICAgICAgICAgICByZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7CisgICAgICAgIGNhc2UgQ1BVX0N5cml4OgorICAgICAgICAgICAgLyogQ3lyaXggNng4NiBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KKyAgICAgICAgICAgIGlmIChjcHVUeXBlIDwgQ1BVX0N5cml4Nng4NikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KKworUkVUVVJOUzoKK1RoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisKK1JFTUFSS1M6CitHZW5lcmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlIHVzZWQKK2ZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgR0VORVJJQ19nZXRGcmVlUmVnaW9uKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgc2l6ZSkKK3sKKyAgICBpbnQgICAgIGksbHR5cGU7CisgICAgdWxvbmcgICBsYmFzZSxsc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1NVFJSOyBpKyspIHsKKyAgICAgICAgZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgaWYgKGxzaXplIDwgMSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgKHZvaWQpYmFzZTsKKyAgICAodm9pZClzaXplOworICAgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitiYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgorCitSRVRVUk5TOgorVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KKworUkVNQVJLUzoKK0dlbmVyaWMgZnVuY3Rpb24gdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgYSBmcmVlIE1UUlIgcmVnaXN0ZXIgdG8gYmUgdXNlZAorZm9yIGNyZWF0aW5nIGEgbmV3IG1hcHBpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBBTURLNl9nZXRGcmVlUmVnaW9uKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgc2l6ZSkKK3sKKyAgICBpbnQgICAgIGksbHR5cGU7CisgICAgdWxvbmcgICBsYmFzZSxsc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1NVFJSOyBpKyspIHsKKyAgICAgICAgZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgaWYgKGxzaXplIDwgMSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgKHZvaWQpYmFzZTsKKyAgICAodm9pZClzaXplOworICAgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitiYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgorCitSRVRVUk5TOgorVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KKworUkVNQVJLUzoKK0N5cml4IHNwZWNpZmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlCit1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgQ1lSSVhfZ2V0RnJlZVJlZ2lvbigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIHNpemUpCit7CisgICAgaW50ICAgICBpLGx0eXBlOworICAgIHVsb25nICAgbGJhc2UsIGxzaXplOworCisgICAgaWYgKHNpemUgPiAweDIwMDAwMDBVTCkgeworICAgICAgICAvKiBJZiB3ZSBhcmUgdG8gc2V0IHVwIGEgcmVnaW9uID4zMk0gdGhlbiBsb29rIGF0IEFSUjcgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgZ2V0TVRSUig3LCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgaWYgKGxzaXplIDwgMSkKKyAgICAgICAgICAgIHJldHVybiA3OworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENoZWNrIEFSUjAtNiByZWdpc3RlcnMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICAgICAgZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgICAgIGlmIChsc2l6ZSA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIC8qIFRyeSBBUlI3IGJ1dCBpdHMgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDI1NksgKi8KKyAgICAgICAgZ2V0TVRSUig3LCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgaWYgKChsc2l6ZSA8IDEpICYmIChzaXplID49IDB4NDAwMDApKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAodm9pZCliYXNlOworICAgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitjICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbWFjaGluZSBjb250ZXh0IGFjcm9zcyB0aGUgY2FsbAorCitSRU1BUktTOgorUHV0cyB0aGUgcHJvY2Vzc29yIGludG8gYSBzdGF0ZSB3aGVyZSBNVFJScyBjYW4gYmUgc2FmZWx5IHVwZGF0ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBNVFJSX2JlZ2luVXBkYXRlKAorICAgIE1UUlJDb250ZXh0ICpjKQoreworICAgIGMtPmZsYWdzID0gX01UUlJfZGlzYWJsZUludCgpOworICAgIGlmIChjcHVGYW1pbHkgIT0gQ1BVX0FNRCB8fCAoY3B1RmFtaWx5ID09IENQVV9BTUQgJiYgY3B1VHlwZSA+PSBDUFVfQU1EQXRobG9uKSkgeworICAgICAgICBzd2l0Y2ggKGNwdUZhbWlseSkgeworICAgICAgICAgICAgY2FzZSBDUFVfSW50ZWw6CisgICAgICAgICAgICBjYXNlIENQVV9BTUQ6CisgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICovCisgICAgICAgICAgICAgICAgYy0+Y3I0VmFsID0gX01UUlJfc2F2ZUNSNCgpOworICAgICAgICAgICAgICAgIF9NVFJSX3JlYWRNU1IoSU5URUxfZGVmVHlwZV9NU1IsJmMtPmRlZlR5cGVMbywmYy0+ZGVmVHlwZUhpKTsKKyAgICAgICAgICAgICAgICBfTVRSUl93cml0ZU1TUihJTlRFTF9kZWZUeXBlX01TUixjLT5kZWZUeXBlTG8gJiAweEYzMDBVTCxjLT5kZWZUeXBlSGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDUFVfQ3lyaXg6CisgICAgICAgICAgICAgICAgYy0+Y2NyMyA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IzKTsKKyAgICAgICAgICAgICAgICBfTVRSUl9zZXRDeDg2KENYODZfQ0NSMywgKHVjaGFyKSgoYy0+Y2NyMyAmIDB4MEYpIHwgMHgxMCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYyAgIC0gUGxhY2UgdG8gcmVzdG9yZSB0aGUgbWFjaGluZSBjb250ZXh0IGZyb20KKworUkVNQVJLUzoKK1Jlc3RvcmVzIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgdXBkYXRpbmcgYW55IG9mIHRoZSByZWdpc3RlcnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBNVFJSX2VuZFVwZGF0ZSgKKyAgICBNVFJSQ29udGV4dCAqYykKK3sKKyAgICBpZiAoY3B1RmFtaWx5ICE9IENQVV9BTUQgfHwgKGNwdUZhbWlseSA9PSBDUFVfQU1EICYmIGNwdVR5cGUgPj0gQ1BVX0FNREF0aGxvbikpIHsKKyAgICAgICAgUE1fZmx1c2hUTEIoKTsKKyAgICAgICAgc3dpdGNoIChjcHVGYW1pbHkpIHsKKyAgICAgICAgICAgIGNhc2UgQ1BVX0ludGVsOgorICAgICAgICAgICAgY2FzZSBDUFVfQU1EOgorICAgICAgICAgICAgICAgIF9NVFJSX3dyaXRlTVNSKElOVEVMX2RlZlR5cGVfTVNSLGMtPmRlZlR5cGVMbyxjLT5kZWZUeXBlSGkpOworICAgICAgICAgICAgICAgIF9NVFJSX3Jlc3RvcmVDUjQoYy0+Y3I0VmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1BVX0N5cml4OgorICAgICAgICAgICAgICAgIF9NVFJSX3NldEN4ODYoQ1g4Nl9DQ1IzLCh1Y2hhciljLT5jY3IzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogUmUtZW5hYmxlIGludGVycnVwdHMgKGlmIGVuYWJsZWQgcHJldmlvdXNseSkgKi8KKyAgICBfTVRSUl9yZXN0b3JlSW50KGMtPmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byByZWFkCitiYXNlICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgordHlwZSAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitJbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byByZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgSU5URUxfZ2V0TVRSUigKKyAgICB1aW50IHJlZywKKyAgICB1bG9uZyAqYmFzZSwKKyAgICB1bG9uZyAqc2l6ZSwKKyAgICBpbnQgKnR5cGUpCit7CisgICAgdWxvbmcgaGksbWFza0xvLGJhc2VMbzsKKworICAgIF9NVFJSX3JlYWRNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksJm1hc2tMbywmaGkpOworICAgIGlmICgobWFza0xvICYgMHg4MDApID09IDApIHsKKyAgICAgICAgLyogTVRSUiBpcyBkaXNhYmxlZCwgc28gaXQgaXMgZnJlZSAqLworICAgICAgICAqYmFzZSA9IDA7CisgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgKnR5cGUgPSAwOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBfTVRSUl9yZWFkTVNSKElOVEVMX3BoeXNCYXNlX01TUihyZWcpLCZiYXNlTG8sJmhpKTsKKyAgICBtYXNrTG8gPSAobWFza0xvICYgMHhGRkZGRjAwMFVMKTsKKyAgICAqc2l6ZSA9IH4obWFza0xvIC0gMSk7CisgICAgKmJhc2UgPSAoYmFzZUxvICYgMHhGRkZGRjAwMFVMKTsKKyAgICAqdHlwZSA9IChiYXNlTG8gJiAweEZGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKK2Jhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3NpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCit0eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitJbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwordGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIElOVEVMX3NldE1UUlIoCisgICAgdWludCByZWcsCisgICAgdWxvbmcgYmFzZSwKKyAgICB1bG9uZyBzaXplLAorICAgIGludCB0eXBlKQoreworICAgIE1UUlJDb250ZXh0IGM7CisKKyAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIFRoZSBpbnZhbGlkIGJpdCBpcyBrZXB0IGluIHRoZSBtYXNrLCBzbyB3ZSBzaW1wbHkgY2xlYXIgdGhlCisgICAgICAgICAqIHJlbGV2YW50IG1hc2sgcmVnaXN0ZXIgdG8gZGlzYWJsZSBhIHJhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAgX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksMCwwKTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBfTVRSUl93cml0ZU1TUihJTlRFTF9waHlzQmFzZV9NU1IocmVnKSxiYXNlIHwgdHlwZSwwKTsKKyAgICAgICAgX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksfihzaXplIC0gMSkgfCAweDgwMCwwKTsKKyAgICAgICAgfQorICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEaXNhYmxlZCBiYW5rZWQgd3JpdGUgY29tYmluZyBmb3IgSW50ZWwgcHJvY2Vzc29ycy4gV2UgYWx3YXlzIGRpc2FibGUgdGhpcworYmVjYXVzZSBpdCBpbnZhcmlhYmx5IGNhdXNlcyBwcm9ibGVtcyB3aXRoIG9sZGVyIGhhcmR3YXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIElOVEVMX2Rpc2FibGVCYW5rZWRXcml0ZUNvbWJpbmUodm9pZCkKK3sKKyAgICBNVFJSQ29udGV4dCBjOworCisgICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7CisgICAgX01UUlJfd3JpdGVNU1IoSU5URUxfZml4MTZLX0EwMDAwX01TUiwwLDApOworICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKK2Jhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3NpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCit0eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitJbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwordGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEFNRF9nZXRNVFJSKAorICAgIHVpbnQgcmVnLAorICAgIHVsb25nICpiYXNlLAorICAgIHVsb25nICpzaXplLAorICAgIGludCAqdHlwZSkKK3sKKyAgICB1bG9uZyAgIGxvdyxoaWdoOworCisgICAgLyogIFVwcGVyIGR3b3JkIGlzIHJlZ2lvbiAxLCBsb3dlciBpcyByZWdpb24gMCAgKi8KKyAgICBfTVRSUl9yZWFkTVNSKDB4QzAwMDAwODUsICZsb3csICZoaWdoKTsKKyAgICBpZiAocmVnID09IDEpCisgICAgICAgIGxvdyA9IGhpZ2g7CisKKyAgICAvKiBGaW5kIHRoZSBiYXNlIGFuZCB0eXBlIGZvciB0aGUgcmVnaW9uICovCisgICAgKmJhc2UgPSBsb3cgJiAweEZGRkUwMDAwOworICAgICp0eXBlID0gMDsKKyAgICBpZiAobG93ICYgMSkKKyAgICAgICAgKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7CisgICAgaWYgKGxvdyAmIDIpCisgICAgICAgICp0eXBlID0gUE1fTVRSUl9XUkNPTUI7CisgICAgaWYgKChsb3cgJiAzKSA9PSAwKSB7CisgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAvKiBUaGlzIG5lZWRzIGEgbGl0dGxlIGV4cGxhaW5pbmcuIFRoZSBzaXplIGlzIHN0b3JlZCBhcyBhbgorICAgICAqIGludmVydGVkIG1hc2sgb2YgYml0cyBvZiAxMjhLIGdyYW51bGFyaXR5IDE1IGJpdHMgbG9uZyBvZmZzZXQKKyAgICAgKiAyIGJpdHMKKyAgICAgKgorICAgICAqIFNvIHRvIGdldCBhIHNpemUgd2UgZG8gaW52ZXJ0IHRoZSBtYXNrIGFuZCBhZGQgMSB0byB0aGUgbG93ZXN0CisgICAgICogbWFzayBiaXQgKDQgYXMgaXRzIDIgYml0cyBpbikuIFRoaXMgZ2l2ZXMgdXMgYSBzaXplIHdlIHRoZW4gc2hpZnQKKyAgICAgKiB0byB0dXJuIGludG8gMTI4SyBibG9ja3MKKyAgICAgKgorICAgICAqICBlZyAgICAgICAgICAgICAgMTExIDExMTEgMTExMSAxMTAwICAgICAgaXMgNTEySworICAgICAqCisgICAgICogIGludmVydCAgICAgICAgICAwMDAgMDAwMCAwMDAwIDAwMTEKKyAgICAgKiAgKzEgICAgICAgICAgICAgIDAwMCAwMDAwIDAwMDAgMDEwMAorICAgICAqICAqMTI4SyAgIC4uLgorICAgICAqLworICAgIGxvdyA9ICh+bG93KSAmIDB4MEZGRkM7CisgICAgKnNpemUgPSAobG93ICsgNCkgPDwgMTU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0CitiYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgordHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgorCitSRU1BUktTOgorSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KK3RoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBTURfc2V0TVRSUigKKyAgICB1aW50IHJlZywKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIHNpemUsCisgICAgaW50IHR5cGUpCit7CisgICAgdWxvbmcgICAgICAgbG93LGhpZ2gsbmV3VmFsOworICAgIE1UUlJDb250ZXh0IGM7CisKKyAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKKyAgICBfTVRSUl9yZWFkTVNSKDB4QzAwMDAwODUsICZsb3csICZoaWdoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIENsZWFyIHJlZ2lzdGVyIHRvIGRpc2FibGUgKi8KKyAgICAgICAgaWYgKHJlZykKKyAgICAgICAgICAgIGhpZ2ggPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3cgPSAwOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFNldCB0aGUgcmVnaXN0ZXIgdG8gdGhlIGJhc2UgKGFscmVhZHkgc2hpZnRlZCBmb3IgdXMpLCB0aGUKKyAgICAgICAgICogdHlwZSAob2ZmIGJ5IG9uZSkgYW5kIGFuIGludmVydGVkIGJpdG1hc2sgb2YgdGhlIHNpemUKKyAgICAgICAgICogVGhlIHNpemUgaXMgdGhlIG9ubHkgb2RkIGJpdC4gV2UgYXJlIGZlZCBzYXkgNTEySworICAgICAgICAgKiBXZSBpbnZlcnQgdGhpcyBhbmQgd2UgZ2V0IDExMSAxMTExIDExMTEgMTAxMSBidXQKKyAgICAgICAgICogaWYgeW91IHN1YnRyYWN0IG9uZSBhbmQgaW52ZXJ0IHlvdSBnZXQgdGhlIGRlc2lyZWQKKyAgICAgICAgICogMTExIDExMTEgMTExMSAxMTAwIG1hc2sKKyAgICAgICAgICovCisgICAgICAgIG5ld1ZhbCA9ICgoKH4oc2l6ZS0xKSkgPj4gMTUpICYgMHgwMDAxRkZGQykgfCBiYXNlIHwgKHR5cGUrMSk7CisgICAgICAgIGlmIChyZWcpCisgICAgICAgICAgICBoaWdoID0gbmV3VmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3cgPSBuZXdWYWw7CisgICAgICAgIH0KKworICAgIC8qIFRoZSB3cml0ZWJhY2sgcnVsZSBpcyBxdWl0ZSBzcGVjaWZpYy4gU2VlIHRoZSBtYW51YWwuIEl0cworICAgICAqIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cywgd3JpdGUgYmFjayB0aGUgY2FjaGUsIHNldCB0aGUgTVRSUgorICAgICAqLworICAgIFBNX2ZsdXNoVExCKCk7CisgICAgX01UUlJfd3JpdGVNU1IoMHhDMDAwMDA4NSwgbG93LCBoaWdoKTsKKyAgICBNVFJSX2VuZFVwZGF0ZSgmYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0CitiYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgordHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgorCitSRU1BUktTOgorSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KK3RoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBDWVJJWF9nZXRNVFJSKAorICAgIHVpbnQgcmVnLAorICAgIHVsb25nICpiYXNlLAorICAgIHVsb25nICpzaXplLAorICAgIGludCAqdHlwZSkKK3sKKyAgICBNVFJSQ29udGV4dCBjOworICAgIHVjaGFyICAgICAgIGFyciA9IENYODZfQVJSX0JBU0UgKyByZWcqMzsKKyAgICB1Y2hhciAgICAgICByY3Isc2hpZnQ7CisKKyAgICAvKiBTYXZlIGZsYWdzIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKKyAgICAoKHVjaGFyKiliYXNlKVszXSAgPSBfTVRSUl9nZXRDeDg2KGFycik7CisgICAgKCh1Y2hhciopYmFzZSlbMl0gID0gX01UUlJfZ2V0Q3g4NigodWNoYXIpKGFycisxKSk7CisgICAgKCh1Y2hhciopYmFzZSlbMV0gID0gX01UUlJfZ2V0Q3g4NigodWNoYXIpKGFycisyKSk7CisgICAgcmNyID0gX01UUlJfZ2V0Q3g4NigodWNoYXIpKENYODZfUkNSX0JBU0UgKyByZWcpKTsKKyAgICBNVFJSX2VuZFVwZGF0ZSgmYyk7CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cyBpZiBpdCB3YXMgZW5hYmxlZCBwcmV2aW91c2x5ICovCisgICAgc2hpZnQgPSAoKHVjaGFyKiliYXNlKVsxXSAmIDB4MGY7CisgICAgKmJhc2UgJj0gMHhGRkZGRjAwMFVMOworCisgICAgLyogUG93ZXIgb2YgdHdvLCBhdCBsZWFzdCA0SyBvbiBBUlIwLUFSUjYsIDI1Nksgb24gQVJSNworICAgICAqIE5vdGU6IHNoaWZ0PT0weEYgbWVhbnMgNEcsIHRoaXMgaXMgdW5zdXBwb3J0ZWQuCisgICAgICovCisgICAgaWYgKHNoaWZ0KQorICAgICAgICAqc2l6ZSA9IChyZWcgPCA3ID8gMHg4MDBVTCA6IDB4MjAwMDBVTCkgPDwgc2hpZnQ7CisgICAgZWxzZQorICAgICAgICAqc2l6ZSA9IDA7CisKKyAgICAvKiBCaXQgMCBpcyBDYWNoZSBFbmFibGUgb24gQVJSNywgQ2FjaGUgRGlzYWJsZSBvbiBBUlIwLUFSUjYgKi8KKyAgICBpZiAocmVnIDwgNykgeworICAgICAgICBzd2l0Y2ggKHJjcikgeworICAgICAgICAgICAgY2FzZSAgMTogKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAgODogKnR5cGUgPSBQTV9NVFJSX1dSQkFDSzsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIGRlZmF1bHQ6ICp0eXBlID0gUE1fTVRSUl9XUlRIUk9VR0g7ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBzd2l0Y2ggKHJjcikgeworICAgICAgICAgICAgY2FzZSAgMDogKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAgODogKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogKnR5cGUgPSBQTV9NVFJSX1dSQkFDSzsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgIGRlZmF1bHQ6ICp0eXBlID0gUE1fTVRSUl9XUlRIUk9VR0g7ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KK3R5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKKworUkVNQVJLUzoKK0ludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCit0aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQ1lSSVhfc2V0TVRSUigKKyAgICB1aW50IHJlZywKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIHNpemUsCisgICAgaW50IHR5cGUpCit7CisgICAgTVRSUkNvbnRleHQgYzsKKyAgICB1Y2hhciAgICAgICBhcnIgPSBDWDg2X0FSUl9CQVNFICsgcmVnKjM7CisgICAgdWNoYXIgICAgICAgYXJyX3R5cGUsYXJyX3NpemU7CisKKyAgICAvKiBDb3VudCBkb3duIGZyb20gMzJNIChBUlIwLUFSUjYpIG9yIGZyb20gMkcgKEFSUjcpICovCisgICAgc2l6ZSA+Pj0gKHJlZyA8IDcgPyAxMiA6IDE4KTsKKyAgICBzaXplICY9IDB4N0ZGRjsgLyogTWFrZSBzdXJlIGFycl9zaXplIDw9IDE0ICovCisgICAgZm9yIChhcnJfc2l6ZSA9IDA7IHNpemU7IGFycl9zaXplKyssIHNpemUgPj49IDEpCisgICAgICAgIDsKKyAgICBpZiAocmVnIDwgNykgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9VTkNBQ0hBQkxFOiAgICBhcnJfdHlwZSA9ICAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9XUkNPTUI6ICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9XUlRIUk9VR0g6ICAgICBhcnJfdHlwZSA9IDI0OyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICBhcnJfdHlwZSA9ICA4OyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9VTkNBQ0hBQkxFOiAgICBhcnJfdHlwZSA9ICAwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9XUkNPTUI6ICAgICAgICBhcnJfdHlwZSA9ICA4OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUE1fTVRSUl9XUlRIUk9VR0g6ICAgICBhcnJfdHlwZSA9IDI1OyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOworICAgIF9NVFJSX3NldEN4ODYoKHVjaGFyKWFyciwgICAgICgodWNoYXIqKSZiYXNlKVszXSk7CisgICAgX01UUlJfc2V0Q3g4NigodWNoYXIpKGFycisxKSwgKCh1Y2hhciopJmJhc2UpWzJdKTsKKyAgICBfTVRSUl9zZXRDeDg2KCh1Y2hhcikoYXJyKzIpLCAodWNoYXIpKCgoKHVjaGFyKikmYmFzZSlbMV0pIHwgYXJyX3NpemUpKTsKKyAgICBfTVRSUl9zZXRDeDg2KCh1Y2hhcikoQ1g4Nl9SQ1JfQkFTRSArIHJlZyksICh1Y2hhcilhcnJfdHlwZSk7CisgICAgTVRSUl9lbmRVcGRhdGUoJmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK09uIEN5cml4IDZ4ODYoTVgpIGFuZCBNSUkgdGhlIEFSUjMgaXMgc3BlY2lhbDogaXQgaGFzIGNvbm5lY3Rpb24KK3dpdGggdGhlIFNNTSAoU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSkgbW9kZS4gU28gd2UgbmVlZCB0aGUgZm9sbG93aW5nOgorQ2hlY2sgd2hldGhlciBTTUlfTE9DSyAoQ0NSMyBiaXQgMCkgaXMgc2V0CisgIGlmIGl0IGlzIHNldCwgQVJSMyBjYW5ub3QgYmUgY2hhbmdlZCAgKGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVudGlsIHRoZQorICAgIG5leHQgcHJvY2Vzc29yIHJlc2V0KQorICBpZiBpdCBpcyByZXNldCwgdGhlbiB3ZSBjYW4gY2hhbmdlIGl0LCBzZXQgYWxsIHRoZSBuZWVkZWQgYml0czoKKyAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgcmFuZ2UgKENDUjEgYml0IDcgcmVzZXQpCisgICAtIGRpc2FibGUgYWNjZXNzIHRvIFNNTSBtZW1vcnkgKENDUjEgYml0IDIgcmVzZXQpCisgICAtIGRpc2FibGUgU01NIG1vZGUgKENDUjEgYml0IDEgcmVzZXQpCisgICAtIGRpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzIChDQ1I2IGJpdCAxIHJlc2V0KQorICAgLSAobWF5YmUpIGRpc2FibGUgQVJSMworSnVzdCB0byBiZSBzdXJlLCB3ZSBlbmFibGUgQVJSIHVzYWdlIGJ5IHRoZSBwcm9jZXNzb3IgKENDUjUgYml0IDUgc2V0KQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIENZUklYX2luaXRBUlIodm9pZCkKK3sKKyAgICBNVFJSQ29udGV4dCBjOworICAgIHVjaGFyICAgICAgIGNjcls3XTsKKyAgICBpbnQgICAgICAgICBjY3JjWzddID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisKKyAgICAvKiBCZWdpbiB1cGRhdGluZyAqLworICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOworCisgICAgLyogU2F2ZSBhbGwgQ0NScyBsb2NhbGx5ICovCisgICAgY2NyWzBdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjApOworICAgIGNjclsxXSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IxKTsKKyAgICBjY3JbMl0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSMik7CisgICAgY2NyWzNdID0gKHVjaGFyKWMuY2NyMzsKKyAgICBjY3JbNF0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSNCk7CisgICAgY2NyWzVdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjUpOworICAgIGNjcls2XSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1I2KTsKKyAgICBpZiAoY2NyWzNdICYgMSkKKyAgICAgICAgY2NyY1szXSA9IDE7CisgICAgZWxzZSB7CisgICAgICAgIC8qIERpc2FibGUgU01NIG1vZGUgKGJpdCAxKSwgYWNjZXNzIHRvIFNNTSBtZW1vcnkgKGJpdCAyKSBhbmQKKyAgICAgICAgICogYWNjZXNzIHRvIFNNTSBtZW1vcnkgdGhyb3VnaCBBUlIzIChiaXQgNykuCisgICAgICAgICAqLworICAgICAgICBpZiAoY2NyWzZdICYgMHgwMikgeworICAgICAgICAgICAgY2NyWzZdICY9IDB4RkQ7CisgICAgICAgICAgICBjY3JjWzZdID0gMTsgICAgICAgIC8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzLiAqLworICAgICAgICAgICAgX01UUlJfc2V0Q3g4NihDWDg2X0NDUjYsY2NyWzZdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogSWYgd2UgY2hhbmdlZCBDQ1IxIGluIG1lbW9yeSwgY2hhbmdlIGl0IGluIHRoZSBwcm9jZXNzb3IsIHRvby4gKi8KKyAgICBpZiAoY2NyY1sxXSkKKyAgICAgICAgX01UUlJfc2V0Q3g4NihDWDg2X0NDUjEsY2NyWzFdKTsKKworICAgIC8qIEVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAqLworICAgIGlmICghKGNjcls1XSAmIDB4MjApKSB7CisgICAgICAgIGNjcls1XSB8PSAweDIwOworICAgICAgICBjY3JjWzVdID0gMTsKKyAgICAgICAgX01UUlJfc2V0Q3g4NihDWDg2X0NDUjUsY2NyWzVdKTsKKyAgICAgICAgfQorCisgICAgLyogV2UgYXJlIGZpbmlzaGVkIHVwZGF0aW5nICovCisgICAgTVRSUl9lbmRVcGRhdGUoJmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIE1UUlIgbW9kdWxlLCBieSBkZXRlY3RpbmcgdGhlIHByb2Nlc3NvciB0eXBlIGFuZCBkZXRlcm1pbmluZworaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgTVRSUiBmdW5jdGlvbmFsaXR5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTVRSUl9pbml0KHZvaWQpCit7CisgICAgaW50ICAgICBpLGNwdSxsdHlwZTsKKyAgICB1bG9uZyAgIGVheCxlZHgsbGJhc2UsbHNpemU7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBjb21wYXRpYmxlIENQVSAqLworICAgIGlmIChudW1NVFJSID09IC0xKSB7CisgICAgICAgIG51bU1UUlIgPSAwOworICAgICAgICBpZiAoIV9NVFJSX2lzUmluZzAoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY3B1ID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKKyAgICAgICAgY3B1RmFtaWx5ID0gY3B1ICYgQ1BVX2ZhbWlseU1hc2s7CisgICAgICAgIGNwdVR5cGUgPSBjcHUgJiBDUFVfbWFzazsKKyAgICAgICAgY3B1U3RlcHBpbmcgPSAoY3B1ICYgQ1BVX3N0ZXBwaW5nTWFzaykgPj4gQ1BVX3N0ZXBwaW5nU2hpZnQ7CisgICAgICAgIHN3aXRjaCAoY3B1RmFtaWx5KSB7CisgICAgICAgICAgICBjYXNlIENQVV9JbnRlbDoKKyAgICAgICAgICAgICAgICAvKiBJbnRlbCBQZW50aXVtIFBybyBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoY3B1VHlwZSA8IENQVV9QZW50aXVtUHJvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgX01UUlJfcmVhZE1TUihJTlRFTF9jYXBfTVNSLCZlYXgsJmVkeCk7CisgICAgICAgICAgICAgICAgbnVtTVRSUiA9IGVheCAmIDB4RkY7CisgICAgICAgICAgICAgICAgZ2V0TVRSUiA9IElOVEVMX2dldE1UUlI7CisgICAgICAgICAgICAgICAgc2V0TVRSUiA9IElOVEVMX3NldE1UUlI7CisgICAgICAgICAgICAgICAgZ2V0RnJlZVJlZ2lvbiA9IEdFTkVSSUNfZ2V0RnJlZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICBJTlRFTF9kaXNhYmxlQmFua2VkV3JpdGVDb21iaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENQVV9BTUQ6CisgICAgICAgICAgICAgICAgLyogQU1EIEs2LTIgYW5kIGxhdGVyIHN1cHBvcnQgdGhlIE1UUlIgcmVnaXN0ZXJzICovCisgICAgICAgICAgICAgICAgaWYgKChjcHVUeXBlIDwgQ1BVX0FNREs2XzIpIHx8IChjcHVUeXBlID09IENQVV9BTURLNl8yICYmIGNwdVN0ZXBwaW5nIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoY3B1VHlwZSA8IENQVV9BTURBdGhsb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtTVRSUiA9IDI7ICAgICAgICAvKiBBTUQgQ1BVJ3MgaGF2ZSAyIE1UUlIncyAqLworICAgICAgICAgICAgICAgICAgICBnZXRNVFJSID0gQU1EX2dldE1UUlI7CisgICAgICAgICAgICAgICAgICAgIHNldE1UUlIgPSBBTURfc2V0TVRSUjsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RnJlZVJlZ2lvbiA9IEFNREs2X2dldEZyZWVSZWdpb247CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIHNvbWUgcmVhc29uIHNvbWUgSUJNIHN5c3RlbXMgd2l0aCBLNi0yIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAgICAgICogaGF2ZSB3cml0ZSBjb21iaW5lZCBlbmFibGVkIGZvciB0aGUgc3lzdGVtIEJJT1MKKyAgICAgICAgICAgICAgICAgICAgICogcmVnaW9uIGZyb20gMHhFMDAwMCB0byAweEZGRkZGRi4gV2UgbmVlZCAqYm90aCogTVRSUidzCisgICAgICAgICAgICAgICAgICAgICAqIGZvciBvdXIgb3duIGdyYXBoaWNzIGRyaXZlcnMsIHNvIGlmIHdlIGRldGVjdCBhbnkKKyAgICAgICAgICAgICAgICAgICAgICogcmVnaW9ucyBiZWxvdyB0aGUgMU1lZyBib3VuZGFyeSwgd2UgcmVtb3ZlIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgICogc28gd2UgY2FuIHVzZSB0aGlzIE1UUlIgcmVnaXN0ZXIgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYmFzZSA8IDB4MTAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1UUlIoaSwwLDAsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQU1EIEF0aGxvbiB1c2VzIFA2IHN0eWxlIE1UUlIncyAqLworICAgICAgICAgICAgICAgICAgICBfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmVheCwmZWR4KTsKKyAgICAgICAgICAgICAgICAgICAgbnVtTVRSUiA9IGVheCAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGdldE1UUlIgPSBJTlRFTF9nZXRNVFJSOworICAgICAgICAgICAgICAgICAgICBzZXRNVFJSID0gSU5URUxfc2V0TVRSUjsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RnJlZVJlZ2lvbiA9IEdFTkVSSUNfZ2V0RnJlZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENQVV9DeXJpeDoKKyAgICAgICAgICAgICAgICAvKiBDeXJpeCA2eDg2IGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycyAqLworICAgICAgICAgICAgICAgIGlmIChjcHVUeXBlIDwgQ1BVX0N5cml4Nng4NiB8fCBjcHVUeXBlID49IENQVV9DeXJpeE1lZGlhR1gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBudW1NVFJSID0gODsgICAgICAgIC8qIEN5cml4IENQVSdzIGhhdmUgOCBBUlIncyAqLworICAgICAgICAgICAgICAgIGdldE1UUlIgPSBDWVJJWF9nZXRNVFJSOworICAgICAgICAgICAgICAgIHNldE1UUlIgPSBDWVJJWF9zZXRNVFJSOworICAgICAgICAgICAgICAgIGdldEZyZWVSZWdpb24gPSBDWVJJWF9nZXRGcmVlUmVnaW9uOworICAgICAgICAgICAgICAgIENZUklYX2luaXRBUlIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KK3R5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKKworUkVUVVJOUzoKK0Vycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZSgKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIHNpemUsCisgICAgdWludCB0eXBlKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIGx0eXBlOworICAgIHVsb25nICAgbGJhc2UsbHNpemUsbGFzdDsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIENQVSB0aGF0IHN1cHBvcnRzIE1UUlIncyBhbmQgdHlwZSBpcyB2YWxpZCAqLworICAgIGlmIChudW1NVFJSIDw9IDApIHsKKyAgICAgICAgaWYgKCFfTVRSUl9pc1JpbmcwKCkpCisgICAgICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKKyAgICAgICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIGlmICh0eXBlID49IFBNX01UUlJfTUFYKQorICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfUEFSQU1TOworCisgICAgLyogSWYgdGhlIHR5cGUgaXMgV0MsIGNoZWNrIHRoYXQgdGhpcyBwcm9jZXNzb3Igc3VwcG9ydHMgaXQgKi8KKyAgICBpZiAoIU1UUlJfaGF2ZVdyaXRlQ29tYmluZSgpKQorICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9XUkNPTUI7CisKKyAgICAvKiBBZGp1c3QgdGhlIGJvdW5kYXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBDUFUgdHlwZSAqLworICAgIHN3aXRjaCAoY3B1RmFtaWx5KSB7CisgICAgICAgIGNhc2UgQ1BVX0FNRDoKKyAgICAgICAgICAgIGlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgeworICAgICAgICAgICAgICAgIC8qIEFwcGx5IHRoZSBLNiBibG9jayBhbGlnbm1lbnQgYW5kIHNpemUgcnVsZXMuIEluIG9yZGVyOgorICAgICAgICAgICAgICAgICAqICBvIFVuY2FjaGVkIG9yIGdhdGhlcmluZyBvbmx5CisgICAgICAgICAgICAgICAgICogIG8gMTI4SyBvciBiaWdnZXIgYmxvY2sKKyAgICAgICAgICAgICAgICAgKiAgbyBQb3dlciBvZiAyIGJsb2NrCisgICAgICAgICAgICAgICAgICogIG8gYmFzZSBzdWl0YWJseSBhbGlnbmVkIHRvIHRoZSBwb3dlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh0eXBlID4gUE1fTVRSUl9XUkNPTUIgJiYgKHNpemUgPCAoMSA8PCAxNykgfHwgKHNpemUgJiB+KHNpemUtMSkpLXNpemUgfHwgKGJhc2UgJiAoc2l6ZS0xKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIGZvciBBTUQgQXRobG9uIHdoaWNoIHVzZXMgUDYgc3R5bGUgTVRSUidzICovCisgICAgICAgIGNhc2UgQ1BVX0ludGVsOgorICAgICAgICBjYXNlIENQVV9DeXJpeDoKKyAgICAgICAgICAgIGlmICgoYmFzZSAmIDB4RkZGKSB8fCAoc2l6ZSAmIDB4RkZGKSkgeworICAgICAgICAgICAgICAgIC8qIEJhc2UgYW5kIHNpemUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNEtiICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PVF80S0JfQUxJR05FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmFzZSA8IDB4MTAwMDAwKSB7CisgICAgICAgICAgICAgICAgLyogQmFzZSBtdXN0IGJlID49IDFNYiAqLworICAgICAgICAgICAgICAgIHJldHVybiBQTV9NVFJSX0VSUl9CRUxPV18xTUI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDaGVjayB1cHBlciBiaXRzIG9mIGJhc2UgYW5kIGxhc3QgYXJlIGVxdWFsIGFuZCBsb3dlciBiaXRzCisgICAgICAgICAgICAgKiBhcmUgMCBmb3IgYmFzZSBhbmQgMSBmb3IgbGFzdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsYXN0ID0gYmFzZSArIHNpemUgLSAxOworICAgICAgICAgICAgZm9yIChsYmFzZSA9IGJhc2U7ICEobGJhc2UgJiAxKSAmJiAobGFzdCAmIDEpOyBsYmFzZSA9IGxiYXNlID4+IDEsIGxhc3QgPSBsYXN0ID4+IDEpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgaWYgKGxiYXNlICE9IGxhc3QpIHsKKyAgICAgICAgICAgICAgICAvKiBCYXNlIGlzIG5vdCBhbGlnbmVkIG9uIHRoZSBjb3JyZWN0IGJvdW5kYXJ5ICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PVF9BTElHTkVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgLyogU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7ICsraSkgeworICAgICAgICBnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOworICAgICAgICBpZiAobGJhc2UgPT0gMCAmJiBsc2l6ZSA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChiYXNlID4gbGJhc2UgKyAobHNpemUtMSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKChiYXNlIDwgbGJhc2UpICYmIChiYXNlK3NpemUtMSA8IGxiYXNlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgZG9uJ3Qgb3ZlcmxhcCBhbiBleGlzdGluZyByZWdpb24gKi8KKyAgICAgICAgaWYgKHR5cGUgIT0gUE1fTVRSUl9VTkNBQ0hBQkxFKSB7CisgICAgICAgICAgICBpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2Urc2l6ZS0xID4gbGJhc2UrbHNpemUtMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX09WRVJMQVA7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGJhc2UgPT0gbGJhc2UgJiYgc2l6ZSA9PSBsc2l6ZSkgeworICAgICAgICAgICAgLyogVGhlIHJlZ2lvbiBhbHJlYWR5IGV4aXN0cyBzbyBsZWF2ZSBpdCBhbG9uZSAqLworICAgICAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIE5ldyByZWdpb24gaXMgZW5jbG9zZWQgYnkgYW4gZXhpc3RpbmcgcmVnaW9uLCBzbyBvbmx5IGFsbG93CisgICAgICAgICAqIGEgbmV3IHR5cGUgdG8gYmUgY3JlYXRlZCBpZiB3ZSBhcmUgc2V0dGluZyBhIHJlZ2lvbiB0byBiZQorICAgICAgICAgKiB1bmNhY2hlYWJsZSAoc3VjaCBhcyBNTUlPIHJlZ2lzdGVycyB3aXRoaW4gYSBmcmFtZWJ1ZmZlcikuCisgICAgICAgICAqLworICAgICAgICBpZiAobHR5cGUgIT0gKGludCl0eXBlKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBQTV9NVFJSX1VOQ0FDSEFCTEUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOworICAgICAgICB9CisKKyAgICAvKiBTZWFyY2ggZm9yIGFuIGVtcHR5IE1UUlIgKi8KKyAgICBpZiAoKGkgPSBnZXRGcmVlUmVnaW9uKGJhc2Usc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PTkVfRlJFRTsKKyAgICBzZXRNVFJSKGksYmFzZSxzaXplLHR5cGUpOworICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitjYWxsYmFjayAgICAtIEZ1bmN0aW9uIHRvIGNhbGxiYWNrIHdpdGggd3JpdGUgY29tYmluZSBpbmZvcm1hdGlvbgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCB3cml0ZSBjb21iaW5lIHJlZ2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZQorcHJvY2Vzc29yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9lbnVtV3JpdGVDb21iaW5lKAorICAgIFBNX2VudW1Xcml0ZUNvbWJpbmVfdCBjYWxsYmFjaykKK3sKKyAgICBpbnQgICAgIGksbHR5cGU7CisgICAgdWxvbmcgICBsYmFzZSxsc2l6ZTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIENQVSB0aGF0IHN1cHBvcnRzIE1UUlIncyBhbmQgdHlwZSBpcyB2YWxpZCAqLworICAgIGlmIChudW1NVFJSIDw9IDApIHsKKyAgICAgICAgaWYgKCFfTVRSUl9pc1JpbmcwKCkpCisgICAgICAgICAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKKyAgICAgICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgLyogRW51bWVyYXRlIGFsbCBleGlzdGluZyBNVFJSJ3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgKytpKSB7CisgICAgICAgIGdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7CisgICAgICAgIGNhbGxiYWNrKGxiYXNlLGxzaXplLGx0eXBlKTsKKyAgICAgICAgfQorICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDZkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vcGNpbGliLmMKQEAgLTAsMCArMSw3NDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBmb3IgaW50ZXJmYWNpbmcgdG8gdGhlIFBDSSBidXMgYW5kIGNvbmZpZ3VyYXRpb24KKyogICAgICAgICAgICAgICBzcGFjZSByZWdpc3RlcnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJwY2lsaWIuaCIKKyNpZiAhZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBMZW5ndGggb2YgdGhlIG1lbW9yeSBtYXBwaW5nIGZvciB0aGUgUENJIEJJT1MgKi8KKworI2RlZmluZSBCSU9TX0xJTUlUICAgICAgICAgICgxMjggKiAxMDI0TCAtIDEpCisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMgZnJvbSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgKi8KKworI2RlZmluZSBCSU9TMzJfU0lHTkFUVVJFICAgICgoKHVsb25nKSdfJyA8PCAwKSArICgodWxvbmcpJzMnIDw8IDgpICsgKCh1bG9uZyknMicgPDwgMTYpICsgKCh1bG9uZyknXycgPDwgMjQpKQorI2RlZmluZSBQQ0lfU0lHTkFUVVJFICAgICAgICgoKHVsb25nKSdQJyA8PCAwKSArICgodWxvbmcpJ0MnIDw8IDgpICsgKCh1bG9uZyknSScgPDwgMTYpICsgKCh1bG9uZyknICcgPDwgMjQpKQorI2RlZmluZSBQQ0lfU0VSVklDRSAgICAgICAgICgoKHVsb25nKSckJyA8PCAwKSArICgodWxvbmcpJ1AnIDw8IDgpICsgKCh1bG9uZyknQycgPDwgMTYpICsgKCh1bG9uZyknSScgPDwgMjQpKQorI2RlZmluZSBQQ0lfQklPU19QUkVTRU5UICAgIDB4QjEwMQorI2RlZmluZSBGSU5EX1BDSV9ERVZJQ0UgICAgIDB4QjEwMgorI2RlZmluZSBGSU5EX1BDSV9DTEFTUyAgICAgIDB4QjEwMworI2RlZmluZSBHRU5FUkFURV9TUEVDSUFMICAgIDB4QjEwNgorI2RlZmluZSBSRUFEX0NPTkZJR19CWVRFICAgIDB4QjEwOAorI2RlZmluZSBSRUFEX0NPTkZJR19XT1JEICAgIDB4QjEwOQorI2RlZmluZSBSRUFEX0NPTkZJR19EV09SRCAgIDB4QjEwQQorI2RlZmluZSBXUklURV9DT05GSUdfQllURSAgIDB4QjEwQgorI2RlZmluZSBXUklURV9DT05GSUdfV09SRCAgIDB4QjEwQworI2RlZmluZSBXUklURV9DT05GSUdfRFdPUkQgIDB4QjEwRAorI2RlZmluZSBHRVRfSVJRX1JPVVRJTkdfT1BUIDB4QjEwRQorI2RlZmluZSBTRVRfUENJX0lSUSAgICAgICAgIDB4QjEwRgorCisvKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSB0aGUgZW50cnkgcG9pbnQgdG8gdGhlCisgKiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnksIGFzIGRvY3VtZW50ZWQgaW4gUENJIDIuMSBCSU9TIFNwZWNpY2l0aW9uLgorICovCisKK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICAgIHVsb25nIHNpZ25hdHVyZTsgICAgICAgIC8qIF8zMl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICB1bG9uZyBlbnRyeTsgICAgICAgICAgICAvKiAzMiBiaXQgcGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICAgICAgKi8KKyAgICAgICAgdWNoYXIgcmV2aXNpb247ICAgICAgICAgLyogUmV2aXNpb24gbGV2ZWwsIDAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHVjaGFyIGxlbmd0aDsgICAgICAgICAgIC8qIExlbmd0aCBpbiBwYXJhZ3JhcGhzIHNob3VsZCBiZSAwMSAgICAqLworICAgICAgICB1Y2hhciBjaGVja3N1bTsgICAgICAgICAvKiBBbGwgYnl0ZXMgbXVzdCBhZGQgdXAgdG8gemVybyAgICAgICAgKi8KKyAgICAgICAgdWNoYXIgcmVzZXJ2ZWRbNV07ICAgICAgLyogTXVzdCBiZSB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIH0gZmllbGRzOworICAgIGNoYXIgY2hhcnNbMTZdOworICAgIH0gUENJX2Jpb3MzMjsKKworLyogU3RydWN0dXJlIGZvciBhIGZhciBwb2ludGVyIHRvIGNhbGwgdGhlIFBDSSBCSU9TIHNlcnZpY2VzIHdpdGggKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nICAgYWRkcmVzczsKKyAgICB1c2hvcnQgIHNlZ21lbnQ7CisgICAgfSBQQ0lCSU9TX2VudHJ5OworCisvKiBNYWNyb3MgdG8gY29weSBhIHN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzIGR3U2l6ZSBtZW1iZXJzICovCisKKyNkZWZpbmUgQ09QWV9TVFJVQ1RVUkUoZCxzKSBtZW1jcHkoZCxzLE1JTigocyktPmR3U2l6ZSwoZCktPmR3U2l6ZSkpCisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1Y2hhciAgICAgICAgICAgICpCSU9TSW1hZ2UgPSBOVUxMOyAgLyogQklPUyBpbWFnZSBtYXBwaW5nICAgICAgICovCitzdGF0aWMgaW50ICAgICAgICAgICAgICBQQ0lCSU9TVmVyc2lvbiA9IC0xOy8qIFBDSSBCSU9TIHZlcnNpb24gICAgICAgICAqLworc3RhdGljIFBDSUJJT1NfZW50cnkgICAgUENJRW50cnk7ICAgICAgICAgICAvKiBQQ0kgc2VydmljZXMgZW50cnkgcG9pbnQgKi8KK3N0YXRpYyB1bG9uZyAgICAgICAgICAgIFBDSVBoeXNFbnRyeSA9IDA7ICAgLyogUGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4dGVybmFsIGFzc2VtYmxlciBoZWxwZXIgZnVuY3Rpb25zICovCisKK3VjaGFyICAgX0FTTUFQSSBfQklPUzMyX3NlcnZpY2UodWxvbmcgc2VydmljZSx1bG9uZyBmdW5jdGlvbix1bG9uZyAqcGh5c0Jhc2UsdWxvbmcgKmxlbmd0aCx1bG9uZyAqc2VydmljZU9mZnNldCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKK3VzaG9ydCAgX0FTTUFQSSBfUENJQklPU19pc1ByZXNlbnQodWxvbmcgaV9lYXgsdWxvbmcgKm9fZWR4LHVzaG9ydCAqb19heCx1Y2hhciAqb19jbCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKK3Vsb25nICAgX0FTTUFQSSBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LFBDSUJJT1NfZW50cnkgZW50cnkpOworaW50ICAgICBfQVNNQVBJIF9QQ0lCSU9TX2dldFJvdXRpbmcoUENJUm91dGluZ09wdGlvbnNCdWZmZXIgKmJ1ZixQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKK2lib29sICAgX0FTTUFQSSBfUENJQklPU19zZXRJUlEoaW50IGJ1c0RldixpbnQgaW50UGluLGludCBJUlEsUENJQklPU19lbnRyeSBlbnRyeSk7Cit1bG9uZyAgIF9BU01BUEkgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlKGludCBidXMsdWxvbmcgZGF0YSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKK3VzaG9ydCAgX0FTTUFQSSBfUENJX2dldENTKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFBDSSBCSU9TIGVudHJ5IHBvaW50LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9BU01BUEkgUENJQklPU19nZXRFbnRyeSh2b2lkKQoreyByZXR1cm4gUENJUGh5c0VudHJ5OyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraHdUeXBlICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBQQ0kgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSBmbGFncworbGFzdEJ1cyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBQQ0kgYnVzIGluIHRoZSBzeXN0ZW0KKworUkVUVVJOUzoKK1ZlcnNpb24gbnVtYmVyIG9mIHRoZSBQQ0kgQklPUyBmb3VuZC4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgUENJIEJJT1MgaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBhbmQgaWYKK3NvIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyBkZXRlY3QgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQQ0lCSU9TX2RldGVjdCgKKyAgICB1Y2hhciAqaHdUeXBlLAorICAgIHVjaGFyICpsYXN0QnVzKQoreworICAgIHVsb25nICAgc2lnbmF0dXJlOworICAgIHVzaG9ydCAgc3RhdCx2ZXJzaW9uOworCisjaWZuZGVmIF9fMTZCSVRfXworICAgIFBDSUJJT1NfZW50cnkgICBCSU9TRW50cnkgPSB7MH07CisgICAgdWNoYXIgICAgICAgICAgICpCSU9TRW5kOworICAgIFBDSV9iaW9zMzIgICAgICAqQklPU0RpcjsKKyAgICB1bG9uZyAgICAgICAgICAgcGh5c0Jhc2UsbGVuZ3RoLG9mZnNldDsKKworICAgIC8qIEJhaWwgaWYgd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIG5vIEJJT1MgaXMgcHJlc2VudCAqLworICAgIGlmIChQQ0lCSU9TVmVyc2lvbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEZpcnN0IHNjYW4gdGhlIG1lbW9yeSBmcm9tIDB4RTAwMDAgdG8gMHhGRkZGRiBsb29raW5nIGZvciB0aGUKKyAgICAgKiBCSU9TMzIgc2VydmljZSBkaXJlY3RvcnksIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UgY2FuIGNhbGwgaXQKKyAgICAgKiBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoUENJQklPU1ZlcnNpb24gPT0gLTEpIHsKKyAgICAgICAgUENJQklPU1ZlcnNpb24gPSAwOworICAgICAgICBCSU9TSW1hZ2UgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhFMDAwMCxCSU9TX0xJTUlULGZhbHNlKTsKKyAgICAgICAgaWYgKCFCSU9TSW1hZ2UpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQklPU0VuZCA9IEJJT1NJbWFnZSArIDB4MjAwMDA7CisgICAgICAgIGZvciAoQklPU0RpciA9IChQQ0lfYmlvczMyKilCSU9TSW1hZ2U7IEJJT1NEaXIgPCAoUENJX2Jpb3MzMiopQklPU0VuZDsgQklPU0RpcisrKSB7CisgICAgICAgICAgICB1Y2hhciAgIHN1bTsKKyAgICAgICAgICAgIGludCAgICAgaSxsZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChCSU9TRGlyLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZW5ndGggPSBCSU9TRGlyLT5maWVsZHMubGVuZ3RoICogMTY7CisgICAgICAgICAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoc3VtID0gaSA9IDA7IGkgPCBsZW5ndGggOyBpKyspCisgICAgICAgICAgICAgICAgc3VtICs9IEJJT1NEaXItPmNoYXJzW2ldOworICAgICAgICAgICAgaWYgKHN1bSAhPSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQklPU0VudHJ5LmFkZHJlc3MgPSAodWxvbmcpQklPU0ltYWdlICsgKEJJT1NEaXItPmZpZWxkcy5lbnRyeSAtIDB4RTAwMDApOworICAgICAgICAgICAgQklPU0VudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBJZiB3ZSBmb3VuZCB0aGUgQklPUzMyIGRpcmVjdG9yeSwgY2FsbCBpdCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgICAqIFBDSSBzZXJ2aWNlcy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChCSU9TRW50cnkuYWRkcmVzcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChfQklPUzMyX3NlcnZpY2UoUENJX1NFUlZJQ0UsMCwmcGh5c0Jhc2UsJmxlbmd0aCwmb2Zmc2V0LEJJT1NFbnRyeSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBQQ0lQaHlzRW50cnkgPSBwaHlzQmFzZSArIG9mZnNldDsKKyAgICAgICAgUENJRW50cnkuYWRkcmVzcyA9ICh1bG9uZylCSU9TSW1hZ2UgKyAoUENJUGh5c0VudHJ5IC0gMHhFMDAwMCk7CisgICAgICAgIFBDSUVudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIC8qIFdlIGZvdW5kIHRoZSBCSU9TIGVudHJ5LCBzbyBub3cgZG8gdGhlIHZlcnNpb24gY2hlY2sgKi8KKyAgICB2ZXJzaW9uID0gX1BDSUJJT1NfaXNQcmVzZW50KFBDSV9CSU9TX1BSRVNFTlQsJnNpZ25hdHVyZSwmc3RhdCxsYXN0QnVzLFBDSUVudHJ5KTsKKyAgICBpZiAodmVyc2lvbiA+IDAgJiYgKChzdGF0ID4+IDgpID09IDApICYmIHNpZ25hdHVyZSA9PSBQQ0lfU0lHTkFUVVJFKSB7CisgICAgICAgICpod1R5cGUgPSBzdGF0ICYgMHhGRjsKKyAgICAgICAgcmV0dXJuIFBDSUJJT1NWZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gY2hlY2sgYWdhaW5zdAoraW5kZXggICAtIEluZGV4IG9mIHRoZSBjdXJyZW50IGRldmljZSB0byBjaGVjaworCitSRVRVUk5TOgorVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgZHVwbGljYXRlLCBmYWxzZSBpZiBub3QuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiBhbGwgZGV2aWNlcyBwcmVjZWVkaW5nIHRoZSBuZXdseQorZm91bmQgZGV2aWNlIGluIHRoZSBpbmZvIHN0cnVjdHVyZSwgYW5kIGNoZWNrcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm90IGEKK2R1cGxpY2F0ZSBvZiBhIHByZXZpb3VzIGRldmljZS4gU29tZSBkZXZpY2VzIGluY29ycmVjdGx5IGVudW1lcmF0ZQordGhlbXNlbHZlcyBhdCBkaWZmZXJlbnQgZnVuY3Rpb24gYWRkcmVzc2VzIHNvIHdlIGNoZWNrIGhlcmUgdG8gZXhjbHVkZQordGhvc2UgY2FzZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIENoZWNrRHVwbGljYXRlKAorICAgIFBDSURldmljZUluZm8gKmluZm8sCisgICAgUENJRGV2aWNlSW5mbyAqcHJldikKK3sKKyAgICAvKiBJZ25vcmUgZGV2aWNlcyB3aXRoIGEgdmVuZG9yIElEIG9mIDAgKi8KKyAgICBpZiAoaW5mby0+VmVuZG9ySUQgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvKiBOT1RFOiBXZSBvbmx5IGNoZWNrIGFnYWluc3QgdGhlIGN1cnJlbnQgZGV2aWNlIG9uCisgICAgICogICAgICAgdGhlIGJ1cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZXhjbHVkZQorICAgICAqICAgICAgIG11bHRpcGxlIGNvbnRyb2xsZXJzIG9mIHRoZSBzYW1lIGRldmljZSBJRC4KKyAgICAgKi8KKyAgICBpZiAoaW5mby0+c2xvdC5wLkJ1cyA9PSBwcmV2LT5zbG90LnAuQnVzICYmCisgICAgICAgIGluZm8tPnNsb3QucC5EZXZpY2UgPT0gcHJldi0+c2xvdC5wLkRldmljZSAmJgorICAgICAgICBpbmZvLT5EZXZpY2VJRCA9PSBwcmV2LT5EZXZpY2VJRCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgICAgIC0gQXJyYXkgb2YgUENJRGV2aWNlSW5mbyBzdHJ1Y3R1cmVzIHRvIGZpbGwgaW4KK21heERldmljZXMgIC0gTWF4aW11bSBudW1iZXIgb2Ygb2YgZGV2aWNlcyB0byBlbnVtZXJhdGUgaW50byBhcnJheQorCitSRVRVUk5TOgorTnVtYmVyIG9mIFBDSSBkZXZpY2VzIGZvdW5kIGFuZCBlbnVtZXJhdGVkIG9uIHRoZSBQQ0kgYnVzLCAwIGlmIG5vdCBQQ0kuCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzIGludG8gYW4gYXJyYXkKK29mIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYmxvY2tzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUENJX2VudW1lcmF0ZU1lY2gxKAorICAgIFBDSURldmljZUluZm8gaW5mb1tdKQoreworICAgIGludCAgICAgICAgICAgICBidXMsZGV2aWNlLGZ1bmN0aW9uLGksbnVtRm91bmQgPSAwOworICAgIHVsb25nICAgICAgICAgICAqbHAsdG1wOworICAgIFBDSXNsb3QgICAgICAgICBzbG90ID0ge3swLDAsMCwwLDAsMCwxfX07CisgICAgUENJRGV2aWNlSW5mbyAgIHBjaSxwcmV2ID0gezB9OworCisgICAgLyogVHJ5IFBDSSBhY2Nlc3MgbWVjaGFuaXNtIDEgKi8KKyAgICBQTV9vdXRwYigweENGQiwweDAxKTsKKyAgICB0bXAgPSBQTV9pbnBkKDB4Q0Y4KTsKKyAgICBQTV9vdXRwZCgweENGOCxzbG90LmkpOworICAgIGlmICgoUE1faW5wZCgweENGOCkgPT0gc2xvdC5pKSAmJiAoUE1faW5wZCgweENGQykgIT0gMHhGRkZGRkZGRlVMKSkgeworICAgICAgICAvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxIC0gdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gKi8KKyAgICAgICAgZm9yIChidXMgPSAwOyBidXMgPCA4OyBidXMrKykgeworICAgICAgICAgICAgc2xvdC5wLkJ1cyA9IGJ1czsKKyAgICAgICAgICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMzI7IGRldmljZSsrKSB7CisgICAgICAgICAgICAgICAgc2xvdC5wLkRldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICBmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7CisgICAgICAgICAgICAgICAgICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICAgICAgICAgICAgICBzbG90LnAuUmVnaXN0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBQTV9vdXRwZCgweENGOCxzbG90LmkpOworICAgICAgICAgICAgICAgICAgICBpZiAoUE1faW5wZCgweENGQykgIT0gMHhGRkZGRkZGRlVMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnBjaSwwLHNpemVvZihwY2kpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaS5kd1NpemUgPSBzaXplb2YocGNpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaS5tZWNoMSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2kuc2xvdCA9IHNsb3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBscCA9ICh1bG9uZyopJihwY2kuVmVuZG9ySUQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9QQ0lfUkVHOyBpKyssIGxwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnAuUmVnaXN0ZXIgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxwID0gUE1faW5wZCgweENGQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZX1NUUlVDVFVSRSgmaW5mb1tudW1Gb3VuZF0sJnBjaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytudW1Gb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcGNpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIC8qIERpc2FibGUgUENJIGNvbmZpZyBjeWNsZSBvbiBleGl0ICovCisgICAgICAgIFBNX291dHBkKDB4Q0Y4LDApOworICAgICAgICByZXR1cm4gbnVtRm91bmQ7CisgICAgICAgIH0KKyAgICBQTV9vdXRwZCgweENGOCx0bXApOworCisgICAgLyogTm8gaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSAxIGZvdW5kICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgorbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5CisKK1JFVFVSTlM6CitOdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQorb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQQ0lfZW51bWVyYXRlTWVjaDIoCisgICAgUENJRGV2aWNlSW5mbyBpbmZvW10pCit7CisgICAgaW50ICAgICAgICAgICAgIGJ1cyxkZXZpY2UsZnVuY3Rpb24saSxudW1Gb3VuZCA9IDA7CisgICAgdXNob3J0ICAgICAgICAgIGRldmljZUlPOworICAgIHVsb25nICAgICAgICAgICAqbHA7CisgICAgUENJc2xvdCAgICAgICAgIHNsb3QgPSB7ezAsMCwwLDAsMCwwLDF9fTsKKyAgICBQQ0lEZXZpY2VJbmZvICAgcGNpLHByZXYgPSB7MH07CisKKyAgICAvKiBUcnkgUENJIGFjY2VzcyBtZWNoYW5pc20gMiAqLworICAgIFBNX291dHBiKDB4Q0ZCLDB4MDApOworICAgIFBNX291dHBiKDB4Q0Y4LDB4MDApOworICAgIFBNX291dHBiKDB4Q0ZBLDB4MDApOworICAgIGlmIChQTV9pbnBiKDB4Q0Y4KSA9PSAweDAwICYmIFBNX2lucGIoMHhDRkIpID09IDB4MDApIHsKKyAgICAgICAgLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMiAtIHRoZSBvbGRlciBtZWNoYW5pc20gZm9yIGxlZ2FjeSBidXNzZXMgKi8KKyAgICAgICAgZm9yIChidXMgPSAwOyBidXMgPCAyOyBidXMrKykgeworICAgICAgICAgICAgc2xvdC5wLkJ1cyA9IGJ1czsKKyAgICAgICAgICAgIFBNX291dHBiKDB4Q0ZBLCh1Y2hhcilidXMpOworICAgICAgICAgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCAxNjsgZGV2aWNlKyspIHsKKyAgICAgICAgICAgICAgICBzbG90LnAuRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgICAgIGRldmljZUlPID0gMHhDMDAwICsgKGRldmljZSA8PCA4KTsKKyAgICAgICAgICAgICAgICBmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7CisgICAgICAgICAgICAgICAgICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICAgICAgICAgICAgICBzbG90LnAuUmVnaXN0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBQTV9vdXRwYigweENGOCwodWNoYXIpKChmdW5jdGlvbiA8PCAxKSB8IDB4MTApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFBNX2lucGQoZGV2aWNlSU8pICE9IDB4RkZGRkZGRkZVTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZwY2ksMCxzaXplb2YocGNpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2kuZHdTaXplID0gc2l6ZW9mKHBjaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2kubWVjaDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcGNpLnNsb3QgPSBzbG90OworICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSAodWxvbmcqKSYocGNpLlZlbmRvcklEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUENJX1JFRzsgaSsrLCBscCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC5wLlJlZ2lzdGVyID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbHAgPSBQTV9pbnBkKGRldmljZUlPICsgKGkgPDwgMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2hlY2tEdXBsaWNhdGUoJnBjaSwmcHJldikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09QWV9TVFJVQ1RVUkUoJmluZm9bbnVtRm91bmRdLCZwY2kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbnVtRm91bmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHBjaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBEaXNhYmxlIFBDSSBjb25maWcgY3ljbGUgb24gZXhpdCAqLworICAgICAgICBQTV9vdXRwYigweENGOCwwKTsKKyAgICAgICAgcmV0dXJuIG51bUZvdW5kOworICAgICAgICB9CisKKyAgICAvKiBObyBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtIDIgZm91bmQgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyByZWFkcyBhIGNvbmZpZ3VyYXRpb24gZHdvcmQgdmlhIHRoZSBQQ0kgQklPUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgUENJQklPU19yZWFkRFdPUkQoCisgICAgaW50IGluZGV4LAorICAgIHVsb25nIHNsb3QpCit7CisgICAgcmV0dXJuICh1bG9uZylfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX0RXT1JELHNsb3QgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCittYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKKworUkVUVVJOUzoKK051bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5CitvZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVCSU9TKAorICAgIFBDSURldmljZUluZm8gaW5mb1tdKQoreworICAgIHVjaGFyICAgICAgICAgICBod1R5cGUsbGFzdEJ1czsKKyAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKKyAgICB1bG9uZyAgICAgICAgICAgKmxwOworICAgIFBDSXNsb3QgICAgICAgICBzbG90ID0ge3swLDAsMCwwLDAsMCwxfX07CisgICAgUENJRGV2aWNlSW5mbyAgIHBjaSxwcmV2ID0gezB9OworCisgICAgaWYgKFBDSUJJT1NfZGV0ZWN0KCZod1R5cGUsJmxhc3RCdXMpKSB7CisgICAgICAgIC8qIFBDSSBCSU9TIGFjY2VzcyAtIHRoZSB1bHRpbWF0ZSBmYWxsYmFjayAqLworICAgICAgICBmb3IgKGJ1cyA9IDA7IGJ1cyA8PSBsYXN0QnVzOyBidXMrKykgeworICAgICAgICAgICAgc2xvdC5wLkJ1cyA9IGJ1czsKKyAgICAgICAgICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMzI7IGRldmljZSsrKSB7CisgICAgICAgICAgICAgICAgc2xvdC5wLkRldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICBmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7CisgICAgICAgICAgICAgICAgICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAoUENJQklPU19yZWFkRFdPUkQoMCxzbG90LmkpICE9IDB4RkZGRkZGRkZVTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZwY2ksMCxzaXplb2YocGNpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2kuZHdTaXplID0gc2l6ZW9mKHBjaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2kubWVjaDEgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcGNpLnNsb3QgPSBzbG90OworICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSAodWxvbmcqKSYocGNpLlZlbmRvcklEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUENJX1JFRzsgaSsrLCBscCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpscCA9IFBDSUJJT1NfcmVhZERXT1JEKGkgPDwgMixzbG90LmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZX1NUUlVDVFVSRSgmaW5mb1tudW1Gb3VuZF0sJnBjaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytudW1Gb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcGNpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBSZXR1cm4gbnVtYmVyIG9mIGRldmljZXMgZm91bmQgKi8KKyAgICByZXR1cm4gbnVtRm91bmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgorbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5CisKK1JFVFVSTlM6CitOdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQorb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9BU01BUEkgUENJX2VudW1lcmF0ZSgKKyAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKK3sKKyAgICBpbnQgbnVtRm91bmQ7CisKKyAgICAvKiBGaXJzdCB0cnkgdmlhIHRoZSBkaXJlY3QgYWNjZXNzIG1lY2hhbmlzbXMgd2hpY2ggYXJlIGZhc3RlciBpZiB3ZQorICAgICAqIGhhdmUgdGhlbSAobmVhcmx5IGFsd2F5cykuIFRoZSBCSU9TIGlzIHVzZWQgYXMgYSBmYWxsYmFjaywgYW5kIGZvcgorICAgICAqIHN0dWZmIHdlIGNhbid0IGRvIGRpcmVjdGx5LgorICAgICAqLworICAgIGlmICgobnVtRm91bmQgPSBQQ0lfZW51bWVyYXRlTWVjaDEoaW5mbykpID09IDApIHsKKyAgICAgICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVNZWNoMihpbmZvKSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVCSU9TKGluZm8pKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIG51bUZvdW5kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgICAgIC0gQXJyYXkgb2YgUENJRGV2aWNlSW5mbyBzdHJ1Y3R1cmVzIHRvIGZpbGwgaW4KK21heERldmljZXMgIC0gTWF4aW11bSBudW1iZXIgb2Ygb2YgZGV2aWNlcyB0byBlbnVtZXJhdGUgaW50byBhcnJheQorCitSRVRVUk5TOgorTnVtYmVyIG9mIFBDSSBkZXZpY2VzIGZvdW5kIGFuZCBlbnVtZXJhdGVkIG9uIHRoZSBQQ0kgYnVzLCAwIGlmIG5vdCBQQ0kuCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzIGludG8gYW4gYXJyYXkKK29mIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYmxvY2tzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBfQVNNQVBJIFBDSV9nZXROdW1EZXZpY2VzKHZvaWQpCit7CisgICAgcmV0dXJuIFBDSV9lbnVtZXJhdGUoTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFyIC0gQmFzZSBhZGRyZXNzIHRvIG1lYXN1cmUKK3BjaSAtIFBDSSBkZXZpY2UgdG8gYWNjZXNzCisKK1JFVFVSTlM6CitTaXplIG9mIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIGluIGJ5dGVzCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIG1lYXN1cmVzIHRoZSBzaXplIG9mIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGluIGJ5dGVzLAorYnkgd3JpdGluZyBhbGwgRidzIHRvIHRoZSByZWdpc3RlciwgYW5kIHJlYWRpbmcgdGhlIHZhbHVlIGJhY2suIFRoZSBzaXplCitvZiB0aGUgYmFzZSBhZGRyZXNzIGlzIGRldGVybWluZXMgYnkgdGhlIGJpdHMgdGhhdCBhcmUgaGFyZHdpcmVkIHRvIHplcm8ncy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfQVNNQVBJIFBDSV9maW5kQkFSU2l6ZSgKKyAgICBpbnQgYmFyLAorICAgIFBDSURldmljZUluZm8gKnBjaSkKK3sKKyAgICB1bG9uZyAgIGJhc2Usc2l6ZSA9IDA7CisKKyAgICBiYXNlID0gUENJX2FjY2Vzc1JlZyhiYXIsMCxQQ0lfUkVBRF9EV09SRCxwY2kpOworICAgIGlmIChiYXNlICYmICEoYmFzZSAmIDB4MSkpIHsKKyAgICAgICAgLyogRm9yIHNvbWUgc3RyYW5nZSByZWFzb24gc29tZSBkZXZpY2VzIGRvbid0IHByb3Blcmx5IGRlY29kZQorICAgICAgICAgKiB0aGVpciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIChJbnRlbCBQQ0kvUENJIGJyaWRnZXMhKSwgYW5kCisgICAgICAgICAqIHdlIHJlYWQgY29tcGxldGVseSBib2d1cyB2YWx1ZXMuIFdlIGNoZWNrIGZvciB0aGF0IGhlcmUKKyAgICAgICAgICogYW5kIGNsZWFyIG91dCB0aG9zZSBCQVIncy4KKyAgICAgICAgICoKKyAgICAgICAgICogV2UgY2hlY2sgZm9yIHRoYXQgaGVyZSBiZWNhdXNlIGF0IGxlYXN0IHRoZSBsb3cgMTIgYml0cworICAgICAgICAgKiBvZiB0aGUgYWRkcmVzcyByYW5nZSBtdXN0IGJlIHplcm9zLCBzaW5jZSB0aGUgcGFnZSBzaXplCisgICAgICAgICAqIG9uIElBMzIgcHJvY2Vzc29ycyBpcyBhbHdheXMgNEtiLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChiYXNlICYgMHhGRkYpID09IDApIHsKKyAgICAgICAgICAgIFBDSV9hY2Nlc3NSZWcoYmFyLDB4RkZGRkZGRkYsUENJX1dSSVRFX0RXT1JELHBjaSk7CisgICAgICAgICAgICBzaXplID0gUENJX2FjY2Vzc1JlZyhiYXIsMCxQQ0lfUkVBRF9EV09SRCxwY2kpICYgfjB4RkY7CisgICAgICAgICAgICBzaXplID0gfnNpemUrMTsKKyAgICAgICAgICAgIFBDSV9hY2Nlc3NSZWcoYmFyLGJhc2UsUENJX1dSSVRFX0RXT1JELHBjaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBwY2ktPnNsb3QucC5SZWdpc3RlciA9IDA7CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5kZXggICAtIERXT1JEIGluZGV4IG9mIHRoZSByZWdpc3RlciB0byBhY2Nlc3MKK3ZhbHVlICAgLSBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgZm9yIHdyaXRlIGFjY2VzcworZnVuYyAgICAtIEZ1bmN0aW9uIHRvIGltcGxlbWVudAorCitSRVRVUk5TOgorVGhlIHZhbHVlIHJlYWQgZnJvbSB0aGUgcmVnaXN0ZXIgZm9yIHJlYWQgb3BlcmF0aW9ucworCitSRU1BUktTOgorVGhlIGZ1bmN0aW9uIGNvZGUgYXJlIGRlZmluZWQgYXMgZm9sbG93cworCitjb2RlICAgIC0gZnVuY3Rpb24KKzAgICAgICAgLSBSZWFkIEJZVEUKKzEgICAgICAgLSBSZWFkIFdPUkQKKzIgICAgICAgLSBSZWFkIERXT1JECiszICAgICAgIC0gV3JpdGUgQllURQorNCAgICAgICAtIFdyaXRlIFdPUkQKKzUgICAgICAgLSBXcml0ZSBEV09SRAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9BU01BUEkgUENJX2FjY2Vzc1JlZygKKyAgICBpbnQgaW5kZXgsCisgICAgdWxvbmcgdmFsdWUsCisgICAgaW50IGZ1bmMsCisgICAgUENJRGV2aWNlSW5mbyAqaW5mbykKK3sKKyAgICBpbnQgaW9iYXNlOworCisgICAgaWYgKGluZm8tPm1lY2gxID09IDIpIHsKKyAgICAgICAgLyogVXNlIFBDSSBCSU9TIGFjY2VzcyBzaW5jZSB3ZSBkb250IGhhdmUgZGlyZWN0IGhhcmR3YXJlIGFjY2VzcyAqLworICAgICAgICBzd2l0Y2ggKGZ1bmMpIHsKKyAgICAgICAgICAgIGNhc2UgUENJX1JFQURfQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVjaGFyKV9QQ0lCSU9TX3NlcnZpY2UoUkVBRF9DT05GSUdfQllURSxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKKyAgICAgICAgICAgIGNhc2UgUENJX1JFQURfV09SRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVzaG9ydClfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX1dPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsMCxQQ0lFbnRyeSk7CisgICAgICAgICAgICBjYXNlIFBDSV9SRUFEX0RXT1JEOgorICAgICAgICAgICAgICAgIHJldHVybiAodWxvbmcpX1BDSUJJT1Nfc2VydmljZShSRUFEX0NPTkZJR19EV09SRCxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKKyAgICAgICAgICAgIGNhc2UgUENJX1dSSVRFX0JZVEU6CisgICAgICAgICAgICAgICAgX1BDSUJJT1Nfc2VydmljZShXUklURV9DT05GSUdfQllURSxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCx2YWx1ZSxQQ0lFbnRyeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBDSV9XUklURV9XT1JEOgorICAgICAgICAgICAgICAgIF9QQ0lCSU9TX3NlcnZpY2UoV1JJVEVfQ09ORklHX1dPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsdmFsdWUsUENJRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQ0lfV1JJVEVfRFdPUkQ6CisgICAgICAgICAgICAgICAgX1BDSUJJT1Nfc2VydmljZShXUklURV9DT05GSUdfRFdPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsdmFsdWUsUENJRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFVzZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbXMgKi8KKyAgICAgICAgaWYgKGluZm8tPm1lY2gxKSB7CisgICAgICAgICAgICAvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxICovCisgICAgICAgICAgICBpb2Jhc2UgPSAweENGQyArIChpbmRleCAmIDMpOworICAgICAgICAgICAgaW5mby0+c2xvdC5wLlJlZ2lzdGVyID0gaW5kZXggPj4gMjsKKyAgICAgICAgICAgIFBNX291dHBkKDB4Q0Y4LGluZm8tPnNsb3QuaSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMiAqLworICAgICAgICAgICAgUE1fb3V0cGIoMHhDRjgsKHVjaGFyKSgoaW5mby0+c2xvdC5wLkZ1bmN0aW9uIDw8IDEpIHwgMHgxMCkpOworICAgICAgICAgICAgUE1fb3V0cGIoMHhDRkEsKHVjaGFyKWluZm8tPnNsb3QucC5CdXMpOworICAgICAgICAgICAgaW9iYXNlID0gMHhDMDAwICsgKGluZm8tPnNsb3QucC5EZXZpY2UgPDwgOCkgKyBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChmdW5jKSB7CisgICAgICAgICAgICBjYXNlIFBDSV9SRUFEX0JZVEU6CisgICAgICAgICAgICBjYXNlIFBDSV9SRUFEX1dPUkQ6CisgICAgICAgICAgICBjYXNlIFBDSV9SRUFEX0RXT1JEOiAgICB2YWx1ZSA9IFBNX2lucGQoaW9iYXNlKTsgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQ0lfV1JJVEVfQllURTogICAgUE1fb3V0cGIoaW9iYXNlLCh1Y2hhcil2YWx1ZSk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUENJX1dSSVRFX1dPUkQ6ICAgIFBNX291dHB3KGlvYmFzZSwodXNob3J0KXZhbHVlKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBDSV9XUklURV9EV09SRDogICBQTV9vdXRwZChpb2Jhc2UsKHVsb25nKXZhbHVlKTsgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBQTV9vdXRwZCgweENGOCwwKTsKKyAgICAgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitudW1EZXZpY2VzICAtIE51bWJlciBvZiBkZXZpY2VzIHRvIHF1ZXJ5IGluZm8gZm9yCisKK1JFVFVSTlM6CiswIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLCBudW1iZXIgb2YgZGV2aWNlcyB0byBlbnVtZXJhdGUgaWYgbnVtRGV2aWNlcyA9IDAKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFBDSSByb3V0aW5nIGluZm9ybWF0aW9uLiBJZiB5b3UgcGFzcyBhIHZhbHVlIG9mCiswIGZvciBudW1EZXZpY2VzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHdpdGggdGhlIG51bWJlciBvZiBkZXZpY2VzCituZWVkZWQgaW4gdGhlIHJvdXRpbmcgYnVmZmVyIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIEJJT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgX0FTTUFQSSBQQ0lfZ2V0SVJRUm91dGluZ09wdGlvbnMoCisgICAgaW50IG51bURldmljZXMsCisgICAgUENJUm91dGVJbmZvICpidWZmZXIpCit7CisgICAgUENJUm91dGluZ09wdGlvbnNCdWZmZXIgYnVmOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJldDsKKworICAgIGlmIChQQ0lQaHlzRW50cnkpIHsKKyAgICAgICAgYnVmLkJ1ZmZlclNpemUgPSBudW1EZXZpY2VzICogc2l6ZW9mKFBDSVJvdXRlSW5mbyk7CisgICAgICAgIGJ1Zi5EYXRhQnVmZmVyID0gYnVmZmVyOworICAgICAgICBpZiAoKHJldCA9IF9QQ0lCSU9TX2dldFJvdXRpbmcoJmJ1ZixQQ0lFbnRyeSkpID09IDB4ODkpCisgICAgICAgICAgICByZXR1cm4gYnVmLkJ1ZmZlclNpemUgLyBzaXplb2YoUENJUm91dGVJbmZvKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCisgICAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZQoraW50UGluICAtIFZhbHVlIHRvIHN0b3JlIGluIHRoZSBQQ0kgSW50ZXJydXB0UGluIHJlZ2lzdGVyCitJUlEgICAgIC0gTmV3IElTQSBJUlEgdG8gbWFwIHRoZSBQQ0kgaW50ZXJydXB0IHRvICgwLTE1KQorCitSRVRVUk5TOgorVHJ1ZSBvbiBzdWNjZXNzLCBvciBmYWxzZSBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxlZC4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgUENJIElSUSByb3V0aW5nIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSB0byB0aGUKK2Rlc2lyZWQgUENJIGludGVycnVwdCBhbmQgdGhlIGRlc2lyZWQgSVNBIGJ1cyBjb21wYXRpYmxlIElSUS4gVGhpcyBmdW5jdGlvbgorbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIFBDSSBCSU9TLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbAorZmFpbC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBfQVNNQVBJIFBDSV9zZXRIYXJkd2FyZUlSUSgKKyAgICBQQ0lEZXZpY2VJbmZvICppbmZvLAorICAgIHVpbnQgaW50UGluLAorICAgIHVpbnQgSVJRKQoreworICAgIGlmIChQQ0lQaHlzRW50cnkpIHsKKyAgICAgICAgaWYgKF9QQ0lCSU9TX3NldElSUShpbmZvLT5zbG90LmkgPj4gOCxpbnRQaW4sSVJRLFBDSUVudHJ5KSkgeworICAgICAgICAgICAgaW5mby0+dS50eXBlMC5JbnRlcnJ1cHRQaW4gPSBpbnRQaW47CisgICAgICAgICAgICBpbmZvLT51LnR5cGUwLkludGVycnVwdExpbmUgPSBJUlE7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoaXMgdmlhIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMgKi8KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYnVzICAgICAgICAgICAgICAgICAtIEJ1cyBudW1iZXIgdG8gZ2VuZXJhdGUgdGhlIHNwZWNpYWwgY3ljbGUgZm9yCitzcGVjaWFsQ3ljbGVEYXRhICAgIC0gRGF0YSB0byBzZW5kIGZvciB0aGUgc3BlY2lhbCBjeWxlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHNwZWNpYWwgY3ljbGUgb24gdGhlIHNwZWNpZmllZCBidXMgdXNpbmcgd2l0aAordGhlIHNwZWNpZmllZCBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0FTTUFQSSBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSgKKyAgICB1aW50IGJ1cywKKyAgICB1bG9uZyBzcGVjaWFsQ3ljbGVEYXRhKQoreworICAgIGlmIChQQ0lQaHlzRW50cnkpCisgICAgICAgIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZShidXMsc3BlY2lhbEN5Y2xlRGF0YSxQQ0lFbnRyeSk7CisgICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbyAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIGRldmljZSB0byBhY2Nlc3MKK2luZGV4ICAgLSBJbmRleCBvZiByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20KK2RzdCAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdmFsdWVzIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCitjb3VudCAgIC0gQ291bnQgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2UKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzCitmcm9tIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGludG8gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCit3aWxsIHByb3Blcmx5IGhhbmRsZSByZWFkaW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgZnJvbSB0aGUgY29uZmlndXJhdGlvbgorc3BhY2UgY29ycmVjdGx5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0FTTUFQSSBQQ0lfcmVhZFJlZ0Jsb2NrKAorICAgIFBDSURldmljZUluZm8gKmluZm8sCisgICAgaW50IGluZGV4LAorICAgIHZvaWQgKmRzdCwKKyAgICBpbnQgY291bnQpCit7CisgICAgdWNoYXIgICAqcGI7CisgICAgdWxvbmcgICAqcGQ7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgc3RhcnRDb3VudCA9IChpbmRleCAmIDMpOworICAgIGludCAgICAgbWlkZGxlQ291bnQgPSAoY291bnQgLSBzdGFydENvdW50KSA+PiAyOworICAgIGludCAgICAgZW5kQ291bnQgPSBjb3VudCAtIG1pZGRsZUNvdW50ICogNCAtIHN0YXJ0Q291bnQ7CisKKyAgICBmb3IgKGkgPSAwLHBiID0gZHN0OyBpIDwgc3RhcnRDb3VudDsgaSsrLCBpbmRleCsrKSB7CisgICAgICAgICpwYisrID0gKHVjaGFyKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9CWVRFLGluZm8pOworICAgICAgICB9CisgICAgZm9yIChpID0gMCxwZCA9ICh1bG9uZyopcGI7IGkgPCBtaWRkbGVDb3VudDsgaSsrLCBpbmRleCArPSA0KSB7CisgICAgICAgICpwZCsrID0gKHVsb25nKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9EV09SRCxpbmZvKTsKKyAgICAgICAgfQorICAgIGZvciAoaSA9IDAscGIgPSAodWNoYXIqKXBkOyBpIDwgZW5kQ291bnQ7IGkrKywgaW5kZXgrKykgeworICAgICAgICAqcGIrKyA9ICh1Y2hhcilQQ0lfYWNjZXNzUmVnKGluZGV4LDAsUENJX1JFQURfQllURSxpbmZvKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGJsb2NrIGZvciBkZXZpY2UgdG8gYWNjZXNzCitpbmRleCAgIC0gSW5kZXggb2YgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tCitkc3QgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHZhbHVlcyByZWFkIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZQorY291bnQgICAtIENvdW50IG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBibG9jayBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMKK3RvIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGZyb20gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCit3aWxsIHByb3Blcmx5IGhhbmRsZSB3cml0aW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgdG8gdGhlIGNvbmZpZ3VyYXRpb24KK3NwYWNlIGNvcnJlY3RseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9BU01BUEkgUENJX3dyaXRlUmVnQmxvY2soCisgICAgUENJRGV2aWNlSW5mbyAqaW5mbywKKyAgICBpbnQgaW5kZXgsCisgICAgdm9pZCAqc3JjLAorICAgIGludCBjb3VudCkKK3sKKyAgICB1Y2hhciAgICpwYjsKKyAgICB1bG9uZyAgICpwZDsKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICBzdGFydENvdW50ID0gKGluZGV4ICYgMyk7CisgICAgaW50ICAgICBtaWRkbGVDb3VudCA9IChjb3VudCAtIHN0YXJ0Q291bnQpID4+IDI7CisgICAgaW50ICAgICBlbmRDb3VudCA9IGNvdW50IC0gbWlkZGxlQ291bnQgKiA0IC0gc3RhcnRDb3VudDsKKworICAgIGZvciAoaSA9IDAscGIgPSBzcmM7IGkgPCBzdGFydENvdW50OyBpKyssIGluZGV4KyspIHsKKyAgICAgICAgUENJX2FjY2Vzc1JlZyhpbmRleCwqcGIrKyxQQ0lfV1JJVEVfQllURSxpbmZvKTsKKyAgICAgICAgfQorICAgIGZvciAoaSA9IDAscGQgPSAodWxvbmcqKXBiOyBpIDwgbWlkZGxlQ291bnQ7IGkrKywgaW5kZXggKz0gNCkgeworICAgICAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LCpwZCsrLFBDSV9XUklURV9EV09SRCxpbmZvKTsKKyAgICAgICAgfQorICAgIGZvciAoaSA9IDAscGIgPSAodWNoYXIqKXBkOyBpIDwgZW5kQ291bnQ7IGkrKywgaW5kZXgrKykgeworICAgICAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LCpwYisrLFBDSV9XUklURV9CWVRFLGluZm8pOworICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhYTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi91bml4aW8uYwpAQCAtMCwwICsxLDMwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgTW9kdWxlIGNvbnRhaW5pbmcgVW5peCBJL08gZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB7c2VjcmV0fSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERJUiAgICAgKmQ7CisgICAgY2hhciAgICBwYXRoW1BNX01BWF9QQVRIXTsKKyAgICBjaGFyICAgIG1hc2tbUE1fTUFYX1BBVEhdOworICAgIH0gUE1fZmluZEhhbmRsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCisgICAgc3RydWN0IGRpcmVudCAqYmxrLAorICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgdWxvbmcgICAgICAgZHdTaXplID0gZmluZERhdGEtPmR3U2l6ZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBjaGFyICAgICAgICBmaWxlbmFtZVtQTV9NQVhfUEFUSF07CisKKyAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKKyAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOworICAgIHN0cmNweShmaWxlbmFtZSxwYXRoKTsKKyAgICBQTV9iYWNrc2xhc2goZmlsZW5hbWUpOworICAgIHN0cmNhdChmaWxlbmFtZSxibGstPmRfbmFtZSk7CisgICAgc3RhdChmaWxlbmFtZSwmc3QpOworICAgIGlmICghKHN0LnN0X21vZGUgJiBTX0lXUklURSkpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKKyAgICBpZiAoc3Quc3RfbW9kZSAmIFNfSUZESVIpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7CisgICAgZmluZERhdGEtPnNpemVMbyA9IHN0LnN0X3NpemU7CisgICAgZmluZERhdGEtPnNpemVIaSA9IDA7CisgICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPmRfbmFtZSxQTV9NQVhfUEFUSCk7CisgICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RldGVybWluZXMgaWYgYSBmaWxlIG5hbWUgbWF0Y2hlcyB0aGUgcGFzc2VkIGluIHBhdHRlcm4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIGZpbGVtYXRjaCgKKyAgICBjaGFyICpwYXR0ZXJuLAorICAgIGNoYXIgKmRpcnBhdGgsCisgICAgc3RydWN0IGRpcmVudCAqZGlyZSkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpbnQgICAgICAgICBpID0gMCxqID0gMCxsYXN0Y2hhciA9ICdcMCc7CisgICAgY2hhciAgICAgICAgZnVsbHBhdGhbUE1fTUFYX1BBVEhdOworCisgICAgc3RyY3B5KGZ1bGxwYXRoLGRpcnBhdGgpOworICAgIFBNX2JhY2tzbGFzaChmdWxscGF0aCk7CisgICAgc3RyY2F0KGZ1bGxwYXRoLCBkaXJlLT5kX25hbWUpOworICAgIGlmIChzdGF0KGZ1bGxwYXRoLCAmc3QpICE9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKDsgaSA8IChpbnQpc3RybGVuKGRpcmUtPmRfbmFtZSkgJiYgaiA8IChpbnQpc3RybGVuKHBhdHRlcm4pOyBpKyssIGorKykgeworICAgICAgICBpZiAocGF0dGVybltqXSA9PSAnKicgJiYgbGFzdGNoYXIgIT0gJ1xcJykgeworICAgICAgICAgICAgaWYgKHBhdHRlcm5baisxXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgd2hpbGUgKGRpcmUtPmRfbmFtZVtpKytdICE9IHBhdHRlcm5baisxXSkgeworICAgICAgICAgICAgICAgIGlmIChkaXJlLT5kX25hbWVbaV0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGlyZS0+ZF9uYW1lW2ldICE9IHBhdHRlcm5bal0gJiYKKyAgICAgICAgICAgICAgICAhKHBhdHRlcm5bal0gPT0gJz8nICYmIGxhc3RjaGFyICE9ICdcXCcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsYXN0Y2hhciA9IHBhdHRlcm5baV07CisgICAgICAgIH0KKyAgICBpZiAoaiA9PSAoaW50KXN0cmxlbihwYXR0ZXJuKSAmJiBpID09IChpbnQpc3RybGVuKGRpcmUtPmRfbmFtZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICBQTV9maW5kSGFuZGxlICAgKmQ7CisgICAgc3RydWN0IGRpcmVudCAgICpkaXJlOworICAgIGNoYXIgICAgICAgICAgICBuYW1lW1BNX01BWF9QQVRIXTsKKyAgICBjaGFyICAgICAgICAgICAgZXh0W1BNX01BWF9QQVRIXTsKKworICAgIGlmICgoZCA9IFBNX21hbGxvYyhzaXplb2YoKmQpKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKKyAgICBQTV9zcGxpdHBhdGgoZmlsZW5hbWUsTlVMTCxkLT5wYXRoLG5hbWUsZXh0KTsKKyAgICBzdHJjcHkoZC0+bWFzayxuYW1lKTsKKyAgICBzdHJjYXQoZC0+bWFzayxleHQpOworICAgIGlmIChzdHJsZW4oZC0+cGF0aCkgPT0gMCkKKyAgICAgICAgc3RyY3B5KGQtPnBhdGgsICIuIik7CisgICAgaWYgKGQtPnBhdGhbc3RybGVuKGQtPnBhdGgpLTFdID09ICcvJykKKyAgICAgICAgZC0+cGF0aFtzdHJsZW4oZC0+cGF0aCktMV0gPSAwOworICAgIGlmICgoZC0+ZCA9IG9wZW5kaXIoZC0+cGF0aCkpICE9IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKChkaXJlID0gcmVhZGRpcihkLT5kKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGZpbGVtYXRjaChkLT5tYXNrLGQtPnBhdGgsZGlyZSkpIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0RmluZERhdGEoZmluZERhdGEsZGlyZSxkLT5wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGQtPmQpOworICAgICAgICB9CisgICAgUE1fZnJlZShkKTsKKyAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCisgICAgdm9pZCAqaGFuZGxlLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICBQTV9maW5kSGFuZGxlICAgKmQgPSBoYW5kbGU7CisgICAgc3RydWN0IGRpcmVudCAgICpkaXJlOworCisgICAgd2hpbGUgKChkaXJlID0gcmVhZGRpcihkLT5kKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZmlsZW1hdGNoKGQtPm1hc2ssZC0+cGF0aCxkaXJlKSkgeworICAgICAgICAgICAgY29udmVydEZpbmREYXRhKGZpbmREYXRhLGRpcmUsZC0+cGF0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIFBNX2ZpbmRIYW5kbGUgICAqZCA9IGhhbmRsZTsKKworICAgIGNsb3NlZGlyKGQtPmQpOworICAgIGZyZWUoZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMSAgIC0gRHJpdmUgQToKKyAgICAyICAgLSBEcml2ZSBCOgorICAgIDMgICAtIERyaXZlIEM6CisgICAgZXRjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAorICAgIGNoYXIgZHJpdmUpCit7CisgICAgaWYgKGRyaXZlID09IDMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgorVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCitvZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKKyAgICBpbnQgZHJpdmUsCisgICAgY2hhciAqZGlyLAorICAgIGludCBsZW4pCit7CisgICAgKHZvaWQpZHJpdmU7CisgICAgZ2V0Y3dkKGRpcixsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBtb2RlX3QgICAgICBtb2RlOworCisgICAgc3RhdChmaWxlbmFtZSwmc3QpOworICAgIG1vZGUgPSBzdC5zdF9tb2RlOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBtb2RlICY9IH5TX0lXUklURTsKKyAgICBlbHNlCisgICAgICAgIG1vZGUgfD0gU19JV1JJVEU7CisgICAgY2htb2QoZmlsZW5hbWUsbW9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgc3RhdChmaWxlbmFtZSwmc3QpOworICAgIGlmIChzdC5zdF9tb2RlICYgU19JV1JJVEUpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQTV9GSUxFX1JFQURPTkxZOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ta2RpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsMHgxRkYpID09IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX3JtZGlyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGlib29sIGdtVGltZSwKKyAgICBQTV90aW1lICp0aW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWZpbGVuYW1lOworICAgICh2b2lkKWdtVGltZTsKKyAgICAodm9pZCl0aW1lOworICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpZ21UaW1lOworICAgICh2b2lkKXRpbWU7CisgICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi92Z2FzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTE0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAgICAgICAgICAgICAgIFBvcnRpb25zIGNvcHlyaWdodCAoQykgSm9zaCBWYW5kZXJob29mCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgRnVuY3Rpb25zIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIFZHQSBoYXJkd2FyZSBzdGF0ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFZHQSBpbmRleCByZWdpc3RlciBwb3J0cyAqLworI2RlZmluZSBDUlRfSSAgIDB4M0Q0ICAgICAgIC8qIENSVCBDb250cm9sbGVyIEluZGV4ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVRUX0lXICAweDNDMCAgICAgICAvKiBBdHRyaWJ1dGUgQ29udHJvbGxlciBJbmRleCAmIERhdGEgICAgICAgICovCisjZGVmaW5lIEdSQV9JICAgMHgzQ0UgICAgICAgLyogR3JhcGhpY3MgQ29udHJvbGxlciBJbmRleCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRVFfSSAgIDB4M0M0ICAgICAgIC8qIFNlcXVlbmNlciBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVkdBIGRhdGEgcmVnaXN0ZXIgcG9ydHMgKi8KKyNkZWZpbmUgQ1JUX0QgICAweDNENSAgICAgICAvKiBDUlQgQ29udHJvbGxlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIEFUVF9SICAgMHgzQzEgICAgICAgLyogQXR0cmlidXRlIENvbnRyb2xsZXIgRGF0YSBSZWFkIFJlZ2lzdGVyICAqLworI2RlZmluZSBHUkFfRCAgIDB4M0NGICAgICAgIC8qIEdyYXBoaWNzIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgU0VRX0QgICAweDNDNSAgICAgICAvKiBTZXF1ZW5jZXIgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JU19SICAgMHgzQ0MgICAgICAgLyogTWlzYyBPdXRwdXQgUmVhZCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSVNfVyAgIDB4M0MyICAgICAgIC8qIE1pc2MgT3V0cHV0IFdyaXRlIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVMxX1IgICAweDNEQSAgICAgICAvKiBJbnB1dCBTdGF0dXMgUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBFTF9JVyAgMHgzQzggICAgICAgLyogUEVMIFdyaXRlIEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQRUxfSVIgIDB4M0M3ICAgICAgIC8qIFBFTCBSZWFkIEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEVMX0QgICAweDNDOSAgICAgICAvKiBQRUwgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIHN0YW5kYXJkIFZHQSBpbmRleGVzIG1heCBjb3VudHMgKi8KKyNkZWZpbmUgQ1JUX0MgICAyNCAgICAgICAgICAvKiAyNCAgQ1JUIENvbnRyb2xsZXIgUmVnaXN0ZXJzICAgICAgICAgICAgICovCisjZGVmaW5lIEFUVF9DICAgMjEgICAgICAgICAgLyogMjEgIEF0dHJpYnV0ZSBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAqLworI2RlZmluZSBHUkFfQyAgIDkgICAgICAgICAgIC8qIDkgICBHcmFwaGljcyBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgKi8KKyNkZWZpbmUgU0VRX0MgICA1ICAgICAgICAgICAvKiA1ICAgU2VxdWVuY2VyIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JU19DICAgMSAgICAgICAgICAgLyogMSAgIE1pc2MgT3V0cHV0IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQUxfQyAgIDc2OCAgICAgICAgIC8qIDc2OCBQYWxldHRlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRk9OVF9DICA4MTkyICAgICAgICAvKiBUb3RhbCBzaXplIG9mIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICAgICovCisKKy8qIFZHQSByZWdpc3RlcnMgc2F2aW5nIGluZGV4ZXMgKi8KKyNkZWZpbmUgQ1JUICAgICAwICAgICAgICAgICAvKiBDUlQgQ29udHJvbGxlciBSZWdpc3RlcnMgc3RhcnQgICAgICAgICAgICovCisjZGVmaW5lIEFUVCAgICAgKENSVCtDUlRfQykgLyogQXR0cmlidXRlIENvbnRyb2xsZXIgUmVnaXN0ZXJzIHN0YXJ0ICAgICAqLworI2RlZmluZSBHUkEgICAgIChBVFQrQVRUX0MpIC8qIEdyYXBoaWNzIENvbnRyb2xsZXIgUmVnaXN0ZXJzIHN0YXJ0ICAgICAgKi8KKyNkZWZpbmUgU0VRICAgICAoR1JBK0dSQV9DKSAvKiBTZXF1ZW5jZXIgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JUyAgICAgKFNFUStTRVFfQykgLyogR2VuZXJhbCBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQUwgICAgIChNSVMrTUlTX0MpIC8qIFZHQSBQYWxldHRlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRk9OVCAgICAoUEFMK1BBTF9DKSAvKiBWR0EgZm9udCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE1hY3JvcyBmb3IgcG9ydCBJL08gd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQgKi8KKworI2RlZmluZSBfcG9ydF9vdXQodixwKSAgUE1fb3V0cGIocCwodWNoYXIpKHYpKQorI2RlZmluZSBfcG9ydF9pbihwKSAgICAgUE1faW5wYihwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybnMgdGhlIHNpemUgb2YgdGhlIFZHQSBzdGF0ZSBidWZmZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldFZHQVN0YXRlU2l6ZSh2b2lkKQoreworICAgIHJldHVybiBDUlRfQyArIEFUVF9DICsgR1JBX0MgKyBTRVFfQyArIE1JU19DICsgUEFMX0MgKyBGT05UX0M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVsYXkgZm9yIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdmdhX2RlbGF5KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBGb3IgdGhlIGxvb3AgaGVyZSB3ZSBwcm9ncmFtIHRoZSBQT1NUIHJlZ2lzdGVyLiBUaGUgbGVuZ3RoIG9mIHRoaXMKKyAgICAgKiBkZWxheSBpcyBkZXBlbmRhbnQgb25seSBvbiBJU0EgYnVzIHNwZWVkLCBidXQgaXQgaXMgZW5vdWdoIGZvcgorICAgICAqIHdoYXQgd2UgbmVlZC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IDEwOyBpKyspCisgICAgICAgIFBNX291dHBiKDB4ODAsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBJL08gcG9ydCB0byByZWFkIHZhbHVlIGZyb20KK2luZGV4ICAgLSBQb3J0IGluZGV4IHRvIHJlYWQKKworUkVUVVJOUzoKK0J5dGUgcmVhZCBmcm9tICdwb3J0JyByZWdpc3RlciAnaW5kZXgnLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1c2hvcnQgdmdhX3JkaW54KAorICAgIHVzaG9ydCBwb3J0LAorICAgIHVzaG9ydCBpbmRleCkKK3sKKyAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7CisgICAgcmV0dXJuIFBNX2lucGIocG9ydCsxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gSS9PIHBvcnQgdG8gd3JpdGUgdG8KK2luZGV4ICAgLSBQb3J0IGluZGV4IHRvIHdyaXRlCit2YWx1ZSAgIC0gQnl0ZSB0byB3cml0ZSB0byBwb3J0CisKK1JFTUFSS1M6CitXcml0ZXMgYSBieXRlIHZhbHVlIHRvIHRoZSAncG9ydCcgcmVnaXN0ZXIgJ2luZGV4Jy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB2Z2Ffd3JpbngoCisgICAgdXNob3J0IHBvcnQsCisgICAgdXNob3J0IGluZGV4LAorICAgIHVzaG9ydCB2YWx1ZSkKK3sKKyAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7CisgICAgUE1fb3V0cGIocG9ydCsxLCh1Y2hhcil2YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2F2ZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB2Z2Ffc2F2ZXBhbGV0dGUoCisgICAgdWNoYXIgKnBhbCkKK3sKKyAgICBpbnQgaTsKKworICAgIF9wb3J0X291dCgwLCBQRUxfSVIpOworICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgeworICAgICAgICB2Z2FfZGVsYXkoKTsKKyAgICAgICAgKnBhbCsrID0gX3BvcnRfaW4oUEVMX0QpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVzdG9yZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB2Z2FfcmVzdG9yZXBhbGV0dGUoCisgICAgY29uc3QgdWNoYXIgKnBhbCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlc3RvcmUgc2F2ZWQgcGFsZXR0ZSAqLworICAgIF9wb3J0X291dCgwLCBQRUxfSVcpOworICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgeworICAgICAgICB2Z2FfZGVsYXkoKTsKKyAgICAgICAgX3BvcnRfb3V0KCpwYWwrKywgUEVMX0QpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgZm9udCBkYXRhIGZyb20gdGhlIFZHQSBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHZnYV9zYXZlRm9udCgKKyAgICB1Y2hhciAqZGF0YSkKK3sKKyAgICB1Y2hhciAgICpBMDAwMFB0ciA9IFBNX2dldEEwMDAwUG9pbnRlcigpOworICAgIHVjaGFyICAgc2F2ZVs3XTsKKworICAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KKyAgICBzYXZlWzBdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKKyAgICBzYXZlWzFdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAyKTsKKyAgICBzYXZlWzJdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDA0KTsKKyAgICBzYXZlWzNdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKKyAgICBzYXZlWzRdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA0KTsKKyAgICBzYXZlWzVdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA1KTsKKyAgICBzYXZlWzZdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA2KTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAxKTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMiwweDA0KTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCwweDA3KTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAzKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCwweDAyKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSwweDAwKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNiwweDAwKTsKKworICAgIC8qIENvcHkgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KKyAgICBtZW1jcHkoZGF0YSxBMDAwMFB0cixGT05UX0MpOworCisgICAgLyogUmVzdG9yZSBWR0Egc3RhdGUgKi8KKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzBdKTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMixzYXZlWzFdKTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCxzYXZlWzJdKTsKKyAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzNdKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCxzYXZlWzRdKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSxzYXZlWzVdKTsKKyAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNixzYXZlWzZdKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEb3dubG9hZHMgdGhlIGZvbnQgZGF0YSB0byB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdmdhX3Jlc3RvcmVGb250KAorICAgIGNvbnN0IHVjaGFyICpkYXRhKQoreworICAgIHVjaGFyICAgKkEwMDAwUHRyID0gUE1fZ2V0QTAwMDBQb2ludGVyKCk7CisKKyAgICAvKiBFbmFibGUgYWNjZXNzIHRvIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCisgICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMSk7CisgICAgdmdhX3dyaW54KFNFUV9JLDB4MDIsMHgwNCk7CisgICAgdmdhX3dyaW54KFNFUV9JLDB4MDQsMHgwNyk7CisgICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMyk7CisgICAgdmdhX3dyaW54KEdSQV9JLDB4MDQsMHgwMik7CisgICAgdmdhX3dyaW54KEdSQV9JLDB4MDUsMHgwMCk7CisgICAgdmdhX3dyaW54KEdSQV9JLDB4MDYsMHgwMCk7CisKKyAgICAvKiBDb3B5IGZvbnQgYmFjayB0byBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAqLworICAgIG1lbWNweShBMDAwMFB0cixkYXRhLEZPTlRfQyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2F2ZSB0aGUgc3RhdGUgb2YgYWxsIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2F2ZVZHQVN0YXRlKAorICAgIHZvaWQgKnN0YXRlQnVmKQoreworICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKKyAgICBpbnQgICAgIGk7CisKKyAgICAvKiBTYXZlIHN0YXRlIG9mIFZHQSByZWdpc3RlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1JUX0M7IGkrKykgeworICAgICAgICBfcG9ydF9vdXQoaSwgQ1JUX0kpOworICAgICAgICByZWdzW0NSVCArIGldID0gX3BvcnRfaW4oQ1JUX0QpOworICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEFUVF9DOyBpKyspIHsKKyAgICAgICAgX3BvcnRfaW4oSVMxX1IpOworICAgICAgICB2Z2FfZGVsYXkoKTsKKyAgICAgICAgX3BvcnRfb3V0KGksIEFUVF9JVyk7CisgICAgICAgIHZnYV9kZWxheSgpOworICAgICAgICByZWdzW0FUVCArIGldID0gX3BvcnRfaW4oQVRUX1IpOworICAgICAgICB2Z2FfZGVsYXkoKTsKKyAgICAgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBHUkFfQzsgaSsrKSB7CisgICAgICAgIF9wb3J0X291dChpLCBHUkFfSSk7CisgICAgICAgIHJlZ3NbR1JBICsgaV0gPSBfcG9ydF9pbihHUkFfRCk7CisgICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU0VRX0M7IGkrKykgeworICAgICAgICBfcG9ydF9vdXQoaSwgU0VRX0kpOworICAgICAgICByZWdzW1NFUSArIGldID0gX3BvcnRfaW4oU0VRX0QpOworICAgICAgICB9CisgICAgcmVnc1tNSVNdID0gX3BvcnRfaW4oTUlTX1IpOworCisgICAgLyogU2F2ZSB0aGUgVkdBIHBhbGV0dGUgdmFsdWVzICovCisgICAgdmdhX3NhdmVwYWxldHRlKCZyZWdzW1BBTF0pOworCisgICAgLyogU2F2ZSB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCisgICAgdmdhX3NhdmVGb250KCZyZWdzW0ZPTlRdKTsKKworICAgIC8qIFR1cm4gdGhlIFZHQSBkaXNwbGF5IGJhY2sgb24gKi8KKyAgICBQTV92Z2FVbmJsYW5rRGlzcGxheSgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldG9yZSB0aGUgc3RhdGUgb2YgYWxsIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVZHQVN0YXRlKAorICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmKQoreworICAgIGNvbnN0IHVjaGFyICpyZWdzID0gc3RhdGVCdWY7CisgICAgaW50ICAgICAgICAgaTsKKworICAgIC8qIEJsYW5rIHRoZSBkaXNwbGF5IGJlZm9yZSB3ZSBzdGFydCB0aGUgcmVzdG9yZSAqLworICAgIFBNX3ZnYUJsYW5rRGlzcGxheSgpOworCisgICAgLyogUmVzdG9yZSB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCisgICAgdmdhX3Jlc3RvcmVGb250KCZyZWdzW0ZPTlRdKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIFZHQSBwYWxldHRlIHZhbHVlcyAqLworICAgIHZnYV9yZXN0b3JlcGFsZXR0ZSgmcmVnc1tQQUxdKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMgKi8KKyAgICBfcG9ydF9vdXQocmVnc1tNSVNdLCBNSVNfVyk7CisKKyAgICAvKiBEZWxheSB0byBhbGxvdyBjbG9jayBjaGFuZ2UgdG8gc2V0dGxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisgICAgICAgIHZnYV9kZWxheSgpOworCisgICAgLyogU3luY2hyb25vdXMgcmVzZXQgb24gKi8KKyAgICBfcG9ydF9vdXQoMHgwMCxTRVFfSSk7CisgICAgX3BvcnRfb3V0KDB4MDEsU0VRX0QpOworCisgICAgLyogV3JpdGUgc2VxZXVlbmNlciByZWdpc3RlcnMgKi8KKyAgICBfcG9ydF9vdXQoMSwgU0VRX0kpOworICAgIF9wb3J0X291dChyZWdzW1NFUSArIDFdIHwgMHgyMCwgU0VRX0QpOworICAgIGZvciAoaSA9IDI7IGkgPCBTRVFfQzsgaSsrKSB7CisgICAgICAgIF9wb3J0X291dChpLCBTRVFfSSk7CisgICAgICAgIF9wb3J0X291dChyZWdzW1NFUSArIGldLCBTRVFfRCk7CisgICAgICAgIH0KKworICAgIC8qIFN5bmNocm9ub3VzIHJlc2V0IG9mZiAqLworICAgIF9wb3J0X291dCgweDAwLFNFUV9JKTsKKyAgICBfcG9ydF9vdXQoMHgwMyxTRVFfRCk7CisKKyAgICAvKiBEZXByb3RlY3QgQ1JUIHJlZ2lzdGVycyAwLTcgYW5kIHdyaXRlIENSVEMgKi8KKyAgICBfcG9ydF9vdXQoMHgxMSwgQ1JUX0kpOworICAgIF9wb3J0X291dChfcG9ydF9pbihDUlRfRCkgJiAweDdGLCBDUlRfRCk7CisgICAgZm9yIChpID0gMDsgaSA8IENSVF9DOyBpKyspIHsKKyAgICAgICAgX3BvcnRfb3V0KGksIENSVF9JKTsKKyAgICAgICAgX3BvcnRfb3V0KHJlZ3NbQ1JUICsgaV0sIENSVF9EKTsKKyAgICAgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBHUkFfQzsgaSsrKSB7CisgICAgICAgIF9wb3J0X291dChpLCBHUkFfSSk7CisgICAgICAgIF9wb3J0X291dChyZWdzW0dSQSArIGldLCBHUkFfRCk7CisgICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVRUX0M7IGkrKykgeworICAgICAgICBfcG9ydF9pbihJUzFfUik7ICAgICAgICAvKiByZXNldCBmbGlwLWZsb3AgKi8KKyAgICAgICAgdmdhX2RlbGF5KCk7CisgICAgICAgIF9wb3J0X291dChpLCBBVFRfSVcpOworICAgICAgICB2Z2FfZGVsYXkoKTsKKyAgICAgICAgX3BvcnRfb3V0KHJlZ3NbQVRUICsgaV0sIEFUVF9JVyk7CisgICAgICAgIHZnYV9kZWxheSgpOworICAgICAgICB9CisKKyAgICAvKiBFbnN1cmUgdGhlIFZHQSBzY3JlZW4gaXMgdHVybmVkIG9uICovCisgICAgUE1fdmdhVW5ibGFua0Rpc3BsYXkoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEaXNhYmxlcyB0aGUgVkdBIGRpc3BsYXkgZm9yIHNjcmVlbiBvdXRwdXQgbWFraW5nIGl0IGJsYW5rLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fdmdhQmxhbmtEaXNwbGF5KHZvaWQpCit7CisgICAgLyogVHVybiBzY3JlZW4gb2ZmICovCisgICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKKyAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpIHwgMHgyMCwgU0VRX0QpOworCisgICAgLyogRGlzYWJsZSB2aWRlbyBvdXRwdXQgKi8KKyAgICBfcG9ydF9pbihJUzFfUik7CisgICAgdmdhX2RlbGF5KCk7CisgICAgIF9wb3J0X291dCgweDAwLCBBVFRfSVcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VuYWJsZXMgdGhlIFZHQSBkaXNwbGF5IGZvciBzY3JlZW4gb3V0cHV0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fdmdhVW5ibGFua0Rpc3BsYXkodm9pZCkKK3sKKyAgICAvKiBUdXJuIHNjcmVlbiBiYWNrIG9uICovCisgICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKKyAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpICYgMHhERiwgU0VRX0QpOworCisgICAgLyogRW5hYmxlIHZpZGVvIG91dHB1dCAqLworICAgIF9wb3J0X2luKElTMV9SKTsKKyAgICB2Z2FfZGVsYXkoKTsKKyAgICBfcG9ydF9vdXQoMHgyMCwgQVRUX0lXKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ0NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY3B1aW5mby5jCkBAIC0wLDAgKzEsODA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBNYWluIG1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIFplbiBUaW1lciBzdXBwb3J0IGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ6dGltZXIuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgIm9zaGRyLmgiCisjaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19PUzJfVkREX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHRlcm5hbCBJbnRlbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCisjaWZkZWYgIF9fSU5URUxfXworLyoge3NlY3JldH0gKi8KK2lib29sICAgX0FTTUFQSSBfQ1BVX2hhdmVDUFVJRCh2b2lkKTsKKy8qIHtzZWNyZXR9ICovCitpYm9vbCAgIF9BU01BUEkgX0NQVV9jaGVjazgwMzg2KHZvaWQpOworLyoge3NlY3JldH0gKi8KK2lib29sICAgX0FTTUFQSSBfQ1BVX2NoZWNrODA0ODYodm9pZCk7CisvKiB7c2VjcmV0fSAqLwordWludCAgICBfQVNNQVBJIF9DUFVfY2hlY2tDUFVJRCh2b2lkKTsKKy8qIHtzZWNyZXR9ICovCit1aW50ICAgIF9BU01BUEkgX0NQVV9nZXRDUFVJRE1vZGVsKHZvaWQpOworLyoge3NlY3JldH0gKi8KK3VpbnQgICAgX0FTTUFQSSBfQ1BVX2dldENQVUlEU3RlcHBpbmcodm9pZCk7CisvKiB7c2VjcmV0fSAqLwordWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKTsKKy8qIHtzZWNyZXR9ICovCit1aW50ICAgIF9BU01BUEkgX0NQVV9nZXRDYWNoZVNpemUodm9pZCk7CisvKiB7c2VjcmV0fSAqLwordWludCAgICBfQVNNQVBJIF9DUFVfaGF2ZTNETm93KHZvaWQpOworLyoge3NlY3JldH0gKi8KK2lib29sICAgX0FTTUFQSSBfQ1BVX2NoZWNrQ2xvbmUodm9pZCk7CisvKiB7c2VjcmV0fSAqLwordm9pZCAgICBfQVNNQVBJIF9DUFVfcmVhZFRpbWVTdGFtcChDUFVfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKKy8qIHtzZWNyZXR9ICovCit2b2lkICAgIF9BU01BUEkgX0NQVV9ydW5CU0ZMb29wKHVsb25nIGl0ZXJhdGlvbnMpOworLyoge3NlY3JldH0gKi8KK3Vsb25nICAgX0FTTUFQSSBfQ1BVX211bERpdih1bG9uZyBhLHVsb25nIGIsdWxvbmcgYyk7CisvKiB7c2VjcmV0fSAqLwordm9pZCBaVGltZXJRdWlja0luaXQodm9pZCk7CisjZGVmaW5lIENQVV9IYXZlTU1YICAgICAweDAwODAwMDAwCisjZGVmaW5lIENQVV9IYXZlUkRUU0MgICAweDAwMDAwMDEwCisjZGVmaW5lIENQVV9IYXZlU1NFICAgICAweDAyMDAwMDAwCisjZW5kaWYKKworI2lmICAgICBkZWZpbmVkKF9fU01YMzJfXykKKyNpbmNsdWRlICJzbXgvY3B1aW5mby5jIgorI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKKyNpbmNsdWRlICJydHRhcmdldC9jcHVpbmZvLmMiCisjZWxpZiAgIGRlZmluZWQoX19SRUFMRE9TX18pCisjaW5jbHVkZSAiZG9zL2NwdWluZm8uYyIKKyNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgIm50ZHJ2L2NwdWluZm8uYyIKKyNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQorI2luY2x1ZGUgInZ4ZC9jcHVpbmZvLmMiCisjZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykKKyNpbmNsdWRlICJ3aW4zMi9jcHVpbmZvLmMiCisjZWxpZiAgIGRlZmluZWQoX19PUzJfVkREX18pCisjaW5jbHVkZSAidmRkL2NwdWluZm8uYyIKKyNlbGlmICAgZGVmaW5lZChfX09TMl9fKQorI2luY2x1ZGUgIm9zMi9jcHVpbmZvLmMiCisjZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQorI2luY2x1ZGUgImxpbnV4L2NwdWluZm8uYyIKKyNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQorI2luY2x1ZGUgInFueC9jcHVpbmZvLmMiCisjZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCisjaW5jbHVkZSAiYmVvcy9jcHVpbmZvLmMiCisjZWxzZQorI2Vycm9yICBDUFUgbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBpbnRlcmZhY2Ugcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCBhbiBJL08gcG9ydCBsb2NhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWNoYXIgcmRpbngoCisgICAgaW50IHBvcnQsCisgICAgaW50IGluZGV4KQoreworICAgIFBNX291dHBiKHBvcnQsKHVjaGFyKWluZGV4KTsKKyAgICByZXR1cm4gUE1faW5wYihwb3J0KzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dyaXRlIGFuIEkvTyBwb3J0IGxvY2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdyaW54KAorICAgIHVzaG9ydCBwb3J0LAorICAgIHVzaG9ydCBpbmRleCwKKyAgICB1c2hvcnQgdmFsdWUpCit7CisgICAgUE1fb3V0cGIocG9ydCwodWNoYXIpaW5kZXgpOworICAgIFBNX291dHBiKHBvcnQrMSwodWNoYXIpdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VuYWJsZXMgdGhlIEN5cml4IENQVUlEIGluc3RydWN0aW9uIHRvIHByb3Blcmx5IGRldGVjdCBNZWRpYUdYIGFuZCA2eDg2Citwcm9jZXNzb3JzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9DUFVfZW5hYmxlQ3lyaXhDUFVJRCh2b2lkKQoreworICAgIHVjaGFyICAgY2NyMzsKKworICAgIFBNX2luaXQoKTsKKyAgICBjY3IzID0gcmRpbngoMHgyMiwweEMzKTsKKyAgICB3cmlueCgweDIyLDB4QzMsKHVjaGFyKShjY3IzIHwgMHgxMCkpOworICAgIHdyaW54KDB4MjIsMHhFOCwodWNoYXIpKHJkaW54KDB4MjIsMHhFOCkgfCAweDgwKSk7CisgICAgd3JpbngoMHgyMiwweEMzLGNjcjMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZXR1cm5zIHRoZSB0eXBlIG9mIHByb2Nlc3NvciBpbiB0aGUgc3lzdGVtLgorCitIRUFERVI6Cit6dGltZXIuaAorCitSRVRVUk5TOgorTnVtZXJpY2FsIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0YWxsZWQgcHJvY2Vzc29yCisKK1JFTUFSS1M6CitSZXR1cm5zIHRoZSB0eXBlIG9mIHByb2Nlc3NvciBpbiB0aGUgc3lzdGVtLiBOb3RlIHRoYXQgaWYgdGhlIENQVSBpcyBhbgordW5rbm93biBQZW50aXVtIGZhbWlseSBwcm9jZXNzb3IgdGhhdCB3ZSBkb24ndCBoYXZlIGFuIGVudW1lcmF0aW9uIGZvciwKK3RoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIENQVV9VbmtQZW50aXVtCisoZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24pLgorCitTRUUgQUxTTzoKK0NQVV9nZXRQcm9jZXNzb3JTcGVlZCwgQ1BVX2hhdmVNTVgsIENQVV9nZXRQcm9jZXNzb3JOYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludCBaQVBJIENQVV9nZXRQcm9jZXNzb3JUeXBlKHZvaWQpCit7CisjaWYgICAgIGRlZmluZWQoX19JTlRFTF9fKQorICAgIHVpbnQgICAgICAgICAgICBjcHUsdmVuZG9yLG1vZGVsLGNhY2hlU2l6ZTsKKyAgICBzdGF0aWMgaWJvb2wgICAgZmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKSB7CisgICAgICAgIGNwdSA9IF9DUFVfY2hlY2tDUFVJRCgpOworICAgICAgICB2ZW5kb3IgPSBjcHUgJiB+Q1BVX21hc2s7CisgICAgICAgIGlmICh2ZW5kb3IgPT0gQ1BVX0ludGVsKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgSW50ZWwgcHJvY2Vzc29ycyAqLworICAgICAgICAgICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgeworICAgICAgICAgICAgICAgIGNhc2UgNDogY3B1ID0gQ1BVX2k0ODY7ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OiBjcHUgPSBDUFVfUGVudGl1bTsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9QZW50aXVtUHJvOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbCA8PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVNpemUgPSBfQ1BVX2dldENhY2hlU2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlbCA9PSA1ICYmIGNhY2hlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlbCA9PSA1ICYmIGNhY2hlU2l6ZSA9PSAyNTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGVsID09IDYgJiYgY2FjaGVTaXplID09IDEyOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX0NlbGVyb247CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX1BlbnRpdW1JSTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwgPj0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9kZWwgNyA9PSBQZW50aXVtIElJSSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9kZWwgOCA9PSBDZWxlcm9uL1BlbnRpdW0gSUlJIENvcHBlcm1pbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZSA9IF9DUFVfZ2V0Q2FjaGVTaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGVsID09IDggJiYgY2FjaGVTaXplID09IDEyOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX0NlbGVyb247CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX1BlbnRpdW1JSUk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9VbmtJbnRlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQ3lyaXgpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBDeXJpeCBwcm9jZXNzb3JzICovCisgICAgICAgICAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQ3lyaXhNZWRpYUdYOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rQ3lyaXg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX0N5cml4Nng4NjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9DeXJpeE1lZGlhR1htOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rQ3lyaXg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA8PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX0N5cml4Nng4Nk1YOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rQ3lyaXg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9VbmtDeXJpeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQU1EKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgQU1EIHByb2Nlc3NvcnMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9BTURBbTV4ODY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9BTURBbTQ4NjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpIDw9IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1ESzU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsIDw9IDcpCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1ESzY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsID09IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1ESzZfMjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwgPT0gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9BTURLNl9JSUk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsID09IDEzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKCkgPD0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1ESzZfSUlJcGx1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1ESzZfMnBsdXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IENQVV9VbmtBTUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX0FNRER1cm9uOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfQU1EQXRobG9uOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rQU1EOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmVuZG9yID09IENQVV9JRFQpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBJRFQgV2luQ2hpcCBwcm9jZXNzb3JzICovCisgICAgICAgICAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpIDw9IDQpCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfV2luQ2hpcEM2OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbCA9PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gQ1BVX1dpbkNoaXAyOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rSURUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjcHUgPSBDUFVfVW5rSURUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBBc3N1bWUgYSBQZW50aXVtIGNvbXBhdGlibGUgSW50ZWwgY2xvbmUgKi8KKyAgICAgICAgICAgIGNwdSA9IENQVV9QZW50aXVtOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gY3B1IHwgdmVuZG9yIHwgKF9DUFVfZ2V0Q1BVSURTdGVwcGluZygpIDw8IENQVV9zdGVwcGluZ1NoaWZ0KTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoX0NQVV9jaGVjazgwMzg2KCkpCisgICAgICAgICAgICBjcHUgPSBDUFVfaTM4NjsKKyAgICAgICAgZWxzZSAgaWYgKF9DUFVfY2hlY2s4MDQ4NigpKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3ZSBtYXkgaGF2ZSBhIEN5cml4IHByb2Nlc3NvciBzbyB3ZSBjYW4gdHJ5CisgICAgICAgICAgICAgKiBlbmFibGluZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gYW5kIHRyeWluZyBhZ2Fpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgeworICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIF9DUFVfZW5hYmxlQ3lyaXhDUFVJRCgpOworICAgICAgICAgICAgICAgIHJldHVybiBDUFVfZ2V0UHJvY2Vzc29yVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNwdSA9IENQVV9pNDg2OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjcHUgPSBDUFVfUGVudGl1bTsKKyAgICAgICAgaWYgKCFfQ1BVX2NoZWNrQ2xvbmUoKSkKKyAgICAgICAgICAgIHJldHVybiBjcHUgfCBDUFVfSW50ZWw7CisgICAgICAgIHJldHVybiBjcHU7CisgICAgICAgIH0KKyNlbGlmICAgZGVmaW5lZChfX0FMUEhBX18pCisgICAgcmV0dXJuIENQVV9BbHBoYTsKKyNlbGlmICAgZGVmaW5lZChfX01JUFNfXykKKyAgICByZXR1cm4gQ1BVX01pcHM7CisjZWxpZiAgIGRlZmluZWQoX19QUENfXykKKyAgICByZXR1cm4gQ1BVX1Bvd2VyUEM7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgSW50ZWwgTU1YIGV4dGVuc2lvbnMuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFVFVSTlM6CitUcnVlIGlmIE1NWCBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBJbnRlbCBNTVggZXh0ZW5kZWQKK2luc3RydWN0aW9uIHNldC4KKworU0VFIEFMU086CitDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZTNETm93LCBDUFVfaGF2ZVNTRSwKK0NQVV9nZXRQcm9jZXNzb3JOYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgWkFQSSBDUFVfaGF2ZU1NWCh2b2lkKQoreworI2lmZGVmICBfX0lOVEVMX18KKyAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKKyAgICAgICAgcmV0dXJuIChfQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlTU1YKSAhPSAwOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIEFNRCAzRE5vdyEgZXh0ZW5zaW9ucy4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVUVVJOUzoKK1RydWUgaWYgM0ROb3chIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEFNRCAzRE5vdyEgZXh0ZW5kZWQKK2luc3RydWN0aW9uIHNldC4KKworU0VFIEFMU086CitDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmVTU0UsCitDUFVfZ2V0UHJvY2Vzc29yTmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFpBUEkgQ1BVX2hhdmUzRE5vdyh2b2lkKQoreworI2lmZGVmICBfX0lOVEVMX18KKyAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKKyAgICAgICAgcmV0dXJuIF9DUFVfaGF2ZTNETm93KCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgSW50ZWwgS05JIGV4dGVuc2lvbnMuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFVFVSTlM6CitUcnVlIGlmIEludGVsIEtOSSBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBJbnRlbCBLTkkgZXh0ZW5kZWQKK2luc3RydWN0aW9uIHNldC4KKworU0VFIEFMU086CitDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmUzRE5vdywKK0NQVV9nZXRQcm9jZXNzb3JOYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgWkFQSSBDUFVfaGF2ZVNTRSh2b2lkKQoreworI2lmZGVmICBfX0lOVEVMX18KKyAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKKyAgICAgICAgcmV0dXJuIChfQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlU1NFKSAhPSAwOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorVHJ1ZSBpZiB0aGUgUlRTQyBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBJbnRlbCBSRFRTQworaW5zdHJ1Y3Rpb24sIGZvciBoaWdoIHByZWNpc2lvbiB0aW1pbmcuIElmIHRoZSBwcm9jZXNzb3IgaXMgbm90IGFuIEludGVsIG9yCitJbnRlbCBjbG9uZSBDUFUsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLgorCitERVNDUklQVElPTjoKK1JldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIFJEVFNDIGV4dGVuc2lvbnMuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFVFVSTlM6CitUcnVlIGlmIFJUU0MgaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgUkRUU0MgaW5zdHJ1Y3Rpb24KK2ZvciByZWFkaW5nIHRoZSBwcm9jZXNzb3IgdGltZSBzdGFtcCBjb3VudGVyLgorCitTRUUgQUxTTzoKK0NQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlTU1YLCBDUFVfaGF2ZTNETm93LAorQ1BVX2dldFByb2Nlc3Nvck5hbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBaQVBJIENQVV9oYXZlUkRUU0Modm9pZCkKK3sKKyNpZmRlZiAgX19JTlRFTF9fCisgICAgaWYgKF9DUFVfaGF2ZUNQVUlEKCkpCisgICAgICAgIHJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKyNpZmRlZiAgX19JTlRFTF9fCisKKyNkZWZpbmUgSVRFUkFUSU9OUyAgICAgIDE2MDAwCisjZGVmaW5lIFNBTVBMSU5HUyAgICAgICAyCisjZGVmaW5lIElOTkVSX0xPT1BTICAgICA0MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJZiBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHN0YW1wIHJlYWRpbmcsIGJ1dCBpcyBhdCBsZWFzdCBhIDM4NiBvcgorYWJvdmUsIHV0aWxpemUgbWV0aG9kIG9mIHRpbWluZyBhIGxvb3Agb2YgQlNGIGluc3RydWN0aW9ucyB3aGljaCB0YWtlIGEKK2tub3duIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIG9uIGkzODYodG0pLCBpNDg2KHRtKSwgYW5kIFBlbnRpdW0oUikKK3Byb2Nlc3NvcnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIEdldEJTRkNwdVNwZWVkKAorICAgIHVsb25nIGN5Y2xlcykKK3sKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyIHQwLHQxLGNvdW50X2ZyZXE7CisgICAgdWxvbmcgICB0aWNrczsgICAgICAgICAgICAgIC8qIE1pY3Jvc2Vjb25kcyBlbGFwc2VkIGR1cmluZyB0ZXN0ICAgICAqLworICAgIHVsb25nICAgY3VycmVudDsgICAgICAgICAgICAvKiBWYXJpYWJsZSB0byBzdG9yZSB0aW1lIGVsYXBzZWQgICAgICAgKi8KKyAgICBpbnQgICAgIGksaixpUHJpb3JpdHk7CisgICAgdWxvbmcgICBsb3dlc3QgID0gKHVsb25nKS0xOworCisgICAgaVByaW9yaXR5ID0gU2V0TWF4VGhyZWFkUHJpb3JpdHkoKTsKKyAgICBHZXRDb3VudGVyRnJlcXVlbmN5KCZjb3VudF9mcmVxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0FNUExJTkdTOyBpKyspIHsKKyAgICAgICAgR2V0Q291bnRlcigmdDApOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgSU5ORVJfTE9PUFM7IGorKykKKyAgICAgICAgICAgIF9DUFVfcnVuQlNGTG9vcChJVEVSQVRJT05TKTsKKyAgICAgICAgR2V0Q291bnRlcigmdDEpOworICAgICAgICBjdXJyZW50ID0gdDEubG93IC0gdDAubG93OworICAgICAgICBpZiAoY3VycmVudCA8IGxvd2VzdCkKKyAgICAgICAgICAgIGxvd2VzdCA9IGN1cnJlbnQ7CisgICAgICAgIH0KKyAgICBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaVByaW9yaXR5KTsKKworICAgIC8qIENvbXB1dGUgZnJlcXVlbmN5ICovCisgICAgdGlja3MgPSBfQ1BVX211bERpdihsb3dlc3QsMTAwMDAwMCxjb3VudF9mcmVxLmxvdyk7CisgICAgaWYgKCh0aWNrcyAlIGNvdW50X2ZyZXEubG93KSA+IChjb3VudF9mcmVxLmxvdy8yKSkKKyAgICAgICAgdGlja3MrKzsgICAgICAgICAgICAvKiBSb3VuZCB1cCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAodGlja3MgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICgoY3ljbGVzKklOTkVSX0xPT1BTKS90aWNrcyk7Cit9CisKKyNkZWZpbmUgVE9MRVJBTkNFICAgICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitPbiBwcm9jZXNzb3JzIHN1cHBvcnRpbmcgdGhlIFJlYWQgVGltZSBTdGFtcCBvcGNvZGUsIGNvbXBhcmUgZWxhcHNlZAordGltZSBvbiB0aGUgSGlnaC1SZXNvbHV0aW9uIENvdW50ZXIgd2l0aCBlbGFwc2VkIGN5Y2xlcyBvbiB0aGUgVGltZQorU3RhbXAgUmVnaXN0ZXIuCisKK1RoZSBpbm5lciBsb29wIHJ1bnMgdXAgdG8gMjAgdGltZXMgb3J1bnRpbCB0aGUgYXZlcmFnZSBvZiB0aGUgcHJldmlvdXMKK3RocmVlIGNhbGN1bGF0ZWQgZnJlcXVlbmNpZXMgaXMgd2l0aGluIDEgTUh6IG9mIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwKK2NhbGN1bGF0ZWQgZnJlcXVlbmNpZXMuIFRoaXMgcmVzYW1wbGluZyBpbmNyZWFzZXMgdGhlIGFjY3VyYWN5IG9mIHRoZQorcmVzdWx0cyBzaW5jZSBvdXRzaWRlIGZhY3RvcnMgY291bGQgYWZmZWN0IHRoaXMgY2FsY3VsYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIEdldFJEVFNDQ3B1U3BlZWQoCisgICAgaWJvb2wgYWNjdXJhdGUpCit7CisgICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0MCx0MSxzMCxzMSxjb3VudF9mcmVxOworICAgIHU2NCAgICAgICAgICAgICAgICAgc3RhbXAwLCBzdGFtcDEsIHRpY2tzMCwgdGlja3MxOworICAgIHU2NCAgICAgICAgICAgICAgICAgdG90YWxfY3ljbGVzLCBjeWNsZXMsIGh6LCBmcmVxOworICAgIHU2NCAgICAgICAgICAgICAgICAgdG90YWxfdGlja3MsIHRpY2tzOworICAgIGludCAgICAgICAgICAgICAgICAgdHJpZXMsaVByaW9yaXR5OworICAgIHVsb25nICAgICAgICAgICAgICAgbWF4Q291bnQ7CisKKyAgICBQTV9zZXQ2NF8zMih0b3RhbF9jeWNsZXMsMCk7CisgICAgUE1fc2V0NjRfMzIodG90YWxfdGlja3MsMCk7CisgICAgbWF4Q291bnQgPSBhY2N1cmF0ZSA/IDYwMDAwMCA6IDMwMDAwOworICAgIGlQcmlvcml0eSA9IFNldE1heFRocmVhZFByaW9yaXR5KCk7CisgICAgR2V0Q291bnRlckZyZXF1ZW5jeSgmY291bnRfZnJlcSk7CisgICAgUE1fc2V0NjQoZnJlcSxjb3VudF9mcmVxLmhpZ2gsY291bnRfZnJlcS5sb3cpOworICAgIGZvciAodHJpZXMgPSAwOyB0cmllcyA8IDM7IHRyaWVzKyspIHsKKyAgICAgICAgLyogTG9vcCB1bnRpbCAxMDAgdGlja3MgaGF2ZSBwYXNzZWQgc2luY2UgbGFzdCByZWFkIG9mIGhpLXJlcworICAgICAgICAgKiBjb3VudGVyLiBUaGlzIGFjY291bnRzIGZvciBvdmVyaGVhZCBsYXRlci4KKyAgICAgICAgICovCisgICAgICAgIEdldENvdW50ZXIoJnQwKTsKKyAgICAgICAgdDEubG93ID0gdDAubG93OworICAgICAgICB0MS5oaWdoID0gdDAuaGlnaDsKKyAgICAgICAgd2hpbGUgKCh0MS5sb3cgLSB0MC5sb3cpIDwgMTAwKSB7CisgICAgICAgICAgICBHZXRDb3VudGVyKCZ0MSk7CisgICAgICAgICAgICBfQ1BVX3JlYWRUaW1lU3RhbXAoJnMwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBMb29wIHVudGlsIDMwMDAwIHRpY2tzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgcmVhZCBvZiBoaS1yZXMgY291bnRlci4KKyAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIGVsYXBzZWQgdGltZSBmb3Igc2FtcGxpbmcuIEZvciBhIGhpLXJlcyBmcmVxdWVuY3kKKyAgICAgICAgICogb2YgMU1IeiwgdGhpcyBpcyBhYm91dCAwLjAzIG9mIGEgc2Vjb25kLiBUaGUgZnJlcXVlbmN5IHJlcG9ydGVkCisgICAgICAgICAqIGJ5IHRoZSBPUyBkZXBlbmRlbnQgY29kZSBzaG91bGQgYmUgdHVuZWQgdG8gcHJvdmlkZSBhIGdvb2QKKyAgICAgICAgICogc2FtcGxlIHBlcmlvZCBkZXBlbmRpbmcgb24gdGhlIGFjY3VyYWN5IG9mIHRoZSBPUyB0aW1lcnMgKGllOgorICAgICAgICAgKiBpZiB0aGUgYWNjdXJhY3kgaXMgbG93ZXIsIGxvd2VyIHRoZSBmcmVxdWVuY3kgdG8gc3BlbmQgbW9yZSB0aW1lCisgICAgICAgICAqIGluIHRoZSBpbm5lciBsb29wIHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kpLgorICAgICAgICAgKi8KKyAgICAgICAgdDAubG93ID0gdDEubG93OworICAgICAgICB0MC5oaWdoID0gdDEuaGlnaDsKKyAgICAgICAgd2hpbGUgKCh0MS5sb3cgLSB0MC5sb3cpIDwgbWF4Q291bnQpIHsKKyAgICAgICAgICAgIEdldENvdW50ZXIoJnQxKTsKKyAgICAgICAgICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmczEpOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGRpZmZlcmVuY2UgZHVyaW5nIHRoZSB0aW1pbmcgbG9vcCAqLworICAgICAgICBQTV9zZXQ2NChzdGFtcDAsczAuaGlnaCxzMC5sb3cpOworICAgICAgICBQTV9zZXQ2NChzdGFtcDEsczEuaGlnaCxzMS5sb3cpOworICAgICAgICBQTV9zZXQ2NCh0aWNrczAsdDAuaGlnaCx0MC5sb3cpOworICAgICAgICBQTV9zZXQ2NCh0aWNrczEsdDEuaGlnaCx0MS5sb3cpOworICAgICAgICBQTV9zdWI2NChjeWNsZXMsc3RhbXAxLHN0YW1wMCk7CisgICAgICAgIFBNX3N1YjY0KHRpY2tzLHRpY2tzMSx0aWNrczApOworCisgICAgICAgIC8qIFN1bSB1cCB0aGUgcmVzdWx0cyAqLworICAgICAgICBQTV9hZGQ2NCh0b3RhbF90aWNrcyx0b3RhbF90aWNrcyx0aWNrcyk7CisgICAgICAgIFBNX2FkZDY0KHRvdGFsX2N5Y2xlcyx0b3RhbF9jeWNsZXMsY3ljbGVzKTsKKyAgICAgICAgfQorICAgIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpUHJpb3JpdHkpOworCisgICAgLyogQ29tcHV0ZSBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBQTV9tdWw2NChoeix0b3RhbF9jeWNsZXMsZnJlcSk7CisgICAgUE1fZGl2NjQoaHosaHosdG90YWxfdGlja3MpOworICAgIHJldHVybiBQTV82NHRvMzIoaHopOworfQorCisjZW5kaWYgIC8qIF9fSU5URUxfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgcHJvY2Vzc29yIGluIE1Iei4KKworSEVBREVSOgorenRpbWVyLmgKKworUEFSQU1FVEVSUzoKK2FjY3VyYXRlICAgIC0gVHJ1ZSBvZiB0aGUgc3BlZWQgc2hvdWxkIGJlIG1lYXN1cmVkIGFjY3VyYXRlbHkKKworUkVUVVJOUzoKK1Byb2Nlc3NvciBzcGVlZCBpbiBNSHouCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNwZWVkIG9mIHRoZSBDUFUgaW4gTUh6LiBOb3RlIHRoYXQgaWYgdGhlIHNwZWVkCitjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgorCitJZiB0aGUgYWNjdXJhdGUgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3BlbmQgbG9uZ2VyCitwcm9maWxpbmcgdGhlIHNwZWVkIG9mIHRoZSBDUFUsIGFuZCB3aWxsIG5vdCByb3VuZCB0aGUgQ1BVIHNwZWVkIHRoYXQgaXMKK3JlcG9ydGVkLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyB1c2luZyB0aGUgUGVudGl1bQorUkRUU0MgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBkb2VzIHRha2UgYSBsb3QgbG9uZ2VyIGZvciB0aGUgcHJvZmlsaW5nIHRvCitwcm9kdWNlIGFjY3VyYXRlIHJlc3VsdHMuCisKK1NFRSBBTFNPOgorQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IeiwgQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9oYXZlTU1YLAorQ1BVX2dldFByb2Nlc3Nvck5hbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBaQVBJIENQVV9nZXRQcm9jZXNzb3JTcGVlZCgKKyAgICBpYm9vbCBhY2N1cmF0ZSkKK3sKKyNpZiBkZWZpbmVkKF9fSU5URUxfXykKKyAgICAvKiBOdW1iZXIgb2YgY3ljbGVzIG5lZWRlZCB0byBleGVjdXRlIGEgc2luZ2xlIEJTRiBpbnN0cnVjdGlvbiBvbiBpMzg2KworICAgICAqIHByb2Nlc3NvcnMuCisgICAgICovCisgICAgdWxvbmcgICBjcHVTcGVlZDsKKyAgICB1aW50ICAgIGk7CisgICAgc3RhdGljICB1bG9uZyBpbnRlbF9jeWNsZXNbXSA9IHsKKyAgICAgICAgMTE1LDQ3LDQzLAorICAgICAgICB9OworICAgIHN0YXRpYyAgdWxvbmcgY3lyaXhfY3ljbGVzW10gPSB7CisgICAgICAgIDM4LDM4LDUyLDUyLAorICAgICAgICB9OworICAgIHN0YXRpYyAgdWxvbmcgYW1kX2N5Y2xlc1tdID0geworICAgICAgICA0OSwKKyAgICAgICAgfTsKKyAgICBzdGF0aWMgIHVsb25nIGtub3duX3NwZWVkc1tdID0geworICAgICAgICAxMDAwLDk1MCw5MDAsODUwLDgwMCw3NTAsNzAwLDY1MCw2MDAsNTUwLDUwMCw0NTAsNDMzLDQwMCwzNTAsCisgICAgICAgIDMzMywzMDAsMjY2LDIzMywyMDAsMTY2LDE1MCwxMzMsMTIwLDEwMCw5MCw3NSw2Niw2MCw1MCwzMywyMCwwLAorICAgICAgICB9OworCisgICAgaWYgKENQVV9oYXZlUkRUU0MoKSkgeworICAgICAgICBjcHVTcGVlZCA9IChHZXRSRFRTQ0NwdVNwZWVkKGFjY3VyYXRlKSArIDUwMDAwMCkgLyAxMDAwMDAwOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCB0eXBlID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKKyAgICAgICAgaW50IHByb2Nlc3NvciA9IHR5cGUgJiBDUFVfbWFzazsKKyAgICAgICAgaW50IHZlbmRvciA9IHR5cGUgJiBDUFVfZmFtaWx5TWFzazsKKyAgICAgICAgaWYgKHZlbmRvciA9PSBDUFVfSW50ZWwpCisgICAgICAgICAgICBjcHVTcGVlZCA9IEdldEJTRkNwdVNwZWVkKElURVJBVElPTlMgKiBpbnRlbF9jeWNsZXNbcHJvY2Vzc29yIC0gQ1BVX2kzODZdKTsKKyAgICAgICAgZWxzZSBpZiAodmVuZG9yID09IENQVV9DeXJpeCkKKyAgICAgICAgICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGN5cml4X2N5Y2xlc1twcm9jZXNzb3IgLSBDUFVfQ3lyaXg2eDg2XSk7CisgICAgICAgIGVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQU1EKQorICAgICAgICAgICAgY3B1U3BlZWQgPSBHZXRCU0ZDcHVTcGVlZChJVEVSQVRJT05TICogYW1kX2N5Y2xlc1swXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAvKiBOb3cgbm9ybWFsaXNlIHRoZSByZXN1bHRzIGdpdmVuIGtub3duIHByb2Nlc3NvcnMgc3BlZWRzLCBpZiB0aGUKKyAgICAgKiBzcGVlZCB3ZSBtZWFzdXJlIGlzIHdpdGhpbiAyTUh6IG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMKKyAgICAgKi8KKyAgICBpZiAoIWFjY3VyYXRlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGtub3duX3NwZWVkc1tpXSAhPSAwOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjcHVTcGVlZCA+PSAoa25vd25fc3BlZWRzW2ldLTMpICYmIGNwdVNwZWVkIDw9IChrbm93bl9zcGVlZHNbaV0rMykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga25vd25fc3BlZWRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiBjcHVTcGVlZDsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgc3BlZWQgb2YgdGhlIHByb2Nlc3NvciBpbiBIei4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVUVVJOUzoKK0FjY3VyYXRlIHByb2Nlc3NvciBzcGVlZCBpbiBIei4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWNjdXJhdGUgc3BlZWQgb2YgdGhlIENQVSBpbiBIei4gTm90ZSB0aGF0IGlmIHRoZQorc3BlZWQgY2Fubm90IGJlIGRldGVybWluZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KKworVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQgZnVuY3Rpb24sIGV4Y2VwdCB0aGF0CitpdCBhdHRlbXB0cyB0byBhY2N1cmF0ZWx5IG1lYXN1cmUgdGhlIENQVSBzcGVlZCBpbiBIei4gVGhpcyBpcyB1c2VkCitpbnRlcm5hbGx5IGluIHRoZSBaZW4gVGltZXIgbGlicmFyaWVzIHRvIHByb3ZpZGUgYWNjdXJhdGUgcmVhbCB3b3JsZCB0aW1pbmcKK2luZm9ybWF0aW9uLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyB1c2luZyB0aGUgUGVudGl1bQorUkRUU0MgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBkb2VzIHRha2UgYSBsb3QgbG9uZ2VyIGZvciB0aGUgcHJvZmlsaW5nIHRvCitwcm9kdWNlIGFjY3VyYXRlIHJlc3VsdHMuCisKK1NFRSBBTFNPOgorQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2hhdmVNTVgsCitDUFVfZ2V0UHJvY2Vzc29yTmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFpBUEkgQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IWigKKyAgICBpYm9vbCBhY2N1cmF0ZSkKK3sKKyNpZiBkZWZpbmVkKF9fSU5URUxfXykKKyAgICBpZiAoQ1BVX2hhdmVSRFRTQygpKSB7CisgICAgICAgIHJldHVybiBHZXRSRFRTQ0NwdVNwZWVkKGFjY3VyYXRlKTsKKyAgICAgICAgfQorICAgIHJldHVybiBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoZmFsc2UpICogMTAwMDAwMDsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyBhIHN0cmluZyBkZWZpbmluZyB0aGUgc3BlZWQgYW5kIG5hbWUgb2YgdGhlIHByb2Nlc3Nvci4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVUVVJOUzoKK1Byb2Nlc3NvciBuYW1lIHN0cmluZy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBFbmdsaXNoIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVlZCBhbmQgbmFtZSBvZiB0aGUKK0NQVS4KKworU0VFIEFMU086CitDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2hhdmVNTVgsIENQVV9nZXRQcm9jZXNzb3JOYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqIFpBUEkgQ1BVX2dldFByb2Nlc3Nvck5hbWUodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fSU5URUxfXykKKyAgICBzdGF0aWMgaW50ICBjcHUsc3BlZWQgPSAtMTsKKyAgICBzdGF0aWMgY2hhciBuYW1lWzgwXTsKKworICAgIGlmIChzcGVlZCA9PSAtMSkgeworICAgICAgICBjcHUgPSBDUFVfZ2V0UHJvY2Vzc29yVHlwZSgpOworICAgICAgICBzcGVlZCA9IENQVV9nZXRQcm9jZXNzb3JTcGVlZChmYWxzZSk7CisgICAgICAgIH0KKyAgICBzcHJpbnRmKG5hbWUsIiVkIE1IeiAiLCBzcGVlZCk7CisgICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgeworICAgICAgICBjYXNlIENQVV9pMzg2OgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkludGVsIGkzODYgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfaTQ4NjoKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJJbnRlbCBpNDg2IHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX1BlbnRpdW06CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiSW50ZWwgUGVudGl1bSBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9QZW50aXVtUHJvOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkludGVsIFBlbnRpdW0gUHJvIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX1BlbnRpdW1JSToKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIElJIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0NlbGVyb246CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiSW50ZWwgQ2VsZXJvbiBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9QZW50aXVtSUlJOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkludGVsIFBlbnRpdW0gSUlJIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX1Vua0ludGVsOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIlVua25vd24gSW50ZWwgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfQ3lyaXg2eDg2OgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkN5cml4IDZ4ODYgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfQ3lyaXg2eDg2TVg6CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiQ3lyaXggNng4Nk1YIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0N5cml4TWVkaWFHWDoKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJDeXJpeCBNZWRpYUdYIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0N5cml4TWVkaWFHWG06CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiQ3lyaXggTWVkaWFHWG0gcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfVW5rQ3lyaXg6CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiVW5rbm93biBDeXJpeCBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9BTURBbTQ4NjoKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJBTUQgQW00ODYgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfQU1EQW01eDg2OgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkFNRCBBbTV4ODYgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfQU1ESzU6CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiQU1EIEs1IHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0FNREs2OgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkFNRCBLNiBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9BTURLNl8yOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkFNRCBLNi0yIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0FNREs2X0lJSToKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtSUlJIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX0FNREs2XzJwbHVzOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkFNRCBLNi0yKyBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9BTURLNl9JSUlwbHVzOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIkFNRCBLNi1JSUkrIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX1Vua0FNRDoKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJVbmtub3duIEFNRCBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9BTURBdGhsb246CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiQU1EIEF0aGxvbiBwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQVV9BTUREdXJvbjoKKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCJBTUQgRHVyb24gcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfV2luQ2hpcEM2OgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIklEVCBXaW5DaGlwIEM2IHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BVX1dpbkNoaXAyOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIklEVCBXaW5DaGlwIDIgcHJvY2Vzc29yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFVfVW5rSURUOgorICAgICAgICAgICAgc3RyY2F0KG5hbWUsIlVua25vd24gSURUIHByb2Nlc3NvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdHJjYXQobmFtZSwiVW5rbm93biBwcm9jZXNzb3IiKTsKKyAgICAgICAgfQorICAgIGlmIChDUFVfaGF2ZU1NWCgpKQorICAgICAgICBzdHJjYXQobmFtZSwiIHdpdGggTU1YKFIpIik7CisgICAgaWYgKENQVV9oYXZlM0ROb3coKSkKKyAgICAgICAgc3RyY2F0KG5hbWUsIiwgM0ROb3chKFIpIik7CisgICAgaWYgKENQVV9oYXZlU1NFKCkpCisgICAgICAgIHN0cmNhdChuYW1lLCIsIFNTRShSKSIpOworICAgIHJldHVybiBuYW1lOworI2Vsc2UKKyAgICByZXR1cm4gIlVua25vd24iOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kZWJ1Zy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZlM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgTWFpbiBtb2R1bGUgY29udGFpbmluZyBkZWJ1ZyBjaGVja2luZyBmZWF0dXJlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2lmZGVmICBfX1dJTjMyX1ZYRF9fCisjaW5jbHVkZSAidnhkZmlsZS5oIgorI2VsaWYgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorI2luY2x1ZGUgIm50ZHJpdmVyLmgiCisjZWxpZiBkZWZpbmVkKF9fT1MyX1ZERF9fKQorI2luY2x1ZGUgInZkZGZpbGUuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB7c2VjcmV0fSAqLwordm9pZCAoKl9DSEtfZmFpbCkoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpID0gX0NIS19kZWZhdWx0RmFpbDsKK3N0YXRpYyBjaGFyIGxvZ0ZpbGVbMjU2XSA9ICIiOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIENIRUNLRUQKK3ZvaWQgX0NIS19kZWZhdWx0RmFpbCgKKyAgICBpbnQgZmF0YWwsCisgICAgY29uc3QgY2hhciAqbXNnLAorICAgIGNvbnN0IGNoYXIgKmNvbmQsCisgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICBpbnQgbGluZSkKK3sKKyAgICBGSUxFICAgICpmOworICAgIGNoYXIgICAgYnVmWzI1Nl07CisKKyAgICBpZiAobG9nRmlsZVswXSA9PSAwKSB7CisgICAgICAgIHN0cmNweShsb2dGaWxlLFBNX2dldE51Y2xldXNQYXRoKCkpOworICAgICAgICBQTV9iYWNrc2xhc2gobG9nRmlsZSk7CisgICAgICAgIHN0cmNhdChsb2dGaWxlLCJzY2l0ZWNoLmxvZyIpOworICAgICAgICB9CisgICAgaWYgKChmID0gZm9wZW4obG9nRmlsZSwiYSsiKSkgIT0gTlVMTCkgeworI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX09TMl9WRERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQorICAgICAgICBzcHJpbnRmKGJ1Zixtc2csY29uZCxmaWxlLGxpbmUpOworICAgICAgICBmd3JpdGUoYnVmLDEsc3RybGVuKGJ1ZiksZik7CisjZWxzZQorICAgICAgICBmcHJpbnRmKGYsbXNnLGNvbmQsZmlsZSxsaW5lKTsKKyNlbmRpZgorICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KKyAgICBpZiAoZmF0YWwpIHsKKyAgICAgICAgc3ByaW50ZihidWYsIkNoZWNrIGZhaWxlZDogY2hlY2sgJyVzJyBmb3IgZGV0YWlscyIsIGxvZ0ZpbGUpOworICAgICAgICBQTV9mYXRhbEVycm9yKGJ1Zik7CisgICAgICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUuCisKK0hFQURFUjoKK3BtYXBpLmgKKworUEFSQU1FVEVSUzoKK2xvZ0ZpbGVQYXRoIC0gRnVsbCBmaWxlIGFuZCBwYXRoIG5hbWUgdG8gZGVidWcgbG9nIGZpbGUuCisKK1JFTUFSS1M6CitTZXRzIHRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUuIFRoZSBkZWJ1ZyBsb2cgZmlsZSBpcworY3JlYXRlZCBhbmQgd3JpdHRlbiB0byB3aGVuIHJ1bnRpbWUgY2hlY2tzLCB3YXJuaW5ncyBhbmQgZmFpbHVyZSBjb25kaXRpb25zCithcmUgbG9nZ2VkIHRvIGRpc2sgd2hlbiBjb2RlIGlzIGNvbXBpbGVkIGluIENIRUNLRUQgbW9kZS4gQnkgZGVmYXVsdCB0aGUKK2xvZyBmaWxlIGlzIGNhbGxlZCAnc2NpdGVjaC5sb2cnIGFuZCBnb2VzIGludG8gdGhlIGN1cnJlbnQgU2NpVGVjaCBOdWNsZXVzCitwYXRoIGZvciB0aGUgYXBwbGljYXRpb24uIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlbmFtZQorYW5kIGxvY2F0aW9uIG9mIHRoZSBkZWJ1ZyBsb2cgZmlsZSB0byB5b3VyIG93biBhcHBsaWNhdGlvbiBzcGVjaWZpYworZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RGVidWdMb2coCisgICAgY29uc3QgY2hhciAqbG9nRmlsZVBhdGgpCit7CisgICAgc3RyY3B5KGxvZ0ZpbGUsbG9nRmlsZVBhdGgpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2V2ZW50LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRjYWFiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20KQEAgLTAsMCArMSwxOTQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIKKzsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKKzsqCis7KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGV2ZW50IG1vZHVsZS4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIGlkZWFsCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCisKK2lmZGVmIGZsYXRtb2RlbAorCitoZWFkZXIgIF9ldmVudCAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitiZWdkYXRhc2VnICBfZXZlbnQKKworICAgIGNleHRlcm4gIF9FVlRfYmlvc1B0cixEUFRSCisKK2lmZGVmICAgVVNFX05BU00KKyVkZWZpbmUgS0JfSEVBRCAgICAgV09SRCBlc2krMDFBaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKKyVkZWZpbmUgS0JfVEFJTCAgICAgV09SRCBlc2krMDFDaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKKyVkZWZpbmUgS0JfU1RBUlQgICAgV09SRCBlc2krMDgwaCAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCislZGVmaW5lIEtCX0VORCAgICAgIFdPUkQgZXNpKzA4MmggICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKK2Vsc2UKK0tCX0hFQUQgICAgIEVRVSBXT1JEIGVzaSswMUFoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKK0tCX1RBSUwgICAgIEVRVSBXT1JEIGVzaSswMUNoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKK0tCX1NUQVJUICAgIEVRVSBXT1JEIGVzaSswODBoICAgICAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCitLQl9FTkQgICAgICBFUVUgV09SRCBlc2krMDgyaCAgICAgICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKK2VuZGlmCisKK2VuZGRhdGFzZWcgIF9ldmVudAorCitiZWdjb2Rlc2VnICBfZXZlbnQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKyAgICBjcHVibGljIF9FVlRfY29kZVN0YXJ0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBfRVZUX2dldEtleUNvZGUodm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJldHVybnMgdGhlIGtleSBjb2RlIGZvciB0aGUgbmV4dCBhdmFpbGFibGUga2V5IGJ5IGV4dHJhY3RpbmcgaXQgZnJvbQorOyB0aGUgQklPUyBrZXlib2FyZCBidWZmZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0VWVF9nZXRLZXlDb2RlCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgZXNpLFtfRVZUX2Jpb3NQdHJdCisgICAgICAgIHhvciAgICAgZWJ4LGVieAorICAgICAgICB4b3IgICAgIGVheCxlYXgKKyAgICAgICAgbW92ICAgICBieCxbS0JfSEVBRF0KKyAgICAgICAgY21wICAgICBieCxbS0JfVEFJTF0KKyAgICAgICAganogICAgICBAQERvbmUKKyAgICAgICAgeG9yICAgICBlYXgsZWF4CisgICAgICAgIG1vdiAgICAgYXgsW2VzaStlYnhdICAgIDsgRUFYIDo9IGNoYXJhY3RlciBmcm9tIGtleWJvYXJkIGJ1ZmZlcgorICAgICAgICBpbmMgICAgIF9ieAorICAgICAgICBpbmMgICAgIF9ieAorICAgICAgICBjbXAgICAgIGJ4LFtLQl9FTkRdICAgICA7IEhpdCB0aGUgZW5kIG9mIHRoZSBrZXlib2FyZCBidWZmZXI/CisgICAgICAgIGpsICAgICAgQEAxCisgICAgICAgIG1vdiAgICAgYngsW0tCX1NUQVJUXQorQEAxOiAgICBtb3YgICAgIFtLQl9IRUFEXSxieCAgICA7IFVwZGF0ZSBrZXlib2FyZCBidWZmZXIgaGVhZCBwb2ludGVyCisKK0BARG9uZTogbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgVGhpcyBmdW5jdGlvbiB3b3VsZCBub3JtYWxseSBkbyBub3RoaW5nLCBob3dldmVyIGR1ZSB0byBzdHJhbmdlIGJ1Z3MKKzsgaW4gdGhlIFdpbmRvd3MgMy4xIGFuZCBPUy8yIERPUyBib3hlcywgd2UgZG9uJ3QgZ2V0IGFueSBoYXJkd2FyZSBrZXlib2FyZAorOyBpbnRlcnJ1cHRzIHVubGVzcyB3ZSBwZXJpb2RpY2FsbHkgY2FsbCB0aGUgQklPUyBrZXlib2FyZCBmdW5jdGlvbnMuIEhlbmNlCis7IHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB0aGF0IHdlIGNoZWNrIGZvciBldmVudHMsIGFuZCB3b3JrcworOyBhcm91bmQgdGhpcyBwcm9ibGVtIChpbiBlc3NlbmNlIGl0IHRlbGxzIHRoZSBET1MgVkRNIHRvIHB1bXAgdGhlCis7IGtleWJvYXJkIGV2ZW50cyB0byBvdXIgcHJvZ3JhbSA7LSkuCis7Cis7IE5vdGUgdGhhdCB0aGlzIGJ1ZyBpcyBub3QgcHJlc2VudCB1bmRlciBXaW4gOXggRE9TIGJveGVzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9FVlRfcHVtcE1lc3NhZ2VzCisKKyAgICAgICAgbW92ICAgICBhaCwxMWggICAgICAgICAgOyBGdW5jdGlvbiAtIENoZWNrIGtleWJvYXJkIHN0YXR1cworICAgICAgICBpbnQgICAgIDE2aCAgICAgICAgICAgICA7IENhbGwgQklPUworICAgICAgICAKKyAgICAgICAgbW92ICAgICBheCwgMEJoICAgICAgICAgOyBSZXNldCBNb3ZlIE1vdXNlCisgICAgICAgIGludCAgICAgMzNoCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgX0VWVF9kaXNhYmxlSW50KHZvaWQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0VWVF9kaXNhYmxlSW50CisKKyAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCisgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfRVZUX3Jlc3RvcmVJbnQoaW50IHBzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0VWVF9yZXN0b3JlSW50CisKKyAgICAgICAgQVJHICAgICBwczpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKKyAgICAgICAgcHVzaCAgICBbRFdPUkQgcHNdCisgICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBwcm9jZXNzb3Igc3RhdHVzIChhbmQgaW50ZXJydXB0cykKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmVhZHMgYW4gaW5kZXhlZCByZWdpc3RlciB2YWx1ZSBmcm9tIGFuIEkvTyBwb3J0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEVWVF9yZGlueAorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBvdXQgICAgIGR4LGFsCisgICAgICAgIGluYyAgICAgZHgKKyAgICAgICAgaW4gICAgICBhbCxkeAorICAgICAgICBtb3Z6eCAgIGVheCxhbAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBFVlRfd3JpbngoaW50IHBvcnQsaW50IGluZGV4LGludCB2YWx1ZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFdyaXRlcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIHRvIGFuIEkvTyBwb3J0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEVWVF93cmlueAorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5ULCB2YWx1ZTpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBtb3YgICAgIGFoLFtCWVRFIHZhbHVlXQorICAgICAgICBvdXQgICAgIGR4LGF4CisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCisgICAgY3B1YmxpYyBfRVZUX2NvZGVFbmQKKworZW5kY29kZXNlZyAgX2V2ZW50CisKK2VuZGlmCisKKyAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19senRpbWVyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fbHp0aW1lci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhOWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fbHp0aW1lci5hc20KQEAgLTAsMCArMSw0MzggQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKKzsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKKzsqCis7KiBEZXNjcmlwdGlvbjogVXNlcyB0aGUgODI1MyB0aW1lciBhbmQgdGhlIEJJT1MgdGltZS1vZi1kYXkgY291bnQgdG8gdGltZQorOyogICAgICAgICAgICAgIHRoZSBwZXJmb3JtYW5jZSBvZiBjb2RlIHRoYXQgdGFrZXMgbGVzcyB0aGFuIGFuIGhvdXIgdG8KKzsqICAgICAgICAgICAgICBleGVjdXRlLgorOyoKKzsqICAgICAgICAgICAgICBUaGUgcm91dGluZXMgaW4gdGhpcyBwYWNrYWdlIG9ubHkgd29ya3Mgd2l0aCBpbnRlcnJ1cHRzCis7KiAgICAgICAgICAgICAgZW5hYmxlZCwgYW5kIGluIGZhY3Qgd2lsbCBleHBsaWNpdGx5IHR1cm4gaW50ZXJydXB0cyBvbgorOyogICAgICAgICAgICAgIGluIG9yZGVyIHRvIGVuc3VyZSB3ZSBnZXQgYWNjdXJhdGUgcmVzdWx0cyBmcm9tIHRoZSB0aW1lci4KKzsqCis7KiAgRXh0ZXJuYWxseSAnQycgY2FsbGFibGUgcm91dGluZXM6Cis7KgorOyogIExaX3RpbWVyT246ICAgICBTYXZlcyB0aGUgQklPUyB0aW1lIG9mIGRheSBjb3VudCBhbmQgc3RhcnRzIHRoZQorOyogICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZCBaZW4gVGltZXIuCis7KgorOyogIExaX3RpbWVyTGFwOiAgICBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50LCBhbmQga2VlcHMgdGhlIHRpbWVyIHJ1bm5pbmcKKzsqCis7KiAgTFpfdGltZXJPZmY6ICAgIFN0b3BzIHRoZSBsb25nLXBlcmlvZCBaZW4gVGltZXIgYW5kIHNhdmVzIHRoZSB0aW1lcgorOyogICAgICAgICAgICAgICAgICBjb3VudCBhbmQgdGhlIEJJT1MgdGltZSBvZiBkYXkgY291bnQuCis7KgorOyogIExaX3RpbWVyQ291bnQ6ICBSZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lZCBjb3VudAorOyogICAgICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMuIElmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcKKzsqICAgICAgICAgICAgICAgICAgdGhlIHRpbWluZyBpbnRlcnZhbCwgTFpfdGltZXJDb3VudCB3aWxsIHJldHVybiB0aGUKKzsqICAgICAgICAgICAgICAgICAgdmFsdWUgMHhGRkZGRkZGRiAoYW4gaW52YWxpZCBjb3VudCkuCis7KgorOyogIE5vdGU6ICAgSWYgZWl0aGVyIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlcyBiZXR3ZWVuIGNhbGxzIHRvIExaX3RpbWVyT24KKzsqICAgICAgICAgIGFuZCBMWl90aW1lck9mZiwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuIEZvciB0aW1pbmcgY29kZSB0aGF0IHRha2VzCis7KiAgICAgICAgICBtb3JlIHRoYW4gYSBmZXcgbWludXRlcyB0byBleGVjdXRlLCB1c2UgdGhlIGxvdyByZXNvbHV0aW9uCis7KiAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY29kZSwgd2hpY2ggc2hvdWxkIGJlIGFjY3VyYXRlCis7KiAgICAgICAgICBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMuCis7KgorOyogIE5vdGU6ICAgRWFjaCBibG9jayBvZiBjb2RlIGJlaW5nIHRpbWVkIHNob3VsZCBpZGVhbGx5IGJlIHJ1biBzZXZlcmFsCis7KiAgICAgICAgICB0aW1lcywgd2l0aCBhdCBsZWFzdCB0d28gc2ltaWxhciByZWFkaW5ncyByZXF1aXJlZCB0bworOyogICAgICAgICAgZXN0YWJsaXNoIGEgdHJ1ZSBtZWFzdXJlbWVudCwgaW4gb3JkZXIgdG8gZWxpbWluYXRlIGFueQorOyogICAgICAgICAgdmFyaWFiaWxpdHkgY2F1c2VkIGJ5IGludGVycnVwdHMuCis7KgorOyogIE5vdGU6ICAgSW50ZXJydXB0cyBtdXN0IG5vdCBiZSBkaXNhYmxlZCBmb3IgbW9yZSB0aGFuIDU0IG1zIGF0IGEKKzsqICAgICAgICAgIHN0cmV0Y2ggZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuIEJlY2F1c2UgaW50ZXJydXB0cyBhcmUKKzsqICAgICAgICAgIGVuYWJsZWQsIGtleSwgbWljZSwgYW5kIG90aGVyIGRldmljZXMgdGhhdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzCis7KiAgICAgICAgICBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuCis7KgorOyogIE5vdGU6ICAgQW55IGV4dHJhIGNvZGUgcnVubmluZyBvZmYgdGhlIHRpbWVyIGludGVycnVwdCAoc3VjaCBhcworOyogICAgICAgICAgc29tZSBtZW1vcnkgcmVzaWRlbnQgdXRpbGl0aWVzKSB3aWxsIGluY3JlYXNlIHRoZSB0aW1lCis7KiAgICAgICAgICBtZWFzdXJlZCBieSB0aGUgWmVuIFRpbWVyLgorOyoKKzsqICBOb3RlOiAgIFRoZXNlIHJvdXRpbmVzIGNhbiBpbnRyb2R1Y2UgaW5hY2N1cmFjaWVzIG9mIHVwIHRvIGEgZmV3Cis7KiAgICAgICAgICB0ZW50aHMgb2YgYSBzZWNvbmQgaW50byB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGZvciBlYWNoCis7KiAgICAgICAgICBjb2RlIHNlY3Rpb24gYmVpbmcgdGltZWQuIENvbnNlcXVlbnRseSwgaXQncyBhIGdvb2QgaWRlYSB0bworOyogICAgICAgICAgcmVib290IGF0IHRoZSBjb25jbHVzaW9uIG9mIHRpbWluZyBzZXNzaW9ucy4gKFRoZQorOyogICAgICAgICAgYmF0dGVyeS1iYWNrZWQgY2xvY2ssIGlmIGFueSwgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBaZW4KKzsqICAgICAgICAgIHRpbWVyLikKKzsqCis7KiAgQWxsIHJlZ2lzdGVycyBhbmQgYWxsIGZsYWdzIGFyZSBwcmVzZXJ2ZWQgYnkgYWxsIHJvdXRpbmVzLCBleGNlcHQKKzsqICBpbnRlcnJ1cHRzIHdoaWNoIGFyZSBhbHdheXMgdHVybmVkIG9uCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIKKworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsKKzsgRXF1YXRlcyB1c2VkIGJ5IGxvbmcgcGVyaW9kIFplbiBUaW1lcgorOworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOyBCYXNlIGFkZHJlc3Mgb2YgODI1MyB0aW1lciBjaGlwCisKK0JBU0VfODI1MyAgICAgICBlcXUgICAgIDQwaAorCis7IFRoZSBhZGRyZXNzIG9mIHRoZSB0aW1lciAwIGNvdW50IHJlZ2lzdGVycyBpbiB0aGUgODI1MworCitUSU1FUl8wXzgyNTMgICAgZXF1ICAgICBCQVNFXzgyNTMgKyAwCisKKzsgVGhlIGFkZHJlc3Mgb2YgdGhlIG1vZGUgcmVnaXN0ZXIgaW4gdGhlIDgyNTMKKworTU9ERV84MjUzICAgICAgIGVxdSAgICAgQkFTRV84MjUzICsgMworCis7IFRoZSBhZGRyZXNzIG9mIHRoZSBCSU9TIHRpbWVyIGNvdW50IHZhcmlhYmxlIGluIHRoZSBCSU9TIGRhdGEgYXJlYS4KKworVElNRVJfQ09VTlQgICAgIGVxdSAgICAgNkNoCisKKzsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCis7IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAorOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCisKK2lmZGVmICAgVVNFX05BU00KKyVtYWNybyAgREVMQVkgMAorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorJWVuZG1hY3JvCitlbHNlCittYWNybyAgIERFTEFZCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCitlbmRtCitlbmRpZgorCitoZWFkZXIgICAgICBfbHp0aW1lcgorCitiZWdkYXRhc2VnICBfbHp0aW1lcgorCisgICAgICAgIGNleHRlcm4gIF9aVGltZXJCSU9TUHRyLERQVFIKKworU3RhcnRCSU9TQ291bnQgICAgICBkZCAgMCAgICAgICA7IFN0YXJ0aW5nIEJJT1MgY291bnQgZHdvcmQKK0VuZEJJT1NDb3VudCAgICAgICAgZGQgIDAgICAgICAgOyBFbmRpbmcgQklPUyBjb3VudCBkd29yZAorRW5kVGltZWRDb3VudCAgICAgICBkdyAgMCAgICAgICA7IFRpbWVyIDAgY291bnQgYXQgdGhlIGVuZCBvZiB0aW1pbmcgcGVyaW9kCisKK2VuZGRhdGFzZWcgIF9senRpbWVyCisKK2JlZ2NvZGVzZWcgIF9senRpbWVyICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgTFpfdGltZXJPbih2b2lkKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFN0YXJ0cyB0aGUgTG9uZyBwZXJpb2QgWmVuIHRpbWVyIGNvdW50aW5nLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIExaX3RpbWVyT24KKworOyBTZXQgdGhlIHRpbWVyIDAgb2YgdGhlIDgyNTMgdG8gbW9kZSAyIChkaXZpZGUtYnktTiksIHRvIGNhdXNlCis7IGxpbmVhciBjb3VudGluZyByYXRoZXIgdGhhbiBjb3VudC1ieS10d28gY291bnRpbmcuIEFsc28gc3RvcHMKKzsgdGltZXIgMCB1bnRpbCB0aGUgdGltZXIgY291bnQgaXMgbG9hZGVkLCBleGNlcHQgb24gUFMvMiBjb21wdXRlcnMuCisKKyAgICAgICAgbW92ICAgICBhbCwwMDExMDEwMGIgICAgICAgIDsgbW9kZSAyCisgICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCisKKzsgU2V0IHRoZSB0aW1lciBjb3VudCB0byAwLCBzbyB3ZSBrbm93IHdlIHdvbid0IGdldCBhbm90aGVyIHRpbWVyCis7IGludGVycnVwdCByaWdodCBhd2F5LiBOb3RlOiB0aGlzIGludHJvZHVjZXMgYW4gaW5hY2N1cmFjeSBvZiB1cCB0byA1NCBtcworOyBpbiB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGVhY2ggdGltZSBpdCBpcyBleGVjdXRlZC4KKworICAgICAgICBERUxBWQorICAgICAgICBzdWIgICAgIGFsLGFsCisgICAgICAgIG91dCAgICAgVElNRVJfMF84MjUzLGFsICAgICA7IGxzYgorICAgICAgICBERUxBWQorICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBtc2IKKworOyBTdG9yZSB0aGUgdGltaW5nIHN0YXJ0IEJJT1MgY291bnQKKworICAgICAgICB1c2VfZXMKK2lmZGVmICAgZmxhdG1vZGVsCisgICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KK2Vsc2UKKyAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCitlbmRpZgorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHdoaWxlIHdlIGdyYWIgdGhlIGNvdW50CisgICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQorICAgICAgICBzdGkKKyAgICAgICAgbW92ICAgICBbU3RhcnRCSU9TQ291bnRdLGVheAorICAgICAgICB1bnVzZV9lcworCis7IFNldCB0aGUgdGltZXIgY291bnQgdG8gMCBhZ2FpbiB0byBzdGFydCB0aGUgdGltaW5nIGludGVydmFsLgorCisgICAgICAgIG1vdiAgICAgYWwsMDAxMTAxMDBiICAgICAgICA7IHNldCB1cCB0byBsb2FkIGluaXRpYWwKKyAgICAgICAgb3V0ICAgICBNT0RFXzgyNTMsYWwgICAgICAgIDsgdGltZXIgY291bnQKKyAgICAgICAgREVMQVkKKyAgICAgICAgc3ViICAgICBhbCxhbAorICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IGxzYgorICAgICAgICBERUxBWQorICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IG1zYgorCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIExaX3RpbWVyT2ZmKHZvaWQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU3RvcHMgdGhlIGxvbmcgcGVyaW9kIFplbiB0aW1lciBhbmQgc2F2ZXMgY291bnQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgTFpfdGltZXJPZmYKKworOyBMYXRjaCB0aGUgdGltZXIgY291bnQuCisKKyAgICAgICAgbW92ICAgICBhbCwwMDAwMDAwMGIgICAgICAgIDsgbGF0Y2ggdGltZXIgMAorICAgICAgICBvdXQgICAgIE1PREVfODI1MyxhbAorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBTdG9wIHRoZSBCSU9TIGNvdW50CisKKzsgUmVhZCB0aGUgQklPUyBjb3VudC4gKFNpbmNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgQklPUworOyBjb3VudCB3b24ndCBjaGFuZ2UpLgorCisgICAgICAgIHVzZV9lcworaWZkZWYgICBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlYngsW19aVGltZXJCSU9TUHRyXQorZWxzZQorICAgICAgICBsZXMgICAgIGJ4LFtfWlRpbWVyQklPU1B0cl0KK2VuZGlmCisgICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQorICAgICAgICBtb3YgICAgIFtFbmRCSU9TQ291bnRdLGVheAorICAgICAgICB1bnVzZV9lcworCis7IFJlYWQgb3V0IHRoZSBjb3VudCB3ZSBsYXRjaGVkIGVhcmxpZXIuCisKKyAgICAgICAgaW4gICAgICBhbCxUSU1FUl8wXzgyNTMgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQorICAgICAgICBERUxBWQorICAgICAgICBtb3YgICAgIGFoLGFsCisgICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQorICAgICAgICB4Y2hnICAgIGFoLGFsCisgICAgICAgIG5lZyAgICAgYXggICAgICAgICAgICAgICAgICA7IENvbnZlcnQgZnJvbSBjb3VudGRvd24gcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICB0byBlbGFwc2VkIGNvdW50CisgICAgICAgIG1vdiAgICAgW0VuZFRpbWVkQ291bnRdLGF4CisgICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IExldCB0aGUgQklPUyBjb3VudCBjb250aW51ZQorCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1bnNpZ25lZCBsb25nIExaX3RpbWVyTGFwKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50IGFuZCBjb252ZXJ0cyBpdCB0byBhIG1pY3Jvc2Vjb25kIHRpbWluZyB2YWx1ZSwKKzsgYnV0IGxlYXZlcyB0aGUgdGltZXIgc3RpbGwgcnVubmluZy4gV2UgZG9udCBjaGVjayBmb3IgYW5kIG92ZXJmbG93LAorOyB3aGVyZSB0aGUgdGltZSBoYXMgZ29uZSBvdmVyIGFuIGhvdXIgaW4gdGhpcyByb3V0aW5lLCBzaW5jZSB3ZSB3YW50IGl0Cis7IHRvIGV4ZWN1dGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBMWl90aW1lckxhcAorCisgICAgICAgIHB1c2ggICAgZWJ4ICAgICAgICAgICAgICAgICA7IFNhdmUgRUJYIGZvciAzMiBiaXQgY29kZQorCis7IExhdGNoIHRoZSB0aW1lciBjb3VudC4KKworICAgICAgICBtb3YgICAgIGFsLDAwMDAwMDAwYiAgICAgICAgOyBsYXRjaCB0aW1lciAwCisgICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCisgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IFN0b3AgdGhlIEJJT1MgY291bnQKKworOyBSZWFkIHRoZSBCSU9TIGNvdW50LiAoU2luY2UgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZSBCSU9TCis7IGNvdW50IHdvbnQgY2hhbmdlKS4KKworICAgICAgICB1c2VfZXMKK2lmZGVmICAgZmxhdG1vZGVsCisgICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KK2Vsc2UKKyAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCitlbmRpZgorICAgICAgICBtb3YgICAgIGVheCxbX0VTIF9ieCtUSU1FUl9DT1VOVF0KKyAgICAgICAgbW92ICAgICBbRW5kQklPU0NvdW50XSxlYXgKKyAgICAgICAgdW51c2VfZXMKKworOyBSZWFkIG91dCB0aGUgY291bnQgd2UgbGF0Y2hlZCBlYXJsaWVyLgorCisgICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKKyAgICAgICAgREVMQVkKKyAgICAgICAgbW92ICAgICBhaCxhbAorICAgICAgICBpbiAgICAgIGFsLFRJTUVSXzBfODI1MyAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKKyAgICAgICAgeGNoZyAgICBhaCxhbAorICAgICAgICBuZWcgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBDb252ZXJ0IGZyb20gY291bnRkb3duIHJlbWFpbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgdG8gZWxhcHNlZCBjb3VudAorICAgICAgICBtb3YgICAgIFtFbmRUaW1lZENvdW50XSxheAorICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBMZXQgdGhlIEJJT1MgY291bnQgY29udGludWUKKworOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCis7IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKKzsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKKzsgYm91bmRhcnkKKworICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/CisgICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KKyAgICAgICAgamFlICAgICBAQENhbGNCSU9TVGltZSAgICAgICAgICA7IE5vLCBjYWxjdWxhdGUgdGhlIHRpbWUgdGFrZW4KKworOyBBZGp1c3QgdGhlIGZpbmlzaGluZyB0aW1lIGJ5IGFkZGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzCis7ICgxNTczMDQwKS4KKworICAgICAgICBhZGQgICAgIFtEV09SRCBFbmRCSU9TQ291bnRdLDE4MDBCMGgKKworOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCisKK0BAQ2FsY0JJT1NUaW1lOgorICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KKyAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KKyAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCisgICAgICAgIG11bCAgICAgZHgKKyAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KKyAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcworCis7IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCisKKyAgICAgICAgcHVzaCAgICBfc2kKKyAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KKyAgICAgICAgbW92ICAgICBzaSw4MzgxCisgICAgICAgIG11bCAgICAgc2kKKyAgICAgICAgbW92ICAgICBzaSwxMDAwMAorICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCisgICAgICAgIHBvcCAgICAgX3NpCisKKzsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgorOyBtaWNyb3NlY29uZHMuCisKKyAgICAgICAgYWRkICAgICBheCxieAorICAgICAgICBhZGMgICAgIGN4LDAKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBzaGwgICAgIGVjeCwxNgorICAgICAgICBtb3YgICAgIGN4LGF4CisgICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAorZWxzZQorICAgICAgICBtb3YgICAgIGR4LGN4CitlbmRpZgorICAgICAgICBwb3AgICAgIGVieCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIEVCWCBmb3IgMzIgYml0IGNvZGUKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVuc2lnbmVkIGxvbmcgTFpfdGltZXJDb3VudCh2b2lkKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJldHVybnMgYW4gdW5zaWduZWQgbG9uZyByZXByZXNlbnRpbmcgdGhlIG5ldCB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKzsKKzsgSWYgYW4gaG91ciBoYXMgcGFzc2VkIHdoaWxlIHRpbWluZywgd2UgcmV0dXJuIDB4RkZGRkZGRkYgYXMgdGhlIGNvdW50Cis7ICh3aGljaCBpcyBub3QgYSBwb3NzaWJsZSBjb3VudCBpbiBpdHNlbGYpLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIExaX3RpbWVyQ291bnQKKworICAgICAgICBwdXNoICAgIGVieCAgICAgICAgICAgICAgICAgOyBTYXZlIEVCWCBmb3IgMzIgYml0IGNvZGUKKworOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCis7IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKKzsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKKzsgYm91bmRhcnkKKworICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/CisgICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KKyAgICAgICAgamFlICAgICBAQENoZWNrRm9ySG91ciAgICAgICAgICA7IE5vLCBjaGVjayBmb3IgaG91ciBwYXNzaW5nCisKKzsgQWRqdXN0IHRoZSBmaW5pc2hpbmcgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycworOyAoMTU3MzA0MCkuCisKKyAgICAgICAgYWRkICAgICBbRFdPUkQgRW5kQklPU0NvdW50XSwxODAwQjBoCisKKzsgU2VlIGlmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcgdGltaW5nLiBJZiBzbywgbm90aWZ5IHRoZSB1c2VyLgorCitAQENoZWNrRm9ySG91cjoKKyAgICAgICAgbW92ICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudCsyXQorICAgICAgICBjbXAgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudCsyXQorICAgICAgICBqeiAgICAgIEBAQ2FsY0JJT1NUaW1lICAgICAgOyBIb3VyIGNvdW50IGRpZG4ndCBjaGFuZ2UsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBldmVyeXRoaW5nIGlzIGZpbmUKKworICAgICAgICBpbmMgICAgIGF4CisgICAgICAgIGNtcCAgICAgYXgsW1dPUkQgRW5kQklPU0NvdW50KzJdCisgICAgICAgIGpueiAgICAgQEBUZXN0VG9vTG9uZyAgICAgICA7IFR3byBob3VyIGJvdW5kYXJpZXMgcGFzc2VkLCBzbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIHJlc3VsdHMgYXJlIG5vIGdvb2QKKyAgICAgICAgbW92ICAgICBheCxbV09SRCBFbmRCSU9TQ291bnRdCisgICAgICAgIGNtcCAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnRdCisgICAgICAgIGpiICAgICAgQEBDYWxjQklPU1RpbWUgICAgICA7IGEgc2luZ2xlIGhvdXIgYm91bmRhcnkgcGFzc2VkLiBUaGF0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgT0ssIHNvIGxvbmcgYXMgdGhlIHRvdGFsIHRpbWUgd2Fzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG1vcmUgdGhhbiBhbiBob3VyLgorCis7IE92ZXIgYW4gaG91ciBlbGFwc2VkIHBhc3NlZCBkdXJpbmcgdGltaW5nLCB3aGljaCByZW5kZXJzCis7IHRoZSByZXN1bHRzIGludmFsaWQuIE5vdGlmeSB0aGUgdXNlci4gVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgYQorOyBtdWx0aXBsZSBvZiAyNCBob3VycyBoYXMgcGFzc2VkLCBidXQgd2UnbGwgcmVseSBvbiB0aGUgcGVyc3BpY2FjaXR5IG9mCis7IHRoZSB1c2VyIHRvIGRldGVjdCB0aGF0IGNhc2UgOi0pLgorCitAQFRlc3RUb29Mb25nOgoraWZkZWYgICBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlYXgsMEZGRkZGRkZGaAorZWxzZQorICAgICAgICBtb3YgICAgIGF4LDBGRkZGaAorICAgICAgICBtb3YgICAgIGR4LDBGRkZGaAorZW5kaWYKKyAgICAgICAgam1wICAgICBzaG9ydCBAQERvbmUKKworOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCisKK0BAQ2FsY0JJT1NUaW1lOgorICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KKyAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KKyAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCisgICAgICAgIG11bCAgICAgZHgKKyAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KKyAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcworCis7IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCisKKyAgICAgICAgcHVzaCAgICBfc2kKKyAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KKyAgICAgICAgbW92ICAgICBzaSw4MzgxCisgICAgICAgIG11bCAgICAgc2kKKyAgICAgICAgbW92ICAgICBzaSwxMDAwMAorICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCisgICAgICAgIHBvcCAgICAgX3NpCisKKzsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgorOyBtaWNyb3NlY29uZHMuCisKKyAgICAgICAgYWRkICAgICBheCxieAorICAgICAgICBhZGMgICAgIGN4LDAKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBzaGwgICAgIGVjeCwxNgorICAgICAgICBtb3YgICAgIGN4LGF4CisgICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAorZWxzZQorICAgICAgICBtb3YgICAgIGR4LGN4CitlbmRpZgorCitAQERvbmU6IHBvcCAgICAgZWJ4ICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgRUJYIGZvciAzMiBiaXQgY29kZQorICAgICAgICByZXQKKworY3Byb2NlbmQKKworY3Byb2NzdGFydCAgIExaX2Rpc2FibGUKKyAgICAgICAgY2xpCisgICAgICAgIHJldAorY3Byb2NlbmQKKworY3Byb2NzdGFydCAgIExaX2VuYWJsZQorICAgICAgICBzdGkKKyAgICAgICAgcmV0CitjcHJvY2VuZAorCitlbmRjb2Rlc2VnICBfbHp0aW1lcgorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmI1Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20KQEAgLTAsMCArMSw2NTYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQorOyogRW52aXJvbm1lbnQ6IElCTSBQQyBSZWFsIG1vZGUgYW5kIDE2LzMyIGJpdCBwcm90ZWN0ZWQgbW9kZQorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KKzsqICAgICAgICAgICAgICBNU0RPUy4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG1kb3MgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX3BtZG9zCisKK2lmbmRlZiAgZmxhdG1vZGVsCisKK3N0cnVjICAgcm1yZWdzX3MKK2F4ICAgICAgICAgIGR3ICA/CitheF9oaWdoICAgICBkdyAgPworYnggICAgICAgICAgZHcgID8KK2J4X2hpZ2ggICAgIGR3ICA/CitjeCAgICAgICAgICBkdyAgPworY3hfaGlnaCAgICAgZHcgID8KK2R4ICAgICAgICAgIGR3ICA/CitkeF9oaWdoICAgICBkdyAgPworc2kgICAgICAgICAgZHcgID8KK3NpX2hpZ2ggICAgIGR3ICA/CitkaSAgICAgICAgICBkdyAgPworZGlfaGlnaCAgICAgZHcgID8KK2NmbGFnICAgICAgIGR3ICA/CitjZmxhZ19oaWdoICBkdyAgPworZW5kcyAgICBybXJlZ3NfcworUk1SRUdTICA9IChybXJlZ3NfcyBQVFIgZXM6YngpCisKK3N0cnVjICAgcm1zcmVnc19zCitlcyAgICAgIGR3ICA/CitjcyAgICAgIGR3ICA/CitzcyAgICAgIGR3ICA/CitkcyAgICAgIGR3ICA/CitlbmRzICAgIHJtc3JlZ3NfcworUk1TUkVHUyA9IChybXNyZWdzX3MgUFRSIGVzOmJ4KQorCitlbmRpZiAgIDsgIWZsYXRtb2RlbAorCitpZmRlZiBmbGF0bW9kZWwKKyAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorICAgIGNleHRlcm4gX1BNX1ZYRF9vZmYsVUlOVAorICAgIGNleHRlcm4gX1BNX1ZYRF9zZWwsVUlOVAoraWZkZWYgICBET1M0R1cKKyAgICBjZXh0ZXJuIF9QTV9oYXZlQ2F1c2VXYXksVUlOVAorZW5kaWYKK2VuZGlmCitpbnRlbF9pZCAgICAgICAgZGIgICJHZW51aW5lSW50ZWwiICA7IEludGVsIHZlbmRvciBJRAorCitQTUhFTFBfR0VUUERCICAgICAgIEVRVSAwMDI2aAorUE1IRUxQX0ZMVVNIVExCICAgICBFUVUgMDAyN2gKKworZW5kZGF0YXNlZyAgX3BtZG9zCisKK1A1ODYKKworYmVnY29kZXNlZyAgX3BtZG9zICAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKKworaWZuZGVmICBmbGF0bW9kZWwKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9jYWxsUmVhbE1vZGUodW5zaWduZWQgcyx1bnNpZ25lZCBvLCBSTVJFR1MgKnJlZ3MsCis7ICAgUk1TUkVHUyAqc3JlZ3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDYWxscyBhIHJlYWwgbW9kZSBwcm9jZWR1cmUsIGxvYWRpbmcgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyB2YWx1ZXMKKzsgZnJvbSB0aGUgcGFzc2VkIGluIHN0cnVjdHVyZXMuIE9ubHkgdGhlIERTIGFuZCBFUyByZWdpc3RlciBhcmUgbG9hZGVkCis7IGZyb20gdGhlIFNSRUdTIHN0cnVjdHVyZS4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9jYWxsUmVhbE1vZGUKKworICAgICAgICBBUkcgICAgIHM6V09SRCwgbzpXT1JELCByZWdzOkRXT1JELCBzcmVnczpEV09SRAorCisgICAgICAgIExPQ0FMICAgYWRkcjpEV09SRCwgYnhWYWw6V09SRCwgZXNWYWw6V09SRCwgZmxhZ3M6V09SRCA9IExvY2FsU2l6ZQorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgcHVzaCAgICBkcworICAgICAgICBwdXNoICAgIGVzCisKKyAgICAgICAgbW92ICAgICBheCxbb10gICAgICAgICAgICAgIDsgQnVpbGQgdGhlIGFkZHJlc3MgdG8gY2FsbCBpbiAnYWRkcicKKyAgICAgICAgbW92ICAgICBbV09SRCBhZGRyXSxheAorICAgICAgICBtb3YgICAgIGF4LFtzXQorICAgICAgICBtb3YgICAgIFtXT1JEIGFkZHIrMl0sYXgKKworICAgICAgICBsZXMgICAgIGJ4LFtzcmVnc10KKyAgICAgICAgbW92ICAgICBheCxbUk1TUkVHUy5kc10KKyAgICAgICAgbW92ICAgICBkcyxheCAgICAgICAgICAgICAgIDsgRFMgOj0gcGFzc2VkIGluIHZhbHVlCisgICAgICAgIG1vdiAgICAgYXgsW1JNU1JFR1MuZXNdCisgICAgICAgIG1vdiAgICAgW2VzVmFsXSxheAorICAgICAgICBsZXMgICAgIGJ4LFtyZWdzXQorICAgICAgICBtb3YgICAgIGF4LFtSTVJFR1MuYnhdCisgICAgICAgIG1vdiAgICAgW2J4VmFsXSxheAorICAgICAgICBtb3YgICAgIGF4LFtSTVJFR1MuYXhdICAgICAgOyBBWCA6PSBwYXNzZWQgaW4gdmFsdWUKKyAgICAgICAgbW92ICAgICBjeCxbUk1SRUdTLmN4XSAgICAgIDsgQ1ggOj0gcGFzc2VkIGluIHZhbHVlCisgICAgICAgIG1vdiAgICAgZHgsW1JNUkVHUy5keF0gICAgICA7IERYIDo9IHBhc3NlZCBpbiB2YWx1ZQorICAgICAgICBtb3YgICAgIHNpLFtSTVJFR1Muc2ldICAgICAgOyBTSSA6PSBwYXNzZWQgaW4gdmFsdWUKKyAgICAgICAgbW92ICAgICBkaSxbUk1SRUdTLmRpXSAgICAgIDsgREkgOj0gcGFzc2VkIGluIHZhbHVlCisgICAgICAgIHB1c2ggICAgYnAKKyAgICAgICAgcHVzaCAgICBbZXNWYWxdCisgICAgICAgIHBvcCAgICAgZXMgICAgICAgICAgICAgICAgICA7IEVTIDo9IHBhc3NlZCBpbiB2YWx1ZQorICAgICAgICBtb3YgICAgIGJ4LFtieFZhbF0gICAgICAgICAgOyBCWCA6PSBwYXNzZWQgaW4gdmFsdWUKKworICAgICAgICBjYWxsICAgIFthZGRyXSAgICAgICAgICAgICAgOyBDYWxsIHRoZSBzcGVjaWZpZWQgcm91dGluZQorCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgZmxhZ3MgZm9yIGxhdGVyCisgICAgICAgIHBvcCAgICAgW2ZsYWdzXQorCisgICAgICAgIHBvcCAgICAgYnAKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwb3AgICAgIFtlc1ZhbF0KKyAgICAgICAgcHVzaCAgICBieAorICAgICAgICBwb3AgICAgIFtieFZhbF0KKyAgICAgICAgbGVzICAgICBieCxbc3JlZ3NdCisgICAgICAgIHB1c2ggICAgZHMKKyAgICAgICAgcG9wICAgICBbUk1TUkVHUy5kc10gICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIFtlc1ZhbF0KKyAgICAgICAgcG9wICAgICBbUk1TUkVHUy5lc10gICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBFUworICAgICAgICBsZXMgICAgIGJ4LFtyZWdzXQorICAgICAgICBtb3YgICAgIFtSTVJFR1MuYXhdLGF4ICAgICAgOyBTYXZlIHZhbHVlIG9mIEFYCisgICAgICAgIG1vdiAgICAgW1JNUkVHUy5jeF0sY3ggICAgICA7IFNhdmUgdmFsdWUgb2YgQ1gKKyAgICAgICAgbW92ICAgICBbUk1SRUdTLmR4XSxkeCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEWAorICAgICAgICBtb3YgICAgIFtSTVJFR1Muc2ldLHNpICAgICAgOyBTYXZlIHZhbHVlIG9mIFNJCisgICAgICAgIG1vdiAgICAgW1JNUkVHUy5kaV0sZGkgICAgICA7IFNhdmUgdmFsdWUgb2YgREkKKyAgICAgICAgbW92ICAgICBheCxbZmxhZ3NdICAgICAgICAgIDsgUmV0dXJuIGZsYWdzCisgICAgICAgIGFuZCAgICAgYXgsMWggICAgICAgICAgICAgICA7IElzb2xhdGUgY2FycnkgZmxhZworICAgICAgICBtb3YgICAgIFtSTVJFR1MuY2ZsYWddLGF4ICAgOyBTYXZlIGNhcnJ5IGZsYWcgc3RhdHVzCisgICAgICAgIG1vdiAgICAgYXgsW2J4VmFsXQorICAgICAgICBtb3YgICAgIFtSTVJFR1MuYnhdLGF4ICAgICAgOyBTYXZlIHZhbHVlIG9mIEJYCisKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIHNlZ21lbnQgcmVnaXN0ZXJzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydGRsbDE2IFBNX3NlZ3JlYWQKKworICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBheCxlcworICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCisgICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4CisgICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcworICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCisgICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7IENyZWF0ZSBhIHRhYmxlIG9mIHRoZSAyNTYgZGlmZmVyZW50IGludGVycnVwdCBjYWxscyB0aGF0IHdlIGNhbiBqdW1wCis7IGludG8KKworaWZkZWYgICBVU0VfTkFTTQorCislYXNzaWduIGludG5vIDAKKworaW50VGFibGU6CislcmVwICAgIDI1NgorICAgICAgICBkYiAgICAgIDBDRGgKKyAgICAgICAgZGIgICAgICBpbnRubworJWFzc2lnbiBpbnRubyAgIGludG5vICsgMQorICAgICAgICByZXQKKyAgICAgICAgbm9wCislZW5kcmVwCisKK2Vsc2UKKworaW50bm8gPSAwCisKK2ludFRhYmxlOgorICAgICAgICBSRVBUICAgIDI1NgorICAgICAgICBkYiAgICAgIDBDRGgKKyAgICAgICAgZGIgICAgICBpbnRubworaW50bm8gPSBpbnRubyArIDEKKyAgICAgICAgcmV0CisgICAgICAgIG5vcAorICAgICAgICBFTkRNCisKK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IF9QTV9nZW5JbnQgICAgLSBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaW50ZXJydXB0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NuZWFyICAgX1BNX2dlbkludAorCisgICAgICAgIHB1c2ggICAgX2F4ICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9heAorICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYngKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgIGVieCxbVUlOVCBlc3ArMTJdICAgICAgIDsgRUJYIDo9IGludGVycnVwdCBudW1iZXIKK2Vsc2UKKyAgICAgICAgbW92ICAgICBieCxzcCAgICAgICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSBFU1AgaXMgemVyb2VkCisgICAgICAgIG1vdiAgICAgYngsW1VJTlQgc3M6YngrNl0gICAgICAgOyBCWCA6PSBpbnRlcnJ1cHQgbnVtYmVyCitlbmRpZgorICAgICAgICBtb3YgICAgIF9heCxvZmZzZXQgaW50VGFibGUgICAgIDsgUG9pbnQgdG8gaW50ZXJydXB0IGdlbmVyYXRpb24gdGFibGUKKyAgICAgICAgc2hsICAgICBfYngsMiAgICAgICAgICAgICAgICAgICA7IF9CWCA6PSBpbmRleCBpbnRvIHRhYmxlCisgICAgICAgIGFkZCAgICAgX2F4LF9ieCAgICAgICAgICAgICAgICAgOyBfQVggOj0gcG9pbnRlciB0byBpbnRlcnJ1cHQgY29kZQoraWZkZWYgZmxhdG1vZGVsCisgICAgICAgIHhjaGcgICAgZWF4LFtlc3ArNF0gICAgICAgICAgICAgOyBSZXN0b3JlIGVheCwgYW5kIHNldCBmb3IgaW50CitlbHNlCisgICAgICAgIG1vdiAgICAgYngsc3AKKyAgICAgICAgeGNoZyAgICBheCxbc3M6YngrMl0gICAgICAgICAgICA7IFJlc3RvcmUgYXgsIGFuZCBzZXQgZm9yIGludAorZW5kaWYKKyAgICAgICAgcG9wICAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgX2J4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KKzsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcworOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnRkbGwxNiBQTV9pbnQzODZ4CisKKyAgICAgICAgQVJHICAgICBpbnRubzpVSU5ULCBpbnB0cjpEUFRSLCBvdXRwdHI6RFBUUiwgc3JlZ3M6RFBUUgorCisgICAgICAgIExPQ0FMICAgZmxhZ3M6VUlOVCwgc3ZfZHM6VUlOVCwgc3ZfZXNpOlVMT05HID0gTG9jYWxTaXplCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBwdXNoICAgIGRzCisgICAgICAgIHB1c2ggICAgZXMgICAgICAgICAgICAgICAgICA7IFNhdmUgc2VnbWVudCByZWdpc3RlcnMKKyAgICAgICAgcHVzaCAgICBmcworICAgICAgICBwdXNoICAgIGdzCisKKyAgICAgICAgX2xkcyAgICBfc2ksW3NyZWdzXSAgICAgICAgIDsgRFM6X1NJIC0+IExvYWQgc2VnbWVudCByZWdpc3RlcnMKKyAgICAgICAgbW92ICAgICBlcyxbX3NpXQorICAgICAgICBtb3YgICAgIGJ4LFtfc2krNl0KKyAgICAgICAgbW92ICAgICBbc3ZfZHNdLF9ieCAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiB1c2VyIERTIG9uIHN0YWNrCisgICAgICAgIG1vdiAgICAgZnMsW19zaSs4XQorICAgICAgICBtb3YgICAgIGdzLFtfc2krMTBdCisKKyAgICAgICAgX2xkcyAgICBfc2ksW2lucHRyXSAgICAgICAgIDsgTG9hZCBDUFUgcmVnaXN0ZXJzCisgICAgICAgIG1vdiAgICAgZWF4LFtfc2ldCisgICAgICAgIG1vdiAgICAgZWJ4LFtfc2krNF0KKyAgICAgICAgbW92ICAgICBlY3gsW19zaSs4XQorICAgICAgICBtb3YgICAgIGVkeCxbX3NpKzEyXQorICAgICAgICBtb3YgICAgIGVkaSxbX3NpKzIwXQorICAgICAgICBtb3YgICAgIGVzaSxbX3NpKzE2XQorCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBfYnAgICAgICAgICAgICAgICAgIDsgU29tZSBpbnRlcnJ1cHRzIHRyYXNoIHRoaXMhCisgICAgICAgIGNsYyAgICAgICAgICAgICAgICAgICAgICAgICA7IEdlbmVyYXRlIHRoZSBpbnRlcnJ1cHQKKyAgICAgICAgcHVzaCAgICBbVUlOVCBpbnRub10KKyAgICAgICAgbW92ICAgICBkcyxbV09SRCBzdl9kc10gICAgIDsgU2V0IHZhbHVlIG9mIHVzZXIncyBEUyBzZWxlY3RvcgorICAgICAgICBjYWxsICAgIF9QTV9nZW5JbnQKKyAgICAgICAgcG9wICAgICBfYnAgICAgICAgICAgICAgICAgIDsgUG9wIGludG5vIGZyb20gc3RhY2sgKGZsYWdzIHVuY2hhbmdlZCkKKyAgICAgICAgcG9wICAgICBfYnAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB2YWx1ZSBvZiBzdGFjayBmcmFtZSBwb2ludGVyCisgICAgICAgIHBvcCAgICAgZHMgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdmFsdWUgb2YgRFMKKworICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGZsYWdzIGZvciBsYXRlcgorICAgICAgICBwb3AgICAgIFtVSU5UIGZsYWdzXQorICAgICAgICBwdXNoICAgIGVzaSAgICAgICAgICAgICAgICAgOyBTYXZlIEVTSSBmb3IgbGF0ZXIKKyAgICAgICAgcG9wICAgICBbRFdPUkQgc3ZfZXNpXQorICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIERTIGZvciBsYXRlcgorICAgICAgICBwb3AgICAgIFtVSU5UIHN2X2RzXQorCisgICAgICAgIF9sZHMgICAgX3NpLFtvdXRwdHJdICAgICAgICA7IFNhdmUgQ1BVIHJlZ2lzdGVycworICAgICAgICBtb3YgICAgIFtfc2ldLGVheAorICAgICAgICBtb3YgICAgIFtfc2krNF0sZWJ4CisgICAgICAgIG1vdiAgICAgW19zaSs4XSxlY3gKKyAgICAgICAgbW92ICAgICBbX3NpKzEyXSxlZHgKKyAgICAgICAgcHVzaCAgICBbRFdPUkQgc3ZfZXNpXQorICAgICAgICBwb3AgICAgIFtEV09SRCBfc2krMTZdCisgICAgICAgIG1vdiAgICAgW19zaSsyMF0sZWRpCisKKyAgICAgICAgbW92ICAgICBfYngsW2ZsYWdzXSAgICAgICAgIDsgUmV0dXJuIGZsYWdzCisgICAgICAgIGFuZCAgICAgZWJ4LDFoICAgICAgICAgICAgICA7IElzb2xhdGUgY2FycnkgZmxhZworICAgICAgICBtb3YgICAgIFtfc2krMjRdLGVieCAgICAgICAgOyBTYXZlIGNhcnJ5IGZsYWcgc3RhdHVzCisKKyAgICAgICAgX2xkcyAgICBfc2ksW3NyZWdzXSAgICAgICAgIDsgU2F2ZSBzZWdtZW50IHJlZ2lzdGVycworICAgICAgICBtb3YgICAgIFtfc2ldLGVzCisgICAgICAgIG1vdiAgICAgX2J4LFtzdl9kc10KKyAgICAgICAgbW92ICAgICBbX3NpKzZdLGJ4ICAgICAgICAgIDsgR2V0IHJldHVybmVkIERTIGZyb20gc3RhY2sKKyAgICAgICAgbW92ICAgICBbX3NpKzhdLGZzCisgICAgICAgIG1vdiAgICAgW19zaSsxMF0sZ3MKKworICAgICAgICBwb3AgICAgIGdzICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHNlZ21lbnQgcmVnaXN0ZXJzCisgICAgICAgIHBvcCAgICAgZnMKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2lmbmRlZiBmbGF0bW9kZWwKK19QTV9zYXZlZERTICAgICBkdyAgX0RBVEEgICAgICAgICAgIDsgU2F2ZWQgdmFsdWUgb2YgRFMKK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2F2ZURTKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTYXZlIHRoZSB2YWx1ZSBvZiBEUyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY29kZSBzZWdtZW50LCBzbyB0aGF0IHdlIGNhbgorOyBxdWlja2x5IGxvYWQgdGhpcyB2YWx1ZSBhdCBhIGxhdGVyIGRhdGUgaW4gdGhlIFBNX2xvYWREUygpIHJvdXRpbmUgZnJvbQorOyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzIGV0Yy4gVGhlIG1ldGhvZCB0byBkbyB0aGlzIGlzIGRpZmZlcmVudAorOyBkZXBlbmRpbmcgb24gdGhlIERPUyBleHRlbmRlciBiZWluZyB1c2VkLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnRkbGwxNiBQTV9zYXZlRFMKKworaWZkZWYgZmxhdG1vZGVsCisgICAgICAgIG1vdiAgICAgW19QTV9zYXZlZERTXSxkcyAgICA7IFN0b3JlIGF3YXkgaW4gZGF0YSBzZWdtZW50CitlbmRpZgorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9sb2FkRFModm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJvdXRpbmUgdG8gbG9hZCB0aGUgRFMgcmVnaXN0ZXIgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQKKzsgRE9TIGV4dGVuZGVyLiBPbmx5IHRoZSBEUyByZWdpc3RlciBpcyBsb2FkZWQsIG5vdCB0aGUgRVMgcmVnaXN0ZXIsIHNvCis7IGlmIHlvdSB3aXNoIHRvIGNhbGwgQyBjb2RlLCB5b3Ugd2lsbCBuZWVkIHRvIGFsc28gbG9hZCB0aGUgRVMgcmVnaXN0ZXIKKzsgaW4gMzIgYml0IHByb3RlY3RlZCBtb2RlLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnRkbGwxNiBQTV9sb2FkRFMKKworICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10gOyBXZSBjYW4gYWNjZXNzIHRoZSBwcm9wZXIgRFMgdGhyb3VnaCBDUworICAgICAgICByZXQKKworY3Byb2NlbmQKKworaWZkZWYgZmxhdG1vZGVsCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGlib29sIERQTUlfYWxsb2NhdGVDYWxsYmFjayh2b2lkICgqcG1jb2RlKSgpLCB2b2lkICpybXJlZ3MsIGxvbmcgKlJNQ0IpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0RQTUlfYWxsb2NhdGVDYWxsYmFjaworCisgICAgICAgIEFSRyAgICAgcG1jb2RlOkNQVFIsIHJtcmVnczpEUFRSLCBSTUNCOkRQVFIKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2ggICAgZHMKKyAgICAgICAgcHVzaCAgICBlcworCisgICAgICAgIHB1c2ggICAgY3MKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBtb3YgICAgIGVzaSxbcG1jb2RlXSAgICA7IERTOkVTSSAtPiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHRvIGNhbGwKKyAgICAgICAgbW92ICAgICBlZGksW3JtcmVnc10gICAgOyBFUzpFREkgLT4gcmVhbCBtb2RlIHJlZ2lzdGVyIGJ1ZmZlcgorICAgICAgICBtb3YgICAgIGF4LDMwM2ggICAgICAgICA7IEFYIDo9IGFsbG9jYXRlIHJlYWxtb2RlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgICAgIGludCAgICAgMzFoCisgICAgICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgIDsgUmV0dXJuIGZhaWx1cmUhCisgICAgICAgIGpjICAgICAgQEBGYWlsCisKKyAgICAgICAgbW92ICAgICBlYXgsW1JNQ0JdCisgICAgICAgIHNobCAgICAgZWN4LDE2CisgICAgICAgIG1vdiAgICAgY3gsZHgKKyAgICAgICAgbW92ICAgICBbZXM6ZWF4XSxlY3ggICAgOyBSZXR1cm4gcmVhbCBtb2RlIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgOyBSZXR1cm4gc3VjY2VzcyEKKworQEBGYWlsOiBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBEUE1JX2ZyZWVDYWxsYmFjayhsb25nIFJNQ0IpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0RQTUlfZnJlZUNhbGxiYWNrCisKKyAgICAgICAgQVJHICAgICBSTUNCOlVMT05HCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgY3gsW1dPUkQgUk1DQisyXQorICAgICAgICBtb3YgICAgIGR4LFtXT1JEIFJNQ0JdICA7IENYOkRYIDo9IHJlYWwgbW9kZSBjYWxsYmFjaworICAgICAgICBtb3YgICAgIGF4LDMwNGgKKyAgICAgICAgaW50ICAgICAzMWgKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCitlbmRpZgorCis7IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgorOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKKzsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgorCitpZmRlZiAgIFVTRV9OQVNNCislbWFjcm8gIERFTEFZIDAKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyVlbmRtYWNybworJW1hY3JvICBJT0RFTEFZTiAxCislcmVwICAgICUxCisgICAgICAgIERFTEFZCislZW5kcmVwCislZW5kbWFjcm8KK2Vsc2UKK21hY3JvICAgREVMQVkKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKK2VuZG0KK21hY3JvICAgSU9ERUxBWU4gICAgTgorICAgIHJlcHQgICAgTgorICAgICAgICBERUxBWQorICAgIGVuZG0KK2VuZG0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCis7IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCisKKyAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIHB1c2hmZAorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZworICAgICAgICBjbGkKKyAgICAgICAgb3V0ICAgICA3MGgsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBpbiAgICAgIGFsLDcxaAorICAgICAgICBtb3YgICAgIGFoLGFsCisgICAgICAgIHhvciAgICAgYWwsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCisgICAgICAgIHN0aQorICAgICAgICBtb3YgICAgIGFsLGFoICAgICAgICAgICAgICAgOyBSZXR1cm4gdmFsdWUgaW4gQUwKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCis7IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3dyaXRlQ01PUworCisgICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVCwgdmFsdWU6VUNIQVIKKworICAgICAgICBwdXNoICAgIF9icAorICAgICAgICBtb3YgICAgIF9icCxfc3AKKyAgICAgICAgcHVzaGZkCisgICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCisgICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCisgICAgICAgIGNsaQorICAgICAgICBvdXQgICAgIDcwaCxhbAorICAgICAgICBJT0RFTEFZTiA1CisgICAgICAgIG1vdiAgICAgYWwsW3ZhbHVlXQorICAgICAgICBvdXQgICAgIDcxaCxhbAorICAgICAgICB4b3IgICAgIGFsLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQorICAgICAgICBzdGkKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2lmZGVmICAgZmxhdG1vZGVsCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBfUE1fcGFnaW5nRW5hYmxlZCh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyAxIGlmIHBhZ2luZyBpcyBlbmFibGVkLCAwIGlmIG5vdCBvciAtMSBpZiBub3QgYXQgcmluZyAwCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3BhZ2luZ0VuYWJsZWQKKworICAgICAgICBtb3YgICAgIGVheCwtMQoraWZkZWYgICBET1M0R1cKKyAgICAgICAgbW92ICAgICBjeCxjcworICAgICAgICBhbmQgICAgIGVjeCwzCisgICAgICAgIGp6ICAgICAgQEBSaW5nMAorICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKKyAgICAgICAgam56ICAgICBAQFJpbmcwCisgICAgICAgIGptcCAgICAgQEBFeGl0CisKK0BAUmluZzA6CisgICAgICAgIG1vdiAgICAgZWF4LGNyMCAgICAgICAgICAgICAgICAgOyBMb2FkIENSMAorICAgICAgICBzaHIgICAgIGVheCwzMSAgICAgICAgICAgICAgICAgIDsgSXNvbGF0ZSBwYWdpbmcgZW5hYmxlZCBiaXQKK2VuZGlmCitAQEV4aXQ6IHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBfUE1fZ2V0UERCIC0gUmV0dXJuIHRoZSBQYWdlIFRhYmxlIERpcmVjdG9yeSBCYXNlIGFkZHJlc3MKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fZ2V0UERCCisKK2lmZGVmICAgRE9TNEdXCisgICAgICAgIG1vdiAgICAgYXgsY3MKKyAgICAgICAgYW5kICAgICBlYXgsMworICAgICAgICBqeiAgICAgIEBAUmluZzAKKyAgICAgICAgY21wICAgICBbVUlOVCBfUE1faGF2ZUNhdXNlV2F5XSwwCisgICAgICAgIGpueiAgICAgQEBSaW5nMAorZW5kaWYKKworOyBDYWxsIFZ4RCBpZiBydW5uaW5nIGF0IHJpbmcgMyBpbiBhIERPUyBib3gKKworICAgICAgICBjbXAgICAgIFtXT1JEIF9QTV9WWERfc2VsXSwwCisgICAgICAgIGp6ICAgICAgQEBGYWlsCisgICAgICAgIG1vdiAgICAgZWF4LFBNSEVMUF9HRVRQREIKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCAgICBmYXIgZHdvcmQgW19QTV9WWERfb2ZmXQorZWxzZQorICAgICAgICBjYWxsICAgIFtGQ1BUUiBfUE1fVlhEX29mZl0KK2VuZGlmCisgICAgICAgIHJldAorCitAQFJpbmcwOgoraWZkZWYgICBET1M0R1cKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKKyAgICAgICAgcmV0CitlbmRpZgorQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBNX2ZsdXNoVExCIC0gRmx1c2ggdGhlIFRyYW5zbGF0aW9uIExvb2thc2lkZSBidWZmZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9mbHVzaFRMQgorCisgICAgICAgIG1vdiAgICAgYXgsY3MKKyAgICAgICAgYW5kICAgICBlYXgsMworICAgICAgICBqeiAgICAgIEBAUmluZzAKK2lmZGVmICAgRE9TNEdXCisgICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAorICAgICAgICBqbnogICAgIEBAUmluZzAKK2VuZGlmCisKKzsgQ2FsbCBWeEQgaWYgcnVubmluZyBhdCByaW5nIDMgaW4gYSBET1MgYm94CisKKyAgICAgICAgY21wICAgICBbV09SRCBfUE1fVlhEX3NlbF0sMAorICAgICAgICBqeiAgICAgIEBARmFpbAorICAgICAgICBtb3YgICAgIGVheCxQTUhFTFBfRkxVU0hUTEIKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCAgICBmYXIgZHdvcmQgW19QTV9WWERfb2ZmXQorZWxzZQorICAgICAgICBjYWxsICAgIFtGQ1BUUiBfUE1fVlhEX29mZl0KK2VuZGlmCisgICAgICAgIHJldAorCitAQFJpbmcwOgoraWZkZWYgICBET1M0R1cKKyAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LGNyMworICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKK2VuZGlmCitAQEZhaWw6IHJldAorCitjcHJvY2VuZAorCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIF9QTV9WeERDYWxsKFZYRF9yZWdzIGZhciAqcix1aW50IG9mZix1aW50IHNlbCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX1Z4RENhbGwKKworICAgICAgICBBUkcgICAgIHI6RFBUUiwgb2ZmOlVJTlQsIHNlbDpVSU5UCisKKyAgICAgICAgZW50ZXJfYworCis7IExvYWQgYWxsIHJlZ2lzdGVycyBmcm9tIHRoZSByZWdpc3RlcnMgc3RydWN0dXJlCisKKyAgICAgICAgbW92ICAgICBlYngsW3JdCisgICAgICAgIG1vdiAgICAgZWF4LFtlYngrMF0KKyAgICAgICAgbW92ICAgICBlY3gsW2VieCs4XQorICAgICAgICBtb3YgICAgIGVkeCxbZWJ4KzEyXQorICAgICAgICBtb3YgICAgIGVzaSxbZWJ4KzE2XQorICAgICAgICBtb3YgICAgIGVkaSxbZWJ4KzIwXQorICAgICAgICBtb3YgICAgIGVieCxbZWJ4KzRdICAgICAgICAgOyBUcmFzaGVzIEJYIHN0cnVjdHVyZSBwb2ludGVyIQorCis7IENhbGwgdGhlIFZ4RCBlbnRyeSBwb2ludCAob24gc3RhY2spCisKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW29mZl0KK2Vsc2UKKyAgICAgICAgY2FsbCAgICBbRkNQVFIgb2ZmXQorZW5kaWYKKworOyBTYXZlIGFsbCByZWdpc3RlcnMgYmFjayBpbiB0aGUgc3RydWN0dXJlCisKKyAgICAgICAgcHVzaCAgICBlYnggICAgICAgICAgICAgICAgIDsgUHVzaCBFQlggb250byBzdGFjayBmb3IgbGF0ZXIKKyAgICAgICAgbW92ICAgICBlYngsW3JdCisgICAgICAgIG1vdiAgICAgW2VieCswXSxlYXgKKyAgICAgICAgbW92ICAgICBbZWJ4KzhdLGVjeAorICAgICAgICBtb3YgICAgIFtlYngrMTJdLGVkeAorICAgICAgICBtb3YgICAgIFtlYngrMTZdLGVzaQorICAgICAgICBtb3YgICAgIFtlYngrMjBdLGVkaQorICAgICAgICBwb3AgICAgIFtEV09SRCBlYngrNF0gICAgICAgOyBTYXZlIHZhbHVlIG9mIEVCWCBmcm9tIHN0YWNrCisKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworZW5kY29kZXNlZyAgX3BtZG9zCisKKyAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fcG1kb3MuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzQxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbQpAQCAtMCwwICsxLDExMDUgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQorOyogRW52aXJvbm1lbnQ6IElCTSBQQyBSZWFsIG1vZGUgYW5kIDE2LzMyIGJpdCBwcm90ZWN0ZWQgbW9kZQorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KKzsqICAgICAgICAgICAgICBNU0RPUyBpbnRlcnJ1cHQgaGFuZGxpbmcuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG1kb3MgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCis7IERlZmluZSB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwgc3RhY2tzLiBGb3IgcmVhbCBtb2RlIGNvZGUgdGhleSBjYW50IGJlCis7IHRoYXQgYmlnLCBidXQgZm9yIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdlIGNhbiBtYWtlIHRoZW0gbmljZSBhbmQKKzsgbGFyZ2Ugc28gdGhhdCBjb21wbGV4IEMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkLgorCitpZmRlZiBmbGF0bW9kZWwKK01PVVNFX1NUQUNLIEVRVSA0MDk2CitUSU1FUl9TVEFDSyBFUVUgNDA5NgorS0VZX1NUQUNLICAgRVFVIDEwMjQKK0lOVDEwX1NUQUNLIEVRVSAxMDI0CitJUlFfU1RBQ0sgICBFUVUgMTAyNAorZWxzZQorTU9VU0VfU1RBQ0sgRVFVIDEwMjQKK1RJTUVSX1NUQUNLIEVRVSA1MTIKK0tFWV9TVEFDSyAgIEVRVSAyNTYKK0lOVDEwX1NUQUNLIEVRVSAyNTYKK0lSUV9TVEFDSyAgIEVRVSAyNTYKK2VuZGlmCisKK2lmZGVmICAgVVNFX05BU00KKworOyBNYWNybyB0byBsb2FkIERTIGFuZCBFUyByZWdpc3RlcnMgd2l0aCBjb3JyZWN0IHZhbHVlLgorCislaW1hY3JvICAgTE9BRF9EUyAwCislaWZkZWYgIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KKyAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCislZWxzZQorICAgICAgICBwdXNoICAgIGF4CisgICAgICAgIG1vdiAgICAgYXgsX0RBVEEKKyAgICAgICAgbW92ICAgICBkcyxheAorICAgICAgICBwb3AgICAgIGF4CislZW5kaWYKKyVlbmRtYWNybworCis7IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjaworOyAlaW1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKKzsgdGhlc2UgJWltYWNyb3MgYXJlIHVzZWQgd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBzbyBpbnRlcnJ1cHRzIHNob3VsZAorOyBhbHJlYWR5IGJlIG9mZi4gV2UgdHVybiB0aGVtIGJhY2sgb24gZXhwbGljaXRseSBsYXRlciBpZiB0aGUgdXNlciBjb2RlCis7IG5lZWRzIHRoZW0gdG8gYmUgYmFjayBvbi4KKworOyBNYWNybyB0byBzd2l0Y2ggdG8gYSBuZXcgbG9jYWwgc3RhY2suCisKKyVpbWFjcm8gTkVXU1RLICAxCisgICAgICAgIGNsaQorICAgICAgICBtb3YgICAgIFtzZWdfJTFdLHNzCisgICAgICAgIG1vdiAgICAgW3B0cl8lMV0sX3NwCisgICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCisgICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCisgICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCAlMQorJWVuZG1hY3JvCisKKzsgJWltYWNybyB0byBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrLgorCislaW1hY3JvICAgUkVTVFNUSyAgIDEKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgc3MsW3NlZ18lMV0KKyAgICAgICAgbW92ICAgICBfc3AsW3B0cl8lMV0KKyVlbmRtYWNybworCis7ICVpbWFjcm8gdG8gc3dhcCB0aGUgY3VycmVudCBzdGFjayB3aXRoIHRoZSBvbmUgc2F2ZWQgYXdheS4KKworJWltYWNybyBTV0FQU1RLIDEKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgYXgsc3MKKyAgICAgICAgeGNoZyAgICBheCxbc2VnXyUxXQorICAgICAgICBtb3YgICAgIHNzLGF4CisgICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJTFdCislZW5kbWFjcm8KKworZWxzZQorCis7IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCisKK01BQ1JPICAgTE9BRF9EUworaWZkZWYgICBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdCisgICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQorZWxzZQorICAgICAgICBwdXNoICAgIGF4CisgICAgICAgIG1vdiAgICAgYXgsX0RBVEEKKyAgICAgICAgbW92ICAgICBkcyxheAorICAgICAgICBwb3AgICAgIGF4CitlbmRpZgorRU5ETQorCis7IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjaworOyBtYWNybyBmb3IgY29ycmVjdCBvcGVyYXRpb24sIGJ1dCB3ZSBkbyBub3QgZW5hYmxlIHRoZW0gYWdhaW4uIE5vcm1hbGx5Cis7IHRoZXNlIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCis7IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKKzsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgorCis7IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KKworTUFDUk8gICBORVdTVEsgIHN0a25hbWUKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgW3NlZ18mc3RrbmFtZSZdLHNzCisgICAgICAgIG1vdiAgICAgW3B0cl8mc3RrbmFtZSZdLF9zcAorICAgICAgICBtb3YgICAgIFtUZW1wU2VnXSxkcworICAgICAgICBtb3YgICAgIHNzLFtUZW1wU2VnXQorICAgICAgICBtb3YgICAgIF9zcCxvZmZzZXQgc3RrbmFtZQorRU5ETQorCis7IE1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCisKK01BQ1JPICAgUkVTVFNUSyBzdGtuYW1lCisgICAgICAgIGNsaQorICAgICAgICBtb3YgICAgIHNzLFtzZWdfJnN0a25hbWUmXQorICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyZzdGtuYW1lJl0KK0VORE0KKworOyBNYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgorCitNQUNSTyAgIFNXQVBTVEsgc3RrbmFtZQorICAgICAgICBjbGkKKyAgICAgICAgbW92ICAgICBheCxzcworICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJnN0a25hbWUmXQorICAgICAgICBtb3YgICAgIHNzLGF4CisgICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJnN0a25hbWUmXQorRU5ETQorCitlbmRpZgorCitiZWdkYXRhc2VnICBfcG1kb3MKKworaWZkZWYgZmxhdG1vZGVsCisgICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKK2VuZGlmCisgICAgY2V4dGVybiBfUE1fY3JpdEhhbmRsZXIsQ1BUUgorICAgIGNleHRlcm4gX1BNX2JyZWFrSGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1fdGltZXJIYW5kbGVyLENQVFIKKyAgICBjZXh0ZXJuIF9QTV9ydGNIYW5kbGVyLENQVFIKKyAgICBjZXh0ZXJuIF9QTV9rZXlIYW5kbGVyLENQVFIKKyAgICBjZXh0ZXJuIF9QTV9rZXkxNUhhbmRsZXIsQ1BUUgorICAgIGNleHRlcm4gX1BNX21vdXNlSGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1faW50MTBIYW5kbGVyLENQVFIKKworICAgIGNleHRlcm4gX1BNX2N0cmxDUHRyLERQVFIKKyAgICBjZXh0ZXJuIF9QTV9jdHJsQlB0cixEUFRSCisgICAgY2V4dGVybiBfUE1fY3JpdFB0cixEUFRSCisKKyAgICBjZXh0ZXJuIF9QTV9wcmV2VGltZXIsRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2UlRDLEZDUFRSCisgICAgY2V4dGVybiBfUE1fcHJldktleSxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZLZXkxNSxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZCcmVhayxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZDdHJsQyxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZDcml0aWNhbCxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsVGltZXIsVUxPTkcKKyAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbFJUQyxVTE9ORworICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsS2V5LFVMT05HCisgICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXkxNSxVTE9ORworICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsSW50MTAsVUxPTkcKKworY3B1YmxpYyBfUE1fcG1kb3NEYXRhU3RhcnQKKworOyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSBsb2NhbCBzdGFja3MgdGhhdCB3ZSBuZWVkLiBUaGVzZSBzdGFja3MKKzsgYXJlIG5vdCB2ZXJ5IGxhcmdlLCBidXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBmb3IgbW9zdCBwdXJwb3NlcworOyAoZ2VuZXJhbGx5IHlvdSB3YW50IHRvIGhhbmRsZSB0aGVzZSBpbnRlcnJ1cHRzIHF1aWNrbHksIHNpbXBseSBzdG9yaW5nCis7IHRoZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgYW5kIHRoZW4gcmV0dXJuaW5nKS4gSWYgeW91IG5lZWQgYmlnZ2VyCis7IHN0YWNrcyB0aGVuIGNoYW5nZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gaGVyZS4KKworICAgICAgICAgICAgQUxJR04gICA0CisgICAgICAgICAgICBkY2xiIE1PVVNFX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKK01zU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQorcHRyX01zU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKK3NlZ19Nc1N0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAorCisgICAgICAgICAgICBBTElHTiAgIDQKKyAgICAgICAgICAgIGRjbGIgSU5UMTBfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQorSW50MTBTdGFjazogICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCitwdHJfSW50MTBTdGFjayAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAorc2VnX0ludDEwU3RhY2sgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50CisKKyAgICAgICAgICAgIEFMSUdOICAgNAorICAgICAgICAgICAgZGNsYiBUSU1FUl9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCitUbVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKK3B0cl9UbVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0CitzZWdfVG1TdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKKworICAgICAgICAgICAgQUxJR04gICA0CisgICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKK1J0Y1N0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQorcHRyX1J0Y1N0YWNrIERVSU5UICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKK3NlZ19SdGNTdGFjayBkdyAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAorUnRjSW5zaWRlICAgZHcgICAgICAwICAgICAgICAgICA7IEFyZSB3ZSBzdGlsbCBoYW5kbGluZyBjdXJyZW50IGludGVycnVwdAorCisgICAgICAgICAgICBBTElHTiAgIDQKKyAgICAgICAgICAgIGRjbGIgS0VZX1NUQUNLICAgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQorS3lTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCitwdHJfS3lTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAorc2VnX0t5U3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50CitLeUluc2lkZSAgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0CisKKyAgICAgICAgICAgIEFMSUdOICAgNAorICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCitLeTE1U3RhY2s6ICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKK3B0cl9LeTE1U3RhY2sgICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0CitzZWdfS3kxNVN0YWNrICAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKKworVGVtcFNlZyAgICAgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIHN0YWNrIHNlZ21lbnQKKworY3B1YmxpYyBfUE1fcG1kb3NEYXRhRW5kCisKK2VuZGRhdGFzZWcgIF9wbWRvcworCitiZWdjb2Rlc2VnICBfcG1kb3MgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKK2NwdWJsaWMgX1BNX3BtZG9zQ29kZVN0YXJ0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBNX21vdXNlSVNSIC0gTW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSW50ZXJydXB0IHN1YnJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgdXBvbiBpbnRlcnJ1cHRzLCB0bworOyBkaXNwYXRjaCBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gSW50ZXJydXB0cyBhcmUgb24KKzsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCis7Cis7IEl0IGlzIF9leHRyZW1lbHlfIGltcG9ydGFudCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXJzCis7IGFzIHRoZXNlIG1heSB3ZWxsIGJlIHRyYXNoZWQgYnkgdGhlIHJvdXRpbmVzIGNhbGxlZCBmcm9tIGhlcmUgYW5kIG5vdAorOyByZXN0b3JlZCBjb3JyZWN0bHkgYnkgdGhlIG1vdXNlIGludGVyZmFjZSBtb2R1bGUuCis7Cis7IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCis7ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBGb3IgbW91c2UgaGFuZGxlcnMgdGhpcyBpcyBub3QgYQorOyAgICAgICBwcm9ibGVtLCBhcyB0aGUgbW91c2UgZHJpdmVyIGFyYml0cmF0ZXMgY2FsbHMgdG8gdGhlIHVzZXIgbW91c2UKKzsgICAgICAgaGFuZGxlciBmb3IgdXMuCis7Cis7IEVudHJ5OiAgICBBWCAgLSBDb25kaXRpb24gbWFzayBnaXZpbmcgcmVhc29uIGZvciBjYWxsCis7ICAgICAgICAgICBCWCAgLSBNb3VzZSBidXR0b24gc3RhdGUKKzsgICAgICAgICAgIENYICAtIEhvcml6b250YWwgY3Vyc29yIGNvb3JkaW5hdGUKKzsgICAgICAgICAgIERYICAtIFZlcnRpY2FsIGN1cnNvciBjb29yZGluYXRlCis7ICAgICAgICAgICBTSSAgLSBIb3Jpem9udGFsIG1pY2tleSB2YWx1ZQorOyAgICAgICAgICAgREkgIC0gVmVydGljYWwgbWlja2V5IHZhbHVlCis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZkZWYgICBESkdQUAorY3Byb2NzdGFydCAgX1BNX21vdXNlSVNSCitlbHNlCitjcHJvY2ZhciAgICBfUE1fbW91c2VJU1IKK2VuZGlmCisKKyAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCisKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCisgICAgICAgIE5FV1NUSyAgTXNTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCisKKzsgQ2FsbCB0aGUgaW5zdGFsbGVkIGhpZ2ggbGV2ZWwgQyBjb2RlIHJvdXRpbmUKKworICAgICAgICBjbHJoaSAgIGR4ICAgICAgICAgICAgICA7IENsZWFyIG91dCBoaWdoIG9yZGVyIHZhbHVlcworICAgICAgICBjbHJoaSAgIGN4CisgICAgICAgIGNscmhpICAgYngKKyAgICAgICAgY2xyaGkgICBheAorICAgICAgICBzZ25oaSAgIHNpCisgICAgICAgIHNnbmhpICAgZGkKKworICAgICAgICBwdXNoICAgIF9kaQorICAgICAgICBwdXNoICAgIF9zaQorICAgICAgICBwdXNoICAgIF9keAorICAgICAgICBwdXNoICAgIF9jeAorICAgICAgICBwdXNoICAgIF9ieAorICAgICAgICBwdXNoICAgIF9heAorICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICA7IEVuYWJsZSBpbnRlcnJ1cHRzCisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX21vdXNlSGFuZGxlcl0KKyAgICAgICAgX2FkZCAgICBzcCwxMiwyNAorCisgICAgICAgIFJFU1RTVEsgTXNTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjaworCisgICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICByZXQgICAgICAgICAgICAgICAgICAgICA7IFdlIGFyZSBkb25lISEKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUE1fdGltZXJJU1IgLSBUaW1lciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAorOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKKzsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCis7IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgorOworOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAorOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCis7ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQorOyAgICAgICBzeXN0ZW0uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NmYXIgICAgX1BNX3RpbWVySVNSCisKKyAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCisKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCisKKyAgICAgICAgTkVXU1RLICBUbVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKKyAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fdGltZXJIYW5kbGVyXQorICAgICAgICBSRVNUU1RLIFRtU3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKworICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUE1fY2hhaW5QcmV2VGltZXIgLSBDaGFpbiB0byBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgYW5kIHJldHVybgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgcm91dGluZSBhbmQgcmV0dXJucyBjb250cm9sCis7IGJhY2sgdG8gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fY2hhaW5QcmV2VGltZXIKKworaWZkZWYgICBUTlQKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlY3gKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAorICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsVGltZXJdCisgICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCisgICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBlY3gKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYXgKKyAgICAgICAgcmV0CitlbHNlCisgICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzdGF0ZSBvZiBpbnRlcnJ1cHQgZmxhZworICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0CitpZmRlZiAgIFVTRV9OQVNNCisgICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldlRpbWVyXQorZWxzZQorICAgICAgICBjYWxsICAgIFtfUE1fcHJldlRpbWVyXQorZW5kaWYKKyAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCisgICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KKyAgICAgICAgcmV0CitlbmRpZgorCitjcHJvY2VuZAorCis7IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgorOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKKzsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgorCitpZmRlZiAgIFVTRV9OQVNNCislbWFjcm8gIERFTEFZIDAKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyVlbmRtYWNybworJW1hY3JvICBJT0RFTEFZTiAxCislcmVwICAgICUxCisgICAgICAgIERFTEFZCislZW5kcmVwCislZW5kbWFjcm8KK2Vsc2UKK21hY3JvICAgREVMQVkKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKK2VuZG0KK21hY3JvICAgSU9ERUxBWU4gICAgTgorICAgIHJlcHQgICAgTgorICAgICAgICBERUxBWQorICAgIGVuZG0KK2VuZG0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBNX3J0Y0lTUiAtIFJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAorOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKKzsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCis7IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgorOworOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAorOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCis7ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQorOyAgICAgICBzeXN0ZW0uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NmYXIgICAgX1BNX3J0Y0lTUgorCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworCis7IENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQorOyBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgorCisgICAgICAgIG1vdiAgICAgYWwsMjBoCisgICAgICAgIG91dCAgICAgMEEwaCxhbAorICAgICAgICBvdXQgICAgIDAyMGgsYWwKKworOyBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dAorCisgICAgICAgIGluICAgICAgYWwsNzBoICAgICAgICAgICAgICA7IFJlYWQgQ01PUyBpbmRleCByZWdpc3RlcgorICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgOyAgYW5kIHNhdmUgZm9yIGxhdGVyCisgICAgICAgIElPREVMQVlOIDMKKyAgICAgICAgbW92ICAgICBhbCwwQ2gKKyAgICAgICAgb3V0ICAgICA3MGgsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBpbiAgICAgIGFsLDcxaAorCis7IENhbGwgdGhlIEMgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24KKworICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCisgICAgICAgIGNtcCAgICAgW0JZVEUgUnRjSW5zaWRlXSwxICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCisgICAgICAgIGplICAgICAgQEBFeGl0CisgICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwxCisgICAgICAgIE5FV1NUSyAgUnRjU3RhY2sgICAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjaworICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cworICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9ydGNIYW5kbGVyXQorICAgICAgICBSRVNUU1RLIFJ0Y1N0YWNrICAgICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCisgICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwwCisKK0BARXhpdDogcG9wICAgICBfYXgKKyAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmVzdG9yZSBDTU9TIGluZGV4IHJlZ2lzdGVyCisgICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK2Nwcm9jZW5kCisKK2lmZGVmIGZsYXRtb2RlbAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUE1faXJxSVNSVGVtcGxhdGUgLSBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBJUlEgdGVtcGxhdGUKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciBhbnkgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCis7IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycworOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKKzsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCis7Cis7IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCis7ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKKzsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZS4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBfUE1faXJxSVNSVGVtcGxhdGUKKworICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBtb3YgICAgIGVieCwwICAgICAgICAgICA7IFJlbG9jYXRpb24gYWRqdXN0bWVudCBmYWN0b3IKKyAgICAgICAgam1wICAgICBfX0lSUUVudHJ5CisKKzsgR2xvYmFsIHZhcmlhYmxlcyBzdG9yZWQgaW4gdGhlIElSUSB0aHVuayBjb2RlIHNlZ21lbnQKKworX0NIYW5kbGVyICAgICAgIGRkICAgICAgMCAgICAgICA7IFBvaW50ZXIgdG8gQyBpbnRlcnJ1cHQgaGFuZGxlcgorX1ByZXZJUlEgICAgICAgIGRkICAgICAgMCAgICAgICA7IFByZXZpb3VzIElSUSBoYW5kbGVyCisgICAgICAgICAgICAgICAgZGQgICAgICAwCitfSVJRICAgICAgICAgICAgZGQgICAgICAwICAgICAgIDsgSVJRIHdlIGFyZSBob29rZWQgZm9yCitwdHJfSVJRU3RhY2sgICAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAorc2VnX0lSUVN0YWNrICAgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50CitfSW5zaWRlICAgICAgICAgZGIgICAgICAwICAgICAgIDsgTXV0dWFsIGV4Y2x1c2lvbiBmbGFnCisgICAgICAgIEFMSUdOICAgNAorICAgICAgICBkY2xiIElSUV9TVEFDSyAgICAgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjaworX0lSUVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCisKKzsgQ2hlY2sgZm9yIGFuZCByZWplY3Qgc3B1cmlvdXMgSVJRIDcgc2lnbmFscworCitfX0lSUUVudHJ5OgorICAgICAgICBjbXAgICAgIFtCWVRFIGNzOmVieCtfSVJRXSw3ICAgIDsgU3B1cmlvdXMgSVJRcyBvY2N1ciBvbmx5IG9uIElSUSA3CisgICAgICAgIGptcCAgICAgQEBWYWxpZElSUQorICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBtb3YgICAgIGFsLDEwMTFiICAgICAgICAgICAgOyBPQ1czOiByZWFkIElTUgorICAgICAgICBvdXQgICAgIDIwaCxhbCAgICAgICAgICAgICAgOyAoSW50ZWwgUGVyaXBoZXJhbCBDb21wb25lbnRzLCAxOTkxLAorICAgICAgICBpbiAgICAgIGFsLDIwaCAgICAgICAgICAgICAgOyBwLiAzLTE4OCkKKyAgICAgICAgc2hsICAgICBhbCwxICAgICAgICAgICAgICAgIDsgU2V0IEMgPSBiaXQgNyAoSVJRIDcpIG9mIElTUiByZWdpc3RlcgorICAgICAgICBwb3AgICAgIGVheAorICAgICAgICBqYyAgICAgIEBAVmFsaWRJUlEKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKKzsgU2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBkdXJhdGlvbiBvZiBJUlEgaGFuZGxlcgorCitAQFZhbGlkSVJROgorICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorCis7IFNlbmQgYW4gRU9JIHRvIHRoZSBQSUMKKworICAgICAgICBtb3YgICAgIGFsLDIwaCAgICAgICAgICAgICAgOyBTZW5kIEVPSSB0byBQSUMKKyAgICAgICAgY21wICAgICBbQllURSBlYngrX0lSUV0sOCAgIDsgQ2xlYXIgUElDMSBmaXJzdCBpZiBJUlEgPj0gOAorICAgICAgICBqYiAgICAgIEBAMQorICAgICAgICBvdXQgICAgIDBBMGgsYWwKK0BAMTogICAgb3V0ICAgICAyMGgsYWwKKworOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgorCisgICAgICAgIGNtcCAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDEKKyAgICAgICAgamUgICAgICBAQENoYWluT2xkSGFuZGxlcgorICAgICAgICBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwxCisKKzsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgorCisgICAgICAgIG1vdiAgICAgW2VieCtzZWdfSVJRU3RhY2tdLHNzICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKKyAgICAgICAgbW92ICAgICBbZWJ4K3B0cl9JUlFTdGFja10sZXNwCisgICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCisgICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCisgICAgICAgIGxlYSAgICAgZXNwLFtlYngrX0lSUVN0YWNrXQorICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIGludGVycnVwdHMKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgY2FsbCAgICBbRFdPUkQgZWJ4K19DSGFuZGxlcl0KKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgc3MsW2VieCtzZWdfSVJRU3RhY2tdICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCisgICAgICAgIG1vdiAgICAgZXNwLFtlYngrcHRyX0lSUVN0YWNrXQorICAgICAgICBvciAgICAgIGVheCxlYXgKKyAgICAgICAganogICAgICBAQENoYWluT2xkSGFuZGxlciAgIDsgQ2hhaW4gaWYgbm90IGhhbmRsZWQgZm9yIHNoYXJlZCBJUlEKKworQEBFeGl0OiBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwwCisgICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK0BAQ2hhaW5PbGRIYW5kbGVyOgorICAgICAgICBjbXAgICAgIFtEV09SRCBlYngrX1ByZXZJUlFdLDAKKyAgICAgICAganogICAgICBAQEV4aXQKKyAgICAgICAgbW92ICAgICBbQllURSBlYngrX0luc2lkZV0sMAorICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgZWJ4K19QcmV2SVJRXQorICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJ4K19QcmV2SVJRKzRdCisgICAgICAgIG1vdiAgICAgW0RXT1JEIF9QcmV2SVJRXSxlYXgKKyAgICAgICAgbW92ICAgICBbRFdPUkQgX1ByZXZJUlErNF0sZWJ4CisgICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgam1wICAgICBbY3M6X1ByZXZJUlFdICAgICAgIDsgQ2hhaW4gdG8gcHJldmlvdXMgSVJRIGhhbmRsZXIKKworY3Byb2NlbmQKK2NwdWJsaWMgX1BNX2lycUlTUlRlbXBsYXRlRW5kCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9rZXlJU1IgLSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGtleWJvYXJkIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAorOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKKzsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCis7IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgorOworOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAorOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gSG93ZXZlciB3ZSBlbnN1cmUgd2l0aGluIHRoaXMgcm91dGluZQorOyAgICAgICBtdXR1YWwgZXhjbHVzaW9uIHRvIHRoZSBrZXlib2FyZCBoYW5kbGluZyByb3V0aW5lLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9rZXlJU1IKKworICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCisgICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKKworICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKKworICAgICAgICBjbXAgICAgIFtCWVRFIEt5SW5zaWRlXSwxICAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgorICAgICAgICBqZSAgICAgIEBAUmVpc3N1ZWQKKworICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwxCisgICAgICAgIE5FV1NUSyAgS3lTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleUhhbmRsZXJdICAgOyBDYWxsIEMgY29kZQorICAgICAgICBSRVNUU1RLIEt5U3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKyAgICAgICAgbW92ICAgICBbQllURSBLeUluc2lkZV0sMAorCitAQEV4aXQ6IHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAorCis7IFdoZW4gdGhlIEJJT1Mga2V5Ym9hcmQgaGFuZGxlciBuZWVkcyB0byBjaGFuZ2UgdGhlIFNISUZUIHN0YXR1cyBsaWdodHMKKzsgb24gdGhlIGtleWJvYXJkLCBpbiB0aGUgcHJvY2VzcyBvZiBkb2luZyB0aGlzIHRoZSBrZXlib2FyZCBjb250cm9sbGVyCis7IHJlLWlzc3VlcyBhbm90aGVyIGludGVycnVwdCwgd2hpbGUgdGhlIGN1cnJlbnQgaGFuZGxlciBpcyBzdGlsbCBleGVjdXRpbmcuCis7IElmIHdlIHJlY2lldmUgYW5vdGhlciBpbnRlcnJ1cHQgd2hpbGUgc3RpbGwgaGFuZGxpbmcgdGhlIGN1cnJlbnQgb25lLAorOyB0aGVuIHNpbXBseSBjaGFpbiBkaXJlY3RseSB0byB0aGUgcHJldmlvdXMgaGFuZGxlci4KKzsKKzsgTm90ZSB0aGF0IGZvciBtb3N0IERPUyBleHRlbmRlcnMsIHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZQorOyBpbnN0YWxsIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMuCisKK0BAUmVpc3N1ZWQ6CitpZmRlZiAgIFROVAorICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVjeAorICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0CisgICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCisgICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCisgICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCisgICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBlY3gKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYXgKK2Vsc2UKKyAgICAgICAgcHVzaGYKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KK2VuZGlmCitlbmRpZgorICAgICAgICBqbXAgICAgIEBARXhpdAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9jaGFpblByZXZrZXkgLSBDaGFpbiB0byBwcmV2aW91cyBrZXkgaW50ZXJydXB0IGFuZCByZXR1cm4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENoYWlucyB0byB0aGUgcHJldmlvdXMga2V5IGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKKzsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZLZXkKKworaWZkZWYgICBUTlQKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlY3gKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAorICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5XQorICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjaworICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCisgICAgICAgIHBvcGZkCisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHJldAorZWxzZQorCis7IFlJS0VTISBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgd2hlbiBleGVjdXRpb24gcmV0dXJucyBmcm9tIHRoZQorOyBwcmV2aW91cyBrZXlib2FyZCBoYW5kbGVyLCBpbnRlcnJ1cHRzIGFyZSByZS1lbmFibGVkISEgU2luY2Ugd2UgZXhwZWN0Cis7IGludGVycnVwdHMgdG8gcmVtYWluIG9mZiBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIG91ciBoYW5kbGVyLCB0aGlzIGNhbgorOyBjYXVzZSBoYXZvYy4gSG93ZXZlciBvdXIgc3RhY2sgbWFjcm9zIGFsd2F5cyB0dXJuIG9mZiBpbnRlcnJ1cHRzLCBzbyB0aGV5Cis7IHdpbGwgYmUgb2ZmIHdoZW4gd2UgZXhpdCB0aGlzIHJvdXRpbmUuIE9idmlvdXNseSB0aGVyZSBpcyBhIHRpbnkgd2VlbnkKKzsgd2luZG93IHdoZW4gaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQsIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbgorOyBkbyBhYm91dCB0aGlzLgorCisgICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KK2VuZGlmCisgICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KKyAgICAgICAgcmV0CitlbmRpZgorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9rZXkxNUlTUiAtIEludCAxNWgga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgYmVlbiBjYWxsZWQgdG8gaGFuZGxlIHRoZSBJbnQgMTVoCis7IGtleWJvYXJkIGludGVycnVwdCBjYWxsb3V0IGZyb20gcmVhbCBtb2RlLgorOworOyAgIEVudHJ5OiAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MKKzsgICBFeGl0OiAgIEFYICAtIEhhcmR3YXJlIHNjYW4gY29kZSB0byBwcm9jZXNzICgwIHRvIGlnbm9yZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBfUE1fa2V5MTVJU1IKKworICAgICAgICBwdXNoICAgIGRzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgTE9BRF9EUworICAgICAgICBjbXAgICAgIGFoLDRGaAorICAgICAgICBqbnogICAgIEBATm90T3VycyAgICAgICA7IFF1aXQgaWYgbm90IGtleWJvYXJkIGNhbGxvdXQKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworICAgICAgICB4b3IgICAgIGFoLGFoICAgICAgICAgICA7IEFYIDo9IHNjYW4gY29kZQorICAgICAgICBORVdTVEsgIEt5MTVTdGFjayAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjaworICAgICAgICBwdXNoICAgIF9heAorICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9rZXkxNUhhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKKyAgICAgICAgX2FkZCAgICBzcCwyLDQKKyAgICAgICAgUkVTVFNUSyBLeTE1U3RhY2sgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCisgICAgICAgIHRlc3QgICAgYXgsYXgKKyAgICAgICAganogICAgICBAQDEKKyAgICAgICAgc3RjICAgICAgICAgICAgICAgICAgICAgOyBTZXQgY2FycnkgdG8gcHJvY2VzcyBhcyBub3JtYWwKKyAgICAgICAgam1wICAgICBAQDIKK0BAMTogICAgY2xjICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBjYXJyeSB0byBpZ25vcmUgc2NhbiBjb2RlCitAQDI6ICAgIHBvcGFkCisgICAgICAgIGptcCAgICAgQEBFeGl0ICAgICAgICAgIDsgV2UgYXJlIGRvbmUKKworQEBOb3RPdXJzOgoraWZkZWYgICBUTlQKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlY3gKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAorICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5MTVdCisgICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCisgICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBlY3gKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYXgKK2Vsc2UKKyAgICAgICAgcHVzaGYKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5MTVdCitlbHNlCisgICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5MTVdCitlbmRpZgorZW5kaWYKK0BARXhpdDogcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgcmV0ZiAgICA0CitlbHNlCisgICAgICAgIHJldGYgICAgMgorZW5kaWYKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUE1fYnJlYWtJU1IgLSBDb250cm9sIEJyZWFrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ3RybC1CcmVhayBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKKzsgdGhlIEN0cmwtQnJlYWsgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCis7IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NmYXIgICAgX1BNX2JyZWFrSVNSCisKKyAgICAgICAgc3RpCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIGVzCisgICAgICAgIHB1c2ggICAgX2J4CisKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KK2Vsc2UKKyAgICAgICAgbGVzICAgICBieCxbX1BNX2N0cmxCUHRyXQorZW5kaWYKKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCisKKzsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCisKKyAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCisgICAgICAgIGplICAgICAgQEBFeGl0CisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIG1vdiAgICAgX2F4LDEKKyAgICAgICAgcHVzaCAgICBfYXgKKyAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCisgICAgICAgIHBvcCAgICAgX2F4CisgICAgICAgIHBvcGFkCisKK0BARXhpdDogcG9wICAgICBfYngKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9jdHJsQnJlYWtIaXQoaW50IGNsZWFyRmxhZykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEN0cmwtQnJlYWsgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2N0cmxCcmVha0hpdAorCisgICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgIHB1c2ggICAgZXMKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQorZWxzZQorICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybEJQdHJdCitlbmRpZgorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQorICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KKyAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKKyAgICAgICAganogICAgICBAQERvbmUKKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCisKK0BARG9uZTogcG9wICAgICBlcworICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9jdHJsQ0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUMgaW50ZXJydXB0LiBXZSBzaW1wbHkgc2V0Cis7IHRoZSBDdHJsLUMgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCis7IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NmYXIgICAgX1BNX2N0cmxDSVNSCisKKyAgICAgICAgc3RpCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIGVzCisgICAgICAgIHB1c2ggICAgX2J4CisKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQ1B0cl0KK2Vsc2UKKyAgICAgICAgbGVzICAgICBieCxbX1BNX2N0cmxDUHRyXQorZW5kaWYKKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCisKKzsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCisKKyAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCisgICAgICAgIGplICAgICAgQEBFeGl0CisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIG1vdiAgICAgX2F4LDAKKyAgICAgICAgcHVzaCAgICBfYXgKKyAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCisgICAgICAgIHBvcCAgICAgX2F4CisgICAgICAgIHBvcGFkCisKK0BARXhpdDogcG9wICAgICBfYngKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisgICAgICAgIGlyZXRkCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9jdHJsQ0hpdChpbnQgY2xlYXJGbGFnKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1DIGZsYWcgYW5kIHBvc3NpYmx5IGNsZWFycyBpdC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9jdHJsQ0hpdAorCisgICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgIHB1c2ggICAgZXMKK2lmZGVmIGZsYXRtb2RlbAorICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQorZWxzZQorICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybENQdHJdCitlbmRpZgorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQorICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KKyAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKKyAgICAgICAganogICAgICBAQERvbmUKKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCisKK0BARG9uZToKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9jcml0aWNhbElTUiAtIENvbnRyb2wgRXJyb3IgaGFuZGxlciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE1TRE9TIENyaXRpY2FsIEVycm9yIGludGVycnVwdCwgdG8gZGlzcGF0Y2gKKzsgY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbAorOyByZWdpc3RlcnMgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIFdlIGFsc28gcGFzcworOyB0aGUgdmFsdWVzIG9mIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIHRoZSBhcyBwb2ludGVycywgc28gdGhhdCB0aGUKKzsgdmFsdWVzIGNhbiBiZSBtb2RpZmllZCBiZWZvcmUgcmV0dXJuaW5nIHRvIE1TRE9TLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9jcml0aWNhbElTUgorCisgICAgICAgIHN0aQorICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICA7IFNhdmUgcmVnaXN0ZXIgdmFsdWVzIGNoYW5nZWQKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworCisgICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgoraWZkZWYgZmxhdG1vZGVsCisgICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3JpdFB0cl0KK2Vsc2UKKyAgICAgICAgbGVzICAgICBieCxbX1BNX2NyaXRQdHJdCitlbmRpZgorICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxheAorICAgICAgICBtb3YgICAgIFtfRVMgX2J4KzJdLGRpCisKKzsgUnVuIGFsdGVybmF0ZSBjcml0aWNhbCBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCisKKyAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fY3JpdEhhbmRsZXJdLDAKKyAgICAgICAgamUgICAgICBAQE5vQWx0SGFuZGxlcgorCisgICAgICAgIHB1c2hhZAorICAgICAgICBwdXNoICAgIF9kaQorICAgICAgICBwdXNoICAgIF9heAorICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0gIDsgQ2FsbCBDIGNvZGUKKyAgICAgICAgX2FkZCAgICBzcCw0LDgKKyAgICAgICAgcG9wYWQKKworICAgICAgICBwb3AgICAgIF9ieAorICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKworQEBOb0FsdEhhbmRsZXI6CisgICAgICAgIG1vdiAgICAgYXgsMyAgICAgICAgICAgIDsgVGVsbCBNU0RPUyB0byBmYWlsIHRoZSBvcGVyYXRpb24KKyAgICAgICAgcG9wICAgICBfYngKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9jcml0aWNhbEVycm9yKGludCAqYXhWYWwsaW50ICpkaVZhbCxpbnQgY2xlYXJGbGFnKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY3JpdGljYWwgZXJyb3IgZmxhZ3MsIGFuZCB0aGUgdmFsdWVzIHRoYXQKKzsgTVNET1MgcGFzc2VkIGluIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIG91ciBoYW5kbGVyLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2NyaXRpY2FsRXJyb3IKKworICAgICAgICBBUkcgICAgIGF4VmFsOkRQVFIsIGRpVmFsOkRQVFIsIGNsZWFyRmxhZzpVSU5UCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgaW50ZXJydXB0IHN0YXR1cworICAgICAgICBwdXNoICAgIGVzCitpZmRlZiBmbGF0bW9kZWwKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQorZWxzZQorICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3JpdFB0cl0KK2VuZGlmCisgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCisgICAgICAgIHhvciAgICAgX2F4LF9heAorICAgICAgICB4b3IgICAgIF9kaSxfZGkKKyAgICAgICAgbW92ICAgICBheCxbX0VTIF9ieF0KKyAgICAgICAgbW92ICAgICBkaSxbX0VTIF9ieCsyXQorICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQorICAgICAgICBqeiAgICAgIEBATm9DbGVhcgorICAgICAgICBtb3YgICAgIFtVTE9ORyBfRVMgX2J4XSwwCitAQE5vQ2xlYXI6CisgICAgICAgIF9sZXMgICAgX2J4LFtheFZhbF0KKyAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2F4CisgICAgICAgIF9sZXMgICAgX2J4LFtkaVZhbF0KKyAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2RpCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fc2V0TW91c2VIYW5kbGVyCisKKyAgICAgICAgQVJHICAgICBtb3VzZU1hc2s6VUlOVAorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgcHVzaCAgICBlcworCisgICAgICAgIG1vdiAgICAgYXgsMENoICAgICAgICAgIDsgQVggOj0gRnVuY3Rpb24gMTIgLSBpbnN0YWxsIGludGVycnVwdCBzdWIKKyAgICAgICAgbW92ICAgICBfY3gsW21vdXNlTWFza10gOyBDWCA6PSBtb3VzZSBtYXNrCisgICAgICAgIG1vdiAgICAgX2R4LG9mZnNldCBfUE1fbW91c2VJU1IKKyAgICAgICAgcHVzaCAgICBjcworICAgICAgICBwb3AgICAgIGVzICAgICAgICAgICAgICA7IEVTOl9EWCAtPiBtb3VzZSBoYW5kbGVyCisgICAgICAgIGludCAgICAgMzNoICAgICAgICAgICAgIDsgQ2FsbCBtb3VzZSBkcml2ZXIKKworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2lmZGVmIGZsYXRtb2RlbAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX21vdXNlUE1DQih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTW91c2UgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKKzsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKKzsKKzsgICBFbnRyeTogIERTOl9TSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAorOyAgICAgICAgICAgRVM6X0RJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKKzsgICAgICAgICAgIFNTOl9TUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9tb3VzZVBNQ0IKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgbW92ICAgICBlYXgsW2VzOl9kaSsxQ2hdICAgIDsgTG9hZCByZWdpc3RlciB2YWx1ZXMgZnJvbSByZWFsIG1vZGUKKyAgICAgICAgbW92ICAgICBlYngsW2VzOl9kaSsxMGhdCisgICAgICAgIG1vdiAgICAgZWN4LFtlczpfZGkrMThoXQorICAgICAgICBtb3YgICAgIGVkeCxbZXM6X2RpKzE0aF0KKyAgICAgICAgbW92ICAgICBlc2ksW2VzOl9kaSswNGhdCisgICAgICAgIG1vdiAgICAgZWRpLFtlczpfZGldCisgICAgICAgIGNhbGwgICAgX1BNX21vdXNlSVNSICAgICAgICA7IENhbGwgdGhlIG1vdXNlIGhhbmRsZXIKKyAgICAgICAgcG9wYWQKKworICAgICAgICBtb3YgICAgIGF4LFtkczpfc2ldCisgICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQWhdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIElQIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBheCxbZHM6X3NpKzJdCisgICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQ2hdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIENTIHZhbHVlCisgICAgICAgIGFkZCAgICAgW1dPUkQgZXM6X2RpKzJFaF0sNCA7IFJlbW92ZSByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgdG8gcmVhbCBtb2RlIQorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX2ludDEwUE1DQih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50MTAgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKKzsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKKzsKKzsgICBFbnRyeTogIERTOkVTSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAorOyAgICAgICAgICAgRVM6RURJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKKzsgICAgICAgICAgIFNTOkVTUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgICAgICBfUE1faW50MTBQTUNCCisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIHB1c2ggICAgZHMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoICAgIGZzCisKKyAgICAgICAgcHVzaGZkCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIG1vdiAgICAgW2VzOmVkaSsyMGhdLGF4ICAgICA7IFNhdmUgcmV0dXJuIGZsYWcgc3RhdHVzCisgICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaV0KKyAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcworICAgICAgICBtb3YgICAgIGF4LFtkczplc2krMl0KKyAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKKyAgICAgICAgYWRkICAgICBbV09SRCBlczplZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKKworOyBDYWxsIHRoZSBpbnN0YWxsIGludDEwIGhhbmRsZXIgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKKzsgd2l0aCBEUyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0YSBzZWxlY3RvciwgYW5kIEVTOkVESSBwb2ludGluZyB0aGUgdGhlCis7IHJlYWwgbW9kZSBEUE1JIHJlZ2lzdGVyIHN0cnVjdHVyZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LiBUaGUKKzsgaGFuZGxlIG11c3QgYmUgd3JpdHRlbiBpbiBhc3NlbWJsZXIgdG8gYmUgYWJsZSB0byBleHRyYWN0IHRoZSByZWFsIG1vZGUKKzsgcmVnaXN0ZXIgdmFsdWVzIGZyb20gdGhlIHN0cnVjdHVyZQorCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcG9wICAgICBmcyAgICAgICAgICAgICAgICAgIDsgRlM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlcnMKKyAgICAgICAgTE9BRF9EUworICAgICAgICBORVdTVEsgIEludDEwU3RhY2sgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKKworICAgICAgICBjYWxsICAgIFtfUE1faW50MTBIYW5kbGVyXQorCisgICAgICAgIFJFU1RTVEsgSW50MTBTdGFjayAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKyAgICAgICAgcG9wICAgICBmcworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgcG9wYWQKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCisKK2Nwcm9jZW5kCisKK2VuZGlmCisKK2NwdWJsaWMgX1BNX3BtZG9zQ29kZUVuZAorCitlbmRjb2Rlc2VnICBfcG1kb3MKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fdmZsYXQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL192ZmxhdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5ODVhOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fdmZsYXQuYXNtCkBAIC0wLDAgKzEsNjUyIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgICAgICAgICAgQmFzZWQgb24gb3JpZ2luYWwgY29kZSBDb3B5cmlnaHQgMTk5NCBPdHRvIENocm9ucworOyoKKzsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIGxhdGVyCis7KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGVyIGZvciB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlcnMuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorICAgICAgICBKVU1QUworCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfdmZsYXQgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitWRkxBVF9TVEFSVCAgICAgRVFVIDBGMDAwMDAwMGgKK1ZGTEFUX0VORCAgICAgICBFUVUgMEYwM0ZGRkZGaAorUEFHRV9QUkVTRU5UICAgIEVRVSAxCitQQUdFX05PVFBSRVNFTlQgRVFVIDAKK1BBR0VfUkVBRCAgICAgICBFUVUgMAorUEFHRV9XUklURSAgICAgIEVRVSAyCisKK2lmZGVmICAgRE9TNEdXCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERPUzRHL1cgZmxhdCBsaW5lYXIgZnJhbWVidWZmZXIgZW11bGF0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYmVnZGF0YXNlZyAgX3ZmbGF0CisKKzsgTmVhciBwb2ludGVycyB0byB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSBhbmQgb3VyIHBhZ2UgdGFibGVzLiBBbGwgb2YKKzsgdGhpcyBtZW1vcnkgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IE1iIG9mIERPUyBtZW1vcnkuCisKK1BEQlIgICAgICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgUGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciAoQ1IzKQorYWNjZXNzUGFnZUFkZHIgIGRkICAwCithY2Nlc3NQYWdlVGFibGUgZGQgIDAKKworOyBDYXVzZVdheSBwYWdlIGRpcmVjdG9yeSAmIDFzdCBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzZXMuCisKK0NhdXNlV2F5RElSTGluZWFyIGRkIDAKK0NhdXNlV2F5MXN0TGluZWFyIGRkIDAKKworOyBQbGFjZSB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFBhZ2UgVGFibGUgRGlyZWN0b3J5IGJlZm9yZSB3ZQorOyBpbnRpYWxpc2VkIG91ciB2aXJ0dWFsIGJ1ZmZlciBjb2RlLgorCitwYWdlRGlyZWN0b3J5OiAgcmVzZCAxMDI0ICAgICAgICAgICA7IFNhdmVkIHBhZ2UgdGFibGUgZGlyZWN0b3J5CisKK1ZhbGlkQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgVmFsaWQgQ1MgZm9yIHBhZ2UgZmF1bHRzCitSaW5nMENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IE91ciByaW5nIDAgY29kZSBzZWxlY3RvcgorTGFzdFBhZ2UgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBMYXN0IHBhZ2Ugd2UgbWFwcGVkIGluCitCYW5rRnVuY0J1ZjogICAgcmVzYiAxMDEgICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIGJhbmsgc3dpdGNoIGNvZGUKK0JhbmtGdW5jUHRyICAgICBkZCAgb2Zmc2V0IEJhbmtGdW5jQnVmCisKK0lOVDE0R2F0ZToKK0lOVDE0T2Zmc2V0ICAgICBkZCAgICAgIDAgICAgICAgICAgIDsgZWlwIG9mIG9yaWdpbmFsIHZlY3RvcgorSU5UMTRTZWxlY3RvciAgIGR3ICAgICAgMCAgICAgICAgICAgOyBjcyBvZiBvcmlnaW5hbCB2ZWN0b3IKKworICAgICAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorICAgICAgICBjZXh0ZXJuIFZGX2hhdmVDYXVzZVdheSxCT09MCisKK2VuZGRhdGFzZWcgIF92ZmxhdAorCitiZWdjb2Rlc2VnICBfdmZsYXQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKyAgICAgICAgY2V4dGVybiBWRl9tYWxsb2MsRlBUUgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQRl9oYW5kbGVyNjRrIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA2NGsgYmFua3MKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcworOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCis7IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKKzsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKKzsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQorOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCis7IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKKzsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBQRl9oYW5kbGVyNjRrCisKKzsgQ2hlY2sgaWYgdGhpcyBpcyBhIHByb2Nlc3NvciBleGVjZXB0aW9uIG9yIGEgcGFnZSBmYXVsdAorCisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIG1vdiAgICAgYXgsW2NzOlZhbGlkQ1NdICAgICA7IFVzZSBDUyBvdmVycmlkZSB0byBhY2Nlc3MgZGF0YQorICAgICAgICBjbXAgICAgIFtzczplc3ArMTJdLGF4ICAgICAgOyBJcyB0aGlzIGEgcGFnZSBmYXVsdD8KKyAgICAgICAgam5lICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgTm9wZSwganVtcCB0byB0aGUgcHJldmlvdXMgaGFuZGxlcgorCis7IEdldCBhZGRyZXNzIG9mIHBhZ2UgZmF1bHQgYW5kIGNoZWNrIGlmIHdpdGhpbiBvdXIgaGFuZGxlcnMgcmFuZ2UKKworICAgICAgICBtb3YgICAgIGVheCxjcjIgICAgICAgICAgICAgOyBFQlggaGFzIHBhZ2UgZmF1bHQgbGluZWFyIGFkZHJlc3MKKyAgICAgICAgY21wICAgICBlYXgsVkZMQVRfU1RBUlQgICAgIDsgSXMgdGhlIGZhdWx0IGxlc3MgdGhhbiBvdXJzPworICAgICAgICBqYiAgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKKyAgICAgICAgY21wICAgICBlYXgsVkZMQVRfRU5EICAgICAgIDsgSXMgdGhlIGZhdWx0IG1vcmUgdGhhbiBvdXJzPworICAgICAgICBqYWUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKKworOyBUaGlzIGlzIG91ciBwYWdlIGZhdWx0LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdAorCisgICAgICAgIHB1c2hhZAorICAgICAgICBwdXNoICAgIGRzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgIDsgRUJYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcworICAgICAgICBhbmQgICAgIGVieCxpbnZlcnQgMEZGRkZoICAgOyBNYXNrIHRvIDY0ayBiYW5rIGJvdW5kYXJ5CisgICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXTsgTG9hZCBzZWdtZW50IHJlZ2lzdGVycworICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KKworOyBNYXAgaW4gdGhlIHBhZ2UgdGFibGUgZm9yIG91ciB2aXJ0dWFsIGZyYW1lYnVmZmVyIGFyZWEgZm9yIG1vZGlmaWNhdGlvbgorCisgICAgICAgIG1vdiAgICAgZWRpLFtQREJSXSAgICAgICAgICA7IEVESSBwb2ludHMgdG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlZHgsZWJ4ICAgICAgICAgICAgIDsgRURYID0gbGluZWFyIGFkZHJlc3MKKyAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgIDsgRURYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5CisgICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlZGldICAgICA7IEVEWCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcworICAgICAgICBtb3YgICAgIGVheCxlZHgKKyAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KKyAgICAgICAgb3IgICAgICBlYXgsNworICAgICAgICBtb3YgICAgIFtlZHhdLGVheAorICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKKworOyBNYXJrIGFsbCBwYWdlcyB2YWxpZCBmb3IgdGhlIG5ldyBwYWdlIGZhdWx0IGFyZWEKKworICAgICAgICBtb3YgICAgIGVzaSxlYnggICAgICAgICAgICAgOyBFU0kgOj0gbGluZWFyIGFkZHJlc3MgZm9yIHBhZ2UKKyAgICAgICAgc2hyICAgICBlc2ksMTAKKyAgICAgICAgYW5kICAgICBlc2ksMEZGRmggICAgICAgICAgIDsgT2Zmc2V0IGludG8gcGFnZSB0YWJsZQorICAgICAgICBhZGQgICAgIGVzaSxbYWNjZXNzUGFnZUFkZHJdCitpZmRlZiAgIFVTRV9OQVNNCislYXNzaWduIG9mZiAwCislcmVwIDE2CisgICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCislYXNzaWduIG9mZiBvZmYrNAorJWVuZHJlcAorZWxzZQorb2ZmID0gMAorUkVQVCAgICAxNgorICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcworb2ZmID0gb2ZmKzQKK0VORE0KK2VuZGlmCisKKzsgTWFyayBhbGwgcGFnZXMgaW52YWxpZCBmb3IgdGhlIHByZXZpb3VzbHkgbWFwcGVkIGFyZWEKKworICAgICAgICB4Y2hnICAgIGVzaSxbTGFzdFBhZ2VdICAgICAgOyBTYXZlIGxhc3QgcGFnZSBmb3IgbmV4dCBwYWdlIGZhdWx0CisgICAgICAgIHRlc3QgICAgZXNpLGVzaQorICAgICAgICBqeiAgICAgIEBARG9uZU1hcHBpbmcgICAgICAgOyBEb250IHVwZGF0ZSBpZiBmaXJzdCB0aW1lIHJvdW5kCitpZmRlZiAgIFVTRV9OQVNNCislYXNzaWduIG9mZiAwCislcmVwIDE2CisgICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcworJWFzc2lnbiBvZmYgb2ZmKzQKKyVlbmRyZXAKK2Vsc2UKK29mZiA9IDAKK1JFUFQgICAgMTYKKyAgICAgICAgYW5kICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCitvZmYgPSBvZmYrNAorRU5ETQorZW5kaWYKKworQEBEb25lTWFwcGluZzoKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IEZsdXNoIHRoZSBUTEIKKworOyBOb3cgcHJvZ3JhbSB0aGUgbmV3IFN1cGVyVkdBIHN0YXJ0aW5nIGJhbmsgYWRkcmVzcworCisgICAgICAgIG1vdiAgICAgZWF4LGVieCAgICAgICAgICAgICA7IEVBWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKKyAgICAgICAgc2hyICAgICBlYXgsMTYKKyAgICAgICAgYW5kICAgICBlYXgsMEZGaCAgICAgICAgICAgIDsgTWFzayB0byAwLTI1NQorICAgICAgICBjYWxsICAgIFtCYW5rRnVuY1B0cl0gICAgICAgOyBDYWxsIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbgorCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBwb3BhZAorICAgICAgICBwb3AgICAgIGVheAorICAgICAgICBhZGQgICAgIGVzcCw0ICAgICAgICAgICAgICAgOyBQb3AgdGhlIGVycm9yIGNvZGUgZnJvbSBzdGFjaworICAgICAgICBpcmV0ZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gdG8gZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KKworQEBUb09sZEhhbmRsZXI6CisgICAgICAgIHBvcCAgICAgZWF4CitpZmRlZiAgIFVTRV9OQVNNCisgICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKK2Vsc2UKKyAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgorZW5kaWYKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUEZfaGFuZGxlcjRrICAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNGsgYmFua3MKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcworOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCis7IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKKzsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKKzsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQorOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCis7IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKKzsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBQRl9oYW5kbGVyNGsKKworOyBGaWxsIGluIHdoZW4gd2UgaGF2ZSB0ZXN0ZWQgYWxsIHRoZSA2NEtiIGNvZGUKKworaWZkZWYgICBVU0VfTkFTTQorICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCitlbHNlCisgICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKK2VuZGlmCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgSW5zdGFsbEZhdWx0SGFuZGxlcih2b2lkICpiYXNlQWRkcixpbnQgYmFua1NpemUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnN0YWxsZXMgdGhlIHBhZ2UgZmF1bHQgaGFuZGxlciBkaXJlY3RseSBpbnQgdGhlIGludGVycnVwdCBkZXNjcmlwdG9yCis7IHRhYmxlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyByaW5nIDAgYWNjZXNzLAorOyBidXQgbm9uZSBvZiB0aGlzIHN0dWZmIHdpbGwgcnVuIHdpdGhvdXQgcmluZyAwIQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluc3RhbGxGYXVsdEhhbmRsZXIKKworICAgICAgICBBUkcgICAgIGJhc2VBZGRyOlVMT05HLCBiYW5rU2l6ZTpVSU5UCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgW0RXT1JEIExhc3RQYWdlXSwwICA7IE5vIHBhZ2VzIGhhdmUgYmVlbiBtYXBwZWQKKyAgICAgICAgbW92ICAgICBheCxjcworICAgICAgICBtb3YgICAgIFtWYWxpZENTXSxheCAgICAgICAgOyBTYXZlIENTIHZhbHVlIGZvciBwYWdlIGZhdWx0cworCis7IFB1dCBhZGRyZXNzIG9mIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgaW50byB0aGUgSURUIGRpcmVjdGx5CisKKyAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKK2Vsc2UKKyAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKK2VuZGlmCisgICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAorICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0CisKKzsgTm90ZSB0aGF0IEludGVycnVwdCBnYXRlcyBkbyBub3QgaGF2ZSB0aGUgaGlnaCBhbmQgbG93IHdvcmQgb2YgdGhlCis7IG9mZnNldCBpbiBhZGphY2VudCB3b3JkcyBpbiBtZW1vcnksIHRoZXJlIGFyZSA0IGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KKworICAgICAgICBtb3YgICAgIGVjeCxbZWF4XSAgICAgICAgICAgOyBHZXQgY3MgYW5kIGxvdyAxNiBiaXRzIG9mIG9mZnNldAorICAgICAgICBtb3YgICAgIGVkeCxbZWF4KzZdICAgICAgICAgOyBHZXQgaGlnaCAxNiBiaXRzIG9mIG9mZnNldCBpbiBkeAorICAgICAgICBzaGwgICAgIGVkeCwxNgorICAgICAgICBtb3YgICAgIGR4LGN4ICAgICAgICAgICAgICAgOyBlZHggaGFzIG9mZnNldAorICAgICAgICBtb3YgICAgIFtJTlQxNE9mZnNldF0sZWR4ICAgOyBTYXZlIG9mZnNldAorICAgICAgICBzaHIgICAgIGVjeCwxNgorICAgICAgICBtb3YgICAgIFtJTlQxNFNlbGVjdG9yXSxjeCAgOyBTYXZlIG9yaWdpbmFsIGNzCisgICAgICAgIG1vdiAgICAgW2VheCsyXSxjcyAgICAgICAgICA7IEluc3RhbGwgbmV3IGNzCisgICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNjRrCisgICAgICAgIGNtcCAgICAgW1VJTlQgYmFua1NpemVdLDQKKyAgICAgICAgam5lICAgICBAQDEKKyAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI0aworQEAxOiAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAorICAgICAgICBzaHIgICAgIGVkeCwxNgorICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kIHJlc3RvcmVzIHRoZSBwcmV2aW91cworOyBwYWdlIGZhdWx0IGhhbmRsZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUmVtb3ZlRmF1bHRIYW5kbGVyCisKKyAgICAgICAgZW50ZXJfYworCis7IFJlbW92ZSBwYWdlIGZhdWx0IGhhbmRsZXIgZnJvbSBJRFQKKworICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjaworaWZkZWYgICBVU0VfTkFTTQorICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAorZWxzZQorICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAorZW5kaWYKKworICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKKyAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKKyAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAorICAgICAgICBtb3YgICAgIGN4LFtJTlQxNFNlbGVjdG9yXQorICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3ggICAgICAgICAgOyBSZXN0b3JlIG9yaWdpbmFsIENTCisgICAgICAgIG1vdiAgICAgZWR4LFtJTlQxNE9mZnNldF0KKyAgICAgICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKKyAgICAgICAgc2hyICAgICBlZHgsMTYKKyAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0CisKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnN0YWxscyB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgcmVsb2NhdGluZyBpdCBpbnRvIG91ciBkYXRhIHNlZ21lbnQKKzsgYW5kIG1ha2luZyBpdCBpbnRvIGEgY2FsbGFibGUgZnVuY3Rpb24uIFdlIGRvIGl0IHRoaXMgd2F5IHRvIG1ha2UgdGhlCis7IGNvZGUgaWRlbnRpY2FsIHRvIHRoZSB3YXkgdGhhdCB0aGUgVmZsYXREIGRldmljZXMgd29yayB1bmRlciBXaW5kb3dzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluc3RhbGxCYW5rRnVuYworCisgICAgICAgIEFSRyAgICAgY29kZUxlbjpVSU5ULCBiYW5rRnVuYzpEUFRSCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgZXNpLFtiYW5rRnVuY10gICAgICA7IENvcHkgdGhlIGNvZGUgaW50byBidWZmZXIKKyAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IEJhbmtGdW5jQnVmCisgICAgICAgIG1vdiAgICAgZWN4LFtjb2RlTGVuXQorICAgIHJlcCBtb3ZzYgorICAgICAgICBtb3YgICAgIFtCWVRFIGVkaV0sMEMzaCAgICAgOyBUZXJtaW5hdGUgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZWFyIHJldAorCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBJbml0UGFnaW5nKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbml0aWFsaXplcyBwYWdpbmcgc3lzdGVtLiBJZiBwYWdpbmcgaXMgbm90IGVuYWJsZWQsIGJ1aWxkcyBhIHBhZ2UgdGFibGUKKzsgZGlyZWN0b3J5IGFuZCBwYWdlIHRhYmxlcyBmb3IgcGh5c2ljYWwgbWVtb3J5Cis7Cis7ICAgRXhpdDogICAgICAgMCAgIC0gU3VjY2Vzc2Z1bAorOyAgICAgICAgICAgICAgIC0xICAtIENvdWxkbid0IGluaXRpYWxpemUgcGFnaW5nIG1lY2hhbmlzbQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluaXRQYWdpbmcKKworICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVjeAorICAgICAgICBwdXNoICAgIGVkeAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQorCis7IEFyZSB3ZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5PworCisgICAgICAgIG1vdiAgICAgYXgsMEZGRjloCisgICAgICAgIGludCAgICAgMzFoCisgICAgICAgIGpjICAgICAgQEBOb3RDYXVzZXdheQorICAgICAgICBjbXAgICAgIGVjeCwiQ0FVUyIKKyAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5CisgICAgICAgIGNtcCAgICAgZWR4LCJFV0FZIgorICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKKworICAgICAgICBtb3YgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMQorICAgICAgICBtb3YgICAgIFtDYXVzZVdheURJUkxpbmVhcl0sZXNpCisgICAgICAgIG1vdiAgICAgW0NhdXNlV2F5MXN0TGluZWFyXSxlZGkKKworOyBDaGVjayBmb3IgRFBNSQorCisgICAgICAgIG1vdiAgICAgYXgsMGZmMDBoCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgaW50ICAgICAzMWgKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBzaHIgICAgIGVkaSwyCisgICAgICAgIGFuZCAgICAgZWRpLDMKKyAgICAgICAgY21wICAgICBlZGksMgorICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm90IHN1cHBvcnRlZCB1bmRlciBEUE1JCisKKyAgICAgICAgbW92ICAgICBlYXgsW0NhdXNlV2F5RElSTGluZWFyXQorICAgICAgICBqbXAgICAgIEBAQ29weUNSMworCitAQE5vdENhdXNld2F5OgorICAgICAgICBtb3YgICAgIGF4LGNzCisgICAgICAgIHRlc3QgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgOyBXaGljaCByaW5nIGFyZSB3ZSBydW5uaW5nCisgICAgICAgIGpueiAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOZWVkcyB6ZXJvIHJpbmcgdG8gYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWdlIHRhYmxlcyAoQ1IzKQorICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKKyAgICAgICAgdGVzdCAgICBlYXgsODAwMDAwMDBoICAgICAgICAgICA7IElzIHBhZ2luZyBlbmFibGVkPworICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm8sIHdlIG11c3QgaGF2ZSBwYWdpbmchCisKKyAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgICAgICAgICA7IExvYWQgZGlyZWN0b3J5IGFkZHJlc3MKKyAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAorCitAQENvcHlDUjM6CisgICAgICAgIG1vdiAgICAgW1BEQlJdLGVheCAgICAgICAgICAgICAgOyBTYXZlIGl0CisgICAgICAgIG1vdiAgICAgZXNpLGVheAorICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgcGFnZURpcmVjdG9yeQorICAgICAgICBtb3YgICAgIGVjeCwxMDI0CisgICAgICAgIGNsZAorICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgQ29weSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKKyAgICAgICAgY21wICAgICBbRFdPUkQgYWNjZXNzUGFnZUFkZHJdLDA7IENoZWNrIGlmIHdlIGhhdmUgYWxsb2NhdGVkIHBhZ2UKKyAgICAgICAgam5lICAgICBAQEhhdmVSZWFsTWVtICAgICAgICAgICA7IHRhYmxlIGFscmVhZHkgKHdlIGNhbnQgZnJlZSBpdCkKKworICAgICAgICBtb3YgICAgIGVheCwwMTAwaCAgICAgICAgICAgICAgIDsgRFBNSSBET1MgYWxsb2NhdGUKKyAgICAgICAgbW92ICAgICBlYngsODE5Mi8xNgorICAgICAgICBpbnQgICAgIDMxaCAgICAgICAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgODE5MiBieXRlcworICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKKyAgICAgICAgc2hsICAgICBlYXgsNCAgICAgICAgICAgICAgICAgICA7IEVBWCBwb2ludHMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQorICAgICAgICBhZGQgICAgIGVheCw0MDk1CisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduCisgICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VBZGRyXSxlYXgKKworQEBIYXZlUmVhbE1lbToKKyAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXSAgICA7IEVBWCAtPiBwYWdlIHRhYmxlIGluIDFzdCBNYgorICAgICAgICBzaHIgICAgIGVheCwxMgorICAgICAgICBhbmQgICAgIGVheCwzRkZoICAgICAgICAgICAgICAgIDsgUGFnZSB0YWJsZSBvZmZzZXQKKyAgICAgICAgc2hsICAgICBlYXgsMgorICAgICAgICBjbXAgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMAorICAgICAgICBqeiAgICAgIEBATm90Q1cwCisgICAgICAgIG1vdiAgICAgZWJ4LFtDYXVzZVdheTFzdExpbmVhcl0KKyAgICAgICAgam1wICAgICBAQFB1dDFzdAorCitAQE5vdENXMDoKKyAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCisgICAgICAgIG1vdiAgICAgZWJ4LFtlYnhdCisgICAgICAgIGFuZCAgICAgZWJ4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIHRhYmxlIGZvciAxc3QgbWVnYWJ5dGUKKworQEBQdXQxc3Q6CisgICAgICAgIGFkZCAgICAgZWF4LGVieAorICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlVGFibGVdLGVheAorICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgTm8gZXJyb3IKKyAgICAgICAgam1wICAgICBAQEV4aXQKKworQEBFcnJFeGl0OgorICAgICAgICBtb3YgICAgIGVheCwtMQorCitAQEV4aXQ6IHBvcCAgICAgZWRpCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIHBvcCAgICAgZWR4CisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIENsb3NlUGFnaW5nKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDbG9zZXMgdGhlIHBhZ2luZyBzeXN0ZW0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBDbG9zZVBhZ2luZworCisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIHB1c2ggICAgZWRpCisKKyAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQorICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgUmVzdG9yZSBBY2Nlc3NQYWdlIG1hcHBpbmcKKyAgICAgICAgbW92ICAgICBlZGksW1BEQlJdCisgICAgICAgIG1vdiAgICAgZXNpLG9mZnNldCBwYWdlRGlyZWN0b3J5CisgICAgICAgIG1vdiAgICAgZWN4LDEwMjQKKyAgICAgICAgY2xkCisgICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQorCitAQEV4aXQ6IHBvcCAgICAgZWRpCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIHBvcCAgICAgZWR4CisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBsb25nIEFjY2Vzc1BhZ2UobG9uZyBwaHlzKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFwcyBhIGtub3duIHBhZ2UgdG8gZ2l2ZW4gcGh5c2ljYWwgbWVtb3J5Cis7ICAgRW50cnk6ICAgICAgRUFYIC0gUGh5c2ljYWwgbWVtb3J5Cis7ICAgRXhpdDogICAgICAgRUFYIC0gTGluZWFyIG1lbW9yeSBhZGRyZXNzIG9mIG1hcHBlZCBwaHlzIG1lbQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhdGljICAgICBBY2Nlc3NQYWdlCisKKyAgICAgICAgcHVzaCAgICBlZHgKKyAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KKyAgICAgICAgb3IgICAgICBlYXgsNworICAgICAgICBtb3YgICAgIFtlZHhdLGVheAorICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KKyAgICAgICAgcG9wICAgICBlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGxvbmcgR2V0UGh5c2ljYWxBZGRyZXNzKGxvbmcgbGluZWFyKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIgYWRkcmVzcworOyAgIEVudHJ5OiAgICAgIEVBWCAtIExpbmVhciBhZGRyZXNzIHRvIGNvbnZlcnQKKzsgICBFeGl0OiAgICAgICBFQVggLSBQaHlzaWNhbCBhZGRyZXNzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgICAgIEdldFBoeXNpY2FsQWRkcmVzcworCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIG1vdiAgICAgZWR4LGVheAorICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYIGlzIHRoZSBkaXJlY3Rvcnkgb2Zmc2V0CisgICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQorICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWJ4XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgbW92ICAgICBlYXgsZWR4CisgICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBBY2Nlc3MgdGhlIHBhZ2UgdGFibGUKKyAgICAgICAgbW92ICAgICBlZHgsZWF4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHNociAgICAgZWF4LDEyCisgICAgICAgIGFuZCAgICAgZWF4LDAzRkZoICAgICAgICAgICAgICAgOyBFQVggb2Zmc2V0IGludG8gcGFnZSB0YWJsZQorICAgICAgICBtb3YgICAgIGVheCxbZWR4K2VheCo0XSAgICAgICAgIDsgTG9hZCBwaHlzaWNhbCBhZGRyZXNzCisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKKyAgICAgICAgcG9wICAgICBlZHgKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgQ3JlYXRlUGFnZVRhYmxlKGxvbmcgcGFnZURFbnRyeSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENyZWF0ZXMgYSBwYWdlIHRhYmxlIGZvciBzcGVjaWZpYyBhZGRyZXNzICg0TUIpCis7ICAgICAgIEVudHJ5OiAgRUFYIC0gUGFnZSBkaXJlY3RvcnkgZW50cnkgKHRvcCAxMC1iaXRzIG9mIGFkZHJlc3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgICAgIENyZWF0ZVBhZ2VUYWJsZQorCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIHB1c2ggICAgZWRpCisgICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBlYXgsODE5MgorICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBjYWxsICAgIFZGX21hbGxvYyAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBwYWdlIHRhYmxlIGRpcmVjdG9yeQorICAgICAgICBhZGQgICAgIGVzcCw0CisgICAgICAgIGFkZCAgICAgZWF4LDBGRkZoCisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduICg0S0IpCisgICAgICAgIG1vdiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3MKKyAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEZpbGwgd2l0aCB6ZXJvCisgICAgICAgIG1vdiAgICAgZWN4LDEwMjQKKyAgICAgICAgY2xkCisgICAgICAgIHJlcCAgICAgc3Rvc2QgICAgICAgICAgICAgICAgICAgOyBDbGVhciBwYWdlIHRhYmxlCisgICAgICAgIHN1YiAgICAgZWRpLDQwOTYKKyAgICAgICAgbW92ICAgICBlYXgsZWRpCisgICAgICAgIGNhbGwgICAgR2V0UGh5c2ljYWxBZGRyZXNzCisgICAgICAgIG1vdiAgICAgZWR4LFtQREJSXQorICAgICAgICBvciAgICAgIGVheCw3ICAgICAgICAgICAgICAgICAgIDsgUHJlc2VudC93cml0ZS91c2VyIGJpdAorICAgICAgICBtb3YgICAgIFtlZHgrZWJ4KjRdLGVheCAgICAgICAgIDsgU2F2ZSBwaHlzaWNhbCBhZGRyZXNzIGludG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQorICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVkeAorICAgICAgICBwb3AgICAgIGVjeAorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNYXBzIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxpbmVhciBtZW1vcnkKKzsgICBFbnRyeTogICAgICBwQWRkciAgIC0gUGh5c2ljYWwgYWRkcmVzcworOyAgICAgICAgICAgICAgIGxBZGRyICAgLSBMaW5lYXIgYWRkcmVzcworOyAgICAgICAgICAgICAgIHBhZ2VzICAgLSBOdW1iZXIgb2YgNEsgcGFnZXMgdG8gbWFwCis7ICAgICAgICAgICAgICAgZmxhZ3MgICAtIFBhZ2UgZmxhZ3MKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAgID0gICAgICAgcHJlc2VudAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxICAgPSAgICAgICBSZWFkKDApL1dyaXRlKDEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgTWFwUGh5c2ljYWwyTGluZWFyCisKKyAgICAgICAgQVJHICAgICBwQWRkcjpVTE9ORywgbEFkZHI6VUxPTkcsIHBhZ2VzOlVJTlQsIHBmbGFnczpVSU5UCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIGFuZCAgICAgW1VMT05HIHBBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5CisgICAgICAgIGFuZCAgICAgW1VMT05HIGxBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5CisgICAgICAgIG1vdiAgICAgZWN4LFtwZmxhZ3NdCisgICAgICAgIGFuZCAgICAgZWN4LDExYiAgICAgICAgICAgICAgICAgOyBKdXN0IHR3byBiaXRzCisgICAgICAgIG9yICAgICAgZWN4LDEwMGIgICAgICAgICAgICAgICAgOyBTdXBlcnZpc29yIGJpdAorICAgICAgICBtb3YgICAgIFtwZmxhZ3NdLGVjeAorCisgICAgICAgIG1vdiAgICAgZWR4LFtsQWRkcl0KKyAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCA9IERpcmVjdG9yeQorICAgICAgICBtb3YgICAgIGVzaSxbUERCUl0KKyAgICAgICAgbW92ICAgICBlZGksW3BhZ2VzXSAgICAgICAgICAgICA7IEVESSBwYWdlIGNvdW50CisgICAgICAgIG1vdiAgICAgZWJ4LFtsQWRkcl0KKworQEBDcmVhdGVMb29wOgorICAgICAgICBtb3YgICAgIGVjeCxbZXNpK2VkeCo0XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgdGVzdCAgICBlY3gsMSAgICAgICAgICAgICAgICAgICA7IElzIGl0IHByZXNlbnQ/CisgICAgICAgIGpueiAgICAgQEBUYWJsZU9LCisgICAgICAgIG1vdiAgICAgZWF4LGVkeAorICAgICAgICBjYWxsICAgIENyZWF0ZVBhZ2VUYWJsZSAgICAgICAgIDsgQ3JlYXRlIGEgcGFnZSB0YWJsZQorQEBUYWJsZU9LOgorICAgICAgICBtb3YgICAgIGVheCxlYngKKyAgICAgICAgc2hyICAgICBlYXgsMTIKKyAgICAgICAgYW5kICAgICBlYXgsM0ZGaAorICAgICAgICBzdWIgICAgIGVheCwxMDI0CisgICAgICAgIG5lZyAgICAgZWF4ICAgICAgICAgICAgICAgICAgICAgOyBFQVggPSBwYWdlIGNvdW50IGluIHRoaXMgdGFibGUKKyAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgICAgICA7IE5leHQgdGFibGUKKyAgICAgICAgbW92ICAgICBlYngsMCAgICAgICAgICAgICAgICAgICA7IE5leHQgdGltZSB3ZSdsbCBtYXAgMUsgcGFnZXMKKyAgICAgICAgc3ViICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFN1YnRyYWN0IG1hcHBlZCBwYWdlcyBmcm9tIHBhZ2UgY291bnQKKyAgICAgICAgam5zICAgICBAQENyZWF0ZUxvb3AgICAgICAgICAgICA7IENyZWF0ZSBtb3JlIHRhYmxlcyBpZiBuZWNlc3NhcnkKKworICAgICAgICBtb3YgICAgIGVjeCxbcGFnZXNdICAgICAgICAgICAgIDsgRUNYID0gUGFnZSBjb3VudAorICAgICAgICBtb3YgICAgIGVzaSxbbEFkZHJdCisgICAgICAgIHNociAgICAgZXNpLDEyICAgICAgICAgICAgICAgICAgOyBPZmZzZXQgcGFydCBpc24ndCBuZWVkZWQKKyAgICAgICAgbW92ICAgICBlZGksW3BBZGRyXQorQEBNYXBwaW5nTG9vcDoKKyAgICAgICAgbW92ICAgICBlYXgsZXNpCisgICAgICAgIHNociAgICAgZWF4LDEwICAgICAgICAgICAgICAgICAgOyBFQVggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCisgICAgICAgIG1vdiAgICAgZWF4LFtlYXgqNCtlYnhdICAgICAgICAgOyBFQVggPSBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlCisgICAgICAgIG1vdiAgICAgZWJ4LGVzaQorICAgICAgICBhbmQgICAgIGVieCwzRkZoICAgICAgICAgICAgICAgIDsgRUJYID0gb2Zmc2V0IHRvIHBhZ2UgdGFibGUKKyAgICAgICAgbW92ICAgICBlZHgsZWRpCisgICAgICAgIGFkZCAgICAgZWRpLDQwOTYgICAgICAgICAgICAgICAgOyBOZXh0IHBoeXNpY2FsIGFkZHJlc3MKKyAgICAgICAgaW5jICAgICBlc2kgICAgICAgICAgICAgICAgICAgICA7IE5leHQgbGluZWFyIHBhZ2UKKyAgICAgICAgb3IgICAgICBlZHgsW3BmbGFnc10gICAgICAgICAgICA7IFVwZGF0ZSBmbGFncy4uLgorICAgICAgICBtb3YgICAgIFtlYXgrZWJ4KjRdLGVkeCAgICAgICAgIDsgU3RvcmUgcGFnZSB0YWJsZSBlbnRyeQorICAgICAgICBsb29wICAgIEBATWFwcGluZ0xvb3AKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQorCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF92ZmxhdAorCitlbmRpZgorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxMTdjNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgRE9TCisqCisqIERlc2NyaXB0aW9uOiAgTVNET1Mgc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXh0ZXJuYWwgdGltaW5nIGZ1bmN0aW9uICovCisKK3ZvaWQgX19aVGltZXJJbml0KHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RvIG5vdGhpbmcgZm9yIERPUyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RvIG5vdGhpbmcgZm9yIERPUyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQoreworICAgIHVsb25nICAgcmVzb2x1dGlvbjsKKworICAgIF9fWlRpbWVySW5pdCgpOworICAgIFVMWlRpbWVyUmVzb2x1dGlvbigmcmVzb2x1dGlvbik7CisgICAgZnJlcS0+bG93ID0gKHVsb25nKSgxMDAwMDAwMDAwMC4wIC8gcmVzb2x1dGlvbik7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+bG93ID0gVUxaUmVhZFRpbWUoKSAqIDEwMDAwTDsgIFwKKyAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWNiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IERPUworKgorKiBEZXNjcmlwdGlvbjogIDMyLWJpdCBET1MgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCisqICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2lib29sIF9WQVJBUEkgICBfRVZUX3VzZUV2ZW50cyA9IHRydWU7ICAvKiBUcnVlIHRvIHVzZSBldmVudCBoYW5kbGluZyAgICovCitpYm9vbCBfVkFSQVBJICAgX0VWVF9pbnN0YWxsZWQgPSAwOyAgICAgLyogRXZlbnQgaGFuZGVycyBpbnN0YWxsZWQ/ICAgICAqLwordWNoYXIgX1ZBUkFQSSAgICpfRVZUX2Jpb3NQdHIgPSBOVUxMOyAgIC8qIFBvaW50ZXIgdG8gdGhlIEJJT1MgZGF0YSBhcmVhICovCitzdGF0aWMgaWJvb2wgICAgaGF2ZU1vdXNlID0gZmFsc2U7ICAgICAgLyogVHJ1ZSBpZiB3ZSBoYXZlIGEgbW91c2UgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCisKK3ZvaWQgICAgRVZUQVBJIF9FVlRfcG9sbEpveXN0aWNrKHZvaWQpOwordWludCAgICBFVlRBUEkgX0VWVF9kaXNhYmxlSW50KHZvaWQpOwordWludCAgICBFVlRBUEkgX0VWVF9yZXN0b3JlSW50KHVpbnQgZmxhZ3MpOwordm9pZCAgICBFVlRBUEkgX0VWVF9jb2RlU3RhcnQodm9pZCk7Cit2b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVFbmQodm9pZCk7Cit2b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlU3RhcnQodm9pZCk7Cit2b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlRW5kKHZvaWQpOworaW50ICAgICBFVlRBUEkgX0VWVF9nZXRLZXlDb2RlKHZvaWQpOwordm9pZCAgICBFVlRBUEkgX0VWVF9wdW1wTWVzc2FnZXModm9pZCk7CitpbnQgICAgIEVWVEFQSSBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KTsKK3ZvaWQgICAgRVZUQVBJIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKTsKKworI2lmZGVmIE5PX0tFWUJPQVJEX0lOVEVSUlVQVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHVtcCBhbGwga2V5Ym9hcmQgbWVzc2FnZXMgZnJvbSB0aGUgQklPUyBrZXlib2FyZAoraGFuZGxlciBpbnRvIG91ciBldmVudCBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCB1c2luZyB0aGUKK2luc3RhbGxhYmxlIGtleWJvYXJkIGhhbmRsZXIgaWYgdGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEVWVEFQSSBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQoreworICAgIFJNUkVHUyAgcmVnczsKKwl1aW50ICAgIGtleSxwczsKKworCS8qIFNpbmNlIHRoZSBrZXlib2FyZCBJU1IgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpZiBOT19JREVfQlVHIGhhcworCSAqIGJlZW4gZGVmaW5lZCwgd2UgZmlyc3QgY2hlY2sgZm9yIGFueSBwZW5kaW5nIGtleWJvYXJkIGV2ZW50cworCSAqIGhlcmUsIGFuZCBpZiB0aGVyZSBhcmUgc29tZSBpbnNlcnQgdGhlbSBpbnRvIHRoZSBldmVudCBxdWV1ZSB0bworCSAqIGJlIHBpY2tlZCB1cCBsYXRlciAtIHdoYXQgYSBrbHVkZ2UuCisJICovCisJd2hpbGUgKChrZXkgPSBfRVZUX2dldEtleUNvZGUoKSkgIT0gMCkgeworCQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOworCQlhZGRLZXlFdmVudChFVlRfS0VZRE9XTiwga2V5KTsKKwkJX0VWVF9yZXN0b3JlSW50KHBzKTsKKwkJfQorCisgICAgcmVncy54LmF4ID0gMHgwQjsgICAgICAgICAgIC8vIFJlc2V0IE1vdmUgTW91c2UKKyAgICBQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KK3N0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCit0aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCitldmVudHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQoreworICAgIHJldHVybiAodWxvbmcpUE1fZ2V0TG9uZyhfRVZUX2Jpb3NQdHIrMHg2QykgKiA1NVVMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYm9vdHMgdGhlIG1hY2hpbmUgZnJvbSBET1MgKHdhcm0gYm9vdCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZWJvb3Qodm9pZCkKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisgICAgUE1TUkVHUyBzcmVnczsKKworICAgIHVzaG9ydCAqcmVib290VHlwZSA9IFBNX21hcFJlYWxQb2ludGVyKDB4NDAsMHg3Mik7CisgICAgKnJlYm9vdFR5cGUgPSAweDEyMzQ7CisgICAgUE1fY2FsbFJlYWxNb2RlKDB4RkZGRiwweDAwMDAsJnJlZ3MsJnNyZWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbmNsdWRlIGdlbmVyaWMgcmF3IHNjYW5jb2RlIGtleWJvYXJkIG1vZHVsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNVUFBPUlRfQ1RSTF9BTFRfREVMCisjaW5jbHVkZSAiY29tbW9uL2tleWJvYXJkLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBmb29scyB0aGUgRE9TIG1vdXNlIGRyaXZlciBpbnRvIHRoaW5raW5nIHRoYXQgaXQgaXMgcnVubmluZworaW4gZ3JhcGhpY3MgbW9kZSwgcmF0aGVyIHRoYW4gdGV4dCBtb2RlIHNvIHdlIGFsd2F5cyBnZXQgdmlydHVhbCBjb29yZGluYXRlcworY29ycmVjdGx5IHJhdGhlciB0aGFuIGNoYXJhY3RlciBjb29yZGluYXRlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX0VWVF9mb29sTW91c2Uodm9pZCkKK3sKKyAgICBpbnQgb2xkbW9kZSA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4NDkpOworICAgIFBNX3NldEJ5dGUoX0VWVF9iaW9zUHRyKzB4NDksMHgxMCk7CisgICAgb2xkbW9kZSB8PSAoRVZUX3JkaW54KDB4M0M0LDB4MikgPDwgOCk7CisgICAgcmV0dXJuIG9sZG1vZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiB1bmZvb2xzIHRoZSBET1MgbW91c2UgZHJpdmVyIGFmdGVyIHdlIGhhdmUgZmluaXNoZWQgY2FsbGluZyBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfdW5mb29sTW91c2UoCisgICAgaW50IG9sZG1vZGUpCit7CisgICAgUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSxvbGRtb2RlKTsKKworICAgIC8qIFNvbWUgbW91c2UgZHJpdmVycyByZXNldCB0aGUgcGxhbmUgbWFzayByZWdpc3RlciBmb3IgVkdBIHBsYW5lIDQKKyAgICAgKiBtb2Rlcywgd2hpY2ggc2NyZXdzIHVwIHRoZSBkaXNwbGF5IG9uIHNvbWUgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcnMKKyAgICAgKiBpbiBTdXBlclZHQSBtb2Rlcy4gV2UgcmVzZXQgdGhlIHZhbHVlIGJhY2sgYWdhaW4gaW4gaGVyZSB0byBzb2x2ZQorICAgICAqIHRoZSBwcm9ibGVtLgorICAgICAqLworICAgIEVWVF93cmlueCgweDNDNCwweDIsb2xkbW9kZSA+PiA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZXRlcm1pbmVzIGlmIHdlIGhhdmUgYSBtb3VzZSBhdHRhY2hlZCBhbmQgZnVuY3Rpb25pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIGRldGVjdE1vdXNlKHZvaWQpCit7CisgICAgUk1SRUdTICByZWdzOworICAgIFJNU1JFR1Mgc3JlZ3M7CisgICAgdWNoYXIgICAqcDsKKyAgICBpYm9vbCAgIHJldHZhbDsKKworICAgIHJlZ3MueC5heCA9IDB4MzUzMzsgICAgICAgICAgICAgICAgIC8qIEdldCBpbnRlcnJ1cHQgdmVjdG9yIDB4MzMgICAgKi8KKyAgICBQTV9pbnQ4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOworCisgICAgLyogQ2hlY2sgdGhhdCBpbnRlcnJ1cHQgdmVjdG9yIDB4MzMgaXMgbm90IGEgemVybywgYW5kIHRoYXQgdGhlIGZpcnN0CisgICAgICogaW5zdHJ1Y3Rpb24gaW4gdGhlIGludGVycnVwdCB2ZWN0b3IgaXMgbm90IGFuIElSRVQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoc3JlZ3MuZXMsIHJlZ3MueC5ieCk7CisgICAgcmV0dmFsID0gKChzcmVncy5lcyAhPSAwKSB8fCAocmVncy54LmJ4ICE9IDApKSAmJiAoUE1fZ2V0Qnl0ZShwKSAhPSAyMDcpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgord2hhdCAgICAgICAgLSBFdmVudCBjb2RlCittZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKK3gseSAgICAgICAgIC0gTW91c2UgcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAorYnV0X3N0YXQgICAgLSBNb3VzZSBidXR0b24gc3RhdHVzIGF0IHRpbWUgb2YgZXZlbnQKKworUkVNQVJLUzoKK0FkZHMgYSBuZXcgbW91c2UgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gd2l0aGluCit0aGUgbW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUsIHNvIGl0IG11c3QgYmUgZWZmaWNpZW50LgorCitOT1RFOiAgIEludGVycnVwdHMgTVVTVCBiZSBPRkYgd2hpbGUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBlbnN1cmUgd2UgaGF2ZQorICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgICAgICAgIGludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFkZE1vdXNlRXZlbnQoCisgICAgdWludCB3aGF0LAorICAgIHVpbnQgbWVzc2FnZSwKKyAgICBpbnQgeCwKKyAgICBpbnQgeSwKKyAgICBpbnQgbWlja2V5WCwKKyAgICBpbnQgbWlja2V5WSwKKyAgICB1aW50IGJ1dF9zdGF0KQoreworICAgIGV2ZW50X3QgZXZ0OworCisgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQuICovCisgICAgICAgIGV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOworICAgICAgICBldnQud2hhdCA9IHdoYXQ7CisgICAgICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OworICAgICAgICBldnQud2hlcmVfeCA9IHg7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbW91c2UgZXZlbnQgcG9zaXRpb24gICAgKi8KKyAgICAgICAgZXZ0LndoZXJlX3kgPSB5OworICAgICAgICBldnQucmVsYXRpdmVfeCA9IG1pY2tleVg7CisgICAgICAgIGV2dC5yZWxhdGl2ZV95ID0gbWlja2V5WTsKKyAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlQua2V5TW9kaWZpZXJzOworICAgICAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21hc2sgICAgICAgIC0gRXZlbnQgbWFzaworYnV0c3RhdGUgICAgLSBCdXR0b24gc3RhdGUKK3ggICAgICAgICAgIC0gTW91c2UgeCBjb29yZGluYXRlCit5ICAgICAgICAgICAtIE1vdXNlIHkgY29vcmRpbmF0ZQorCitSRU1BUktTOgorTW91c2UgZXZlbnQgaGFuZGxpbmcgcm91dGluZS4gVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgbW91c2UgZXZlbnQgb2NjdXJzLAorYW5kIHdlIGNhbGwgdGhlIGFkZE1vdXNlRXZlbnQoKSByb3V0aW5lIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbW91c2UgZXZlbnQKK3RvIHRoZSBldmVudCBxdWV1ZS4KKworTm90ZTogSW50ZXJydXB0cyBhcmUgT04gd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBFVlRBUEkgbW91c2VJU1IoCisgICAgdWludCBtYXNrLAorICAgIHVpbnQgYnV0c3RhdGUsCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IG1pY2tleVgsCisgICAgaW50IG1pY2tleVkpCit7CisgICAgdWludCAgICBwczsKKyAgICB1aW50ICAgIGJ1dHRvbk1hc2s7CisKKyAgICBpZiAobWFzayAmIDEpIHsKKyAgICAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBtb3VzZSBjb29yZGluYXRlcyAqLworICAgICAgICBFVlQubXggPSB4OyBFVlQubXkgPSB5OworCisgICAgICAgIC8qIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIG1vdmVtZW50IGV2ZW50LCB0aGVuIG1vZGlmeSB0aGUgbGFzdAorICAgICAgICAgKiBldmVudCByYXRoZXIgdGhhbiBwb3N0IGEgbmV3IG9uZSwgc28gdGhhdCB0aGUgcXVldWUgd2lsbCBub3QKKyAgICAgICAgICogYmVjb21lIHNhdHVyYXRlZC4gQmVmb3JlIHdlIG1vZGlmeSB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCB3ZQorICAgICAgICAgKiBNVVNUIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4KKyAgICAgICAgICovCisgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgeworICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSB4OyAgLyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KKyAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0geTsKKyAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7CisgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeSArPSBtaWNrZXlZOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAgICAgICAgIC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KKyAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFTU9WRSwwLHgseSxtaWNrZXlYLG1pY2tleVksYnV0c3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICB9CisgICAgaWYgKG1hc2sgJiAweDJBKSB7CisgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgIGJ1dHRvbk1hc2sgPSAwOworICAgICAgICBpZiAobWFzayAmIDIpICBidXR0b25NYXNrIHw9IEVWVF9MRUZUQk1BU0s7CisgICAgICAgIGlmIChtYXNrICYgOCkgIGJ1dHRvbk1hc2sgfD0gRVZUX1JJR0hUQk1BU0s7CisgICAgICAgIGlmIChtYXNrICYgMzIpIGJ1dHRvbk1hc2sgfD0gRVZUX01JRERMRUJNQVNLOworICAgICAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRURPV04sYnV0dG9uTWFzayx4LHksMCwwLGJ1dHN0YXRlKTsKKyAgICAgICAgRVZULm9sZE1vdmUgPSAtMTsKKyAgICAgICAgX0VWVF9yZXN0b3JlSW50KHBzKTsKKyAgICAgICAgfQorICAgIGlmIChtYXNrICYgMHg1NCkgeworICAgICAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOworICAgICAgICBidXR0b25NYXNrID0gMDsKKyAgICAgICAgaWYgKG1hc2sgJiAyKSAgYnV0dG9uTWFzayB8PSBFVlRfTEVGVEJNQVNLOworICAgICAgICBpZiAobWFzayAmIDgpICBidXR0b25NYXNrIHw9IEVWVF9SSUdIVEJNQVNLOworICAgICAgICBpZiAobWFzayAmIDMyKSBidXR0b25NYXNrIHw9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VVUCxidXR0b25NYXNrLHgseSwwLDAsYnV0c3RhdGUpOworICAgICAgICBFVlQub2xkTW92ZSA9IC0xOworICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICB9CisgICAgRVZULm9sZEtleSA9IC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0tleWJvYXJkIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uLgorCitOT1RFOiAgIEludGVycnVwdHMgYXJlIE9GRiB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGtleWJvYXJkIElTUiwKKyAgICAgICAgYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBFVlRBUEkga2V5Ym9hcmRJU1Iodm9pZCkKK3sKKyAgICBwcm9jZXNzUmF3U2NhbkNvZGUoUE1faW5wYigweDYwKSk7CisgICAgUE1fb3V0cGIoMHgyMCwweDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX2Fib3J0KCkKK3sKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgaW50ICAgICBpOworCisgICAgUE1faW5pdCgpOworICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7CisgICAgX0VWVF9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKKyAgICBFVlRfcmVzdW1lKCk7CisKKyAgICAvKiBHcmFiIGFsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlIGtleWJvYXJkIGJ1ZmZlciBhbmQgc3R1ZmYKKyAgICAgKiB0aGVtIGludG8gb3VyIGV2ZW50IGJ1ZmZlci4gVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCBhbnkga2V5cHJlc3NlcworICAgICAqIHdoaWxlIHRoZSBwcm9ncmFtIGlzIGluaXRpYWxpc2luZy4KKyAgICAgKi8KKyAgICB3aGlsZSAoKGkgPSBfRVZUX2dldEtleUNvZGUoKSkgIT0gMCkKKyAgICAgICAgYWRkS2V5RXZlbnQoRVZUX0tFWURPV04saSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KK2NhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAorYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9yZXN1bWUodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdDsKKyAgICB1Y2hhciAgICAgICAgICAgbW9kczsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KKworICAgIGlmIChfRVZUX3VzZUV2ZW50cykgeworICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSBhbmQgZW5hYmxlIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KKyAgICAgICAgaW5pdEV2ZW50UXVldWUoKTsKKyNpZm5kZWYgTk9fS0VZQk9BUkRfSU5URVJSVVBUCisgICAgICAgIFBNX3NldEtleUhhbmRsZXIoa2V5Ym9hcmRJU1IpOworI2VuZGlmCisjaWZuZGVmIE5PX01PVVNFX0lOVEVSUlVQVAorICAgICAgICBpZiAoKGhhdmVNb3VzZSA9IGRldGVjdE1vdXNlKCkpICE9IDApIHsKKyAgICAgICAgICAgIGludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKKyAgICAgICAgICAgIFBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsbW91c2VJU1IpOworICAgICAgICAgICAgX0VWVF91bmZvb2xNb3VzZShvbGRtb2RlKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIFJlYWQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGZyb20gdGhlIEJJT1MgdG8gZ2V0IHRoZQorICAgICAgICAgKiBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIHN0YXRlLiBUaGUgb25seSBzdGF0ZSB3ZSBjYXJlIGFib3V0IGlzCisgICAgICAgICAqIHRoZSBjb3JyZWN0IHRvZ2dsZSBzdGF0ZSBmbGFncyBzdWNoIGFzIFNDUk9MTExPQ0ssIE5VTUxPQ0sgYW5kCisgICAgICAgICAqIENBUFNMT0NLLgorICAgICAgICAgKi8KKyAgICAgICAgRVZULmtleU1vZGlmaWVycyA9IDA7CisgICAgICAgIG1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KTsKKyAgICAgICAgaWYgKG1vZHMgJiAweDEwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfU0NST0xMTE9DSzsKKyAgICAgICAgaWYgKG1vZHMgJiAweDIwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfTlVNTE9DSzsKKyAgICAgICAgaWYgKG1vZHMgJiAweDQwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfQ0FQU0xPQ0s7CisKKyAgICAgICAgLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0CisgICAgICAgICAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKKyAgICAgICAgICogdW5kZXIgcmVhbCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIC8qIEl0IGlzIGRpZmZpY3VsdCB0byBlbnN1cmUgdGhhdCB3ZSBsb2NrIG91ciBnbG9iYWwgZGF0YSwgc28gd2UKKyAgICAgICAgICAgICAqIGRvIHRoaXMgYnkgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgbG9ja2luZyBhbGwgZGF0YQorICAgICAgICAgICAgICogMktiIG9uIGVpdGhlciBzaWRlLiBUaGlzIHNob3VsZCBwcm9wZXJseSBjb3ZlciB0aGUgZ2xvYmFsIGRhdGEKKyAgICAgICAgICAgICAqIHVzZWQgYnkgdGhlIG1vZHVsZSAodGhlIG90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGRlY2xhcmUgdGhlCisgICAgICAgICAgICAgKiB2YXJpYWJsZXMgaW4gYXNzZW1ibGVyLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgaXQgd2lsbCBiZQorICAgICAgICAgICAgICogY29ycmVjdCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXQgID0gIVBNX2xvY2tEYXRhUGFnZXMoJkVWVCxzaXplb2YoRVZUKSwmbGgpOworICAgICAgICAgICAgc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX0VWVF9iaW9zUHRyLHNpemVvZihfRVZUX2Jpb3NQdHIpLCZsaCk7CisgICAgICAgICAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jQ29kZVN0YXJ0LChpbnQpX0VWVF9jQ29kZUVuZC0oaW50KV9FVlRfY0NvZGVTdGFydCwmbGgpOworICAgICAgICAgICAgc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9FVlRfY29kZVN0YXJ0LChpbnQpX0VWVF9jb2RlRW5kLShpbnQpX0VWVF9jb2RlU3RhcnQsJmxoKTsKKyAgICAgICAgICAgIGlmIChzdGF0KSB7CisgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiUGFnZSBsb2NraW5nIHNlcnZpY2VzIGZhaWxlZCAtIGludGVycnVwdCBoYW5kbGluZyBub3Qgc2FmZSEiKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2tlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLworICAgICAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7CisgICAgICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOworICAgICAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKKyAgICAgICAgX0VWVF9pbnN0YWxsZWQgPSB0cnVlOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgaWYgKGhhdmVNb3VzZSkgeworICAgICAgICBpbnQgb2xkbW9kZSA9IF9FVlRfZm9vbE1vdXNlKCk7CisgICAgICAgIFBNX3Jlc2V0TW91c2VEcml2ZXIoMSk7CisgICAgICAgIHJlZ3MueC5heCA9IDc7ICAvKiBNb3VzZSBmdW5jdGlvbiA3IC0gU2V0IGhvcml6b250YWwgbWluIGFuZCBtYXggKi8KKyAgICAgICAgcmVncy54LmN4ID0gMDsKKyAgICAgICAgcmVncy54LmR4ID0geFJlczsKKyAgICAgICAgUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7CisgICAgICAgIHJlZ3MueC5heCA9IDg7ICAvKiBNb3VzZSBmdW5jdGlvbiA4IC0gU2V0IHZlcnRpY2FsIG1pbiBhbmQgbWF4ICAgKi8KKyAgICAgICAgcmVncy54LmN4ID0gMDsKKyAgICAgICAgcmVncy54LmR4ID0geVJlczsKKyAgICAgICAgUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7CisgICAgICAgIF9FVlRfdW5mb29sTW91c2Uob2xkbW9kZSk7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK01vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAorYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfc2V0TW91c2VQb3MoCisgICAgaW50ICp4LAorICAgIGludCAqeSkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoaGF2ZU1vdXNlKSB7CisgICAgICAgIGludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKKyAgICAgICAgcmVncy54LmF4ID0gNDsgICAgICAvKiBNb3VzZSBmdW5jdGlvbiA0IC0gU2V0IG1vdXNlIHBvc2l0aW9uICAgICovCisgICAgICAgIHJlZ3MueC5jeCA9ICp4OyAgICAgLyogTmV3IGhvcml6b250YWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgICAqLworICAgICAgICByZWdzLnguZHggPSAqeTsgICAgIC8qIE5ldyB2ZXJ0aWNhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7CisgICAgICAgIF9FVlRfdW5mb29sTW91c2Uob2xkbW9kZSk7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCkKK3sKKyAgICB1Y2hhciAgIG1vZHM7CisKKyAgICBpZiAoX0VWVF9pbnN0YWxsZWQpIHsKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IGhhbmRsZXJzICovCisgICAgICAgIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKCk7CisgICAgICAgIGlmIChoYXZlTW91c2UpCisgICAgICAgICAgICBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7CisgICAgICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKKyAgICAgICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7CisgICAgICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisgICAgICAgIC8qIFNldCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MgaW4gdGhlIEJJT1MgdG8gb3VyIHZhbHVlcyAqLworICAgICAgICBFVlRfYWxsb3dMRURTKHRydWUpOworICAgICAgICBtb2RzID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNykgJiB+MHg3MDsKKyAgICAgICAgaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfU0NST0xMTE9DSykKKyAgICAgICAgICAgIG1vZHMgfD0gMHgxMDsKKyAgICAgICAgaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfTlVNTE9DSykKKyAgICAgICAgICAgIG1vZHMgfD0gMHgyMDsKKyAgICAgICAgaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spCisgICAgICAgICAgICBtb2RzIHw9IDB4NDA7CisgICAgICAgIFBNX3NldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcsbW9kcyk7CisKKyAgICAgICAgLyogRmxhZyB0aGF0IHdlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkICovCisgICAgICAgIF9FVlRfaW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0V4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfZXhpdCh2b2lkKQoreworICAgIEVWVF9zdXNwZW5kKCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZThlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaApAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYWNkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG0uYwpAQCAtMCwwICsxLDIyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDE2LzMyIGJpdCBET1MKKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgInp0aW1lcmMuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisjaW5jbHVkZSAicG1faGVscC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZG9zLmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpZmRlZiAgX19HTlVDX18KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbmVhcnB0ci5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZWxzZQorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2VuZGlmCisjaWZkZWYgIF9fQk9STEFORENfXworI3ByYWdtYSB3YXJuIC1wYXIKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICBvbGRNb2RlOworICAgIGludCAgICAgb2xkNTBMaW5lczsKKyAgICB9IERPU19zdGF0ZUJ1ZjsKKworI2RlZmluZSBNQVhfUk1fQkxPQ0tTICAgMTAKKworc3RhdGljIHN0cnVjdCB7CisgICAgdm9pZCAgICAqcDsKKyAgICB1aW50ICAgIHRhZzsKKyAgICB9IHJtQmxvY2tzW01BWF9STV9CTE9DS1NdOworCitzdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KK3N0YXRpYyB2b2lkICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLworc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCitzdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KK3N0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Cit1c2hvcnQgX1ZBUkFQSSAgX1BNX3NhdmVkRFMgPSAwOworI2lmZGVmICBET1M0R1cKK3N0YXRpYyB1bG9uZyAgICBQREIgPSAwLCpwUERCID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBSRUFMTU9ERQorc3RhdGljIGNoYXIgICAgIFZYRF9uYW1lW10gPSBQTUhFTFBfTkFNRTsKK3N0YXRpYyBjaGFyICAgICBWWERfbW9kdWxlW10gPSBQTUhFTFBfTU9EVUxFOworc3RhdGljIGNoYXIgICAgIFZYRF9EREJOYW1lW10gPSBQTUhFTFBfRERCTkFNRTsKK3N0YXRpYyB1aW50ICAgICBWWERfdmVyc2lvbiA9IC0xOworc3RhdGljIHVpbnQgICAgIFZYRF9sb2FkT2ZmID0gMDsKK3N0YXRpYyB1aW50ICAgICBWWERfbG9hZFNlbCA9IDA7Cit1aW50IF9WQVJBUEkgICAgX1BNX1ZYRF9vZmYgPSAwOwordWludCBfVkFSQVBJICAgIF9QTV9WWERfc2VsID0gMDsKK2ludCBfVkFSQVBJICAgICBfUE1faGF2ZUNhdXNlV2F5ID0gLTE7CisKKy8qIE1lbW9yeSBtYXBwaW5nIGNhY2hlICovCisKKyNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAxMDAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgIHBoeXNpY2FsOworICAgIHVsb25nICAgbGluZWFyOworICAgIHVsb25nICAgbGltaXQ7CisgICAgfSBtbWFwcGluZzsKK3N0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKK3N0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcyA9IDA7CisKKy8qIFBhZ2Ugc2l6ZWQgYmxvY2sgY2FjaGUgKi8KKworI2RlZmluZSBQQUdFU19QRVJfQkxPQ0sgICAgIDEwMAorI2RlZmluZSBGUkVFTElTVF9ORVhUKHApICAgICgqKHZvaWQqKikocCkpCit0eXBlZGVmIHN0cnVjdCBwYWdlYmxvY2sgeworICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKm5leHQ7CisgICAgc3RydWN0IHBhZ2VibG9jayAgICAqcHJldjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdFN0YXJ0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0RW5kOworICAgIGludCAgICAgICAgICAgICAgICAgZnJlZUNvdW50OworICAgIH0gcGFnZWJsb2NrOworc3RhdGljIHBhZ2VibG9jayAgICAqcGFnZUJsb2NrcyA9IE5VTEw7CisjZW5kaWYKKworLyogU3RhcnQgb2YgYWxsIHBhZ2UgdGFibGVzIGluIENhdXNlV2F5ICovCisKKyNkZWZpbmUgQ1dfUEFHRV9UQUJMRV9TVEFSVCAoMTAyNFVMKjQwOTZVTCoxMDIzVUwpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KKwordWxvbmcgICBfQVNNQVBJIF9QTV9nZXRQREIodm9pZCk7CitpbnQgICAgIF9BU01BUEkgX1BNX3BhZ2luZ0VuYWJsZWQodm9pZCk7Cit2b2lkICAgIF9BU01BUEkgX1BNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MsdWludCBvZmYsdWludCBzZWwpOworCisjaWZuZGVmIFJFQUxNT0RFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0V4aXQgZnVuY3Rpb24gdG8gdW5sb2FkIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgVnhECisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgVW5sb2FkVnhEKHZvaWQpCit7CisgICAgUE1TUkVHUyAgICAgc3JlZ3M7CisgICAgVlhEX3JlZ3MgICAgcjsKKworICAgIHIuZWF4ID0gMjsKKyAgICByLmVieCA9IDA7CisgICAgci5lZHggPSAodWludClWWERfbW9kdWxlOworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyNpZmRlZiAgX18xNkJJVF9fCisgICAgci5kcyA9ICgodWxvbmcpVlhEX21vZHVsZSkgPj4gMTY7CisjZWxzZQorICAgIHIuZHMgPSBzcmVncy5kczsKKyNlbmRpZgorICAgIHIuZXMgPSBzcmVncy5lczsKKyAgICBfUE1fVnhEQ2FsbCgmcixWWERfbG9hZE9mZixWWERfbG9hZFNlbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRXh0ZXJuYWwgZnVuY3Rpb24gdG8gY2FsbCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9WeERDYWxsKAorICAgIFZYRF9yZWdzICpyZWdzKQoreworICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApCisgICAgICAgIF9QTV9WeERDYWxsKHJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0JDRCBjb2RlZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELCBvciAwIGlmIG5vdCBsb2FkZWQgKGllOiAweDIwMiAtIDIuMikKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWeEQgdGhhdCB3ZSBoYXZlIGNvbm5lY3RlZCB0by4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpCit7CisgICAgVlhEX3JlZ3MgICAgcjsKKworICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlciAqLworICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApIHsKKyAgICAgICAgbWVtc2V0KCZyLDAsc2l6ZW9mKHIpKTsKKyAgICAgICAgci5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRWRVIpOworICAgICAgICBfUE1fVnhEQ2FsbCgmcixfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7CisgICAgICAgIHJldHVybiBWWERfdmVyc2lvbiA9ICh1aW50KXIuZWF4OworICAgICAgICB9CisgICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ29ubmVjdHMgdG8gdGhlIGhlbHBlciBWeEQgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyCisKK1JFVFVSTlM6CitUcnVlIGlmIHRoZSBWeEQgd2FzIGZvdW5kIGFuZCBsb2FkZWQsIGZhbHNlIG90aGVyd2lzZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gY29ubmVjdHMgdG8gdGhlIFZ4RCAobG9hZGluZyBpdCBpZiBpdCBpcyBkeW5hbWljYWxseSBsb2FkYWJsZSkKK2FuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBQTUhFTFBfY29ubmVjdCh2b2lkKQoreworICAgIFBNUkVHUyAgICAgIHJlZ3M7CisgICAgUE1TUkVHUyAgICAgc3JlZ3M7CisgICAgVlhEX3JlZ3MgICAgcjsKKworICAgIC8qIEJhaWwgZWFybHkgaWYgd2UgaGF2ZSBhbHJlYWQgY29ubmVjdGVkICovCisgICAgaWYgKFZYRF92ZXJzaW9uICE9IC0xKQorICAgICAgICByZXR1cm4gVlhEX3ZlcnNpb24gIT0gMDsKKworICAgIC8qIEdldCB0aGUgc3RhdGljIFNEREhFTFAuVlhEIGVudHJ5IHBvaW50IGlmIGF2YWlsYWJsZSAqLworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZWdzLnguYXggPSAweDE2ODQ7CisgICAgcmVncy54LmJ4ID0gU0RESEVMUF9EZXZpY2VJRDsKKyAgICByZWdzLnguZGkgPSAwOworICAgIHNyZWdzLmVzID0gMDsKKyAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKKyAgICBfUE1fVlhEX3NlbCA9IHNyZWdzLmVzOworICAgIF9QTV9WWERfb2ZmID0gcmVncy54LmRpOworICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApIHsKKyAgICAgICAgaWYgKFBNSEVMUF9nZXRWZXJzaW9uKCkgPj0gUE1IRUxQX1ZFUlNJT04pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gZWl0aGVyIFNEREhFTFAuVlhEIGlzIG5vdCBsb2FkZWQsIG9yIGl0IGlzIGFuCisgICAgICogZWFybGllciB2ZXJzaW9uLiBJbiB0aGlzIGNhc2UgdHJ5IHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUC5WWEQKKyAgICAgKiBoZWxwZXIgVnhEIGluc3RlYWQuCisgICAgICovCisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKKyAgICByZWdzLnguYnggPSBWWERMRFJfRGV2aWNlSUQ7CisgICAgcmVncy54LmRpID0gMDsKKyAgICBzcmVncy5lcyA9IDA7CisgICAgUE1faW50Mzg2eCgweDJGLCZyZWdzLCZyZWdzLCZzcmVncyk7CisgICAgVlhEX2xvYWRTZWwgPSBzcmVncy5lczsKKyAgICBWWERfbG9hZE9mZiA9IHJlZ3MueC5kaTsKKyAgICBpZiAoVlhEX2xvYWRTZWwgPT0gMCAmJiBWWERfbG9hZE9mZiA9PSAwKQorICAgICAgICByZXR1cm4gVlhEX3ZlcnNpb24gPSAwOworICAgIHIuZWF4ID0gMTsKKyAgICByLmVieCA9IDA7CisgICAgci5lZHggPSAodWludClWWERfbmFtZTsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgci5kcyA9IHNyZWdzLmRzOworICAgIHIuZXMgPSBzcmVncy5lczsKKyAgICBfUE1fVnhEQ2FsbCgmcixWWERfbG9hZE9mZixWWERfbG9hZFNlbCk7CisgICAgaWYgKHIuZWF4ICE9IDApCisgICAgICAgIHJldHVybiBWWERfdmVyc2lvbiA9IDA7CisKKyAgICAvKiBHZXQgdGhlIGR5bmFtaWMgVnhEIGVudHJ5IHBvaW50IHNvIHdlIGNhbiBjYWxsIGl0ICovCisgICAgYXRleGl0KFVubG9hZFZ4RCk7CisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKKyAgICByZWdzLnguYnggPSAwOworICAgIHJlZ3MuZS5lZGkgPSAodWludClWWERfRERCTmFtZTsKKyAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKKyAgICBfUE1fVlhEX3NlbCA9IHNyZWdzLmVzOworICAgIF9QTV9WWERfb2ZmID0gcmVncy54LmRpOworICAgIGlmIChfUE1fVlhEX3NlbCA9PSAwICYmIF9QTV9WWERfb2ZmID09IDApCisgICAgICAgIHJldHVybiBWWERfdmVyc2lvbiA9IDA7CisgICAgaWYgKFBNSEVMUF9nZXRWZXJzaW9uKCkgPj0gUE1IRUxQX1ZFUlNJT04pCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBWWERfdmVyc2lvbiA9IDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LiBGaXJzdCB3ZSB0cnkgdG8gY29ubmVjdCB0byBhIHN0YXRpYyBTRERIRUxQLlZYRAoraGVscGVyIFZ4RCwgYW5kIGNoZWNrIHRoYXQgaXQgaXMgYSB2ZXJzaW9uIHdlIGNhbiB1c2UuIElmIG5vdCB3ZSB0cnkgdG8KK2R5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUC5WWEQgaGVscGVyIFZ4RAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQoreworI2lmbmRlZiBSRUFMTU9ERQorICAgIFBNUkVHUyAgcmVnczsKKworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5IHVuZGVyIHJlYWwgRE9TICovCisgICAgaWYgKF9QTV9oYXZlQ2F1c2VXYXkgPT0gLTEpIHsKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgRFBNSSBpbiB3aGljaCBjYXNlIHdlIHdpbGwgbm90IGJlCisgICAgICAgICAqIGFibGUgdG8gdXNlIG91ciBzcGVjaWFsIHJpbmcgMCBDYXVzZVdheSBmdW5jdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBfUE1faGF2ZUNhdXNlV2F5ID0gZmFsc2U7CisgICAgICAgIHJlZ3MueC5heCA9IDB4RkYwMDsKKyAgICAgICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOworICAgICAgICBpZiAocmVncy54LmNmbGFnIHx8ICEocmVncy5lLmVkaSAmIDgpKSB7CisgICAgICAgICAgICAvKiBXZSBhcmUgbm90IHVuZGVyIERQTUksIHNvIG5vdyBjaGVjayBpZiBDYXVzZVdheSBpcyBhY3RpdmUgKi8KKyAgICAgICAgICAgIHJlZ3MueC5heCA9IDB4RkZGOTsKKyAgICAgICAgICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgICAgIGlmICghcmVncy54LmNmbGFnICYmIHJlZ3MuZS5lY3ggPT0gMHg0MzQxNTU1MyAmJiByZWdzLmUuZWR4ID09IDB4NDU1NzQxNTkpCisgICAgICAgICAgICAgICAgX1BNX2hhdmVDYXVzZVdheSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogTm93IGNvbm5lY3QgdG8gUE1IRUxQLlZYRCBhbmQgaW5pdGlhbGlzZSBNVFJSIG1vZHVsZSAqLworICAgICAgICBpZiAoIVBNSEVMUF9jb25uZWN0KCkpCisgICAgICAgICAgICBNVFJSX2luaXQoKTsKKyAgICAgICAgfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KK3R5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKKworUkVUVVJOUzoKK0Vycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCisgICAgdWxvbmcgYmFzZSwKKyAgICB1bG9uZyBzaXplLAorICAgIHVpbnQgdHlwZSkKK3sKKyNpZm5kZWYgUkVBTE1PREUKKyAgICBWWERfcmVncyAgICByZWdzOworCisgICAgaWYgKFBNSEVMUF9jb25uZWN0KCkpIHsKKyAgICAgICAgbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKKyAgICAgICAgcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9FTkFCTEVMRkJDT01CKTsKKyAgICAgICAgcmVncy5lYnggPSBiYXNlOworICAgICAgICByZWdzLmVjeCA9IHNpemU7CisgICAgICAgIHJlZ3MuZWR4ID0gdHlwZTsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm4gcmVncy5lYXg7CisgICAgICAgIH0KKyAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOworI2Vsc2UKKyAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCit9CisKK2lib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCit7IHJldHVybiB0cnVlOyB9CisKK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7IHJldHVybiBfT1NfRE9TOyB9CisKK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreworI2lmIGRlZmluZWQoUkVBTE1PREUpCisgICAgcmV0dXJuIFBNX3JlYWxNb2RlOworI2VsaWYgZGVmaW5lZChQTTI4NikKKyAgICByZXR1cm4gUE1fMjg2OworI2VsaWYgZGVmaW5lZChQTTM4NikKKyAgICByZXR1cm4gUE1fMzg2OworI2VuZGlmCit9CisKK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKKyAgICAgICAgc1twb3NdID0gJ1xcJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKwordm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7CisgICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKK3sKKyAgICBpZiAoVkVTQUJ1Zl9wdHIpCisgICAgICAgIFBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKKyAgICBWRVNBQnVmX3B0ciA9IDA7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCit7CisgICAgaWYgKCFWRVNBQnVmX3B0cikgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KKyAgICAgICAgaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXRleGl0KEV4aXRWQkVCdWYpOworICAgICAgICB9CisgICAgKmxlbiA9IFZFU0FCdWZfbGVuOworICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOworICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOworICAgIHJldHVybiBWRVNBQnVmX3B0cjsKK30KKworaW50IFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KQoreworICAgIFBNU1JFR1Mgc3JlZ3M7CisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJldHVybiBQTV9pbnQzODZ4KGludG5vLGluLG91dCwmc3JlZ3MpOworfQorCisvKiBSb3V0aW5lcyB0byBzZXQgYW5kIGdldCB0aGUgcmVhbCBtb2RlIGludGVycnVwdCB2ZWN0b3JzLCBieSBtYWtpbmcKKyAqIGRpcmVjdCByZWFsIG1vZGUgY2FsbHMgdG8gRE9TIGFuZCBieXBhc3NpbmcgdGhlIERPUyBleHRlbmRlcnMgQVBJLgorICogVGhpcyBpcyB0aGUgc2FmZXN0IHdheSB0byBoYW5kbGUgdGhpcywgYXMgc29tZSBzZXJ2ZXJzIHRyeSB0byBiZQorICogc21hcnQgYWJvdXQgY2hhbmdpbmcgcmVhbCBtb2RlIHZlY3RvcnMuCisgKi8KKwordm9pZCBQTUFQSSBfUE1fZ2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyAqcmVhbGlzcikKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgUk1TUkVHUyBzcmVnczsKKworICAgIFBNX3NhdmVEUygpOworICAgIHJlZ3MuaC5haCA9IDB4MzU7CisgICAgcmVncy5oLmFsID0gaW50bm87CisgICAgUE1faW50ODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKKyAgICAqcmVhbGlzciA9ICgobG9uZylzcmVncy5lcyA8PCAxNikgfCByZWdzLnguYng7Cit9CisKK3ZvaWQgUE1BUEkgX1BNX3NldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgcmVhbGlzcikKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgUk1TUkVHUyBzcmVnczsKKworICAgIFBNX3NhdmVEUygpOworICAgIHJlZ3MuaC5haCA9IDB4MjU7CisgICAgcmVncy5oLmFsID0gaW50bm87CisgICAgc3JlZ3MuZHMgPSAoaW50KShyZWFsaXNyID4+IDE2KTsKKyAgICByZWdzLnguZHggPSAoaW50KShyZWFsaXNyICYgMHhGRkZGKTsKKyAgICBQTV9pbnQ4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOworfQorCit2b2lkIFBNQVBJIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHZvaWQgKm1lbSx1aW50IHRhZykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUk1fQkxPQ0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHJtQmxvY2tzW2ldLnAgPT0gTlVMTCkgeworICAgICAgICAgICAgcm1CbG9ja3NbaV0ucCA9IG1lbTsKKyAgICAgICAgICAgIHJtQmxvY2tzW2ldLnRhZyA9IHRhZzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIFBNX2ZhdGFsRXJyb3IoIlRvIG1hbnkgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBhbGxvY2F0aW9ucyEiKTsKK30KKwordWludCBQTUFQSSBfUE1fZmluZFJlYWxNb2RlQmxvY2sodm9pZCAqbWVtKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9STV9CTE9DS1M7IGkrKykgeworICAgICAgICBpZiAocm1CbG9ja3NbaV0ucCA9PSBtZW0pCisgICAgICAgICAgICByZXR1cm4gcm1CbG9ja3NbaV0udGFnOworICAgICAgICB9CisgICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IGZpbmQgcHJpb3IgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uISIpOworICAgIHJldHVybiAwOworfQorCitjaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCisgICAgY2hhciAqcGF0aCwKKyAgICBpbnQgbWF4TGVuKQoreworICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOworfQorCitjaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoreyByZXR1cm4gJ0MnOyB9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKK3sgcmV0dXJuICJjOlxcIjsgfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgY2hhciAgICAgICAgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVudjsKKyAgICBpZiAoKGVudiA9IGdldGVudigiV0lOQk9PVERJUiIpKSAhPSBOVUxMKSB7CisgICAgICAgIC8qIFJ1bm5pbmcgaW4gYSBXaW5kb3dzIDl4IERPUyBib3ggb3IgRE9TIG1vZGUgKi8KKyAgICAgICAgc3RyY3B5KHBhdGgsZW52KTsKKyAgICAgICAgc3RyY2F0KHBhdGgsIlxcc3lzdGVtXFxudWNsZXVzIik7CisgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisgICAgaWYgKChlbnYgPSBnZXRlbnYoIlN5c3RlbVJvb3QiKSkgIT0gTlVMTCkgeworICAgICAgICAvKiBSdW5uaW5nIGluIGFuIE5ULzJLIERPUyBib3ggKi8KKyAgICAgICAgc3RyY3B5KHBhdGgsZW52KTsKKyAgICAgICAgc3RyY2F0KHBhdGgsIlxcc3lzdGVtMzJcXG51Y2xldXMiKTsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKyAgICByZXR1cm4gImM6XFxudWNsZXVzIjsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOworICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOworICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoreyByZXR1cm4gIkRPUyI7IH0KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCit7IHJldHVybiAiRE9TIjsgfQorCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICByZXR1cm4ga2JoaXQoKTsKK30KKworaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCit7CisgICAgcmV0dXJuIGdldGNoKCk7Cit9CisKK1BNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbikKK3sKKyAgICAvKiBOb3QgdXNlZCBmb3IgRE9TICovCisgICAgKHZvaWQpaHduZFVzZXI7CisgICAgKHZvaWQpZGV2aWNlOworICAgICh2b2lkKXhSZXM7CisgICAgKHZvaWQpeVJlczsKKyAgICAodm9pZClicHA7CisgICAgKHZvaWQpZnVsbFNjcmVlbjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICByZXR1cm4gc2l6ZW9mKERPU19zdGF0ZUJ1Zik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIERPU19zdGF0ZUJ1ZiAgICAqc2IgPSBzdGF0ZUJ1ZjsKKworICAgIC8qIFNhdmUgdGhlIG9sZCB2aWRlbyBtb2RlIHN0YXRlICovCisgICAgcmVncy5oLmFoID0gMHgwRjsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICBzYi0+b2xkTW9kZSA9IHJlZ3MuaC5hbCAmIDB4N0Y7CisgICAgc2ItPm9sZDUwTGluZXMgPSBmYWxzZTsKKyAgICBpZiAoc2ItPm9sZE1vZGUgPT0gMHgzKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDB4MTEzMDsKKyAgICAgICAgcmVncy54LmJ4ID0gMDsKKyAgICAgICAgcmVncy54LmR4ID0gMDsKKyAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIHNiLT5vbGQ1MExpbmVzID0gKHJlZ3MuaC5kbCA9PSA0MiB8fCByZWdzLmguZGwgPT0gNDkpOworICAgICAgICB9CisgICAgKHZvaWQpaHduZENvbnNvbGU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBET1MgKi8KKyAgICAodm9pZClzYXZlU3RhdGU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIFJNUkVHUyAgICAgICAgICAgICAgcmVnczsKKyAgICBjb25zdCBET1Nfc3RhdGVCdWYgICpzYiA9IHN0YXRlQnVmOworCisgICAgLyogUmV0b3JlIDUwIGxpbmUgbW9kZSBpZiBzZXQgKi8KKyAgICBpZiAoc2ItPm9sZDUwTGluZXMpIHsKKyAgICAgICAgcmVncy54LmF4ID0gMHgxMTEyOworICAgICAgICByZWdzLnguYnggPSAwOworICAgICAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgfQorICAgICh2b2lkKWh3bmRDb25zb2xlOworfQorCit2b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBET1MgKi8KKyAgICAodm9pZClod25kQ29uc29sZTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOworICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRBLHdpZHRoKTsKKyAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NEMsd2lkdGgqMik7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKKyAgICBpZiAoaGVpZ2h0ID4gMjUpIHsKKyAgICAgICAgUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MDYwNyk7CisgICAgICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NSwweDA4KTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwRDBFKTsKKyAgICAgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDE2KTsKKyAgICAgICAgfQorfQorCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKK3sKKyAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQoreworICAgIFBNX2ZyZWUocHRyKTsKK30KKworI2RlZmluZSBHZXRSTVZlY3QoaW50bm8saXNyKSAgICAqKGlzcikgPSAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXQorI2RlZmluZSBTZXRSTVZlY3QoaW50bm8saXNyKSAgICAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXSA9IChpc3IpCisKK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TLAorICAgIHVsb25nIEJJT1NMZW4pCit7CisgICAgc3RhdGljIGludCAgICAgIGZpcnN0VGltZSA9IHRydWU7CisgICAgc3RhdGljIHVjaGFyICAgICpybVplcm9QdHI7CisgICAgbG9uZyAgICAgICAgICAgIEN1cnJlbnQxMCxDdXJyZW50NkQsQ3VycmVudDQyOworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKKworICAgIC8qIENyZWF0ZSBhIHplcm8gbWVtb3J5IG1hcHBpbmcgZm9yIHVzIHRvIHVzZSAqLworICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgcm1aZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHg3RkZGLHRydWUpOworICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgLyogUmVtYXAgdGhlIHNlY29uZGFyeSBCSU9TIHRvIDB4QzAwMDAgcGh5c2ljYWwgKi8KKyAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDBMIHx8IEJJT1NMZW4gPiAzMjc2OCkgeworICAgICAgICAvKiBET1MgY2Fubm90IHZpcnR1YWxseSByZW1hcCB0aGUgQklPUywgc28gd2UgY2FuIG9ubHkgd29yayBpZiBhbGwKKyAgICAgICAgICogdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBhcmUgaWRlbnRpY2FsLCBhbmQgd2UgdGhlbiB1c2UgdGhlCisgICAgICAgICAqIEJJT1Mgb24gdGhlIGZpcnN0IGNvbnRyb2xsZXIgZm9yIGFsbCB0aGUgcmVtYWluaW5nIGNvbnRyb2xsZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgT1MnZXMgdGhhdCBkbyB2aXJ0dWFsIG1lbW9yeSwgYW5kIHJlbWFwcGluZyBvZiAweEMwMDAwCisgICAgICAgICAqIHBoeXNpY2FsIChwZXJoYXBzIGEgY29weSBvbiB3cml0ZSBtYXBwaW5nKSBzaG91bGQgYmUgYWxsIHRoYXQKKyAgICAgICAgICogaXMgbmVlZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAvKiBTYXZlIGN1cnJlbnQgaGFuZGxlcnMgb2YgaW50IDEwaCBhbmQgNkRoICovCisgICAgR2V0Uk1WZWN0KDB4MTAsJkN1cnJlbnQxMCk7CisgICAgR2V0Uk1WZWN0KDB4NkQsJkN1cnJlbnQ2RCk7CisKKyAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLworICAgIEdldFJNVmVjdCgweDQyLCZDdXJyZW50NDIpOworICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQ0Mik7ICAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KKyAgICByZWdzLnguYXggPSBheFZhbDsKKyAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOworCisgICAgLyogUmVzdG9yZSBjdXJyZW50IGhhbmRsZXJzICovCisgICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDEwKTsKKyAgICBTZXRSTVZlY3QoMHg2RCxDdXJyZW50NkQpOworCisgICAgLyogU2Vjb25kIHRoZSBwcmltYXJ5IEJJT1MgbWFwcGluIDE6MSBmb3IgMHhDMDAwMCBwaHlzaWNhbCAqLworICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwpIHsKKyAgICAgICAgLyogRE9TIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLworICAgICAgICAodm9pZCltYXBwZWRCSU9TOworICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQoreworICAgIHVsb25nICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTDsKKyAgICBMWlRpbWVyT2JqZWN0ICAgdG07CisKKyAgICBMWlRpbWVyT25FeHQoJnRtKTsKKyAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQorICAgICAgICA7CisgICAgTFpUaW1lck9mZkV4dCgmdG0pOworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNCQzsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgzNzg7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIDB4Mjc4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgKHZvaWQpc3pETExOYW1lOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUsCisgICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKK3sKKyAgICAodm9pZCloTW9kdWxlOworICAgICh2b2lkKXN6UHJvY05hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUpCit7CisgICAgKHZvaWQpaE1vZHVsZTsKK30KKworaW50IFBNQVBJIFBNX3NldElPUEwoCisgICAgaW50IGxldmVsKQoreworICAgIHJldHVybiBsZXZlbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCisgICAgc3RydWN0IGZpbmRfdCAqYmxrKQoreworICAgIHVsb25nICAgZHdTaXplID0gZmluZERhdGEtPmR3U2l6ZTsKKworICAgIG1lbXNldChmaW5kRGF0YSwwLGZpbmREYXRhLT5kd1NpemUpOworICAgIGZpbmREYXRhLT5kd1NpemUgPSBkd1NpemU7CisgICAgaWYgKGJsay0+YXR0cmliICYgX0FfUkRPTkxZKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7CisgICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1VCRElSKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOworICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0FSQ0gpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9BUkNISVZFOworICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0hJRERFTikKKyAgICAgICAgZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKKyAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TWVNURU0pCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07CisgICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+c2l6ZTsKKyAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+bmFtZSxQTV9NQVhfUEFUSCk7CisgICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOworfQorCisjZGVmaW5lIEZJTkRfTUFTSyAgIChfQV9SRE9OTFkgfCBfQV9BUkNIIHwgX0FfU1VCRElSIHwgX0FfSElEREVOIHwgX0FfU1lTVEVNKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQoreworICAgIHN0cnVjdCBmaW5kX3QgKmJsazsKKworICAgIGlmICgoYmxrID0gUE1fbWFsbG9jKHNpemVvZigqYmxrKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7CisgICAgaWYgKF9kb3NfZmluZGZpcnN0KChjaGFyKilmaWxlbmFtZSxGSU5EX01BU0ssYmxrKSA9PSAwKSB7CisgICAgICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOworICAgICAgICByZXR1cm4gYmxrOworICAgICAgICB9CisgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAorICAgIHZvaWQgKmhhbmRsZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgc3RydWN0IGZpbmRfdCAqYmxrID0gaGFuZGxlOworCisgICAgaWYgKF9kb3NfZmluZG5leHQoYmxrKSA9PSAwKSB7CisgICAgICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIFBNX2ZyZWUoaGFuZGxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCitmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAordGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCitudW1iZXJpbmcgaXM6CisKKyAgICAxICAgLSBEcml2ZSBBOgorICAgIDIgICAtIERyaXZlIEI6CisgICAgMyAgIC0gRHJpdmUgQzoKKyAgICBldGMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCisgICAgY2hhciBkcml2ZSkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgcmVncy5oLmRsID0gKHVjaGFyKShkcml2ZSAtICdBJyArIDEpOworICAgIHJlZ3MuaC5haCA9IDB4MzY7ICAgICAgICAgICAgICAgLy8gR2V0IGRpc2sgaW5mb3JtYXRpb24gc2VydmljZQorICAgIFBNX2ludDg2KDB4MjEsJnJlZ3MsJnJlZ3MpOworICAgIHJldHVybiByZWdzLnguYXggIT0gMHhGRkZGOyAgICAgLy8gQVggPSAweEZGRkYgaWYgZGlzayBpcyBpbnZhbGlkCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KK1VuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcworb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2dldGRjd2QoCisgICAgaW50IGRyaXZlLAorICAgIGNoYXIgKmRpciwKKyAgICBpbnQgbGVuKQoreworICAgIHVpbnQgb2xkRHJpdmUsbWF4RHJpdmVzOworICAgIF9kb3NfZ2V0ZHJpdmUoJm9sZERyaXZlKTsKKyAgICBfZG9zX3NldGRyaXZlKGRyaXZlLCZtYXhEcml2ZXMpOworICAgIGdldGN3ZChkaXIsbGVuKTsKKyAgICBfZG9zX3NldGRyaXZlKG9sZERyaXZlLCZtYXhEcml2ZXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyNpZiBkZWZpbmVkKFROVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBEV09SRCBhdHRyID0gMDsKKworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKKyAgICAgICAgYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07CisgICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKKyNlbHNlCisgICAgdWludCBhdHRyID0gMDsKKworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBhdHRyIHw9IF9BX1JET05MWTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQorICAgICAgICBhdHRyIHw9IF9BX0FSQ0g7CisgICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQorICAgICAgICBhdHRyIHw9IF9BX0hJRERFTjsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCisgICAgICAgIGF0dHIgfD0gX0FfU1lTVEVNOworICAgIF9kb3Nfc2V0ZmlsZWF0dHIoZmlsZW5hbWUsYXR0cik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fbWtkaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisjaWZkZWYgIF9fR05VQ19fCisgICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lLFNfSVJVU1IpID09IDA7CisjZWxzZQorICAgIHJldHVybiBta2RpcihmaWxlbmFtZSkgPT0gMDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBHZW5lcmljIERQTUkgcm91dGluZXMgY29tbW9uIHRvIDE2LzMyIGJpdCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBSRUFMTU9ERQordWxvbmcgUE1BUEkgRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHVsb25nIHBoeXNBZGRyLHVsb25nIGxpbWl0KQoreworICAgIFBNUkVHUyAgcjsKKyAgICBpbnQgICAgIGk7CisgICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzLHJvdW5kZWRMaW1pdDsKKworICAgIC8qIFdlIGNhbid0IG1hcCBtZW1vcnkgYmVsb3cgMU1iLCBidXQgdGhlIGxpbmVhciBhZGRyZXNzIGFyZSBhbHJlYWR5CisgICAgICogbWFwcGVkIDE6MSBmb3IgdGhpcyBtZW1vcnkgYW55d2F5IHNvIHdlIGp1c3QgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MuCisgICAgICovCisgICAgaWYgKHBoeXNBZGRyIDwgMHgxMDAwMDBMKQorICAgICAgICByZXR1cm4gcGh5c0FkZHI7CisKKyAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQKKyAgICAgKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4gV2UgZG8gdGhpcyBiZWNhdXNlCisgICAgICogRFBNSSAwLjkgZG9lcyBub3QgYWxsb3cgdXMgdG8gZnJlZSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZ3MsIGFuZCBpZgorICAgICAqIHRoZSBtYXBwaW5ncyBnZXQgcmUtdXNlZCBpbiB0aGUgcHJvZ3JhbSB3ZSB3YW50IHRvIGF2b2lkIGFsbG9jYXRpbmcKKyAgICAgKiBtb3JlIG1hcHBpbmdzIHRoYW4gbmVjZXNzYXJ5LgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gcGh5c0FkZHIgJiYgbWFwc1tpXS5saW1pdCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiBtYXBzW2ldLmxpbmVhcjsKKyAgICAgICAgfQorCisgICAgLyogRmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgdGFibGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwczsgaSsrKSB7CisgICAgICAgIGlmIChtYXBzW2ldLmxpbWl0ID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmIChpID09IG51bU1hcHMpIHsKKyAgICAgICAgaSA9IG51bU1hcHMrKzsKKyAgICAgICAgaWYgKGkgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKKyAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIERQTUkgYXMgc29tZSBleHRlbmRlcnMKKyAgICAgKiB3aWxsIGZhaWwgdGhlIGNhbGxzIHVubGVzcyB0aGlzIGlzIHRoZSBjYXNlLiBJZiB3ZSByb3VuZCB0aGUKKyAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCisgICAgICogdGhhdCB3ZSByZXR1cm4uCisgICAgICovCisgICAgYmFzZU9mcyA9IHBoeXNBZGRyICYgNDA5NTsKKyAgICBiYXNlQWRkciA9IHBoeXNBZGRyICYgfjQwOTU7CisgICAgcm91bmRlZExpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKKyAgICByLnguYXggPSAweDgwMDsKKyAgICByLnguYnggPSBiYXNlQWRkciA+PiAxNjsKKyAgICByLnguY3ggPSBiYXNlQWRkciAmIDB4RkZGRjsKKyAgICByLnguc2kgPSByb3VuZGVkTGltaXQgPj4gMTY7CisgICAgci54LmRpID0gcm91bmRlZExpbWl0ICYgMHhGRkZGOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIGlmIChyLnguY2ZsYWcpCisgICAgICAgIHJldHVybiAweEZGRkZGRkZGVUw7CisgICAgbWFwc1tpXS5waHlzaWNhbCA9IHBoeXNBZGRyOworICAgIG1hcHNbaV0ubGltaXQgPSBsaW1pdDsKKyAgICBtYXBzW2ldLmxpbmVhciA9ICgodWxvbmcpci54LmJ4IDw8IDE2KSArIHIueC5jeCArIGJhc2VPZnM7CisgICAgcmV0dXJuIG1hcHNbaV0ubGluZWFyOworfQorCitpbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCx1bG9uZyBsaW5BZGRyKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDc7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBzZXQgc2VsZWN0b3IgYmFzZSBhZGRyZXNzICAgKi8KKyAgICByLnguYnggPSBzZWw7CisgICAgci54LmN4ID0gbGluQWRkciA+PiAxNjsKKyAgICByLnguZHggPSBsaW5BZGRyICYgMHhGRkZGOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIGlmIChyLnguY2ZsYWcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCit1bG9uZyBQTUFQSSBEUE1JX2dldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDY7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBnZXQgc2VsZWN0b3IgYmFzZSBhZGRyZXNzICAgKi8KKyAgICByLnguYnggPSBzZWw7CisgICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7CisgICAgcmV0dXJuICgodWxvbmcpci54LmN4IDw8IDE2KSArIHIueC5keDsKK30KKworaW50IFBNQVBJIERQTUlfc2V0U2VsZWN0b3JMaW1pdCh1c2hvcnQgc2VsLHVsb25nIGxpbWl0KQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDg7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBzZXQgc2VsZWN0b3IgbGltaXQgICAgICAgICAgKi8KKyAgICByLnguYnggPSBzZWw7CisgICAgci54LmN4ID0gbGltaXQgPj4gMTY7CisgICAgci54LmR4ID0gbGltaXQgJiAweEZGRkY7CisgICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7CisgICAgaWYgKHIueC5jZmxhZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3VpbnQgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KQoreworICAgIHVpbnQgICAgc2VsOworICAgIFBNUkVHUyAgcjsKKworICAgIC8qIEFsbG9jYXRlIDEgZGVzY3JpcHRvciAqLworICAgIHIueC5heCA9IDA7CisgICAgci54LmN4ID0gMTsKKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICBpZiAoci54LmNmbGFnKSByZXR1cm4gMDsKKyAgICBzZWwgPSByLnguYXg7CisKKyAgICAvKiBTZXQgdGhlIGRlc2NyaXB0b3IgYWNjZXNzIHJpZ2h0cyAoZm9yIGEgMzIgYml0IHBhZ2UgZ3JhbnVsYXIKKyAgICAgKiBzZWdtZW50KS4KKyAgICAgKi8KKyAgICBpZiAobGltaXQgPj0gMHgxMDAwMEwpIHsKKyAgICAgICAgci54LmF4ID0gOTsKKyAgICAgICAgci54LmJ4ID0gc2VsOworICAgICAgICByLnguY3ggPSAweDQwRjM7CisgICAgICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgICAgICB9CisKKyAgICAvKiBNYXAgcGh5c2ljYWwgbWVtb3J5IGFuZCBjcmVhdGUgc2VsZWN0b3IgKi8KKyAgICBpZiAoKGJhc2UgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDB4RkZGRkZGRkZVTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yQmFzZShzZWwsYmFzZSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckxpbWl0KHNlbCxsaW1pdCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZWw7Cit9CisKK3ZvaWQgUE1BUEkgRFBNSV9mcmVlU2VsZWN0b3IodWludCBzZWwpCit7CisgICAgUE1SRUdTICByOworCisgICAgci54LmF4ID0gMTsKKyAgICByLnguYnggPSBzZWw7CisgICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Cit9CisKK2ludCBQTUFQSSBEUE1JX2xvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDB4NjAwOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgTG9jayBMaW5lYXIgUmVnaW9uICAgICAgKi8KKyAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCisgICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7CisgICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLworICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIHJldHVybiAoIXIueC5jZmxhZyk7Cit9CisKK2ludCBQTUFQSSBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pCit7CisgICAgUE1SRUdTICByOworCisgICAgci54LmF4ID0gMHg2MDE7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBVbmxvY2sgTGluZWFyIFJlZ2lvbiAgICAqLworICAgIHIueC5ieCA9IChsaW5lYXIgPj4gMTYpOyAgICAgICAgICAgIC8qIExpbmVhciBhZGRyZXNzIGluIEJYOkNYICAgICAgKi8KKyAgICByLnguY3ggPSAobGluZWFyICYgMHhGRkZGKTsKKyAgICByLnguc2kgPSAobGVuID4+IDE2KTsgICAgICAgICAgICAgICAvKiBMZW5ndGggaW4gU0k6REkgICAgICAgICAgICAgICovCisgICAgci54LmRpID0gKGxlbiAmIDB4RkZGRik7CisgICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7CisgICAgcmV0dXJuICghci54LmNmbGFnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGp1c3QgdGhlIHBhZ2UgdGFibGUgY2FjaGluZyBiaXRzIGRpcmVjdGx5LiBSZXF1aXJlcyByaW5nIDAgYWNjZXNzIGFuZAorb25seSB3b3JrcyB3aXRoIERPUzRHVyBhbmQgY29tcGF0aWJsZSBleHRlbmRlcnMgKENhdXNlV2F5IGFsc28gd29ya3Mgc2luY2UKK2l0IGhhcyBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIHJpbmcgMCBpbnN0cnVjdGlvbnMgd2UgbmVlZCBmcm9tIHJpbmcgMykuIFdpbGwKK25vdCB3b3JrIGluIGEgRE9TIGJveCwgYnV0IHdlIGNhbGwgaW50byB0aGUgcmluZyAwIGhlbHBlciBWeEQgc28gd2Ugc2hvdWxkCituZXZlciBnZXQgaGVyZSBpbiBhIERPUyBib3ggYW55d2F5IChhc3N1bWluZyB0aGUgVnhEIGlzIHByZXNlbnQpLiBJZiB3ZQorZG8gZ2V0IGhlcmUgYW5kIHdlIGFyZSBpbiB3aW5kb3dzLCB0aGlzIGNvZGUgd2lsbCBiZSBza2lwcGVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFBNX2FkanVzdFBhZ2VUYWJsZXMoCisgICAgdWxvbmcgbGluZWFyLAorICAgIHVsb25nIGxpbWl0LAorICAgIGlib29sIGlzQ2FjaGVkKQoreworI2lmZGVmICBET1M0R1cKKyAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKKyAgICB1bG9uZyAgIGFuZE1hc2ssb3JNYXNrLHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZTsKKworICAgIGFuZE1hc2sgPSB+MHgxODsKKyAgICBvck1hc2sgPSAoaXNDYWNoZWQpID8gMHgwMCA6IDB4MTg7CisgICAgaWYgKF9QTV9wYWdpbmdFbmFibGVkKCkgPT0gMSAmJiAoUERCID0gX1BNX2dldFBEQigpKSAhPSAwKSB7CisgICAgICAgIGlmIChfUE1faGF2ZUNhdXNlV2F5KSB7CisgICAgICAgICAgICAvKiBDYXVzZVdheSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgaW4gdGhlIHBhZ2UgdGFibGUgaGFuZGxpbmcuCisgICAgICAgICAgICAgKiBUaGUgY29kZSB0aGF0IHdlIHVzZSBmb3IgRE9TNEcvVyBkb2VzIG5vdCBhcHBlYXIgdG8gd29yaworICAgICAgICAgICAgICogd2l0aCBDYXVzZVdheSBjb3JyZWN0bHkgYXMgaXQgZG9lcyBub3QgYXBwZWFyIHRvIGFsbG93IHVzCisgICAgICAgICAgICAgKiB0byBtYXAgdGhlIHBhZ2UgdGFibGVzIGRpcmVjdGx5LiBJbnN0ZWFkIHdlIGNhbiBkaXJlY3RseQorICAgICAgICAgICAgICogYWNjZXNzIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgaW4gZXh0ZW5kZWQgbWVtb3J5IHdoZXJlCisgICAgICAgICAgICAgKiBDYXVzZVdheSBhbHdheXMgbG9jYXRlcyB0aGVtIChzdGFydGluZyBhdCAxMDI0KjQwOTYqMTAyMykKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMik7CisgICAgICAgICAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKTsKKyAgICAgICAgICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKUNXX1BBR0VfVEFCTEVfU1RBUlQ7CisgICAgICAgICAgICBmb3IgKGlQYWdlID0gc3RhcnRQYWdlOyBpUGFnZSA8PSBlbmRQYWdlOyBpUGFnZSsrKQorICAgICAgICAgICAgICAgIHBQYWdlVGFibGVbaVBhZ2VdID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgYW5kTWFzaykgfCBvck1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7CisgICAgICAgICAgICBpZiAocFBEQikgeworICAgICAgICAgICAgICAgIHN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKKyAgICAgICAgICAgICAgICBzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgIGVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKKyAgICAgICAgICAgICAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgIGZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7CisgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkY7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBhbmRNYXNrKSB8IG9yTWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgUE1fZmx1c2hUTEIoKTsKKyAgICAgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgKiBQTUFQSSBEUE1JX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoreworICAgIFBNU1JFR1MgICAgIHNyZWdzOworICAgIHVsb25nICAgICAgIGxpbkFkZHI7CisgICAgdWxvbmcgICAgICAgRFNCYXNlQWRkcjsKKworICAgIC8qIEdldCB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCBEUyBzZWxlY3RvciAqLworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOworICAgIGlmICgoYmFzZSA8IDB4MTAwMDAwKSAmJiAoRFNCYXNlQWRkciA9PSAwKSkgeworICAgICAgICAvKiBEUyBpcyB6ZXJvIGJhc2VkLCBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBmaXJzdCAxTWIgb2YKKyAgICAgICAgICogc3lzdGVtIG1lbW9yeSAobGlrZSB1bmRlciBET1M0R1cpLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuICh2b2lkKiliYXNlOworICAgICAgICB9CisKKyAgICAvKiBNYXAgdGhlIG1lbW9yeSB0byBhIGxpbmVhciBhZGRyZXNzIHVzaW5nIERQTUkgZnVuY3Rpb24gMHg4MDAgKi8KKyAgICBpZiAoKGxpbkFkZHIgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgaWYgKGJhc2UgPj0gMHgxMDAwMDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogSWYgdGhlIGxpbmVhciBhZGRyZXNzIG1hcHBpbmcgZmFpbHMgYnV0IHdlIGFyZSB0cnlpbmcgdG8KKyAgICAgICAgICogbWFwIGFuIGFyZWEgaW4gdGhlIGZpcnN0IDFNYiBvZiBzeXN0ZW0gbWVtb3J5LCB0aGVuIHdlIG11c3QKKyAgICAgICAgICogYmUgcnVubmluZyB1bmRlciBhIFdpbmRvd3Mgb3IgT1MvMiBET1MgYm94LiBVbmRlciB0aGVzZQorICAgICAgICAgKiBlbnZpcm9ubWVudHMgd2UgY2FuIHVzZSB0aGUgc2VnbWVudCB3cmFwIGFyb3VuZCBhcyBhIGZhbGxiYWNrCisgICAgICAgICAqIG1lYXN1cmUsIGFzIHRoaXMgZG9lcyB3b3JrIHByb3Blcmx5LgorICAgICAgICAgKi8KKyAgICAgICAgbGluQWRkciA9IGJhc2U7CisgICAgICAgIH0KKworICAgIC8qIE5vdyBleHBhbmQgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgdG8gNEdiIHNvIHdlIGNhbiBhY2Nlc3MgaXQgKi8KKyAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JMaW1pdChzcmVncy5kcywweEZGRkZGRkZGVUwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEZpbmFsbHkgZW5hYmxlIGNhY2hpbmcgZm9yIHRoZSBwYWdlIHRhYmxlcyB0aGF0IHdlIGp1c3QgbWFwcGVkIGluLAorICAgICAqIHNpbmNlIERPUzRHVyBhbmQgUE1PREUvVyBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aXRob3V0CisgICAgICogY2FjaGluZyBlbmFibGVkIHdoaWNoIGh1cnRzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGluZWFyIGZyYW1lYnVmZmVyCisgICAgICogYXMgaXQgZGlzYWJsZXMgd3JpdGUgY29tYmluaW5nIG9uIFBlbnRpdW0gUHJvIGFuZCBhYm92ZSBwcm9jZXNzb3JzLgorICAgICAqCisgICAgICogRm9yIHRob3NlIHByb2Nlc3NvcnMgY2FjaGUgZGlzYWJsaW5nIGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggdGhlCisgICAgICogTVRSUiByZWdpc3RlcnMgYW55d2F5ICh3ZSBjYW4gd3JpdGUgY29tYmluZSBhIHJlZ2lvbiBidXQgZGlzYWJsZQorICAgICAqIGNhY2hpbmcpIHNvIHRoYXQgTU1JTyByZWdpc3RlciByZWdpb25zIGRvIG5vdCBzY3JldyB1cC4KKyAgICAgKi8KKyAgICBpZiAoRFNCYXNlQWRkciA9PSAwKQorICAgICAgICBQTV9hZGp1c3RQYWdlVGFibGVzKGxpbkFkZHIsbGltaXQsaXNDYWNoZWQpOworCisgICAgLyogTm93IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgaW50byB0aGUgZGVmYXVsdCBEUyAqLworICAgIHJldHVybiAodm9pZCopKGxpbkFkZHIgLSBEU0Jhc2VBZGRyKTsKK30KKworI2lmIGRlZmluZWQoUE0zODYpCisKKy8qIFNvbWUgRE9TIGV4dGVuZGVyIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBjYWxsaW5nIGEKKyAqIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gSG93ZXZlciB3ZSBjYW4gc2ltdWxhdGUgd2hhdAorICogd2UgbmVlZCB0ZW1wb3JhcmlseSBob29raW5nIHRoZSBJTlQgNkFoIHZlY3RvciB3aXRoIGEgc21hbGwgcmVhbCBtb2RlCisgKiBzdHViIHRoYXQgd2lsbCBjYWxsIG91ciByZWFsIG1vZGUgY29kZSBmb3IgdXMuCisgKi8KKworc3RhdGljIHVjaGFyIGludDZBSGFuZGxlcltdID0geworICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiAgX19QTU9ERV9jYWxsUmVhbCB2YXJpYWJsZSAgICAgICAgICAgKi8KKyAgICAweEZCLCAgICAgICAgICAgICAgICAgICAgICAgLyogIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgIC8qICBjYWxsICAgIFtjczpfX1BNT0RFX2NhbGxSZWFsXSAgICAgICAqLworICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9Oworc3RhdGljIHVjaGFyICpjclB0ciA9IE5VTEw7IC8qIFBvaW50ZXIgdG8gb2YgaW50IDZBIGhhbmRsZXIgICAgICAgICAqLworc3RhdGljIHVpbnQgY3JSU2VnLGNyUk9mZjsgIC8qIFJlYWwgbW9kZSBzZWc6b2Zmc2V0IG9mIGhhbmRsZXIgICAgICAqLworCit2b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICB1Y2hhciAgICpwOworICAgIHVpbnQgICAgb2xkU2VnLG9sZE9mZjsKKworICAgIGlmICghY3JQdHIpIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIG1lbW9yeSBibG9jayBvbmx5IG9uY2UgKi8KKyAgICAgICAgY3JQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGludDZBSGFuZGxlciksICZjclJTZWcsICZjclJPZmYpOworICAgICAgICBtZW1jcHkoY3JQdHIsaW50NkFIYW5kbGVyLHNpemVvZihpbnQ2QUhhbmRsZXIpKTsKKyAgICAgICAgfQorICAgIFBNX3NldFdvcmQoY3JQdHIsb2ZmKTsgICAgICAgICAgICAgIC8qIFBsdWcgaW4gYWRkcmVzcyB0byBjYWxsICAqLworICAgIFBNX3NldFdvcmQoY3JQdHIrMixzZWcpOworICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcigwLDB4NkEgKiA0KTsKKyAgICBvbGRPZmYgPSBQTV9nZXRXb3JkKHApOyAgICAgICAgICAgICAvKiBTYXZlIG9sZCBoYW5kbGVyIGFkZHJlc3MgKi8KKyAgICBvbGRTZWcgPSBQTV9nZXRXb3JkKHArMik7CisgICAgUE1fc2V0V29yZChwLGNyUk9mZis0KTsgICAgICAgICAgICAgLyogSG9vayA2QSBoYW5kbGVyICAgICAgICAgICovCisgICAgUE1fc2V0V29yZChwKzIsY3JSU2VnKTsKKyAgICBQTV9pbnQ4NngoMHg2QSwgaW4sIGluLCBzcmVncyk7ICAgICAvKiBDYWxsIHJlYWwgbW9kZSBjb2RlICAgICAgKi8KKyAgICBQTV9zZXRXb3JkKHAsb2xkT2ZmKTsgICAgICAgICAgICAgICAvKiBSZXN0b3JlIG9sZCBoYW5kbGVyICAgICAgKi8KKyAgICBQTV9zZXRXb3JkKHArMixvbGRTZWcpOworfQorCisjZW5kaWYgIC8qIFBNMzg2ICovCisKKyNlbmRpZiAgLyogIVJFQUxNT0RFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LiBUaGUgbWVtb3J5CittYXkgYmUgcmVxdWlyZWQgdG8gYmUgYmVsb3cgdGhlIDE2TWVnIGJvdW5kYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk1lZykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgKnAsKnJvdW5kZWRQOworICAgIHVpbnQgICAgICAgICAgICByX3NlZyxyX29mZjsKKyAgICB1aW50ICAgICAgICAgICAgcm91bmRlZFNpemUgPSAoc2l6ZSArIDQgKyAweEZGRikgJiB+MHhGRkY7CisgICAgUE1fbG9ja0hhbmRsZSAgIGxoOyAvKiBVbnVzZWQgaW4gRE9TICovCisjaWZuZGVmIFJFQUxNT0RFCisgICAgVlhEX3JlZ3MgICAgICAgIHJlZ3M7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlIHRoZQorICAgICAqIGhlbHBlciBWeEQgc2VydmljZXMgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSB0aGF0IHdlIG5lZWQuCisgICAgICovCisgICAgaWYgKFZYRF92ZXJzaW9uKSB7CisgICAgICAgIG1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7CisgICAgICAgIHJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfQUxMT0NMT0NLRUQpOworICAgICAgICByZWdzLmVieCA9IHNpemU7CisgICAgICAgIHJlZ3MuZWN4ID0gKHVsb25nKXBoeXNBZGRyOworICAgICAgICByZWdzLmVkeCA9IGNvbnRpZ3VvdXMgfCAoYmVsb3cxNk1lZyA8PCA4KTsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OworICAgICAgICB9CisKKyAgICAvKiBJZiB0aGUgbWVtb3J5IGlzIG5vdCBjb250aWd1b3VzLCB3ZSBzaW1wbHkgbmVlZCB0byBhbGxvY2F0ZSBpdAorICAgICAqIHVzaW5nIHJlZ3VsYXIgbWVtb3J5IGFsbG9jYXRpb24gc2VydmljZXMsIGFuZCBsb2NrIGl0IGRvd24KKyAgICAgKiBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBGb3IgY29udGlndW91cyBtZW1vcnkgYmxvY2tzLCB0aGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIGNvbnRpZ3VvdXMgcGh5c2ljYWwKKyAgICAgKiBtZW1vcnkgYWRkcmVzc2VzIHVuZGVyIERPUyBpcyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJlbG93IHRoZQorICAgICAqIDFNZWcgYm91bmRhcnkgYXMgcmVhbCBtb2RlIG1lbW9yeS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB3ZSBtdXN0IHBhZ2UgYWxpZ24gdGhlIG1lbW9yeSBibG9jaywgYW5kIHdlIGFsc28gbXVzdAorICAgICAqIGtlZXAgdHJhY2sgb2YgdGhlIG5vbi1hbGlnbmVkIHBvaW50ZXIgc28gd2UgY2FuIHByb3Blcmx5IGZyZWUKKyAgICAgKiBpdCBsYXRlci4gSGVuY2Ugd2UgYWN0dWFsbHkgYWxsb2NhdGUgNCBieXRlcyBtb3JlIHRoYW4gdGhlCisgICAgICogc2l6ZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IDRLIGJvdW5kYXJ5LgorICAgICAqLworICAgIGlmICghY29udGlndW91cykKKyAgICAgICAgcCA9IFBNX21hbGxvYyhyb3VuZGVkU2l6ZSk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHAgPSBQTV9hbGxvY1JlYWxTZWcocm91bmRlZFNpemUsJnJfc2VnLCZyX29mZik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcm91bmRlZFAgPSAodm9pZCopKCgodWxvbmcpcCArIDB4RkZGKSAmIH4weEZGRik7CisgICAgKigodWxvbmcqKShyb3VuZGVkUCArIHNpemUpKSA9ICh1bG9uZylwOworICAgIFBNX2xvY2tEYXRhUGFnZXMocm91bmRlZFAsc2l6ZSwmbGgpOworICAgIGlmICgoKnBoeXNBZGRyID0gUE1fZ2V0UGh5c2ljYWxBZGRyKHJvdW5kZWRQKSkgPT0gMHhGRkZGRkZGRikgeworICAgICAgICBQTV9mcmVlTG9ja2VkTWVtKHJvdW5kZWRQLHNpemUsY29udGlndW91cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAvKiBEaXNhYmxlIGNhY2hpbmcgZm9yIHRoZSBtZW1vcnkgc2luY2UgaXQgaXMgcHJvYmFibHkgYSBETUEgYnVmZmVyICovCisjaWZuZGVmIFJFQUxNT0RFCisgICAgUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpcm91bmRlZFAsc2l6ZS0xLGZhbHNlKTsKKyNlbmRpZgorICAgIHJldHVybiByb3VuZGVkUDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgYmxvY2sgb2YgbG9ja2VkIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cykKK3sKKyNpZm5kZWYgUkVBTE1PREUKKyAgICBWWERfcmVncyAgICAgICAgcmVnczsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KKworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChWWERfdmVyc2lvbikgeworICAgICAgICBtZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOworICAgICAgICByZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0ZSRUVMT0NLRUQpOworICAgICAgICByZWdzLmVieCA9ICh1bG9uZylwOworICAgICAgICByZWdzLmVjeCA9IHNpemU7CisgICAgICAgIHJlZ3MuZWR4ID0gY29udGlndW91czsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBQTV91bmxvY2tEYXRhUGFnZXMocCxzaXplLCZsaCk7CisgICAgaWYgKCFjb250aWd1b3VzKQorICAgICAgICBmcmVlKCooKHZvaWQqKikoKHVjaGFyKilwICsgc2l6ZSkpKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgUE1fZnJlZVJlYWxTZWcoKigodm9pZCoqKSgoY2hhciopcCArIHNpemUpKSk7Cit9CisKKyNpZm5kZWYgUkVBTE1PREUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIHBhZ2VzIGZvciB0aGUgcGFnZSBibG9jayBtYW5hZ2VyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBwYWdlYmxvY2sgKlBNX2FkZE5ld1BhZ2VCbG9jayh2b2lkKQoreworICAgIGludCAgICAgICAgIGksc2l6ZTsKKyAgICBwYWdlYmxvY2sgICAqbmV3QmxvY2s7CisgICAgY2hhciAgICAgICAgKnAsKm5leHQ7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgcGFnZSBibG9jaywgYW5kIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KKyAgICBzaXplID0gUEFHRVNfUEVSX0JMT0NLICogUE1fUEFHRV9TSVpFICsgKFBNX1BBR0VfU0laRS0xKSArIHNpemVvZihwYWdlYmxvY2spOworICAgIGlmICgobmV3QmxvY2sgPSBQTV9tYWxsb2Moc2l6ZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld0Jsb2NrLT5wcmV2ID0gTlVMTDsKKyAgICBuZXdCbG9jay0+bmV4dCA9IHBhZ2VCbG9ja3M7CisgICAgaWYgKHBhZ2VCbG9ja3MpCisgICAgICAgIHBhZ2VCbG9ja3MtPnByZXYgPSBuZXdCbG9jazsKKyAgICBwYWdlQmxvY2tzID0gbmV3QmxvY2s7CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBwYWdlIGFsaWduZWQgZnJlZSBsaXN0IGZvciB0aGUgcGFnZSBibG9jayAqLworICAgIG5ld0Jsb2NrLT5mcmVlQ291bnQgPSBQQUdFU19QRVJfQkxPQ0s7CisgICAgbmV3QmxvY2stPmZyZWVMaXN0ID0gcCA9IChjaGFyKikoKCh1bG9uZykobmV3QmxvY2sgKyAxKSArIChQTV9QQUdFX1NJWkUtMSkpICYgfihQTV9QQUdFX1NJWkUtMSkpOworICAgIG5ld0Jsb2NrLT5mcmVlTGlzdFN0YXJ0ID0gbmV3QmxvY2stPmZyZWVMaXN0OworICAgIG5ld0Jsb2NrLT5mcmVlTGlzdEVuZCA9IHAgKyAoUEFHRVNfUEVSX0JMT0NLLTEpICogUE1fUEFHRV9TSVpFOworICAgIGZvciAoaSA9IDA7IGkgPCBQQUdFU19QRVJfQkxPQ0s7IGkrKyxwID0gbmV4dCkKKyAgICAgICAgRlJFRUxJU1RfTkVYVChwKSA9IG5leHQgPSBwICsgUE1fUEFHRV9TSVpFOworICAgIEZSRUVMSVNUX05FWFQocCAtIFBNX1BBR0VfU0laRSkgPSBOVUxMOworICAgIHJldHVybiBuZXdCbG9jazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAorICAgIGlib29sIGxvY2tlZCkKK3sKKyNpZm5kZWYgUkVBTE1PREUKKyAgICBWWERfcmVncyAgICAgICAgcmVnczsKKyAgICBwYWdlYmxvY2sgICAgICAgKmJsb2NrOworICAgIHZvaWQgICAgICAgICAgICAqcDsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KKworICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIERPUyBib3ggKi8KKyAgICBpZiAoVlhEX3ZlcnNpb24pIHsKKyAgICAgICAgbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKKyAgICAgICAgcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9BTExPQ1BBR0UpOworICAgICAgICByZWdzLmVieCA9IGxvY2tlZDsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OworICAgICAgICB9CisKKyAgICAvKiBTY2FuIHRoZSBibG9jayBsaXN0IGxvb2tpbmcgZm9yIGFueSBmcmVlIGJsb2Nrcy4gQWxsb2NhdGUgYSBuZXcKKyAgICAgKiBwYWdlIGJsb2NrIGlmIG5vIGZyZWUgYmxvY2tzIGFyZSBmb3VuZC4KKyAgICAgKi8KKyAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgeworICAgICAgICBpZiAoYmxvY2stPmZyZWVDb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKGJsb2NrID09IE5VTEwgJiYgKGJsb2NrID0gUE1fYWRkTmV3UGFnZUJsb2NrKCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJsb2NrLT5mcmVlQ291bnQtLTsKKyAgICBwID0gYmxvY2stPmZyZWVMaXN0OworICAgIGJsb2NrLT5mcmVlTGlzdCA9IEZSRUVMSVNUX05FWFQocCk7CisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgUE1fbG9ja0RhdGFQYWdlcyhwLFBNX1BBR0VfU0laRSwmbGgpOworICAgIHJldHVybiBwOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKKyAgICB2b2lkICpwKQoreworI2lmbmRlZiBSRUFMTU9ERQorICAgIFZYRF9yZWdzICAgIHJlZ3M7CisgICAgcGFnZWJsb2NrICAgKmJsb2NrOworCisgICAgLyogQ2FsbCB0aGUgaGVscGVyIFZ4RCBmb3IgdGhpcyBzZXJ2aWNlIGlmIHdlIGFyZSBydW5uaW5nIGluIGEgRE9TIGJveCAqLworICAgIGlmIChWWERfdmVyc2lvbikgeworICAgICAgICBtZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOworICAgICAgICByZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0ZSRUVQQUdFKTsKKyAgICAgICAgcmVncy5lYnggPSAodWxvbmcpcDsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBhZ2UgYmxvY2sgdGhhdCB0aGlzIHBhZ2UgYmVsb25ncyB0byAqLworICAgIGZvciAoYmxvY2sgPSBwYWdlQmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5uZXh0KSB7CisgICAgICAgIGlmIChwID49IGJsb2NrLT5mcmVlTGlzdFN0YXJ0ICYmIHAgPD0gYmxvY2stPmZyZWVMaXN0RW5kKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBDSEVDSyhibG9jayAhPSBOVUxMKTsKKworICAgIC8qIE5vdyBmcmVlIHRoZSBibG9jayBieSBhZGRpbmcgaXQgdG8gdGhlIGZyZWUgbGlzdCAqLworICAgIEZSRUVMSVNUX05FWFQocCkgPSBibG9jay0+ZnJlZUxpc3Q7CisgICAgYmxvY2stPmZyZWVMaXN0ID0gcDsKKyAgICBpZiAoKytibG9jay0+ZnJlZUNvdW50ID09IFBBR0VTX1BFUl9CTE9DSykgeworICAgICAgICAvKiBJZiBhbGwgcGFnZXMgaW4gdGhlIHBhZ2UgYmxvY2sgYXJlIG5vdyBmcmVlLCBmcmVlIHRoZSBlbnRpcmUKKyAgICAgICAgICogcGFnZSBibG9jayBpdHNlbGYuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmxvY2sgPT0gcGFnZUJsb2NrcykgeworICAgICAgICAgICAgLyogRGVsZXRlIGZyb20gaGVhZCAqLworICAgICAgICAgICAgcGFnZUJsb2NrcyA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgaWYgKGJsb2NrLT5uZXh0KQorICAgICAgICAgICAgICAgIGJsb2NrLT5uZXh0LT5wcmV2ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEZWxldGUgZnJvbSBtaWRkbGUgb2YgbGlzdCAqLworICAgICAgICAgICAgQ0hFQ0soYmxvY2stPnByZXYgIT0gTlVMTCk7CisgICAgICAgICAgICBibG9jay0+cHJldi0+bmV4dCA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgaWYgKGJsb2NrLT5uZXh0KQorICAgICAgICAgICAgICAgIGJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2stPnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgIFBNX2ZyZWUoYmxvY2spOworICAgICAgICB9CisjZWxzZQorICAgICh2b2lkKXA7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERPUyBSZWFsIE1vZGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgUkVBTE1PREUKKworI2lmbmRlZiBNS19GUAorI2RlZmluZSBNS19GUChzLG8pICAoICh2b2lkIGZhciAqKSggKCh1bG9uZykocykgPDwgMTYpICsgXAorICAgICAgICAgICAgICAgICAgICAodWxvbmcpKG8pICkpCisjZW5kaWYKKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sgcmV0dXJuIE1LX0ZQKHJfc2VnLHJfb2ZmKTsgfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICByZXR1cm4gTUtfRlAoMHg0MCwwKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreworICAgIHJldHVybiBNS19GUCgweEEwMDAsMCk7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKK3sKKyAgICB1aW50IHNlbCA9IGJhc2UgPj4gNDsKKyAgICB1aW50IG9mZiA9IGJhc2UgJiAweEY7CisgICAgbGltaXQgPSBsaW1pdDsKKyAgICByZXR1cm4gTUtfRlAoc2VsLG9mZik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCit7IHB0ciA9IHB0cjsgfQorCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKK3sKKyAgICByZXR1cm4gKCgoKHVsb25nKXAgPj4gMTYpIDw8IDQpICsgKHVzaG9ydClwKTsKK30KKworaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoreyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCit7CisgICAgLyogQ2FsbCBtYWxsb2MoKSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB1cyAqLworICAgIHZvaWQgKnAgPSBQTV9tYWxsb2Moc2l6ZSk7CisgICAgKnJfc2VnID0gRlBfU0VHKHApOworICAgICpyX29mZiA9IEZQX09GRihwKTsKKyAgICByZXR1cm4gcDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCit7CisgICAgaWYgKG1lbSkgUE1fZnJlZShtZW0pOworfQorCitpbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKK3sKKyAgICByZXR1cm4gUE1faW50Mzg2KGludG5vLGluLG91dCk7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsc3JlZ3MpOworfQorCit2b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQoreworICAgIFBNUkVHUyByZWdzOworCisgICAgcmVncy5oLmFoID0gMHg0ODsKKyAgICByZWdzLnguYnggPSAweEZGRkY7CisgICAgUE1faW50ODYoMHgyMSwmcmVncywmcmVncyk7CisgICAgKnBoeXNpY2FsID0gKnRvdGFsID0gcmVncy54LmJ4ICogMTZVTDsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQaGFyIExhcCBUTlQgRE9TIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIFROVAorCisjaW5jbHVkZSA8cGxkb3MzMi5oPgorI2luY2x1ZGUgPHBoYXJsYXAuaD4KKyNpbmNsdWRlIDxodzM4Ni5oPgorCitzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOworCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICBpZiAoIXplcm9QdHIpCisgICAgICAgIHplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOworICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyAweDQwMCk7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKK3sKKyAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKKyAgICBpZiAoIWJhbmtQdHIpCisgICAgICAgIGJhbmtQdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7CisgICAgcmV0dXJuIGJhbmtQdHI7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKK3sKKyAgICBDT05GSUdfSU5GICBjb25maWc7CisgICAgVUxPTkcgICAgICAgb2Zmc2V0OworICAgIGludCAgICAgICAgIGVycjsKKyAgICB1bG9uZyAgICAgICBiYXNlQWRkcixiYXNlT2ZzLG5ld0xpbWl0OworICAgIFZYRF9yZWdzICAgIHJlZ3M7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlCisgICAgICogdGhlIGhlbHBlciBWeEQgc2VydmljZXMgdG8gbWFwIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBEUE1JIHNlcnZpY2VzLgorICAgICAqIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgaGVscGVyIFZ4RCBjYW4gcHJvcGVybHkgZGlzYWJsZSBjYWNoaW5nCisgICAgICogd2hlcmUgbmVjZXNzYXJ5LCB3aGljaCB3ZSBjYW4gb25seSBkbyBkaXJlY3RseSBoZXJlIGlmIHdlIGFyZQorICAgICAqIHJ1bm5pbmcgYXQgcmluZyAwIChpZTogdW5kZXIgcmVhbCBET1MpLgorICAgICAqLworICAgIGlmIChWWERfdmVyc2lvbiA9PSAtMSkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGlmIChWWERfdmVyc2lvbikgeworICAgICAgICBtZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOworICAgICAgICByZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX01BUFBIWVMpOworICAgICAgICByZWdzLmVieCA9IGJhc2U7CisgICAgICAgIHJlZ3MuZWN4ID0gbGltaXQ7CisgICAgICAgIHJlZ3MuZWR4ID0gaXNDYWNoZWQ7CisgICAgICAgIF9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKKyAgICAgICAgcmV0dXJuICh2b2lkKilyZWdzLmVheDsKKyAgICAgICAgfQorCisgICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCisgICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBUTlQuIElmIHdlIHJvdW5kIHRoZQorICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKKyAgICAgKiB0aGF0IHdlIHJldHVybi4KKyAgICAgKi8KKyAgICBiYXNlT2ZzID0gYmFzZSAmIDQwOTU7CisgICAgYmFzZUFkZHIgPSBiYXNlICYgfjQwOTU7CisgICAgbmV3TGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOworICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7CisgICAgZXJyID0gX2R4X21hcF9waHlzKGNvbmZpZy5jX2RzX3NlbCxiYXNlQWRkciwobmV3TGltaXQgKyA0MDk1KSAvIDQwOTYsJm9mZnNldCk7CisgICAgaWYgKGVyciA9PSAxMzApIHsKKyAgICAgICAgLyogSWYgdGhlIFROVCBmdW5jdGlvbiBmYWlsZWQsIHdlIGFyZSBydW5uaW5nIGluIGEgRFBNSSBlbnZpcm9ubWVudAorICAgICAgICAgKiBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrLiBIb3dldmVyIHdlIGtub3cgaG93IHRvIGhhbmRsZQorICAgICAgICAgKiBEUE1JIHByb3Blcmx5LCBzbyB3ZSB1c2Ugb3VyIGdlbmVyaWMgRFBNSSBmdW5jdGlvbnMgdG8gZG8KKyAgICAgICAgICogd2hhdCB0aGUgVE5UIHJ1bnRpbWUgbGlicmFyaWVzIGNhbid0LgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIERQTUlfbWFwUGh5c2ljYWxBZGRyKGJhc2UsbGltaXQsaXNDYWNoZWQpOworICAgICAgICB9CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICByZXR1cm4gKHZvaWQqKShvZmZzZXQgKyBiYXNlT2ZzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKK30KKwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7IHJldHVybiAweEZGRkZGRkZGVUw7IH0KKworaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoreyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sKKyAgICBpZiAoIXplcm9QdHIpCisgICAgICAgIHplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGKTsKKyAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOworfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKK3sKKyAgICBVU0hPUlQgIGFkZHIsdDsKKyAgICB2b2lkICAgICpwOworCisgICAgaWYgKF9keF9yZWFsX2FsbG9jKChzaXplICsgMHhGKSA+PiA0LCZhZGRyLCZ0KSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcl9zZWcgPSBhZGRyOyAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IGFkZHJlc3MgICAgKi8KKyAgICAqcl9vZmYgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mZnNldCAgICAgKi8KKyAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7CisgICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxhZGRyKTsKKyAgICByZXR1cm4gcDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCit7CisgICAgaWYgKG1lbSkgX2R4X3JlYWxfZnJlZShfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKSk7Cit9CisKKyNkZWZpbmUgSU5EUE1JKHJlZykgICAgIHJtcmVncy5yZWcgPSByZWdzLT5yZWcKKyNkZWZpbmUgT1VURFBNSShyZWcpICAgIHJlZ3MtPnJlZyA9IHJtcmVncy5yZWcKKwordm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQoreworICAgIFNXSV9SRUdTICAgIHJtcmVnczsKKworICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7CisgICAgSU5EUE1JKGVheCk7IElORFBNSShlYngpOyBJTkRQTUkoZWN4KTsgSU5EUE1JKGVkeCk7IElORFBNSShlc2kpOyBJTkRQTUkoZWRpKTsKKworICAgIF9keF9yZWFsX2ludChpbnRubywmcm1yZWdzKTsKKworICAgIE9VVERQTUkoZWF4KTsgT1VURFBNSShlYngpOyBPVVREUE1JKGVjeCk7IE9VVERQTUkoZWR4KTsgT1VURFBNSShlc2kpOyBPVVREUE1JKGVkaSk7CisgICAgcmVncy0+ZmxhZ3MgPSBybXJlZ3MuZmxhZ3M7Cit9CisKKyNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZworI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZworCitpbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKK3sKKyAgICBTV0lfUkVHUyAgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisKKyAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7CisKKyAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOworICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKKyAgICByZXR1cm4gb3V0LT54LmF4OworfQorCitpbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgU1dJX1JFR1MgICAgcm1yZWdzOworCisgICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKKyAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOworICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKKyAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7CisKKyAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7CisKKyAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOworICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKKyAgICBzcmVncy0+Y3MgPSBybXJlZ3MuY3M7CisgICAgc3JlZ3MtPnNzID0gcm1yZWdzLnNzOworICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKKyAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7CisgICAgcmV0dXJuIG91dC0+eC5heDsKK30KKwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKK3sKKyAgICBQTVJFR1MgIHI7CisgICAgdWludCAgICBkYXRhWzI1XTsKKworICAgIHIueC5heCA9IDB4MjUyMDsgICAgICAgICAgICAgICAgLyogR2V0IGZyZWUgbWVtb3J5IGluZm8gKi8KKyAgICByLnguYnggPSAwOworICAgIHIuZS5lZHggPSAodWludClkYXRhOworICAgIFBNX2ludDM4NigweDIxLCAmciwgJnIpOworICAgICpwaHlzaWNhbCA9IGRhdGFbMjFdICogNDA5NjsKKyAgICAqdG90YWwgPSBkYXRhWzIzXSAqIDQwOTY7Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3ltYW50ZWMgQysrIERPU1ggYW5kIEZsYXNoVGVrIFgtMzIvWC0zMlZNIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPU1gpIHx8IGRlZmluZWQoWDMyVk0pCisKKyNpZmRlZiAgWDMyVk0KKyNpbmNsdWRlIDx4MzIuaD4KKworI2RlZmluZSBfeDM4Nl9ta19wcm90ZWN0ZWRfcHRyKHApICAgX3gzMl9ta19wcm90ZWN0ZWRfcHRyKCh2b2lkKilwKQorI2RlZmluZSBfeDM4Nl9mcmVlX3Byb3RlY3RlZF9wdHIocCkgX3gzMl9mcmVlX3Byb3RlY3RlZF9wdHIocCkKKyNkZWZpbmUgX3gzODZfemVyb19iYXNlX3B0ciAgICAgICAgIF94MzJfemVyb19iYXNlX3B0cgorI2Vsc2UKK2V4dGVybiB2b2lkICpfeDM4Nl96ZXJvX2Jhc2VfcHRyOworI2VuZGlmCisKK3ZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCit7CisgICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIuaC5haCA9IDB4NDg7ICAgICAgICAgICAgICAgICAgLyogRE9TIGZ1bmN0aW9uIDQ4aCAtIGFsbG9jYXRlIG1lbSAgKi8KKyAgICByLnguYnggPSAoc2l6ZSArIDB4RikgPj4gNDsgICAgIC8qIE51bWJlciBvZiBwYXJhZ3JhcGhzIHRvIGFsbG9jYXRlICovCisgICAgUE1faW50Mzg2KDB4MjEsICZyLCAmcik7ICAgICAgICAvKiBDYWxsIERPUyBleHRlbmRlciAgICAgICAgICAgICAgICAqLworICAgIGlmIChyLnguY2ZsYWcpCisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBDb3VsZCBub3QgYWxsb2NhdGUgdGhlIG1lbW9yeSAgICAqLworICAgICpyX3NlZyA9IHIuZS5lYXg7CisgICAgKnJfb2ZmID0gMDsKKyAgICByZXR1cm4gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQoreworICAgIC8qIENhbm5vdCBkZS1hbGxvY2F0ZSB0aGlzIG1lbW9yeSAqLworICAgIG1lbSA9IG1lbTsKK30KKworI3ByYWdtYSBwYWNrKDEpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1c2hvcnQgIGludG5vOworICAgIHVzaG9ydCAgZHM7CisgICAgdXNob3J0ICBlczsKKyAgICB1c2hvcnQgIGZzOworICAgIHVzaG9ydCAgZ3M7CisgICAgdWxvbmcgICBlYXg7CisgICAgdWxvbmcgICBlZHg7CisgICAgfSBfUk1SRUdTOworCisjcHJhZ21hIHBhY2soKQorCisjZGVmaW5lIElOKHJlZykgICAgIHJlZ3MuZS5yZWcgPSBpbi0+ZS5yZWcKKyNkZWZpbmUgT1VUKHJlZykgICAgb3V0LT5lLnJlZyA9IHJlZ3MuZS5yZWcKKworaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCit7CisgICAgX1JNUkVHUyBybXJlZ3M7CisgICAgUE1SRUdTICByZWdzOworICAgIFBNU1JFR1MgcG1zcmVnczsKKworICAgIHJtcmVncy5pbnRubyA9IGludG5vOworICAgIHJtcmVncy5lYXggPSBpbi0+ZS5lYXg7CisgICAgcm1yZWdzLmVkeCA9IGluLT5lLmVkeDsKKyAgICBJTihlYngpOyBJTihlY3gpOyBJTihlc2kpOyBJTihlZGkpOworICAgIHJlZ3MueC5heCA9IDB4MjUxMTsKKyAgICByZWdzLmUuZWR4ID0gKHVpbnQpKCZybXJlZ3MpOworICAgIFBNX3NlZ3JlYWQoJnBtc3JlZ3MpOworICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmcG1zcmVncyk7CisKKyAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZXNpKTsgT1VUKGVkaSk7CisgICAgb3V0LT54LmR4ID0gcm1yZWdzLmVkeDsKKyAgICBvdXQtPnguY2ZsYWcgPSByZWdzLnguY2ZsYWc7CisgICAgcmV0dXJuIG91dC0+eC5heDsKK30KKworaW50IFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LCBSTVNSRUdTICpzcmVncykKK3sKKyAgICBfUk1SRUdTIHJtcmVnczsKKyAgICBQTVJFR1MgIHJlZ3M7CisgICAgUE1TUkVHUyBwbXNyZWdzOworCisgICAgcm1yZWdzLmludG5vID0gaW50bm87CisgICAgcm1yZWdzLmVheCA9IGluLT5lLmVheDsKKyAgICBybXJlZ3MuZWR4ID0gaW4tPmUuZWR4OworICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKKyAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7CisgICAgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZXNpKTsgSU4oZWRpKTsKKyAgICByZWdzLnguYXggPSAweDI1MTE7CisgICAgcmVncy5lLmVkeCA9ICh1aW50KSgmcm1yZWdzKTsKKyAgICBQTV9zZWdyZWFkKCZwbXNyZWdzKTsKKyAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnBtc3JlZ3MpOworCisgICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVzaSk7IE9VVChlZGkpOworICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKKyAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7CisgICAgb3V0LT54LmR4ID0gcm1yZWdzLmVkeDsKKyAgICBvdXQtPnguY2ZsYWcgPSByZWdzLnguY2ZsYWc7CisgICAgcmV0dXJuIG91dC0+eC5heDsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCit7CisgICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyAweDQwMCk7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKK3sKKyAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIDB4QTAwMDApOworfQorCit2b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCit7CisgICAgVlhEX3JlZ3MgICAgcmVnczsKKworICAgIC8qIElmIHdlIGhhdmUgY29ubmVjdGVkIHRvIG91ciBoZWxwZXIgVnhEIGluIGEgV2luZG93cyBET1MgYm94LCB1c2UKKyAgICAgKiB0aGUgaGVscGVyIFZ4RCBzZXJ2aWNlcyB0byBtYXAgbWVtb3J5IGluc3RlYWQgb2YgdGhlIERQTUkgc2VydmljZXMuCisgICAgICogV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBoZWxwZXIgVnhEIGNhbiBwcm9wZXJseSBkaXNhYmxlIGNhY2hpbmcKKyAgICAgKiB3aGVyZSBuZWNlc3NhcnksIHdoaWNoIHdlIGNhbiBvbmx5IGRvIGRpcmVjdGx5IGhlcmUgaWYgd2UgYXJlCisgICAgICogcnVubmluZyBhdCByaW5nIDAgKGllOiB1bmRlciByZWFsIERPUykuCisgICAgICovCisgICAgaWYgKFZYRF92ZXJzaW9uID09IC0xKQorICAgICAgICBQTV9pbml0KCk7CisgICAgaWYgKFZYRF92ZXJzaW9uKSB7CisgICAgICAgIG1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7CisgICAgICAgIHJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfTUFQUEhZUyk7CisgICAgICAgIHJlZ3MuZWJ4ID0gYmFzZTsKKyAgICAgICAgcmVncy5lY3ggPSBsaW1pdDsKKyAgICAgICAgcmVncy5lZHggPSBpc0NhY2hlZDsKKyAgICAgICAgX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOworICAgICAgICByZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OworICAgICAgICB9CisKKyAgICBpZiAoYmFzZSA+IDB4MTAwMDAwKQorICAgICAgICByZXR1cm4gX3gzODZfbWFwX3BoeXNpY2FsX2FkZHJlc3MoKHZvaWQqKWJhc2UsbGltaXQpOworICAgIHJldHVybiAodm9pZCopKCh1bG9uZylfeDM4Nl96ZXJvX2Jhc2VfcHRyICsgYmFzZSk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCit7CisgICAgLyogTWFwcGluZyBjYW5ub3QgYmUgZnJlZWQgKi8KK30KKwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7IHJldHVybiAweEZGRkZGRkZGVUw7IH0KKworaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoreyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KKwordWxvbmcgX2NkZWNsIF9YMzJfZ2V0UGh5c01lbSh2b2lkKTsKKwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisKKyAgICAvKiBHZXQgdG90YWwgbWVtb3J5IGF2YWlsYWJsZSwgaW5jbHVkaW5nIHZpcnR1YWwgbWVtb3J5ICovCisgICAgcmVncy54LmF4ID0gMHgzNTBCOworICAgIFBNX2ludDM4NigweDIxLCZyZWdzLCZyZWdzKTsKKyAgICAqdG90YWwgPSByZWdzLmUuZWF4OworCisgICAgLyogR2V0IHBoeXNpY2FsIG1lbW9yeSBhdmFpbGFibGUgKi8KKyAgICAqcGh5c2ljYWwgPSBfWDMyX2dldFBoeXNNZW0oKTsKKyAgICBpZiAoKnBoeXNpY2FsID4gKnRvdGFsKQorICAgICAgICAqcGh5c2ljYWwgPSAqdG90YWw7Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQm9ybGFuZCdzIERQTUkzMiwgV2F0Y29tIERPUzRHVyBhbmQgREpHUFAgRFBNSSBzdXBwb3J0IHJvdXRpbmVzICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERQTUkzMikgfHwgZGVmaW5lZChET1M0R1cpIHx8IGRlZmluZWQoREpHUFApCisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoreworICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsMHhGRkZGLHRydWUpOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCit7CisgICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoreworICAgIFZYRF9yZWdzICAgIHJlZ3M7CisKKyNpZmRlZiAgREpHUFAKKyAgICAvKiBFbmFibGUgbmVhciBwb2ludGVycyBmb3IgREpHUFAgVjIgKi8KKyAgICBfX2RqZ3BwX25lYXJwdHJfZW5hYmxlKCk7CisjZW5kaWYKKyAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlCisgICAgICogdGhlIGhlbHBlciBWeEQgc2VydmljZXMgdG8gbWFwIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBEUE1JIHNlcnZpY2VzLgorICAgICAqIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgaGVscGVyIFZ4RCBjYW4gcHJvcGVybHkgZGlzYWJsZSBjYWNoaW5nCisgICAgICogd2hlcmUgbmVjZXNzYXJ5LCB3aGljaCB3ZSBjYW4gb25seSBkbyBkaXJlY3RseSBoZXJlIGlmIHdlIGFyZQorICAgICAqIHJ1bm5pbmcgYXQgcmluZyAwIChpZTogdW5kZXIgcmVhbCBET1MpLgorICAgICAqLworICAgIGlmIChWWERfdmVyc2lvbiA9PSAtMSkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGlmIChWWERfdmVyc2lvbikgeworICAgICAgICBtZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOworICAgICAgICByZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX01BUFBIWVMpOworICAgICAgICByZWdzLmVieCA9IGJhc2U7CisgICAgICAgIHJlZ3MuZWN4ID0gbGltaXQ7CisgICAgICAgIHJlZ3MuZWR4ID0gaXNDYWNoZWQ7CisgICAgICAgIF9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKKyAgICAgICAgcmV0dXJuICh2b2lkKilyZWdzLmVheDsKKyAgICAgICAgfQorICAgIHJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKKyAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlZCAqLworICAgICh2b2lkKXB0cjsKKyAgICAodm9pZClsaW1pdDsKK30KKwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7CisgICAgdWxvbmcgICBwaHlzQWRkcjsKKyAgICBpZiAoIVBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHAsMSwmcGh5c0FkZHIpKQorICAgICAgICByZXR1cm4gMHhGRkZGRkZGRjsKKyAgICByZXR1cm4gcGh5c0FkZHIgfCAoKHVsb25nKXAgJiAweEZGRik7Cit9CisKK2lib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAorICAgIHZvaWQgKnAsCisgICAgdWxvbmcgbGVuZ3RoLAorICAgIHVsb25nICpwaHlzQWRkcmVzcykKK3sKKyAgICBWWERfcmVncyAgICByZWdzOworICAgIHVsb25nICAgICAgIHB0ZTsKKyAgICBQTVNSRUdTICAgICBzcmVnczsKKyAgICB1bG9uZyAgICAgICBEU0Jhc2VBZGRyOworCisgICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZSB0aGUKKyAgICAgKiBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYW4gYWRkcmVzcy4KKyAgICAgKi8KKyAgICBpZiAoVlhEX3ZlcnNpb24pIHsKKyAgICAgICAgbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKKyAgICAgICAgcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRQSFlTSUNBTEFERFJSQU5HRSk7CisgICAgICAgIHJlZ3MuZWJ4ID0gKHVsb25nKXA7CisgICAgICAgIHJlZ3MuZWN4ID0gKHVsb25nKWxlbmd0aDsKKyAgICAgICAgcmVncy5lZHggPSAodWxvbmcpcGh5c0FkZHJlc3M7CisgICAgICAgIF9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKKyAgICAgICAgcmV0dXJuIHJlZ3MuZWF4OworICAgICAgICB9CisKKyAgICAvKiBGaW5kIGJhc2UgYWRkcmVzcyBmb3IgZGVmYXVsdCBEUyBzZWxlY3RvciAqLworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOworCisgICAgLyogT3RoZXJ3aXNlIGRpcmVjdGx5IGFjY2VzcyB0aGUgcGFnZSB0YWJsZXMgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAqIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLiBOb3RlIHRoYXQgd2UgdG91Y2ggdGhlIG1lbW9yeSBiZWZvcmUKKyAgICAgKiBjYWxsaW5nLCBvdGhlcndpc2UgdGhlIG1lbW9yeSBtYXkgbm90IGJlIHBhZ2VkIGluIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdGUgPSAqKCh1bG9uZyopcCk7CisjaWZkZWYgIERPUzRHVworICAgIGlmIChfUE1fcGFnaW5nRW5hYmxlZCgpID09IDApIHsKKyAgICAgICAgaW50ICAgICBjb3VudDsKKyAgICAgICAgdWxvbmcgICBsaW5BZGRyID0gKHVsb25nKXA7CisKKyAgICAgICAgLyogV2hlbiBwYWdpbmcgaXMgZGlzYWJsZWQgcGh5c2ljYWw9bGluZWFyICovCisgICAgICAgIGZvciAoY291bnQgPSAobGVuZ3RoKzB4RkZGKSA+PiAxMjsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICAqcGh5c0FkZHJlc3MrKyA9IGxpbkFkZHI7CisgICAgICAgICAgICBsaW5BZGRyICs9IDQwOTY7CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgZWxzZSBpZiAoKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCAmJiBEU0Jhc2VBZGRyID09IDApIHsKKyAgICAgICAgaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7CisgICAgICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlLGxpbkFkZHIgPSAodWxvbmcpcDsKKyAgICAgICAgdWxvbmcgICBsaW1pdCA9IGxlbmd0aC0xOworCisgICAgICAgIHBQREIgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihQREIsMHhGRkYpOworICAgICAgICBpZiAocFBEQikgeworICAgICAgICAgICAgc3RhcnRQREIgPSAobGluQWRkciA+PiAyMikgJiAweDNGRkw7CisgICAgICAgICAgICBzdGFydFBhZ2UgPSAobGluQWRkciA+PiAxMikgJiAweDNGRkw7CisgICAgICAgICAgICBlbmRQREIgPSAoKGxpbkFkZHIrbGltaXQpID4+IDIyKSAmIDB4M0ZGTDsKKyAgICAgICAgICAgIGVuZFBhZ2UgPSAoKGxpbkFkZHIrbGltaXQpID4+IDEyKSAmIDB4M0ZGTDsKKyAgICAgICAgICAgIGZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7CisgICAgICAgICAgICAgICAgcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRkw7CisgICAgICAgICAgICAgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRik7CisgICAgICAgICAgICAgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOworICAgICAgICAgICAgICAgIGVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkZMOworICAgICAgICAgICAgICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQorICAgICAgICAgICAgICAgICAgICAqcGh5c0FkZHJlc3MrKyA9IChwUGFnZVRhYmxlW2lQYWdlXSAmIH4weEZGRik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreworICAgICh2b2lkKWxpbWl0OworICAgIHJldHVybiAodm9pZCopYmFzZTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sKKyAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOworCisgICAgaWYgKCF6ZXJvUHRyKQorICAgICAgICB6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKKyAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOworfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKK3sKKyAgICBQTVJFR1MgICAgICByOworICAgIHZvaWQgICAgICAgICpwOworCisgICAgci54LmF4ID0gMHgxMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgICAgICAgICAqLworICAgIHIueC5ieCA9IChzaXplICsgMHhGKSA+PiA0OyAgICAgLyogbnVtYmVyIG9mIHBhcmFncmFwaHMgICAgICAgICAgICAgKi8KKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICBpZiAoci54LmNmbGFnKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogRFBNSSBjYWxsIGZhaWxlZCAgICAgICAgICAgICAgICAgKi8KKyAgICAqcl9zZWcgPSByLnguYXg7ICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50ICAgICAgICAgICAgICAgICovCisgICAgKnJfb2ZmID0gMDsKKyAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7CisgICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxyLnguZHgpOworICAgIHJldHVybiBwOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKK3sKKyAgICBQTVJFR1MgIHI7CisKKyAgICBpZiAobWVtKSB7CisgICAgICAgIHIueC5heCA9IDB4MTAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZnJlZSBET1MgbWVtb3J5ICAgICAgICAgKi8KKyAgICAgICAgci54LmR4ID0gX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKG1lbSk7LyogRFggOj0gc2VsZWN0b3IgZnJvbSAweDEwMCAgICAqLworICAgICAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgRFBNSV9oYW5kbGVyX3QgICBEUE1JX2ludDEwID0gTlVMTDsKKwordm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKQoreworICAgIERQTUlfaW50MTAgPSBoYW5kbGVyOworfQorCit2b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCit7CisgICAgUE1SRUdTICAgICAgcjsKKyAgICBQTVNSRUdTICAgICBzcjsKKworICAgIGlmIChpbnRubyA9PSAweDEwICYmIERQTUlfaW50MTApIHsKKyAgICAgICAgaWYgKERQTUlfaW50MTAocmVncykpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBQTV9zZWdyZWFkKCZzcik7CisgICAgci54LmF4ID0gMHgzMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCisgICAgci5oLmJsID0gaW50bm87CisgICAgci5oLmJoID0gMDsKKyAgICByLnguY3ggPSAwOworICAgIHNyLmVzID0gc3IuZHM7CisgICAgci5lLmVkaSA9ICh1aW50KXJlZ3M7CisgICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICAgICAgICAgICovCit9CisKKyNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZworI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZworCitpbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKK3sKKyAgICBEUE1JX3JlZ3MgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisKKyAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KKworICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7CisgICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBEUE1JX3JlZ3MgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisgICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOworICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKKworICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7ICAgICAgLyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLworCisgICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKKyAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7CisgICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOworICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKKyAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7CisgICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKKyNwcmFnbWEgcGFjaygxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVpbnQgICAgTGFyZ2VzdEJsb2NrQXZhaWw7CisgICAgICAgIHVpbnQgICAgTWF4VW5sb2NrZWRQYWdlOworICAgICAgICB1aW50ICAgIExhcmdlc3RMb2NrYWJsZVBhZ2U7CisgICAgICAgIHVpbnQgICAgTGluQWRkclNwYWNlOworICAgICAgICB1aW50ICAgIE51bUZyZWVQYWdlc0F2YWlsOworICAgICAgICB1aW50ICAgIE51bVBoeXNpY2FsUGFnZXNGcmVlOworICAgICAgICB1aW50ICAgIFRvdGFsUGh5c2ljYWxQYWdlczsKKyAgICAgICAgdWludCAgICBGcmVlTGluQWRkclNwYWNlOworICAgICAgICB1aW50ICAgIFNpemVPZlBhZ2VGaWxlOworICAgICAgICB1aW50ICAgIHJlc1szXTsKKyAgICAgICAgfSBNZW1JbmZvOworCisjcHJhZ21hIHBhY2soKQorCit2b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQoreworICAgIFBNUkVHUyAgcjsKKyAgICBQTVNSRUdTIHNyOworICAgIE1lbUluZm8gbWVtSW5mbzsKKworICAgIFBNX3NlZ3JlYWQoJnNyKTsKKyAgICByLnguYXggPSAweDUwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgZ2V0IGZyZWUgbWVtb3J5IGluZm8gKi8KKyAgICBzci5lcyA9IHNyLmRzOworICAgIHIuZS5lZGkgPSAodWludCkmbWVtSW5mbzsKKyAgICBQTV9pbnQzODZ4KDB4MzEsICZyLCAmciwgJnNyKTsgIC8qIElzc3VlIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICAqcGh5c2ljYWwgPSBtZW1JbmZvLk51bVBoeXNpY2FsUGFnZXNGcmVlICogNDA5NjsKKyAgICAqdG90YWwgPSBtZW1JbmZvLkxhcmdlc3RCbG9ja0F2YWlsOworICAgIGlmICgqdG90YWwgPCAqcGh5c2ljYWwpCisgICAgICAgICpwaHlzaWNhbCA9ICp0b3RhbDsKK30KKworI2VuZGlmCisKKyNpZm5kZWYgX18xNkJJVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCisgICAgaW50IGJhbmspCit7CisgICAgRFBNSV9yZWdzICAgcmVnczsKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisgICAgcmVncy5lYXggPSAweDRGMDU7CisgICAgcmVncy5lYnggPSAweDAwMDA7CisgICAgcmVncy5lZHggPSBiYW5rOworICAgIERQTUlfaW50ODYoMHgxMCwmcmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAorICAgIGludCBiYW5rKQoreworICAgIERQTUlfcmVncyAgIHJlZ3M7CisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworICAgIHJlZ3MuZWF4ID0gMHg0RjA1OworICAgIHJlZ3MuZWJ4ID0gMHgwMDAwOworICAgIHJlZ3MuZWR4ID0gYmFuazsKKyAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOworICAgIHJlZ3MuZWF4ID0gMHg0RjA1OworICAgIHJlZ3MuZWJ4ID0gMHgwMDAxOworICAgIHJlZ3MuZWR4ID0gYmFuazsKKyAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IHdhaXRWUlQpCit7CisgICAgRFBNSV9yZWdzICAgcmVnczsKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisgICAgcmVncy5lYXggPSAweDRGMDc7CisgICAgcmVncy5lYnggPSB3YWl0VlJUOworICAgIHJlZ3MuZWN4ID0geDsKKyAgICByZWdzLmVkeCA9IHk7CisgICAgRFBNSV9pbnQ4NigweDEwLCZyZWdzKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG1kb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY4NDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMKQEAgLTAsMCArMSwxNjM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAxNi8zMiBiaXQgRE9TCisqCisqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCisqICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCisqICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQorKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCisqICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRvcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFJFQUxNT0RFCitzdGF0aWMgaW50ICBnbG9iYWxEYXRhU3RhcnQ7CisjZW5kaWYKKworUE1fY3JpdGljYWxIYW5kbGVyICBfVkFSQVBJIF9QTV9jcml0SGFuZGxlciA9IE5VTEw7CitQTV9icmVha0hhbmRsZXIgICAgIF9WQVJBUEkgX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7CitQTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7CitQTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOworUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9rZXlIYW5kbGVyID0gTlVMTDsKK1BNX2tleTE1SGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKK1BNX21vdXNlSGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKK1BNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1faW50MTBIYW5kbGVyID0gTlVMTDsKK2ludCAgICAgICAgICAgICAgICAgX1ZBUkFQSSBfUE1fbW91c2VNYXNrOworCit1Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jdHJsQ1B0cjsgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDdHJsLUMgZmxhZyAgICAgICovCit1Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jdHJsQlB0cjsgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDdHJsLUJyZWFrIGZsYWcgICovCit1Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jcml0UHRyOyAgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDcml0aWNhbCBlcnJvciBCZiovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2VGltZXIgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyB0aW1lciBoYW5kbGVyICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2UlRDID0gUE1OVUxMOyAgICAgICAvKiBQcmV2aW91cyBSVEMgaGFuZGxlciAgICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2S2V5ID0gUE1OVUxMOyAgICAgICAvKiBQcmV2aW91cyBrZXkgaGFuZGxlciAgICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2S2V5MTUgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBrZXkxNSBoYW5kbGVyICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2QnJlYWsgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBicmVhayBoYW5kbGVyICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2Q3RybEMgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBDdHJsQyBoYW5kbGVyICAgICAgICovCitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2Q3JpdGljYWwgPSBQTU5VTEw7ICAvKiBQcmV2aW91cyBjcml0aWNhbCBoYW5kbGVyICAgICovCitsb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbFRpbWVyOyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgdGltZXIgICAgICovCitsb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbFJUQzsgICAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgUlRDICAgICAgICovCitsb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEtleTsgICAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUga2V5ICAgICAgICovCitsb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEtleTE1OyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUga2V5MTUgICAgICovCitsb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEludDEwOyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgaW50IDEwaCAgICovCitzdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsgICAgICAgICAgICAvKiBDTU9TIHJlZ2lzdGVyIEEgY29udGVudHMgICAgICovCitzdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQjsgICAgICAgICAgICAvKiBDTU9TIHJlZ2lzdGVyIEIgY29udGVudHMgICAgICovCitzdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRSVENQSUMyOyAgICAgICAgICAgICAvKiBNYXNrIHZhbHVlIGZvciBSVEMgSVJROCAgICAgICovCisKKy8qIFN0cnVjdHVyZSB0byBtYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlcnMsCisgKiBpbmNsdWRlIGEgY29weSBvZiB0aGUgaGFyZHdhcmUgSVJRIGFzc2VtYmxlciB0aHVuayAob25lIGZvciBlYWNoCisgKiBob29rZWQgaW50ZXJydXB0IGhhbmRsZXIpLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1Y2hhciAgICAgICBJUlE7CisgICAgdWNoYXIgICAgICAgSVJRVmVjdDsKKyAgICB1Y2hhciAgICAgICBwcmV2UElDOworICAgIHVjaGFyICAgICAgIHByZXZQSUMyOworICAgIFBNRkFSUFRSICAgIHByZXZIYW5kbGVyOworICAgIGxvbmcgICAgICAgIHByZXZSZWFsaGFuZGxlcjsKKyAgICB1Y2hhciAgICAgICB0aHVua1sxXTsKKyAgICAvKiBJUlEgYXNzZW1ibGVyIHRodW5rIGZvbGxvd3MgLi4uICovCisgICAgfSBfUE1fSVJRSGFuZGxlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHbG9iYWxzIGZvciBsb2NraW5nIGludGVycnVwdCBoYW5kbGVycyBpbiBfcG1kb3MuYXNtICovCisKKyNpZm5kZWYgUkVBTE1PREUKK2V4dGVybiBpbnQgIF9WQVJBUEkgX1BNX3BtZG9zRGF0YVN0YXJ0OworZXh0ZXJuIGludCAgX1ZBUkFQSSBfUE1fcG1kb3NEYXRhRW5kOworZXh0ZXJuIGludCAgX1ZBUkFQSSBfUE1fRE1BRGF0YVN0YXJ0OworZXh0ZXJuIGludCAgX1ZBUkFQSSBfUE1fRE1BRGF0YUVuZDsKK3ZvaWQgX0FTTUFQSSBfUE1fcG1kb3NDb2RlU3RhcnQodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX3BtZG9zQ29kZUVuZCh2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1fRE1BQ29kZVN0YXJ0KHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9ETUFDb2RlRW5kKHZvaWQpOworI2VuZGlmCisKKy8qIFByb3RlY3RlZCBtb2RlIGludGVycnVwdCBoYW5kbGVycywgYWxzbyBjYWxsZWQgYnkgUE0gY2FsbGJhY2tzIGJlbG93ICovCisKK3ZvaWQgX0FTTUFQSSBfUE1fdGltZXJJU1Iodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX3J0Y0lTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1faXJxSVNSVGVtcGxhdGUodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX2lycUlTUlRlbXBsYXRlRW5kKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9rZXlJU1Iodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX2tleTE1SVNSKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9icmVha0lTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1fY3RybENJU1Iodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX2NyaXRpY2FsSVNSKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9tb3VzZUlTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1faW50MTBQTUNCKHZvaWQpOworCisvKiBQcm90ZWN0ZWQgbW9kZSBEUE1JIGNhbGxiYWNrIGhhbmRsZXJzICovCisKK3ZvaWQgX0FTTUFQSSBfUE1fbW91c2VQTUNCKHZvaWQpOworCisvKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBoYW5kbGVyIGZ1bmN0aW9uICovCisKK3ZvaWQgX0FTTUFQSSBfUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrKTsKKworLyogUm91dGluZSB0byBhbGxvY2F0ZSBEUE1JIHJlYWwgbW9kZSBjYWxsYmFjayByb3V0aW5lcyAqLworCitpYm9vbCBfQVNNQVBJIF9EUE1JX2FsbG9jYXRlQ2FsbGJhY2sodm9pZCAoX0FTTUFQSSAqcG1jb2RlKSgpLHZvaWQgKnJtcmVncyxsb25nICpSTUNCKTsKK3ZvaWQgX0FTTUFQSSBfRFBNSV9mcmVlQ2FsbGJhY2sobG9uZyBSTUNCKTsKKworLyogRFBNSSBoZWxwZXIgZnVuY3Rpb25zIGluIFBNTElURS5DICovCisKK3Vsb25nICAgUE1BUEkgRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHVsb25nIHBoeXNBZGRyLHVsb25nIGxpbWl0KTsKK2ludCAgICAgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCx1bG9uZyBsaW5BZGRyKTsKK3Vsb25nICAgUE1BUEkgRFBNSV9nZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCk7CitpbnQgICAgIFBNQVBJIERQTUlfc2V0U2VsZWN0b3JMaW1pdCh1c2hvcnQgc2VsLHVsb25nIGxpbWl0KTsKK3VpbnQgICAgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KTsKK3ZvaWQgICAgUE1BUEkgRFBNSV9mcmVlU2VsZWN0b3IodWludCBzZWwpOworaW50ICAgICBQTUFQSSBEUE1JX2xvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKTsKK2ludCAgICAgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKTsKKworLyogRnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIENNT1MgcmVnaXN0ZXJzICovCisKK3VjaGFyICAgUE1BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Cit2b2lkICAgIFBNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEdlbmVyaWMgcm91dGluZXMgY29tbW9uIHRvIGFsbCBlbnZpcm9ubWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFBNQVBJIFBNX3Jlc2V0TW91c2VEcml2ZXIoaW50IGhhcmRSZXNldCkKK3sKKyAgICBSTVJFR1MgICAgICAgICAgcmVnczsKKyAgICBQTV9tb3VzZUhhbmRsZXIgb2xkSGFuZGxlciA9IF9QTV9tb3VzZUhhbmRsZXI7CisKKyAgICBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7CisgICAgcmVncy54LmF4ID0gaGFyZFJlc2V0ID8gMCA6IDMzOworICAgIFBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7CisgICAgaWYgKG9sZEhhbmRsZXIpCisgICAgICAgIFBNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrLCBvbGRIYW5kbGVyKTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCit7CisgICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKKyAgICAgICAgODE5MiwKKyAgICAgICAgNDA5NiwKKyAgICAgICAgMjA0OCwKKyAgICAgICAgMTAyNCwKKyAgICAgICAgNTEyLAorICAgICAgICAyNTYsCisgICAgICAgIDEyOCwKKyAgICAgICAgNjQsCisgICAgICAgIDMyLAorICAgICAgICAxNiwKKyAgICAgICAgOCwKKyAgICAgICAgNCwKKyAgICAgICAgMiwKKyAgICAgICAgLTEsCisgICAgICAgIH07CisgICAgaW50IGk7CisKKyAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLworICAgIF9QTV9yZWFkQ01PUygweDBDKTsKKyAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQSwweDIwIHwgKGkrMykpOworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEIsKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCk7CisgICAgICAgIH0KK30KKworI2lmbmRlZiBSRUFMTU9ERQorCitzdGF0aWMgdm9pZCBQTUFQSSBsb2NrUE1IYW5kbGVycyh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOworICAgIGludCAgICAgICAgICAgICBzdGF0OworICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLworCisgICAgLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0CisgICAgICogaGFuZGxpbmcgcm91dGluZXMsIHNvIHRoYXQgaXQgd2lsbCBjb250aW51ZSB0byB3b3JrIGNvcnJlY3RseQorICAgICAqIHVuZGVyIHJlYWwgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICBQTV9zYXZlRFMoKTsKKyAgICAgICAgc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmZ2xvYmFsRGF0YVN0YXJ0LTIwNDgsNDA5NiwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfUE1fcG1kb3NEYXRhU3RhcnQsKGludCkmX1BNX3BtZG9zRGF0YUVuZCAtIChpbnQpJl9QTV9wbWRvc0RhdGFTdGFydCwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX3BtZG9zQ29kZVN0YXJ0LChpbnQpX1BNX3BtZG9zQ29kZUVuZC0oaW50KV9QTV9wbWRvc0NvZGVTdGFydCwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfUE1fRE1BRGF0YVN0YXJ0LChpbnQpJl9QTV9ETUFEYXRhRW5kIC0gKGludCkmX1BNX0RNQURhdGFTdGFydCwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX0RNQUNvZGVTdGFydCwoaW50KV9QTV9ETUFDb2RlRW5kLShpbnQpX1BNX0RNQUNvZGVTdGFydCwmbGgpOworICAgICAgICBpZiAoc3RhdCkgeworICAgICAgICAgICAgcHJpbnRmKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlIVxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICBsb2NrZWQgPSAxOworICAgICAgICB9Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRE9TIFJlYWwgTW9kZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBSRUFMTU9ERQorCisjaWZuZGVmIE1LX0ZQCisjZGVmaW5lIE1LX0ZQKHMsbykgICggKHZvaWQgZmFyICopKCAoKHVsb25nKShzKSA8PCAxNikgKyBcCisgICAgICAgICAgICAgICAgICAgICh1bG9uZykobykgKSkKKyNlbmRpZgorCitpbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCit7CisgICAgUE1fc2F2ZURTKCk7CisgICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOworICAgIF9QTV9zZXRNb3VzZUhhbmRsZXIoX1BNX21vdXNlTWFzayA9IG1hc2spOworICAgIHJldHVybiAxOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKK3sKKyAgICB1bmlvbiBSRUdTICAgICAgcmVnczsKKworICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDMzOworICAgICAgICBpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOworICAgICAgICBfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoKQoreworICAgIF9QTV9nZXRSTXZlY3QoMHg4LCAobG9uZyopJl9QTV9wcmV2VGltZXIpOworICAgIF9QTV90aW1lckhhbmRsZXIgPSB0aDsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4OCwgKGxvbmcpX1BNX3RpbWVySVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKKyAgICAgICAgX1BNX3NldFJNdmVjdCgweDgsIChsb25nKV9QTV9wcmV2VGltZXIpOworICAgICAgICBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoLGludCBmcmVxdWVuY3kpCit7CisgICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLworICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKKyAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7CisKKyAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLworICAgIF9QTV9nZXRSTXZlY3QoMHg3MCwgKGxvbmcqKSZfUE1fcHJldlJUQyk7CisgICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4NzAsIChsb25nKV9QTV9ydGNJU1IpOworCisgICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOworCisgICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KKyAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7CisgICAgUE1fb3V0cGIoMHhBMSxfUE1fb2xkUlRDUElDMiAmIDB4RkUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcnRjSGFuZGxlcikgeworICAgICAgICAvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7CisgICAgICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7CisKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICBfUE1fc2V0Uk12ZWN0KDB4NzAsIChsb25nKV9QTV9wcmV2UlRDKTsKKyAgICAgICAgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQoreworICAgIF9QTV9nZXRSTXZlY3QoMHg5LCAobG9uZyopJl9QTV9wcmV2S2V5KTsKKyAgICBfUE1fa2V5SGFuZGxlciA9IGtoOworICAgIF9QTV9zZXRSTXZlY3QoMHg5LCAobG9uZylfUE1fa2V5SVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fa2V5SGFuZGxlcikgeworICAgICAgICBfUE1fc2V0Uk12ZWN0KDB4OSwgKGxvbmcpX1BNX3ByZXZLZXkpOworICAgICAgICBfUE1fa2V5SGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKwordm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQoreworICAgIF9QTV9nZXRSTXZlY3QoMHgxNSwgKGxvbmcqKSZfUE1fcHJldktleTE1KTsKKyAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7CisgICAgX1BNX3NldFJNdmVjdCgweDE1LCAobG9uZylfUE1fa2V5MTVJU1IpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgeworICAgICAgICBfUE1fc2V0Uk12ZWN0KDB4MTUsIChsb25nKV9QTV9wcmV2S2V5MTUpOworICAgICAgICBfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQoreworICAgIHN0YXRpYyBpbnQgIGN0cmxDRmxhZyxjdHJsQkZsYWc7CisKKyAgICBfUE1fY3RybENQdHIgPSAodWNoYXIqKSZjdHJsQ0ZsYWc7CisgICAgX1BNX2N0cmxCUHRyID0gKHVjaGFyKikmY3RybEJGbGFnOworICAgIF9QTV9nZXRSTXZlY3QoMHgxQiwgKGxvbmcqKSZfUE1fcHJldkJyZWFrKTsKKyAgICBfUE1fZ2V0Uk12ZWN0KDB4MjMsIChsb25nKikmX1BNX3ByZXZDdHJsQyk7CisgICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOworICAgIF9QTV9zZXRSTXZlY3QoMHgxQiwgKGxvbmcpX1BNX2JyZWFrSVNSKTsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsIChsb25nKV9QTV9jdHJsQ0lTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQoreworICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcHJldkJyZWFrKSB7CisgICAgICAgIF9QTV9zZXRSTXZlY3QoMHgxQiwgKGxvbmcpX1BNX3ByZXZCcmVhayk7CisgICAgICAgIF9QTV9zZXRSTXZlY3QoMHgyMywgKGxvbmcpX1BNX3ByZXZDdHJsQyk7CisgICAgICAgIF9QTV9wcmV2QnJlYWsgPSBOVUxMOworICAgICAgICBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQoreworICAgIHN0YXRpYyAgc2hvcnQgY3JpdEJ1ZlsyXTsKKworICAgIF9QTV9jcml0UHRyID0gKHVjaGFyKiljcml0QnVmOworICAgIF9QTV9nZXRSTXZlY3QoMHgyNCwgKGxvbmcqKSZfUE1fcHJldkNyaXRpY2FsKTsKKyAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4MjQsIChsb25nKV9QTV9jcml0aWNhbElTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcHJldkNyaXRpY2FsKSB7CisgICAgICAgIF9QTV9zZXRSTXZlY3QoMHgyNCwgKGxvbmcpX1BNX3ByZXZDcml0aWNhbCk7CisgICAgICAgIF9QTV9wcmV2Q3JpdGljYWwgPSBOVUxMOworICAgICAgICBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KKyAgICByZXR1cm4gMTsKK30KKworaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKK3sKKyAgICBsb25nIHQ7CisgICAgX1BNX2dldFJNdmVjdChpbnRubywmdCk7CisgICAgKmlzciA9ICh2b2lkKil0OworfQorCit2b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQoreworICAgIFBNX3NhdmVEUygpOworICAgIF9QTV9zZXRSTXZlY3QoaW50bm8sKGxvbmcpaXNyKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQoreworICAgIF9QTV9zZXRSTXZlY3QoaW50bm8sKGxvbmcpaXNyKTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQaGFyIExhcCBUTlQgRE9TIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIFROVAorCisjaW5jbHVkZSA8cGxkb3MzMi5oPgorI2luY2x1ZGUgPHBoYXJsYXAuaD4KKyNpbmNsdWRlIDxodzM4Ni5oPgorCitzdGF0aWMgbG9uZyBwcmV2UmVhbEJyZWFrOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBicmVhayBoYW5kbGVyICAgICAqLworc3RhdGljIGxvbmcgcHJldlJlYWxDdHJsQzsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgQ3RybEMgaGFuZGxlciAgICAgKi8KK3N0YXRpYyBsb25nIHByZXZSZWFsQ3JpdGljYWw7ICAgLyogUHJldiByZWFsIG1vZGUgY3JpdGljYWwgaGFuZGxlciAgICAgICovCitzdGF0aWMgdWNoYXIgKm1vdXNlUHRyOworCisvKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKKyAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCisgKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCisgKi8KKworc3RhdGljIFVDSEFSIHJlYWxIYW5kbGVyW10gPSB7ICAgICAgLyogUmVhbCBtb2RlIGNvZGUgZ2VuZXJpYyBoYW5kbGVyICAgKi8KKyAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qIF9fUE1fY2FsbFByb3RwICAgICAgICAgICAgICAgICAgICovCisgICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBfX1BNX3Byb3RDUyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9wcm90SGFuZGxlciAgICAgICAgICAgICAgICAgKi8KKyAgICAweDY2LDB4NjAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDZBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIDAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHgyRSwweEZGLDB4MzYsMHgwNCwweDAwLCAgICAgICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90Q1NdICAgICAgICAqLworICAgIDB4NjYsMHgyRSwweEZGLDB4MzYsMHgwNiwweDAwLCAgLyogIHB1c2ggICAgW2NzOl9fUE1fcHJvdEhhbmRsZXJdICAgKi8KKyAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgICAgIC8qICBjYWxsICAgIFtjczpfX1BNX2NhbGxQcm90cF0gICAgICovCisgICAgMHg4MywweEM0LDB4MEEsICAgICAgICAgICAgICAgICAvKiAgYWRkICAgICBzcCwxMCAgICAgICAgICAgICAgICAgICAqLworICAgIDB4MUYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHBvcCAgICAgZHMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDY2LDB4NjEsICAgICAgICAgICAgICAgICAgICAgIC8qICBwb3BhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH07CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluc3RhbGxzIHRoZSBhYm92ZSByZWFsbW9kZSBjYWxsYmFjayBtZWNoYW5pc20KKyAqIGluIHJlYWwgbW9kZSBtZW1vcnkgZm9yIGNhbGxpbmcgdGhlIHByb3RlY3RlZCBtb2RlIHJvdXRpbmUuCisgKi8KKwordWNoYXIgKiBpbnN0YWxsQ2FsbGJhY2sodm9pZCAoUE1BUEkgKnBtQ0IpKCksdWludCAqcnNlZywgdWludCAqcm9mZikKK3sKKyAgICBDT05GSUdfSU5GICBjb25maWc7CisgICAgUkVBTFBUUiAgICAgcmVhbEJ1ZkFkcixjYWxsUHJvdHA7CisgICAgVUxPTkcgICAgICAgYnVmU2l6ZTsKKyAgICBGQVJQVFIgICAgICBwcm90QnVmQWRyOworICAgIHVjaGFyICAgICAgICpwOworCisgICAgLyogR2V0IGFkZHJlc3Mgb2YgcmVhbCBtb2RlIHJvdXRpbmUgdG8gY2FsbCB1cCB0byBwcm90ZWN0ZWQgbW9kZSAgICAqLworICAgIF9keF9ybWxpbmtfZ2V0KCZjYWxsUHJvdHAsICZyZWFsQnVmQWRyLCAmYnVmU2l6ZSwgJnByb3RCdWZBZHIpOworICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7CisKKyAgICAvKiBGaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgc28gdGhhdCBpdCB3aWxsCisgICAgICogY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lLgorICAgICAqLworICAgICooKFJFQUxQVFIqKSZyZWFsSGFuZGxlclswXSkgPSBjYWxsUHJvdHA7CisgICAgKigoVVNIT1JUKikmcmVhbEhhbmRsZXJbNF0pID0gY29uZmlnLmNfY3Nfc2VsOworICAgICooKFVMT05HKikmcmVhbEhhbmRsZXJbNl0pID0gKFVMT05HKXBtQ0I7CisKKyAgICAvKiBDb3B5IHRoZSByZWFsIG1vZGUgaGFuZGxlciB0byByZWFsIG1vZGUgbWVtb3J5ICAgKi8KKyAgICBpZiAoKHAgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKHJlYWxIYW5kbGVyKSxyc2VnLHJvZmYpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkocCxyZWFsSGFuZGxlcixzaXplb2YocmVhbEhhbmRsZXIpKTsKKworICAgIC8qIFNraXAgcGFzdCBnbG9iYWwgdmFyaWFibHMgaW4gcmVhbCBtb2RlIGNvZGUgc2VnbWVudCAqLworICAgICpyb2ZmICs9IDB4MEE7CisgICAgcmV0dXJuIHA7Cit9CisKK2ludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKK3sKKyAgICBSTVJFR1MgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgIHNyZWdzOworICAgIHVpbnQgICAgICAgIHJzZWcscm9mZjsKKworICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLworCisgICAgaWYgKChtb3VzZVB0ciA9IGluc3RhbGxDYWxsYmFjayhfUE1fbW91c2VJU1IsICZyc2VnLCAmcm9mZikpID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKKworICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLworICAgIHNyZWdzLmVzID0gcnNlZzsKKyAgICByZWdzLnguZHggPSByb2ZmOworICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOworICAgIHJlZ3MueC5heCA9IDB4QzsKKyAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOworICAgIHJldHVybiAxOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgeworICAgICAgICByZWdzLnguYXggPSAzMzsKKyAgICAgICAgUE1faW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKKyAgICAgICAgUE1fZnJlZVJlYWxTZWcobW91c2VQdHIpOworICAgICAgICBfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCit7CisgICAgRkFSUFRSICBwaDsKKworICAgIF9keF9wbWl2X2dldChpbnRubywgJnBoKTsKKyAgICBpc3ItPnNlbCA9IEZQX1NFTChwaCk7CisgICAgaXNyLT5vZmYgPSBGUF9PRkYocGgpOworfQorCit2b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQoreworICAgIENPTkZJR19JTkYgIGNvbmZpZzsKKyAgICBGQVJQVFIgICAgICBwaDsKKworICAgIFBNX3NhdmVEUygpOworICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7CisgICAgRlBfU0VUKHBoLCh1aW50KWlzcixjb25maWcuY19jc19zZWwpOworICAgIF9keF9wbWl2X3NldChpbnRubyxwaCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKK3sKKyAgICBGQVJQVFIgIHBoOworCisgICAgRlBfU0VUKHBoLGlzci5vZmYsaXNyLnNlbCk7CisgICAgX2R4X3BtaXZfc2V0KGludG5vLHBoKTsKK30KKworc3RhdGljIHZvaWQgZ2V0SVNSKGludCBpbnRubywgUE1GQVJQVFIgKnBtaXNyLCBsb25nICpyZWFsaXNyKQoreworICAgIFBNX2dldFBNdmVjdChpbnRubyxwbWlzcik7CisgICAgX1BNX2dldFJNdmVjdChpbnRubywgcmVhbGlzcik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQoreworICAgIF9QTV9zZXRSTXZlY3QoaW50bm8scmVhbGlzcik7CisgICAgUE1fcmVzdG9yZVBNdmVjdChpbnRubyxwbWlzcik7Cit9CisKK3N0YXRpYyB2b2lkIHNldElTUihpbnQgaW50bm8sIHZvaWQgKFBNQVBJICppc3IpKCkpCit7CisgICAgQ09ORklHX0lORiAgY29uZmlnOworICAgIEZBUlBUUiAgICAgIHBoOworCisgICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCisKKyAgICBfZHhfY29uZmlnX2luZigmY29uZmlnLCAoVUNIQVIqKSZjb25maWcpOworICAgIEZQX1NFVChwaCwodWludClpc3IsY29uZmlnLmNfY3Nfc2VsKTsKKyAgICBfZHhfYXBtaXZfc2V0KGludG5vLHBoKTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKK3sKKyAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKKyAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7CisgICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKKyAgICAgICAgX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQoreworICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KKyAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7CisgICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOworCisgICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKKyAgICBfUE1fcnRjSGFuZGxlciA9IHRoOworICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKKworICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLworICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKKworICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCisgICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOworICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKKyAgICAgICAgLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7CisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOworICAgICAgICBQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOworCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKyAgICAgICAgcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKKyAgICAgICAgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQoreworICAgIGdldElTUigweDksICZfUE1fcHJldktleSwgJl9QTV9wcmV2UmVhbEtleSk7CisgICAgX1BNX2tleUhhbmRsZXIgPSBraDsKKyAgICBzZXRJU1IoMHg5LCBfUE1fa2V5SVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fa2V5SGFuZGxlcikgeworICAgICAgICByZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7CisgICAgICAgIF9QTV9rZXlIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCit7CisgICAgZ2V0SVNSKDB4MTUsICZfUE1fcHJldktleTE1LCAmX1BNX3ByZXZSZWFsS2V5MTUpOworICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKKyAgICBzZXRJU1IoMHgxNSwgX1BNX2tleTE1SVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9rZXkxNUhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7CisgICAgICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCit7CisgICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKKworICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKKyAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7CisgICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7CisgICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7CisgICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOworICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOworICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOworfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxCcmVha0hhbmRsZXIodm9pZCkKK3sKKyAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKE5VTEwpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX3ByZXZCcmVhay5zZWwpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKKyAgICAgICAgcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKKyAgICAgICAgX1BNX3ByZXZCcmVhay5zZWwgPSAwOworICAgICAgICBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQoreworICAgIHN0YXRpYyBzaG9ydCAgICBjcml0QnVmWzJdOworCisgICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7CisgICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7CisgICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7CisgICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgeworICAgICAgICByZXN0b3JlSVNSKDB4MjQsIF9QTV9wcmV2Q3JpdGljYWwsIHByZXZSZWFsQ3JpdGljYWwpOworICAgICAgICBfUE1fcHJldkNyaXRpY2FsLnNlbCA9IDA7CisgICAgICAgIF9QTV9jcml0SGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICByZXR1cm4gKF9keF9sb2NrX3Bnc24ocCxsZW4pID09IDApOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcmV0dXJuIChfZHhfdWxvY2tfcGdzbihwLGxlbikgPT0gMCk7Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIENPTkZJR19JTkYgIGNvbmZpZzsKKyAgICBGQVJQVFIgICAgICBmcDsKKworICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7CisgICAgRlBfU0VUKGZwLHAsY29uZmlnLmNfY3Nfc2VsKTsKKyAgICByZXR1cm4gKF9keF9sb2NrX3BncyhmcCxsZW4pID09IDApOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIENPTkZJR19JTkYgIGNvbmZpZzsKKyAgICBGQVJQVFIgICAgICBmcDsKKworICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7CisgICAgRlBfU0VUKGZwLHAsY29uZmlnLmNfY3Nfc2VsKTsKKyAgICByZXR1cm4gKF9keF91bG9ja19wZ3MoZnAsbGVuKSA9PSAwKTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTeW1hbnRlYyBDKysgRE9TWCBhbmQgRmxhc2hUZWsgWC0zMi9YLTMyVk0gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TWCkgfHwgZGVmaW5lZChYMzJWTSkKKworI2lmZGVmICBYMzJWTQorI2luY2x1ZGUgPHgzMi5oPgorI2VuZGlmCisKK3N0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCitzdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLworc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KKworc3RhdGljIHVpbnQgbW91c2VTZWwgPSAwLG1vdXNlT2ZmOworCisvKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKKyAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCisgKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCisgKi8KKworc3RhdGljIGNoYXIgcmVhbEhhbmRsZXJbXSA9IHsgICAgICAgLyogUmVhbCBtb2RlIGNvZGUgZ2VuZXJpYyBoYW5kbGVyICAgKi8KKyAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qIF9fUE1fY2FsbFByb3RwICAgICAgICAgICAgICAgICAgICovCisgICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBfX1BNX3Byb3RDUyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9wcm90SGFuZGxlciAgICAgICAgICAgICAgICAgKi8KKyAgICAweDFFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDJFLDB4RkYsMHgzNiwweDA0LDB4MDAsICAgICAgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RDU10gICAgICAgICovCisgICAgMHg2NiwweDJFLDB4RkYsMHgzNiwweDA2LDB4MDAsICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90SGFuZGxlcl0gICAqLworICAgIDB4MkUsMHhGRiwweDFFLDB4MDAsMHgwMCwgICAgICAgLyogIGNhbGwgICAgW2NzOl9fUE1fY2FsbFByb3RwXSAgICAgKi8KKyAgICAweDgzLDB4QzQsMHgwQSwgICAgICAgICAgICAgICAgIC8qICBhZGQgICAgIHNwLDEwICAgICAgICAgICAgICAgICAgICovCisgICAgMHgxRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4Q0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9OworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbnN0YWxscyB0aGUgYWJvdmUgcmVhbG1vZGUgY2FsbGJhY2sgbWVjaGFuaXNtCisgKiBpbiByZWFsIG1vZGUgbWVtb3J5IGZvciBjYWxsaW5nIHRoZSBwcm90ZWN0ZWQgbW9kZSByb3V0aW5lLgorICovCisKK2ludCBpbnN0YWxsQ2FsbGJhY2sodm9pZCAoUE1BUEkgKnBtQ0IpKCksdWludCAqcHNlbCwgdWludCAqcG9mZiwKKyAgICB1aW50ICpyc2VnLCB1aW50ICpyb2ZmKQoreworICAgIFBNUkVHUyAgICAgICAgICByZWdzOworICAgIFBNU1JFR1MgICAgICAgICBzcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4MjUwRDsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7ICAgIC8qIEdldCBSTSBjYWxsYmFjayBhZGRyZXNzICAqLworCisgICAgLyogRmlsbCBpbiB0aGUgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IHNvIHRoYXQgaXQgd2lsbAorICAgICAqIGNhbGwgdGhlIGNvcnJlY3Qgcm91dGluZS4KKyAgICAgKi8KKyAgICAqKCh1bG9uZyopJnJlYWxIYW5kbGVyWzBdKSA9IHJlZ3MuZS5lYXg7CisgICAgKigodXNob3J0KikmcmVhbEhhbmRsZXJbNF0pID0gc3JlZ3MuY3M7CisgICAgKigodWxvbmcqKSZyZWFsSGFuZGxlcls2XSkgPSAodWxvbmcpcG1DQjsKKworICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBoYW5kbGVyIHRvIHJlYWwgbW9kZSBtZW1vcnkgKG9ubHkgYWxsb2NhdGUgdGhlCisgICAgICogYnVmZmVyIG9uY2Ugc2luY2Ugd2UgY2FudCBkZWFsbG9hdGUgaXQgd2l0aCBYMzIpLgorICAgICAqLworICAgIGlmICgqcHNlbCA9PSAwKSB7CisgICAgICAgIGlmICghUE1fYWxsb2NSZWFsU2VnKHNpemVvZihyZWFsSGFuZGxlcikscHNlbCxwb2ZmLHJzZWcscm9mZikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIFBNX21lbWNweWZuKCpwc2VsLCpwb2ZmLHJlYWxIYW5kbGVyLHNpemVvZihyZWFsSGFuZGxlcikpOworCisgICAgLyogU2tpcCBwYXN0IGdsb2JhbCB2YXJpYWJsZXMgaW4gcmVhbCBtb2RlIGNvZGUgc2VnbWVudCAqLworICAgICpyb2ZmICs9IDB4MEE7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKK3sKKyAgICBSTVJFR1MgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgIHNyZWdzOworICAgIHVpbnQgICAgcnNlZyxyb2ZmOworCisgICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCisKKyAgICBpZiAoIWluc3RhbGxDYWxsYmFjayhfUE1fbW91c2VJU1IsICZtb3VzZVNlbCwgJm1vdXNlT2ZmLCAmcnNlZywgJnJvZmYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7CisKKyAgICAvKiBJbnN0YWxsIHRoZSByZWFsIG1vZGUgbW91c2UgaGFuZGxlciAgKi8KKyAgICBzcmVncy5lcyA9IHJzZWc7CisgICAgcmVncy54LmR4ID0gcm9mZjsKKyAgICByZWdzLnguY3ggPSBfUE1fbW91c2VNYXNrID0gbWFzazsKKyAgICByZWdzLnguYXggPSAweEM7CisgICAgUE1faW50ODZ4KDB4MzMsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKKyAgICAgICAgcmVncy54LmF4ID0gMzM7CisgICAgICAgIFBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7CisgICAgICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisgICAgUE1TUkVHUyBzcmVnczsKKworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZWdzLnguYXggPSAweDI1MDI7ICAgICAgICAgLyogR2V0IFBNIGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICovCisgICAgcmVncy54LmN4ID0gaW50bm87CisgICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7CisgICAgaXNyLT5zZWwgPSBzcmVncy5lczsKKyAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lYng7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCit7CisgICAgUE1GQVJQVFIgICAgcG1pc3I7CisgICAgUE1TUkVHUyAgICAgc3JlZ3M7CisKKyAgICBQTV9zYXZlRFMoKTsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcG1pc3Iuc2VsID0gc3JlZ3MuY3M7CisgICAgcG1pc3Iub2ZmID0gKHVpbnQpaXNyOworICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8sIHBtaXNyKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQoreworICAgIFBNUkVHUyAgcmVnczsKKyAgICBQTVNSRUdTIHNyZWdzOworCisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MueC5heCA9IDB4MjUwNTsgICAgICAgICAvKiBTZXQgUE0gaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgKi8KKyAgICByZWdzLnguY3ggPSBpbnRubzsKKyAgICBzcmVncy5kcyA9IGlzci5zZWw7CisgICAgcmVncy5lLmVkeCA9IGlzci5vZmY7CisgICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKK3sKKyAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOworICAgIF9QTV9nZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQoreworICAgIFBNUkVHUyAgcmVnczsKKyAgICBQTVNSRUdTIHNyZWdzOworCisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MueC5heCA9IDB4MjUwNzsgICAgICAgICAvKiBTZXQgcmVhbCBhbmQgUE0gdmVjdG9ycyAgICAgICAgICAgICAgKi8KKyAgICByZWdzLnguY3ggPSBpbnRubzsKKyAgICBzcmVncy5kcyA9IHBtaXNyLnNlbDsKKyAgICByZWdzLmUuZWR4ID0gcG1pc3Iub2ZmOworICAgIHJlZ3MuZS5lYnggPSByZWFsaXNyOworICAgIFBNX2ludDM4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkICppc3IpCit7CisgICAgUE1SRUdTICByZWdzOworICAgIFBNU1JFR1Mgc3JlZ3M7CisKKyAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgICAgICovCisKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmVncy54LmF4ID0gMHgyNTA2OyAgICAgICAgIC8qIEhvb2sgcmVhbCBhbmQgcHJvdGVjdGVkIHZlY3RvcnMgICAgICAqLworICAgIHJlZ3MueC5jeCA9IGludG5vOworICAgIHNyZWdzLmRzID0gc3JlZ3MuY3M7CisgICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKKyAgICBQTV9pbnQzODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKK3sKKyAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKKyAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7CisgICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKKyAgICAgICAgX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQoreworICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KKyAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7CisgICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOworCisgICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKKyAgICBfUE1fcnRjSGFuZGxlciA9IHRoOworICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKKworICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLworICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKKworICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCisgICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOworICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKKyAgICAgICAgLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7CisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOworICAgICAgICBQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOworCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKyAgICAgICAgcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKKyAgICAgICAgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQoreworICAgIGdldElTUigweDksICZfUE1fcHJldktleSwgJl9QTV9wcmV2UmVhbEtleSk7CisgICAgX1BNX2tleUhhbmRsZXIgPSBraDsKKyAgICBzZXRJU1IoMHg5LCBfUE1fa2V5SVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fa2V5SGFuZGxlcikgeworICAgICAgICByZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7CisgICAgICAgIF9QTV9rZXlIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCit7CisgICAgZ2V0SVNSKDB4MTUsICZfUE1fcHJldktleTE1LCAmX1BNX3ByZXZSZWFsS2V5MTUpOworICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKKyAgICBzZXRJU1IoMHgxNSwgX1BNX2tleTE1SVNSKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9rZXkxNUhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7CisgICAgICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCit7CisgICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKKworICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKKyAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7CisgICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7CisgICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7CisgICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOworICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOworICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOworfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxCcmVha0hhbmRsZXIodm9pZCkKK3sKKyAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKE5VTEwpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX3ByZXZCcmVhay5zZWwpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKKyAgICAgICAgcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKKyAgICAgICAgX1BNX3ByZXZCcmVhay5zZWwgPSAwOworICAgICAgICBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQoreworICAgIHN0YXRpYyBzaG9ydCAgICBjcml0QnVmWzJdOworCisgICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7CisgICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7CisgICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7CisgICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgeworICAgICAgICByZXN0b3JlSVNSKDB4MjQsIF9QTV9wcmV2Q3JpdGljYWwsIHByZXZSZWFsQ3JpdGljYWwpOworICAgICAgICBfUE1fcHJldkNyaXRpY2FsLnNlbCA9IDA7CisgICAgICAgIF9QTV9jcml0SGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICByZXR1cm4gKF94Mzg2X21lbWxvY2socCxsZW4pID09IDApOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcmV0dXJuIChfeDM4Nl9tZW11bmxvY2socCxsZW4pID09IDApOworfQorCitpbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICByZXR1cm4gKF94Mzg2X21lbWxvY2socCxsZW4pID09IDApOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHJldHVybiAoX3gzODZfbWVtdW5sb2NrKHAsbGVuKSA9PSAwKTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBCb3JsYW5kJ3MgRFBNSTMyIERPUyBQb3dlciBQYWNrIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBEUE1JMzIKKyNkZWZpbmUgR0VORVJJQ19EUE1JMzIgICAgICAgICAgLyogVXNlIGdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgKi8KKwordm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQoreworICAgIFBNUkVHUyAgcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4MjA0OworICAgIHJlZ3MuaC5ibCA9IGludG5vOworICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKKyAgICBpc3ItPnNlbCA9IHJlZ3MueC5jeDsKKyAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lZHg7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTVJFR1MgIHJlZ3M7CisKKyAgICBQTV9zYXZlRFMoKTsKKyAgICByZWdzLnguYXggPSAweDIwNTsgICAgICAgICAgLyogU2V0IHByb3RlY3RlZCBtb2RlIHZlY3RvciAgICAgICAgKi8KKyAgICByZWdzLmguYmwgPSBpbnRubzsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmVncy54LmN4ID0gc3JlZ3MuY3M7CisgICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKKyAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDIwNTsKKyAgICByZWdzLmguYmwgPSBpbnRubzsKKyAgICByZWdzLnguY3ggPSBpc3Iuc2VsOworICAgIHJlZ3MuZS5lZHggPSBpc3Iub2ZmOworICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogV2F0Y29tIEMvQysrIHdpdGggUmF0aW9uYWwgRE9TLzRHVyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgRE9TNEdXCisjZGVmaW5lIEdFTkVSSUNfRFBNSTMyICAgICAgICAgIC8qIFVzZSBnZW5lcmljIDMyIGJpdCBEUE1JIHJvdXRpbmVzICovCisKKyNkZWZpbmUgTU9VU0VfU1VQUE9SVEVEICAgICAgICAgLyogRE9TNEdXIGRpcmVjdGx5IHN1cHBvcnRzIG1vdXNlICAgKi8KKworLyogV2UgdXNlIHRoZSBub3JtYWwgRE9TIHNlcnZpY2VzIHRvIHNhdmUgYW5kIHJlc3RvcmUgaW50ZXJydXB0cyBoYW5kbGVycworICogZm9yIFdhdGNvbSBDKyssIGJlY2F1c2UgdXNpbmcgdGhlIGRpcmVjdCBEUE1JIGZ1bmN0aW9ucyBkb2VzIG5vdAorICogYXBwZWFyIHRvIHdvcmsgcHJvcGVybHkuIEF0IGxlYXN0IGlmIHdlIHVzZSB0aGUgRFBNSSBmdW5jdGlvbnMsIHdlCisgKiBkb250IGdldCB0aGUgYXV0by1wYXNzdXAgZmVhdHVyZSB0aGF0IHdlIG5lZWQgdG8gY29ycmVjdGx5IHRyYXAKKyAqIHJlYWwgYW5kIHByb3RlY3RlZCBtb2RlIGludGVycnVwdHMgd2l0aG91dCBpbnN0YWxsaW5nIEJpLW1vZGVsCisgKiBpbnRlcnJ1cHQgaGFuZGxlcnMuCisgKi8KKwordm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQoreworICAgIFBNUkVHUyAgcmVnczsKKyAgICBQTVNSRUdTIHNyZWdzOworCisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MuaC5haCA9IDB4MzU7CisgICAgcmVncy5oLmFsID0gaW50bm87CisgICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7CisgICAgaXNyLT5zZWwgPSBzcmVncy5lczsKKyAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lYng7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCit7CisgICAgUE1SRUdTICByZWdzOworICAgIFBNU1JFR1Mgc3JlZ3M7CisKKyAgICBQTV9zYXZlRFMoKTsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmVncy5oLmFoID0gMHgyNTsKKyAgICByZWdzLmguYWwgPSBpbnRubzsKKyAgICBzcmVncy5kcyA9IHNyZWdzLmNzOworICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7CisgICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisgICAgUE1TUkVHUyBzcmVnczsKKworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZWdzLmguYWggPSAweDI1OworICAgIHJlZ3MuaC5hbCA9IGludG5vOworICAgIHNyZWdzLmRzID0gaXNyLnNlbDsKKyAgICByZWdzLmUuZWR4ID0gaXNyLm9mZjsKKyAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKK30KKworaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQoreworICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLworCisgICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOworICAgIF9QTV9zZXRNb3VzZUhhbmRsZXIoX1BNX21vdXNlTWFzayA9IG1hc2spOworICAgIHJldHVybiAxOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgeworICAgICAgICByZWdzLnguYXggPSAzMzsKKyAgICAgICAgUE1faW50Mzg2KDB4MzMsICZyZWdzLCAmcmVncyk7CisgICAgICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogREpHUFAgcG9ydCBvZiBHTlUgQysrIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBESkdQUAorI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLworCit2b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCit7CisgICAgUE1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHgyMDQ7CisgICAgcmVncy5oLmJsID0gaW50bm87CisgICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOworICAgIGlzci0+c2VsID0gcmVncy54LmN4OworICAgIGlzci0+b2ZmID0gcmVncy5lLmVkeDsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKK3sKKyAgICBQTVNSRUdTIHNyZWdzOworICAgIFBNUkVHUyAgcmVnczsKKworICAgIFBNX3NhdmVEUygpOworICAgIHJlZ3MueC5heCA9IDB4MjA1OyAgICAgICAgICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgdmVjdG9yICAgICAgICAqLworICAgIHJlZ3MuaC5ibCA9IGludG5vOworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZWdzLnguY3ggPSBzcmVncy5jczsKKyAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOworICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQoreworICAgIFBNUkVHUyAgcmVnczsKKworICAgIHJlZ3MueC5heCA9IDB4MjA1OworICAgIHJlZ3MuaC5ibCA9IGludG5vOworICAgIHJlZ3MueC5jeCA9IGlzci5zZWw7CisgICAgcmVncy5lLmVkeCA9IGlzci5vZmY7CisgICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChHRU5FUklDX0RQTUkzMikKKworc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KK3N0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCitzdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLworCisjaWZuZGVmIE1PVVNFX1NVUFBPUlRFRAorCisvKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKKyAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCisgKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCisgKi8KKworc3RhdGljIGxvbmcgbW91c2VSTUNCOyAgICAgICAgICAvKiBNb3VzZSByZWFsIG1vZGUgY2FsbGJhY2sgYWRkcmVzcyAgICAgKi8KK3N0YXRpYyB1Y2hhciAqbW91c2VQdHI7CitzdGF0aWMgY2hhciBtb3VzZVJlZ3NbMHgzMl07ICAgIC8qIFJlYWwgbW9kZSByZWdzIGZvciBtb3VzZSBjYWxsYmFjayAgICAqLworc3RhdGljIHVjaGFyIG1vdXNlSGFuZGxlcltdID0geworICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiBfcmVhbFJNQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9yZWFsUk1DQl0gICAgICAgICAgICAgICovCisgICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH07CisKK2ludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKK3sKKyAgICBSTVJFR1MgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgIHNyZWdzOworICAgIHVpbnQgICAgICAgIHJzZWcscm9mZjsKKworICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLworCisgICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIgdG8gcmVhbCBtb2RlIG1lbW9yeSAgICovCisgICAgaWYgKChtb3VzZVB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YobW91c2VIYW5kbGVyKSwmcnNlZywmcm9mZikpID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbWNweShtb3VzZVB0cixtb3VzZUhhbmRsZXIsc2l6ZW9mKG1vdXNlSGFuZGxlcikpOworICAgIGlmICghX0RQTUlfYWxsb2NhdGVDYWxsYmFjayhfUE1fbW91c2VQTUNCLCBtb3VzZVJlZ3MsICZtb3VzZVJNQ0IpKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgcmVhbCBtb2RlIGNhbGxiYWNrIVxuIik7CisgICAgUE1fc2V0TG9uZyhtb3VzZVB0cixtb3VzZVJNQ0IpOworCisgICAgLyogSW5zdGFsbCB0aGUgcmVhbCBtb2RlIG1vdXNlIGhhbmRsZXIgICovCisgICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOworICAgIHNyZWdzLmVzID0gcnNlZzsKKyAgICByZWdzLnguZHggPSByb2ZmKzQ7CisgICAgcmVncy54LmN4ID0gX1BNX21vdXNlTWFzayA9IG1hc2s7CisgICAgcmVncy54LmF4ID0gMHhDOworICAgIFBNX2ludDg2eCgweDMzLCAmcmVncywgJnJlZ3MsICZzcmVncyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQoreworICAgIFJNUkVHUyAgcmVnczsKKworICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDMzOworICAgICAgICBQTV9pbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOworICAgICAgICBQTV9mcmVlUmVhbFNlZyhtb3VzZVB0cik7CisgICAgICAgIF9EUE1JX2ZyZWVDYWxsYmFjayhtb3VzZVJNQ0IpOworICAgICAgICBfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0SVNSKGludCBpbnRubywgUE1GQVJQVFIgKnBtaXNyLCBsb25nICpyZWFsaXNyKQoreworICAgIFBNX2dldFBNdmVjdChpbnRubyxwbWlzcik7CisgICAgX1BNX2dldFJNdmVjdChpbnRubyxyZWFsaXNyKTsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZUlTUihpbnQgaW50bm8sIFBNRkFSUFRSIHBtaXNyLCBsb25nIHJlYWxpc3IpCit7CisgICAgX1BNX3NldFJNdmVjdChpbnRubyxyZWFsaXNyKTsKKyAgICBQTV9yZXN0b3JlUE12ZWN0KGludG5vLHBtaXNyKTsKK30KKworc3RhdGljIHZvaWQgc2V0SVNSKGludCBpbnRubywgdm9pZCAoKiBQTUFQSSBwbWlzcikoKSkKK3sKKyAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KKyAgICBQTV9zZXRQTXZlY3QoaW50bm8scG1pc3IpOworfQorCit2b2lkIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoKQoreworICAgIGdldElTUigweDgsICZfUE1fcHJldlRpbWVyLCAmX1BNX3ByZXZSZWFsVGltZXIpOworICAgIF9QTV90aW1lckhhbmRsZXIgPSB0aDsKKyAgICBzZXRJU1IoMHg4LCBfUE1fdGltZXJJU1IpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX3RpbWVySGFuZGxlcikgeworICAgICAgICByZXN0b3JlSVNSKDB4OCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOworICAgICAgICBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoLGludCBmcmVxdWVuY3kpCit7CisgICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLworICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKKyAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7CisKKyAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLworICAgIGdldElTUigweDcwLCAmX1BNX3ByZXZSVEMsICZfUE1fcHJldlJlYWxSVEMpOworICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7CisgICAgc2V0SVNSKDB4NzAsIF9QTV9ydGNJU1IpOworCisgICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOworCisgICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KKyAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7CisgICAgUE1fb3V0cGIoMHhBMSxfUE1fb2xkUlRDUElDMiAmIDB4RkUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcnRjSGFuZGxlcikgeworICAgICAgICAvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7CisgICAgICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7CisKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICByZXN0b3JlSVNSKDB4NzAsIF9QTV9wcmV2UlRDLCBfUE1fcHJldlJlYWxSVEMpOworICAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworUE1fSVJRSGFuZGxlIFBNQVBJIFBNX3NldElSUUhhbmRsZXIoCisgICAgaW50IElSUSwKKyAgICBQTV9pcnFIYW5kbGVyIGloKQoreworICAgIGludCAgICAgICAgICAgICB0aHVua1NpemUsUElDbWFzayxjaGFpblByZXZpb3VzOworICAgIHVsb25nICAgICAgICAgICBvZmZzZXRBZGp1c3Q7CisgICAgX1BNX0lSUUhhbmRsZSAgICpoYW5kbGU7CisKKyAgICB0aHVua1NpemUgPSAodWxvbmcpX1BNX2lycUlTUlRlbXBsYXRlRW5kIC0gKHVsb25nKV9QTV9pcnFJU1JUZW1wbGF0ZTsKKyAgICBpZiAoKGhhbmRsZSA9IFBNX21hbGxvYyhzaXplb2YoX1BNX0lSUUhhbmRsZSkgKyB0aHVua1NpemUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBoYW5kbGUtPklSUSA9IElSUTsKKyAgICBoYW5kbGUtPnByZXZQSUMgPSBQTV9pbnBiKDB4MjEpOworICAgIGhhbmRsZS0+cHJldlBJQzIgPSBQTV9pbnBiKDB4QTEpOworICAgIGlmIChJUlEgPCA4KSB7CisgICAgICAgIGhhbmRsZS0+SVJRVmVjdCA9IChJUlEgKyA4KTsKKyAgICAgICAgUElDbWFzayA9ICgxIDw8IElSUSk7CisgICAgICAgIGNoYWluUHJldmlvdXMgPSAoKGhhbmRsZS0+cHJldlBJQyAmIFBJQ21hc2spID09IDApOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGhhbmRsZS0+SVJRVmVjdCA9ICgweDYwICsgSVJRICsgOCk7CisgICAgICAgIFBJQ21hc2sgPSAoKDEgPDwgSVJRKSB8IDB4NCk7CisgICAgICAgIGNoYWluUHJldmlvdXMgPSAoKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkgPT0gMCk7CisgICAgICAgIH0KKworICAgIC8qIENvcHkgYW5kIHNldHVwIHRoZSBhc3NlbWJsZXIgdGh1bmsgKi8KKyAgICBvZmZzZXRBZGp1c3QgPSAodWxvbmcpaGFuZGxlLT50aHVuayAtICh1bG9uZylfUE1faXJxSVNSVGVtcGxhdGU7CisgICAgbWVtY3B5KGhhbmRsZS0+dGh1bmssX1BNX2lycUlTUlRlbXBsYXRlLHRodW5rU2l6ZSk7CisgICAgKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzJdKSA9IG9mZnNldEFkanVzdDsKKyAgICAqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErMF0pID0gKHVsb25nKWloOworICAgIGlmIChjaGFpblByZXZpb3VzKSB7CisgICAgICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSs0XSkgPSBoYW5kbGUtPnByZXZIYW5kbGVyLm9mZjsKKyAgICAgICAgKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzhdKSA9IGhhbmRsZS0+cHJldkhhbmRsZXIuc2VsOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSs0XSkgPSAwOworICAgICAgICAqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErOF0pID0gMDsKKyAgICAgICAgfQorICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSsxMl0pID0gSVJROworCisgICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBnZXRJU1IoaGFuZGxlLT5JUlFWZWN0LCAmaGFuZGxlLT5wcmV2SGFuZGxlciwgJmhhbmRsZS0+cHJldlJlYWxoYW5kbGVyKTsKKyAgICBzZXRJU1IoaGFuZGxlLT5JUlFWZWN0LCAoUE1faW50SGFuZGxlciloYW5kbGUtPnRodW5rKTsKKworICAgIC8qIFVubWFzayB0aGUgSVJRIGluIHRoZSBQSUMgKi8KKyAgICBQTV9vdXRwYigweEExLGhhbmRsZS0+cHJldlBJQzIgJiB+KFBJQ21hc2sgPj4gOCkpOworICAgIFBNX291dHBiKDB4MjEsaGFuZGxlLT5wcmV2UElDICYgflBJQ21hc2spOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUlSUUhhbmRsZXIoCisgICAgUE1fSVJRSGFuZGxlIGlycUhhbmRsZSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgUElDbWFzazsKKyAgICBfUE1fSVJRSGFuZGxlICAgKmhhbmRsZSA9IGlycUhhbmRsZTsKKworICAgIC8qIFJlc3RvcmUgUElDIG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoaGFuZGxlLT5JUlEgPCA4KQorICAgICAgICBQSUNtYXNrID0gKDEgPDwgaGFuZGxlLT5JUlEpOworICAgIGVsc2UKKyAgICAgICAgUElDbWFzayA9ICgoMSA8PCBoYW5kbGUtPklSUSkgfCAweDQpOworICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiB+KFBJQ21hc2sgPj4gOCkpIHwgKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkpOworICAgIFBNX291dHBiKDB4MjEsKFBNX2lucGIoMHgyMSkgJiB+UElDbWFzaykgfCAoaGFuZGxlLT5wcmV2UElDICYgUElDbWFzaykpOworCisgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgIHJlc3RvcmVJU1IoaGFuZGxlLT5JUlFWZWN0LCBoYW5kbGUtPnByZXZIYW5kbGVyLCBoYW5kbGUtPnByZXZSZWFsaGFuZGxlcik7CisKKyAgICAvKiBGaW5hbGx5IGZyZWUgdGhlIHRodW5rICovCisgICAgUE1fZnJlZShoYW5kbGUpOworfQorCit2b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKK3sKKyAgICBnZXRJU1IoMHg5LCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOworICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7CisgICAgc2V0SVNSKDB4OSwgX1BNX2tleUlTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUigweDksIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOworICAgICAgICBfUE1fa2V5SGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKwordm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQoreworICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKKyAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7CisgICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7CisgICAgICAgIHJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOworICAgICAgICBfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCisvKiBSZWFsIG1vZGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2V0cyBhCisgKiBmbGFnIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0LiBXZSBzYXZlIHRoZSBsb2NhdGlvbgorICogb2YgdGhpcyBmbGFnIGluIHJlYWwgbW9kZSBtZW1vcnkgc28gdGhhdCBib3RoIHRoZSByZWFsIG1vZGUgYW5kCisgKiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBzYW1lIGZsYWdzLgorICovCisKKyNpZm5kZWYgRE9TNEdXCitzdGF0aWMgdWNoYXIgY3RybEhhbmRsZXJbXSA9IHsKKyAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBjdHJsQkZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHg2NiwweDJFLDB4QzcsMHgwNiwweDAwLDB4MDAsCisgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6Y3RybEJGbGFnXSwxICAgICAgICAqLworICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9OworI2VuZGlmCisKK3ZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCit7CisjaWZuZGVmIERPUzRHVworICAgIHVpbnQgICAgcnNlZyxyb2ZmOworI2Vsc2UKKyAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOworCisgICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOworICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKKyNlbmRpZgorCisgICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7CisgICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7CisgICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOworICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOworICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOworCisjaWZuZGVmIERPUzRHVworICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3JzIGZvciB0aGVzZSBoYW5kbGVycywgYXMgdGhlc2UgYXJlIG5vdAorICAgICAqIG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUgRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUKKyAgICAgKi8KKyAgICBfUE1fY3RybEJQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGN0cmxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOworICAgIG1lbWNweShfUE1fY3RybEJQdHIsY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7CisgICAgbWVtY3B5KF9QTV9jdHJsQlB0citzaXplb2YoY3RybEhhbmRsZXIpLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOworICAgIF9QTV9jdHJsQ1B0ciA9IF9QTV9jdHJsQlB0ciArIHNpemVvZihjdHJsSGFuZGxlcik7CisgICAgX1BNX3NldFJNdmVjdCgweDFCLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrc2l6ZW9mKGN0cmxIYW5kbGVyKSs0KSk7CisjZW5kaWYKK30KKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCit7CisgICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7CisgICAgICAgIHJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7CisgICAgICAgIHJlc3RvcmVJU1IoMHgyMywgX1BNX3ByZXZDdHJsQywgcHJldlJlYWxDdHJsQyk7CisgICAgICAgIF9QTV9wcmV2QnJlYWsuc2VsID0gMDsKKyAgICAgICAgX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7CisjaWZuZGVmIERPUzRHVworICAgICAgICBQTV9mcmVlUmVhbFNlZyhfUE1fY3RybEJQdHIpOworI2VuZGlmCisgICAgICAgIH0KK30KKworLyogUmVhbCBtb2RlIENyaXRpY2FsIEVycm9yIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2F2ZXMgdGhlIEFYIGFuZAorICogREkgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0cy4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KKyAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAorICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KKyAqLworCisjaWZuZGVmIERPUzRHVworc3RhdGljIHVjaGFyIGNyaXRpY2FsSGFuZGxlcltdID0geworICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGF4Q29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBkaUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHgyRSwweEEzLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6YXhDb2RlXSxheCAgICAgICAgICAqLworICAgIDB4MkUsMHg4OSwweDNFLDB4MDIsMHgwMCwgICAgICAgLyogIG1vdiAgICAgW2NzOmRpQ29kZV0sZGkgICAgICAgICAgKi8KKyAgICAweEI4LDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgIC8qICBtb3YgICAgIGF4LDMgICAgICAgICAgICAgICAgICAgICovCisgICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH07CisjZW5kaWYKKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKK3sKKyNpZm5kZWYgRE9TNEdXCisgICAgdWludCAgICByc2VnLHJvZmY7CisjZWxzZQorICAgIHN0YXRpYyAgc2hvcnQgICBjcml0QnVmWzJdOworCisgICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7CisjZW5kaWYKKworICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOworICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOworICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOworCisjaWZuZGVmIERPUzRHVworICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3IsIGFzIHRoaXMgaXMgbm90IG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUKKyAgICAgKiBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZS4KKyAgICAgKi8KKyAgICBfUE1fY3JpdFB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3JpdGljYWxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOworICAgIG1lbWNweShfUE1fY3JpdFB0cixjcml0aWNhbEhhbmRsZXIsc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikpOworICAgIF9QTV9zZXRSTXZlY3QoMHgyNCwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7CisjZW5kaWYKK30KKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCit7CisgICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7CisgICAgICAgIHJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7CisgICAgICAgIFBNX2ZyZWVSZWFsU2VnKF9QTV9jcml0UHRyKTsKKyAgICAgICAgX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOworICAgICAgICBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKK30KKworaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIFBNU1JFR1Mgc3JlZ3M7CisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJldHVybiBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKK30KKworaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5jcyksbGVuKTsKK30KKworaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBQTVNSRUdTIHNyZWdzOworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuY3MpLGxlbik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc4ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBET1MKKyoKKyogRGVzY3JpcHRpb246ICBNYWluIEMgbW9kdWxlIGZvciB0aGUgVkZsYXQgZnJhbWVidWZmZXIgcm91dGluZXMuIFRoZSBwYWdlCisqICAgICAgICAgICAgICAgZmF1bHQgaGFuZGxlciBpcyBhbHdheXMgaW5zdGFsbGVkIHRvIGhhbmRsZSB1cCB0byBhIDRNYgorKiAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIHdpdGggYSB3aW5kb3cgc2l6ZSBvZiA0S2Igb3IgNjRLYiBpbiBzaXplLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZG9zLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBET1M0Ry9XLCBQTU9ERS9XIGFuZCBDYXVzZVdheSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TNEdXKQorCisjZGVmaW5lIFZGTEFUX1NUQVJUX0FERFIgICAgMHhGMDAwMDAwMFUKKyNkZWZpbmUgVkZMQVRfRU5EX0FERFIgICAgICAweEYwM0ZGRkZGVQorI2RlZmluZSBWRkxBVF9MSU1JVCAgICAgICAgIChWRkxBVF9FTkRfQUREUiAtIFZGTEFUX1NUQVJUX0FERFIpCisjZGVmaW5lIFBBR0VfUFJFU0VOVCAgICAgICAgMQorI2RlZmluZSBQQUdFX05PVFBSRVNFTlQgICAgIDAKKyNkZWZpbmUgUEFHRV9SRUFEICAgICAgICAgICAwCisjZGVmaW5lIFBBR0VfV1JJVEUgICAgICAgICAgMgorCitQUklWQVRFIGlib29sICAgaW5zdGFsbGVkID0gZmFsc2U7CitQUklWQVRFIGlib29sICAgaGF2ZURQTUkgPSBmYWxzZTsKK1BVQkxJQyAgaWJvb2wgICBfQVNNQVBJIFZGX2hhdmVDYXVzZVdheSA9IGZhbHNlOworUFVCTElDICB1Y2hhciAqIF9BU01BUEkgVkZfemVyb1B0ciA9IE5VTEw7CisKKy8qIExvdyBsZXZlbCBhc3NlbWJsZXIgY29kZSAqLworCitpbnQgICAgIF9BU01BUEkgSW5pdFBhZ2luZyh2b2lkKTsKK3ZvaWQgICAgX0FTTUFQSSBDbG9zZVBhZ2luZyh2b2lkKTsKK3ZvaWQgICAgX0FTTUFQSSBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Cit2b2lkICAgIF9BU01BUEkgSW5zdGFsbEZhdWx0SGFuZGxlcih1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUpOwordm9pZCAgICBfQVNNQVBJIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKTsKK3ZvaWQgICAgX0FTTUFQSSBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpOworCit2b2lkICogX0FTTUFQSSBWRl9tYWxsb2ModWludCBzaXplKQoreyByZXR1cm4gUE1fbWFsbG9jKHNpemUpOyB9CisKK3ZvaWQgX0FTTUFQSSBWRl9mcmVlKHZvaWQgKnApCit7IFBNX2ZyZWUocCk7IH0KKworUFJJVkFURSBpYm9vbCBDaGVja0RQTUkodm9pZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgQ2hlY2tEUE1JCisqIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBEUE1JCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIFBNUkVHUyAgcmVnczsKKworICAgIGlmIChoYXZlRFBNSSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBEUE1JIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBub3QgYmUKKyAgICAgKiBhYmxlIHRvIGluc3RhbGwgb3VyIHBhZ2UgZmF1bHQgaGFuZGxlcnMuIFdlIGNhbiBob3dldmVyIHVzZSB0aGUKKyAgICAgKiBEVkEuMzg2IG9yIFZGTEFURC4zODYgdmlydHVhbCBkZXZpY2UgZHJpdmVycyBpZiB0aGV5IGFyZSBwcmVzZW50LgorICAgICAqLworICAgIHJlZ3MueC5heCA9IDB4RkYwMDsKKyAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7CisgICAgaWYgKCFyZWdzLnguY2ZsYWcgJiYgKHJlZ3MuZS5lZGkgJiA4KSkKKyAgICAgICAgcmV0dXJuIChoYXZlRFBNSSA9IHRydWUpOworICAgIHJldHVybiBmYWxzZTsKK30KKworaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZGX2F2YWlsYWJsZQorKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgdmlydHVhbCBidWZmZXIgaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIGlmICghVkZfemVyb1B0cikKKyAgICAgICAgVkZfemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkZGRkYsdHJ1ZSk7CisgICAgaWYgKENoZWNrRFBNSSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvKiBTdGFuZGFyZCBET1M0R1csIFBNT0RFL1cgYW5kIENhdXNld2F5ICovCisgICAgaWYgKEluaXRQYWdpbmcoKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIENsb3NlUGFnaW5nKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgKiBQTUFQSSBJbml0RFBNSSh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIEluaXRET1M0R1cKKyogUGFyYW1ldGVyczogICBiYXNlQWRkciAgICAtIEJhc2UgYWRkcmVzcyBvZiBmcmFtZWJ1ZmZlciBiYW5rIHdpbmRvdworKiAgICAgICAgICAgICAgIGJhbmtTaXplICAgIC0gUGh5c2ljYWwgc2l6ZSBvZiBiYW5rcyBpbiBLYiAoNCBvciA2NCkKKyogICAgICAgICAgICAgICBjb2RlTGVuICAgICAtIExlbmd0aCBvZiAzMiBiaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24KKyogICAgICAgICAgICAgICBiYW5rRnVuYyAgICAtIFBvaW50ZXIgdG8gcHJvdGVjdGVkIG1vZGUgYmFuayBmdW5jdGlvbgorKiBSZXR1cm5zOiAgICAgIE5lYXIgcG9pbnRlciB0byB2aXJ0dWFsIGZyYW1lYnVmZmVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCisqCisqIERlc2NyaXB0aW9uOiAgSW5zdGFsbHMgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyIGhhbmRsaW5nIGZvcgorKiAgICAgICAgICAgICAgIERQTUkgZW52aXJvbm1lbnRzLiBUaGlzIHJlcXVpcmVzIHRoZSBEVkEuMzg2IG9yIFZGTEFURC4zODYKKyogICAgICAgICAgICAgICB2aXJ0dWFsIGRldmljZSBkcml2ZXJzIHRvIGJlIGluc3RhbGxlZCBhbmQgZnVuY3Rpb25pbmcuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgICh2b2lkKWJhc2VBZGRyOworICAgICh2b2lkKWJhbmtTaXplOworICAgICh2b2lkKWNvZGVMZW47CisgICAgKHZvaWQpYmFua0Z1bmM7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKiBQTUFQSSBJbml0RE9TNEdXKHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgSW5pdERPUzRHVworKiBQYXJhbWV0ZXJzOiAgIGJhc2VBZGRyICAgIC0gQmFzZSBhZGRyZXNzIG9mIGZyYW1lYnVmZmVyIGJhbmsgd2luZG93CisqICAgICAgICAgICAgICAgYmFua1NpemUgICAgLSBQaHlzaWNhbCBzaXplIG9mIGJhbmtzIGluIEtiICg0IG9yIDY0KQorKiAgICAgICAgICAgICAgIGNvZGVMZW4gICAgIC0gTGVuZ3RoIG9mIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbgorKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUG9pbnRlciB0byBwcm90ZWN0ZWQgbW9kZSBiYW5rIGZ1bmN0aW9uCisqIFJldHVybnM6ICAgICAgTmVhciBwb2ludGVyIHRvIHZpcnR1YWwgZnJhbWVidWZmZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyoKKyogRGVzY3JpcHRpb246ICBJbnN0YWxscyB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIgaGFuZGxpbmcgZm9yCisqICAgICAgICAgICAgICAgdGhlIERPUzRHVyBleHRlbmRlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgaW50ICAgICBpOworCisgICAgaWYgKEluaXRQYWdpbmcoKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogQ2Fubm90IGRvIGhhcmR3YXJlIHBhZ2luZyEgICAgICAgKi8KKworICAgIC8qIE1hcCA0TUIgb2YgdmlkZW8gbWVtb3J5IGludG8gbGluZWFyIGFkZHJlc3Mgc3BhY2UgKHJlYWQvd3JpdGUpICovCisgICAgaWYgKGJhbmtTaXplID09IDY0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBNYXBQaHlzaWNhbDJMaW5lYXIoYmFzZUFkZHIsVkZMQVRfU1RBUlRfQUREUisoaTw8MTYpLDE2LAorICAgICAgICAgICAgICAgIFBBR0VfV1JJVEUgfCBQQUdFX05PVFBSRVNFTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKyAgICAgICAgICAgIE1hcFBoeXNpY2FsMkxpbmVhcihiYXNlQWRkcixWRkxBVF9TVEFSVF9BRERSKyhpPDwxMiksMSwKKyAgICAgICAgICAgICAgICBQQUdFX1dSSVRFIHwgUEFHRV9OT1RQUkVTRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogSW5zdGFsbCBvdXIgcGFnZSBmYXVsdCBoYW5kbGVyIGFuZCBiYW5rcyBzd2l0Y2ggZnVuY3Rpb24gKi8KKyAgICBJbnN0YWxsRmF1bHRIYW5kbGVyKGJhc2VBZGRyLGJhbmtTaXplKTsKKyAgICBJbnN0YWxsQmFua0Z1bmMoY29kZUxlbixiYW5rRnVuYyk7CisgICAgaW5zdGFsbGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gKHZvaWQqKVZGTEFUX1NUQVJUX0FERFI7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOiAgICAgVkZfaW5pdAorKiBQYXJhbWV0ZXJzOiAgIGJhc2VBZGRyICAgIC0gQmFzZSBhZGRyZXNzIG9mIGZyYW1lYnVmZmVyIGJhbmsgd2luZG93CisqICAgICAgICAgICAgICAgYmFua1NpemUgICAgLSBQaHlzaWNhbCBzaXplIG9mIGJhbmtzIGluIEtiICg0IG9yIDY0KQorKiAgICAgICAgICAgICAgIGNvZGVMZW4gICAgIC0gTGVuZ3RoIG9mIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbgorKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUG9pbnRlciB0byBwcm90ZWN0ZWQgbW9kZSBiYW5rIGZ1bmN0aW9uCisqIFJldHVybnM6ICAgICAgTmVhciBwb2ludGVyIHRvIHZpcnR1YWwgZnJhbWVidWZmZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyoKKyogRGVzY3JpcHRpb246ICBJbnN0YWxscyB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIgaGFuZGxpbmcuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIGlmIChpbnN0YWxsZWQpCisgICAgICAgIHJldHVybiAodm9pZCopVkZMQVRfU1RBUlRfQUREUjsKKyAgICBpZiAoY29kZUxlbiA+IDEwMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIEJhbmsgZnVuY3Rpb24gaXMgdG9vIGxhcmdlISAgICAgICovCisgICAgaWYgKCFWRl96ZXJvUHRyKQorICAgICAgICBWRl96ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRkZGRix0cnVlKTsKKyAgICBpZiAoQ2hlY2tEUE1JKCkpCisgICAgICAgIHJldHVybiBJbml0RFBNSShiYXNlQWRkcixiYW5rU2l6ZSxjb2RlTGVuLGJhbmtGdW5jKTsKKyAgICByZXR1cm4gSW5pdERPUzRHVyhiYXNlQWRkcixiYW5rU2l6ZSxjb2RlTGVuLGJhbmtGdW5jKTsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbjogICAgIFZGX2V4aXQKKyoKKyogRGVzY3JpcHRpb246ICBDbG9zZXMgZG93biB0aGUgdmlydHVhbCBmcmFtZWJ1ZmZlciBzZXJ2aWNlcyBhbmQKKyogICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgcHJldmlvdXMgcGFnZSBmYXVsdCBoYW5kbGVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBpZiAoaW5zdGFsbGVkKSB7CisgICAgICAgIGlmIChoYXZlRFBNSSkgeworICAgICAgICAgICAgLyogRFBNSSBzdXBwb3J0ICovCisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogU3RhbmRhcmQgRE9TNEdXIGFuZCBQTU9ERS9XIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIFJlbW92ZUZhdWx0SGFuZGxlcigpOworICAgICAgICAgICAgQ2xvc2VQYWdpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFN1cHBvcnQgbWFwcGVkIG91dCBmb3Igb3RoZXIgY29tcGlsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZWxzZQorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKK3sKKyAgICAodm9pZCliYXNlQWRkcjsKKyAgICAodm9pZCliYW5rU2l6ZTsKKyAgICAodm9pZCljb2RlTGVuOworICAgICh2b2lkKWJhbmtGdW5jOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKK3sKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwZWQwNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy96dGltZXIuYwpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTVNET1MKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VjaGFyICogX1ZBUkFQSSBfWlRpbWVyQklPU1B0cjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLworCit2b2lkICAgIF9BU01BUEkgTFpfdGltZXJPbih2b2lkKTsKK3Vsb25nICAgX0FTTUFQSSBMWl90aW1lckxhcCh2b2lkKTsKK3ZvaWQgICAgX0FTTUFQSSBMWl90aW1lck9mZih2b2lkKTsKK3Vsb25nICAgX0FTTUFQSSBMWl90aW1lckNvdW50KHZvaWQpOwordm9pZCAgICBfQVNNQVBJIExaX2Rpc2FibGUodm9pZCk7Cit2b2lkICAgIF9BU01BUEkgTFpfZW5hYmxlKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX19aVGltZXJJbml0KHZvaWQpCit7CisgICAgX1pUaW1lckJJT1NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIExaX3RpbWVyT24oKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJMYXAodG0pICAgICAgICBMWl90aW1lckxhcCgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgICAgIExaX3RpbWVyT2ZmKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyQ291bnQodG0pICBMWl90aW1lckNvdW50KCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDU0OTI1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgdWxvbmcgICB0aWNrczsKKyAgICBMWl9kaXNhYmxlKCk7ICAgICAgICAgICAgLyogVHVybiBvZiBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgKi8KKyAgICB0aWNrcyA9IFBNX2dldExvbmcoX1pUaW1lckJJT1NQdHIrMHg2Qyk7CisgICAgTFpfZW5hYmxlKCk7ICAgICAgICAgICAgIC8qIFR1cm4gb24gaW50ZXJydXB0cyBhZ2FpbiAgICAgICAgICovCisgICAgcmV0dXJuIHRpY2tzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKK3doZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bworYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcworcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCit7CisgICAgaWYgKGZpbmlzaCA8IHN0YXJ0KQorICAgICAgICBmaW5pc2ggKz0gMTU3MzA0MEw7ICAgICAgICAgLyogTnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzICAgICAgKi8KKyAgICByZXR1cm4gZmluaXNoIC0gc3RhcnQ7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg0YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYwpAQCAtMCwwICsxLDExMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIE1haW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtIGV2ZW50CisqICAgICAgICAgICAgICAgbGlicmFyeS4gVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnZW5lcmljIGNyb3NzIHBsYXRmb3JtCisqICAgICAgICAgICAgICAgY29kZSwgYW5kIHB1bGxzIGluIG1vZHVsZXMgc3BlY2lmaWMgdG8gZWFjaCB0YXJnZXQgT1MKKyogICAgICAgICAgICAgICBlbnZpcm9ubWVudC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJldmVudC5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAib3NoZHIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBFVkVOVFFTSVpFICAgICAgMTAwICAgICAvKiBOdW1iZXIgb2YgZXZlbnRzIGluIGV2ZW50IHF1ZXVlICAgICAgKi8KKyNkZWZpbmUgSk9ZX05VTV9BWEVTICAgIDQgICAgICAgLyogTnVtYmVyIG9mIGpveXN0aWNrIGF4ZXMgc3VwcG9ydGVkICAgICovCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGludCAgICAgICAgIG14LG15OyAgICAgICAgICAgICAgLyogQ3VycmVudCBtb3VzZSBwb3NpdGlvbiAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICBoZWFkOyAgICAgICAgICAgICAgIC8qIEhlYWQgb2YgZXZlbnQgcXVldWUgICAgICAgICAgICAgICovCisgICAgaW50ICAgICAgICAgdGFpbDsgICAgICAgICAgICAgICAvKiBUYWlsIG9mIGV2ZW50IHF1ZXVlICAgICAgICAgICAgICAqLworICAgIGludCAgICAgICAgIGZyZWVIZWFkOyAgICAgICAgICAgLyogSGVhZCBvZiBmcmVlIGxpc3QgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICBjb3VudDsgICAgICAgICAgICAgIC8qIE5vLiBvZiBpdGVtcyBjdXJyZW50bHkgaW4gcXVldWUgICovCisgICAgZXZlbnRfdCAgICAgZXZ0cVtFVkVOVFFTSVpFXTsgICAvKiBUaGUgcXVldWUgc3RydWN0dXJlIGl0c2VsZiAgICAgICAqLworICAgIGludCAgICAgICAgIG9sZE1vdmU7ICAgICAgICAgICAgLyogUHJldmlvdXMgbW92ZW1lbnQgZXZlbnQgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICBvbGRLZXk7ICAgICAgICAgICAgIC8qIFByZXZpb3VzIGtleSByZXBlYXQgZXZlbnQgICAgICAgICovCisgICAgaW50ICAgICAgICAgb2xkSm95TW92ZTsgICAgICAgICAvKiBQcmV2aW91cyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLworICAgIGludCAgICAgICAgIGpveU1hc2s7ICAgICAgICAgICAgLyogTWFzayBvZiBqb3lzdGljayBheGVzIHByZXNlbnQgICAgKi8KKyAgICBpbnQgICAgICAgICBqb3lNaW5bSk9ZX05VTV9BWEVTXTsKKyAgICBpbnQgICAgICAgICBqb3lDZW50ZXJbSk9ZX05VTV9BWEVTXTsKKyAgICBpbnQgICAgICAgICBqb3lNYXhbSk9ZX05VTV9BWEVTXTsKKyAgICBpbnQgICAgICAgICBqb3lQcmV2W0pPWV9OVU1fQVhFU107CisgICAgaW50ICAgICAgICAgam95QnV0U3RhdGU7CisgICAgdWxvbmcgICAgICAgZG91YmxlQ2xpY2s7CisgICAgdWxvbmcgICAgICAgYXV0b1JlcGVhdDsKKyAgICB1bG9uZyAgICAgICBhdXRvRGVsYXk7CisgICAgdWxvbmcgICAgICAgYXV0b1RpY2tzOworICAgIHVsb25nICAgICAgIGRvdWJsZUNsaWNrVGhyZXNoOworICAgIHVsb25nICAgICAgIGZpcnN0QXV0bzsKKyAgICBpbnQgICAgICAgICBhdXRvTW91c2VfeDsKKyAgICBpbnQgICAgICAgICBhdXRvTW91c2VfeTsKKyAgICBldmVudF90ICAgICBkb3duTW91c2U7CisgICAgdWxvbmcgICAgICAga2V5TW9kaWZpZXJzOyAgICAgICAvKiBDdXJyZW50IGtleWJvYXJkIG1vZGlmaWVycyAgICAgICAqLworICAgIHVjaGFyICAgICAgIGtleVRhYmxlWzEyOF07ICAgICAgLyogVGFibGUgb2Yga2V5IHVwL2Rvd24gZmxhZ3MgICAgICAgKi8KKyAgICBpYm9vbCAgICAgICBhbGxvd0xFRFM7ICAgICAgICAgIC8qIFRydWUgaWYgTEVEUyBzaG91bGQgY2hhbmdlICAgICAgICovCisgICAgX0VWVF91c2VyRXZlbnRGaWx0ZXIgICAgdXNlckV2ZW50Q2FsbGJhY2s7CisgICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyICAgbW91c2VNb3ZlOworICAgIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgIGhlYXJ0QmVhdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqaGVhcnRCZWF0UGFyYW1zOworICAgIGNvZGVwYWdlX3QgICAgICAgICAgICAgICpjb2RlUGFnZTsKKyAgICB9IEVWVDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoX19SRUFMRE9TX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQorLyoge3NlY3JldH0gKi8KK3ZvaWQgRVZUQVBJIF9FVlRfY0NvZGVTdGFydCh2b2lkKSB7fQorI2VuZGlmCisKKy8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KKworaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lBeGlzKGludCBtYXNrLGludCAqYXhpcyk7CitpbnQgRVZUQVBJIF9FVlRfcmVhZEpveUJ1dHRvbnModm9pZCk7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KKwordWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitldnQgLSBFdmVudCB0byBhZGQgdG8gdGhlIGV2ZW50IHF1ZXVlCisKK1JFTUFSS1M6CitBZGRzIGFuIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZSBieSB0YWNraW5nIGl0IG9udG8gdGhlIHRhaWwgb2YgdGhlIGV2ZW50CitxdWV1ZS4gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhdCBsZWFzdCBvbmUgc3BvdCBpcyBhdmFpbGFibGUgb24gdGhlCitmcmVlTGlzdCBmb3IgdGhlIGV2ZW50IHRvIGJlIGluc2VydGVkLgorCitOT1RFOiAgIEludGVycnVwdHMgTVVTVCBiZSBPRkYgd2hpbGUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBlbnN1cmUgd2UgaGF2ZQorICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgICAgICAgIGludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFkZEV2ZW50KAorICAgIGV2ZW50X3QgKmV2dCkKK3sKKyAgICBpbnQgZXZ0SUQ7CisKKyAgICAvKiBDaGVjayBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cyAqLworICAgIGlmIChldnQtPndoYXQgJiBFVlRfTU9VU0VFVlQpIHsKKyAgICAgICAgRVZULmF1dG9Nb3VzZV94ID0gZXZ0LT53aGVyZV94OworICAgICAgICBFVlQuYXV0b01vdXNlX3kgPSBldnQtPndoZXJlX3k7CisgICAgICAgIGlmICgoZXZ0LT53aGF0ICYgRVZUX01PVVNFRE9XTikgJiYgIShldnQtPm1lc3NhZ2UgJiBFVlRfREJMQ0xJQ0spKSB7CisgICAgICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIGxhc3QgbW91c2UgZXZlbnQgd2FzIGEgZG91YmxlIGNsaWNrIGV2ZW50ICovCisgICAgICAgICAgICB1aW50IGRpZmZfeCA9IEFCUyhldnQtPndoZXJlX3ggLSBFVlQuZG93bk1vdXNlLndoZXJlX3gpOworICAgICAgICAgICAgdWludCBkaWZmX3kgPSBBQlMoZXZ0LT53aGVyZV95IC0gRVZULmRvd25Nb3VzZS53aGVyZV95KTsKKyAgICAgICAgICAgIGlmICgoZXZ0LT5tZXNzYWdlID09IEVWVC5kb3duTW91c2UubWVzc2FnZSkKKyAgICAgICAgICAgICAgICAmJiAoKGV2dC0+d2hlbiAtIEVWVC5kb3duTW91c2Uud2hlbikgPD0gRVZULmRvdWJsZUNsaWNrKQorICAgICAgICAgICAgICAgICYmIChkaWZmX3ggPD0gRVZULmRvdWJsZUNsaWNrVGhyZXNoKQorICAgICAgICAgICAgICAgICYmIChkaWZmX3kgPD0gRVZULmRvdWJsZUNsaWNrVGhyZXNoKSkgeworICAgICAgICAgICAgICAgIGV2dC0+bWVzc2FnZSB8PSBFVlRfREJMQ0xJQ0s7CisgICAgICAgICAgICAgICAgRVZULmRvd25Nb3VzZSA9ICpldnQ7CisgICAgICAgICAgICAgICAgRVZULmRvd25Nb3VzZS53aGVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRVZULmRvd25Nb3VzZSA9ICpldnQ7CisgICAgICAgICAgICBFVlQuYXV0b1RpY2tzID0gX0VWVF9nZXRUaWNrcygpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChldnQtPndoYXQgJiBFVlRfTU9VU0VVUCkgeworICAgICAgICAgICAgRVZULmRvd25Nb3VzZS53aGF0ID0gRVZUX05VTExFVlQ7CisgICAgICAgICAgICBFVlQuZmlyc3RBdXRvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogQ2FsbCB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIHRvIG1vZGlmeSB0aGUgZXZlbnQgaWYgZGVzaXJlZCAqLworICAgIGlmIChFVlQudXNlckV2ZW50Q2FsbGJhY2spIHsKKyAgICAgICAgaWYgKCFFVlQudXNlckV2ZW50Q2FsbGJhY2soZXZ0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgLyogR2V0IHNwb3QgdG8gcGxhY2UgdGhlIGV2ZW50IGZyb20gdGhlIGZyZWUgbGlzdCAqLworICAgIGV2dElEID0gRVZULmZyZWVIZWFkOworICAgIEVWVC5mcmVlSGVhZCA9IEVWVC5ldnRxW0VWVC5mcmVlSGVhZF0ubmV4dDsKKworICAgIC8qIEFkZCB0byB0aGUgRVZULnRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICAgKi8KKyAgICBldnQtPm5leHQgPSAtMTsKKyAgICBldnQtPnByZXYgPSBFVlQudGFpbDsKKyAgICBpZiAoRVZULnRhaWwgIT0gLTEpCisgICAgICAgIEVWVC5ldnRxW0VWVC50YWlsXS5uZXh0ID0gZXZ0SUQ7CisgICAgZWxzZQorICAgICAgICBFVlQuaGVhZCA9IGV2dElEOworICAgIEVWVC50YWlsID0gZXZ0SUQ7CisgICAgRVZULmV2dHFbZXZ0SURdID0gKmV2dDsKKyAgICBFVlQuY291bnQrKzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbnRlcm5hbCBmdW5jdGlvbiB0byBpbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSB0byB0aGUgZW1wdHkgc3RhdGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdEV2ZW50UXVldWUodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEJ1aWxkIGZyZWUgbGlzdCwgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBFVkVOVFFTSVpFOyBpKyspCisgICAgICAgIEVWVC5ldnRxW2ldLm5leHQgPSBpKzE7CisgICAgRVZULmV2dHFbRVZFTlRRU0laRS0xXS5uZXh0ID0gLTE7ICAgICAgIC8qIFRlcm1pbmF0ZSBsaXN0ICAgICAgICAgICAqLworICAgIEVWVC5jb3VudCA9IEVWVC5mcmVlSGVhZCA9IDA7CisgICAgRVZULmhlYWQgPSBFVlQudGFpbCA9IC0xOworICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgRVZULm9sZEtleSA9IC0xOworICAgIEVWVC5vbGRKb3lNb3ZlID0gLTE7CisgICAgRVZULmpveUJ1dFN0YXRlID0gMDsKKyAgICBFVlQubXggPSBFVlQubXkgPSAwOworICAgIEVWVC5rZXlNb2RpZmllcnMgPSAwOworICAgIEVWVC5hbGxvd0xFRFMgPSB0cnVlOworCisgICAgLyogU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtb3VzZSBkb3VibGUgY2xpY2sgYW5kIG1vdXNlIGF1dG8gZXZlbnRzICovCisgICAgRVZULmRvdWJsZUNsaWNrID0gNDQwOworICAgIEVWVC5hdXRvUmVwZWF0ID0gNTU7CisgICAgRVZULmF1dG9EZWxheSA9IDMzMDsKKyAgICBFVlQuYXV0b1RpY2tzID0gMDsKKyAgICBFVlQuZG91YmxlQ2xpY2tUaHJlc2ggPSA1OworICAgIEVWVC5maXJzdEF1dG8gPSB0cnVlOworICAgIEVWVC5hdXRvTW91c2VfeCA9IEVWVC5hdXRvTW91c2VfeSA9IDA7CisgICAgbWVtc2V0KCZFVlQuZG93bk1vdXNlLDAsc2l6ZW9mKEVWVC5kb3duTW91c2UpKTsKKworICAgIC8qIFNldHVwIGRlZmF1bHQgcG9pbnRlcnMgZm9yIGV2ZW50IGxpYnJhcnkgKi8KKyAgICBFVlQudXNlckV2ZW50Q2FsbGJhY2sgPSBOVUxMOworICAgIEVWVC5jb2RlUGFnZSA9ICZfQ1BfVVNfRW5nbGlzaDsKKworICAgIC8qIEluaXRpYWxpc2UgdGhlIGpveXN0aWNrIG1vZHVsZSBhbmQgZG8gYmFzaWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKKyAgICAgKiB0aGUgam95c3RpY2sgaXMgY2VudGVyZWQuCisgICAgICovCisgICAgRVZULmpveU1hc2sgPSBFVlRfam95SXNQcmVzZW50KCk7Cit9CisKKyNpZiBkZWZpbmVkKE5FRURfU0NBTEVfSk9ZX0FYSVMpIHx8ICFkZWZpbmVkKFVTRV9PU19KT1lTVElDSykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBzY2FsZXMgYSBqb3lzdGljayBheGlzIHZhbHVlIHRvIG5vcm1hbGlzZWQgZm9ybS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHNjYWxlSm95QXhpcygKKyAgICBpbnQgcmF3LAorICAgIGludCBheGlzKQoreworICAgIGludCBzY2FsZWQscmFuZ2U7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGpveXN0aWNrIGlzIGNhbGlicmF0ZWQgcHJvcGVybHkgKi8KKyAgICBpZiAoRVZULmpveUNlbnRlcltheGlzXSAtIEVWVC5qb3lNaW5bYXhpc10gPCA1KQorICAgICAgICByZXR1cm4gcmF3OworICAgIGlmIChFVlQuam95TWF4W2F4aXNdIC0gRVZULmpveUNlbnRlcltheGlzXSA8IDUpCisgICAgICAgIHJldHVybiByYXc7CisKKyAgICAvKiBOb3cgc2NhbGUgdGhlIGNvb3JkaW5hdGVzIHRvIC0xMjggdG8gMTI3ICovCisgICAgcmF3IC09IEVWVC5qb3lDZW50ZXJbYXhpc107CisgICAgaWYgKHJhdyA8IDApCisgICAgICAgIHJhbmdlID0gRVZULmpveUNlbnRlcltheGlzXS1FVlQuam95TWluW2F4aXNdOworICAgIGVsc2UKKyAgICAgICAgcmFuZ2UgPSBFVlQuam95TWF4W2F4aXNdLUVWVC5qb3lDZW50ZXJbYXhpc107CisgICAgc2NhbGVkID0gKHJhdyAqIDEyOCkgLyByYW5nZTsKKyAgICBpZiAoc2NhbGVkIDwgLTEyOCkKKyAgICAgICAgc2NhbGVkID0gLTEyODsKKyAgICBpZiAoc2NhbGVkID4gMTI3KQorICAgICAgICBzY2FsZWQgPSAxMjc7CisgICAgcmV0dXJuIHNjYWxlZDsKK30KKyNlbmRpZgorCisjaWYgICAgIGRlZmluZWQoX19TTVgzMl9fKQorI2luY2x1ZGUgInNteC9ldmVudC5jIgorI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKKyNpbmNsdWRlICJydHRhcmdldC9ldmVudC5jIgorI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQorI2luY2x1ZGUgImRvcy9ldmVudC5jIgorI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pCisjaW5jbHVkZSAid2luMzIvZXZlbnQuYyIKKyNlbGlmICAgZGVmaW5lZChfX09TMl9fKQorI2lmICAgICBkZWZpbmVkKF9fT1MyX1BNX18pCisjaW5jbHVkZSAib3MycG0vZXZlbnQuYyIKKyNlbHNlCisjaW5jbHVkZSAib3MyL2V2ZW50LmMiCisjZW5kaWYKKyNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pCisjaWYgICAgIGRlZmluZWQoX19VU0VfWDExX18pCisjaW5jbHVkZSAieDExL2V2ZW50LmMiCisjZWxzZQorI2luY2x1ZGUgImxpbnV4L2V2ZW50LmMiCisjZW5kaWYKKyNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQorI2lmICAgICBkZWZpbmVkKF9fVVNFX1BIT1RPTl9fKQorI2luY2x1ZGUgInBob3Rvbi9ldmVudC5jIgorI2VsaWYgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQorI2luY2x1ZGUgIngxMS9ldmVudC5jIgorI2Vsc2UKKyNpbmNsdWRlICJxbngvZXZlbnQuYyIKKyNlbmRpZgorI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQorI2luY2x1ZGUgImJlb3MvZXZlbnQuYyIKKyNlbHNlCisjZXJyb3IgIEV2ZW50IGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJZiBVU0VfT1NfSk9ZU1RJQ0sgaXMgZGVmaW5lZCwgdGhlIE9TIHNwZWNpZmljIGxpYnJhcmllcyB3aWxsIGltcGxlbWVudAorICogdGhlIGpveXN0aWNrIGNvZGUgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGdlbmVyaWMgT1MgcG9ydGFibGUgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFVTRV9PU19KT1lTVElDSworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQord2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKK2F0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAordGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCityZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KKworU0VFIEFMU086CitFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQoreworICAgIGludCBtYXNrLGk7CisKKyAgICBtZW1zZXQoRVZULmpveU1pbiwwLHNpemVvZihFVlQuam95TWluKSk7CisgICAgbWVtc2V0KEVWVC5qb3lDZW50ZXIsMCxzaXplb2YoRVZULmpveUNlbnRlcikpOworICAgIG1lbXNldChFVlQuam95TWF4LDAsc2l6ZW9mKEVWVC5qb3lNYXgpKTsKKyAgICBtZW1zZXQoRVZULmpveVByZXYsMCxzaXplb2YoRVZULmpveVByZXYpKTsKKyAgICBFVlQuam95QnV0U3RhdGUgPSAwOworI2lmZGVmIF9fTElOVVhfXworICAgIFBNX2luaXQoKTsKKyNlbmRpZgorICAgIG1hc2sgPSBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveUNlbnRlcik7CisgICAgaWYgKG1hc2spIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKQorICAgICAgICAgICAgRVZULmpveU1heFtpXSA9IEVWVC5qb3lDZW50ZXJbaV0qMjsKKyAgICAgICAgfQorICAgIHJldHVybiBtYXNrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitQb2xscyB0aGUgam95c3RpY2sgZm9yIHBvc2l0aW9uIGFuZCBidXR0b24gaW5mb3JtYXRpb24uCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK1RoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBvbGwgYW5hbG9ndWUgam95c3RpY2tzIGZvciBidXR0b24gYW5kIHBvc2l0aW9uCitpbmZvcm1hdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1haW4gbG9vcCBvZiB0aGUgdXNlcgorYXBwbGljYXRpb24sIGp1c3QgYmVmb3JlIHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgZXZlbnRzIHZpYSBFVlRfZ2V0TmV4dC4KK0FsbCBpbmZvcm1hdGlvbiBwb2xsZWQgZnJvbSB0aGUgam95c3RpY2sgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGV2ZW50CitxdWV1ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgorCitOb3RlOiAgIE1vc3QgYW5hbG9ndWUgam95c3RpY2tzIHdpbGwgcHJvdmlkZSByZWFkaW5ncyB0aGF0IGNoYW5nZSBldmVuCisgICAgICAgIHRob3VnaCB0aGUgam95c3RpY2sgaGFzIG5vdCBtb3ZlZC4gSGVuY2UgaWYgeW91IGNhbGwgdGhpcyByb3V0aW5lCisgICAgICAgIHlvdSB3aWxsIGxpa2VseSBnZXQgYW4gRVZUX0pPWU1PVkUgZXZlbnQgZXZlcnkgdGltZSB0aHJvdWdoIHlvdXIKKyAgICAgICAgZXZlbnQgbG9vcC4KKworU0VFIEFMU086CitFVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwKK0VWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfcG9sbEpveXN0aWNrKHZvaWQpCit7CisgICAgZXZlbnRfdCBldnQ7CisgICAgaW50ICAgICBpLGF4aXNbSk9ZX05VTV9BWEVTXSxuZXdCdXRTdGF0ZSxtYXNrLG1vdmVkLHBzOworCisgICAgaWYgKEVWVC5qb3lNYXNrKSB7CisgICAgICAgIC8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCisgICAgICAgICAqIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBwb2xsZWQuIFVudGlsIHRoZSBldmVudHMgYXJlCisgICAgICAgICAqIGFjdHVhbGx5IGZsdXNoZWQsIHdlIGtlZXAgbW9kaWZ5aW5nIHRoZSBzYW1lIGpveXN0aWNrIG1vdmVtZW50CisgICAgICAgICAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50CisgICAgICAgICAqLworICAgICAgICBtYXNrID0gX0VWVF9yZWFkSm95QXhpcyhFVlQuam95TWFzayxheGlzKTsKKyAgICAgICAgbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7CisgICAgICAgIG1vdmVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKT1lfTlVNX0FYRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQorICAgICAgICAgICAgICAgIGF4aXNbaV0gPSBzY2FsZUpveUF4aXMoYXhpc1tpXSxpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBheGlzW2ldID0gRVZULmpveVByZXZbaV07CisgICAgICAgICAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKKyAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChtb3ZlZCkgeworICAgICAgICAgICAgbWVtY3B5KEVWVC5qb3lQcmV2LGF4aXMsc2l6ZW9mKEVWVC5qb3lQcmV2KSk7CisgICAgICAgICAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOworICAgICAgICAgICAgaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS5tZXNzYWdlID0gbmV3QnV0U3RhdGU7CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgICAgICAgICAgLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCisgICAgICAgICAgICAgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVC5qb3lCdXRTdGF0ZTsKKyAgICAgICAgICAgICAgICBldnQud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOworICAgICAgICAgICAgICAgIGV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07CisgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKKyAgICAgICAgICAgICAgICBldnQucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB0aGUgam95c3RpY2sgYnV0dG9ucywgYW5kIHBvc3QgZXZlbnRzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZQorICAgICAgICAgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCisgICAgICAgICAqLworICAgICAgICBpZiAobmV3QnV0U3RhdGUgIT0gRVZULmpveUJ1dFN0YXRlKSB7CisgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgeworICAgICAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBqb3lzdGljayBjbGljayBldmVudCAqLworICAgICAgICAgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfSk9ZQ0xJQ0s7CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS53aGVyZV95ID0gRVZULmpveVByZXZbMV07CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgRVZULmpveUJ1dFN0YXRlID0gbmV3QnV0U3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgorCitIRUFERVI6CitldmVudC5oCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCit3aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCit0aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCitUbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Citwb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKK2Z1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQorY2FsaWJyYXRpb24gZmFjdG9ycy4KKworVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCitpbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKK3VwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKK3NhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgorCitTRUUgQUxTTzoKK0VWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQoreworICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAord2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwordGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgorVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKK3Bvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcworZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCitjYWxpYnJhdGlvbiBmYWN0b3JzLgorCitVc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKK2luaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQordXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQorc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCisKK1NFRSBBTFNPOgorRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCit7CisgICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitDYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAord2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwordGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgorVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCitwb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKK2Z1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQorY2FsaWJyYXRpb24gZmFjdG9ycy4KKworVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCitpbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKK3VwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKK3NhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgorCitTRUUgQUxTTzoKK0VWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQoreworICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitQb3N0cyBhIHVzZXIgZGVmaW5lZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUKKworSEVBREVSOgorZXZlbnQuaAorCitSRVRVUk5TOgorVHJ1ZSBpZiBldmVudCB3YXMgcG9zdGVkLCBmYWxzZSBpZiBldmVudCBxdWV1ZSBpcyBmdWxsLgorCitQQVJBTUVURVJTOgord2hhdCAgICAgICAgLSBUeXBlIGNvZGUgZm9yIG1lc3NhZ2UgdG8gcG9zdAorbWVzc2FnZSAgICAgLSBFdmVudCBzcGVjaWZpYyBtZXNzYWdlIHRvIHBvc3QKK21vZGlmaWVycyAgIC0gRXZlbnQgc3BlY2lmaWMgbW9kaWZpZXIgZmxhZ3MgdG8gcG9zdAorCitSRU1BUktTOgorVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9zdCB1c2VyIGRlZmluZWQgZXZlbnRzIHRvIHRoZSBldmVudCBxdWV1ZS4KKworU0VFIEFMU086CitFVlRfZmx1c2gsIEVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9oYWx0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgRVZUQVBJIEVWVF9wb3N0KAorICAgIHVsb25nIHdoaWNoLAorICAgIHVsb25nIHdoYXQsCisgICAgdWxvbmcgbWVzc2FnZSwKKyAgICB1bG9uZyBtb2RpZmllcnMpCit7CisgICAgZXZlbnRfdCBldnQ7CisgICAgdWludCAgICBwczsKKworICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgIC8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkICovCisgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgIGV2dC53aGljaCA9IHdoaWNoOworICAgICAgICBldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKKyAgICAgICAgZXZ0LndoYXQgPSB3aGF0OworICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIGFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAvKiBBZGQgdG8gRVZULnRhaWwgb2YgZXZlbnQgcXVldWUgICAqLworICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitGbHVzaGVzIGFsbCBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBldmVudCBxdWV1ZS4KKworUEFSQU1FVEVSUzoKK21hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK0ZsdXNoZXMgKHJlbW92ZXMpIGFsbCBwZW5kaW5nIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgZXZlbnQKK3F1ZXVlLiBZb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZQorbG9naWNhbCBPUi4KKworU0VFIEFMU086CitFVlRfZ2V0TmV4dCwgRVZUX2hhbHQsIEVWVF9wZWVrTmV4dAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9mbHVzaCgKKyAgICB1bG9uZyBtYXNrKQoreworICAgIGV2ZW50X3QgZXZ0OworCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBhbGwgZXZlbnRzICovCisgICAgICAgIEVWVF9nZXROZXh0KCZldnQsbWFzayk7CisgICAgICAgIH0gd2hpbGUgKGV2dC53aGF0ICE9IEVWVF9OVUxMRVZUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorSGFsdHMgdW50aWwgYW5kIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyByZWNpZXZlZC4KKworSEVBREVSOgorZXZlbnQuaAorCitQQVJBTUVURVJTOgorZXZ0ICAgICAtIFBvaW50ZXIgdG8KK21hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBoYWx0cyBleGNldXRpb24gdW50aWwgYW4gZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGlzCityZWNpZXZlZCBpbnRvIHRoZSBldmVudCBxdWV1ZS4gSXQgZG9lcyBub3QgZmx1c2ggdGhlIGV2ZW50IHF1ZXVlIG9mIGV2ZW50cworYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGJ1c3kgbG9vcC4gSG93ZXZlciB0aGlzIGZ1bmN0aW9uIGRvZXMgdGhyb3cgYXdheQorYW55IGV2ZW50cyBvdGhlciB0aGFuIHRoZSBvbmVzIHlvdSBoYXZlIHJlcXVlc3RlZCB2aWEgdGhlIGV2ZW50IG1hc2ssIHRvCithdm9pZCB0aGUgZXZlbnQgcXVldWUgZmlsbGluZyB1cCB3aXRoIHVud2FudGVkIGV2ZW50cyAobGlrZSBFVlRfS0VZVVAgb3IKK0VWVF9NT1VTRU1PVkUgZXZlbnRzKS4KKworU0VFIEFMU086CitFVlRfZ2V0TmV4dCwgRVZUX2ZsdXNoLCBFVlRfcGVla05leHQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfaGFsdCgKKyAgICBldmVudF90ICpldnQsCisgICAgdWxvbmcgbWFzaykKK3sKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIGFuIGV2ZW50ICAgICovCisgICAgICAgIGlmIChtYXNrICYgKEVWVF9KT1lFVlQpKQorICAgICAgICAgICAgRVZUX3BvbGxKb3lzdGljaygpOworICAgICAgICBFVlRfZ2V0TmV4dChldnQsRVZUX0VWRVJZRVZUKTsKKyAgICAgICAgfSB3aGlsZSAoIShldnQtPndoYXQgJiBtYXNrKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1BlZWtzIGF0IHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorCitIRUFERVI6CitldmVudC5oCisKK1JFVFVSTlM6CitUcnVlIGlmIGFuIGV2ZW50IGlzIHBlbmRpbmcsIGZhbHNlIGlmIG5vdC4KKworUEFSQU1FVEVSUzoKK2V2dCAgICAgLSBQb2ludGVyIHRvIHN0cnVjdHVyZSB0byByZXR1cm4gdGhlIGV2ZW50IGluZm8gaW4KK21hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCisKK1JFTUFSS1M6CitQZWVrcyBhdCB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUgZXZlbnQgcXVldWUuIFRoZQorbWFzayBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGV2ZW50cyB0byBiZSBwZWVrZWQgYXQsIGFuZAorY2FuIGJlIGFueSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFueSBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBieSB0aGUKK0VWVF9ldmVudFR5cGUgZW51bWVyYXRpb24uCisKK0luIGNvbnRyYXN0IHRvIEVWVF9nZXROZXh0LCB0aGUgZXZlbnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCitZb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZSBsb2dpY2FsIE9SLgorCitTRUUgQUxTTzoKK0VWVF9mbHVzaCwgRVZUX2dldE5leHQsIEVWVF9oYWx0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgRVZUQVBJIEVWVF9wZWVrTmV4dCgKKyAgICBldmVudF90ICpldnQsCisgICAgdWxvbmcgbWFzaykKK3sKKyAgICBpbnQgICAgIGV2dElEOworICAgIHVpbnQgICAgcHM7CisKKyAgICBpZiAoRVZULmhlYXJ0QmVhdCkKKyAgICAgICAgRVZULmhlYXJ0QmVhdChFVlQuaGVhcnRCZWF0UGFyYW1zKTsKKyAgICBfRVZUX3B1bXBNZXNzYWdlcygpOyAgICAgICAgICAgICAgICAvKiBQdW1wIGFsbCBtZXNzYWdlcyBpbnRvIHF1ZXVlICovCisgICAgRVZULm1vdXNlTW92ZShFVlQubXgsRVZULm15KTsgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICAgICAqLworICAgIGV2dC0+d2hhdCA9IEVWVF9OVUxMRVZUOyAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAgICAgKi8KKyAgICBpZiAoRVZULmNvdW50KSB7CisgICAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gZXZlbnQgYmUgcG9zdGVkIHdoaWxlIHdlIGFyZSB0cnlpbmcKKyAgICAgICAgICogdG8gYWNjZXNzIHRoZSBldmVudCBxdWV1ZS4gVGhpcyB3b3VsZCBjcmVhdGUgcHJvYmxlbXMgc2luY2UKKyAgICAgICAgICogd2UgbWF5IGVuZCB1cCB3aXRoIGludmFsaWQgZGF0YSBmb3Igb3VyIGV2ZW50IHF1ZXVlIHBvaW50ZXJzLiBUbworICAgICAgICAgKiBhbGxldmlhdGUgdGhpcywgYWxsIGludGVycnVwdHMgYXJlIHN1c3BlbmRlZCB3aGlsZSB3ZSBtYW5pcHVsYXRlCisgICAgICAgICAqIG91ciBwb2ludGVycy4KKyAgICAgICAgICovCisgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7ICAgICAgICAgICAgIC8qIGRpc2FibGUgaW50ZXJydXB0cyAgICAgICAqLworICAgICAgICBmb3IgKGV2dElEID0gRVZULmhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0KSB7CisgICAgICAgICAgICBpZiAoRVZULmV2dHFbZXZ0SURdLndoYXQgJiBtYXNrKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGV2dElEID09IC0xKSB7CisgICAgICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAvKiBFdmVudCB3YXMgbm90IGZvdW5kICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgKmV2dCA9IEVWVC5ldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLworICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICBpZiAoZXZ0LT53aGF0ICYgRVZUX0tFWUVWVCkKKyAgICAgICAgICAgIF9FVlRfbWFza0tleUNvZGUoZXZ0KTsKKyAgICAgICAgfQorICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHJpZXZlcyB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IGZyb20gdGhlIGV2ZW50IHF1ZXVlLgorCitQQVJBTUVURVJTOgorZXZ0ICAgICAtIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHJldHVybiB0aGUgZXZlbnQgaW5mbyBpbgorbWFzayAgICAtIE1hc2sgc3BlY2lmeWluZyB0aGUgdHlwZXMgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQKKworSEVBREVSOgorZXZlbnQuaAorCitSRVRVUk5TOgorVHJ1ZSBpZiBhbiBldmVudCB3YXMgcGVuZGluZywgZmFsc2UgaWYgbm90LgorCitSRU1BUktTOgorUmV0cmlldmVzIHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUsIGFuZCBzdG9yZXMgaXQgaW4gYQorZXZlbnRfdCBzdHJ1Y3R1cmUuIFRoZSBtYXNrIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZXZlbnRzCit0byBiZSByZW1vdmVkLCBhbmQgY2FuIGJlIGFueSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFueSBvZiB0aGUgZmxhZ3MgZGVmaW5lZAorYnkgdGhlIEVWVF9ldmVudFR5cGUgZW51bWVyYXRpb24uCisKK1RoZSB3aGF0IGZpZWxkIG9mIHRoZSBldmVudCBjb250YWlucyB0aGUgZXZlbnQgY29kZSBvZiB0aGUgZXZlbnQgdGhhdCB3YXMKK2V4dHJhY3RlZC4gQWxsIGFwcGxpY2F0aW9uIHNwZWNpZmljIGV2ZW50cyBzaG91bGQgYmVnaW4gd2l0aCB0aGUgRVZUX1VTRVJFVlQKK2NvZGUgYW5kIGJ1aWxkIGZyb20gdGhlcmUuIFNpbmNlIHRoZSBldmVudCBjb2RlIGlzIHN0b3JlZCBpbiBhbiBpbnRlZ2VyLAordGhlcmUgaXMgYSBtYXhpbXVtIG9mIDMyIGRpZmZlcmVudCBldmVudCBjb2RlcyB0aGF0IGNhbiBiZSBkaXN0aW5ndWlzaGVkLgorWW91IGNhbiBzdG9yZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQgaW4gdGhlIG1lc3NhZ2UgZmllbGQgdG8KK2Rpc3Rpbmd1aXNoIGJldHdlZW4gZXZlbnRzIG9mIHRoZSBzYW1lIGNsYXNzIChmb3IgaW5zdGFuY2UgdGhlIGJ1dHRvbiB1c2VkIGluCithIEVWVF9NT1VTRURPV04gZXZlbnQpLgorCitJZiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2FzIG5vdCBpbiB0aGUgZXZlbnQgcXVldWUsIHRoZSB3aGF0IGZpZWxkCitvZiB0aGUgZXZlbnQgd2lsbCBiZSBzZXQgdG8gTlVMTEVWVCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCByZXR1cm4gZmFsc2UuCisKK05vdGU6ICAgWW91IHNob3VsZCAvYWx3YXlzLyB1c2UgdGhlIEVWVF9FVkVSWUVWVCBtYXNrIGZvciBleHRyYWN0aW5nIGV2ZW50cworICAgICAgICBmcm9tIHlvdXIgbWFpbiBldmVudCBsb29wIGhhbmRsZXIuIFVzaW5nIGEgbWFzayBmb3Igb25seSBhIHNwZWNpZmljCisgICAgICAgIHR5cGUgb2YgZXZlbnQgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lIHdpbGwgY2F1c2UgdGhlIGV2ZW50IHF1ZXVlIHRvCisgICAgICAgIGZpbGwgdXAgd2l0aCBldmVudHMgb2YgdGhlIHR5cGUgeW91IGFyZSBpZ25vcmluZywgZXZlbnR1YWxseSBjYXVzaW5nCisgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBoYW5nIHdoZW4gdGhlIGV2ZW50IHF1ZXVlIGJlY29tZXMgZnVsbC4KKworU0VFIEFMU086CitFVlRfZmx1c2gsIEVWVF9oYWx0LCBFVlRfcGVla05leHQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBFVlRBUEkgRVZUX2dldE5leHQoCisgICAgZXZlbnRfdCAqZXZ0LAorICAgIHVsb25nIG1hc2spCit7CisgICAgaW50ICAgICBldnRJRCxuZXh0LHByZXY7CisgICAgdWludCAgICBwczsKKworICAgIGlmIChFVlQuaGVhcnRCZWF0KQorICAgICAgICBFVlQuaGVhcnRCZWF0KEVWVC5oZWFydEJlYXRQYXJhbXMpOworICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7ICAgICAgICAgICAgICAgIC8qIFB1bXAgYWxsIG1lc3NhZ2VzIGludG8gcXVldWUgKi8KKyAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOyAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgICAgICovCisgICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICAgICAqLworICAgIGlmIChFVlQuY291bnQpIHsKKyAgICAgICAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBldmVudCBiZSBwb3N0ZWQgd2hpbGUgd2UgYXJlIHRyeWluZworICAgICAgICAgKiB0byBhY2Nlc3MgdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHdvdWxkIGNyZWF0ZSBwcm9ibGVtcyBzaW5jZQorICAgICAgICAgKiB3ZSBtYXkgZW5kIHVwIHdpdGggaW52YWxpZCBkYXRhIGZvciBvdXIgZXZlbnQgcXVldWUgcG9pbnRlcnMuIFRvCisgICAgICAgICAqIGFsbGV2aWF0ZSB0aGlzLCBhbGwgaW50ZXJydXB0cyBhcmUgc3VzcGVuZGVkIHdoaWxlIHdlIG1hbmlwdWxhdGUKKyAgICAgICAgICogb3VyIHBvaW50ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsgICAgICAgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICovCisgICAgICAgIGZvciAoZXZ0SUQgPSBFVlQuaGVhZDsgZXZ0SUQgIT0gLTE7IGV2dElEID0gRVZULmV2dHFbZXZ0SURdLm5leHQpIHsKKyAgICAgICAgICAgIGlmIChFVlQuZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGFuIGV2ZW50ICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICBpZiAoZXZ0SUQgPT0gLTEpIHsKKyAgICAgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICBuZXh0ID0gRVZULmV2dHFbZXZ0SURdLm5leHQ7CisgICAgICAgIHByZXYgPSBFVlQuZXZ0cVtldnRJRF0ucHJldjsKKyAgICAgICAgaWYgKHByZXYgIT0gLTEpCisgICAgICAgICAgICBFVlQuZXZ0cVtwcmV2XS5uZXh0ID0gbmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRVZULmhlYWQgPSBuZXh0OworICAgICAgICBpZiAobmV4dCAhPSAtMSkKKyAgICAgICAgICAgIEVWVC5ldnRxW25leHRdLnByZXYgPSBwcmV2OworICAgICAgICBlbHNlCisgICAgICAgICAgICBFVlQudGFpbCA9IHByZXY7CisgICAgICAgICpldnQgPSBFVlQuZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KKyAgICAgICAgRVZULmV2dHFbZXZ0SURdLm5leHQgPSBFVlQuZnJlZUhlYWQ7ICAgICAgICAvKiBhbmQgcmV0dXJuIHRvIGZyZWUgbGlzdCAgKi8KKyAgICAgICAgRVZULmZyZWVIZWFkID0gZXZ0SUQ7CisgICAgICAgIEVWVC5jb3VudC0tOworICAgICAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9NT1VTRU1PVkUpCisgICAgICAgICAgICBFVlQub2xkTW92ZSA9IC0xOworICAgICAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9LRVlSRVBFQVQpCisgICAgICAgICAgICBFVlQub2xkS2V5ID0gLTE7CisgICAgICAgIGlmIChldnQtPndoYXQgPT0gRVZUX0pPWU1PVkUpCisgICAgICAgICAgICBFVlQub2xkSm95TW92ZSA9IC0xOworICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOyAgICAgICAgICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyAgICAgICAgKi8KKyAgICAgICAgaWYgKGV2dC0+d2hhdCAmIEVWVF9LRVlFVlQpCisgICAgICAgICAgICBfRVZUX21hc2tLZXlDb2RlKGV2dCk7CisgICAgICAgIH0KKworICAgIC8qIElmIHRoZXJlIGlzIG5vIGV2ZW50IHBlbmRpbmcsIGNoZWNrIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBhdXRvCisgICAgICogbW91c2UgZG93biBldmVudCBpZiB0aGUgbW91c2UgaXMgc3RpbGwgY3VycmVudGx5IGRvd24uCisgICAgICovCisgICAgaWYgKGV2dC0+d2hhdCA9PSBFVlRfTlVMTEVWVCAmJiBFVlQuYXV0b1JlcGVhdCAmJiAobWFzayAmIEVWVF9NT1VTRUFVVE8pICYmIChFVlQuZG93bk1vdXNlLndoYXQgJiBFVlRfTU9VU0VET1dOKSkgeworICAgICAgICB1bG9uZyB0aWNrcyA9IF9FVlRfZ2V0VGlja3MoKTsKKyAgICAgICAgaWYgKCh0aWNrcyAtIEVWVC5hdXRvVGlja3MpID49IChFVlQuYXV0b1JlcGVhdCArIChFVlQuZmlyc3RBdXRvID8gRVZULmF1dG9EZWxheSA6IDApKSkgeworICAgICAgICAgICAgZXZ0LT53aGF0ID0gRVZUX01PVVNFQVVUTzsKKyAgICAgICAgICAgIGV2dC0+bWVzc2FnZSA9IEVWVC5kb3duTW91c2UubWVzc2FnZTsKKyAgICAgICAgICAgIGV2dC0+bW9kaWZpZXJzID0gRVZULmRvd25Nb3VzZS5tb2RpZmllcnM7CisgICAgICAgICAgICBldnQtPndoZXJlX3ggPSBFVlQuYXV0b01vdXNlX3g7CisgICAgICAgICAgICBldnQtPndoZXJlX3kgPSBFVlQuYXV0b01vdXNlX3k7CisgICAgICAgICAgICBldnQtPnJlbGF0aXZlX3ggPSAwOworICAgICAgICAgICAgZXZ0LT5yZWxhdGl2ZV95ID0gMDsKKyAgICAgICAgICAgIEVWVC5hdXRvVGlja3MgPSBldnQtPndoZW4gPSB0aWNrczsKKyAgICAgICAgICAgIEVWVC5maXJzdEF1dG8gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK0luc3RhbGxzIGEgdXNlciBzdXBwbGllZCBldmVudCBmaWx0ZXIgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsaW5nLgorCitIRUFERVI6CitldmVudC5oCisKK1BBUkFNRVRFUlM6Cit1c2VyRXZlbnRGaWx0ZXIgLSBBZGRyZXNzIG9mIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciB0byBpbnN0YWxsIGFuIGV2ZW50IGZpbHRlcgorY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsaW5nLiBPbmNlIHlvdSBpbnN0YWxsIHlvdXIgY2FsbGJhY2ssIHRoZSBNR0wKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzIHdpbGwgY2FsbCB5b3VyIGNhbGxiYWNrIHdpdGggYSBwb2ludGVyIHRvIHRoZQorbmV3IGV2ZW50IHRoYXQgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgZXZlbnQgcXVldWUuIFlvdXIgY2FsbGJhY2sgY2FuIHRoZQorbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgZXZlbnQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbnRvIHRoZSBxdWV1ZSAoZm9yCitpbnN0YW5jZSBhZGRpbmcgY3VzdG9tIGluZm9ybWF0aW9uIG9yIHBlcmhhcHMgaGlnaCBwcmVjaXNpb24gdGltaW5nCitpbmZvcm1hdGlvbikuCisKK0lmIHlvdXIgY2FsbGJhY2sgcmV0dXJucyBGQUxTRSwgdGhlIGV2ZW50IHdpbGwgYmUgaWdub3JlIGFuZCB3aWxsIG5vdCBiZQorcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZS4gWW91IHNob3VsZCBhbHdheXMgcmV0dXJuIHRydWUgZnJvbSB5b3VyIGV2ZW50CitjYWxsYmFjayB1bmxlc3MgeW91IHBsYW4gdG8gdXNlIHRoZSBldmVudHMgaW1tZWRpYXRlbHkgdGhhdCB0aGV5IGFyZQorcmVjaWV2ZWQuCisKK05vdGU6ICAgWW91ciBldmVudCBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgaGFyZHdhcmUKKyAgICAgICAgaW50ZXJydXB0IGFuZCB3aWxsIGJlIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgaGFyZHdhcmUKKyAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgdW5kZXIgTVNET1MgKGllOiBrZXlib2FyZCBpbnRlcnJ1cHQgb3IgbW91c2UKKyAgICAgICAgaW50ZXJydXB0KS4gRm9yIHRoaXMgcmVhc29uIHRoZSBjb2RlIHBhZ2VzIGZvciB0aGUgY2FsbGJhY2sgdGhhdAorICAgICAgICB5b3UgcmVnaXN0ZXIgbXVzdCBiZSBsb2NrZWQgaW4gbWVtb3J5IHdpdGggdGhlIFBNX2xvY2tDb2RlUGFnZXMKKyAgICAgICAgZnVuY3Rpb24uIFlvdSBtdXN0IGFsc28gbG9jayBkb3duIGFueSBkYXRhIHBhZ2VzIHRoYXQgeW91ciBmdW5jdGlvbgorICAgICAgICBuZWVkcyB0byByZWZlcmVuY2UgYXMgd2VsbC4KKworTm90ZTogICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZmlsdGVyIGNhbGxiYWNrIHRvIHByb2Nlc3MgZXZlbnRzIGF0IHRoZQorICAgICAgICB0aW1lIHRoZXkgYXJlIGFjdGl2YXRlZCBieSB0aGUgdXNlciAoaWU6IHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUKKyAgICAgICAga2V5IG9yIG1vdmVzIHRoZSBtb3VzZSksIGJ1dCBtYWtlIHN1cmUgeW91ciBjb2RlIHJ1bnMgYXMgZmFzdCBhcworICAgICAgICBwb3NzaWJsZSBhcyBpdCB3aWxsIGJlIGV4ZWN1dGluZyBpbnNpZGUgdGhlIGNvbnRleHQgb2YgYW4gaW50ZXJydXB0CisgICAgICAgIGhhbmRsZXIgb24gc29tZSBzeXN0ZW1zLgorCitTRUUgQUxTTzoKK0VWVF9nZXROZXh0LCBFVlRfcGVla05leHQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfc2V0VXNlckV2ZW50RmlsdGVyKAorICAgIF9FVlRfdXNlckV2ZW50RmlsdGVyIGZpbHRlcikKK3sKKyAgICBFVlQudXNlckV2ZW50Q2FsbGJhY2sgPSBmaWx0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK0luc3RhbGxzIGEgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCisKK0hFQURFUjoKK2V2ZW50LmgKKworUEFSQU1FVEVSUzoKK2NhbGxiYWNrICAgIC0gQWRkcmVzcyBvZiB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjaworcGFyYW1zICAgICAgLSBQYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGhlYXJ0YmVhdCBmdW5jdGlvbgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgdG8gaW5zdGFsbCBhbiBldmVudCBoZWF0YmVhdAorZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0CitpcyBjYWxsZWQuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc2ltdWxhdGluZyB0ZXh0IG1vZGUgY3Vyc29ycyBpbnNpZGUKK2V2ZW50IGhhbmRsaW5nIGNvZGUgd2hlbiBydW5uaW5nIGluIGdyYXBoaWNzIG1vZGVzIGFzIG9wcG9zZWQgdG8gaGFyZHdhcmUKK3RleHQgbW9kZXMuCisKK1NFRSBBTFNPOgorRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldEhlYXJ0QmVhdENhbGxiYWNrKAorICAgIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgdm9pZCAqcGFyYW1zKQoreworICAgIEVWVC5oZWFydEJlYXQgPSBjYWxsYmFjazsKKyAgICBFVlQuaGVhcnRCZWF0UGFyYW1zID0gcGFyYW1zOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIGN1cnJlbnQgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCisKK0hFQURFUjoKK2V2ZW50LmgKKworUEFSQU1FVEVSUzoKK2NhbGxiYWNrICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sKK3BhcmFtcyAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGVhcnRiZWF0IGZ1bmN0aW9uCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBldmVudCBoZWF0YmVhdCBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkCitldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0IGlzIGNhbGxlZC4KKworU0VFIEFMU086CitFVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfZ2V0SGVhcnRCZWF0Q2FsbGJhY2soCisgICAgX0VWVF9oZWFydEJlYXRDYWxsYmFjayAqY2FsbGJhY2ssCisgICAgdm9pZCAqKnBhcmFtcykKK3sKKyAgICAqY2FsbGJhY2sgPSBFVlQuaGVhcnRCZWF0OworICAgICpwYXJhbXMgPSBFVlQuaGVhcnRCZWF0UGFyYW1zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitEZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93bi4KKworUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKKworUkVUVVJOUzoKK1RydWUgb2YgdGhlIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGhlbGQgZG93bi4KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLiBZb3Ugc2ltcGx5IG5lZWQgdG8gcGFzcyBpbiB0aGUgc2NhbiBjb2RlIG9mCit0aGUga2V5IHRoYXQgeW91IHdpc2ggdG8gdGVzdCwgYW5kIHRoZSBNR0wgd2lsbCB0ZWxsIHlvdSBpZiBpdCBpcyBjdXJyZW50bHkKK2Rvd24gb3Igbm90LiBUaGUgTUdMIGRvZXMgdGhpcyBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSB1cCBhbmQgZG93biBzdGF0ZQorb2YgYWxsIHRoZSBrZXlzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIEVWVEFQSSBFVlRfaXNLZXlEb3duKAorICAgIHVjaGFyIHNjYW5Db2RlKQoreworICAgIHJldHVybiBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1NldCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHRoZSBldmVudCBtb2R1bGUKKworUEFSQU1FVEVSUzoKK3ggICAtIFggY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KK3kgICAtIFkgY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIGZvciB0aGUgZXZlbnQgbW9kdWxlIHRvIHRoZQorc3BlY2lmaWVkIGxvY2F0aW9uLgorCitTRUUgQUxTTzoKK0VWVF9nZXRNb3VzZVBvcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcygKKyAgICBpbnQgeCwKKyAgICBpbnQgeSkKK3sKKyAgICBFVlQubXggPSB4OworICAgIEVWVC5teSA9IHk7CisgICAgX0VWVF9zZXRNb3VzZVBvcygmRVZULm14LCZFVlQubXkpOworICAgIEVWVC5tb3VzZU1vdmUoRVZULm14LEVWVC5teSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIGN1cnJlbnQgbW91c2UgY3Vyc29yIGxvY2F0aW9uLgorCitIRUFERVI6CitldmVudC5oCisKK1BBUkFNRVRFUlM6Cit4ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeCBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCit5ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeSBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCisKK1JFTUFSS1M6CitPYnRhaW5zIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIE5vcm1hbGx5IHRoZQorbW91c2UgY3Vyc29yIGxvY2F0aW9uIGlzIHRyYWNrZWQgdXNpbmcgdGhlIG1vdXNlIG1vdmVtZW50IGV2ZW50cyB0aGF0IGFyZQorcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZSB3aGVuIHRoZSBtb3VzZSBtb3ZlcywgaG93ZXZlciB0aGlzIHJvdXRpbmUKK3Byb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiBwb2xsaW5nIHRoZSBtb3VzZSBjdXJzb3IgbG9jYXRpb24uCisKK1NFRSBBTFNPOgorRVZUX3NldE1vdXNlUG9zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2dldE1vdXNlUG9zKAorICAgIGludCAqeCwKKyAgICBpbnQgKnkpCit7CisgICAgKnggPSBFVlQubXg7CisgICAgKnkgPSBFVlQubXk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgorCitIRUFERVI6CitldmVudC5oCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZSB0cmFuc2xhdGlvbiB0YWJsZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlCit0cmFuc2xhdGlvbiB0YWJsZS4gU2VlIEVWVF9zZXRDb2RlUGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworU0VFIEFMU086CitFVlRfc2V0Q29kZVBhZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb2RlcGFnZV90ICogRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKQoreworICAgIHJldHVybiBFVlQuY29kZVBhZ2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1NldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgorCitIRUFERVI6CitldmVudC5oCisKK1BBUkFNRVRFUlM6CitwYWdlICAgIC0gTmV3IGNvZGUgcGFnZSB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhIG5ldyBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUgdGhhdCBpcyB1c2VkCit0byB0cmFuc2xhdGUgdmlydHVhbCBzY2FuIGNvZGUgdmFsdWVzIHRvIEFTQ0lJIGNoYXJhY3RlcnMgZm9yIGRpZmZlcmVudAora2V5Ym9hcmQgY29uZmlndXJhdGlvbnMuIFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgVVMgRW5nbGlzaCwgYWx0aG91Z2ggaWYKK3Bvc3NpYmxlIHRoZSBQTSBsaWJyYXJ5IHdpbGwgYXV0by1kZXRlY3QgdGhlIGNvcnJlY3QgY29kZSBwYWdlIHRyYW5zbGF0aW9uCitmb3IgdGhlIHRhcmdldCBPUyBpZiBPUyBzZXJ2aWNlcyBhcmUgYXZhaWxhYmxlIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YKK2tleWJvYXJkIGlzIGN1cnJlbnRseSBhdHRhY2hlZC4KKworU0VFIEFMU086CitFVlRfZ2V0Q29kZVBhZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfc2V0Q29kZVBhZ2UoCisgICAgY29kZXBhZ2VfdCAqcGFnZSkKK3sKKyAgICBFVlQuY29kZVBhZ2UgPSBwYWdlOworfQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnRhaW5zIGZha2UgQyBwcm90b3R5cGVzIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUKKyAqIG1hY3JvIGZ1bmN0aW9ucyBpbiB0aGUgZXZlbnQuaCBoZWFkZXIgZmlsZS4gVGhlc2UgZXhpc3Qgc29sZXkgc28KKyAqIHRoYXQgRG9jSmV0IHdpbGwgY29ycmVjdGx5IHB1bGwgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworI2lmZGVmICBJTkNMVURFX0RPQ19GVU5DVElPTlMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorTWFjcm8gdG8gZXh0cmFjdCB0aGUgQVNDSUkgY29kZSBmcm9tIGEgbWVzc2FnZS4KKworUEFSQU1FVEVSUzoKK21lc3NhZ2UgLSBNZXNzYWdlIHRvIGV4dHJhY3QgQVNDSUkgY29kZSBmcm9tCisKK1JFVFVSTlM6CitBU0NJSSBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgorCitIRUFERVI6CitldmVudC5oCisKK1JFTUFSS1M6CitNYWNybyB0byBleHRyYWN0IHRoZSBBU0NJSSBjb2RlIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50X3QKK3N0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCit0aGUgQVNDSUkgY29kZSBpcyB0aGUgcmVzdWx0LCBmb3IgZXhhbXBsZToKKworICAgIGV2ZW50X3QgRVZULm15RXZlbnQ7CisgICAgdWNoYXIgICBjb2RlOworICAgIGNvZGUgPSBFVlRfYXNjaWlDb2RlKEVWVC5teUV2ZW50Lm1lc3NhZ2UpOworCitTRUUgQUxTTzoKK0VWVF9zY2FuQ29kZSwgRVZUX3JlcGVhdENvdW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWNoYXIgRVZUX2FzY2lpQ29kZSgKKyAgICB1bG9uZyBtZXNzYWdlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorTWFjcm8gdG8gZXh0cmFjdCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGZyb20gYSBtZXNzYWdlLgorCitIRUFERVI6CitldmVudC5oCisKK1BBUkFNRVRFUlM6CittZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IHNjYW4gY29kZSBmcm9tCisKK1JFVFVSTlM6CitLZXlib2FyZCBzY2FuIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIG1lc3NhZ2UuCisKK1JFTUFSS1M6CitNYWNybyB0byBleHRyYWN0IHRoZSBrZXlib2FyZCBzY2FuIGNvZGUgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgZXZlbnQKK3N0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCit0aGUgc2NhbiBjb2RlIGlzIHRoZSByZXN1bHQsIGZvciBleGFtcGxlOgorCisgICAgZXZlbnRfdCBFVlQubXlFdmVudDsKKyAgICB1Y2hhciAgIGNvZGU7CisgICAgY29kZSA9IEVWVF9zY2FuQ29kZShFVlQubXlFdmVudC5tZXNzYWdlKTsKKworTk9URTogICBTY2FuIGNvZGVzIGluIHRoZSBldmVudCBsaWJyYXJ5IGFyZSBub3QgcmVhbGx5IGhhcmR3YXJlIHNjYW4gY29kZXMsCisgICAgICAgIGJ1dCByYXRoZXIgdmlydHVhbCBzY2FuIGNvZGVzIGFzIGdlbmVyYXRlZCBieSBhIGxvdyBsZXZlbCBrZXlib2FyZAorICAgICAgICBpbnRlcmZhY2UgZHJpdmVyLiBBbGwgdmlydHVhbCBzY2FuIGNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IHRoZQorICAgICAgICBFVlRfc2NhbkNvZGVzVHlwZSBlbnVtZXJhdGlvbiwgYW5kIHdpbGwgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKKyAgICAgICAgc3VwcG9ydHMgT1MnZXMgYW5kIHBsYXRmb3Jtcy4KKworU0VFIEFMU086CitFVlRfYXNjaWlDb2RlLCBFVlRfcmVwZWF0Q291bnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1Y2hhciBFVlRfc2NhbkNvZGUoCisgICAgdWxvbmcgbWVzc2FnZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK01hY3JvIHRvIGV4dHJhY3QgdGhlIHJlcGVhdCBjb3VudCBmcm9tIGEgbWVzc2FnZS4KKworSEVBREVSOgorZXZlbnQuaAorCitQQVJBTUVURVJTOgorbWVzc2FnZSAtIE1lc3NhZ2UgdG8gZXh0cmFjdCByZXBlYXQgY291bnQgZnJvbQorCitSRVRVUk5TOgorUmVwZWF0IGNvdW50IGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgorCitSRU1BUktTOgorTWFjcm8gdG8gZXh0cmFjdCB0aGUgcmVwZWF0IGNvdW50IGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50CitzdHJ1Y3R1cmUuIFRoZSByZXBlYXQgY291bnQgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBrZXkgcmVwZWF0ZWQKK2JlZm9yZSB0aGVyZSB3YXMgYW5vdGhlciBrZXlib2FyZCBldmVudCB0byBiZSBwbGFjZSBpbiB0aGUgcXVldWUsIGFuZAorYWxsb3dzIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIHRvIGF2b2lkIGtleWJvYXJkIGJ1ZmZlciBvdmVyZmxvdworY29uZGl0aW9ucyB3aGVuIGEgc2luZ2xlIGtleSBpcyBoZWxkIGRvd24gYnkgdGhlIHVzZXIuIElmIHlvdSBhcmUgcHJvY2Vzc2luZworYSBrZXkgcmVwZWF0IGNvZGUsIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gY2hlY2sgdGhpcyBmaWVsZCB0byBzZWUgaG93CittYW55IGtleSByZXBlYXRzIHlvdSBzaG91bGQgcHJvY2VzcyBmb3IgdGhpcyBtZXNzYWdlLgorCitTRUUgQUxTTzoKK0VWVF9hc2NpaUNvZGUsIEVWVF9yZXBlYXRDb3VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Nob3J0IEVWVF9yZXBlYXRDb3VudCgKKyAgICB1bG9uZyBtZXNzYWdlKTsKKworI2VuZGlmICAvKiBET0MgRlVOQ1RJT05TICovCisKKyNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKKy8qIHtzZWNyZXR9ICovCit2b2lkIEVWVEFQSSBfRVZUX2NDb2RlRW5kKHZvaWQpIHt9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhkMjEwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvY3B1aW5mby5jCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIExpbnV4CisqCisqIERlc2NyaXB0aW9uOiAgTGludXggc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHp0aW1lci5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgTGludXghCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVE9ETzogV2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZvciBMaW51eCEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCisgICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKK3sKKyAgICBmcmVxLT5sb3cgPSAxMDAwMDAwOworICAgIGZyZXEtPmhpZ2ggPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IHRpbWV2YWwgdHY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHQpLT5sb3cgPSB0di50dl9zZWMqMTAwMDAwMCArIHR2LnR2X3VzZWM7ICBcCisgICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY2OGNlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYwpAQCAtMCwwICsxLDEzNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBMaW51eAorKgorKiBEZXNjcmlwdGlvbjogIExpbnV4IGZ1bGxzY3JlZW4gY29uc29sZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2gKKyogICAgICAgICAgICAgICBjcm9zcyBwbGF0Zm9ybSBldmVudCBsaWJyYXJ5LgorKiAgICAgICAgICAgICAgIFBvcnRpb25zIHJpcHBlZCBzdHJhaWd0aCBmcm9tIHRoZSBncG0gc291cmNlIGNvZGUgZm9yIG1vdXNlCisqICAgICAgICAgICAgICAgaGFuZGxpbmcuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gaW50ICAgICAgICAgICAgICBfUE1fY29uc29sZV9mZDsKK3N0YXRpYyB1c2hvcnQgICAgICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07CitzdGF0aWMgaW50ICAgICAgICAgICAgICBfRVZUX21vdXNlX2ZkID0gMDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIHJhbmdlX3gsIHJhbmdlX3k7CitzdGF0aWMgaW50ICAgICAgICAgICAgICBvcHRfYmF1ZCA9IDEyMDAsIG9wdF9zYW1wbGUgPSAxMDA7CisjaWZkZWYgVVNFX09TX0pPWVNUSUNLCitzdGF0aWMgc2hvcnQgICAgICAgICAgICAqYXhpczAgPSBOVUxMLCAqYXhpczEgPSBOVUxMOworc3RhdGljIHVjaGFyICAgICAgICAgICAgKmJ1dHMwID0gTlVMTCwgKmJ1dHMxID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIGpveXN0aWNrMF9mZCA9IDAsIGpveXN0aWNrMV9mZCA9IDA7CitzdGF0aWMgaW50ICAgICAgICAgICAgICBqc192ZXJzaW9uID0gMDsKKyNlbmRpZgorCisvKiBUaGlzIGRlZmluZXMgdGhlIHN1cHBvcnRlZCBtb3VzZSBkcml2ZXJzICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgRVZUX25vTW91c2UgPSAtMSwKKyAgICBFVlRfbWljcm9zb2Z0ID0gMCwKKyAgICBFVlRfcHMyLAorICAgIEVWVF9tb3VzZXN5c3RlbXMsCisgICAgRVZUX2dwbSwKKyAgICBFVlRfTU1zZXJpZXMsCisgICAgRVZUX2xvZ2l0ZWNoLAorICAgIEVWVF9idXNtb3VzZSwKKyAgICBFVlRfbW91c2VtYW4sCisgICAgRVZUX2ludGVsbGltb3VzZSwKKyAgICBFVlRfaW50ZWxsaW1vdXNlX3BzMiwKKyAgICB9IG1vdXNlX2RyaXZlcnNfdDsKKworc3RhdGljIG1vdXNlX2RyaXZlcnNfdCBtb3VzZV9kcml2ZXIgPSBFVlRfbm9Nb3VzZTsKK3N0YXRpYyBjaGFyIG1vdXNlX2RldlsyMF0gPSAiL2Rldi9tb3VzZSI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICpuYW1lOworICAgIGludCAgICAgZmxhZ3M7CisgICAgdm9pZCAgICAoKmluaXQpKHZvaWQpOworICAgIHVjaGFyICAgcHJvdG9bNF07CisgICAgaW50ICAgICBwYWNrZXRfbGVuOworICAgIGludCAgICAgcmVhZDsKKyAgICB9IG1vdXNlX2luZm87CisKKyNkZWZpbmUgU1REX0ZMRyAoQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTCkKKworc3RhdGljIHZvaWQgX0VWVF9tb3VzZV9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgX0VWVF9sb2dpdGVjaF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgX0VWVF9wbnBtb3VzZV9pbml0KHZvaWQpOworCittb3VzZV9pbmZvIG1vdXNlX2luZm9zW10gPSB7CisgICAgeyJNaWNyb3NvZnQiLCAgICAgICBDUzcgfCBCMTIwMCB8IFNURF9GTEcsICAgICAgICAgICAgICBfRVZUX21vdXNlX2luaXQsICAgIHsweDQwLCAweDQwLCAweDQwLCAweDAwfSwgMywgMX0sCisgICAgeyJQUzIiLCAgICAgICAgICAgICBTVERfRkxHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIHsweGMwLCAweDAwLCAweDAwLCAweDAwfSwgMywgMX0sCisgICAgeyJNb3VzZVN5c3RlbXMiLCAgICBDUzggfCBDU1RPUEIgfCBTVERfRkxHLCAgICAgICAgICAgICBfRVZUX21vdXNlX2luaXQsICAgIHsweGY4LCAweDgwLCAweDAwLCAweDAwfSwgNSwgNX0sCisgICAgeyJHUE0iLCAgICAgICAgICAgICBDUzggfCBDU1RPUEIgfCBTVERfRkxHLCAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIHsweGY4LCAweDgwLCAweDAwLCAweDAwfSwgNSwgNX0sCisgICAgeyJNTVNlcmllcyIsICAgICAgICBDUzggfCBQQVJFTkIgfCBQQVJPREQgfCBTVERfRkxHLCAgICBfRVZUX21vdXNlX2luaXQsICAgIHsweGUwLCAweDgwLCAweDgwLCAweDAwfSwgMywgMX0sCisgICAgeyJMb2dpdGVjaCIsICAgICAgICBDUzggfCBDU1RPUEIgfCBTVERfRkxHLCAgICAgICAgICAgICBfRVZUX2xvZ2l0ZWNoX2luaXQsIHsweGUwLCAweDgwLCAweDgwLCAweDAwfSwgMywgM30sCisgICAgeyJCdXNNb3VzZSIsICAgICAgICBTVERfRkxHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIHsweGY4LCAweDgwLCAweDAwLCAweDAwfSwgMywgM30sCisgICAgeyJNb3VzZU1hbiIsICAgICAgICBDUzcgfCBTVERfRkxHLCAgICAgICAgICAgICAgICAgICAgICBfRVZUX21vdXNlX2luaXQsICAgIHsweDQwLCAweDQwLCAweDQwLCAweDAwfSwgMywgMX0sCisgICAgeyJJbnRlbGxpTW91c2UiLCAgICBDUzcgfCBTVERfRkxHLCAgICAgICAgICAgICAgICAgICAgICBfRVZUX3BucG1vdXNlX2luaXQsIHsweGMwLCAweDQwLCAweGMwLCAweDAwfSwgNCwgMX0sCisgICAgeyJJTVBTMiIsICAgICAgICAgICBDUzcgfCBTVERfRkxHLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIHsweGMwLCAweDQwLCAweGMwLCAweDAwfSwgNCwgMX0sIC8vID8KKyAgICB9OworCisjZGVmaW5lIE5CX01JQ0UgKHNpemVvZihtb3VzZV9pbmZvcykvc2l6ZW9mKG1vdXNlX2luZm8pKQorCisvKiBUaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0cyBhYm92ZSAqLworCisjZGVmaW5lIEVOVl9NT1VTRURSViAiTUdMX01PVVNFRFJWIgorI2RlZmluZSBFTlZfTU9VU0VERVYgIk1HTF9NT1VTRURFViIKKyNkZWZpbmUgRU5WX01PVVNFU1BEICJNR0xfTU9VU0VTUEQiCisjZGVmaW5lIEVOVl9KT1lERVYwICAiTUdMX0pPWURFVjEiCisjZGVmaW5lIEVOVl9KT1lERVYxICAiTUdMX0pPWURFVjIiCisKKy8qIFNjYW5jb2RlIG1hcHBpbmdzIG9uIExpbnV4IGZvciBzcGVjaWFsIGtleXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzY2FuOworICAgIGludCBtYXA7CisgICAgfSBrZXltYXA7CisKKy8vIFRPRE86IEZpeCB0aGlzIGFuZCBzZXQgaXQgdXAgc28gd2UgY2FuIGRvIGEgYmluYXJ5IHNlYXJjaCEKKwora2V5bWFwIGtleW1hcHNbXSA9IHsKKyAgICB7OTYsIEtCX3BhZEVudGVyfSwKKyAgICB7NzQsIEtCX3BhZE1pbnVzfSwKKyAgICB7NzgsIEtCX3BhZFBsdXN9LAorICAgIHs1NSwgS0JfcGFkVGltZXN9LAorICAgIHs5OCwgS0JfcGFkRGl2aWRlfSwKKyAgICB7NzEsIEtCX3BhZEhvbWV9LAorICAgIHs3MiwgS0JfcGFkVXB9LAorICAgIHs3MywgS0JfcGFkUGFnZVVwfSwKKyAgICB7NzUsIEtCX3BhZExlZnR9LAorICAgIHs3NiwgS0JfcGFkQ2VudGVyfSwKKyAgICB7NzcsIEtCX3BhZFJpZ2h0fSwKKyAgICB7NzksIEtCX3BhZEVuZH0sCisgICAgezgwLCBLQl9wYWREb3dufSwKKyAgICB7ODEsIEtCX3BhZFBhZ2VEb3dufSwKKyAgICB7ODIsIEtCX3BhZEluc2VydH0sCisgICAgezgzLCBLQl9wYWREZWxldGV9LAorICAgIHsxMDUsS0JfbGVmdH0sCisgICAgezEwOCxLQl9kb3dufSwKKyAgICB7MTA2LEtCX3JpZ2h0fSwKKyAgICB7MTAzLEtCX3VwfSwKKyAgICB7MTEwLEtCX2luc2VydH0sCisgICAgezEwMixLQl9ob21lfSwKKyAgICB7MTA0LEtCX3BhZ2VVcH0sCisgICAgezExMSxLQl9kZWxldGV9LAorICAgIHsxMDcsS0JfZW5kfSwKKyAgICB7MTA5LEtCX3BhZ2VEb3dufSwKKyAgICB7MTI1LEtCX2xlZnRXaW5kb3dzfSwKKyAgICB7MTI2LEtCX3JpZ2h0V2luZG93c30sCisgICAgezEyNyxLQl9tZW51fSwKKyAgICB7MTAwLEtCX3JpZ2h0QWx0fSwKKyAgICB7OTcsS0JfcmlnaHRDdHJsfSwKKyAgICB9OworCisvKiBBbmQgdGhlIGtleXBhZCB3aXRoIG51bSBsb2NrIHR1cm5lZCBvbiAoY2hhbmdlcyB0aGUgQVNDSUkgY29kZSBvbmx5KSAqLworCitrZXltYXAga2V5cGFkW10gPSB7CisgICAgezcxLCBBU0NJSV83fSwKKyAgICB7NzIsIEFTQ0lJXzh9LAorICAgIHs3MywgQVNDSUlfOX0sCisgICAgezc1LCBBU0NJSV80fSwKKyAgICB7NzYsIEFTQ0lJXzV9LAorICAgIHs3NywgQVNDSUlfNn0sCisgICAgezc5LCBBU0NJSV8xfSwKKyAgICB7ODAsIEFTQ0lJXzJ9LAorICAgIHs4MSwgQVNDSUlfM30sCisgICAgezgyLCBBU0NJSV8wfSwKKyAgICB7ODMsIEFTQ0lJX3BlcmlvZH0sCisgICAgfTsKKworI2RlZmluZSBOQl9LRVlNQVBTIChzaXplb2Yoa2V5bWFwcykvc2l6ZW9mKGtleW1hcHNbMF0pKQorI2RlZmluZSBOQl9LRVlQQUQgKHNpemVvZihrZXlwYWQpL3NpemVvZihrZXlwYWRbMF0pKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICBzYW1wbGU7CisgICAgY2hhciAgICBjb2RlWzJdOworICAgIH0gc2FtcGxlX3JhdGU7CisKK3NhbXBsZV9yYXRlIHNhbXBsZXRhYltdPXsKKyAgICB7ICAwLCJPIn0sCisgICAgeyAxNSwiSiJ9LAorICAgIHsgMjcsIksifSwKKyAgICB7IDQyLCJMIn0sCisgICAgeyA2MCwiUiJ9LAorICAgIHsgODUsIk0ifSwKKyAgICB7MTI1LCJRIn0sCisgICAgezFFOSwiTiJ9LAorICAgIH07CisKKy8qIE51bWJlciBvZiBrZXljb2RlcyB0byByZWFkIGF0IGEgdGltZSBmcm9tIHRoZSBjb25zb2xlICovCisKKyNkZWZpbmUgS0JEUkVBREJVRkZFUlNJWkUgMzIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIExpbnV4ICovCisjZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKKyNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYXBzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKKworUkVNQVJLUzoKK1RoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCit0aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQorc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KK3RoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KK2V2ZW50cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCit7CisgICAgc3RhdGljIHVpbnQgICAgIHN0YXJ0dGltZSA9IDA7CisgICAgc3RydWN0IHRpbWV2YWwgIHQ7CisKKyAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOworICAgIGlmIChzdGFydHRpbWUgPT0gMCkKKyAgICAgIHN0YXJ0dGltZSA9IHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCk7CisgICAgcmV0dXJuICgodC50dl9zZWMgKiAxMDAwICsgKHQudHZfdXNlYy8xMDAwKSkgLSBzdGFydHRpbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NtYWxsIFVuaXggZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGF2YWlsYWJpbGl0eSBvbiBhIGZpbGUgdXNpbmcgc2VsZWN0KCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgZGF0YVJlYWR5KAorICAgIGludCBmZCkKK3sKKyAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgICB0ID0geyAwTCwgMEwgfTsKKyAgICBmZF9zZXQgICAgICAgICAgICAgICAgICBmZHM7CisKKyAgICBGRF9aRVJPKCZmZHMpOworICAgIEZEX1NFVChmZCwgJmZkcyk7CisgICAgcmV0dXJuIHNlbGVjdChmZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdCkgPiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWRzIG1vdXNlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBtb3VzZSBkcml2ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIHJlYWRNb3VzZURhdGEoCisgICAgaW50ICpidXR0b25zLAorICAgIGludCAqZHgsCisgICAgaW50ICpkeSkKK3sKKyAgICBzdGF0aWMgdWNoYXIgICAgZGF0YVszMl0scHJldiA9IDA7CisgICAgaW50ICAgICAgICAgICAgIGNudCA9IDAscmV0OworICAgIG1vdXNlX2luZm8gICAgICAqZHJ2OworCisgICAgLyogUmVhZCB0aGUgZmlyc3QgYnl0ZSB0byBjaGVjayBmb3IgdGhlIHByb3RvY29sICovCisgICAgZHJ2ID0gJm1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl07CisgICAgaWYgKHJlYWQoX0VWVF9tb3VzZV9mZCwgZGF0YSwgZHJ2LT5yZWFkKSAhPSBkcnYtPnJlYWQpIHsKKyAgICAgICAgcGVycm9yKCJyZWFkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGlmICgoZGF0YVswXSAmIGRydi0+cHJvdG9bMF0pICE9IGRydi0+cHJvdG9bMV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8qIExvYWQgYSB3aG9sZSBwcm90b2NvbCBwYWNrZXQgKi8KKyAgICBjbnQgKz0gZHJ2LT5yZWFkOworICAgIHdoaWxlIChjbnQgPCBkcnYtPnBhY2tldF9sZW4pIHsKKyAgICAgICAgcmV0ID0gcmVhZChfRVZUX21vdXNlX2ZkLCBkYXRhK2NudCwgZHJ2LT5yZWFkKTsKKyAgICAgICAgaWYgKHJldCA9PSBkcnYtPnJlYWQpCisgICAgICAgICAgICBjbnQgKz0gcmV0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBlcnJvcigicmVhZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgaWYgKChkYXRhWzFdICYgZHJ2LT5wcm90b1syXSkgIT0gZHJ2LT5wcm90b1szXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogTm93IGRlY29kZSB0aGUgcHJvdG9jb2wgcGFja2V0ICovCisgICAgc3dpdGNoIChtb3VzZV9kcml2ZXIpIHsKKyAgICAgICAgY2FzZSBFVlRfbWljcm9zb2Z0OgorICAgICAgICAgICAgaWYgKGRhdGFbMF0gPT0gMHg0MCAmJiAhKHByZXZ8ZGF0YVsxXXxkYXRhWzJdKSkKKyAgICAgICAgICAgICAgICAqYnV0dG9ucyA9IDI7ICAgLyogVGhpcmQgYnV0dG9uIG9uIE1TIGNvbXBhdGlibGUgbW91c2UgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqYnV0dG9ucz0gKChkYXRhWzBdICYgMHgyMCkgPj4gMykgfCAoKGRhdGFbMF0gJiAweDEwKSA+PiA0KTsKKyAgICAgICAgICAgIHByZXYgPSAqYnV0dG9uczsKKyAgICAgICAgICAgICpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOworICAgICAgICAgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVlRfcHMyOgorICAgICAgICAgICAgKmJ1dHRvbnMgPSAhIShkYXRhWzBdJjEpICogNCArICEhKGRhdGFbMF0mMikgKiAxICsgISEoZGF0YVswXSY0KSAqIDI7CisgICAgICAgICAgICBpZiAoZGF0YVsxXSAhPSAwKQorICAgICAgICAgICAgICAgICpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyBkYXRhWzFdLTI1NiA6IGRhdGFbMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmR4ID0gMDsKKyAgICAgICAgICAgIGlmIChkYXRhWzJdICE9IDApCisgICAgICAgICAgICAgICAgKmR5ID0gLSgoZGF0YVswXSAmIDB4MjApID8gZGF0YVsyXS0yNTYgOiBkYXRhWzJdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZHkgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZUX21vdXNlc3lzdGVtczogY2FzZSBFVlRfZ3BtOgorICAgICAgICAgICAgKmJ1dHRvbnMgPSAofmRhdGFbMF0pICYgMHgwNzsKKyAgICAgICAgICAgICpkeCA9IChjaGFyKShkYXRhWzFdKSArIChjaGFyKShkYXRhWzNdKTsKKyAgICAgICAgICAgICpkeSA9IC0oKGNoYXIpKGRhdGFbMl0pICsgKGNoYXIpKGRhdGFbNF0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWVF9sb2dpdGVjaDoKKyAgICAgICAgICAgICpidXR0b25zPSBkYXRhWzBdICYgMHgwNzsKKyAgICAgICAgICAgICpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyAgIGRhdGFbMV0gOiAtIGRhdGFbMV07CisgICAgICAgICAgICAqZHkgPSAoZGF0YVswXSAmIDB4MDgpID8gLSBkYXRhWzJdIDogICBkYXRhWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZUX2J1c21vdXNlOgorICAgICAgICAgICAgKmJ1dHRvbnM9ICh+ZGF0YVswXSkgJiAweDA3OworICAgICAgICAgICAgKmR4ID0gKGNoYXIpZGF0YVsxXTsKKyAgICAgICAgICAgICpkeSA9IC0oY2hhcilkYXRhWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZUX01Nc2VyaWVzOgorICAgICAgICAgICAgKmJ1dHRvbnMgPSBkYXRhWzBdICYgMHgwNzsKKyAgICAgICAgICAgICpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyAgIGRhdGFbMV0gOiAtIGRhdGFbMV07CisgICAgICAgICAgICAqZHkgPSAoZGF0YVswXSAmIDB4MDgpID8gLSBkYXRhWzJdIDogICBkYXRhWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZUX2ludGVsbGltb3VzZToKKyAgICAgICAgICAgICpidXR0b25zID0gKChkYXRhWzBdICYgMHgyMCkgPj4gMykgIC8qIGxlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgIHwgKChkYXRhWzNdICYgMHgxMCkgPj4gMykgIC8qIG1pZGRsZSAqLworICAgICAgICAgICAgICAgICAgICAgfCAoKGRhdGFbMF0gJiAweDEwKSA+PiA0KTsgLyogcmlnaHQgKi8KKyAgICAgICAgICAgICpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOworICAgICAgICAgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVlRfaW50ZWxsaW1vdXNlX3BzMjoKKyAgICAgICAgICAgICpidXR0b25zID0gKGRhdGFbMF0gJiAweDA0KSA+PiAxIC8qIE1pZGRsZSAqLworICAgICAgICAgICAgICAgIHwgKGRhdGFbMF0gJiAweDAyKSA+PiAxIC8qIFJpZ2h0ICovCisgICAgICAgICAgICAgICAgfCAoZGF0YVswXSAmIDB4MDEpIDw8IDI7IC8qIExlZnQgKi8KKyAgICAgICAgICAgICpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyAgICBkYXRhWzFdLTI1NiAgOiAgZGF0YVsxXTsKKyAgICAgICAgICAgICpkeSA9IChkYXRhWzBdICYgMHgyMCkgPyAgLShkYXRhWzJdLTI1NikgOiAtZGF0YVsyXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWVF9tb3VzZW1hbjogeworICAgICAgICAgICAgc3RhdGljIGludCAgICAgIGdldGV4dHJhOworICAgICAgICAgICAgc3RhdGljIHVjaGFyICAgIHByZXY9MDsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICBiOworCisgICAgICAgICAgICAvKiBUaGUgZGFtbmVkIE1vdXNlTWFuIGhhcyAzLzQgYnl0ZXMgcGFja2V0cy4gVGhlIGV4dHJhIGJ5dGUKKyAgICAgICAgICAgICAqIGlzIG9ubHkgdGhlcmUgaWYgdGhlIG1pZGRsZSBidXR0b24gaXMgYWN0aXZlLgorICAgICAgICAgICAgICogSSBnZXQgdGhlIGV4dHJhIGJ5dGUgYXMgYSBwYWNrZXQgd2l0aCBtYWdpYyBudW1iZXJzIGluIGl0LgorICAgICAgICAgICAgICogYW5kIHRoZW4gc3dpdGNoIHRvIDQtYnl0ZSBtb2RlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZGF0YVsxXSA9PSAweEFBICYmIGRhdGFbMl0gPT0gMHg1NSkgeworICAgICAgICAgICAgICAgIC8qIEdvdCB1bmV4cGVjdGVkIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICAgICAgaWYgKChiID0gKCpkYXRhPj40KSkgPiAweDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8qIGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICAqZHggPSAqZHkgPSAwOworICAgICAgICAgICAgICAgIGRydi0+cGFja2V0X2xlbj00OworICAgICAgICAgICAgICAgIGdldGV4dHJhPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogR290IDMvNCwgYXMgZXhwZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBNb3Rpb24gaXMgaW5kZXBlbmRlbnQgb2YgcGFja2V0bGVuLi4uICovCisgICAgICAgICAgICAgICAgKmR4ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MDMpIDw8IDYpIHwgKGRhdGFbMV0gJiAweDNGKSk7CisgICAgICAgICAgICAgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7CisgICAgICAgICAgICAgICAgcHJldiA9ICgoZGF0YVswXSAmIDB4MjApID4+IDMpIHwgKChkYXRhWzBdICYgMHgxMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgaWYgKGRydi0+cGFja2V0X2xlbj09NCkKKyAgICAgICAgICAgICAgICAgICAgYiA9IGRhdGFbM10+PjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRydi0+cGFja2V0X2xlbiA9PSA0KSB7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkcnYtPnBhY2tldF9sZW4gPSAzOworICAgICAgICAgICAgICAgICAgICBnZXRleHRyYSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiAweDIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2IHw9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAqYnV0dG9ucyA9IHByZXY7CisKKyAgICAgICAgICAgIC8qIFRoaXMgImNob3JkLW1pZGRsZSIgYmVoYXZpb3VyIHdhcyByZXBvcnRlZCBieSBEYXZpZCBBLiB2YW4gTGVldXdlbiAqLworICAgICAgICAgICAgaWYgKCgocHJldiBeICpidXR0b25zKSAmIDUpID09IDUpCisgICAgICAgICAgICAgICAgKmJ1dHRvbnMgPSAqYnV0dG9ucyA/IDIgOiAwOworICAgICAgICAgICAgcHJldiA9ICpidXR0b25zOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgRVZUX25vTW91c2U6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01hcCBhIGtleXByZXNzIHZpYSB0aGUga2V5IG1hcHBpbmcgdGFibGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGdldEtleU1hcHBpbmcoCisgICAga2V5bWFwICp0YWIsCisgICAgaW50IG5iLAorICAgIGludCBrZXkpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBuYjsgaSsrKSB7CisgICAgICAgIGlmICh0YWJbaV0uc2NhbiA9PSBrZXkpCisgICAgICAgICAgICByZXR1cm4gdGFiW2ldLm1hcDsKKyAgICAgICAgfQorICAgIHJldHVybiBrZXk7Cit9CisKKyNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKKworc3RhdGljIGNoYXIganMwX2F4ZXMgPSAwLCBqczBfYnV0dG9ucyA9IDA7CitzdGF0aWMgY2hhciBqczFfYXhlcyA9IDAsIGpzMV9idXR0b25zID0gMDsKK3N0YXRpYyBjaGFyIGpveXN0aWNrMF9kZXZbMjBdID0gIi9kZXYvanMwIjsKK3N0YXRpYyBjaGFyIGpveXN0aWNrMV9kZXZbMjBdID0gIi9kZXYvanMxIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDcmVhdGUgYSBqb3lzdGljayBldmVudCBmcm9tIHRoZSBqb3lzdGljayBkYXRhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbWFrZUpveUV2ZW50KAorICAgIGV2ZW50X3QgKmV2dCkKK3sKKyAgICBldnQtPm1lc3NhZ2UgPSAwOworICAgIGlmIChidXRzMCAmJiBheGlzMCkgeworICAgICAgICBpZiAoYnV0czBbMF0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMV9CVVRUT05BOworICAgICAgICBpZiAoYnV0czBbMV0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMV9CVVRUT05COworICAgICAgICBldnQtPndoZXJlX3ggPSBheGlzMFswXTsKKyAgICAgICAgZXZ0LT53aGVyZV95ID0gYXhpczBbMV07CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIGV2dC0+d2hlcmVfeCA9IGV2dC0+d2hlcmVfeSA9IDA7CisgICAgaWYgKGJ1dHMxICYmIGF4aXMxKSB7CisgICAgICAgIGlmIChidXRzMVswXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kyX0JVVFRPTkE7CisgICAgICAgIGlmIChidXRzMVsxXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kyX0JVVFRPTkI7CisgICAgICAgIGV2dC0+d2hlcmVfeCA9IGF4aXMxWzBdOworICAgICAgICBldnQtPndoZXJlX3kgPSBheGlzMVsxXTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgZXZ0LT53aGVyZV94ID0gZXZ0LT53aGVyZV95ID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBqb3lzdGljayBheGlzIGRhdGEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRVZUQVBJIF9FVlRfcmVhZEpveUF4aXMoCisgICAgaW50IGptYXNrLAorICAgIGludCAqYXhpcykKK3sKKyAgICBpbnQgbWFzayA9IDA7CisKKyAgICBpZiAoKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSA9PSAwKSB7CisgICAgICAgIC8qIE9sZCAwLnggZHJpdmVyICovCisgICAgICAgIHN0cnVjdCBKU19EQVRBX1RZUEUganM7CisgICAgICAgIGlmIChqb3lzdGljazBfZmQgJiYgcmVhZChqb3lzdGljazBfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pIHsKKyAgICAgICAgICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMSkKKyAgICAgICAgICAgICAgICBheGlzWzBdID0ganMueDsKKyAgICAgICAgICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMSkKKyAgICAgICAgICAgICAgICBheGlzWzFdID0ganMueTsKKyAgICAgICAgICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gxfEVWVF9KT1lfQVhJU19ZMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGpveXN0aWNrMV9mZCAmJiByZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBKU19SRVRVUk4pID09IEpTX1JFVFVSTikgeworICAgICAgICAgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1gyKQorICAgICAgICAgICAgICAgIGF4aXNbMl0gPSBqcy54OworICAgICAgICAgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kyKQorICAgICAgICAgICAgICAgIGF4aXNbM10gPSBqcy55OworICAgICAgICAgICAgbWFzayB8PSBFVlRfSk9ZX0FYSVNfWDJ8RVZUX0pPWV9BWElTX1kyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChheGlzMCkgeworICAgICAgICAgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1gxKQorICAgICAgICAgICAgICAgIGF4aXNbMF0gPSBheGlzMFswXTsKKyAgICAgICAgICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMSkKKyAgICAgICAgICAgICAgICBheGlzWzFdID0gYXhpczBbMV07CisgICAgICAgICAgICBtYXNrIHw9IEVWVF9KT1lfQVhJU19YMSB8IEVWVF9KT1lfQVhJU19ZMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGF4aXMxKSB7CisgICAgICAgICAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWDIpCisgICAgICAgICAgICAgICAgYXhpc1syXSA9IGF4aXMxWzBdOworICAgICAgICAgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kyKQorICAgICAgICAgICAgICAgIGF4aXNbM10gPSBheGlzMVsxXTsKKyAgICAgICAgICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gyIHwgRVZUX0pPWV9BWElTX1kyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIG1hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgam95c3RpY2sgYnV0dG9uIGRhdGEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRVZUQVBJIF9FVlRfcmVhZEpveUJ1dHRvbnModm9pZCkKK3sKKyAgICBpbnQgYnV0cyA9IDA7CisKKyAgICBpZiAoKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSA9PSAwKSB7CisgICAgICAgIC8qIE9sZCAwLnggZHJpdmVyICovCisgICAgICAgIHN0cnVjdCBKU19EQVRBX1RZUEUganM7CisgICAgICAgIGlmIChqb3lzdGljazBfZmQgJiYgcmVhZChqb3lzdGljazBfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pCisgICAgICAgICAgICBidXRzID0ganMuYnV0dG9uczsKKyAgICAgICAgaWYgKGpveXN0aWNrMV9mZCAmJiByZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBKU19SRVRVUk4pID09IEpTX1JFVFVSTikKKyAgICAgICAgICAgIGJ1dHMgfD0ganMuYnV0dG9ucyA8PCAyOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChidXRzMCkKKyAgICAgICAgICAgIGJ1dHMgfD0gRVZUX0pPWTFfQlVUVE9OQSpidXRzMFswXSArIEVWVF9KT1kxX0JVVFRPTkIqYnV0czBbMV07CisgICAgICAgIGlmIChidXRzMSkKKyAgICAgICAgICAgIGJ1dHMgfD0gRVZUX0pPWTJfQlVUVE9OQSpidXRzMVswXSArIEVWVF9KT1kyX0JVVFRPTkIqYnV0czFbMV07CisgICAgICAgIH0KKyAgICByZXR1cm4gYnV0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQord2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKK2F0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAordGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCityZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KKworU0VFIEFMU086CitFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgICAgICBtYXNrID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAgICAgKnRtcCwgbmFtZTBbMTI4XSwgbmFtZTFbMTI4XTsKKyAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7CisKKyAgICBpZiAoaW5pdGVkKQorICAgICAgICByZXR1cm4gbWFzazsKKyAgICBtZW1zZXQoRVZULmpveU1pbiwwLHNpemVvZihFVlQuam95TWluKSk7CisgICAgbWVtc2V0KEVWVC5qb3lDZW50ZXIsMCxzaXplb2YoRVZULmpveUNlbnRlcikpOworICAgIG1lbXNldChFVlQuam95TWF4LDAsc2l6ZW9mKEVWVC5qb3lNYXgpKTsKKyAgICBtZW1zZXQoRVZULmpveVByZXYsMCxzaXplb2YoRVZULmpveVByZXYpKTsKKyAgICBFVlQuam95QnV0U3RhdGUgPSAwOworICAgIGlmICgodG1wID0gZ2V0ZW52KEVOVl9KT1lERVYwKSkgIT0gTlVMTCkKKyAgICAgICAgc3RyY3B5KGpveXN0aWNrMF9kZXYsdG1wKTsKKyAgICBpZiAoKHRtcCA9IGdldGVudihFTlZfSk9ZREVWMSkpICE9IE5VTEwpCisgICAgICAgIHN0cmNweShqb3lzdGljazFfZGV2LHRtcCk7CisgICAgaWYgKChqb3lzdGljazBfZmQgPSBvcGVuKGpveXN0aWNrMF9kZXYsIE9fUkRPTkxZKSkgPCAwKQorICAgICAgICBqb3lzdGljazBfZmQgPSAwOworICAgIGlmICgoam95c3RpY2sxX2ZkID0gb3Blbihqb3lzdGljazFfZGV2LCBPX1JET05MWSkpIDwgMCkKKyAgICAgICAgam95c3RpY2sxX2ZkID0gMDsKKyAgICBpZiAoIWpveXN0aWNrMF9mZCAmJiAham95c3RpY2sxX2ZkKSAvLyBObyBqb3lzdGlja3MgZGV0ZWN0ZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaW5pdGVkID0gdHJ1ZTsKKyAgICBpZiAoaW9jdGwoam95c3RpY2swX2ZkID8gam95c3RpY2swX2ZkIDogam95c3RpY2sxX2ZkLCBKU0lPQ0dWRVJTSU9OLCAmanNfdmVyc2lvbikgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEluaXRpYWxpc2Ugam95c3RpY2sgMCAqLworICAgIGlmIChqb3lzdGljazBfZmQpIHsKKyAgICAgICAgaW9jdGwoam95c3RpY2swX2ZkLCBKU0lPQ0dOQU1FKHNpemVvZihuYW1lMCkpLCBuYW1lMCk7CisgICAgICAgIGlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgeworICAgICAgICAgICAgc3RydWN0IGpzX2V2ZW50IGpzOworCisgICAgICAgICAgICBpb2N0bChqb3lzdGljazBfZmQsIEpTSU9DR0FYRVMsICZqczBfYXhlcyk7CisgICAgICAgICAgICBpb2N0bChqb3lzdGljazBfZmQsIEpTSU9DR0JVVFRPTlMsICZqczBfYnV0dG9ucyk7CisgICAgICAgICAgICBheGlzMCA9IFBNX2NhbGxvYygoaW50KWpzMF9heGVzLCBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgIGJ1dHMwID0gUE1fbWFsbG9jKChpbnQpanMwX2J1dHRvbnMpOworICAgICAgICAgICAgLyogUmVhZCB0aGUgaW5pdGlhbCBldmVudHMgKi8KKyAgICAgICAgICAgIHdoaWxlKGRhdGFSZWFkeShqb3lzdGljazBfZmQpCisgICAgICAgICAgICAgICAgICAmJiByZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBzaXplb2Yoc3RydWN0IGpzX2V2ZW50KSkgPT0gc2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKKyAgICAgICAgICAgICAgICAgICYmIChqcy50eXBlICYgSlNfRVZFTlRfSU5JVCkKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQorICAgICAgICAgICAgICAgICAgICBidXRzMFtqcy5udW1iZXJdID0ganMudmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpCisgICAgICAgICAgICAgICAgICAgIGF4aXMwW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAganMwX2F4ZXMgPSAyOworICAgICAgICAgICAganMwX2J1dHRvbnMgPSAyOworICAgICAgICAgICAgYXhpczAgPSBQTV9jYWxsb2MoKGludClqczBfYXhlcywgc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICBidXRzMCA9IFBNX21hbGxvYygoaW50KWpzMF9idXR0b25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogSW5pdGlhbGlzZSBqb3lzdGljayAxICovCisgICAgaWYgKGpveXN0aWNrMV9mZCkgeworICAgICAgICBpb2N0bChqb3lzdGljazFfZmQsIEpTSU9DR05BTUUoc2l6ZW9mKG5hbWUxKSksIG5hbWUxKTsKKyAgICAgICAgaWYgKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSB7CisgICAgICAgICAgICBzdHJ1Y3QganNfZXZlbnQganM7CisKKyAgICAgICAgICAgIGlvY3RsKGpveXN0aWNrMV9mZCwgSlNJT0NHQVhFUywgJmpzMV9heGVzKTsKKyAgICAgICAgICAgIGlvY3RsKGpveXN0aWNrMV9mZCwgSlNJT0NHQlVUVE9OUywgJmpzMV9idXR0b25zKTsKKyAgICAgICAgICAgIGF4aXMxID0gUE1fY2FsbG9jKChpbnQpanMxX2F4ZXMsIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgYnV0czEgPSBQTV9tYWxsb2MoKGludClqczFfYnV0dG9ucyk7CisgICAgICAgICAgICAvKiBSZWFkIHRoZSBpbml0aWFsIGV2ZW50cyAqLworICAgICAgICAgICAgd2hpbGUoZGF0YVJlYWR5KGpveXN0aWNrMV9mZCkKKyAgICAgICAgICAgICAgICAgICYmIHJlYWQoam95c3RpY2sxX2ZkLCAmanMsIHNpemVvZihzdHJ1Y3QganNfZXZlbnQpKT09c2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKKyAgICAgICAgICAgICAgICAgICYmIChqcy50eXBlICYgSlNfRVZFTlRfSU5JVCkKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQorICAgICAgICAgICAgICAgICAgICBidXRzMVtqcy5udW1iZXJdID0ganMudmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpCisgICAgICAgICAgICAgICAgICAgIGF4aXMxW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyPDwyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAganMxX2F4ZXMgPSAyOworICAgICAgICAgICAganMxX2J1dHRvbnMgPSAyOworICAgICAgICAgICAgYXhpczEgPSBQTV9jYWxsb2MoKGludClqczFfYXhlcywgc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICBidXRzMSA9IFBNX21hbGxvYygoaW50KWpzMV9idXR0b25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZkZWYgIENIRUNLRUQKKyAgICBmcHJpbnRmKHN0ZGVyciwiVXNpbmcgam95c3RpY2sgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsIAorICAgICAgICAgICAganNfdmVyc2lvbiA+PiAxNiwgKGpzX3ZlcnNpb24gPj4gOCkgJiAweGZmLCBqc192ZXJzaW9uICYgMHhmZik7CisgICAgaWYgKGpveXN0aWNrMF9mZCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIkpveXN0aWNrIDEgKCVzKTogJXNcbiIsIGpveXN0aWNrMF9kZXYsIG5hbWUwKTsKKyAgICBpZiAoam95c3RpY2sxX2ZkKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSm95c3RpY2sgMiAoJXMpOiAlc1xuIiwgam95c3RpY2sxX2RldiwgbmFtZTEpOworI2VuZGlmCisgICAgbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKKyAgICBpZiAobWFzaykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspCisgICAgICAgICAgICBFVlQuam95TWF4W2ldID0gRVZULmpveUNlbnRlcltpXSoyOworICAgICAgICB9CisgICAgcmV0dXJuIG1hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1BvbGxzIHRoZSBqb3lzdGljayBmb3IgcG9zaXRpb24gYW5kIGJ1dHRvbiBpbmZvcm1hdGlvbi4KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9sbCBhbmFsb2d1ZSBqb3lzdGlja3MgZm9yIGJ1dHRvbiBhbmQgcG9zaXRpb24KK2luZm9ybWF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWFpbiBsb29wIG9mIHRoZSB1c2VyCithcHBsaWNhdGlvbiwganVzdCBiZWZvcmUgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBldmVudHMgdmlhIEVWVF9nZXROZXh0LgorQWxsIGluZm9ybWF0aW9uIHBvbGxlZCBmcm9tIHRoZSBqb3lzdGljayB3aWxsIGJlIHBvc3RlZCB0byB0aGUgZXZlbnQKK3F1ZXVlIGZvciBsYXRlciByZXRyaWV2YWwuCisKK05vdGU6ICAgTW9zdCBhbmFsb2d1ZSBqb3lzdGlja3Mgd2lsbCBwcm92aWRlIHJlYWRpbmdzIHRoYXQgY2hhbmdlIGV2ZW4KKyAgICAgICAgdGhvdWdoIHRoZSBqb3lzdGljayBoYXMgbm90IG1vdmVkLiBIZW5jZSBpZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUKKyAgICAgICAgeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgorICAgICAgICBldmVudCBsb29wLgorCitTRUUgQUxTTzoKK0VWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LAorRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9wb2xsSm95c3RpY2sodm9pZCkKK3sKKyAgICBldmVudF90IGV2dDsKKyAgICBpbnQgICAgIGksYXhpc1tKT1lfTlVNX0FYRVNdLG5ld0J1dFN0YXRlLG1hc2ssbW92ZWQscHM7CisKKyAgICBpZiAoKGpzX3ZlcnNpb24gJiB+MHhGRkZGKSA9PSAwICYmIEVWVC5qb3lNYXNrKSB7CisgICAgICAgIC8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCisgICAgICAgICAqIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBwb2xsZWQuIFVudGlsIHRoZSBldmVudHMgYXJlCisgICAgICAgICAqIGFjdHVhbGx5IGZsdXNoZWQsIHdlIGtlZXAgbW9kaWZ5aW5nIHRoZSBzYW1lIGpveXN0aWNrIG1vdmVtZW50CisgICAgICAgICAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50CisgICAgICAgICAqLworICAgICAgICBtYXNrID0gX0VWVF9yZWFkSm95QXhpcyhFVlQuam95TWFzayxheGlzKTsKKyAgICAgICAgbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7CisgICAgICAgIG1vdmVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKT1lfTlVNX0FYRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQorICAgICAgICAgICAgICAgIGF4aXNbaV0gPSBzY2FsZUpveUF4aXMoYXhpc1tpXSxpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBheGlzW2ldID0gRVZULmpveVByZXZbaV07CisgICAgICAgICAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKKyAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChtb3ZlZCkgeworICAgICAgICAgICAgbWVtY3B5KEVWVC5qb3lQcmV2LGF4aXMsc2l6ZW9mKEVWVC5qb3lQcmV2KSk7CisgICAgICAgICAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOworICAgICAgICAgICAgaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS5tZXNzYWdlID0gbmV3QnV0U3RhdGU7CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgICAgICAgICAgLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCisgICAgICAgICAgICAgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVC5qb3lCdXRTdGF0ZTsKKyAgICAgICAgICAgICAgICBldnQud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOworICAgICAgICAgICAgICAgIGV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07CisgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKKyAgICAgICAgICAgICAgICBldnQucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB0aGUgam95c3RpY2sgYnV0dG9ucywgYW5kIHBvc3QgZXZlbnRzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZQorICAgICAgICAgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCisgICAgICAgICAqLworICAgICAgICBpZiAobmV3QnV0U3RhdGUgIT0gRVZULmpveUJ1dFN0YXRlKSB7CisgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgeworICAgICAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLworICAgICAgICAgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfSk9ZQ0xJQ0s7CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOworICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXS53aGVyZV95ID0gRVZULmpveVByZXZbMV07CisgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKKyAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgRVZULmpveUJ1dFN0YXRlID0gbmV3QnV0U3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgorCitIRUFERVI6CitldmVudC5oCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCit3aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCit0aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCitUbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Citwb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKK2Z1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQorY2FsaWJyYXRpb24gZmFjdG9ycy4KKworVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCitpbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKK3VwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKK3NhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgorCitTRUUgQUxTTzoKK0VWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQoreworICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAord2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwordGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgorVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKK3Bvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcworZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCitjYWxpYnJhdGlvbiBmYWN0b3JzLgorCitVc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKK2luaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQordXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQorc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCisKK1NFRSBBTFNPOgorRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCit7CisgICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitDYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAord2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwordGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgorVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCitwb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKK2Z1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQorY2FsaWJyYXRpb24gZmFjdG9ycy4KKworVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCitpbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKK3VwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKK3NhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgorCitTRUUgQUxTTzoKK0VWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQoreworICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIExpbnV4IGludG8gb3VyIGV2ZW50IHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCit7CisgICAgZXZlbnRfdCAgICAgICAgICAgICAgICAgZXZ0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGksbnVta2V5cywgYzsKKyAgICBpYm9vbCAgICAgICAgICAgICAgICAgICByZWxlYXNlOworICAgIHN0YXRpYyBzdHJ1Y3Qga2JlbnRyeSAgIGtlOworICAgIHN0YXRpYyBjaGFyICAgICAgICAgICAgIGJ1ZltLQkRSRUFEQlVGRkVSU0laRV07CisgICAgc3RhdGljIHVzaG9ydCAgICAgICAgICAgcmVwZWF0S2V5WzEyOF0gPSB7MH07CisKKyAgICAvKiBQb2xsIGtleWJvYXJkIGV2ZW50cyAqLworICAgIHdoaWxlIChkYXRhUmVhZHkoX1BNX2NvbnNvbGVfZmQpICYmIChudW1rZXlzID0gcmVhZChfUE1fY29uc29sZV9mZCwgYnVmLCBLQkRSRUFEQlVGRkVSU0laRSkpID4gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7CisgICAgICAgICAgICBjID0gYnVmW2ldOworICAgICAgICAgICAgcmVsZWFzZSA9IGMgJiAweDgwOworICAgICAgICAgICAgYyAmPSAweDdGOworCisgICAgICAgICAgICAvLyBUT0RPOiAgICBUaGlzIGlzIHdyb25nISBXZSBuZWVkIHRoaXMgdG8gYmUgdGhlIHRpbWUgc3RhbXAgYXQKKyAgICAgICAgICAgIC8vICAgICAgICAgICoqIGludGVycnVwdCAqKiB0aW1lISEgT25lIHNvbHV0aW9uIHdvdWxkIGJlIHRvCisgICAgICAgICAgICAvLyAgICAgICAgICBwdXQgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nIGxvb3BzIGludG8KKyAgICAgICAgICAgIC8vICAgICAgICAgIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FuIGJsb2NrIG9uIEkvTyB0byB0aGUKKyAgICAgICAgICAgIC8vICAgICAgICAgIG5lY2Vzc2F5IGZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAgICAgIGV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOworCisgICAgICAgICAgICBpZiAocmVsZWFzZSkgeworICAgICAgICAgICAgICAgIC8qIEtleSByZWxlYXNlZCAqLworICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRTaGlmdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgJj0gfkVWVF9MRUZUU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLQl9yaWdodFNoaWZ0OgorICAgICAgICAgICAgICAgICAgICAgICAgX1BNX21vZGlmaWVycyAmPSB+RVZUX1JJR0hUU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgJj0gfihFVlRfTEVGVENUUkx8RVZUX0NUUkxTVEFURSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzogICAgICAgICAgICAvKiBDb250cm9sICovCisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzICY9IH5FVlRfQ1RSTFNUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzICY9IH4oRVZUX0xFRlRBTFR8RVZUX0FMVFNUQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgJj0gfkVWVF9BTFRTVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXTsKKyAgICAgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKKyAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAga2V5VXBNc2dbY10gPSAwOworICAgICAgICAgICAgICAgIHJlcGVhdEtleVtjXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogS2V5IHByZXNzZWQgKi8KKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtCX2xlZnRTaGlmdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtCX3JpZ2h0U2hpZnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTHxFVlRfQ1RSTFNUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6ICAgICAgICAgICAgLyogQ29udHJvbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgX1BNX21vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUfEVWVF9BTFRTVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0JfY2Fwc0xvY2s6ICAgLyogQ2FwcyBMb2NrICovCisgICAgICAgICAgICAgICAgICAgICAgICBfUE1fbGVkcyBePSBMRURfQ0FQOworICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbGVkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLQl9udW1Mb2NrOiAgICAvKiBOdW0gTG9jayAqLworICAgICAgICAgICAgICAgICAgICAgICAgX1BNX2xlZHMgXj0gTEVEX05VTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX2xlZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0Jfc2Nyb2xsTG9jazogLyogU2Nyb2xsIExvY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIF9QTV9sZWRzIF49IExFRF9TQ1I7CisgICAgICAgICAgICAgICAgICAgICAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9sZWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7CisgICAgICAgICAgICAgICAgaWYgKGtleVVwTXNnW2NdKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXSB8IChyZXBlYXRLZXlbY10rKyA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFzYzsKKworICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IGdldEtleU1hcHBpbmcoa2V5bWFwcywgTkJfS0VZTUFQUywgYykgPDwgODsKKyAgICAgICAgICAgICAgICAgICAga2Uua2JfaW5kZXggPSBjOworICAgICAgICAgICAgICAgICAgICBrZS5rYl90YWJsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX1BNX21vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkgfHwgKF9QTV9sZWRzICYgTEVEX0NBUCkpCisgICAgICAgICAgICAgICAgICAgICAgICBrZS5rYl90YWJsZSB8PSBLX1NISUZUVEFCOworICAgICAgICAgICAgICAgICAgICBpZiAoX1BNX21vZGlmaWVycyAmIChFVlRfTEVGVEFMVCB8IEVWVF9BTFRTVEFURSkpCisgICAgICAgICAgICAgICAgICAgICAgICBrZS5rYl90YWJsZSB8PSBLX0FMVFRBQjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdLQkVOVCwgKHVuc2lnbmVkIGxvbmcpJmtlKTwwKQorICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJpb2N0bChLREdLQkVOVCkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChfUE1fbGVkcyAmIExFRF9OVU0pICYmIChnZXRLZXlNYXBwaW5nKGtleXBhZCwgTkJfS0VZUEFELCBjKSE9YykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYyA9IGdldEtleU1hcHBpbmcoa2V5cGFkLCBOQl9LRVlQQUQsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYyA9IEFTQ0lJX2JhY2tzcGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjID0gQVNDSUlfdGFiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYyA9IEFTQ0lJX2VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYyA9IEFTQ0lJX2VzYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MgPSBrZS5rYl92YWx1ZSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2MgPCAweDFCKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKF9QTV9tb2RpZmllcnMgJiAoRVZUX0NUUkxTVEFURXxFVlRfTEVGVENUUkwpKSAmJiBpc2FscGhhKGFzYykpCisgICAgICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSB8PSB0b3VwcGVyKGFzYykgLSAnQScgKyAxOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSB8PSBhc2M7CisgICAgICAgICAgICAgICAgICAgIGtleVVwTXNnW2NdID0gZXZ0Lm1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIHJlcGVhdEtleVtjXSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogUG9sbCBtb3VzZSBldmVudHMgKi8KKyAgICBpZiAoX0VWVF9tb3VzZV9mZCkgeworICAgICAgICBpbnQgICAgICAgICBkeCwgZHksIGJ1dHM7CisgICAgICAgIHN0YXRpYyBpbnQgIG9sZGJ1dHM7CisKKyAgICAgICAgd2hpbGUgKGRhdGFSZWFkeShfRVZUX21vdXNlX2ZkKSkgeworICAgICAgICAgICAgaWYgKHJlYWRNb3VzZURhdGEoJmJ1dHMsICZkeCwgJmR5KSkgeworICAgICAgICAgICAgICAgIEVWVC5teCArPSBkeDsKKyAgICAgICAgICAgICAgICBFVlQubXkgKz0gZHk7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teCA+IHJhbmdlX3gpIEVWVC5teCA9IHJhbmdlX3g7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teSA+IHJhbmdlX3kpIEVWVC5teSA9IHJhbmdlX3k7CisgICAgICAgICAgICAgICAgZXZ0LndoZXJlX3ggPSBFVlQubXg7CisgICAgICAgICAgICAgICAgZXZ0LndoZXJlX3kgPSBFVlQubXk7CisgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBkeDsKKyAgICAgICAgICAgICAgICBldnQucmVsYXRpdmVfeSA9IGR5OworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogICAgVGhpcyBpcyB3cm9uZyEgV2UgbmVlZCB0aGlzIHRvIGJlIHRoZSB0aW1lIHN0YW1wIGF0CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKiogaW50ZXJydXB0ICoqIHRpbWUhISBPbmUgc29sdXRpb24gd291bGQgYmUgdG8KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICBwdXQgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nIGxvb3BzIGludG8KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbiBibG9jayBvbiBJL08gdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgbmVjZXNzYXkgZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOworICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgPSBfUE1fbW9kaWZpZXJzOworICAgICAgICAgICAgICAgIGlmIChidXRzICYgNCkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKKyAgICAgICAgICAgICAgICBpZiAoYnV0cyAmIDEpCisgICAgICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOworICAgICAgICAgICAgICAgIGlmIChidXRzICYgMikKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTUlERExFQlVUOworCisgICAgICAgICAgICAgICAgLyogTGVmdCBjbGljayBldmVudHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGJ1dHMmNCkgIT0gKG9sZGJ1dHMmNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHMmNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOworICAgICAgICAgICAgICAgICAgICBFVlQub2xkTW92ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSaWdodCBjbGljayBldmVudHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGJ1dHMmMSkgIT0gKG9sZGJ1dHMmMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHMmMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgRVZULm9sZE1vdmUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWlkZGxlIGNsaWNrIGV2ZW50cyAqLworICAgICAgICAgICAgICAgIGlmICgoYnV0cyYyKSAhPSAob2xkYnV0cyYyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnV0cyYyKQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRVVQOworICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgRVZULm9sZE1vdmUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTW91c2UgbW92ZW1lbnQgZXZlbnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoZHggfHwgZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOworICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9kaWZ5IGV4aXN0aW5nIG1vdmVtZW50IGV2ZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94OworICAgICAgICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZW1lbnQgZXZlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRidXRzID0gYnV0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIFVTRV9PU19KT1lTVElDSworICAgIC8vIFBvbGwgam95c3RpY2sgZXZlbnRzIHVzaW5nIHRoZSAxLnggam95c3RpY2sgZHJpdmVyIEFQSSBpbiB0aGUgMi4yIGtlcm5lbHMKKyAgICBpZiAoanNfdmVyc2lvbiAmIH4weGZmZmYpIHsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBqc19ldmVudCAganM7CisKKyAgICAgICAgLyogUmVhZCBqb3lzdGljayBheGlzIDAgKi8KKyAgICAgICAgZXZ0LndoZW4gPSAwOworICAgICAgICBldnQubW9kaWZpZXJzID0gX1BNX21vZGlmaWVyczsKKyAgICAgICAgaWYgKGpveXN0aWNrMF9mZCAmJiBkYXRhUmVhZHkoam95c3RpY2swX2ZkKSAmJgorICAgICAgICAgICAgICAgIHJlYWQoam95c3RpY2swX2ZkLCAmanMsIHNpemVvZihqcykpID09IHNpemVvZihqcykpIHsKKyAgICAgICAgICAgIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKSB7CisgICAgICAgICAgICAgICAgaWYgKGpzLm51bWJlciA8IDIpIHsgLyogT25seSAyIGJ1dHRvbnMgZm9yIG5vdyA6KCAqLworICAgICAgICAgICAgICAgICAgICBidXRzMFtqcy5udW1iZXJdID0ganMudmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOworICAgICAgICAgICAgICAgICAgICBtYWtlSm95RXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykgeworICAgICAgICAgICAgICAgIGF4aXMwW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9KT1lNT1ZFOworICAgICAgICAgICAgICAgIGlmIChFVlQub2xkSm95TW92ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtYWtlSm95RXZlbnQoJkVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOworICAgICAgICAgICAgICAgICAgICBtYWtlSm95RXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIC8qIFJlYWQgam95c3RpY2sgYXhpcyAxICovCisgICAgICAgIGlmIChqb3lzdGljazFfZmQgJiYgZGF0YVJlYWR5KGpveXN0aWNrMV9mZCkgJiYKKyAgICAgICAgICAgICAgICByZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBzaXplb2YoanMpKT09c2l6ZW9mKGpzKSkgeworICAgICAgICAgICAgaWYgKGpzLnR5cGUgJiBKU19FVkVOVF9CVVRUT04pIHsKKyAgICAgICAgICAgICAgICBpZiAoanMubnVtYmVyIDwgMikgeyAvKiBPbmx5IDIgYnV0dG9ucyBmb3Igbm93IDooICovCisgICAgICAgICAgICAgICAgICAgIGJ1dHMxW2pzLm51bWJlcl0gPSBqcy52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfSk9ZQ0xJQ0s7CisgICAgICAgICAgICAgICAgICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGpzLnR5cGUgJiBKU19FVkVOVF9BWElTKSB7CisgICAgICAgICAgICAgICAgYXhpczFbanMubnVtYmVyXSA9IHNjYWxlSm95QXhpcyhqcy52YWx1ZSxqcy5udW1iZXI8PDIpOworICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0pPWU1PVkU7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VKb3lFdmVudCgmRVZULmV2dHFbRVZULm9sZEpveU1vdmVdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7CisgICAgICAgICAgICAgICAgICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKK2tleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgorY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgX1BNX21vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQorQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCitidXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawordG8gdGhlIHJhdyBmb3JtYXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc2V0c3BlZWQoCisgICAgaW50IGZkLAorICAgIGludCBvbGQsCisgICAgaW50IG5ldywKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyB0dHk7CisgICAgY2hhciAqYzsKKyAgCisgICAgdGNnZXRhdHRyKGZkLCAmdHR5KTsKKyAgICB0dHkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKKyAgICB0dHkuY19vZmxhZyA9IDA7CisgICAgdHR5LmNfbGZsYWcgPSAwOworICAgIHR0eS5jX2xpbmUgPSAwOworICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7CisgICAgdHR5LmNfY2NbVk1JTl0gPSAxOworICAgIHN3aXRjaCAob2xkKSB7CisgICAgICAgIGNhc2UgOTYwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCOTYwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgNDgwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCNDgwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgMjQwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMjQwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgMTIwMDoKKyAgICAgICAgZGVmYXVsdDogICAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEIxMjAwOyBicmVhazsKKyAgICAgICAgfQorICAgIHRjc2V0YXR0cihmZCwgVENTQUZMVVNILCAmdHR5KTsKKyAgICBzd2l0Y2ggKG5ldykgeworICAgICAgICBjYXNlIDk2MDA6ICBjID0gIipxIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCOTYwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgNDgwMDogIGMgPSAiKnAiOyAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI0ODAwOyBicmVhazsKKyAgICAgICAgY2FzZSAyNDAwOiAgYyA9ICIqbyI7ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjI0MDA7IGJyZWFrOworICAgICAgICBjYXNlIDEyMDA6CisgICAgICAgIGRlZmF1bHQ6ICAgIGMgPSAiKm4iOyAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEIxMjAwOyBicmVhazsKKyAgICAgICAgfQorICAgIHdyaXRlKGZkLCBjLCAyKTsKKyAgICB1c2xlZXAoMTAwMDAwKTsKKyAgICB0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJnR0eSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2VuZXJpYyBtb3VzZSBkcml2ZXIgaW5pdCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0VWVF9tb3VzZV9pbml0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBDaGFuZ2UgZnJvbSBhbnkgYXZhaWxhYmxlIHNwZWVkIHRvIHRoZSBjaG9zZW4gb25lICovCisgICAgZm9yIChpID0gOTYwMDsgaSA+PSAxMjAwOyBpIC89IDIpCisgICAgICAgIHNldHNwZWVkKF9FVlRfbW91c2VfZmQsIGksIG9wdF9iYXVkLCBtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitMb2dpdGVjaCBtb3VzZSBkcml2ZXIgaW5pdCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0VWVF9sb2dpdGVjaF9pbml0KHZvaWQpCit7CisgICAgaW50ICAgICAgICAgaTsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50ICAgICAgICAgYnVzbW91c2U7CisgICAgCisgICAgLyogaXMgdGhpcyBhIHNlcmlhbC0gb3IgYSBidXMtIG1vdXNlPyAqLworICAgIGlmIChmc3RhdChfRVZUX21vdXNlX2ZkLCZidWYpID09IC0xKQorICAgICAgICBwZXJyb3IoImZzdGF0Iik7CisgICAgaSA9IE1BSk9SKGJ1Zi5zdF9yZGV2KTsKKyAgICBpZiAoc3RhdCgiL2Rldi90dHlTMCIsJmJ1ZikgPT0gLTEpCisgICAgICAgIHBlcnJvcigic3RhdCIpOworICAgIGJ1c21vdXNlPShpICE9IE1BSk9SKGJ1Zi5zdF9yZGV2KSk7CisgICAgCisgICAgLyogRml4IHRoZSBob3dtYW55IGZpZWxkLCBzbyB0aGF0IHNlcmlhbCBtaWNlIGhhdmUgMSwgd2hpbGUgYnVzbWljZSBoYXZlIDMgKi8KKyAgICBtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLnJlYWQgPSBidXNtb3VzZSA/IDMgOiAxOworICAgIAorICAgIC8qIENoYW5nZSBmcm9tIGFueSBhdmFpbGFibGUgc3BlZWQgdG8gdGhlIGNob3NlbiBvbmUgKi8KKyAgICBmb3IgKGkgPSA5NjAwOyBpID49IDEyMDA7IGkgLz0gMikKKyAgICAgICAgc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgaSwgb3B0X2JhdWQsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uZmxhZ3MpOworICAKKyAgICAvKiBUaGlzIHN0dWZmIGlzIHBlY3VsaWFyIG9mIGxvZ2l0ZWNoIG1pY2UsIGFsc28gZm9yIHRoZSBzZXJpYWwgb25lcyAqLworICAgIHdyaXRlKF9FVlRfbW91c2VfZmQsICJTIiwgMSk7CisgICAgc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgb3B0X2JhdWQsIG9wdF9iYXVkLENTOCB8UEFSRU5CIHxQQVJPREQgfENSRUFEIHxDTE9DQUwgfEhVUENMKTsKKyAgCisgICAgLyogQ29uZmlndXJlIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIGZvciAoaSA9IDA7IG9wdF9zYW1wbGUgPD0gc2FtcGxldGFiW2ldLnNhbXBsZTsgaSsrKQorICAgICAgICA7CisgICAgd3JpdGUoX0VWVF9tb3VzZV9mZCxzYW1wbGV0YWJbaV0uY29kZSwxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitNaWNyb3NvZnQgSW50ZWxsaW1vdXNlIGluaXQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9FVlRfcG5wbW91c2VfaW5pdCh2b2lkKQoreworICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKKyAgCisgICAgdGNnZXRhdHRyKF9FVlRfbW91c2VfZmQsICZ0dHkpOworICAgIHR0eS5jX2lmbGFnID0gSUdOQlJLIHwgSUdOUEFSOworICAgIHR0eS5jX29mbGFnID0gMDsKKyAgICB0dHkuY19sZmxhZyA9IDA7CisgICAgdHR5LmNfbGluZSA9IDA7CisgICAgdHR5LmNfY2NbVlRJTUVdID0gMDsKKyAgICB0dHkuY19jY1tWTUlOXSA9IDE7CisgICAgdHR5LmNfY2ZsYWcgPSBtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLmZsYWdzIHwgQjEyMDA7CisgICAgdGNzZXRhdHRyKF9FVlRfbW91c2VfZmQsIFRDU0FGTFVTSCwgJnR0eSk7IC8qIHNldCBwYXJhbWV0ZXJzICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgaW50ICAgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAqdG1wOworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOworICAgIGluaXRFdmVudFF1ZXVlKCk7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBrZXlVcE1zZ1tpXSA9IDA7CisKKyAgICAvKiBLZXlib2FyZCBpbml0aWFsaXphdGlvbiAqLworICAgIGlmIChfUE1fY29uc29sZV9mZCA9PSAtMSkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91IG11c3QgZmlyc3QgY2FsbCBQTV9vcGVuQ29uc29sZSB0byB1c2UgdGhlIEVWVCBmdW5jdGlvbnMhIik7CisgICAgX1BNX2tleWJvYXJkX3Jhd21vZGUoKTsKKyAgICBmY250bChfUE1fY29uc29sZV9mZCxGX1NFVEZMLGZjbnRsKF9QTV9jb25zb2xlX2ZkLEZfR0VURkwpIHwgT19OT05CTE9DSyk7CisKKyAgICAvKiBNb3VzZSBpbml0aWFsaXphdGlvbiAqLworICAgIGlmICgodG1wID0gZ2V0ZW52KEVOVl9NT1VTRURSVikpICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX01JQ0U7IGkrKykgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKHRtcCwgbW91c2VfaW5mb3NbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtb3VzZV9kcml2ZXIgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gTkJfTUlDRSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gbW91c2UgZHJpdmVyOiAlc1xuIiwgdG1wKTsKKyAgICAgICAgICAgIG1vdXNlX2RyaXZlciA9IEVWVF9ub01vdXNlOworICAgICAgICAgICAgX0VWVF9tb3VzZV9mZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBpZiAobW91c2VfZHJpdmVyICE9IEVWVF9ub01vdXNlKSB7CisgICAgICAgIGlmIChtb3VzZV9kcml2ZXIgPT0gRVZUX2dwbSkKKyAgICAgICAgICAgIHN0cmNweShtb3VzZV9kZXYsIi9kZXYvZ3BtZGF0YSIpOworICAgICAgICBpZiAoKHRtcCA9IGdldGVudihFTlZfTU9VU0VERVYpKSAhPSBOVUxMKQorICAgICAgICAgICAgc3RyY3B5KG1vdXNlX2Rldix0bXApOworI2lmZGVmICBDSEVDS0VECisgICAgICAgIGZwcmludGYoc3RkZXJyLCJVc2luZyB0aGUgJXMgTUdMIG1vdXNlIGRyaXZlciBvbiAlcy5cbiIsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0ubmFtZSwgbW91c2VfZGV2KTsKKyNlbmRpZgorICAgICAgICBpZiAoKF9FVlRfbW91c2VfZmQgPSBvcGVuKG1vdXNlX2RldiwgT19SRFdSKSkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoIm9wZW4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbW91c2UgZGV2aWNlICVzLCBkcm9wcGluZyBtb3VzZSBzdXBwb3J0LlxuIiwgbW91c2VfZGV2KTsKKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgbW91c2VfZHJpdmVyID0gRVZUX25vTW91c2U7CisgICAgICAgICAgICBfRVZUX21vdXNlX2ZkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgICAgIC8qIEluaXQgYW5kIGZsdXNoIHRoZSBtb3VzZSBwZW5kaW5nIGlucHV0IHF1ZXVlICovCisgICAgICAgICAgICBpZiAobW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5pbml0KQorICAgICAgICAgICAgICAgIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uaW5pdCgpOworICAgICAgICAgICAgd2hpbGUoZGF0YVJlYWR5KF9FVlRfbW91c2VfZmQpICYmIHJlYWQoX0VWVF9tb3VzZV9mZCwgJmMsIDEpID09IDEpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgcmFuZ2VfeCA9IHhSZXM7CisgICAgcmFuZ2VfeSA9IHlSZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitNb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKK2FuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfcmVzdW1lKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgTGludXgKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfc3VzcGVuZCh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIExpbnV4Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitFeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfZXhpdCh2b2lkKQoreworICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCisgICAgX1BNX3Jlc3RvcmVfa2JfbW9kZSgpOworICAgIGlmIChfRVZUX21vdXNlX2ZkKSB7CisgICAgICAgIGNsb3NlKF9FVlRfbW91c2VfZmQpOworICAgICAgICBfRVZUX21vdXNlX2ZkID0gMDsKKyAgICAgICAgfQorI2lmZGVmIFVTRV9PU19KT1lTVElDSworICAgIGlmIChqb3lzdGljazBfZmQpIHsKKyAgICAgICAgY2xvc2Uoam95c3RpY2swX2ZkKTsKKyAgICAgICAgZnJlZShheGlzMCk7CisgICAgICAgIGZyZWUoYnV0czApOworICAgICAgICBqb3lzdGljazBfZmQgPSAwOworICAgICAgICB9CisgICAgaWYgKGpveXN0aWNrMV9mZCkgeworICAgICAgICBjbG9zZShqb3lzdGljazFfZmQpOworICAgICAgICBmcmVlKGF4aXMxKTsKKyAgICAgICAgZnJlZShidXRzMSk7CisgICAgICAgIGpveXN0aWNrMV9mZCA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5zdmdhIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM1OGEwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYQpAQCAtMCwwICsxLDEwNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICBUaGUgU3VwZXJWR0EgS2l0IC0gVW5pVkJFIFNvZnR3YXJlIERldmVsb3BtZW50IEtpdAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBJQk0gUEMgKE1TIERPUykKKyoKKyogRGVzY3JpcHRpb246ICBSb3V0aW5lcyB0byBwcm92aWRlIGEgTGludXggZXZlbnQgcXVldWUsIHdoaWNoIGF1dG9tYXRpY2FsbHkKKyogICAgICAgICAgICAgICBoYW5kbGVzIGtleWJvYXJkIGFuZCBtb3VzZSBldmVudHMgZm9yIHRoZSBMaW51eCBjb21wYXRhYmlsaXR5CisqICAgICAgICAgICAgICAgbGlicmFyaWVzLiBCYXNlZCBvbiB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZSBpbiB0aGUgTUdMLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSA8Z3BtLmg+CisjaW5jbHVkZSAicG0uaCIKKyNpbmNsdWRlICJ2ZXNhdmJlLmgiCisjaW5jbHVkZSAid2RpcmVjdC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEVWRU5UUVNJWkUgIDEwMCAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZXZlbnRzIGluIGV2ZW50IHF1ZXVlICAqLworCitzdGF0aWMgaW50ICAgICAgaGVhZCA9IC0xOyAgICAgICAgICAvKiBIZWFkIG9mIGV2ZW50IHF1ZXVlICAgICAgICAgICAgICAqLworc3RhdGljIGludCAgICAgIHRhaWwgPSAtMTsgICAgICAgICAgLyogVGFpbCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgICAgICBmcmVlSGVhZCA9IC0xOyAgICAgIC8qIEhlYWQgb2YgZnJlZSBsaXN0ICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50ICAgICAgY291bnQgPSAwOyAgICAgICAgICAvKiBOby4gb2YgaXRlbXMgY3VycmVudGx5IGluIHF1ZXVlICAqLworc3RhdGljIFdEX2V2ZW50IGV2dHFbRVZFTlRRU0laRV07ICAgLyogVGhlIHF1ZXVlIHN0cnVjdHVyZSBpdHNlbGYgICAgICAqLworc3RhdGljIGludCAgICAgIG9sZE1vdmUgPSAtMTsgICAgICAgLyogUHJldmlvdXMgbW92ZW1lbnQgZXZlbnQgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgICAgICBvbGRLZXkgPSAtMTsgICAgICAgIC8qIFByZXZpb3VzIGtleSByZXBlYXQgZXZlbnQgICAgICAgICovCitzdGF0aWMgaW50ICAgICAgbXgsbXk7ICAgICAgICAgICAgICAvKiBDdXJyZW50IG1vdXNlIHBvc2l0aW9uICAgICAgICAgICAqLworc3RhdGljIGludCAgICAgIHhSZXMseVJlczsgICAgICAgICAgLyogU2NyZWVuIHJlc29sdXRpb24gY29vcmRpbmF0ZXMgICAgKi8KK3N0YXRpYyB2b2lkICAgICAqc3RhdGVCdWY7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY29uc29sZSBzdGF0ZSBidWZmZXIgICovCitzdGF0aWMgaW50ICAgICAgY29ubjsgICAgICAgICAgICAgICAvKiBHUE0gZmlsZSBkZXNjcmlwdG9yIGZvciBtb3VzZSBoYW5kbGluZyAqLworc3RhdGljIGludCAgICAgIHR0eV9mZDsgICAgICAgICAgICAgLyogRmlsZSBkZXNjcmlwdG9yIGZvciAvZGV2L2NvbnNvbGUgKi8KK2V4dGVybiBpbnQgICAgICB0dHlfdmM7ICAgICAgICAgICAgIC8qIFZpcnR1YWwgY29uc29sZSBJRCwgZnJvbSB0aGUgUE0vUHJvIGxpYnJhcnkgKi8KK3N0YXRpYyBpYm9vbCAgICBrZXlfZG93blsxMjhdOyAgICAgIC8qIFN0YXRlIG9mIGFsbCBrZXlib2FyZCBrZXlzICAgICAgICovCitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2xkX2NvbmY7ICAgICAvKiBTYXZlZCB0ZXJtaW5hbCBjb25maWd1cmF0aW9uICAgICAqLworc3RhdGljIGludCAgICAgIG9sZGtibW9kZTsgICAgICAgICAgLyogYW5kIHByZXZpb3VzIGtleWJvYXJkIG1vZGUgICAgICAgKi8KK3N0cnVjdCB2dF9tb2RlICBvbGR2dG1vZGU7ICAgICAgICAgIC8qIE9sZCB2aXJ0dWFsIHRlcm1pbmFsIG1vZGUgICAgICAgICovCitzdGF0aWMgaW50ICAgICAgb2xkX2ZsYWdzOyAgICAgICAgICAvKiBPbGQgZmxhZ3MgZm9yIGZjbnRsICAgICAgICAgICAgICAqLworc3RhdGljIHVsb25nICAgIGtleV9tb2RpZmllcnM7ICAgICAgLyogS2V5Ym9hcmQgbW9kaWZpZXJzICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgICAgICBmb3JiaWRfdnRfcmVsZWFzZT0wOy8qIEZsYWcgdG8gZm9yYmlkIHJlbGVhc2Ugb2YgVlQgICAgICovCitzdGF0aWMgaW50ICAgICAgZm9yYmlkX3Z0X2FjcXVpcmU9MDsvKiBGbGFnIHRvIGZvcmJpZCBjYXR1cmUgb2YgVlQgICAgICAqLworc3RhdGljIGludCAgICAgIG9sZG1vZGU7ICAgICAgICAgICAgLyogT2xkIFNWR0EgbW9kZSBzYXZlZCBmb3IgVlQgc3dpdGNoKi8KK3N0YXRpYyBpbnQgICAgICBpbml0bW9kZTsgICAgICAgICAgIC8qIEluaXRpYWwgdGV4dCBtb2RlICAgICAgICAgICAgICAgICovCitzdGF0aWMgaWJvb2wgICAgaW5zdGFsbGVkID0gZmFsc2U7ICAvKiBUcnVlIGlmIHdlIGFyZSBpbnN0YWxsZWQgICAgICAgICAqLworc3RhdGljIHZvaWQgICAgIChfQVNNQVBJICptb3ZlQ3Vyc29yKShpbnQgeCxpbnQgeSkgPSBOVUxMOworc3RhdGljIGludCAgICAgIChfQVNNQVBJICpzdXNwZW5kQXBwQ2FsbGJhY2spKGludCBmbGFncykgPSBOVUxMOworCisjaWYgMAorLyogS2V5Ym9hcmQgVHJhbnNsYXRpb24gdGFibGUgZnJvbSBzY2FuY29kZXMgdG8gQVNDSUkgKi8KKworc3RhdGljIHVjaGFyIGtleVRhYmxlWzEyOF0gPQorIlwwXDAzMzEyMzQ1Njc4OTAtPVwwMTAiCisiXDAxMXF3ZXJ0eXVpb3BbXVwwMTUiCisiXDBhc2RmZ2hqa2w7J2BcMFxcIgorInp4Y3Zibm0sLi9cMCpcMCBcMCIKKyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiICAgICAgLyogRnVuY3Rpb24ga2V5cyAqLworIjc4OS00NTYrMTIzMC5cMFwwXDBcMFwwIiAgICAgICAvKiBLZXlwYWQga2V5cyAqLworIlwwXDBcMFwwXDBcMFwwXDAxNVwwLyI7CisKK3N0YXRpYyB1Y2hhciBrZXlUYWJsZVNoaWZ0ZWRbMTI4XSA9CisiXDBcMDMzIUAjJCVeJiooKV8rXDAxMCIKKyJcMDExUVdFUlRZVUlPUHt9XDAxNSIKKyJcMEFTREZHSEpLTDpcIn5cMHwiCisiWlhDVkJOTTw+P1wwKlwwIFwwIgorIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIgICAgICAvKiBGdW5jdGlvbiBrZXlzICovCisiNzg5LTQ1NisxMjMwLlwwXDBcMFwwXDAiICAgICAgIC8qIEtleXBhZCBrZXlzICovCisiXDBcMFwwXDBcMFwwXDBcMDE1XDAvIjsKKyNlbmRpZgorCisvKiBNYWNyb3MgdG8ga2VlcCB0cmFjayBvZiB0aGUgQ0FQUyBhbmQgTlVNIGxvY2sgc3RhdGVzICovCisKKyNkZWZpbmUgRVZUX0NBUFNTVEFURSAgIDB4MDEwMAorI2RlZmluZSBFVlRfTlVNU1RBVEUgICAgMHgwMjAwCisKKy8qIEhlbHBlciBtYWNyb3MgZm9yIGRlYWxpbmcgd2l0aCB0aW1lcnMgKi8KKworI2RlZmluZSBUSUNLU19UT19VU0VDKHQpICgodCkqNjU1MzYuMC8xLjE5MzE4MCkKKyNkZWZpbmUgVVNFQ19UT19USUNLUyh1KSAoKHUpKjEuMTkzMTgwLzY1NTM2LjApCisKKy8qIE51bWJlciBvZiBrZXljb2RlcyB0byByZWFkIGF0IGEgdGltZSBmcm9tIHRoZSBjb25zb2xlICovCisKKyNkZWZpbmUgS0JEUkVBREJVRkZFUlNJWkUgMzIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgc3RhbXAgaW4gdW5pdHMgb2YgMTguMiB0aWNrcyBwZXIgc2Vjb25kLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBnZXRUaW1lU3RhbXAodm9pZCkKK3sKKyAgICByZXR1cm4gKHVsb25nKShjbG9jaygpIC8gKENMT0NLU19QRVJfU0VDIC8gMTguMikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2V2dCAtIEV2ZW50IHRvIHBsYWNlIG9udG8gZXZlbnQgcXVldWUKKworUkVNQVJLUzoKK0FkZHMgYW4gZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlIGJ5IHRhY2tpbmcgaXQgb250byB0aGUgdGFpbCBvZiB0aGUgZXZlbnQKK3F1ZXVlLiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGF0IGxlYXN0IG9uZSBzcG90IGlzIGF2YWlsYWJsZSBvbiB0aGUKK2ZyZWVMaXN0IGZvciB0aGUgZXZlbnQgdG8gYmUgaW5zZXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWRkRXZlbnQoCisgICAgV0RfZXZlbnQgKmV2dCkKK3sKKyAgICBpbnQgICAgICAgICBldnRJRDsKKworICAgIC8qIEdldCBzcG90IHRvIHBsYWNlIHRoZSBldmVudCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBldnRJRCA9IGZyZWVIZWFkOworICAgIGZyZWVIZWFkID0gZXZ0cVtmcmVlSGVhZF0ubmV4dDsKKworICAgIC8qIEFkZCB0byB0aGUgdGFpbCBvZiB0aGUgZXZlbnQgcXVldWUgICAqLworICAgIGV2dC0+bmV4dCA9IC0xOworICAgIGV2dC0+cHJldiA9IHRhaWw7CisgICAgaWYgKHRhaWwgIT0gLTEpCisgICAgICAgIGV2dHFbdGFpbF0ubmV4dCA9IGV2dElEOworICAgIGVsc2UKKyAgICAgICAgaGVhZCA9IGV2dElEOworICAgIHRhaWwgPSBldnRJRDsKKyAgICBldnRxW2V2dElEXSA9ICpldnQ7CisgICAgY291bnQrKzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cit3aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKK21lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZQorbW9kaWZpZXJzICAgLSBrZXlib2FyZCBtb2RpZmllcnMKK3ggICAgICAgICAgIC0gTW91c2UgWCBwb3NpdGlvbiBhdCB0aW1lIG9mIGV2ZW50Cit5ICAgICAgICAgICAtIE1vdXNlIFkgcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAorYnV0X3N0YXQgICAgLSBNb3VzZSBidXR0b24gc3RhdHVzIGF0IHRpbWUgb2YgZXZlbnQKKworUkVNQVJLUzoKK0FkZHMgYSBuZXcgbW91c2UgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20KK3dpdGhpbiB0aGUgbW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUsIHNvIGl0IG11c3QgYmUgZWZmaWNpZW50LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFkZE1vdXNlRXZlbnQoCisgICAgdWludCB3aGF0LAorICAgIHVpbnQgbWVzc2FnZSwKKyAgICBpbnQgeCwKKyAgICBpbnQgeSwKKyAgICB1aW50IGJ1dF9zdGF0KQoreworICAgIFdEX2V2ZW50ICAgIGV2dDsKKworICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgZXZ0LndoYXQgPSB3aGF0OworICAgICAgICBldnQud2hlbiA9IGdldFRpbWVTdGFtcCgpOworICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIGV2dC5tb2RpZmllcnMgPSBidXRfc3RhdCB8IGtleV9tb2RpZmllcnM7CisgICAgICAgIGV2dC53aGVyZV94ID0geDsKKyAgICAgICAgZXZ0LndoZXJlX3kgPSB5OworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglZCwlZCksIGJ1dHRvbnMgJWxkXG4iLCB4LHksIGV2dC5tb2RpZmllcnMpOworICAgICAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5jb2RlICAgIC0gUmF3IGtleWJvYXJkIHNjYW4gY29kZQorbW9kaWZpZXJzICAgLSBLZXlib2FyZCBtb2RpZmllcnMgZmxhZ3MKKworUkVNQVJLUzoKK0NvbnZlcnRzIHRoZSByYXcgc2NhbiBjb2RlIGludG8gdGhlIGFwcHJvcHJpYXRlIEFTQ0lJIGNvZGUgdXNpbmcgdGhlIHNjYW4KK2NvZGUgYW5kIHRoZSBrZXlib2FyZCBtb2RpZmllciBmbGFncy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgZ2V0S2V5TWVzc2FnZSgKKyAgICB1aW50IHNjYW5jb2RlLAorICAgIHVsb25nIG1vZGlmaWVycykKK3sKKyAgICB1c2hvcnQgIGNvZGUgPSBzY2FuY29kZSA8PCA4OworICAgIHVzaG9ydCAgYXNjaWk7CisgICAgc3RydWN0IGtiZW50cnkga2U7CisKKyAgICBrZS5rYl9pbmRleCA9IHNjYW5jb2RlOworCisgICAgLyogRmluZCB0aGUgYmFzaWMgQVNDSUkgY29kZSBmb3IgdGhlIHNjYW4gY29kZSAqLworICAgIGlmIChtb2RpZmllcnMgJiBFVlRfQ0FQU1NUQVRFKSB7CisgICAgICAgIGlmIChtb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpCisgICAgICAgICAga2Uua2JfdGFibGUgPSBLX05PUk1UQUI7CisgICAgICAgIC8vICAgICAgICAgIGFzY2lpID0gdG9sb3dlcihrZXlUYWJsZVNoaWZ0ZWRbc2NhbmNvZGVdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19TSElGVFRBQjsKKyAgICAgICAgLy8gICAgICAgICAgYXNjaWkgPSB0b3VwcGVyKGtleVRhYmxlW3NjYW5jb2RlXSk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkKKyAgICAgICAgICBrZS5rYl90YWJsZSA9IEtfU0hJRlRUQUI7CisgICAgICAgICAgLy8gYXNjaWkgPSBrZXlUYWJsZVNoaWZ0ZWRbc2NhbmNvZGVdOworICAgICAgICBlbHNlCisgICAgICAgICAga2Uua2JfdGFibGUgPSBLX05PUk1UQUI7CisgICAgICAgICAgLy8gYXNjaWkgPSBrZXlUYWJsZVtzY2FuY29kZV07CisgICAgICAgIH0KKyAgICBpZihtb2RpZmllcnMgJiBFVlRfQUxUU1RBVEUpCisgICAgICBrZS5rYl90YWJsZSB8PSBLX0FMVFRBQjsKKworICAgIGlmIChpb2N0bCh0dHlfZmQsIEtER0tCRU5ULCAodW5zaWduZWQgbG9uZykma2UpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiS0RHS0JFTlQgYXQgaW5kZXggJWQgaW4gdGFibGUgJWQ6ICIsCisgICAgICAgICAgICBzY2FuY29kZSwga2Uua2JfdGFibGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXNjaWkgPSBrZS5rYl92YWx1ZTsKKworICAgIC8qIEFkZCBBU0NJSSBjb2RlIGlmIGtleSBpcyBub3QgYWx0J2VkIG9yIGN0cmwnZWQgKi8KKyAgICBpZiAoIShtb2RpZmllcnMgJiAoRVZUX0FMVFNUQVRFIHwgRVZUX0NUUkxTVEFURSkpKQorICAgICAgICBjb2RlIHw9IGFzY2lpOworCisgICAgcmV0dXJuIGNvZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgord2hhdCAgICAgICAgLSBFdmVudCBjb2RlCitzY2FuY29kZSAgICAtIFJhdyBzY2FuY29kZSBvZiBrZXlib2FyZCBldmVudCB0byBhZGQKKworUkVNQVJLUzoKK0FkZHMgYSBuZXcga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBXZSBvbmx5IHRha2UgS0VZVVAgYW5kCitLRVlET1dOIGV2ZW50IGNvZGVzLCBob3dldmVyIGlmIGEga2V5IGlzIGFscmVhZHkgZG93biB3ZSBjb252ZXJ0IHRoZSBLRVlET1dOCit0byBhIEtFWVJFUEVBVC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhZGRLZXlFdmVudCgKKyAgICB1aW50IHdoYXQsCisgICAgdWludCBzY2FuY29kZSkKK3sKKyAgICBXRF9ldmVudCAgICBldnQ7CisKKyAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgIGV2dC53aGF0ID0gd2hhdDsKKyAgICAgICAgZXZ0LndoZW4gPSBnZXRUaW1lU3RhbXAoKTsKKyAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBnZXRLZXlNZXNzYWdlKHNjYW5jb2RlLGtleV9tb2RpZmllcnMpIHwgMHgxMDAwMFVMOworICAgICAgICBldnQud2hlcmVfeCA9IGV2dC53aGVyZV95ID0gMDsKKyAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IGtleV9tb2RpZmllcnM7CisgICAgICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZVVApCisgICAgICAgICAgICBrZXlfZG93bltzY2FuY29kZV0gPSBmYWxzZTsKKyAgICAgICAgZWxzZSBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWURPV04pIHsKKyAgICAgICAgICAgIGlmIChrZXlfZG93bltzY2FuY29kZV0pIHsKKyAgICAgICAgICAgICAgICBpZiAob2xkS2V5ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dHFbb2xkS2V5XS5tZXNzYWdlICs9IDB4MTAwMDBVTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7CisgICAgICAgICAgICAgICAgICAgIG9sZEtleSA9IGZyZWVIZWFkOworICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgb2xkTW92ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleV9kb3duW3NjYW5jb2RlXSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgIG9sZE1vdmUgPSAtMTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NpZyAtIFNpZ25hbCBiZWluZyBzZW50IHRvIHRoaXMgc2lnbmFsIGhhbmRsZXIKKworUkVNQVJLUzoKK1NpZ25hbCBoYW5kbGVyIGZvciB0aGUgdGltZXIuIFRoaXMgcm91dGluZSB0YWtlcyBjYXJlIG9mIHBlcmlvZGljYWxseQorcG9zdGluZyB0aW1lciBldmVudHMgdG8gdGhlIGV2ZW50IHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGltZXJIYW5kbGVyKAorICAgIGludCBzaWcpCit7CisgICAgV0RfZXZlbnQgICAgZXZ0OworCisgICAgaWYgKHNpZyA9PSBTSUdBTFJNKSB7CisgICAgICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7CisgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9USU1FUlRJQ0s7CisgICAgICAgICAgICBldnQubWVzc2FnZSA9IDA7CisgICAgICAgICAgICBldnQud2hlcmVfeCA9IGV2dC53aGVyZV95ID0gMDsKKyAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgPSAwOworICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICBvbGRNb3ZlID0gLTE7CisgICAgICAgICAgICBvbGRLZXkgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgc2lnbmFsKFNJR0FMUk0sIHRpbWVySGFuZGxlcik7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSB0ZXJtaW5hbCB0byBub3JtYWwgb3BlcmF0aW9uIG9uIGV4aXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCByZXN0b3JlX3Rlcm0odm9pZCkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICBpZiAoaW5zdGFsbGVkKSB7CisgICAgICAgIC8qIFJlc3RvcmUgdGV4dCBtb2RlIGFuZCB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgKi8KKyAgICAgICAgcmVncy54LmF4ID0gMHgzOworICAgICAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1Zix0dHlfZmQpOworCisgICAgICAgIC8qIFJlc3RvcmUgY29uc29sZSB0byBub3JtYWwgb3BlcmF0aW9uICovCisgICAgICAgIGlvY3RsKHR0eV9mZCwgVlRfU0VUTU9ERSwgJm9sZHZ0bW9kZSk7CisgICAgICAgIGlvY3RsKHR0eV9mZCwgS0RTS0JNT0RFLCBvbGRrYm1vZGUpOworICAgICAgICB0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRkxVU0gsICZvbGRfY29uZik7CisgICAgICAgIGZjbnRsKHR0eV9mZCxGX1NFVEZMLG9sZF9mbGFncyAmPSB+T19OT05CTE9DSyk7CisgICAgICAgIFBNX2Nsb3NlQ29uc29sZSh0dHlfZmQpOworCisgICAgICAgIC8qIENsb3NlIHRoZSBtb3VzZSBkcml2ZXIgKi8KKyAgICAgICAgY2xvc2UoY29ubik7CisKKyAgICAgICAgLyogRmxhZyB0aGF0IHdlIGFyZSBub3Qgbm8gbG9uZ2VyIGluc3RhbGxlZCAqLworICAgICAgICBpbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NpZ25hbCBoYW5kbGVyIHRvIGNhcHR1cmUgZm9yY2VkIHByb2dyYW0gdGVybWluYXRpb24gY29uZGl0aW9ucyBzbyB0aGF0Cit3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXhpdEhhbmRsZXIoaW50IHNpZykKK3sKKyAgICBleGl0KC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTbGVlcCB1bnRpbCB0aGUgdmlydHVhbCB0ZXJtaW5hbCBpcyBhY3RpdmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfdnRfYWN0aXZlKHZvaWQpCit7CisgICAgd2hpbGUgKGlvY3RsKHR0eV9mZCwgVlRfV0FJVEFDVElWRSwgdHR5X3ZjKSA8IDApIHsKKyAgICAgICAgaWYgKChlcnJubyAhPSBFQUdBSU4pICYmIChlcnJubyAhPSBFSU5UUikpIHsKKyAgICAgICAgICAgIHBlcnJvcigiaW9jdGwoVlRfV0FJVEFDVElWRSkiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxNTAwMDApOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2lnbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gb3VyIHZpcnR1YWwgdGVybWluYWwgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIHdlIGFyZQorbG9zaW5nIHRoZSBhY3RpdmUgZm9jdXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmVsZWFzZV92dF9zaWduYWwoaW50IG4pCit7CisgICAgZm9yYmlkX3Z0X2FjcXVpcmUgPSAxOworICAgIGlmIChmb3JiaWRfdnRfcmVsZWFzZSkgeworICAgICAgICBmb3JiaWRfdnRfYWNxdWlyZSA9IDA7CisgICAgICAgIGlvY3RsKHR0eV9mZCwgVlRfUkVMRElTUCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgLy8gVE9ETzogQ2FsbCB0aGUgdXNlciBzdXBwbGllZCBzdXNwZW5kQXBwQ2FsbGJhY2sgYW5kIHJlc3RvcmUgdGV4dAorICAgIC8vICAgICAgIG1vZGUgKHNhdmluZyB0aGUgZXhpc3RpbmcgbW9kZSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCkuCisgICAgLy8KKyAgICAvLyAgICAgICBBbHNvIGlmIHRoZSBzdXNwZW5kQXBwQ2FsbGJhY2sgaXMgTlVMTCB0aGVuIHdlIGhhdmUgdG8KKyAgICAvLyAgICAgICBpZ25vcmUgdGhlIHN3aXRjaCByZXF1ZXN0IQorICAgIGlmKHN1c3BlbmRBcHBDYWxsYmFjayl7CisgICAgICBvbGRtb2RlID0gVkJFX2dldFZpZGVvTW9kZSgpOworICAgICAgc3VzcGVuZEFwcENhbGxiYWNrKHRydWUpOworICAgICAgVkJFX3NldFZpZGVvTW9kZShpbml0bW9kZSk7CisgICAgfQorCisgICAgaW9jdGwodHR5X2ZkLCBWVF9SRUxESVNQLCAxKTsKKyAgICBmb3JiaWRfdnRfYWNxdWlyZSA9IDA7CisgICAgd2FpdF92dF9hY3RpdmUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTaWduYWwgaGFuZGxlciBjYWxsZWQgd2hlbiBvdXIgdmlydHVhbCB0ZXJtaW5hbCBoYXMgYmVlbiByZS1hcXVpcmVkIGFuZCB3ZQorYXJlIG5vdyByZWdhaWluZyB0aGUgYWN0aXZlIGZvY3VzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFjcXVpcmVfdnRfc2lnbmFsKGludCBuKQoreworICAgIGZvcmJpZF92dF9yZWxlYXNlID0gMTsKKyAgICBpZiAoZm9yYmlkX3Z0X2FjcXVpcmUpIHsKKyAgICAgICAgZm9yYmlkX3Z0X3JlbGVhc2UgPSAwOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIC8vIFRPRE86IFJlc3RvcmUgdGhlIG9sZCBkaXNwbGF5IG1vZGUsIGNhbGwgdGhlIHVzZXIgc3VzcGVuZEFwcENhbGxiYWNrCisgICAgLy8gICAgICAgYW5kIGFuZCB3ZSB3aWxsIGJlIGJhY2sgaW4gZ3JhcGhpY3MgbW9kZS4KKworICAgIGlmKHN1c3BlbmRBcHBDYWxsYmFjayl7CisgICAgICBWQkVfc2V0VmlkZW9Nb2RlKG9sZG1vZGUpOworICAgICAgc3VzcGVuZEFwcENhbGxiYWNrKGZhbHNlKTsKKyAgICB9CisKKyAgICBpb2N0bCh0dHlfZmQsIFZUX1JFTERJU1AsIFZUX0FDS0FDUSk7CisgICAgZm9yYmlkX3Z0X3JlbGVhc2UgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgYWN0aW9uIGZvciBhIHNwZWNpZmljIHNpZ25hbCB0byBjYWxsIG91ciBzaWduYWwgaGFuZGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzZXRfc2lnYWN0aW9uKGludCBzaWcsdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiAgICBzaWdhOworCisgICAgc2lnYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKyAgICBzaWdhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKyAgICBtZW1zZXQoJihzaWdhLnNhX21hc2spLCAwLCBzaXplb2Yoc2lnc2V0X3QpKTsKKyAgICBzaWdhY3Rpb24oc2lnLCAmc2lnYSwgTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gdGFrZSBvdmVyIGNvbnRyb2wgb2YgVlQgc3dpdGNoaW5nIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUKK3ZpcnR1YWwgdGVybWluYWwgcmVsZWFzZSBhbmQgYXF1aXJlIHNpZ25hbHMsIGFsbG93aW5nIHVzIHRvIHByb3Blcmx5CitzdXBwb3J0IFZUIHN3aXRjaGluZyB3aGlsZSBpbiBncmFwaGljcyBtb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0YWtlX3Z0X2NvbnRyb2wodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdnRfbW9kZSAgICAgIHZ0bW9kZTsKKworICAgIGlvY3RsKHR0eV9mZCwgVlRfR0VUTU9ERSwgJnZ0bW9kZSk7CisgICAgb2xkdnRtb2RlID0gdnRtb2RlOworICAgIHZ0bW9kZS5tb2RlID0gVlRfUFJPQ0VTUzsKKyAgICB2dG1vZGUucmVsc2lnID0gU0lHVVNSMTsKKyAgICB2dG1vZGUuYWNxc2lnID0gU0lHVVNSMjsKKyAgICBzZXRfc2lnYWN0aW9uKFNJR1VTUjEsIHJlbGVhc2VfdnRfc2lnbmFsKTsKKyAgICBzZXRfc2lnYWN0aW9uKFNJR1VTUjIsIGFjcXVpcmVfdnRfc2lnbmFsKTsKKyAgICBpb2N0bCh0dHlfZmQsIFZUX1NFVE1PREUsICZvbGR2dG1vZGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgc2hpZnQga2V5Ym9hcmQgTEVEJ3MgYmFzZWQgb24gdGhlIGN1cnJlbnQga2V5Ym9hcmQgbW9kaWZpZXJzIGZsYWdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZUxFRFN0YXR1cyh2b2lkKQoreworICAgIGludCBzdGF0ZSA9IDA7CisgICAgaWYgKGtleV9tb2RpZmllcnMgJiBFVlRfQ0FQU1NUQVRFKQorICAgICAgICBzdGF0ZSB8PSBMRURfQ0FQOworICAgIGlmIChrZXlfbW9kaWZpZXJzICYgRVZUX05VTVNUQVRFKQorICAgICAgICBzdGF0ZSB8PSBMRURfTlVNOworICAgIGlvY3RsKHR0eV9mZCxLRFNFVExFRCxzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbmNvZGUgICAgLSBSYXcgc2NhbiBjb2RlIHRvIGhhbmRsZQorCitSRU1BUktTOgorSGFuZGxlcyB0aGUgc2hpZnQga2V5IG1vZGlmaWVycyBhbmQga2VlcHMgdHJhY2sgb2YgdGhlIHNoaWZ0IGtleSBzdGF0ZXMKK3NvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgY29ycmVjdCBBU0NJSSBjb2RlcyBmb3IgdGhlIGtleWJvYXJkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRvZ2dsZU1vZGlmaWVycygKKyAgICBpbnQgc2NhbmNvZGUpCit7CisgICAgc3RhdGljIGludCBjYXBzX2Rvd24gPSAwLG51bV9kb3duID0gMDsKKworICAgIGlmIChzY2FuY29kZSAmIDB4ODApIHsKKyAgICAgICAgLyogSGFuZGxlIGtleS1yZWxlYXNlIGZ1bmN0aW9uICovCisgICAgICAgIHNjYW5jb2RlICY9IDB4N0Y7CisgICAgICAgIGlmIChzY2FuY29kZSA9PSAweDJBIHx8IHNjYW5jb2RlID09IDB4MzYpCisgICAgICAgICAgICBrZXlfbW9kaWZpZXJzICY9IH5FVlRfU0hJRlRLRVk7CisgICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4MUQgfHwgc2NhbmNvZGUgPT0gMHg2MSkKKyAgICAgICAgICAgIGtleV9tb2RpZmllcnMgJj0gfkVWVF9DVFJMU1RBVEU7CisgICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4MzggfHwgc2NhbmNvZGUgPT0gMHg2NCkKKyAgICAgICAgICAgIGtleV9tb2RpZmllcnMgJj0gfkVWVF9BTFRTVEFURTsKKyAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgzQSkKKyAgICAgICAgICAgIGNhcHNfZG93biA9IGZhbHNlOworICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDQ1KQorICAgICAgICAgICAgbnVtX2Rvd24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBIYW5kbGUga2V5LWRvd24gZnVuY3Rpb24gKi8KKyAgICAgICAgc2NhbmNvZGUgJj0gMHg3RjsKKyAgICAgICAgaWYgKHNjYW5jb2RlID09IDB4MkEgfHwgc2NhbmNvZGUgPT0gMHgzNikKKyAgICAgICAgICAgIGtleV9tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOworICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDFEIHx8IHNjYW5jb2RlID09IDB4NjEpCisgICAgICAgICAgICBrZXlfbW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7CisgICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4MzggfHwgc2NhbmNvZGUgPT0gMHg2NCkKKyAgICAgICAgICAgIGtleV9tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOworICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDNBKSB7CisgICAgICAgICAgICBpZiAoIWNhcHNfZG93bikgeworICAgICAgICAgICAgICAgIGtleV9tb2RpZmllcnMgXj0gRVZUX0NBUFNTVEFURTsKKyAgICAgICAgICAgICAgICB1cGRhdGVMRURTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXBzX2Rvd24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDQ1KSB7CisgICAgICAgICAgICBpZiAoIW51bV9kb3duKSB7CisgICAgICAgICAgICAgICAga2V5X21vZGlmaWVycyBePSBFVlRfTlVNU1RBVEU7CisgICAgICAgICAgICAgICAgdXBkYXRlTEVEU3RhdHVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX2Rvd24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGhhdmUgY2hhbmdlZCBmcm9tIDAgdG8gMQorKGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgaGF2ZSBjaGFuZ2VkIGZyb20gMSB0byAwKSAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY29tcGFyZUJpdHMoc2hvcnQgYSwgc2hvcnQgYikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiggKGEmMSkgIT0gKGImMSkgKSByZXQgKz0gKGImMSkgPyAxIDogLTE7CisgICAgaWYoIChhJjIpICE9IChiJjIpICkgcmV0ICs9IChiJjIpID8gMSA6IC0xOworICAgIGlmKCAoYSY0KSAhPSAoYiY0KSApIHJldCArPSAoYiY0KSA/IDEgOiAtMTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVHVybnMgb2ZmIGFsbCBrZXlib2FyZCBzdGF0ZSBiZWNhdXNlIHdlIGNhbid0IHJlbHkgb24gdGhlbSBhbnltb3JlIGFzIHNvb24KK2FzIHdlIHN3aXRjaCBWVCdzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBrZXlib2FyZF9jbGVhcnN0YXRlKHZvaWQpCit7CisgIGtleV9tb2RpZmllcnMgPSAwOworICBtZW1zZXQoa2V5X2Rvd24sIDAsIHNpemVvZihrZXlfZG93bikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1bXBzIGFsbCBldmVudHMgZnJvbSB0aGUgY29uc29sZSBldmVudCBxdWV1ZSBpbnRvIHRoZSBXaW5EaXJlY3QgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcHVtcEV2ZW50cyh2b2lkKQoreworICAgIHN0YXRpYyB1Y2hhciAgICBidWZbS0JEUkVBREJVRkZFUlNJWkVdOworICAgIHN0YXRpYyBjaGFyICAgICBkYXRhWzVdOworICAgIHN0YXRpYyBpbnQgICAgICBvbGRfYnV0cywgb2xkX214LCBvbGRfbXk7CisgICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgZmRfc2V0IGZkczsKKyAgICBpbnQgICAgICAgICAgICAgbnVta2V5cyxpOworICAgIGludCAgICAgICAgICAgICBkeCwgZHksIGJ1dHM7CisKKyAgICAvKiBSZWFkIGFsbCBwZW5kaW5nIGtleXByZXNzZXMgZnJvbSBrZXlib2FyZCBidWZmZXIgYW5kIHByb2Nlc3MgKi8KKyAgICB3aGlsZSAoKG51bWtleXMgPSByZWFkKHR0eV9mZCwgYnVmLCBLQkRSRUFEQlVGRkVSU0laRSkpID4gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7CisgICAgICAgICAgICB0b2dnbGVNb2RpZmllcnMoYnVmW2ldKTsKKyAgICAgICAgICAgIGlmIChrZXlfbW9kaWZpZXJzICYgRVZUX0FMVFNUQVRFKXsKKyAgICAgICAgICAgICAgaW50IGZrZXkgPSAwOworCisgICAgICAgICAgICAgIC8vIERvIFZUIHN3aXRjaGluZyBoZXJlIGZvciBBbHQrRngga2V5cHJlc3NlcworICAgICAgICAgICAgICBzd2l0Y2goYnVmW2ldICYgMHg3Ril7CisgICAgICAgICAgICAgIGNhc2UgNTkgLi4uIDY4OiAvKiBGMSB0byBGMTAgKi8KKyAgICAgICAgICAgICAgICBma2V5ID0gKGJ1ZltpXSAmIDB4N0YpIC0gNTg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgODc6IC8qIEYxMSAqLworICAgICAgICAgICAgICBjYXNlIDg4OiAvKiBGMTIgKi8KKyAgICAgICAgICAgICAgICBma2V5ID0gKGJ1ZltpXSAmIDB4N0YpIC0gNzY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYoZmtleSl7CisgICAgICAgICAgICAgICAgc3RydWN0IHZ0X3N0YXQgdnRzOworICAgICAgICAgICAgICAgIGlvY3RsKHR0eV9mZCwgVlRfR0VUU1RBVEUsICZ2dHMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKGZrZXkgIT0gdnRzLnZfYWN0aXZlKXsKKyAgICAgICAgICAgICAgICAgIGtleWJvYXJkX2NsZWFyc3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgIGlvY3RsKHR0eV9mZCwgVlRfQUNUSVZBVEUsIGZrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmW2ldICYgMHg4MCkKKyAgICAgICAgICAgICAgICBhZGRLZXlFdmVudChFVlRfS0VZVVAsYnVmW2ldICYgMHg3Rik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkS2V5RXZlbnQoRVZUX0tFWURPV04sYnVmW2ldICYgMHg3Rik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSWYgd2Ugd2FudCB0byBoYW5kbGUgVkMgc3dpdGNoaW5nIHdlIHdpbGwgbmVlZCB0byBkbyBpdAorICAgICAgICAvLyAgICAgICBpbiBoZXJlIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBhd2F5IGZyb20gdGhlIFZDIGFuZCB0aGVuCisgICAgICAgIC8vICAgICAgIHN3aXRjaCBiYWNrIHRvIGl0IGxhdGVyLiBSaWdodCBub3cgVkMgc3dpdGNoaW5nIGlzIGRpc2FibGVkCisgICAgICAgIC8vICAgICAgIGFuZCBpbiBvcmRlciB0byBlbmFibGUgaXQgd2UgbmVlZCB0byBzYXZlL3Jlc3RvcmUgdGhlIHN0YXRlCisgICAgICAgIC8vICAgICAgIG9mIHRoZSBncmFwaGljcyBzY3JlZW4gKHVzaW5nIHRoZSBzdXNwZW5kQXBwQ2FsbGJhY2sgYW5kCisgICAgICAgIC8vICAgICAgIHNhdmluZy9yZXN0b3JpbmcgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZSkuCisKKyAgICAgICAgfQorCisgICAgLyogUmVhZCBhbGwgcGVuZGluZyBtb3VzZSBldmVudHMgYW5kIHByb2Nlc3MgdGhlbSAqLworICAgIGlmKGNvbm4gPiAwKXsKKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKGNvbm4sICZmZHMpOworICAgICAgICB0LnR2X3NlYyA9IHQudHZfdXNlYyA9IDBMOworICAgICAgICB3aGlsZSAoc2VsZWN0KGNvbm4rMSwgJmZkcywgTlVMTCwgTlVMTCwgJnQpID4gMCkgeworICAgICAgICAgICAgaWYocmVhZChjb25uLCBkYXRhLCA1KSA9PSA1KXsKKyAgICAgICAgICAgICAgICBidXRzID0gKH5kYXRhWzBdKSAmIDB4MDc7CisgICAgICAgICAgICAgICAgZHggPSAoY2hhcikoZGF0YVsxXSkgKyAoY2hhcikoZGF0YVszXSk7CisgICAgICAgICAgICAgICAgZHkgPSAtKChjaGFyKShkYXRhWzJdKSArIChjaGFyKShkYXRhWzRdKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbXggKz0gZHg7IG15ICs9IGR5OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChkeCB8fCBkeSkKKyAgICAgICAgICAgICAgICAgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VNT1ZFLCAwLCBteCwgbXksIGJ1dHMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChidXRzICE9IG9sZF9idXRzKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBjb21wYXJlQml0cyhidXRzLG9sZF9idXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoYz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VET1dOLCAwLCBteCwgbXksIGJ1dHMpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM8MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFVVAsIDAsIG14LCBteSwgYnV0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9sZF9teCA9IG14OyBvbGRfbXkgPSBteTsKKyAgICAgICAgICAgICAgICBvbGRfYnV0cyA9IGJ1dHM7CisgICAgICAgICAgICAgICAgRkRfU0VUKGNvbm4sICZmZHMpOworICAgICAgICAgICAgICAgIHQudHZfc2VjID0gdC50dl91c2VjID0gMEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBpbnRlcmZhY2Ugcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgord2hpY2ggICAgICAgLSBXaGljaCBjb2RlIGZvciBldmVudCB0byBwb3N0Cit3aGF0ICAgICAgICAtIEV2ZW50IGNvZGUgZm9yIGV2ZW50IHRvIHBvc3QKK21lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZQorbW9kaWZpZXJzICAgLSBTaGlmdCBrZXkvbW91c2UgYnV0dG9uIG1vZGlmaWVycworCitSRVRVUk5TOgorVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHBvc3RlZCwgZmFsc2UgaWYgcXVldWUgaXMgZnVsbC4KKworUkVNQVJLUzoKK1Bvc3RzIGFuIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyByb3V0aW5lIGNhbiBiZSB1c2VkIHRvIHBvc3QgYW55IHR5cGUKK29mIGV2ZW50IGludG8gdGhlIHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIF9XREFQSSBXRF9wb3N0RXZlbnQoCisgICAgdWxvbmcgd2hpY2gsCisgICAgdWludCB3aGF0LAorICAgIHVsb25nIG1lc3NhZ2UsCisgICAgdWxvbmcgbW9kaWZpZXJzKQoreworICAgIFdEX2V2ZW50ICAgIGV2dDsKKworICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQgKi8KKyAgICAgICAgZXZ0LndoaWNoID0gd2hpY2g7CisgICAgICAgIGV2dC53aGF0ID0gd2hhdDsKKyAgICAgICAgZXZ0LndoZW4gPSBnZXRUaW1lU3RhbXAoKTsKKyAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICBldnQubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21hc2sgICAgLSBFdmVudCBtYXNrIHRvIHVzZQorCitSRU1BUktTOgorRmx1c2hlcyBhbGwgdGhlIGV2ZW50IHNwZWNpZmllZCBpbiAnbWFzaycgZnJvbSB0aGUgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfV0RBUEkgV0RfZmx1c2hFdmVudCgKKyAgICB1aW50IG1hc2spCit7CisgICAgV0RfZXZlbnQgICAgZXZ0OworCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBhbGwgZXZlbnRzICovCisgICAgICAgIFdEX2dldEV2ZW50KCZldnQsbWFzayk7CisgICAgICAgIH0gd2hpbGUgKGV2dC53aGF0ICE9IEVWVF9OVUxMRVZUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitldnQgICAgIC0gUGxhY2UgdG8gc3RvcmUgZXZlbnQKK21hc2sgICAgLSBFdmVudCBtYXNrIHRvIHVzZQorCitSRU1BUktTOgorSGFsdHMgcHJvZ3JhbSBleGVjdXRpb24gdW50aWwgYSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLiBUaGUgZXZlbnQgaXMKK3JldHVybmVkLiBBbGwgcGVuZGluZyBldmVudHMgbm90IGluIHRoZSBzcGVjaWZpZWQgbWFzayB3aWxsIGJlIGlnbm9yZWQgYW5kCityZW1vdmVkIGZyb20gdGhlIHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1dEQVBJIFdEX2hhbHRFdmVudCgKKyAgICBXRF9ldmVudCAqZXZ0LAorICAgIHVpbnQgbWFzaykKK3sKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIGFuIGV2ZW50ICAgICovCisgICAgICAgIFdEX2dldEV2ZW50KGV2dCxFVlRfRVZFUllFVlQpOworICAgICAgICB9IHdoaWxlICghKGV2dC0+d2hhdCAmIG1hc2spKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitldnQgICAgIC0gUGxhY2UgdG8gc3RvcmUgZXZlbnQKK21hc2sgICAgLSBFdmVudCBtYXNrIHRvIHVzZQorCitSRVRVUk5TOgorVHJ1ZSBpZiBhbiBldmVudCB3YXMgcGVuZGluZy4KKworUkVNQVJLUzoKK1JldHJpZXZlcyB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IGRlZmluZWQgaW4gJ21hc2snIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgorVGhlIGV2ZW50IHF1ZXVlIGlzIGFkanVzdGVkIHRvIHJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBhZnRlciB0aGUgZXZlbnQgaGFzCitiZWVuIHJlbW92ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgX1dEQVBJIFdEX2dldEV2ZW50KAorICAgIFdEX2V2ZW50ICpldnQsCisgICAgdWludCBtYXNrKQoreworICAgIGludCAgICAgZXZ0SUQsbmV4dCxwcmV2OworCisgICAgcHVtcEV2ZW50cygpOworICAgIGlmIChtb3ZlQ3Vyc29yKQorICAgICAgICBtb3ZlQ3Vyc29yKG14LG15KTsgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgKi8KKyAgICBldnQtPndoYXQgPSBFVlRfTlVMTEVWVDsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICovCisKKyAgICBpZiAoY291bnQpIHsKKyAgICAgICAgZm9yIChldnRJRCA9IGhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IGV2dHFbZXZ0SURdLm5leHQpIHsKKyAgICAgICAgICAgIGlmIChldnRxW2V2dElEXS53aGF0ICYgbWFzaykKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgYW4gZXZlbnQgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIGlmIChldnRJRCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgLyogRXZlbnQgd2FzIG5vdCBmb3VuZCAgICAgICovCisgICAgICAgIG5leHQgPSBldnRxW2V2dElEXS5uZXh0OworICAgICAgICBwcmV2ID0gZXZ0cVtldnRJRF0ucHJldjsKKyAgICAgICAgaWYgKHByZXYgIT0gLTEpCisgICAgICAgICAgICBldnRxW3ByZXZdLm5leHQgPSBuZXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkID0gbmV4dDsKKyAgICAgICAgaWYgKG5leHQgIT0gLTEpCisgICAgICAgICAgICBldnRxW25leHRdLnByZXYgPSBwcmV2OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0YWlsID0gcHJldjsKKyAgICAgICAgKmV2dCA9IGV2dHFbZXZ0SURdOyAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBldmVudCAgICAgICAgICovCisgICAgICAgIGV2dHFbZXZ0SURdLm5leHQgPSBmcmVlSGVhZDsgICAgICAgIC8qIGFuZCByZXR1cm4gdG8gZnJlZSBsaXN0ICAqLworICAgICAgICBmcmVlSGVhZCA9IGV2dElEOworICAgICAgICBjb3VudC0tOworICAgICAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9NT1VTRU1PVkUpCisgICAgICAgICAgICBvbGRNb3ZlID0gLTE7CisgICAgICAgIGlmIChldnQtPndoYXQgPT0gRVZUX0tFWVJFUEVBVCkKKyAgICAgICAgICAgIG9sZEtleSA9IC0xOworICAgICAgICB9CisgICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitldnQgICAgIC0gUGxhY2UgdG8gc3RvcmUgZXZlbnQKK21hc2sgICAgLSBFdmVudCBtYXNrIHRvIHVzZQorCitSRVRVUk5TOgorVHJ1ZSBpZiBhbiBldmVudCBpcyBwZW5kaW5nLgorCitSRU1BUktTOgorUGVla3MgYXQgdGhlIG5leHQgcGVuZGluZyBldmVudCBkZWZpbmVkIGluICdtYXNrJyBpbiB0aGUgZXZlbnQgcXVldWUuIFRoZQorZXZlbnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgX1dEQVBJIFdEX3BlZWtFdmVudCgKKyAgICBXRF9ldmVudCAqZXZ0LAorICAgIHVpbnQgbWFzaykKK3sKKyAgICBpbnQgICAgIGV2dElEOworCisgICAgcHVtcEV2ZW50cygpOworICAgIGlmIChtb3ZlQ3Vyc29yKQorICAgICAgICBtb3ZlQ3Vyc29yKG14LG15KTsgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgKi8KKyAgICBldnQtPndoYXQgPSBFVlRfTlVMTEVWVDsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICovCisKKyAgICBpZiAoY291bnQpIHsKKyAgICAgICAgZm9yIChldnRJRCA9IGhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IGV2dHFbZXZ0SURdLm5leHQpIHsKKyAgICAgICAgICAgIGlmIChldnRxW2V2dElEXS53aGF0ICYgbWFzaykKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgYW4gZXZlbnQgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIGlmIChldnRJRCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgLyogRXZlbnQgd2FzIG5vdCBmb3VuZCAgICAgICovCisKKyAgICAgICAgKmV2dCA9IGV2dHFbZXZ0SURdOyAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBldmVudCAgICAgICAgICovCisgICAgICAgIH0KKyAgICByZXR1cm4gZXZ0LT53aGF0ICE9IEVWVF9OVUxMRVZUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2h3bmRNYWluICAgIC0gSGFuZGxlIHRvIG1haW4gd2luZG93CitfeFJlcyAgICAgICAtIFggcmVzb2x1dGlvbiBvZiBncmFwaGljcyBtb2RlIHRvIGJlIHVzZWQKK195UmVzICAgICAgIC0gWSByZXNvbHVsaW9uIG9mIGdyYXBoaWNzIG1vZGUgdG8gYmUgdXNlZAorCitSRVRVUk5TOgorSGFuZGxlIHRvIHRoZSBmdWxsc2NyZWVuIGV2ZW50IHdpbmRvdyBpZiAod2UgcmV0dXJuIGh3bmRNYWluIG9uIExpbnV4KQorCitSRU1BUktTOgorSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nCitJU1IgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbworYnVpbGQgdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dEX0hXTkQgX1dEQVBJIFdEX3N0YXJ0RnVsbFNjcmVlbigKKyAgICBXRF9IV05EIGh3bmRNYWluLAorICAgIGludCBfeFJlcywKKyAgICBpbnQgX3lSZXMpCit7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgc3RydWN0IHRlcm1pb3MgIGNvbmY7CisgICAgaWYgKCFpbnN0YWxsZWQpIHsKKyAgICAgICAgR3BtX0Nvbm5lY3QgZ3BtOworCisgICAgICAgIC8qIEJ1aWxkIGZyZWUgbGlzdCwgYW5kIGluaXRpYWxpc2UgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVZFTlRRU0laRTsgaSsrKQorICAgICAgICAgICAgZXZ0cVtpXS5uZXh0ID0gaSsxOworICAgICAgICBldnRxW0VWRU5UUVNJWkUtMV0ubmV4dCA9IC0xOyAgICAgICAvKiBUZXJtaW5hdGUgbGlzdCAgICAgICAgICAgKi8KKyAgICAgICAgY291bnQgPSBmcmVlSGVhZCA9IDA7CisgICAgICAgIGhlYWQgPSB0YWlsID0gLTE7CisgICAgICAgIG9sZE1vdmUgPSAtMTsKKyAgICAgICAgb2xkS2V5ID0gLTE7CisgICAgICAgIHhSZXMgPSBfeFJlczsKKyAgICAgICAgeVJlcyA9IF95UmVzOworCisgICAgICAgIC8qIE9wZW4gdGhlIGNvbnNvbGUgZGV2aWNlIGFuZCBpbml0aWFsaXNlIGl0IGZvciByYXcgbW9kZSAqLworICAgICAgICB0dHlfZmQgPSBQTV9vcGVuQ29uc29sZSgpOworCisgICAgICAgIC8qIFdhaXQgdW50aWwgdmlydHVhbCB0ZXJtaW5hbCBpcyBhY3RpdmUgYW5kIHRha2Ugb3ZlciBjb250cm9sICovCisgICAgICAgIHdhaXRfdnRfYWN0aXZlKCk7CisgICAgICAgIHRha2VfdnRfY29udHJvbCgpOworCisgICAgICAgIC8qIEluaXRpYWxpc2Uga2V5Ym9hcmQgaGFuZGxpbmcgdG8gcmF3IG1vZGUgKi8KKyAgICAgICAgaWYgKGlvY3RsKHR0eV9mZCwgS0RHS0JNT0RFLCAmb2xka2Jtb2RlKSkgeworICAgICAgICAgICAgcHJpbnRmKCJXRF9zdGFydEZ1bGxTY3JlZW46IGNhbm5vdCBnZXQga2V5Ym9hcmQgbW9kZS5cbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgIG9sZF9mbGFncyA9IGZjbnRsKHR0eV9mZCxGX0dFVEZMKTsKKyAgICAgICAgZmNudGwodHR5X2ZkLEZfU0VURkwsb2xkX2ZsYWdzIHw9IE9fTk9OQkxPQ0spOworICAgICAgICB0Y2dldGF0dHIodHR5X2ZkLCAmY29uZik7CisgICAgICAgIG9sZF9jb25mID0gY29uZjsKKyAgICAgICAgY29uZi5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgRUNIT0sgfCBFQ0hPTkwgfCBOT0ZMU0ggfCBJU0lHKTsKKyAgICAgICAgY29uZi5jX2lmbGFnICY9IH4oSVNUUklQIHwgSUdOQ1IgfCBJQ1JOTCB8IElOTENSIHwgQlJLSU5UIHwgUEFSTVJLIHwgSU5QQ0sgfCBJVUNMQyB8IElYT04gfCBJWE9GRik7CisgICAgICAgIGNvbmYuY19pZmxhZyAgfD0gKElHTkJSSyB8IElHTlBBUik7CisgICAgICAgIGNvbmYuY19jY1tWTUlOXSA9IDE7CisgICAgICAgIGNvbmYuY19jY1tWVElNRV0gPSAwOworICAgICAgICBjb25mLmNfY2NbVlNVU1BdID0gMDsKKyAgICAgICAgdGNzZXRhdHRyKHR0eV9mZCwgVENTQUZMVVNILCAmY29uZik7CisgICAgICAgIGlvY3RsKHR0eV9mZCwgS0RTS0JNT0RFLCBLX01FRElVTVJBVyk7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIGtleWJvYXJkIHN0YXRlIGluZm9ybWF0aW9uICovCisgICAgICAgIG1lbXNldChrZXlfZG93biwgMCwgc2l6ZW9mKGtleV9kb3duKSk7CisgICAgICAgIGlvY3RsKHR0eV9mZCxLRFNFVExFRCxrZXlfbW9kaWZpZXJzID0gMCk7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbW91c2UgY29ubmVjdGlvbiAKKyAgICAgICAgICAgVGhlIHVzZXIgKk1VU1QqIHJ1biBncG0gd2l0aCB0aGUgIG9wdGlvbiAtUiBmb3IgdGhpcyB0byB3b3JrIChvciBoYXZlIGEgTW91c2VTeXN0ZW1zIG1vdXNlKQorICAgICAgICAqLworICAgICAgICBpZihHcG1fT3BlbigmZ3BtLDApID4gMCl7IC8qIEdQTSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGlmICgoY29ubiA9IG9wZW4oR1BNX05PREVfRklGTyxPX1JET05MWXxPX1NZTkMpKSA8IDApCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldEX3N0YXJ0RnVsbFNjcmVlbjogQ2FuJ3Qgb3BlbiBtb3VzZSBjb25uZWN0aW9uLlxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IHdoZW4gbm90IHVzaW5nIGdwbSAtUiwgb25seSBNb3VzZVN5c3RlbXMgbWljZSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgaWYgKChjb25uID0gb3BlbigiL2Rldi9tb3VzZSIsT19SRE9OTFl8T19TWU5DKSkgPCAwKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXRF9zdGFydEZ1bGxTY3JlZW46IENhbid0IG9wZW4gL2Rldi9tb3VzZS5cbiIpOworICAgICAgICB9CisgICAgICAgIEdwbV9DbG9zZSgpOworCisgICAgICAgIC8qIFRPRE86IFNjYWxlIHRoZSBtb3VzZSBjb29yZGluYXRlcyB0byB0aGUgc3BlY2lmaWMgcmVzb2x1dGlvbiAqLworCisgICAgICAgIC8qIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlICovCisgICAgICAgIGlmICgoc3RhdGVCdWYgPSBtYWxsb2MoUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJPdXQgb2YgbWVtb3J5IVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgUE1fc2F2ZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1Zix0dHlfZmQpOworICAgICAgICBpbml0bW9kZSA9IFZCRV9nZXRWaWRlb01vZGUoKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBzaWduYWwgaGFuZGxlciBmb3IgdGltZXIgZXZlbnRzICovCisgICAgICAgIHNpZ25hbChTSUdBTFJNLCB0aW1lckhhbmRsZXIpOworCisgICAgICAgIC8qIENhcHR1cmUgdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KKyAgICAgICAgc2lnbmFsKFNJR1RFUk0sIGV4aXRIYW5kbGVyKTsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgZXhpdEhhbmRsZXIpOworICAgICAgICBzaWduYWwoU0lHUVVJVCwgZXhpdEhhbmRsZXIpOworICAgICAgICBhdGV4aXQocmVzdG9yZV90ZXJtKTsKKworICAgICAgICAvKiBTaWduYWwgdGhhdCB3ZSBhcmUgaW5zdGFsbGVkICovCisgICAgICAgIGluc3RhbGxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gaHduZE1haW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTGV0cyB0aGUgbGlicmFyeSBrbm93IHdoZW4gZnVsbHNjcmVlbiBncmFwaGljcyBtb2RlIGhhcyBiZWVuIGluaXRpYWxpemVkIHNvCit0aGF0IHdlIGNhbiBwcm9wZXJseSBzY2FsZSB0aGUgbW91c2UgZHJpdmVyIGNvb3JkaW5hdGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1dEQVBJIFdEX2luRnVsbFNjcmVlbih2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfV0RBUEkgV0RfcmVzdG9yZUdESSh2b2lkKQoreworICAgIHJlc3RvcmVfdGVybSgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3RpY2tzICAgLSBOdW1iZXIgb2YgdGlja3MgYmV0d2VlbiB0aW1lciB0aWNrIG1lc3NhZ2VzCisKK1JFVFVSTlM6CitQcmV2aW91cyB2YWx1ZSBmb3IgdGhlIHRpbWVyIHRpY2sgZXZlbnQgc3BhY2luZy4KKworUkVNQVJLUzoKK1RoZSBldmVudCBtb2R1bGUgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHBlcmlvZGljIHRpbWVyIHRpY2sgZXZlbnRzIGZvcgoreW91LCB3aXRoICd0aWNrcycgYmV0d2VlbiBlYWNoIGV2ZW50IHBvc3RpbmcuIElmIHlvdSBzZXQgdGhlIHZhbHVlIG9mCisndGlja3MnIHRvIDAsIHRoZSB0aW1lciB0aWNrIGV2ZW50cyBhcmUgdHVybmVkIG9mZi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX1dEQVBJIFdEX3NldFRpbWVyVGljaygKKyAgICBpbnQgdGlja3MpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBvbGQ7CisgICAgc3RydWN0IGl0aW1lcnZhbCAgICB0aW07CisgICAgbG9uZyAgICAgICAgICAgICAgICBtcyA9IFRJQ0tTX1RPX1VTRUModGlja3MpOworCisgICAgZ2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdGltKTsKKyAgICBvbGQgPSBVU0VDX1RPX1RJQ0tTKHRpbS5pdF92YWx1ZS50dl9zZWMqMTAwMDAwMC4wICsgdGltLml0X3ZhbHVlLnR2X3VzZWMpOworICAgIHRpbS5pdF9pbnRlcnZhbC50dl9zZWMgID0gbXMgLyAxMDAwMDAwOworICAgIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjID0gbXMgJSAxMDAwMDAwOworICAgIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJnRpbSwgTlVMTCk7CisgICAgcmV0dXJuIG9sZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzYXZlU3RhdGUgICAtIEFkZHJlc3Mgb2Ygc3VzcGVuZCBhcHAgY2FsbGJhY2sgdG8gcmVnaXN0ZXIKKworUkVNQVJLUzoKK1JlZ2lzdGVycyBhIHVzZXIgYXBwbGljYXRpb24gc3VwcGxpZWQgc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayBzbyB0aGF0Cit3ZSBjYW4gcHJvcGVybHkgaGFuZGxlIHZpcnR1YWwgdGVybWluYWwgc3dpdGNoaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1dEQVBJIFdEX3NldFN1c3BlbmRBcHBDYWxsYmFjaygKKyAgICBpbnQgKF9BU01BUEkgKnNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKK3sKKyAgc3VzcGVuZEFwcENhbGxiYWNrID0gc2F2ZVN0YXRlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3ggICAtIE5ldyBYIGNvb3JkaW5hdGUgdG8gbW92ZSB0aGUgbW91c2UgY3Vyc29yIHRvCit5ICAgLSBOZXcgWSBjb29yZGluYXRlIHRvIG1vdmUgdGhlIG1vdXNlIGN1cnNvciB0bworCitSRU1BUktTOgorTW92ZXMgdG8gbW91c2UgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9XREFQSSBXRF9zZXRNb3VzZVBvcygKKyAgICBpbnQgeCwKKyAgICBpbnQgeSkKK3sKKyAgICBteCA9IHg7CisgICAgbXkgPSB5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3ggICAtIFBsYWNlIHRvIHN0b3JlIFggY29vcmRpbmF0ZSBvZiBtb3VzZSBjdXJzb3IKK3kgICAtIFBsYWNlIHRvIHN0b3JlIFkgY29vcmRpbmF0ZSBvZiBtb3VzZSBjdXJzb3IKKworUkVNQVJLUzoKK1JlYWRzIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBsb2NhdGlvbiBpbnQgKnNjcmVlbiogY29vcmRpbmF0ZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfV0RBUEkgV0RfZ2V0TW91c2VQb3MoCisgICAgaW50ICp4LAorICAgIGludCAqeSkKK3sKKyAgICAqeCA9IG14OworICAgICp5ID0gbXk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbWNiIC0gQWRkcmVzcyBvZiBtb3VzZSBjYWxsYmFjayBmdW5jdGlvbgorCitSRU1BUktTOgorUmVnaXN0ZXJzIGFuIGFwcGxpY2F0aW9uIHN1cHBsaWVkIG1vdXNlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkCit3aGVuZXZlciB0aGUgbW91c2UgY3Vyc29yIG1vdmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1dEQVBJIFdEX3NldE1vdXNlQ2FsbGJhY2soCisgICAgdm9pZCAoX0FTTUFQSSAqbWNiKShpbnQgeCxpbnQgeSkpCit7CisgICAgbW92ZUN1cnNvciA9IG1jYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cit4UmVzICAgIC0gTmV3IFggcmVzb2x1dGlvbiBvZiBncmFwaGljcyBtb2RlCit5UmVzICAgIC0gTmV3IFkgcmVzb2x1dGlvbiBvZiBncmFwaGljcyBtb2RlCisKK1JFTUFSS1M6CitUaGlzIGlzIGNhbGxlZCB0byBpbmZvcm0gdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUgdGhhdCB0aGUgc2NyZWVuIHJlc29sdXRpb24KK2hhcyBjaGFuZ2VkIHNvIHRoYXQgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGNhbiBiZSBzY2FsZWQgYXBwcm9wcmlhdGVseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9XREFQSSBXRF9jaGFuZ2VSZXNvbHV0aW9uKAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzKQoreworICAgIC8vICBHcG1fRml0VmFsdWVzKHhSZXMsIHlSZXMpOyAgLy8gPz8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzY2FuY29kZSAgICAtIFNjYW4gY29kZSB0byBjaGVjayBpZiBhIGtleSBpcyBkb3duCisKK1JFTUFSS1M6CitEZXRlcm1pbmVzIGlmIGEgcGFydGljdWxhciBrZXkgaXMgZG93biBiYXNlZCBvbiB0aGUgc2NhbiBjb2RlIGZvciB0aGUga2V5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIF9XREFQSSBXRF9pc0tleURvd24oCisgICAgdWNoYXIgc2NhbmNvZGUpCit7ICAgCisgICAgcmV0dXJuIGtleV9kb3duW3NjYW5jb2RlXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZXRlcm1pbmVzIGlmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBydW4gaW4gc2FmZSBtb2RlLiBOb3QgbmVjZXNzYXJ5IGZvcgorYW55dGhpbmcgYnV0IGJyb2tlbiBXaW5kb3dzIDk1IGRpc3BsYXkgZHJpdmVycyBzbyB3ZSByZXR1cm4gZmFsc2UgZm9yCitMaW51eC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX1dEQVBJIFdEX2lzU2FmZU1vZGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyM2RmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIExpbnV4CisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBhbGwgdGhlIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKKyNpbmNsdWRlIDxsaW51eC9qb3lzdGljay5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIEludGVybmFsIGdsb2JhbCB2YXJpYWJsZXMgKi8KKworZXh0ZXJuIGludCBfUE1fY29uc29sZV9mZCxfUE1fbGVkcyxfUE1fbW9kaWZpZXJzOworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKK3ZvaWQgX1BNX3Jlc3RvcmVfa2JfbW9kZSh2b2lkKTsKK3ZvaWQgX1BNX2tleWJvYXJkX3Jhd21vZGUodm9pZCk7CisKKy8qIExpbnV4IG5lZWRzIHRoZSBnZW5lcmljIGpveXN0aWNrIHNjYWxpbmcgY29kZSAqLworCisjZGVmaW5lIE5FRURfU0NBTEVfSk9ZX0FYSVMKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1Mjk4NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMKQEAgLTAsMCArMSwxODEwIEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAgICAgICAgICAgICAgIFBvcnRpb25zIGNvcHlyaWdodCAoQykgSm9zaCBWYW5kZXJob29mCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgKKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMva2QuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy92dC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXNjYWxsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpZmRlZiBFTkFCTEVfTVRSUgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20vdm04Ni5oPgorI2lmZGVmIF9fR0xJQkNfXworI2luY2x1ZGUgPHN5cy9wZXJtLmg+CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBSRUFMX01FTV9CQVNFICAgICAgICgodm9pZCAqKTB4MTAwMDApCisjZGVmaW5lIFJFQUxfTUVNX1NJWkUgICAgICAgMHgxMDAwMAorI2RlZmluZSBSRUFMX01FTV9CTE9DS1MgICAgIDB4MTAwCisjZGVmaW5lIERFRkFVTFRfVk04Nl9GTEFHUyAgKElGX01BU0sgfCBJT1BMX01BU0spCisjZGVmaW5lIERFRkFVTFRfU1RBQ0tfU0laRSAgMHgxMDAwCisjZGVmaW5lIFJFVFVSTl9UT18zMl9JTlQgICAgMjU1CisKKy8qIFF1aWNrIGFuZCBkaXJ0eSBmaXggZm9yIHZtODYoKSBzeXNjYWxsIGZyb20gbHJtaSAwLjYgKi8KK3N0YXRpYyBpbnQKK3ZtODYoc3RydWN0IHZtODZfc3RydWN0ICp2bSkKKyAgICB7CisgICAgaW50IHI7CisjaWZkZWYgX19QSUNfXworICAgIGFzbSB2b2xhdGlsZSAoCisgICAgICJwdXNobCAlJWVieFxuXHQiCisgICAgICJtb3ZsICUyLCAlJWVieFxuXHQiCisgICAgICJpbnQgJDB4ODBcblx0IgorICAgICAicG9wbCAlJWVieCIKKyAgICAgOiAiPWEiIChyKQorICAgICA6ICIwIiAoMTEzKSwgInIiICh2bSkpOworI2Vsc2UKKyAgICBhc20gdm9sYXRpbGUgKAorICAgICAiaW50ICQweDgwIgorICAgICA6ICI9YSIgKHIpCisgICAgIDogIjAiICgxMTMpLCAiYiIgKHZtKSk7CisjZW5kaWYKKyAgICByZXR1cm4gcjsKKyAgICB9CisKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkeTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHJldF9zZWcsIHJldF9vZmY7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICBzdGFja19zZWcsIHN0YWNrX29mZjsKKyAgICBzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgIHZtOworICAgIH0gY29udGV4dCA9IHswfTsKKworc3RydWN0IG1lbV9ibG9jayB7CisgICAgdW5zaWduZWQgaW50IHNpemUgOiAyMDsKKyAgICB1bnNpZ25lZCBpbnQgZnJlZSA6IDE7CisgICAgfTsKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IHJlYWR5OworICAgIGludCBjb3VudDsKKyAgICBzdHJ1Y3QgbWVtX2Jsb2NrIGJsb2Nrc1tSRUFMX01FTV9CTE9DS1NdOworICAgIH0gbWVtX2luZm8gPSB7MH07CisKK2ludCAgICAgICAgICAgICAgICAgICAgIF9QTV9jb25zb2xlX2ZkID0gLTE7CitpbnQgICAgICAgICAgICAgICAgICAgICBfUE1fbGVkcyA9IDAsX1BNX21vZGlmaWVycyA9IDA7CitzdGF0aWMgaWJvb2wgICAgICAgICAgICBpbml0ZWQgPSBmYWxzZTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIHR0eV92YyA9IDA7CitzdGF0aWMgaW50ICAgICAgICAgICAgICBjb25zb2xlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIHN0YXJ0dXBfdmM7CitzdGF0aWMgaW50ICAgICAgICAgICAgICBmZF9tZW0gPSAwOworc3RhdGljIGlib29sICAgICAgICAgICAgaW5fcmF3X21vZGUgPSBmYWxzZTsKKyNpZmRlZiBFTkFCTEVfTVRSUgorc3RhdGljIGludCAgICAgICAgICAgICAgbXRycl9mZDsKKyNlbmRpZgorc3RhdGljIHVpbnQgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KK3N0YXRpYyB2b2lkICpWRVNBQnVmX3B0ciA9IE5VTEw7ICAgIC8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgICAgICovCitzdGF0aWMgdWludCBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLworc3RhdGljIHVpbnQgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KKyNpZmRlZiBUUkFDRV9JTworc3RhdGljIHVsb25nICAgICAgICAgICAgdHJhY2VBZGRyOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBUUkFDRV9JTworZXh0ZXJuIHZvaWQgcHJpbnRrKGNoYXIgKm1zZywuLi4pOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X291dChpbnQgdmFsdWUsIGludCBwb3J0KQoreworI2lmZGVmIFRSQUNFX0lPCisgICAgcHJpbnRrKCIlMDRYOiUwNFg6IG91dGIuJTA0WCA8LSAlMDJYXG4iLCB0cmFjZUFkZHIgPj4gMTYsIHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWNoYXIpdmFsdWUpOworI2VuZGlmCisgICAgYXNtIHZvbGF0aWxlICgib3V0YiAlMCwlMSIKKyAgICAgICAgICA6OiJhIiAoKHVuc2lnbmVkIGNoYXIpIHZhbHVlKSwgImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9vdXR3KGludCB2YWx1ZSwgaW50IHBvcnQpCit7CisjaWZkZWYgVFJBQ0VfSU8KKyAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0dy4lMDRYIDwtICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7CisjZW5kaWYKKyAgICBhc20gdm9sYXRpbGUgKCJvdXR3ICUwLCUxIgorICAgICAgICAgOjoiYSIgKCh1bnNpZ25lZCBzaG9ydCkgdmFsdWUpLCAiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X291dGwoaW50IHZhbHVlLCBpbnQgcG9ydCkKK3sKKyNpZmRlZiBUUkFDRV9JTworICAgIHByaW50aygiJTA0WDolMDRYOiBvdXRsLiUwNFggPC0gJTA4WFxuIiwgdHJhY2VBZGRyID4+IDE2LHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWxvbmcpdmFsdWUpOworI2VuZGlmCisgICAgYXNtIHZvbGF0aWxlICgib3V0bCAlMCwlMSIKKyAgICAgICAgIDo6ImEiICgodW5zaWduZWQgbG9uZykgdmFsdWUpLCAiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW4oaW50IHBvcnQpCit7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBhc20gdm9sYXRpbGUgKCJpbmIgJTEsJTAiCisgICAgICAgICAgICAgIDoiPWEiICgodW5zaWduZWQgY2hhcil2YWx1ZSkKKyAgICAgICAgICAgICAgOiJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKKyNpZmRlZiBUUkFDRV9JTworICAgIHByaW50aygiJTA0WDolMDRYOiAgaW5iLiUwNFggLT4gJTAyWFxuIiwgdHJhY2VBZGRyID4+IDE2LHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWNoYXIpdmFsdWUpOworI2VuZGlmCisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwb3J0X2ludyhpbnQgcG9ydCkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBhc20gdm9sYXRpbGUgKCJpbncgJTEsJTAiCisgICAgICAgICAgICAgIDoiPWEiICgodW5zaWduZWQgc2hvcnQpdmFsdWUpCisgICAgICAgICAgICAgIDoiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7CisjaWZkZWYgVFJBQ0VfSU8KKyAgICBwcmludGsoIiUwNFg6JTA0WDogIGludy4lMDRYIC0+ICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW5sKGludCBwb3J0KQoreworICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgYXNtIHZvbGF0aWxlICgiaW5sICUxLCUwIgorICAgICAgICAgICAgICA6Ij1hIiAoKHVuc2lnbmVkIGxvbmcpdmFsdWUpCisgICAgICAgICAgICAgIDoiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7CisjaWZkZWYgVFJBQ0VfSU8KKyAgICBwcmludGsoIiUwNFg6JTA0WDogIGlubC4lMDRYIC0+ICUwOFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVsb25nKXZhbHVlKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCByZWFsX21lbV9pbml0KHZvaWQpCit7CisgICAgdm9pZCAgICAqbTsKKyAgICBpbnQgICAgIGZkX3plcm87CisKKyAgICBpZiAobWVtX2luZm8ucmVhZHkpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKChmZF96ZXJvID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRE9OTFkpKSA9PSAtMSkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZsZWRnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKKyAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopUkVBTF9NRU1fQkFTRSwgUkVBTF9NRU1fU0laRSwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCisgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfemVybywgMCkpID09ICh2b2lkICopLTEpIHsKKyAgICAgICAgY2xvc2UoZmRfemVybyk7CisgICAgICAgIFBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2bGVkZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7CisgICAgICAgIH0KKyAgICBtZW1faW5mby5yZWFkeSA9IDE7CisgICAgbWVtX2luZm8uY291bnQgPSAxOworICAgIG1lbV9pbmZvLmJsb2Nrc1swXS5zaXplID0gUkVBTF9NRU1fU0laRTsKKyAgICBtZW1faW5mby5ibG9ja3NbMF0uZnJlZSA9IDE7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9ibG9jayhpbnQgaSkKK3sKKyAgICBtZW1tb3ZlKAorICAgICAgICBtZW1faW5mby5ibG9ja3MgKyBpICsgMSwKKyAgICAgICAgbWVtX2luZm8uYmxvY2tzICsgaSwKKyAgICAgICAgKG1lbV9pbmZvLmNvdW50IC0gaSkgKiBzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpOworICAgIG1lbV9pbmZvLmNvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9ibG9jayhpbnQgaSkKK3sKKyAgICBtZW1faW5mby5jb3VudC0tOworCisgICAgbWVtbW92ZSgKKyAgICAgICAgbWVtX2luZm8uYmxvY2tzICsgaSwKKyAgICAgICAgbWVtX2luZm8uYmxvY2tzICsgaSArIDEsCisgICAgICAgIChtZW1faW5mby5jb3VudCAtIGkpICogc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQodW5zaWduZWQgaW50IGJpdCwgdm9pZCAqYXJyYXkpCit7CisgICAgdW5zaWduZWQgY2hhciAqYSA9IGFycmF5OworICAgIGFbYml0IC8gOF0gfD0gKDEgPDwgKGJpdCAlIDgpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9zZWcoaW50IGkpCit7CisgICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQgKyAyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9vZmYoaW50IGkpCit7CisgICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHVzaHcodW5zaWduZWQgc2hvcnQgaSkKK3sKKyAgICBzdHJ1Y3Qgdm04Nl9yZWdzICpyID0gJmNvbnRleHQudm0ucmVnczsKKyAgICByLT5lc3AgLT0gMjsKKyAgICAqKHVuc2lnbmVkIHNob3J0ICopKCgodW5zaWduZWQgaW50KXItPnNzIDw8IDQpICsgci0+ZXNwKSA9IGk7Cit9CisKK2lib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCit7IHJldHVybiB0cnVlOyB9CisKK3ZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQoreworICAgIHZvaWQgICAgKm07CisgICAgdWludCAgICByX3NlZyxyX29mZjsKKworICAgIGlmIChpbml0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIE1hcCB0aGUgSW50ZXJydXB0IFZlY3RvcnMgKDB4MCAtIDB4NDAwKSArIEJJT1MgZGF0YSAoMHg0MDAgLSAweDUwMikKKyAgICAgKiBhbmQgdGhlIHBoeXNpY2FsIGZyYW1lYnVmZmVyIGFuZCBST00gaW1hZ2VzIGZyb20gKDB4YTAwMDAgLSAweDEwMDAwMCkKKyAgICAgKi8KKyAgICByZWFsX21lbV9pbml0KCk7CisgICAgaWYgKCFmZF9tZW0gJiYgKGZkX21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRFdSKSkgPT0gLTEpIHsKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKKyAgICAgICAgfQorICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKikwLCAweDUwMiwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCisgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfbWVtLCAwKSkgPT0gKHZvaWQgKiktMSkgeworICAgICAgICBQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOworICAgICAgICB9CisgICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4QTAwMDAsIDB4QzAwMDAgLSAweEEwMDAwLAorICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkX21lbSwgMHhBMDAwMCkpID09ICh2b2lkICopLTEpIHsKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKKyAgICAgICAgfQorICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKikweEMwMDAwLCAweEQwMDAwIC0gMHhDMDAwMCwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCisgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfbWVtLCAweEMwMDAwKSkgPT0gKHZvaWQgKiktMSkgeworICAgICAgICBQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOworICAgICAgICB9CisgICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4RDAwMDAsIDB4MTAwMDAwIC0gMHhEMDAwMCwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfU0hBUkVELCBmZF9tZW0sIDB4RDAwMDApKSA9PSAodm9pZCAqKS0xKSB7CisgICAgICAgIFBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7CisgICAgICAgIH0KKyAgICBpbml0ZWQgPSAxOworCisgICAgLyogQWxsb2NhdGUgYSBzdGFjayAqLworICAgIG0gPSBQTV9hbGxvY1JlYWxTZWcoREVGQVVMVF9TVEFDS19TSVpFLCZyX3NlZywmcl9vZmYpOworICAgIGNvbnRleHQuc3RhY2tfc2VnID0gcl9zZWc7CisgICAgY29udGV4dC5zdGFja19vZmYgPSByX29mZitERUZBVUxUX1NUQUNLX1NJWkU7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgcmV0dXJuIHRvIDMyIGJpdCByb3V0aW5lICovCisgICAgbSA9IFBNX2FsbG9jUmVhbFNlZygyLCZyX3NlZywmcl9vZmYpOworICAgIGNvbnRleHQucmV0X3NlZyA9IHJfc2VnOworICAgIGNvbnRleHQucmV0X29mZiA9IHJfb2ZmOworICAgICgodWNoYXIqKW0pWzBdID0gMHhDRDsgICAgICAgICAvKiBpbnQgb3Bjb2RlICovCisgICAgKCh1Y2hhciopbSlbMV0gPSBSRVRVUk5fVE9fMzJfSU5UOworICAgIG1lbXNldCgmY29udGV4dC52bSwgMCwgc2l6ZW9mKGNvbnRleHQudm0pKTsKKworICAgIC8qIEVuYWJsZSBrZXJuZWwgZW11bGF0aW9uIG9mIGFsbCBpbnRzIGV4Y2VwdCBSRVRVUk5fVE9fMzJfSU5UICovCisgICAgbWVtc2V0KCZjb250ZXh0LnZtLmludF9yZXZlY3RvcmVkLCAwLCBzaXplb2YoY29udGV4dC52bS5pbnRfcmV2ZWN0b3JlZCkpOworICAgIHNldF9iaXQoUkVUVVJOX1RPXzMyX0lOVCwgJmNvbnRleHQudm0uaW50X3JldmVjdG9yZWQpOworICAgIGNvbnRleHQucmVhZHkgPSAxOworI2lmZGVmIEVOQUJMRV9NVFJSCisgICAgbXRycl9mZCA9ICBvcGVuKCIvZGV2L2NwdS9tdHJyIiwgT19SRFdSLCAwKTsKKyAgICBpZiAobXRycl9mZCA8IDApCisgICAgICAgbXRycl9mZCA9ICBvcGVuKCIvcHJvYy9tdHJyIiwgT19SRFdSLCAwKTsKKyNlbmRpZgorICAgIC8qIEVuYWJsZSBJL08gcGVybWlzc2lvbnMgdG8gZGlyZWN0bHkgYWNjZXNzIEkvTyBwb3J0cy4gV2UgYnJlYWsgdGhlCisgICAgICogYWxsb2NhdGlvbiBpbnRvIHR3byBwYXJ0cywgb25lIGZvciB0aGUgcG9ydHMgZnJvbSAwLTB4M0ZGIGFuZAorICAgICAqIGFub3RoZXIgZm9yIHRoZSByZW1haW5pbmcgcG9ydHMgdXAgdG8gMHhGRkZGLiBTdGFuZGFyZCBMaW51eCBrZXJuZWxzCisgICAgICogb25seSBhbGxvdyB0aGUgZmlyc3QgMHg0MDAgcG9ydHMgdG8gYmUgZW5hYmxlZCwgc28gdG8gZW5hYmxlIGFsbAorICAgICAqIDY1NTM2IHBvcnRzIHlvdSBuZWVkIGEgcGF0Y2hlZCBrZXJuZWwgdGhhdCB3aWxsIGVuYWJsZSB0aGUgZnVsbAorICAgICAqIDhLYiBJL08gcGVybWlzc2lvbnMgYml0bWFwLgorICAgICAqLworI2lmbmRlZiBUUkFDRV9JTworICAgIGlvcGVybSgweDAsMHg0MDAsMSk7CisgICAgaW9wZXJtKDB4NDAwLDB4MTAwMDAtMHg0MDAsMSk7CisjZW5kaWYKKyAgICBpb3BsKDMpOworfQorCitsb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoreyByZXR1cm4gX09TX0xJTlVYOyB9CisKK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreyByZXR1cm4gUE1fMzg2OyB9CisKK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICcvJykgeworICAgICAgICBzW3Bvc10gPSAnLyc7CisgICAgICAgIHNbcG9zKzFdID0gJ1wwJzsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAorICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKK3sKKyAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQorICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KDEpOworfQorCitzdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCit7CisgICAgaWYgKFZFU0FCdWZfcHRyKQorICAgICAgICBQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7CisgICAgVkVTQUJ1Zl9wdHIgPSAwOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQoreworICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCisgICAgICAgIGlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGF0ZXhpdChFeGl0VkJFQnVmKTsKKyAgICAgICAgfQorICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKKyAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKKyAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKKyAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Cit9CisKKy8qIE5ldyByYXcgY29uc29sZSBiYXNlZCBnZXRjaCBhbmQga2JoaXQgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgS0JfQ0FQUyAgICAgTEVEX0NBUCAvKiA0ICovCisjZGVmaW5lIEtCX05VTUxPQ0sgIExFRF9OVU0gLyogMiAqLworI2RlZmluZSBLQl9TQ1JPTEwgICBMRURfU0NSIC8qIDEgKi8KKyNkZWZpbmUgS0JfU0hJRlQgICAgOAorI2RlZmluZSBLQl9DT05UUk9MICAxNgorI2RlZmluZSBLQl9BTFQgICAgICAzMgorCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBzYXZlIHRoZSBrZXlib2FyZCBtb2RlIHRvIGRpc2suIFdlIHNhdmUgaXQgdG8gZGlzaworICogc28gdGhhdCB3ZSBjYW4gcHJvcGVybHkgcmVzdG9yZSB0aGUgbW9kZSBsYXRlciBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVkLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzdHJ1Y3QgdGVybWlvcyAgdGVybWlvczsKKyAgICBpbnQgICAgICAgICAgICAga2JfbW9kZTsKKyAgICBpbnQgICAgICAgICAgICAgbGVkczsKKyAgICBpbnQgICAgICAgICAgICAgZmxhZ3M7CisgICAgaW50ICAgICAgICAgICAgIHN0YXJ0dXBfdmM7CisgICAgfSBrZXlib2FyZF9tb2RlOworCisvKiBOYW1lIG9mIHRoZSBmaWxlIHVzZWQgdG8gc2F2ZSBrZXlib2FyZCBtb2RlIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgS0JNT0RFX0RBVCAgImtibW9kZS5kYXQiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT3BlbiB0aGUga2V5Ym9hcmQgbW9kZSBmaWxlIG9uIGRpc2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZJTEUgKm9wZW5fa2JfbW9kZSgKKyAgICBjaGFyICptb2RlLAorICAgIGNoYXIgKnBhdGgpCit7CisgICAgaWYgKCFQTV9maW5kQlBEKCJncmFwaGljcy5icGQiLHBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsS0JNT0RFX0RBVCk7CisgICAgcmV0dXJuIGZvcGVuKHBhdGgsbW9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVzdG9yZSB0aGUga2V5Ym9hcmQgdG8gbm9ybWFsIG1vZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9QTV9yZXN0b3JlX2tiX21vZGUodm9pZCkKK3sKKyAgICBGSUxFICAgICAgICAgICAgKmtibW9kZTsKKyAgICBrZXlib2FyZF9tb2RlICAgbW9kZTsKKyAgICBjaGFyICAgICAgICAgICAgcGF0aFtQTV9NQVhfUEFUSF07CisKKyAgICBpZiAoX1BNX2NvbnNvbGVfZmQgIT0gLTEgJiYgKGtibW9kZSA9IG9wZW5fa2JfbW9kZSgicmIiLHBhdGgpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmcmVhZCgmbW9kZSwxLHNpemVvZihtb2RlKSxrYm1vZGUpID09IHNpemVvZihtb2RlKSkgeworICAgICAgICAgICAgaWYgKG1vZGUuc3RhcnR1cF92YyA+IDApCisgICAgICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX0FDVElWQVRFLCBtb2RlLnN0YXJ0dXBfdmMpOworICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0tCTU9ERSwgbW9kZS5rYl9tb2RlKTsKKyAgICAgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgbW9kZS5sZWRzKTsKKyAgICAgICAgICAgIHRjc2V0YXR0cihfUE1fY29uc29sZV9mZCwgVENTQUZMVVNILCAmbW9kZS50ZXJtaW9zKTsKKyAgICAgICAgICAgIGZjbnRsKF9QTV9jb25zb2xlX2ZkLEZfU0VURkwsbW9kZS5mbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgIGZjbG9zZShrYm1vZGUpOworICAgICAgICB1bmxpbmsocGF0aCk7CisgICAgICAgIGluX3Jhd19tb2RlID0gZmFsc2U7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfUE1fYWJvcnQoCisgICAgaW50IHNpZ25vKQoreworICAgIGNoYXIgICAgYnVmWzgwXTsKKworICAgIHNwcmludGYoYnVmLCJUZXJtaW5hdGluZyBvbiBzaWduYWwgJWQiLHNpZ25vKTsKKyAgICBfUE1fcmVzdG9yZV9rYl9tb2RlKCk7CisgICAgUE1fZmF0YWxFcnJvcihidWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1dCB0aGUga2V5Ym9hcmQgaW50byByYXcgbW9kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1BNX2tleWJvYXJkX3Jhd21vZGUodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyBjb25mOworICAgIEZJTEUgICAgICAgICAgICAqa2Jtb2RlOworICAgIGtleWJvYXJkX21vZGUgICBtb2RlOworICAgIGNoYXIgICAgICAgICAgICBwYXRoW1BNX01BWF9QQVRIXTsKKyAgICBpbnQgICAgICAgICAgICAgaTsKKyAgICBzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7CisgICAgICAgIFNJR0hVUCwKKyAgICAgICAgU0lHSU5ULAorICAgICAgICBTSUdRVUlULAorICAgICAgICBTSUdJTEwsCisgICAgICAgIFNJR1RSQVAsCisgICAgICAgIFNJR0FCUlQsCisgICAgICAgIFNJR0lPVCwKKyAgICAgICAgU0lHQlVTLAorICAgICAgICBTSUdGUEUsCisgICAgICAgIFNJR0tJTEwsCisgICAgICAgIFNJR1NFR1YsCisgICAgICAgIFNJR1RFUk0sCisgICAgICAgIH07CisKKyAgICBpZiAoKGtibW9kZSA9IG9wZW5fa2JfbW9kZSgicmIiLHBhdGgpKSA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoa2Jtb2RlID0gb3Blbl9rYl9tb2RlKCJ3YiIscGF0aCkpID09IE5VTEwpCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBrYm1vZGUuZGF0IGZpbGUgZm9yIHdyaXRpbmchIik7CisgICAgICAgIGlmIChpb2N0bChfUE1fY29uc29sZV9mZCwgS0RHS0JNT0RFLCAmbW9kZS5rYl9tb2RlKSkKKyAgICAgICAgICAgIHBlcnJvcigiS0RHS0JNT0RFIik7CisgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdFVExFRCwgJm1vZGUubGVkcyk7CisgICAgICAgIF9QTV9sZWRzID0gbW9kZS5sZWRzICYgMHhGOworICAgICAgICBfUE1fbW9kaWZpZXJzID0gMDsKKyAgICAgICAgdGNnZXRhdHRyKF9QTV9jb25zb2xlX2ZkLCAmbW9kZS50ZXJtaW9zKTsKKyAgICAgICAgY29uZiA9IG1vZGUudGVybWlvczsKKyAgICAgICAgY29uZi5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOworICAgICAgICBjb25mLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBCUktJTlQgfCBQQVJNUksgfCBJTlBDSyB8IElVQ0xDIHwgSVhPTiB8IElYT0ZGKTsKKyAgICAgICAgY29uZi5jX2lmbGFnICB8PSAoSUdOQlJLIHwgSUdOUEFSKTsKKyAgICAgICAgY29uZi5jX2NjW1ZNSU5dID0gMTsKKyAgICAgICAgY29uZi5jX2NjW1ZUSU1FXSA9IDA7CisgICAgICAgIGNvbmYuY19jY1tWU1VTUF0gPSAwOworICAgICAgICB0Y3NldGF0dHIoX1BNX2NvbnNvbGVfZmQsIFRDU0FGTFVTSCwgJmNvbmYpOworICAgICAgICBtb2RlLmZsYWdzID0gZmNudGwoX1BNX2NvbnNvbGVfZmQsRl9HRVRGTCk7CisgICAgICAgIGlmIChpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTS0JNT0RFLCBLX01FRElVTVJBVykpCisgICAgICAgICAgICBwZXJyb3IoIktEU0tCTU9ERSIpOworICAgICAgICBhdGV4aXQoX1BNX3Jlc3RvcmVfa2JfbW9kZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2lnX2xpc3QpL3NpemVvZihzaWdfbGlzdFswXSk7IGkrKykKKyAgICAgICAgICAgIHNpZ25hbChzaWdfbGlzdFtpXSwgX1BNX2Fib3J0KTsKKyAgICAgICAgbW9kZS5zdGFydHVwX3ZjID0gc3RhcnR1cF92YzsKKyAgICAgICAgaWYgKGZ3cml0ZSgmbW9kZSwxLHNpemVvZihtb2RlKSxrYm1vZGUpICE9IHNpemVvZihtb2RlKSkKKyAgICAgICAgICAgIFBNX2ZhdGFsRXJyb3IoIkVycm9yIHdyaXRpbmcga2Jtb2RlLmRhdCEiKTsKKyAgICAgICAgZmNsb3NlKGtibW9kZSk7CisgICAgICAgIGluX3Jhd19tb2RlID0gdHJ1ZTsKKyAgICAgICAgfQorfQorCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICBmZF9zZXQgczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHsgMCwgMCB9OworCisgICAgaWYgKGNvbnNvbGVfY291bnQgPT0gMCkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91ICptdXN0KiBvcGVuIGEgY29uc29sZSBiZWZvcmUgdXNpbmcgUE1fa2JoaXQhIik7CisgICAgaWYgKCFpbl9yYXdfbW9kZSkKKyAgICAgICAgX1BNX2tleWJvYXJkX3Jhd21vZGUoKTsKKyAgICBGRF9aRVJPKCZzKTsKKyAgICBGRF9TRVQoX1BNX2NvbnNvbGVfZmQsICZzKTsKKyAgICByZXR1cm4gc2VsZWN0KF9QTV9jb25zb2xlX2ZkKzEsICZzLCBOVUxMLCBOVUxMLCAmdHYpID4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCit7CisgICAgc3RhdGljIHVjaGFyICAgIGM7CisgICAgaW50IHJlbGVhc2U7CisgICAgc3RhdGljIHN0cnVjdCBrYmVudHJ5IGtlOworCisgICAgaWYgKGNvbnNvbGVfY291bnQgPT0gMCkKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiWW91ICptdXN0KiBvcGVuIGEgY29uc29sZSBiZWZvcmUgdXNpbmcgUE1fZ2V0Y2ghIik7CisgICAgaWYgKCFpbl9yYXdfbW9kZSkKKyAgICAgICAgX1BNX2tleWJvYXJkX3Jhd21vZGUoKTsKKyAgICB3aGlsZSAocmVhZChfUE1fY29uc29sZV9mZCwgJmMsIDEpID4gMCkgeworICAgICAgICByZWxlYXNlID0gYyAmIDB4ODA7CisgICAgICAgIGMgJj0gMHg3RjsKKyAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgIHN3aXRjaChjKXsKKyAgICAgICAgICAgICAgICBjYXNlIDQyOiBjYXNlIDU0OiAvLyBTaGlmdAorICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOTogY2FzZSA5NzogLy8gQ29udHJvbAorICAgICAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9DT05UUk9MOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU2OiBjYXNlIDEwMDogLy8gQWx0IC8gQWx0R3IKKyAgICAgICAgICAgICAgICAgICAgX1BNX21vZGlmaWVycyAmPSB+S0JfQUxUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlIDQyOiBjYXNlIDU0OiAvLyBTaGlmdAorICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgfD0gS0JfU0hJRlQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOTogY2FzZSA5NzogLy8gQ29udHJvbAorICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgfD0gS0JfQ09OVFJPTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTY6IGNhc2UgMTAwOiAvLyBBbHQgLyBBbHRHcgorICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgfD0gS0JfQUxUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1ODogLy8gQ2FwcyBMb2NrCisgICAgICAgICAgICAgICAgX1BNX21vZGlmaWVycyBePSBLQl9DQVBTOworICAgICAgICAgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX21vZGlmaWVycyAmIDcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OTogLy8gTnVtIExvY2sKKyAgICAgICAgICAgICAgICBfUE1fbW9kaWZpZXJzIF49IEtCX05VTUxPQ0s7CisgICAgICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbW9kaWZpZXJzICYgNyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcwOiAvLyBTY3JvbGwgTG9jaworICAgICAgICAgICAgICAgIF9QTV9tb2RpZmllcnMgXj0gS0JfU0NST0xMOworICAgICAgICAgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX21vZGlmaWVycyAmIDcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICByZXR1cm4gMHgxQzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAga2Uua2JfaW5kZXggPSBjOworICAgICAgICAgICAgICAgIGtlLmtiX3RhYmxlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoKF9QTV9tb2RpZmllcnMgJiBLQl9TSElGVCkgfHwgKF9QTV9tb2RpZmllcnMgJiBLQl9DQVBTKSkKKyAgICAgICAgICAgICAgICAgICAga2Uua2JfdGFibGUgfD0gS19TSElGVFRBQjsKKyAgICAgICAgICAgICAgICBpZiAoX1BNX21vZGlmaWVycyAmIEtCX0FMVCkKKyAgICAgICAgICAgICAgICAgICAga2Uua2JfdGFibGUgfD0gS19BTFRUQUI7CisgICAgICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0tCRU5ULCAodWxvbmcpJmtlKTsKKyAgICAgICAgICAgICAgICBjID0ga2Uua2JfdmFsdWUgJiAweEZGOworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2xlZXAgdW50aWwgdGhlIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdF92dF9hY3RpdmUoCisgICAgaW50IF9QTV9jb25zb2xlX2ZkKQoreworICAgIHdoaWxlIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfV0FJVEFDVElWRSwgdHR5X3ZjKSA8IDApIHsKKyAgICAgICAgaWYgKChlcnJubyAhPSBFQUdBSU4pICYmIChlcnJubyAhPSBFSU5UUikpIHsKKyAgICAgICAgICAgIHBlcnJvcigiaW9jdGwoVlRfV0FJVEFDVElWRSkiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxNTAwMDApOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgY29uc29sZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNoZWNrX293bmVyKAorICAgIGludCB2YykKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzYnVmOworICAgIGNoYXIgZm5hbWVbMzBdOworCisgICAgc3ByaW50ZihmbmFtZSwgIi9kZXYvdHR5JWQiLCB2Yyk7CisgICAgaWYgKChzdGF0KGZuYW1lLCAmc2J1ZikgPj0gMCkgJiYgKGdldHVpZCgpID09IHNidWYuc3RfdWlkKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcHJpbnRmKCJZb3UgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgY29uc29sZSB0byB1c2UgdGhpcyBwcm9ncmFtLlxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2tzIGlmIHRoZSBjb25zb2xlIGlzIGN1cnJlbnRseSBpbiBncmFwaGljcyBtb2RlLCBhbmQgaWYgc28gd2UgZm9yY2libHkKK3Jlc3RvcmUgaXQgYmFjayB0byB0ZXh0IG1vZGUgYWdhaW4uIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIGEgTnVjbGV1cyBvcgorTUdMIHByb2dyYW0gY3Jhc2hlcyBhbmQgbGVhdmVzIHRoZSBjb25zb2xlIGluIGdyYXBoaWNzIG1vZGUuIFJ1bm5pbmcgdGhlCit0ZXh0bW9kZSB1dGlsaXR5IChvciBhbnkgb3RoZXIgTnVjbGV1cy9NR0wgcHJvZ3JhbSkgdmlhIGEgdGVsbmV0IHNlc3Npb24KK2ludG8gdGhlIG1hY2hpbmUgd2lsbCByZXN0b3JlIGl0IGJhY2sgdG8gbm9ybWFsLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfdGV4dF9jb25zb2xlKAorICAgIGludCBjb25zb2xlX2lkKQoreworICAgIGlmIChpb2N0bChjb25zb2xlX2lkLCBLRFNFVE1PREUsIEtEX1RFWFQpIDwgMCkKKyAgICAgICAgTE9HV0FSTigiaW9jdGwoS0RTRVRNT0RFKSBmYWlsZWQiKTsKKyAgICBfUE1fcmVzdG9yZV9rYl9tb2RlKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT3BlbnMgdXAgdGhlIGNvbnNvbGUgZGV2aWNlIGZvciBvdXRwdXQgYnkgZmluZGluZyBhbiBhcHByb3ByaWF0ZSB2aXJ1dGFsCitjb25zb2xlIHRoYXQgd2UgY2FuIHJ1biBvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAorICAgIFBNX0hXTkQgaHduZFVzZXIsCisgICAgaW50IGRldmljZSwKKyAgICBpbnQgeFJlcywKKyAgICBpbnQgeVJlcywKKyAgICBpbnQgYnBwLAorICAgIGlib29sIGZ1bGxTY3JlZW4pCit7CisgICAgc3RydWN0IHZ0X21vZGUgIHZ0bTsKKyAgICBzdHJ1Y3QgdnRfc3RhdCAgdnRzOworICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOworICAgIGNoYXIgICAgICAgICAgICBmbmFtZVszMF07CisKKyAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBjb25zb2xlICovCisgICAgaWYgKGNvbnNvbGVfY291bnQrKykKKyAgICAgICAgcmV0dXJuIF9QTV9jb25zb2xlX2ZkOworCisgICAgLyogTm93LCBpdCB3b3VsZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgL2Rldi90dHkgYW5kIHNlZSB3aGF0IGl0IGlzCisgICAgICogY29ubmVjdGVkIHRvLiBBbGFzLCB3ZSBjYW5ub3QgZmluZCBvdXQgcmVsaWFibHkgd2hhdCBWQyAvZGV2L3R0eSBpcworICAgICAqIGJvdW5kIHRvLiBUaHVzIHdlIHBhcnNlIHN0ZGluIHRocm91Z2ggc3RkZXJyIGZvciBhIHJlbGlhYmxlIFZDLgorICAgICAqLworICAgIHN0YXJ0dXBfdmMgPSAwOworICAgIGZvciAoX1BNX2NvbnNvbGVfZmQgPSAwOyBfUE1fY29uc29sZV9mZCA8IDM7IF9QTV9jb25zb2xlX2ZkKyspIHsKKyAgICAgICAgaWYgKGZzdGF0KF9QTV9jb25zb2xlX2ZkLCAmc2J1ZikgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfR0VUTU9ERSwgJnZ0bSkgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgoc2J1Zi5zdF9yZGV2ICYgMHhGRjAwKSAhPSAweDQwMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIShzYnVmLnN0X3JkZXYgJiAweEZGKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB0dHlfdmMgPSBzYnVmLnN0X3JkZXYgJiAweEZGOworICAgICAgICByZXN0b3JlX3RleHRfY29uc29sZShfUE1fY29uc29sZV9mZCk7CisgICAgICAgIHJldHVybiBfUE1fY29uc29sZV9mZDsKKyAgICAgICAgfQorICAgIGlmICgoX1BNX2NvbnNvbGVfZmQgPSBvcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1JEV1IpKSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJvcGVuX2Rldl9jb25zb2xlOiBjYW4ndCBvcGVuIC9kZXYvY29uc29sZSBcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9PUEVOUVJZLCAmdHR5X3ZjKSA8IDApCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgaWYgKHR0eV92YyA8PSAwKQorICAgICAgICBnb3RvIEVycm9yOworICAgIHNwcmludGYoZm5hbWUsICIvZGV2L3R0eSVkIiwgdHR5X3ZjKTsKKyAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7CisKKyAgICAvKiBDaGFuZ2Ugb3VyIGNvbnRyb2wgdGVybWluYWwgKi8KKyAgICBzZXRzaWQoKTsKKworICAgIC8qIFdlIG11c3QgdXNlIFJEV1IgdG8gYWxsb3cgZm9yIG91dHB1dC4uLiAqLworICAgIGlmICgoKF9QTV9jb25zb2xlX2ZkID0gb3BlbihmbmFtZSwgT19SRFdSKSkgPj0gMCkgJiYKKyAgICAgICAgICAgIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfR0VUU1RBVEUsICZ2dHMpID49IDApKSB7CisgICAgICAgIGlmICghY2hlY2tfb3duZXIodnRzLnZfYWN0aXZlKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIHJlc3RvcmVfdGV4dF9jb25zb2xlKF9QTV9jb25zb2xlX2ZkKTsKKworICAgICAgICAvKiBTdWNjZXNzLCByZWRpcmVjdCBhbGwgc3RkaW9zICovCisgICAgICAgIGZmbHVzaChzdGRpbik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgY2xvc2UoMCk7CisgICAgICAgIGNsb3NlKDEpOworICAgICAgICBjbG9zZSgyKTsKKyAgICAgICAgZHVwKF9QTV9jb25zb2xlX2ZkKTsKKyAgICAgICAgZHVwKF9QTV9jb25zb2xlX2ZkKTsKKyAgICAgICAgZHVwKF9QTV9jb25zb2xlX2ZkKTsKKworICAgICAgICAvKiBjbGVhciBzY3JlZW4gYW5kIHN3aXRjaCB0byBpdCAqLworICAgICAgICBmd3JpdGUoIlxlW0hcZVtKIiwgNiwgMSwgc3RkZXJyKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgIGlmICh0dHlfdmMgIT0gdnRzLnZfYWN0aXZlKSB7CisgICAgICAgICAgICBzdGFydHVwX3ZjID0gdnRzLnZfYWN0aXZlOworICAgICAgICAgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX0FDVElWQVRFLCB0dHlfdmMpOworICAgICAgICAgICAgd2FpdF92dF9hY3RpdmUoX1BNX2NvbnNvbGVfZmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIF9QTV9jb25zb2xlX2ZkOworCitFcnJvcjoKKyAgICBpZiAoX1BNX2NvbnNvbGVfZmQgPiAyKQorICAgICAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7CisgICAgY29uc29sZV9jb3VudCA9IDA7CisgICAgUE1fZmF0YWxFcnJvcigKKyAgICAgICAgIk5vdCBydW5uaW5nIGluIGEgZ3JhcGhpY3MgY2FwYWJsZSBjb25zb2xlLFxuIgorICAgICAgICAiYW5kIHVuYWJsZSB0byBmaW5kIG9uZS5cbiIpOworICAgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBGT05UX0MgIDB4MTAwMDAgICAgIC8qIDY0S0IgZm9yIGZvbnQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQoreworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgcmV0dXJuIFBNX2dldFZHQVN0YXRlU2l6ZSgpICsgRk9OVF9DKjI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQoreworICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgY29uc29sZSBmb250ICovCisgICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsR0lPX0ZPTlQsJnJlZ3NbUE1fZ2V0VkdBU3RhdGVTaXplKCldKSA8IDApCisgICAgICAgIHBlcnJvcigiaW9jdGwoR0lPX0ZPTlQpIik7CisKKyAgICAvKiBJbmZvcm0gdGhlIExpbnV4IGNvbnNvbGUgdGhhdCB3ZSBhcmUgZ29pbmcgaW50byBncmFwaGljcyBtb2RlICovCisgICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsIEtEU0VUTU9ERSwgS0RfR1JBUEhJQ1MpIDwgMCkKKyAgICAgICAgcGVycm9yKCJpb2N0bChLRFNFVE1PREUpIik7CisKKyAgICAvKiBTYXZlIHN0YXRlIG9mIFZHQSByZWdpc3RlcnMgKi8KKyAgICBQTV9zYXZlVkdBU3RhdGUoc3RhdGVCdWYpOworfQorCit2b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKK3sKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgYWxsb3dpbmcgY29uc29sZSBzd2l0Y2hpbmchICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgY29uc29sZV9pZCkKK3sKKyAgICBjb25zdCB1Y2hhciAqcmVncyA9IHN0YXRlQnVmOworCisgICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycyAqLworICAgIFBNX3Jlc3RvcmVWR0FTdGF0ZShzdGF0ZUJ1Zik7CisKKyAgICAvKiBJbmZvcm0gdGhlIExpbnV4IGNvbnNvbGUgdGhhdCB3ZSBhcmUgYmFjayBmcm9tIGdyYXBoaWNzIG1vZGVzICovCisgICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsIEtEU0VUTU9ERSwgS0RfVEVYVCkgPCAwKQorICAgICAgICBMT0dXQVJOKCJpb2N0bChLRFNFVE1PREUpIGZhaWxlZCIpOworCisgICAgLyogUmVzdG9yZSB0aGUgb2xkIGNvbnNvbGUgZm9udCAqLworICAgIGlmIChpb2N0bChjb25zb2xlX2lkLFBJT19GT05ULCZyZWdzW1BNX2dldFZHQVN0YXRlU2l6ZSgpXSkgPCAwKQorICAgICAgICBMT0dXQVJOKCJpb2N0bChLRFNFVE1PREUpIGZhaWxlZCIpOworCisgICAgLyogQ29taW5nIGJhY2sgZnJvbSBncmFwaGljcyBtb2RlIG9uIExpbnV4IGFsc28gcmVzdG9yZWQgdGhlIHByZXZpb3VzCisgICAgICogdGV4dCBtb2RlIGNvbnNvbGUgY29udGVudHMsIHNvIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHNjcmVlbiB0byBnZXQKKyAgICAgKiBhcm91bmQgdGhpcyBzaW5jZSB0aGUgY3Vyc29yIGRvZXMgbm90IGdldCBob21lZCBieSBvdXIgY29kZS4KKyAgICAgKi8KKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwcmludGYoIlwwMzNbSFwwMzNbSiIpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Nsb3NlIHRoZSBMaW51eCBjb25zb2xlIGFuZCBwdXQgaXQgYmFjayB0byBub3JtYWwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBfUE1fY29uc29sZV9mZCkKK3sKKyAgICAvKiBSZXN0b3JlIGNvbnNvbGUgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLworICAgIGlmICgtLWNvbnNvbGVfY291bnQgPT0gMCkgeworICAgICAgICAvKiBSZS1hY3RpdmF0ZSB0aGUgb3JpZ2luYWwgdmlydHVhbCBjb25zb2xlICovCisgICAgICAgIGlmIChzdGFydHVwX3ZjID4gMCkKKyAgICAgICAgICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9BQ1RJVkFURSwgc3RhcnR1cF92Yyk7CisKKyAgICAgICAgLyogQ2xvc2UgdGhlIGNvbnNvbGUgZmlsZSBkZXNjcmlwdG9yICovCisgICAgICAgIGlmIChfUE1fY29uc29sZV9mZCA+IDIpCisgICAgICAgICAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7CisgICAgICAgIF9QTV9jb25zb2xlX2ZkID0gLTE7CisgICAgICAgIH0KK30KKwordm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgc2NyZWVuIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBMaW51eCBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKK3sKKyAgICBzdHJ1Y3Qgd2luc2l6ZSAgd3M7CisgICAgc3RydWN0IHZ0X3NpemVzIHZzOworCisgICAgLy8gUmVzaXplIHRoZSBzb2Z0d2FyZSB0ZXJtaW5hbAorICAgIHdzLndzX2NvbCA9IHdpZHRoOworICAgIHdzLndzX3JvdyA9IGhlaWdodDsKKyAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVElPQ1NXSU5TWiwgJndzKTsKKworICAgIC8vIEFuZCB0aGUgaGFyZHdhcmUKKyAgICB2cy52X3Jvd3MgPSBoZWlnaHQ7CisgICAgdnMudl9jb2xzID0gd2lkdGg7CisgICAgdnMudl9zY3JvbGxzaXplID0gMDsKKyAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfUkVTSVpFLCAmdnMpOworfQorCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eAorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4Cit9CisKK2NoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKKyAgICBjaGFyICpwYXRoLAorICAgIGludCBtYXhMZW4pCit7CisgICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Cit9CisKK2NoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCit7IHJldHVybiAnLyc7IH0KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoreyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKK3sKKyAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOworICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKyAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOworICAgIHJldHVybiBwYXRoOworfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKKyAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgYnVmWzEyOF07CisgICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOworICAgIHJldHVybiBidWY7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoreworICAgIHN0YXRpYyB1Y2hhciAqemVyb1B0ciA9IE5VTEw7CisgICAgaWYgKCF6ZXJvUHRyKQorICAgICAgICB6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKKyAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgMHg0MDApOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCit7CisgICAgLyogUE1faW5pdCBtYXBzIGluIHRoZSAweEEwMDAwIGZyYW1lYnVmZmVyIHJlZ2lvbiAxOjEgd2l0aCBvdXIKKyAgICAgKiBhZGRyZXNzIG1hcHBpbmcsIHNvIHdlIGNhbiByZXR1cm4gdGhlIGFkZHJlc3MgaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIHJldHVybiAodm9pZCopKDB4QTAwMDApOworfQorCit2b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCit7CisgICAgdWNoYXIgICAqcDsKKyAgICB1bG9uZyAgIGJhc2VBZGRyLGJhc2VPZnM7CisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGlmIChiYXNlID49IDB4QTAwMDAgJiYgYmFzZSA8IDB4MTAwMDAwKQorICAgICAgICByZXR1cm4gKHZvaWQqKWJhc2U7CisgICAgaWYgKCFmZF9tZW0gJiYgKGZkX21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRFdSKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCisgICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBtbWFwLiBJZiB3ZSByb3VuZCB0aGUKKyAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCisgICAgICogdGhhdCB3ZSByZXR1cm4uCisgICAgICovCisgICAgYmFzZU9mcyA9IGJhc2UgJiA0MDk1OworICAgIGJhc2VBZGRyID0gYmFzZSAmIH40MDk1OworICAgIGxpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKKyAgICBpZiAoKHAgPSBtbWFwKDAsIGxpbWl0KzEsCisgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorICAgICAgICAgICAgZmRfbWVtLCBiYXNlQWRkcikpID09ICh2b2lkICopLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAodm9pZCopKHArYmFzZU9mcyk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCit7CisgICAgaWYgKCh1bG9uZylwdHIgPj0gMHgxMDAwMDApCisgICAgICAgIG11bm1hcChwdHIsbGltaXQrMSk7Cit9CisKK3Vsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIKKyAgICAvLyAgICAgICBhZGRyZXNzLgorICAgIHJldHVybiAweEZGRkZGRkZGVUw7Cit9CisKK2lib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVzc2VzCisgICAgLy8gICAgICAgZm9yIGEgbGluZWFyIGFkZHJlc3MuCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKK3sKKyAgICAvLyBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICAvLyBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5CisgICAgLy8gICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLgorICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNGODsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgyRjg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzQkM7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4Mzc4OworICAgICAgICBjYXNlIDI6IHJldHVybiAweDI3ODsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKK3sKKyAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQoreworICAgIFBNX2ZyZWUocHRyKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sKKyAgICAvKiBQTV9pbml0IG1hcHMgaW4gdGhlIDB4QTAwMDAtMHgxMDAwMDAgcmVnaW9uIDE6MSB3aXRoIG91cgorICAgICAqIGFkZHJlc3MgbWFwcGluZywgYXMgd2VsbCBhcyBhbGwgbWVtb3J5IGJsb2NrcyBpbiBhIDE6MSBhZGRyZXNzCisgICAgICogbWFwcGluZyBzbyB3ZSBjYW4gc2ltcGx5IHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiBoZXJlLgorICAgICAqLworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgcmV0dXJuICh2b2lkKilNS19QSFlTKHJfc2VnLHJfb2ZmKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCit7CisgICAgaW50ICAgICBpOworICAgIGNoYXIgICAgKnIgPSAoY2hhciAqKVJFQUxfTUVNX0JBU0U7CisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGlmICghbWVtX2luZm8ucmVhZHkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtZW1faW5mby5jb3VudCA9PSBSRUFMX01FTV9CTE9DS1MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNpemUgPSAoc2l6ZSArIDE1KSAmIH4xNTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVtX2luZm8uY291bnQ7IGkrKykgeworICAgICAgICBpZiAobWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgJiYgc2l6ZSA8IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplKSB7CisgICAgICAgICAgICBpbnNlcnRfYmxvY2soaSk7CisgICAgICAgICAgICBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtZW1faW5mby5ibG9ja3NbaV0uZnJlZSA9IDA7CisgICAgICAgICAgICBtZW1faW5mby5ibG9ja3NbaSArIDFdLnNpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICpyX3NlZyA9ICh1aW50KShyKSA+PiA0OworICAgICAgICAgICAgKnJfb2ZmID0gKHVpbnQpKHIpICYgMHhGOworICAgICAgICAgICAgcmV0dXJuICh2b2lkICopcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgciArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgY2hhciAgICAqciA9IChjaGFyICopUkVBTF9NRU1fQkFTRTsKKworICAgIGlmICghbWVtX2luZm8ucmVhZHkpCisgICAgICAgIHJldHVybjsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAobWVtICE9ICh2b2lkICopcikgeworICAgICAgICByICs9IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplOworICAgICAgICBpKys7CisgICAgICAgIGlmIChpID09IG1lbV9pbmZvLmNvdW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgbWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgPSAxOworICAgIGlmIChpICsgMSA8IG1lbV9pbmZvLmNvdW50ICYmIG1lbV9pbmZvLmJsb2Nrc1tpICsgMV0uZnJlZSkgeworICAgICAgICBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZSArPSBtZW1faW5mby5ibG9ja3NbaSArIDFdLnNpemU7CisgICAgICAgIGRlbGV0ZV9ibG9jayhpICsgMSk7CisgICAgICAgIH0KKyAgICBpZiAoaSAtIDEgPj0gMCAmJiBtZW1faW5mby5ibG9ja3NbaSAtIDFdLmZyZWUpIHsKKyAgICAgICAgbWVtX2luZm8uYmxvY2tzW2kgLSAxXS5zaXplICs9IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplOworICAgICAgICBkZWxldGVfYmxvY2soaSk7CisgICAgICAgIH0KK30KKworI2RlZmluZSBESVJFQ1RJT05fRkxBRyAgKDEgPDwgMTApCisKK3N0YXRpYyB2b2lkIGVtX2lucyhpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZWR4LCBlZGk7CisKKyAgICBlZHggPSBjb250ZXh0LnZtLnJlZ3MuZWR4ICYgMHhmZmZmOworICAgIGVkaSA9IGNvbnRleHQudm0ucmVncy5lZGkgJiAweGZmZmY7CisgICAgZWRpICs9ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7CisgICAgaWYgKGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiBESVJFQ1RJT05fRkxBRykgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgic3RkOyBpbnNsOyBjbGQiCisgICAgICAgICAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOworICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IGluc3c7IGNsZCIKKyAgICAgICAgICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgaW5zYjsgY2xkIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnNsIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnN3IgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnNiIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKKyAgICAgICAgfQorICAgIGVkaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OworICAgIGNvbnRleHQudm0ucmVncy5lZGkgJj0gMHhmZmZmMDAwMDsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWRpIHw9IGVkaSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgZW1fcmVwX2lucyhpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZWN4LCBlZHgsIGVkaTsKKworICAgIGVjeCA9IGNvbnRleHQudm0ucmVncy5lY3ggJiAweGZmZmY7CisgICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKKyAgICBlZGkgPSBjb250ZXh0LnZtLnJlZ3MuZWRpICYgMHhmZmZmOworICAgIGVkaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OworICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBpbnNsOyBjbGQiCisgICAgICAgICAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCisgICAgICAgICAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IGluc3c7IGNsZCIKKyAgICAgICAgICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKKyAgICAgICAgICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgaW5zYjsgY2xkIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQorICAgICAgICAgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNsIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQorICAgICAgICAgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnN3IgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQorICAgICAgICAgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNiIgorICAgICAgICAgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQorICAgICAgICAgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7CisgICAgICAgIH0KKworICAgIGVkaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OworICAgIGNvbnRleHQudm0ucmVncy5lZGkgJj0gMHhmZmZmMDAwMDsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWRpIHw9IGVkaSAmIDB4ZmZmZjsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWN4ICY9IDB4ZmZmZjAwMDA7CisgICAgY29udGV4dC52bS5yZWdzLmVjeCB8PSBlY3ggJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIGVtX291dHMoaW50IHNpemUpCit7CisgICAgdW5zaWduZWQgaW50IGVkeCwgZXNpOworCisgICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKKyAgICBlc2kgPSBjb250ZXh0LnZtLnJlZ3MuZXNpICYgMHhmZmZmOworICAgIGVzaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OworICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c2w7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c3c7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c2I7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgb3V0c2wiCisgICAgICAgICAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOworICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IG91dHN3IgorICAgICAgICAgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBvdXRzYiIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7CisgICAgICAgIH0KKworICAgIGVzaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OworICAgIGNvbnRleHQudm0ucmVncy5lc2kgJj0gMHhmZmZmMDAwMDsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZXNpIHw9IGVzaSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgZW1fcmVwX291dHMoaW50IHNpemUpCit7CisgICAgdW5zaWduZWQgaW50IGVjeCwgZWR4LCBlc2k7CisKKyAgICBlY3ggPSBjb250ZXh0LnZtLnJlZ3MuZWN4ICYgMHhmZmZmOworICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7CisgICAgZXNpID0gY29udGV4dC52bS5yZWdzLmVzaSAmIDB4ZmZmZjsKKyAgICBlc2kgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKKyAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7CisgICAgICAgIGlmIChzaXplID09IDQpCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c2w7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKKyAgICAgICAgICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOworICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c3c7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKKyAgICAgICAgICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c2I7IGNsZCIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKKyAgICAgICAgICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzaXplID09IDQpCisgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c2wiCisgICAgICAgICAgICAgOiAiPVMiIChlc2kpLCAiPWMiIChlY3gpCisgICAgICAgICAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHN3IgorICAgICAgICAgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQorICAgICAgICAgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzYiIKKyAgICAgICAgICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKKyAgICAgICAgICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOworICAgICAgICB9CisKKyAgICBlc2kgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZXNpICY9IDB4ZmZmZjAwMDA7CisgICAgY29udGV4dC52bS5yZWdzLmVzaSB8PSBlc2kgJiAweGZmZmY7CisgICAgY29udGV4dC52bS5yZWdzLmVjeCAmPSAweGZmZmYwMDAwOworICAgIGNvbnRleHQudm0ucmVncy5lY3ggfD0gZWN4ICYgMHhmZmZmOworfQorCitzdGF0aWMgaW50IGVtdWxhdGUodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICppbnNuOworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplIDogMTsKKyAgICAgICAgdW5zaWduZWQgaW50IHJlcCA6IDE7CisgICAgICAgIH0gcHJlZml4ID0geyAwLCAwIH07CisgICAgaW50IGkgPSAwOworCisgICAgaW5zbiA9ICh1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmNzIDw8IDQpOworICAgIGluc24gKz0gY29udGV4dC52bS5yZWdzLmVpcDsKKworICAgIHdoaWxlICgxKSB7CisjaWZkZWYgVFJBQ0VfSU8KKyAgICAgICAgdHJhY2VBZGRyID0gKCh1bG9uZyljb250ZXh0LnZtLnJlZ3MuY3MgPDwgMTYpICsgY29udGV4dC52bS5yZWdzLmVpcCArIGk7CisjZW5kaWYKKyAgICAgICAgaWYgKGluc25baV0gPT0gMHg2NikgeworICAgICAgICAgICAgcHJlZml4LnNpemUgPSAxIC0gcHJlZml4LnNpemU7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGluc25baV0gPT0gMHhmMykgeworICAgICAgICAgICAgcHJlZml4LnJlcCA9IDE7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGluc25baV0gPT0gMHhmMCB8fCBpbnNuW2ldID09IDB4ZjIKKyAgICAgICAgICAgICB8fCBpbnNuW2ldID09IDB4MjYgfHwgaW5zbltpXSA9PSAweDJlCisgICAgICAgICAgICAgfHwgaW5zbltpXSA9PSAweDM2IHx8IGluc25baV0gPT0gMHgzZQorICAgICAgICAgICAgIHx8IGluc25baV0gPT0gMHg2NCB8fCBpbnNuW2ldID09IDB4NjUKKyAgICAgICAgICAgICB8fCBpbnNuW2ldID09IDB4NjcpIHsKKyAgICAgICAgICAgIC8qIHRoZXNlIHByZWZpeGVzIGFyZSBqdXN0IGlnbm9yZWQgKi8KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5zbltpXSA9PSAweDZjKSB7CisgICAgICAgICAgICBpZiAocHJlZml4LnJlcCkKKyAgICAgICAgICAgICAgICBlbV9yZXBfaW5zKDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVtX2lucygxKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbnNuW2ldID09IDB4NmQpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXgucmVwKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5zaXplKQorICAgICAgICAgICAgICAgICAgICBlbV9yZXBfaW5zKDQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW1fcmVwX2lucygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlZml4LnNpemUpCisgICAgICAgICAgICAgICAgICAgIGVtX2lucyg0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVtX2lucygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5zbltpXSA9PSAweDZlKSB7CisgICAgICAgICAgICBpZiAocHJlZml4LnJlcCkKKyAgICAgICAgICAgICAgICBlbV9yZXBfb3V0cygxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbV9vdXRzKDEpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGluc25baV0gPT0gMHg2ZikgeworICAgICAgICAgICAgaWYgKHByZWZpeC5yZXApIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlZml4LnNpemUpCisgICAgICAgICAgICAgICAgICAgIGVtX3JlcF9vdXRzKDQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW1fcmVwX291dHMoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5zaXplKQorICAgICAgICAgICAgICAgICAgICBlbV9vdXRzKDQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW1fb3V0cygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5zbltpXSA9PSAweGVjKSB7CisgICAgICAgICAgICAqKCh1Y2hhciopJmNvbnRleHQudm0ucmVncy5lYXgpID0gcG9ydF9pbihjb250ZXh0LnZtLnJlZ3MuZWR4KTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbnNuW2ldID09IDB4ZWQpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXguc2l6ZSkKKyAgICAgICAgICAgICAgICAqKCh1bG9uZyopJmNvbnRleHQudm0ucmVncy5lYXgpID0gcG9ydF9pbmwoY29udGV4dC52bS5yZWdzLmVkeCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKigodXNob3J0KikmY29udGV4dC52bS5yZWdzLmVheCkgPSBwb3J0X2ludyhjb250ZXh0LnZtLnJlZ3MuZWR4KTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbnNuW2ldID09IDB4ZWUpIHsKKyAgICAgICAgICAgIHBvcnRfb3V0KGNvbnRleHQudm0ucmVncy5lYXgsY29udGV4dC52bS5yZWdzLmVkeCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5zbltpXSA9PSAweGVmKSB7CisgICAgICAgICAgICBpZiAocHJlZml4LnNpemUpCisgICAgICAgICAgICAgICAgcG9ydF9vdXRsKGNvbnRleHQudm0ucmVncy5lYXgsY29udGV4dC52bS5yZWdzLmVkeCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcG9ydF9vdXR3KGNvbnRleHQudm0ucmVncy5lYXgsY29udGV4dC52bS5yZWdzLmVkeCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgIGNvbnRleHQudm0ucmVncy5laXAgKz0gaTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGVidWdfaW5mbyhpbnQgdnJldCkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworCisgICAgZnB1dHMoInZtODYoKSBmYWlsZWRcbiIsIHN0ZGVycik7CisgICAgZnByaW50ZihzdGRlcnIsICJyZXR1cm4gPSAweCV4XG4iLCB2cmV0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVheCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lYXgpOworICAgIGZwcmludGYoc3RkZXJyLCAiZWJ4ID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVieCk7CisgICAgZnByaW50ZihzdGRlcnIsICJlY3ggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWN4KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVkeCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lZHgpOworICAgIGZwcmludGYoc3RkZXJyLCAiZXNpID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVzaSk7CisgICAgZnByaW50ZihzdGRlcnIsICJlZGkgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWRpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVicCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lYnApOworICAgIGZwcmludGYoc3RkZXJyLCAiZWlwID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVpcCk7CisgICAgZnByaW50ZihzdGRlcnIsICJjcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5jcyk7CisgICAgZnByaW50ZihzdGRlcnIsICJlc3AgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZXNwKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInNzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLnNzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImRzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLmRzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLmVzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLmZzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImdzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLmdzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVmbGFncyAgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzKTsKKyAgICBmcHV0cygiY3M6aXAgPSBbICIsIHN0ZGVycik7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopKChjb250ZXh0LnZtLnJlZ3MuY3MgPDwgNCkgKyAoY29udGV4dC52bS5yZWdzLmVpcCAmIDB4ZmZmZikpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsICh1bnNpZ25lZCBpbnQpcFtpXSk7CisgICAgZnB1dHMoIl1cbiIsIHN0ZGVycik7CisgICAgZmZsdXNoKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3ZtODYodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnJldDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgdnJldCA9IHZtODYoJmNvbnRleHQudm0pOworICAgICAgICBpZiAoVk04Nl9UWVBFKHZyZXQpID09IFZNODZfSU5UeCkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHYgPSBWTTg2X0FSRyh2cmV0KTsKKyAgICAgICAgICAgIGlmICh2ID09IFJFVFVSTl9UT18zMl9JTlQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuZWZsYWdzKTsKKyAgICAgICAgICAgIHB1c2h3KGNvbnRleHQudm0ucmVncy5jcyk7CisgICAgICAgICAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuZWlwKTsKKyAgICAgICAgICAgIGNvbnRleHQudm0ucmVncy5jcyA9IGdldF9pbnRfc2VnKHYpOworICAgICAgICAgICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKHYpOworICAgICAgICAgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyAmPSB+KFZJRl9NQVNLIHwgVEZfTUFTSyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKFZNODZfVFlQRSh2cmV0KSAhPSBWTTg2X1VOS05PV04pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFlbXVsYXRlKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGRlYnVnX2luZm8odnJldCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSU5EKGVyZWcpIGNvbnRleHQudm0ucmVncy5lcmVnID0gcmVncy0+ZXJlZworI2RlZmluZSBPVVREKGVyZWcpIHJlZ3MtPmVyZWcgPSBjb250ZXh0LnZtLnJlZ3MuZXJlZworCit2b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCit7CisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOworICAgIElORChlYXgpOyBJTkQoZWJ4KTsgSU5EKGVjeCk7IElORChlZHgpOyBJTkQoZXNpKTsgSU5EKGVkaSk7CisgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZyhpbnRubyk7CisgICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKGludG5vKTsKKyAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7CisgICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKKyAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOworICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7CisgICAgcnVuX3ZtODYoKTsKKyAgICBPVVREKGVheCk7IE9VVEQoZWJ4KTsgT1VURChlY3gpOyBPVVREKGVkeCk7IE9VVEQoZXNpKTsgT1VURChlZGkpOworICAgIHJlZ3MtPmZsYWdzID0gY29udGV4dC52bS5yZWdzLmVmbGFnczsKK30KKworI2RlZmluZSBJTihlcmVnKSBjb250ZXh0LnZtLnJlZ3MuZXJlZyA9IGluLT5lLmVyZWcKKyNkZWZpbmUgT1VUKGVyZWcpIG91dC0+ZS5lcmVnID0gY29udGV4dC52bS5yZWdzLmVyZWcKKworaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCit7CisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZyhpbnRubyk7CisgICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKGludG5vKTsKKyAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7CisgICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKKyAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOworICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7CisgICAgcnVuX3ZtODYoKTsKKyAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOworICAgIG91dC0+eC5jZmxhZyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiAxOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGlmIChpbnRubyA9PSAweDIxKSB7CisgICAgICAgIHRpbWVfdCB0b2RheSA9IHRpbWUoTlVMTCk7CisgICAgICAgIHN0cnVjdCB0bSAqdDsKKyAgICAgICAgdCA9IGxvY2FsdGltZSgmdG9kYXkpOworICAgICAgICBvdXQtPnguY3ggPSB0LT50bV95ZWFyICsgMTkwMDsKKyAgICAgICAgb3V0LT5oLmRoID0gdC0+dG1fbW9uICsgMTsKKyAgICAgICAgb3V0LT5oLmRsID0gdC0+dG1fbWRheTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICB1bnNpZ25lZCBpbnQgc2VnLCBvZmY7CisgICAgICAgIHNlZyA9IGdldF9pbnRfc2VnKGludG5vKTsKKyAgICAgICAgb2ZmID0gZ2V0X2ludF9vZmYoaW50bm8pOworICAgICAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOworICAgICAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOworICAgICAgICBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzID0gREVGQVVMVF9WTTg2X0ZMQUdTOworICAgICAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBzZWc7CisgICAgICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBvZmY7CisgICAgICAgIGNvbnRleHQudm0ucmVncy5lcyA9IHNyZWdzLT5lczsKKyAgICAgICAgY29udGV4dC52bS5yZWdzLmRzID0gc3JlZ3MtPmRzOworICAgICAgICBjb250ZXh0LnZtLnJlZ3MuZnMgPSBzcmVncy0+ZnM7CisgICAgICAgIGNvbnRleHQudm0ucmVncy5ncyA9IHNyZWdzLT5nczsKKyAgICAgICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7CisgICAgICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKKyAgICAgICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKKyAgICAgICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKKyAgICAgICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKKyAgICAgICAgcnVuX3ZtODYoKTsKKyAgICAgICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKKyAgICAgICAgc3JlZ3MtPmVzID0gY29udGV4dC52bS5yZWdzLmVzOworICAgICAgICBzcmVncy0+ZHMgPSBjb250ZXh0LnZtLnJlZ3MuZHM7CisgICAgICAgIHNyZWdzLT5mcyA9IGNvbnRleHQudm0ucmVncy5mczsKKyAgICAgICAgc3JlZ3MtPmdzID0gY29udGV4dC52bS5yZWdzLmdzOworICAgICAgICBvdXQtPnguY2ZsYWcgPSBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgMTsKKyAgICAgICAgfQorICAgIHJldHVybiBvdXQtPmUuZWF4OworfQorCisjZGVmaW5lIE9VVFIoZXJlZykgaW4tPmUuZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCisKK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAorICAgIFJNU1JFR1MgKnNyZWdzKQoreworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKKyAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOworICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7CisgICAgY29udGV4dC52bS5yZWdzLmNzID0gc2VnOworICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBvZmY7CisgICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7CisgICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOworICAgIGNvbnRleHQudm0ucmVncy5lcyA9IHNyZWdzLT5lczsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZHMgPSBzcmVncy0+ZHM7CisgICAgY29udGV4dC52bS5yZWdzLmZzID0gc3JlZ3MtPmZzOworICAgIGNvbnRleHQudm0ucmVncy5ncyA9IHNyZWdzLT5nczsKKyAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOworICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7CisgICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKKyAgICBydW5fdm04NigpOworICAgIE9VVFIoZWF4KTsgT1VUUihlYngpOyBPVVRSKGVjeCk7IE9VVFIoZWR4KTsgT1VUUihlc2kpOyBPVVRSKGVkaSk7CisgICAgc3JlZ3MtPmVzID0gY29udGV4dC52bS5yZWdzLmVzOworICAgIHNyZWdzLT5kcyA9IGNvbnRleHQudm0ucmVncy5kczsKKyAgICBzcmVncy0+ZnMgPSBjb250ZXh0LnZtLnJlZ3MuZnM7CisgICAgc3JlZ3MtPmdzID0gY29udGV4dC52bS5yZWdzLmdzOworICAgIGluLT54LmNmbGFnID0gY29udGV4dC52bS5yZWdzLmVmbGFncyAmIDE7Cit9CisKK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCit7CisgICAgRklMRSAgICAqbWVtID0gZm9wZW4oIi9wcm9jL21lbWluZm8iLCJyIik7CisgICAgY2hhciAgICBidWZbMTAyNF07CisKKyAgICBmZ2V0cyhidWYsMTAyNCxtZW0pOworICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7CisgICAgc3NjYW5mKGJ1ZiwiTWVtOiAlKmQgJSpkICVsZCIsIHBoeXNpY2FsKTsKKyAgICBmZ2V0cyhidWYsMTAyNCxtZW0pOworICAgIHNzY2FuZihidWYsIlN3YXA6ICUqZCAlKmQgJWxkIiwgdG90YWwpOworICAgIGZjbG9zZShtZW0pOworICAgICp0b3RhbCArPSAqcGh5c2ljYWw7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk0pCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eAorfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAorICAgIGlib29sIGxvY2tlZCkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgTGludXgKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKKyAgICB2b2lkICpwKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eAorfQorCit2b2lkIFBNQVBJIFBNX3NldEJhbmtBKGludCBiYW5rKQoreworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA1OworICAgIGNvbnRleHQudm0ucmVncy5lYnggPSAweDAwMDA7CisgICAgY29udGV4dC52bS5yZWdzLmVkeCA9IGJhbms7CisgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7CisgICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7CisgICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOworICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7CisgICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKKyAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOworICAgIHJ1bl92bTg2KCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKGludCBiYW5rKQoreworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA1OworICAgIGNvbnRleHQudm0ucmVncy5lYnggPSAweDAwMDA7CisgICAgY29udGV4dC52bS5yZWdzLmVkeCA9IGJhbms7CisgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKKyAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7CisgICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7CisgICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOworICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7CisgICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKKyAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOworICAgIHJ1bl92bTg2KCk7CisgICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAxOworICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOworICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7CisgICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7CisgICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOworICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOworICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKKyAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOworICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7CisgICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKKyAgICBydW5fdm04NigpOworfQorCit2b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQoreworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKKyAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA3OworICAgIGNvbnRleHQudm0ucmVncy5lYnggPSB3YWl0VlJUOworICAgIGNvbnRleHQudm0ucmVncy5lY3ggPSB4OworICAgIGNvbnRleHQudm0ucmVncy5lZHggPSB5OworICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7CisgICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7CisgICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOworICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOworICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKKyAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOworICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7CisgICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKKyAgICBydW5fdm04NigpOworfQorCitpbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKHVsb25nIGJhc2UsdWxvbmcgbGVuZ3RoLHVpbnQgdHlwZSkKK3sKKyNpZmRlZiBFTkFCTEVfTVRSUgorICAgIHN0cnVjdCBtdHJyX3NlbnRyeSBzZW50cnk7CisKKyAgICBpZiAobXRycl9mZCA8IDApCisgICAgICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOworICAgIHNlbnRyeS5iYXNlID0gYmFzZTsKKyAgICBzZW50cnkuc2l6ZSA9IGxlbmd0aDsKKyAgICBzZW50cnkudHlwZSA9IHR5cGU7CisgICAgaWYgKGlvY3RsKG10cnJfZmQsIE1UUlJJT0NfQUREX0VOVFJZLCAmc2VudHJ5KSA9PSAtMSkgeworICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGRlY29kZSBNVFJSIGVycm9yIGNvZGVzISEKKyAgICAgICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKKyNlbHNlCisgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQ7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitjYWxsYmFjayAgICAtIEZ1bmN0aW9uIHRvIGNhbGxiYWNrIHdpdGggd3JpdGUgY29tYmluZSBpbmZvcm1hdGlvbgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCB3cml0ZSBjb21iaW5lIHJlZ2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZQorcHJvY2Vzc29yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9lbnVtV3JpdGVDb21iaW5lKAorICAgIFBNX2VudW1Xcml0ZUNvbWJpbmVfdCBjYWxsYmFjaykKK3sKKyNpZmRlZiBFTkFCTEVfTVRSUgorICAgIHN0cnVjdCBtdHJyX2dlbnRyeSBnZW50cnk7CisKKyAgICBpZiAobXRycl9mZCA8IDApCisgICAgICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOworCisgICAgZm9yIChnZW50cnkucmVnbnVtID0gMDsgaW9jdGwgKG10cnJfZmQsIE1UUlJJT0NfR0VUX0VOVFJZLCAmZ2VudHJ5KSA9PSAwOworICAgICAgICAgKytnZW50cnkucmVnbnVtKSB7CisgICAgICAgIGlmIChnZW50cnkuc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGVzIGluIHBtYXBpLmggbWF0Y2ggdGhlIG9uZXMKKyAgICAgICAgICAgIC8vIGluIHRoZSBMaW51eCBrZXJuZWwgKG10cnIuaCkKKyAgICAgICAgICAgIGNhbGxiYWNrKGdlbnRyeS5iYXNlLCBnZW50cnkuc2l6ZSwgZ2VudHJ5LnR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOworI2Vsc2UKKyAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKKyNlbmRpZgorfQorCitpYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAorICAgIHVzaG9ydCBheFZhbCwKKyAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCisgICAgdm9pZCAqY29weU9mQklPUywKKyAgICB1bG9uZyBCSU9TTGVuKQoreworICAgIGNoYXIgICAgICAgICpiaW9zX3B0ciA9IChjaGFyKikweEMwMDAwOworICAgIGNoYXIgICAgICAgICpvbGRfYmlvczsKKyAgICB1bG9uZyAgICAgICBDdXJyZW50MTAsIEN1cnJlbnQ2RCwgKnJ2ZWMgPSAwOworICAgIFJNUkVHUyAgICAgIHJlZ3M7CisgICAgUk1TUkVHUyAgICAgc3JlZ3M7CisKKyAgICAvKiBUaGUgQklPUyBpcyBtYXBwZWQgdG8gMHhDMDAwMCB3aXRoIGEgcHJpdmF0ZSBtZW1vcnkgbWFwcGluZyBlbmFibGVkCisgICAgICogd2hpY2ggbWVhbnMgd2UgaGF2ZSBhIGNvcHkgb24gd3JpdGUgc2NoZW1lLiBIZW5jZSB3ZSBzaW1wbHkgY29weQorICAgICAqIHRoZSBzZWNvbmRhcnkgQklPUyBpbWFnZSBvdmVyIHRoZSB0b3Agb2YgdGhlIG9sZCBvbmUuCisgICAgICovCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpZiAoKG9sZF9iaW9zID0gUE1fbWFsbG9jKEJJT1NMZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwKSB7CisgICAgICAgIG1lbWNweShvbGRfYmlvcyxiaW9zX3B0cixCSU9TTGVuKTsKKyAgICAgICAgbWVtY3B5KGJpb3NfcHRyLGNvcHlPZkJJT1MsQklPU0xlbik7CisgICAgICAgIH0KKworICAgIC8qIFRoZSBpbnRlcnJ1cHQgdmVjdG9ycyBzaG91bGQgYWxyZWFkeSBiZSBtbWFwKCknZWQgZnJvbSAwLTB4NDAwIGluIFBNX2luaXQgKi8KKyAgICBDdXJyZW50MTAgPSBydmVjWzB4MTBdOworICAgIEN1cnJlbnQ2RCA9IHJ2ZWNbMHg2RF07CisKKyAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLworICAgIHJ2ZWNbMHgxMF0gPSBydmVjWzB4NDJdOyAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KKyAgICByZWdzLnguYXggPSBheFZhbDsKKyAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOworCisgICAgLyogUmVzdG9yZSBpbnRlcnJ1cHQgdmVjdG9ycyAqLworICAgIHJ2ZWNbMHgxMF0gPSBDdXJyZW50MTA7CisgICAgcnZlY1sweDZEXSA9IEN1cnJlbnQ2RDsKKworICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgQklPUyBpbWFnZSAqLworICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMCkKKyAgICAgICAgbWVtY3B5KGJpb3NfcHRyLG9sZF9iaW9zLEJJT1NMZW4pOworICAgIFBNX2ZyZWUob2xkX2Jpb3MpOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcCA9IHA7ICBsZW4gPSBsZW47CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitQTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCisgICAgY29uc3QgY2hhciAqc3pETExOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEKKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWhNb2R1bGU7CisgICAgKHZvaWQpc3pQcm9jTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyEKKyAgICAodm9pZCloTW9kdWxlOworfQorCitpbnQgUE1BUEkgUE1fc2V0SU9QTCgKKyAgICBpbnQgbGV2ZWwpCit7CisgICAgLy8gVE9ETzogTW92ZSB0aGUgSU9QTCBzd2l0Y2hpbmcgaW50byB0aGlzIGZ1bmN0aW9uISEKKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIG9uIExpbnV4LgorfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzllZjJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKK3sKKyAgICBiYXNlQWRkciA9IGJhc2VBZGRyOworICAgIGJhbmtTaXplID0gYmFua1NpemU7CisgICAgY29kZUxlbiA9IGNvZGVMZW47CisgICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3p0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWJhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC96dGltZXIuYwpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBMaW51eAorKgorKiBEZXNjcmlwdGlvbjogIExpbnV4IHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX1pUaW1lckluaXQodm9pZCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVc2UgdGhlIGdldHRpbWVvZmRheSgpIGZ1bmN0aW9uIHRvIGdldCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHByb2JhYmx5IGxlc3MKK3Rob3VnaCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0OworICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgcmV0dXJuIHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgdG0tPnN0YXJ0LmxvdyA9IF9fVUxaUmVhZFRpbWUoKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgICAgIChfX1VMWlJlYWRUaW1lKCkgLSB0bS0+c3RhcnQubG93KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICB0bS0+ZW5kLmxvdyA9IF9fVUxaUmVhZFRpbWUoKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoreyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1ZjBlMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlCkBAIC0wLDAgKzEsMjkwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYgU2NpVGVjaCBTb2Z0d2FyZS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgbWFrZWZpbGUgZm9yIHRoZSBQTSBsaWJyYXJ5LiBCdWlsZHMgdGhlIGxpYnJhcnkKKyMgICAgICAgICAgICAgICBmaWxlIGFuZCBhbGwgdGVzdCBwcm9ncmFtcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5JTVBPUlQgLklHTk9SRSA6IERFQlVHX0FHUF9EUklWRVIgVEVTVF9IQVJORVNTIERFQlVHX1NERFBNSQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncyB0byBjb21tYW5kIGxpbmUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NGTEFHUyAgICAgICAgICArPSAkKERYX0NGTEFHUykKK0FTRkxBR1MgICAgICAgICArPSAkKERYX0FTRkxBR1MpCitOT19QTUxJQiAgICAgICAgOj0gMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbmNsdWRlIGRlZmluaXRpb25zIHNwZWNpZmljIGZvciB0aGUgdGFyZ2V0IHN5c3RlbQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLklGICQoVVNFX1ZYRCkKKworIyBCdWlsZGluZyBmb3IgV2luMzIgVnhEIChtaW5pbWFsIFBNIGxpYnJhcnkgaW1wbGVtZW50YXRpb24pCisKK0xJQk5BTUUgICAgICAgICA9IHBtCitPQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBmaWxlaW8kTyBwY2lsaWIkTyBcCisgICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhdnhkJE8gX3BtJE8gX210cnIkTyBfY3B1aW5mbyRPIFwKKyAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KK0RFUEVORF9TUkMgICAgICA6PSB2eGQ7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCisuU09VUkNFOiAgICAgICAgICAgdnhkIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cworCisuRUxJRiAkKFVTRV9OVERSVikKKworIyBCdWlsZGluZyBmb3IgTlQgZGV2aWNlIGRyaXZlcnMgKG1pbmltYWwgUE0gbGlicmFyeSBpbXBsZW1lbnRhdGlvbikKKworTElCTkFNRSAgICAgICAgID0gcG0KK09CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIG1lbSRPIGlycSRPIGludDg2JE8gXAorICAgICAgICAgICAgICAgICAgc3RkaW8kTyBzdGRsaWIkTyBwY2lsaWIkTyBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhbnRkcnYkTyBcCisgICAgICAgICAgICAgICAgICBfcG0kTyBfbXRyciRPIF9jcHVpbmZvJE8gX2ludDY0JE8gX3BjaWhlbHAkTyBfaXJxJE8KK0RFUEVORF9TUkMgICAgICA6PSBudGRydjtjb21tb247Y29kZXBhZ2U7dGVzdHMKKy5TT1VSQ0U6ICAgICAgICAgICBudGRydiBjb21tb24gY29kZXBhZ2UgdGVzdHMKKworLkVMSUYgJChVU0VfV0lOMzIpCisKKyMgQnVpbGRpbmcgZm9yIFdpbjMyCisKK0NGTEFHUyAgICAgICAgICArPSAtRFVTRV9PU19KT1lTVElDSworTElCTkFNRSAgICAgICAgID0gcG0KK09CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIGRkcmF3JE8genRpbWVyJE8gY3B1aW5mbyRPIHBjaWxpYiRPIFwKKyAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2F3aW4zMiRPIG50c2VydmMkTyBfam95JE8gX2NwdWluZm8kTyBcCisgICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCitERVBFTkRfU1JDICAgICAgOj0gd2luMzI7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCisuU09VUkNFOiAgICAgICAgICAgd2luMzIgY29tbW9uIGNvZGVwYWdlIHRlc3RzCisKKy5FTElGICQoVVNFX09TMjMyKQorCisjIEJ1aWxkaW5nIGZvciBPUy8yCisKKy5JRiAkKFVTRV9PUzJHVUkpCitMSUJOQU1FICAgICAgICAgPSBwbV9wbQorLkVMU0UKK0xJQk5BTUUgICAgICAgICA9IHBtCisuRU5ESUYKK09CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gcGNpbGliJE8gXAorICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYW9zMiRPIF9wbW9zMiRPIF9qb3kkTyBfY3B1aW5mbyRPIFwKKyAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8gZG9zc2N0bCRPCitERVBFTkRfU1JDICAgICAgOj0gb3MyO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cworLlNPVVJDRTogICAgICAgICAgIG9zMiBjb21tb24gY29kZXBhZ2UgdGVzdHMKKworLkVMSUYgJChVU0VfUU5YKQorCisjIEJ1aWxkaW5nIGZvciBRTlgKKworVVNFX0JJT1MgICAgICAgIDo9IDEKKy5JRiAkKFVTRV9QSE9UT04pCitMSUJOQU1FICAgICAgICAgPSBwbV9waAorLkVMSUYgJChVU0VfWDExKQorTElCTkFNRSAgICAgICAgID0gcG1feDExCisuRUxTRQorTElCTkFNRSAgICAgICAgID0gcG0KKy5FTkRJRgorT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBwY2lsaWIkTyBcCisgICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyBtdHJycW54JE8gdW5peGlvJE8gdmdhc3RhdGUkTyBnYXFueCRPIF9qb3kkTyBcCisgICAgICAgICAgICAgICAgICBfbXRycnFueCRPIF9jcHVpbmZvJE8gX2ludDY0JE8gX3BjaWhlbHAkTworREVQRU5EX1NSQyAgICAgIDo9IHFueDtjb21tb247Y29kZXBhZ2U7dGVzdHMKKy5TT1VSQ0U6ICAgICAgICAgICBxbnggY29tbW9uIGNvZGVwYWdlIHRlc3RzCisKKyMgSW5kaWNhdGUgdGhhdCB0aGlzIHByb2dyYW0gdXNlcyBOdWNsZXVzIGRldmljZSBkcml2ZXJzIChzbyBuZWVkcyBJL08gYWNjZXNzKQorVVNFX05VQ0xFVVMgICAgIDo9IDEKKworLkVMSUYgJChVU0VfTElOVVgpCisKKyMgQnVpbGRpbmcgZm9yIExpbnV4CisKK0NGTEFHUyAgICAgICAgICArPSAtREVOQUJMRV9NVFJSIC1EVVNFX09TX0pPWVNUSUNLCisuSUYgJChVU0VfWDExKQorTElCTkFNRSAgICAgICAgID0gcG1feDExCisuRUxTRQorTElCTkFNRSAgICAgICAgID0gcG0KKy5FTkRJRgorT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIHBjaWxpYiRPIFwKKyAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHVuaXhpbyRPIHZnYXN0YXRlJE8gZ2FsaW51eCRPIF9jcHVpbmZvJE8gXAorICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTworREVQRU5EX1NSQyAgICAgIDo9IGxpbnV4O2NvbW1vbjtjb2RlcGFnZTt0ZXN0czt4MTEKKy5TT1VSQ0U6ICAgICAgICAgICBsaW51eCBjb21tb24gY29kZXBhZ2UgdGVzdHMgeDExCisKKyMgQnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeQorLklGICQoU09GSUxFKQorTElCICAgICAgICAgICAgIDo9IGxkCitMSUJGTEFHUyAgICAgICAgOj0gLXIgLW8KK0NGTEFHUyAgICAgICAgICArPSAtZlBJQworLkVORElGCisKKy5FTElGICQoVVNFX0JFT1MpCisKKyMgQnVpbGRpbmcgZm9yIEJlT1MgR1VJCisKK0xJQk5BTUUgICAgICAgICA9IHBtCitPQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gcGNpbGliJE8gXAorICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYWJlb3MkTyBfam95JE8gX2NwdWluZm8kTyBcCisgICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCitERVBFTkRfU1JDICAgICAgOj0gYmVvcztjb21tb247Y29kZXBhZ2U7dGVzdHMKKy5TT1VSQ0U6ICAgICAgICAgICBiZW9zIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cworCisuRUxJRiAkKFVTRV9TTVgzMikKKworIyBCdWlsZGluZyBmb3IgU01YCisKK0xJQk5BTUUgICAgICAgICA9IHBtCitPQkpFQ1RTICAgICAgICAgPSBwbSRPIHBtc214JE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gcGNpbGliJE8gXAorICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYXNteCRPIF9wbSRPIF9wbXNteCRPIF9tdHJyJE8gX2V2ZW50JE8gXAorICAgICAgICAgICAgICAgICAgX2pveSRPIF9jcHVpbmZvJE8gX2ludDY0JE8gX3BjaWhlbHAkTyBfbHp0aW1lciRPCitERVBFTkRfU1JDICAgICAgOj0gc214O2NvbW1vbjtjb2RlcGFnZTt0ZXN0cworLlNPVVJDRTogICAgICAgICAgIHNteCBjb21tb24gY29kZXBhZ2UgdGVzdHMKKworLkVMSUYgJChVU0VfUlRUQVJHRVQpCisKKyMgQnVpbGRpbmcgZm9yIFJUVGFyZ2V0LTMyCisKK0xJQk5BTUUgICAgICAgICA9IHBtCitPQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKKyAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FydHQkTyBfbXRyciRPIF9qb3kkTyBfY3B1aW5mbyRPIFwKKyAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KK0RFUEVORF9TUkMgICAgICA6PSBydHRhcmdldDtjb21tb247Y29kZXBhZ2U7dGVzdHMKKy5TT1VSQ0U6ICAgICAgICAgICBydHRhcmdldCBjb21tb24gY29kZXBhZ2UgdGVzdHMKKworLkVMU0UKKworIyBCdWlsZGluZyBmb3IgTVNET1MKKworTElCTkFNRSAgICAgICAgID0gcG0KK09CSkVDVFMgICAgICAgICA9IHBtJE8gcG1kb3MkTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBcCisgICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyBwY2lsaWIkTyB2Z2FzdGF0ZSRPIGdhZG9zJE8gXAorICAgICAgICAgICAgICAgICAgX3BtJE8gX3BtZG9zJE8gX210cnIkTyBfdmZsYXQkTyBfZXZlbnQkTyBfam95JE8gX3BjaWhlbHAkTyBcCisgICAgICAgICAgICAgICAgICBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9senRpbWVyJE8gX2RtYSRPCitERVBFTkRfU1JDICAgICAgOj0gZG9zO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cworLlNPVVJDRTogICAgICAgICAgIGRvcyBjb21tb24gY29kZXBhZ2UgdGVzdHMKKworLkVORElGCisKKyMgT2JqZWN0IG1vZHVsZXMgZm9yIGtleWJvYXJkIGNvZGUgcGFnZXMKKworT0JKRUNUUyAgICAgICAgICs9IHVzX2VuZyRPCisKKyMgQ29tbW9uIG9iamVjdCBtb2R1bGVzCisKK09CSkVDVFMgICAgICAgICArPSBjb21tb24kTworLklGICQoQ0hFQ0tFRCkKK09CSkVDVFMgICAgICAgICArPSBkZWJ1ZyRPCisuRU5ESUYKKworIyBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5IG9iamVjdCBtb2R1bGVzLiBOb3RlIHRoYXQgd2hlbiBjb21waWxpbmcgYSB0ZXN0IGhhcm5lc3MKKyMgbGlicmFyeSB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIE51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCisKKy5JRiAkKFRFU1RfSEFSTkVTUykKK0NGTEFHUyAgICAgICAgICArPSAtRFRFU1RfSEFSTkVTUyAtRFBNTElCCitMSUJOQU1FICAgICAgICAgPSBwbV90ZXN0CisuRUxTRQorT0JKRUNUUyAgICAgICAgICs9IGdhbGliJE8gX2dhX2ltcCRPCisuRU5ESUYKKworLklGICQoREVCVUdfU0REUE1JKQorQ0ZMQUdTICAgICAgICAgICs9IC1EREVCVUdfU0REUE1JCisuRU5ESUYKKworIyBBR1AgbGlicmFyeSBvYmplY3QgbW9kdWxlcworCisuSUYgJChERUJVR19BR1BfRFJJVkVSKQorQ0ZMQUdTICAgICAgICAgICs9IC1EREVCVUdfQUdQX0RSSVZFUgorT0JKRUNUUyAgICAgICAgICs9IGFncGxpYiRPCisuRUxTRQorT0JKRUNUUyAgICAgICAgICs9IGFncGxpYiRPIHBlbG9hZGVyJE8gbGliY2ltcCRPIF9nYXRpbWVyJE8KKy5FTkRJRgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBOYW1lIG9mIGxpYnJhcnkgYW5kIGdlbmVyaWMgb2JqZWN0IGZpbGVzIHJlcXVpcmVkIHRvIGJ1aWxkIGl0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuSUYgJChTVEtDQUxMKQorTElCRklMRSAgICAgICAgID0gcyQoTFApJChMSUJOQU1FKSRMCisuRUxTRQorTElCRklMRSAgICAgICAgID0gJChMUCkkKExJQk5BTUUpJEwKKy5FTkRJRgorTElCQ0xFQU4gICAgICAgID0gKi5saWIgKi5hCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoYW5nZSBkZXN0aW5hdGlvbiBmb3IgbGlicmFyeSBmaWxlIGRlcGVuZGluZyB0aGUgZXh0ZW5kZXIgYmVpbmcgdXNlZC4gVGhpcworIyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgRE9TIGV4dGVuZGVyIHNpbmNlIHRoZSBmaWxlIGdvIGludG8gYSBzdWJkaXJlY3RvcnkKKyMgaW4gdGhlIG5vcm1hbCBsaWJyYXJ5IGRpcmVjdG9yeSwgb25lIGZvciBlYWNoIHN1cHBvcnRlZCBleHRlbmRlci4gT3RoZXIKKyMgT1MnZXMgcHV0IHRoZSBmaWxlIGludG8gdGhlIHJlZ3VsYXIgbGlicmFyeSBkaXJlY3RvcnksIHNpbmNlIHRoZXJlIGlzCisjIG9ubHkgb25lIHBlciBPUyBpbiB0aGlzIGNhc2UuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNS19QTU9ERSAgICAgICAgPSAxCisKKy5JRiAkKFRFU1RfSEFSTkVTUykKK0xJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKQorLkVMSUYgJChVU0VfVE5UKQorTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXHRudAorLkVMSUYgJChVU0VfRE9TNEdXKQorTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXGRvczRndworLkVMSUYgJChVU0VfWDMyKQorTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXHgzMgorLkVMSUYgJChVU0VfRFBNSTE2KQorTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXGRwbWkxNgorLkVMSUYgJChVU0VfRFBNSTMyKQorTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXGRwbWkzMgorLkVMSUYgJChVU0VfRE9TWCkKK0xJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkb3N4CisuRU5ECisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWVzIG9mIGFsbCBleGVjdXRhYmxlIGZpbGVzIGJ1aWx0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuSUYgJChVU0VfUkVBTERPUykKK0VYRUZJTEVTICAgICAgICA9IG1lbXRlc3QkRSBiaW9zcHRyJEUgdmlkZW8kRSBpc3Zlc2EkRSBjYWxscmVhbCRFICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIG1vdXNlJEUgdGljayRFIGtleSRFIGtleTE1JEUgYnJrJEUgYWx0YnJrJEUgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNyaXRpY2FsJEUgYWx0Y3JpdCRFIHZmdGVzdCRFIHJ0YyRFIGdldGNoJEUgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNwdSRFIHRpbWVyYyRFIHRpbWVyY3BwJEUgc2hvd3BjaSRFIHVzd2MkRSBibG9jayRFCisuRUxTRQorRVhFRklMRVMgICAgICAgID0gbWVtdGVzdCRFIHZpZGVvJEUgaXN2ZXNhJEUgY2FsbHJlYWwkRSB2ZnRlc3QkRSBnZXRjaCRFIFwKKyAgICAgICAgICAgICAgICAgIGNwdSRFIHRpbWVyYyRFIHRpbWVyY3BwJEUgc2hvd3BjaSRFIHVzd2MkRSBibG9jayRFIFwKKyAgICAgICAgICAgICAgICAgIHNhdmUkRSByZXN0b3JlJEUKKy5FTkRJRgorCithbGw6ICQoRVhFRklMRVMpCisKKyQoRVhFRklMRVMpOiAkKExJQkZJTEUpCisKK21lbXRlc3QkRTogIG1lbXRlc3QkTworYmlvc3B0ciRFOiAgYmlvc3B0ciRPCit2aWRlbyRFOiAgICB2aWRlbyRPCitpc3Zlc2EkRTogICBpc3Zlc2EkTworbW91c2UkRTogICAgbW91c2UkTwordGljayRFOiAgICAgdGljayRPCitrZXkkRTogICAgICBrZXkkTwora2V5MTUkRTogICAga2V5MTUkTworYnJrJEU6ICAgICAgYnJrJE8KK2FsdGJyayRFOiAgIGFsdGJyayRPCitjcml0aWNhbCRFOiBjcml0aWNhbCRPCithbHRjcml0JEU6ICBhbHRjcml0JE8KK2NhbGxyZWFsJEU6IGNhbGxyZWFsJE8KK3ZmdGVzdCRFOiAgIHZmdGVzdCRPCitydGMkRTogICAgICBydGMkTworZ2V0Y2gkRTogICAgZ2V0Y2gkTworY3B1JEU6ICAgICAgY3B1JE8KK3RpbWVyYyRFOiAgIHRpbWVyYyRPCit0aW1lcmNwcCRFOiB0aW1lcmNwcCRPCitzaG93cGNpJEU6ICBzaG93cGNpJE8KK3Vzd2MkRTogICAgIHVzd2MkTworYmxvY2skRTogICAgYmxvY2skTworc2F2ZSRFOiAgICAgc2F2ZSRPCityZXN0b3JlJEU6ICByZXN0b3JlJE8KK3Rlc3QkRTogICAgIHRlc3QkTyBfdGVzdCRPCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gY3JlYXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERVBFTkRfT0JKICAgICAgOj0gJChPQkpFQ1RTKSBtZW10ZXN0JE8gYmlvc3B0ciRPIHZpZGVvJE8gaXN2ZXNhJE8gbW91c2UkTyAgXAorICAgICAgICAgICAgICAgICAgIHRpY2skTyBrZXkkTyBrZXkkTyBicmskTyBhbHRicmskTyBjcml0aWNhbCRPIGFsdGNyaXQkTyAgIFwKKyAgICAgICAgICAgICAgICAgICBjYWxscmVhbCRPIHZmdGVzdCRPIGdldGNoJE8gdGltZXJjcHAkTworCisuSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvY29tbW9uLm1rIgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19pcnEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODI0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbQpAQCAtMCwwICsxLDI4OCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcgorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KKzsqICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKKworaGVhZGVyICAgICAgX2lycSAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX2lycQorCisgICAgY2V4dGVybiBfUE1fcnRjSGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1fcHJldlJUQyxGQ1BUUgorCitSdGNJbnNpZGUgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0CitzaWR0QnVmICAgICBkZiAgICAgIDAgICAgICAgICAgIDsgQnVmZmVyIGZvciBzaWR0IGluc3RydWN0aW9uCisKK2VuZGRhdGFzZWcgIF9pcnEKKworYmVnY29kZXNlZyAgX2lycSAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitjcHVibGljIF9QTV9pcnFDb2RlU3RhcnQKKworOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KKzsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCis7IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KKworaWZkZWYgICBVU0VfTkFTTQorJW1hY3JvICBERUxBWSAwCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCislZW5kbWFjcm8KKyVtYWNybyAgSU9ERUxBWU4gMQorJXJlcCAgICAlMQorICAgICAgICBERUxBWQorJWVuZHJlcAorJWVuZG1hY3JvCitlbHNlCittYWNybyAgIERFTEFZCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCitlbmRtCittYWNybyAgIElPREVMQVlOICAgIE4KKyAgICByZXB0ICAgIE4KKyAgICAgICAgREVMQVkKKyAgICBlbmRtCitlbmRtCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9ydGNJU1IgLSBSZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKKzsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCis7IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgorOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KKzsKKzsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKKzsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcworOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKKzsgICAgICAgc3lzdGVtLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9ydGNJU1IKKworOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCis7IElmIHdlIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBjYWxsIGludG8gYW55IEMgYmFzZWQgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUsCis7IHdlIG5lZWQgdG8gc2V0dXAgYSBidW5jaCBvZiBpbXBvcnRhbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBOVCBrZXJuZWwuIFRoZQorOyBjb2RlIGJlbG93IHRha2VzIGNhcmUgb2YgdGhpcyBob3VzZWtlZXBpbmcgZm9yIHVzIChzZWUgVW5kb2N1bWVudGVkIE5UIGZvcgorOyBkZXRhaWxzKS4gSWYgd2UgZG9uJ3QgZG8gdGhpcyBob3VzZWtlZXBpbmcgYW5kIGludGVycnVwdHMgYXJlIGVuYWJsZWQsCis7IHRoZSBrZXJuZWwgd2lsbCBiZWNvbWUgdmVyeSB1bnN0YWJsZSBhbmQgY3Jhc2ggd2l0aGluIDEwIHNlY29uZHMgb3Igc28uCis7KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgcHVzaGZkCisgICAgICAgIHB1c2ggICAgZnMKKworICAgICAgICBtb3YgICAgIGVieCwwMDAwMDAzMGgKKyAgICAgICAgbW92ICAgICBmcyxieAorICAgICAgICBzdWIgICAgIGVzcCw1MGgKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisKKzsgU2V0dXAgdGhlIGV4Y2VwdGlvbiBmcmFtZSB0byBOVUxMCisKKyAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGNzOjBGRkRGRjAwMGhdCisgICAgICAgIG1vdiAgICAgW0RXT1JEIGRzOjBGRkRGRjAwMGhdLCAwRkZGRkZGRkZoCisgICAgICAgIG1vdiAgICAgW0RXT1JEIGVicF0sZWJ4CisKKzsgU2F2ZSBhd2F5IHRoZSBleGlzdGluZyBLU1MgZWJwCisKKyAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGNzOjBGRkRGRjEyNGhdCisgICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlc2krMDAwMDAxMjhoXQorICAgICAgICBtb3YgICAgIFtEV09SRCBlYnArNGhdLGVieAorICAgICAgICBtb3YgICAgIFtEV09SRCBlc2krMDAwMDAxMjhoXSxlYnAKKworOyBTYXZlIGF3YXkgdGhlIGtlcm5lbCB0aW1lIGFuZCB0aGUgdGhyZWFkIG1vZGUgKGtlcm5lbC91c2VyKQorCisgICAgICAgIG1vdiAgICAgZWRpLFtEV09SRCBlc2krMDAwMDAxMzdoXQorICAgICAgICBtb3YgICAgIFtEV09SRCBlYnArOGhdLGVkaQorCis7IFNldCB0aGUgdGhyZWFkIG1vZGUgKGtlcm5lbC91c2VyKSBiYXNlZCBvbiB0aGUgY29kZSBzZWxlY3RvcgorCisgICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYnArN0NoXQorICAgICAgICBhbmQgICAgIGVieCwwMQorICAgICAgICBtb3YgICAgIFtCWVRFIGVzaSswMDAwMDEzN2hdLGJsCisKKzsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworOyBFbmQgb2Ygc3BlY2lhbCBpbnRlcnJ1cHQgUHJvbG9nIGNvZGUKKzsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCis7IENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQorOyBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgorCisgICAgICAgIG1vdiAgICAgYWwsMjBoCisgICAgICAgIG91dCAgICAgMEEwaCxhbAorICAgICAgICBvdXQgICAgIDAyMGgsYWwKKworOyBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dAorCisgICAgICAgIGluICAgICAgYWwsNzBoICAgICAgICAgICAgICA7IFJlYWQgQ01PUyBpbmRleCByZWdpc3RlcgorICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyAgYW5kIHNhdmUgZm9yIGxhdGVyCisgICAgICAgIElPREVMQVlOIDMKKyAgICAgICAgbW92ICAgICBhbCwwQ2gKKyAgICAgICAgb3V0ICAgICA3MGgsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBpbiAgICAgIGFsLDcxaAorCis7IENhbGwgdGhlIEMgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24KKworICAgICAgICBjbXAgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMSAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgorICAgICAgICBqZSAgICAgIEBARXhpdAorICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMQorICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmFibGUgaW50ZXJydXB0cworICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZyBmb3IgQyBjb2RlCisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3J0Y0hhbmRsZXJdCisgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cyBvbiBleGl0IQorICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMAorCitAQEV4aXQ6IHBvcCAgICAgZWF4CisgICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlc3RvcmUgQ01PUyBpbmRleCByZWdpc3RlcgorCis7KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKzsgU3RhcnQgb2Ygc3BlY2lhbCBlcGlsb2cgY29kZSB0byByZXN0b3JlIHN0dWZmIG9uIGV4aXQgZnJvbSBoYW5kbGVyCis7KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKworOyBSZXN0b3JlIHRoZSBLU1MgZWJwCisKKyAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGNzOjBGRkRGRjEyNGhdCisgICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYnArNF0KKyAgICAgICAgbW92ICAgICBbRFdPUkQgZXNpKzAwMDAwMTI4aF0sZWJ4CisKKzsgUmVzdG9yZSB0aGUgZXhjZXB0aW9uIGZyYW1lCisKKyAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicF0KKyAgICAgICAgbW92ICAgICBbRFdPUkQgZnM6MDAwMDAwMDBdLGVieAorCis7IFJlc3RvcmUgdGhlIHRocmVhZCBtb2RlCisKKyAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs4aF0KKyAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGZzOjAwMDAwMTI0aF0KKyAgICAgICAgbW92ICAgICBbQllURSBlc2krMDAwMDAxMzdoXSxibAorICAgICAgICBhZGQgICAgIGVzcCwgNTBoCisgICAgICAgIHBvcCAgICAgZnMKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wYWQKKworOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKworICAgICAgICBpcmV0CisKK2Nwcm9jZW5kCisKK2NwdWJsaWMgX1BNX2lycUNvZGVFbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfUE1fZ2V0SVNSKGludCBpcnEsUE1GQVJQVFIgKmhhbmRsZXIpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyBJUlEgaGFuZGxlciBkaXJlY3QgZnJvbSB0aGUgSURULgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9nZXRJU1IKKworICAgICAgICBBUkcgICAgIGlkdEVudHJ5OlVJTlQsIGhhbmRsZXI6RFBUUgorCisgICAgICAgIGVudGVyX2MgMAorICAgICAgICBtb3YgICAgIGVjeCxbaGFuZGxlcl0gICAgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2YgaGFuZGxlciB0byBmaWxsIGluCisgICAgICAgIHNpZHQgICAgW3NpZHRCdWZdICAgICAgICAgICAgICAgOyBHZXQgSURUUiByZWdpc3RlciBpbnRvIHNpZHRCdWYKKyAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHNpZHRCdWYrMl0gICA7IEdldCBhZGRyZXNzIG9mIElEVCBpbnRvIEVBWAorICAgICAgICBtb3YgICAgIGVieCxbaWR0RW50cnldCisgICAgICAgIGxlYSAgICAgZWF4LFtlYXgrZWJ4KjhdICAgICAgICAgOyBHZXQgZW50cnkgaW4gdGhlIElEVAorICAgICAgICBtb3Z6eCAgIGVkeCxbV09SRCBlYXgrNl0gICAgICAgIDsgR2V0IGhpZ2ggb3JkZXIgMTYtYml0cworICAgICAgICBzaGwgICAgIGVkeCwxNiAgICAgICAgICAgICAgICAgIDsgTW92ZSBpbnRvIHRvcCAxNi1iaXRzIG9mIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBkeCxbV09SRCBlYXhdICAgICAgICAgICA7IEdldCBsb3cgb3JkZXIgMTYtYml0cworICAgICAgICBtb3YgICAgIFtEV09SRCBlY3hdLGVkeCAgICAgICAgIDsgU3RvcmUgbGluZWFyIGFkZHJlc3Mgb2YgaGFuZGxlcgorICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVheCsyXSAgICAgICAgIDsgR2V0IHNlbGVjdG9yIHZhbHVlCisgICAgICAgIG1vdiAgICAgW1dPUkQgZWN4KzRdLGR4ICAgICAgICAgOyBTdG9yZSBzZWxlY3RvciB2YWx1ZQorICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZCAgICBfUE1fZ2V0SVNSCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3NldElTUihpbnQgaXJxLHZvaWQgKmhhbmRsZXIpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRnVuY3Rpb24gdG8gc2V0IHRoZSBzcGVjaWZpYyBJUlEgaGFuZGxlciBkaXJlY3QgaW4gdGhlIElEVC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fc2V0SVNSCisKKyAgICAgICAgQVJHICAgICBpcnE6VUlOVCwgaGFuZGxlcjpDUFRSCisKKyAgICAgICAgZW50ZXJfYyAwCisgICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXSAgICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBuZXcgaGFuZGxlcgorICAgICAgICBtb3YgICAgIGR4LGNzICAgICAgICAgICAgICAgICAgIDsgR2V0IHNlbGVjdG9yIGZvciBuZXcgaGFuZGxlcgorICAgICAgICBzaWR0ICAgIFtzaWR0QnVmXSAgICAgICAgICAgICAgIDsgR2V0IElEVFIgcmVnaXN0ZXIgaW50byBzaWR0QnVmCisgICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBzaWR0QnVmKzJdICAgOyBHZXQgYWRkcmVzcyBvZiBJRFQgaW50byBFQVgKKyAgICAgICAgbW92ICAgICBlYngsW2lkdEVudHJ5XQorICAgICAgICBsZWEgICAgIGVheCxbZWF4K2VieCo4XSAgICAgICAgIDsgR2V0IGVudHJ5IGluIHRoZSBJRFQKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzJdLGR4ICAgICAgICAgOyBTdG9yZSBjb2RlIHNlZ21lbnQgc2VsZWN0b3IKKyAgICAgICAgbW92ICAgICBbV09SRCBlYXhdLGN4ICAgICAgICAgICA7IFN0b3JlIGxvdyBvcmRlciBiaXRzIG9mIGhhbmRsZXIKKyAgICAgICAgc2hyICAgICBlY3gsMTYKKyAgICAgICAgbW92ICAgICBbV09SRCBlYXgrNl0sY3ggICAgICAgICA7IFN0b3JlIGhpZ2ggb3JkZXIgYml0cyBvZiBoYW5kbGVyCisgICAgICAgIHN0aQorICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZCAgICBfUE1fc2V0SVNSCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3Jlc3RvcmVJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGdW5jdGlvbiB0byBzZXQgdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBpbiB0aGUgSURULgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9yZXN0b3JlSVNSCisKKyAgICAgICAgQVJHICAgICBpcnE6VUlOVCwgaGFuZGxlcjpDUFRSCisKKyAgICAgICAgZW50ZXJfYyAwCisgICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXQorICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVjeCs0XSAgICAgICAgIDsgR2V0IHNlbGVjdG9yIGZvciBvbGQgaGFuZGxlcgorICAgICAgICBtb3YgICAgIGVjeCxbRFdPUkQgZWN4XSAgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2Ygb2xkIGhhbmRsZXIKKyAgICAgICAgc2lkdCAgICBbc2lkdEJ1Zl0gICAgICAgICAgICAgICA7IEdldCBJRFRSIHJlZ2lzdGVyIGludG8gc2lkdEJ1ZgorICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgc2lkdEJ1ZisyXSAgIDsgR2V0IGFkZHJlc3Mgb2YgSURUIGludG8gRUFYCisgICAgICAgIG1vdiAgICAgZWJ4LFtpZHRFbnRyeV0KKyAgICAgICAgbGVhICAgICBlYXgsW2VheCtlYngqOF0gICAgICAgICA7IEdldCBlbnRyeSBpbiB0aGUgSURUCisgICAgICAgIGNsaQorICAgICAgICBtb3YgICAgIFtXT1JEIGVheCsyXSxkeCAgICAgICAgIDsgU3RvcmUgY29kZSBzZWdtZW50IHNlbGVjdG9yCisgICAgICAgIG1vdiAgICAgW1dPUkQgZWF4XSxjeCAgICAgICAgICAgOyBTdG9yZSBsb3cgb3JkZXIgYml0cyBvZiBoYW5kbGVyCisgICAgICAgIHNociAgICAgZWN4LDE2CisgICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzZdLGN4ICAgICAgICAgOyBTdG9yZSBoaWdoIG9yZGVyIGJpdHMgb2YgaGFuZGxlcgorICAgICAgICBzdGkKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQgICAgX1BNX3Jlc3RvcmVJU1IKKworZW5kY29kZXNlZyAgX2lycQorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9fcG0uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX3BtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2IyNzZkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX3BtLmFzbQpAQCAtMCwwICsxLDI4MSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcgorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KKzsqICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCisKK2hlYWRlciAgICAgIF9wbSAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitQNTg2CisKK2JlZ2RhdGFzZWcKKworOyBXYXRjb20gQysrIGV4dGVybmFscyByZXF1aXJlZCB0byBsaW5rIHdoZW4gY29tcGlsaW5nIGZsb2F0aW5nIHBvaW50Cis7IEMgY29kZS4gVGhleSBhcmUgbm90IGFjdHVhbGx5IHVzZWQgaW4gdGhlIGNvZGUgYmVjYXVzZSB3ZSBjb21waWxlIHdpdGgKKzsgaW5saW5lIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucywgaG93ZXZlciB0aGUgY29tcGlsZXIgc3RpbGwgZ2VuZXJhdGVzCis7IHRoZSByZWZlcmVuY2VzIGluIHRoZSBvYmplY3QgbW9kdWxlcy4KKworX184MDg3ICAgICAgZGQgIDAKKyAgICAgICAgICAgIFBVQkxJQyAgX184MDg3CitfX2ltdGhyZWFkOgorX19mbHR1c2VkOgorX2ZsdHVzZWRfICAgZGQgIDAKKyAgICAgICAgICAgIFBVQkxJQyAgX19pbXRocmVhZAorICAgICAgICAgICAgUFVCTElDICBfZmx0dXNlZF8KKyAgICAgICAgICAgIFBVQkxJQyAgX19mbHR1c2VkCisKK2VuZGRhdGFzZWcKKworYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX3NlZ3JlYWQKKworICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBheCxlcworICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCisgICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4CisgICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcworICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCisgICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KKzsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcworOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2ludDM4NngKKworOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKKworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9zZXRCYW5rQShpbnQgYmFuaykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0EKKworOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKKworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgorCis7IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycworCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgICAgICBQTV9zZXRDUlRTdGFydAorCis7IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycworCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgorOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKKzsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgorCitpZmRlZiAgIFVTRV9OQVNNCislbWFjcm8gIERFTEFZIDAKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyVlbmRtYWNybworJW1hY3JvICBJT0RFTEFZTiAxCislcmVwICAgICUxCisgICAgICAgIERFTEFZCislZW5kcmVwCislZW5kbWFjcm8KK2Vsc2UKK21hY3JvICAgREVMQVkKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKKyAgICAgICAgam1wICAgICBzaG9ydCAkKzIKK2VuZG0KK21hY3JvICAgSU9ERUxBWU4gICAgTgorICAgIHJlcHQgICAgTgorICAgICAgICBERUxBWQorICAgIGVuZG0KK2VuZG0KK2VuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCis7IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCisKKyAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIHB1c2hmZAorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZworICAgICAgICBjbGkKKyAgICAgICAgb3V0ICAgICA3MGgsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBpbiAgICAgIGFsLDcxaAorICAgICAgICBtb3YgICAgIGFoLGFsCisgICAgICAgIHhvciAgICAgYWwsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCisgICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAorICAgICAgICBwb3BmZAorICAgICAgICBwb3AgICAgIF9icAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKKzsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCisKKyAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICBwdXNoZmQKKyAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KKyAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKKyAgICAgICAgY2xpCisgICAgICAgIG91dCAgICAgNzBoLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgNzFoLGFsCisgICAgICAgIHhvciAgICAgYWwsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCisgICAgICAgIHBvcGZkCisgICAgICAgIHBvcCAgICAgX2JwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBkb3VibGUgX2Z0b2woZG91YmxlIGYpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDYWxscyB0byBfX2Z0b2wgYXJlIGdlbmVyYXRlZCBieSB0aGUgQm9ybGFuZCBDKysgY29tcGlsZXIgZm9yIGNvZGUKKzsgdGhhdCBuZWVkcyB0byBjb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSB0byBhbiBpbnRlZ3JhbCB0eXBlLgorOworOyBJbnB1dDogZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9uIHRoZSB0b3Agb2YgdGhlICc4Ny4KKzsKKzsgT3V0cHV0OiBhIChzaWduZWQgb3IgdW5zaWduZWQpIGxvbmcgaW4gRUFYCis7IEFsbCBvdGhlciByZWdpc3RlcnMgcHJlc2VydmVkLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfZnRvbAorCisgICAgICAgIExPQ0FMICAgdGVtcDE6V09SRCwgdGVtcDI6UVdPUkQgPSBMb2NhbFNpemUKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCxlc3AKKyAgICAgICAgc3ViICAgICBlc3AsTG9jYWxTaXplCisKKyAgICAgICAgZnN0Y3cgICBbdGVtcDFdICAgICAgICAgICAgICAgICA7IHNhdmUgdGhlIGNvbnRyb2wgd29yZAorICAgICAgICBmd2FpdAorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIHRlbXAxKzFdCisgICAgICAgIG9yICAgICAgW0JZVEUgdGVtcDErMV0sMENoICAgICAgOyBzZXQgcm91bmRpbmcgY29udHJvbCB0byBjaG9wCisgICAgICAgIGZsZGN3ICAgW3RlbXAxXQorICAgICAgICBmaXN0cCAgIFt0ZW1wMl0gICAgICAgICAgICAgICAgIDsgY29udmVydCB0byA2NC1iaXQgaW50ZWdlcgorICAgICAgICBtb3YgICAgIFtCWVRFIHRlbXAxKzFdLGFsCisgICAgICAgIGZsZGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQKKyAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHRlbXAyXSAgICAgICA7IHJldHVybiBMUyAzMiBiaXRzCisgICAgICAgIG1vdiAgICAgZWR4LFtEV09SRCB0ZW1wMis0XSAgICAgOyAgICAgICAgTVMgMzIgYml0cworCisgICAgICAgIG1vdiAgICAgZXNwLGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX2dldFBEQgorCisgICAgICAgIG1vdiAgICAgZWF4LGNyMworICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCisKKyAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LGNyMworICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF9wbQorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MmE4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9jcHVpbmZvLmMKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECisqCisqIERlc2NyaXB0aW9uOiAgVnhEIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgVnhEJ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgVnhEJ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAorICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCit7CisgICAgS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopZnJlcSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMQVJHRV9JTlRFR0VSIGx0ID0gS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihOVUxMKTsgICAgIFwKKyAgICAodCktPmxvdyA9IGx0Lkxvd1BhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodCktPmhpZ2ggPSBsdC5IaWdoUGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaW50ODYuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2ludDg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzZDljMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2ludDg2LmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCisqCisqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSByZWFsIG1vZGUgc29mdHdhcmUgaW50ZXJydXB0CisqICAgICAgICAgICAgICAgaGFuZGxpbmcgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisjaW5jbHVkZSAib3NoZHIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitXZSBkbyBoYXZlIGxpbWl0ZWQgQklPUyBhY2Nlc3MgdW5kZXIgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoreworICAgIC8vIFJldHVybiBmYWxzZSB1bmxlc3Mgd2UgaGF2ZSBmdWxsIGJ1ZmZlciBwYXNzaW5nIQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitsZW4gICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyCityc2VnICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBzZWdtZW50IG9mIHRoZSBidWZmZXIKK3JvZmYgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIG9mZnNldCBvZiB0aGUgYnVmZmVyCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgZ2xvYmFsIFZFU0EgdHJhbnNmZXIKK2J1ZmZlciB0aGF0IGlzIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBCSU9TIGZ1bmN0aW9ucyBmcm9tCitXaW4xNiBhbmQgV2luMzIgcHJvZ3JhbXMgdW5kZXIgV2luZG93cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKKyAgICB1aW50ICpsZW4sCisgICAgdWludCAqcnNlZywKKyAgICB1aW50ICpyb2ZmKQoreworICAgIC8vIE5vIGJ1ZmZlcnMgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3MgTlQgKFdpbmRvd3MgWFAgaGFzIHRoZW0gaG93ZXZlciBpZgorICAgIC8vIHdlIGV2ZXIgZGVjaWRlIHRvIHN1cHBvcnQgdGhpcyEpCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSXNzdWUgYSBwcm90ZWN0ZWQgbW9kZSBzb2Z0d2FyZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDM4NigKKyAgICBpbnQgaW50bm8sCisgICAgUE1SRUdTICppbiwKKyAgICBQTVJFR1MgKm91dCkKK3sKKyAgICBQTVNSRUdTIHNyZWdzOworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsJnNyZWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitNYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAorICAgIHVpbnQgcl9zZWcsCisgICAgdWludCByX29mZikKK3sKKyAgICAvLyBOb3QgdXNlZCBmb3IgV2luZG93cyBOVCBkcml2ZXJzIQorICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCisgICAgdWludCBzaXplLAorICAgIHVpbnQgKnJfc2VnLAorICAgIHVpbnQgKnJfb2ZmKQoreworICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycworICAgICh2b2lkKXNpemU7CisgICAgKHZvaWQpcl9zZWc7CisgICAgKHZvaWQpcl9vZmY7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKKyAgICB2b2lkICptZW0pCit7CisgICAgLy8gTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzCisgICAgKHZvaWQpbWVtOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdCAocGFyYW1ldGVycyBpbiBEUE1JIGNvbXBhdGlibGUgc3RydWN0dXJlKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgRFBNSV9yZWdzICpyZWdzKQoreworICAgIC8vIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIGEgVjg2IHJlYWwgbW9kZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCitsb2FkZWQgYmVmb3JlIHRoZSBjYWxsLiBUaGUgY2FsbCByZXR1cm5zIHdpdGggYSBmYXIgcmV0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAorICAgIHVpbnQgc2VnLAorICAgIHVpbnQgb2ZmLAorICAgIFJNUkVHUyAqcmVncywKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICAvLyBUT0RPISEKKyNpZiAwCisgICAgQ0xJRU5UX1NUUlVDVCBzYXZlUmVnczsKKworICAgIC8qIEJhaWwgaWYgd2UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MgKGllOiB0aGUgVnhEIHdhcyBkeW5hbWljYWxseQorICAgICAqIGxvYWRlZCwgYW5kIG5vdCBzdGF0aWNhbGx5IGxvYWRlZC4KKyAgICAgKi8KKyAgICBpZiAoIV9QTV9oYXZlQklPUykKKyAgICAgICAgcmV0dXJuOworCisgICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKKyAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7CisgICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7CisgICAgU2ltdWxhdGVfRmFyX0NhbGwoc2VnLCBvZmYpOworICAgIFJlc3VtZV9FeGVjKCk7CisgICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7CisgICAgRW5kX05lc3RfRXhlYygpOworICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcworbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCkKK3sKKyAgICAvLyBUT0RPISEKKyNpZiAwCisgICAgUk1TUkVHUyAgICAgICAgIHNyZWdzID0gezB9OworICAgIENMSUVOVF9TVFJVQ1QgICBzYXZlUmVnczsKKyAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKKworICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCisgICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2KClcbiIpOworICAgIGlmIChkaXNhYmxlVFNSRmxhZykgeworICAgICAgICBvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOworICAgICAgICAqZGlzYWJsZVRTUkZsYWcgPSAwOworICAgICAgICB9CisgICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOworICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLCZzcmVncyk7CisgICAgRXhlY19JbnQoaW50bm8pOworICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCwmc3JlZ3MpOworICAgIEVuZF9OZXN0X0V4ZWMoKTsKKworICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KKyAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCisgICAgICAgICpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7CisKKyAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NigpXG4iKTsKKyNlbHNlCisgICAgKm91dCA9ICppbjsKKyNlbmRpZgorICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCitsb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICAvLyBUT0RPISEKKyNpZiAwCisgICAgQ0xJRU5UX1NUUlVDVCAgIHNhdmVSZWdzOworICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOworCisgICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5CisgICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgorICAgICAqLworICAgIGlmICghX1BNX2hhdmVCSU9TKSB7CisgICAgICAgICpvdXQgPSAqaW47CisgICAgICAgIHJldHVybiBvdXQtPnguYXg7CisgICAgICAgIH0KKworICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCisgICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKKyAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKKyAgICAgICAgb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gMDsKKyAgICAgICAgfQorICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKKyAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbixzcmVncyk7CisgICAgRXhlY19JbnQoaW50bm8pOworICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCxzcmVncyk7CisgICAgRW5kX05lc3RfRXhlYygpOworCisgICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLworICAgIGlmIChkaXNhYmxlVFNSRmxhZykKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKKworICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2eCgpXG4iKTsKKyNlbHNlCisgICAgKm91dCA9ICppbjsKKyNlbmRpZgorICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2lycS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2YjQyNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2lycS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTlQgZHJpdmVyIElSUSBtYW5hZ2VtZW50IGZ1bmN0aW9ucworKiAgICAgICAgICAgICAgIGZvciB0aGUgUE0gbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgInBtaW50LmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisjaW5jbHVkZSAib3NoZHIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCAgICAgICAgICBnbG9iYWxEYXRhU3RhcnQ7CitzdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsKK3N0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOworc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkUlRDUElDMjsKK3N0YXRpYyB1bG9uZyAgICAgICAgUlRDX2lkdEVudHJ5OworUE1faW50SGFuZGxlciAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7CitQTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2UlRDID0gUE1OVUxMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KKwordWNoYXIgICBfQVNNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwordm9pZCAgICBfQVNNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKK3ZvaWQgICAgX0FTTUFQSSBfUE1fcnRjSVNSKHZvaWQpOwordm9pZCAgICBfQVNNQVBJIF9QTV9nZXRJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Cit2b2lkICAgIF9BU01BUEkgX1BNX3NldElTUihpbnQgaXJxLHZvaWQgKmhhbmRsZXIpOwordm9pZCAgICBfQVNNQVBJIF9QTV9yZXN0b3JlSVNSKGludCBpcnEsUE1GQVJQVFIgKmhhbmRsZXIpOwordm9pZCAgICBfQVNNQVBJIF9QTV9pcnFDb2RlU3RhcnQodm9pZCk7Cit2b2lkICAgIF9BU01BUEkgX1BNX2lycUNvZGVFbmQodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCisgICAgaW50IGZyZXF1ZW5jeSkKK3sKKyAgICBzdGF0aWMgc2hvcnQgY29udmVydFtdID0geworICAgICAgICA4MTkyLAorICAgICAgICA0MDk2LAorICAgICAgICAyMDQ4LAorICAgICAgICAxMDI0LAorICAgICAgICA1MTIsCisgICAgICAgIDI1NiwKKyAgICAgICAgMTI4LAorICAgICAgICA2NCwKKyAgICAgICAgMzIsCisgICAgICAgIDE2LAorICAgICAgICA4LAorICAgICAgICA0LAorICAgICAgICAyLAorICAgICAgICAtMSwKKyAgICAgICAgfTsKKyAgICBpbnQgaTsKKworICAgIC8qIEZpcnN0IGNsZWFyIGFueSBwZW5kaW5nIFJUQyB0aW1lb3V0IGlmIG5vdCBjbGVhcmVkICovCisgICAgX1BNX3JlYWRDTU9TKDB4MEMpOworICAgIGlmIChmcmVxdWVuY3kgPT0gMCkgeworICAgICAgICAvKiBEaXNhYmxlIFJUQyB0aW1vdXQgKi8KKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBBLCh1Y2hhcilfUE1fb2xkQ01PU1JlZ0EpOworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEIsKHVjaGFyKShfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQSwodWNoYXIpKDB4MjAgfCAoaSszKSkpOworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEIsKHVjaGFyKSgoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKSk7CisgICAgICAgIH0KK30KKworaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQoreworICAgIHN0YXRpYyBpYm9vbCAgICBsb2NrZWQgPSBmYWxzZTsKKworICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KKyAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7CisgICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOworCisgICAgLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBSVENfaWR0RW50cnkgPSAweDM4OworICAgIF9QTV9nZXRJU1IoUlRDX2lkdEVudHJ5LCAmX1BNX3ByZXZSVEMpOworICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7CisgICAgX1BNX3NldElTUihSVENfaWR0RW50cnksIF9QTV9ydGNJU1IpOworCisgICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOworCisgICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KKyAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7CisgICAgUE1fb3V0cGIoMHhBMSwodWNoYXIpKF9QTV9vbGRSVENQSUMyICYgMHhGRSkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcnRjSGFuZGxlcikgeworICAgICAgICAvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7CisgICAgICAgIFBNX291dHBiKDB4QTEsKHVjaGFyKSgoUE1faW5wYigweEExKSAmIDB4RkUpIHwgKF9QTV9vbGRSVENQSUMyICYgfjB4RkUpKSk7CisKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICBfUE1fcmVzdG9yZUlTUihSVENfaWR0RW50cnksICZfUE1fcHJldlJUQyk7CisgICAgICAgIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9tZW0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGQyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9tZW0uYwpAQCAtMCwwICsxLDUxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE5UIGRyaXZlciBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyogICAgICAgICAgICAgICBmb3IgdGhlIFBNIGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKKyNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgorI2luY2x1ZGUgIm10cnIuaCIKKyNpbmNsdWRlICJvc2hkci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9NRU1PUllfU0hBUkVEICAgICAgICAgICAxMDAKKyNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAgICAgICAgIDEwMAorI2RlZmluZSBNQVhfTUVNT1JZX0xPQ0tFRCAgICAgICAgICAgMTAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICAgICpsaW5lYXI7CisgICAgdWxvbmcgICBsZW5ndGg7CisgICAgUE1ETCAgICBwTWRsOworICAgIH0gbWVtc2hhcmVkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAgICAqbGluZWFyOworICAgIHZvaWQgICAgKm1tSW9NYXBwZWQ7CisgICAgdWxvbmcgICBsZW5ndGg7CisgICAgUE1ETCAgICBwTWRsOworICAgIH0gbWVtbG9ja2VkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBwaHlzaWNhbDsKKyAgICB1bG9uZyAgIGxpbmVhcjsKKyAgICB1bG9uZyAgIGxlbmd0aDsKKyAgICBpYm9vbCAgIGlzQ2FjaGVkOworICAgIH0gbW1hcHBpbmc7CisKK3N0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcGluZ3MgPSAwOworc3RhdGljIG1lbXNoYXJlZCAgICBzaGFyZWRbTUFYX01FTU9SWV9NQVBQSU5HU10gPSB7MH07CitzdGF0aWMgbW1hcHBpbmcgICAgIG1hcHNbTUFYX01FTU9SWV9NQVBQSU5HU107CitzdGF0aWMgbWVtbG9ja2VkICAgIGxvY2tlZFtNQVhfTUVNT1JZX0xPQ0tFRF07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3Vsb25nICAgUE1BUEkgX1BNX2dldFBEQih2b2lkKTsKKworLy8gUGFnZSB0YWJsZSBlbnRyeSBmbGFncworCisjZGVmaW5lIFBBR0VfRkxBR1NfUFJFU0VOVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFHRV9GTEFHU19XUklURUFCTEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUEFHRV9GTEFHU19VU0VSCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUEFHRV9GTEFHU19XUklURV9USFJPVUdICTB4MDAwMDAwMDgKKyNkZWZpbmUgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFCTB4MDAwMDAwMTAKKyNkZWZpbmUgUEFHRV9GTEFHU19BQ0NFU1NFRAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUEFHRV9GTEFHU19ESVJUWQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUEFHRV9GTEFHU180TUIJICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Jhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwcyBpbgorbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcHMgaW4KKworUkVUVVJOUzoKK0xpbmVhciBhZGRyZXNzIG9mIHRoZSBuZXdseSBtYXBwZWQgbWVtb3J5LgorCitSRU1BUktTOgorTWFwcyBhIHBoeXNpY2FsIG1lbW9yeSByYW5nZSB0byBhIGxpbmVhciBtZW1vcnkgcmFuZ2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgbGltaXQsCisgICAgaWJvb2wgaXNDYWNoZWQpCit7CisgICAgdWxvbmcgICAgICAgICAgICAgICBsZW5ndGggPSBsaW1pdCsxOworICAgIFBIWVNJQ0FMX0FERFJFU1MgICAgcGFJb0Jhc2UgPSB7MH07CisKKyAgICAvLyBOVCBsb3ZlcyBsYXJnZSBJbnRzCisgICAgcGFJb0Jhc2UgPSBSdGxDb252ZXJ0VWxvbmdUb0xhcmdlSW50ZWdlciggYmFzZSApOworCisgICAgLy8gTWFwIElPIHNwYWNlIGludG8gS2VybmVsCisgICAgaWYgKGlzQ2FjaGVkKQorICAgICAgICByZXR1cm4gKFVMT05HKU1tTWFwSW9TcGFjZShwYUlvQmFzZSwgbGVuZ3RoLCBNbUNhY2hlZCApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChVTE9ORylNbU1hcElvU3BhY2UocGFJb0Jhc2UsIGxlbmd0aCwgTW1Ob25DYWNoZWQgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGp1c3QgdGhlIHBhZ2UgdGFibGUgY2FjaGluZyBiaXRzIGRpcmVjdGx5LiBSZXF1aXJlcyByaW5nIDAgYWNjZXNzIGFuZAorb25seSB3b3JrcyB3aXRoIERPUzRHVyBhbmQgY29tcGF0aWJsZSBleHRlbmRlcnMgKENhdXNlV2F5IGFsc28gd29ya3Mgc2luY2UKK2l0IGhhcyBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIHJpbmcgMCBpbnN0cnVjdGlvbnMgd2UgbmVlZCBmcm9tIHJpbmcgMykuIFdpbGwKK25vdCB3b3JrIGluIGEgRE9TIGJveCwgYnV0IHdlIGNhbGwgaW50byB0aGUgcmluZyAwIGhlbHBlciBWeEQgc28gd2Ugc2hvdWxkCituZXZlciBnZXQgaGVyZSBpbiBhIERPUyBib3ggYW55d2F5IChhc3N1bWluZyB0aGUgVnhEIGlzIHByZXNlbnQpLiBJZiB3ZQorZG8gZ2V0IGhlcmUgYW5kIHdlIGFyZSBpbiB3aW5kb3dzLCB0aGlzIGNvZGUgd2lsbCBiZSBza2lwcGVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9QTV9hZGp1c3RQYWdlVGFibGVzKAorICAgIHVsb25nIGxpbmVhciwKKyAgICB1bG9uZyBsaW1pdCwKKwlpYm9vbCBpc0dsb2JhbCwKKyAgICBpYm9vbCBpc0NhY2hlZCkKK3sKKyAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKKyAgICB1bG9uZyAgIHBhZ2VUYWJsZSwqcFBEQiwqcFBhZ2VUYWJsZTsKKwl1bG9uZwltYXNrID0gMHhGRkZGRkZGRjsKKwl1bG9uZwliaXRzID0gMHgwMDAwMDAwMDsKKworCS8qIEVuYWJsZSB1c2VyIGxldmVsIGFjY2VzcyBmb3IgcGFnZSB0YWJsZSBlbnRyeSAqLworCWlmIChpc0dsb2JhbCkgeworCQltYXNrICY9IH5QQUdFX0ZMQUdTX1VTRVI7CisJCWJpdHMgfD0gUEFHRV9GTEFHU19VU0VSOworCQl9CisJCQorCS8qIERpc2FibGUgUENEIGJpdCBpZiBwYWdlIHRhYmxlIGVudHJ5IHNob3VsZCBiZSB1bmNhY2hlZCAqLworCWlmICghaXNDYWNoZWQpIHsKKwkJbWFzayAmPSB+KFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7CisJCWJpdHMgfD0gKFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7CisJCX0KKworICAgIHBQREIgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKF9QTV9nZXRQREIoKSwweEZGRix0cnVlKTsKKyAgICBpZiAocFBEQikgeworICAgICAgICBzdGFydFBEQiA9IChsaW5lYXIgPj4gMjIpICYgMHgzRkY7CisgICAgICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpICYgMHgzRkY7CisgICAgICAgIGVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKKyAgICAgICAgZW5kUGFnZSA9ICgobGluZWFyK2xpbWl0KSA+PiAxMikgJiAweDNGRjsKKyAgICAgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgYml0cyBpbiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkgLSByZXF1aXJlZCBhcyBwZXIKKyAgICAgICAgICAgIC8vIFBlbnRpdW0gNCBtYW51YWwuIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSA0TUIgcGFnZSBlbnRyaWVzCisgICAgICAgICAgICBwUERCW2lQREJdID0gKHBQREJbaVBEQl0gJiBtYXNrKSB8IGJpdHM7CisgICAgICAgICAgICBpZiAoIShwUERCW2lQREJdICYgUEFHRV9GTEFHU180TUIpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCA0S0IgcGFnZXMgdGhlbiB3ZSBuZWVkIHRvIGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIGVhY2ggb2YgdGhlIHBhZ2UgdGFibGUgZW50cmllcworICAgICAgICAgICAgICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7CisgICAgICAgICAgICAgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIocGFnZVRhYmxlLDB4RkZGLHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKKyAgICAgICAgICAgICAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOworICAgICAgICAgICAgICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGVbaVBhZ2VdID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgbWFzaykgfCBiaXRzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTW1Vbm1hcElvU3BhY2UocFBhZ2VUYWJsZSwweEZGRik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBNbVVubWFwSW9TcGFjZShwUERCLDB4RkZGKTsKKyAgICAgICAgUE1fZmx1c2hUTEIoKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIE5UIHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKK2FzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKKyhpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKK2RhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCiswIGludGVycnVwdCBjb250ZXh0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCisgICAgbG9uZyBzaXplKQoreworICAgIGludCAgICAgICAgIGk7CisKKyAgICAvLyBGaXJzdCBmaW5kIGEgZnJlZSBzbG90IGluIG91ciBzaGFyZWQgbWVtb3J5IHRhYmxlCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKKyAgICAgICAgaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKGkgPT0gTUFYX01FTU9SWV9TSEFSRUQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gQWxsb2NhdGUgdGhlIHBhZ2VkIHBvb2wKKyAgICBzaGFyZWRbaV0ubGluZWFyID0gRXhBbGxvY2F0ZVBvb2woUGFnZWRQb29sLCBzaXplKTsKKworICAgIC8vIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbgorICAgIHNoYXJlZFtpXS5wTWRsID0gSW9BbGxvY2F0ZU1kbChzaGFyZWRbaV0ubGluZWFyLHNpemUsRkFMU0UsRkFMU0UsKFBJUlApIE5VTEwpOworCisgICAgLy8gTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5CisgICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhzaGFyZWRbaV0ucE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKKworICAgIC8vIE1vZGlmeSBiaXRzIHRvIGdyYW50IHVzZXIgYWNjZXNzCisgICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKXNoYXJlZFtpXS5saW5lYXIsIHNpemUsIHRydWUsIHRydWUpOworICAgIHJldHVybiAodm9pZCopc2hhcmVkW2ldLmxpbmVhcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKKyAgICB2b2lkICpwKQoreworICAgIGludCBpOworCisgICAgLy8gRmluZCBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKKyAgICAgICAgaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gcCkgeworICAgICAgICAgICAgLy8gVW5sb2NrIHdoYXQgd2UgbG9ja2VkCisgICAgICAgICAgICBNbVVubG9ja1BhZ2VzKHNoYXJlZFtpXS5wTWRsKTsKKworICAgICAgICAgICAgLy8gRnJlZSBvdXIgTURMCisgICAgICAgICAgICBJb0ZyZWVNZGwoc2hhcmVkW2ldLnBNZGwpOworCisgICAgICAgICAgICAvLyBGcmVlIG91ciBtZW0KKyAgICAgICAgICAgIEV4RnJlZVBvb2woc2hhcmVkW2ldLmxpbmVhcik7CisKKyAgICAgICAgICAgIC8vIEZsYWcgdGhhdCBpcyBlbnRyeSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIHNoYXJlZFtpXS5saW5lYXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitNYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgbGltaXQsCisgICAgaWJvb2wgaXNDYWNoZWQpCit7CisgICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKKyAgICBpbnQgICAgIGk7CisKKyAgICAvLyBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQKKyAgICAvLyBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgeworICAgICAgICBpZiAobWFwc1tpXS5waHlzaWNhbCA9PSBiYXNlICYmIG1hcHNbaV0ubGVuZ3RoID09IGxlbmd0aCAmJiBtYXBzW2ldLmlzQ2FjaGVkID09IGlzQ2FjaGVkKSB7CisgICAgICAgICAgICBfUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpbWFwc1tpXS5saW5lYXIsIG1hcHNbaV0ubGVuZ3RoLCB0cnVlLCBpc0NhY2hlZCk7CisgICAgICAgICAgICByZXR1cm4gKHZvaWQqKW1hcHNbaV0ubGluZWFyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgaWYgKG51bU1hcHBpbmdzID09IE1BWF9NRU1PUllfTUFQUElOR1MpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gV2UgZGlkIG5vdCBmaW5kIGFueSBwcmV2aW91c2x5IG1hcHBlZCBtZW1vcnkgcmVnaW9uLCBzbyBtYXBzIGl0IGluLgorICAgIGlmICgobGluZWFyID0gX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCxpc0NhY2hlZCkpID09IDB4RkZGRkZGRkYpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLnBoeXNpY2FsID0gYmFzZTsKKyAgICBtYXBzW251bU1hcHBpbmdzXS5sZW5ndGggPSBsZW5ndGg7CisgICAgbWFwc1tudW1NYXBwaW5nc10ubGluZWFyID0gbGluZWFyOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7CisgICAgbnVtTWFwcGluZ3MrKzsKKworICAgIC8vIEdyYW50IHVzZXIgYWNjZXNzIHRvIHRoaXMgSS9PIHNwYWNlCisgICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKWxpbmVhciwgbGVuZ3RoLCB0cnVlLCBpc0NhY2hlZCk7CisgICAgcmV0dXJuICh2b2lkKilsaW5lYXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKKyAgICB2b2lkICpwdHIsCisgICAgdWxvbmcgbGltaXQpCit7CisgICAgLy8gV2UgZG9uJ3QgZnJlZSB0aGUgbWVtb3J5IG1hcHBpbmdzIGluIGhlcmUgYmVjYXVzZSB3ZSBjYWNoZSBhbGwKKyAgICAvLyB0aGUgbWVtb3J5IG1hcHBpbmdzIHdlIGNyZWF0ZSBpbiB0aGUgc3lzdGVtIGZvciBsYXRlciB1c2UuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBkcml2ZXIgdW5sb2FkcyB0byBmcmVlIGFsbCB0aGUgcGFnZSB0YWJsZSBtYXBwaW5ncyEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIF9QTV9mcmVlTWVtb3J5TWFwcGluZ3Modm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKQorICAgICAgICBNbVVubWFwSW9TcGFjZSgodm9pZCAqKW1hcHNbaV0ubGluZWFyLG1hcHNbaV0ubGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCisgICAgdm9pZCAqcCkKK3sKKyAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhT3VyQWRkcmVzczsKKworICAgIHBhT3VyQWRkcmVzcyA9IE1tR2V0UGh5c2ljYWxBZGRyZXNzKHApOworICAgIHJldHVybiBwYU91ckFkZHJlc3MuTG93UGFydDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKKyAgICB2b2lkICpwLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCit7CisgICAgaW50ICAgICBpOworICAgIHVsb25nICAgbGluZWFyID0gKHVsb25nKXAgJiB+MHhGRkY7CisKKyAgICBmb3IgKGkgPSAobGVuZ3RoICsgMHhGRkYpID4+IDEyOyBpID4gMDsgaS0tKSB7CisgICAgICAgIGlmICgoKnBoeXNBZGRyZXNzKysgPSBQTV9nZXRQaHlzaWNhbEFkZHIoKHZvaWQqKWxpbmVhcikpID09IDB4RkZGRkZGRkYpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGxpbmVhciArPSA0MDk2OworICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCisgICAgdWludCBzaXplLAorICAgIHVsb25nICpwaHlzQWRkciwKKyAgICBpYm9vbCBjb250aWd1b3VzLAorICAgIGlib29sIGJlbG93MTZNKQoreworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhT3VyQWRkcmVzczsKKworICAgIC8vIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9MT0NLRUQ7IGkrKykgeworICAgICAgICBpZiAobG9ja2VkW2ldLmxpbmVhciA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBpZiAoaSA9PSBNQVhfTUVNT1JZX0xPQ0tFRCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBIaWdoZXN0QWNjZXB0YWJsZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGhpZ2hlc3QgdmFsaWQgcGh5c2ljYWwgYWRkcmVzcworICAgIC8vIHRoZSBkcml2ZXIgY2FuIHVzZS4gRm9yIGV4YW1wbGUsIGlmIGEgZGV2aWNlIGNhbiBvbmx5IHJlZmVyZW5jZSBwaHlzaWNhbAorICAgIC8vIG1lbW9yeSBpbiB0aGUgbG93ZXIgMTZNQiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSBzZXQgdG8gMHgwMDAwMDAwMEZGRkZGRi4KKyAgICBwYU91ckFkZHJlc3MuSGlnaFBhcnQgPSAwOworICAgIGlmIChiZWxvdzE2TSkKKyAgICAgICAgcGFPdXJBZGRyZXNzLkxvd1BhcnQgPSAweDAwRkZGRkZGOworICAgIGVsc2UKKyAgICAgICAgcGFPdXJBZGRyZXNzLkxvd1BhcnQgPSAweEZGRkZGRkZGOworCisgICAgaWYgKGNvbnRpZ3VvdXMpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgZnJvbSB0aGUgbm9uLXBhZ2VkIHBvb2wgKHVuZm9ydHVuYXRlbHkgNE1CIHBhZ2VzKQorICAgICAgICBsb2NrZWRbaV0ubGluZWFyID0gTW1BbGxvY2F0ZUNvbnRpZ3VvdXNNZW1vcnkoc2l6ZSwgcGFPdXJBZGRyZXNzKTsKKyAgICAgICAgaWYgKCFsb2NrZWRbaV0ubGluZWFyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgLy8gRmxhZyBubyBNREwKKyAgICAgICAgbG9ja2VkW2ldLnBNZGwgPSBOVUxMOworCisgICAgICAgIC8vIE1hcCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBzbyB3ZSBjYW4gbWFuYWdlCisgICAgICAgIC8vIHRoZSBwYWdlIHRhYmxlcyBpbiA0S0IgY2h1bmtzIG1hcHBlZCBpbnRvIHVzZXIgc3BhY2UuCisKKyAgICAgICAgLy8gVE9ETzogTWFwIHRoaXMgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgbGluZWFyIGFkZHJlc3NzCisgICAgICAgIGxvY2tlZFtpXS5tbUlvTWFwcGVkID0gbG9ja2VkW2ldLmxpbmVhcjsKKworICAgICAgICAvLyBNb2RpZnkgYml0cyB0byBncmFudCB1c2VyIGFjY2VzcywgZmxhZyBub3QgY2FjaGVkCisgICAgICAgIF9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubW1Jb01hcHBlZCwgc2l6ZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gKHZvaWQqKWxvY2tlZFtpXS5tbUlvTWFwcGVkOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGZyb20gdGhlIHBhZ2VkIHBvb2wKKyAgICAgICAgbG9ja2VkW2ldLmxpbmVhciA9IEV4QWxsb2NhdGVQb29sKFBhZ2VkUG9vbCwgc2l6ZSk7CisgICAgICAgIGlmICghbG9ja2VkW2ldLmxpbmVhcikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIC8vIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbgorICAgICAgICBsb2NrZWRbaV0ucE1kbCA9IElvQWxsb2NhdGVNZGwobG9ja2VkW2ldLmxpbmVhcixzaXplLEZBTFNFLEZBTFNFLChQSVJQKSBOVUxMKTsKKworICAgICAgICAvLyBMb2NrIHRoaXMgYWxsb2NhdGlvbiBpbiBtZW1vcnkKKyAgICAgICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhsb2NrZWRbaV0ucE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKKworICAgICAgICAvLyBNb2RpZnkgYml0cyB0byBncmFudCB1c2VyIGFjY2VzcywgZmxhZyBub3QgY2FjaGVkCisgICAgICAgIF9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubGluZWFyLCBzaXplLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAodm9pZCopbG9ja2VkW2ldLmxpbmVhcjsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCisgICAgdm9pZCAqcCwKKyAgICB1aW50IHNpemUsCisgICAgaWJvb2wgY29udGlndW91cykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpbmQgYSBsb2NrZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX0xPQ0tFRDsgaSsrKSB7CisgICAgICAgIGlmIChsb2NrZWRbaV0ubGluZWFyID09IHApIHsKKyAgICAgICAgICAgIC8vIEFuIE1kbCBpbmRpY2F0ZXMgdGhhdCB3ZSB1c2VkIHRoZSBwYWdlZCBwb29sLCBhbmQgbG9ja2VkIGl0LAorICAgICAgICAgICAgLy8gc28gbm93IHdlIGhhdmUgdG8gdW5sb2NrLCBmcmVlIHRoZSBNREwsIGFuZCBmcmVlIHBhZ2VkCisgICAgICAgICAgICBpZiAobG9ja2VkW2ldLnBNZGwpIHsKKyAgICAgICAgICAgICAgICAvLyBVbmxvY2sgd2hhdCB3ZSBsb2NrZWQgYW5kIGZyZWUgdGhlIE1kbAorICAgICAgICAgICAgICAgIE1tVW5sb2NrUGFnZXMobG9ja2VkW2ldLnBNZGwpOworICAgICAgICAgICAgICAgIElvRnJlZU1kbChsb2NrZWRbaV0ucE1kbCk7CisgICAgICAgICAgICAgICAgRXhGcmVlUG9vbChsb2NrZWRbaV0ubGluZWFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBGcmVlIHRoZSBtbUlvTWFwIG1hcHBpbmcgZm9yIHRoZSBtZW1vcnkhCisKKyAgICAgICAgICAgICAgICAvLyBGcmVlIG5vbi1wYWdlZCBwb29sCisgICAgICAgICAgICAgICAgTW1GcmVlQ29udGlndW91c01lbW9yeShsb2NrZWRbaV0ubGluZWFyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZsYWcgdGhhdCBpcyBlbnRyeSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIGxvY2tlZFtpXS5saW5lYXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKKyAgICBpYm9vbCBsb2NrZWQpCit7CisgICAgLy8gQWxsb2NhdGUgdGhlIG1lbW9yeSBmcm9tIHRoZSBub24tcGFnZWQgcG9vbCBpZiB3ZSB3YW50IHRoZSBtZW1vcnkKKyAgICAvLyB0byBiZSBsb2NrZWQuCisgICAgcmV0dXJuIEV4QWxsb2NhdGVQb29sKAorICAgICAgICBsb2NrZWQgPyBOb25QYWdlZFBvb2xDYWNoZUFsaWduZWQgOiBQYWdlZFBvb2xDYWNoZUFsaWduZWQsCisgICAgICAgIFBBR0VfU0laRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAorICAgIHZvaWQgKnApCit7CisgICAgaWYgKHApIEV4RnJlZVBvb2wocCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKAorICAgIHZvaWQgKnAsCisgICAgdWludCBsZW4sCisgICAgUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgTURMICpwTWRsOworCisgICAgLy8gQ3JlYXRlIGEgbGlzdCB0byBtYW5hZ2UgdGhpcyBhbGxvY2F0aW9uCisgICAgaWYgKChwTWRsID0gSW9BbGxvY2F0ZU1kbChwLGxlbixGQUxTRSxGQUxTRSwoUElSUClOVUxMKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5CisgICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhwTWRsLEtlcm5lbE1vZGUsSW9Nb2RpZnlBY2Nlc3MpOworICAgICooKFBNREwqKSgmbGgtPmgpKSA9IHBNZGw7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcygKKyAgICB2b2lkICpwLAorICAgIHVpbnQgbGVuLAorICAgIFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIGlmIChwICYmIGxoKSB7CisgICAgICAgIC8vIFVubG9jayB3aGF0IHdlIGxvY2tlZAorICAgICAgICBNREwgKnBNZGwgPSAqKChQTURMKikoJmxoLT5oKSk7CisgICAgICAgIE1tVW5sb2NrUGFnZXMocE1kbCk7CisgICAgICAgIElvRnJlZU1kbChwTWRsKTsKKyAgICAgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcygKKyAgICB2b2lkICgqcCkoKSwKKyAgICB1aW50IGxlbiwKKyAgICBQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICByZXR1cm4gUE1fbG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXMoCisgICAgdm9pZCAoKnApKCksCisgICAgdWludCBsZW4sCisgICAgUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcmV0dXJuIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvb3NoZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc0N2JiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvb3NoZHIuaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXJzCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19OVERSVl9PU0hEUl9ICisjZGVmaW5lIF9fTlREUlZfT1NIRFJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJbnRlcm5hbCB1bmljb2RlIHN0cmluZyBoYW5kbGluZyBmdW5jdGlvbnMgKi8KKworVU5JQ09ERV9TVFJJTkcgKiAgICBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhjb25zdCBjaGFyICpjc3RyKTsKK3ZvaWQgICAgICAgICAgICAgICAgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKFVOSUNPREVfU1RSSU5HICp1bmlTdHIpOworCisjZW5kaWYgIC8vIF9fTlREUlZfT1NIRFJfSAorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJiZTIyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYwpAQCAtMCwwICsxLDkzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCisjaW5jbHVkZSAibXRyci5oIgorI2luY2x1ZGUgIm9zaGRyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7CitjaGFyICAgICAgICAgICAgICAgIF9QTV9udWNsZXVzUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKK3N0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKKworc3RhdGljIGNoYXIgKnN6TlRXaW5kb3dzS2V5ICAgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbiI7CitzdGF0aWMgY2hhciAqc3pOVFN5c3RlbVJvb3QgICAgID0gIlN5c3RlbVJvb3QiOworc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7CitzdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleU5UID0gIlxcUkVHSVNUUllcXE1hY2hpbmVcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQWN0aXZlQ29tcHV0ZXJOYW1lIjsKK3N0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lICAgICAgPSAiQ29tcHV0ZXJOYW1lIjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQoreworICAgIC8qIEluaXRpYWxpYXNlIHRoZSBNVFJSIG1vZHVsZSAqLworICAgIE1UUlJfaW5pdCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKK3sKKyAgICByZXR1cm4gX09TX1dJTk5URFJWOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCit7CisgICAgcmV0dXJuIFBNXzM4NjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKK3sKKyAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKKyAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgeworICAgICAgICBzW3Bvc10gPSAnXFwnOworICAgICAgICBzW3BvcysxXSA9ICdcMCc7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGUgZmF0YWwgZXJyb3JzIGludGVybmFsbHkgaW4gdGhlIGRyaXZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCisgICAgY29uc3QgY2hhciAqbXNnKQoreworICAgIFVMT05HICAgQnVnQ2hlY2tDb2RlID0gMDsKKyAgICBVTE9ORyAgIE1vcmVCdWdDaGVja0RhdGFbNF0gPSB7MH07CisgICAgY2hhciAgICAqcDsKKyAgICBVTE9ORyAgIGxlbjsKKworICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKKyAgICAgICAgZmF0YWxFcnJvckNsZWFudXAoKTsKKworI2lmZGVmIERCRwkvLyBTZW5kIG91dHB1dCB0byBkZWJ1Z2dlciwganVzdCByZXR1cm4gc28gYXMgbm90IHRvIGZvcmNlIGEgcmVib290CisjcHJhZ21hIG1lc3NhZ2UoIklORk86IGJ1aWxkaW5nIGZvciBkZWJ1ZywgUE1fZmF0YWxFcnJvcigpIHJlLXJvdXRlZCIpCQorCURCR01TRzIoIlNEREhFTFA+IFBNX2ZhdGFsRXJyb3IoKTogRVJST1I6ICVzXG4iLCBtc2cpOwkKKwlyZXR1cm4gOworI2VuZGlmCisgICAgLy8gS2VCdWdDaGVja0V4IGJyaW5ncyBkb3duIHRoZSBzeXN0ZW0gaW4gYSBjb250cm9sbGVkCisgICAgLy8gbWFubmVyIHdoZW4gdGhlIGNhbGxlciBkaXNjb3ZlcnMgYW4gdW5yZWNvdmVyYWJsZQorICAgIC8vIGluY29uc2lzdGVuY3kgdGhhdCB3b3VsZCBjb3JydXB0IHRoZSBzeXN0ZW0gaWYKKyAgICAvLyB0aGUgY2FsbGVyIGNvbnRpbnVlZCB0byBydW4uCisgICAgLy8KKyAgICAvLyBoYWNrIC0gZHVtcCB0aGUgZmlyc3QgMjAgY2hhcnMgaW4gaGV4IHVzaW5nIHRoZSB2YXJpYWJsZXMKKyAgICAvLyAgICAgIHByb3ZpZGVkIC0gRWFjaCBVTE9ORyBpcyBlcXVhbCB0byBmb3VyIGNoYXJhY3RlcnMuLi4KKyAgICBmb3IobGVuID0gMDsgbGVuIDwgMjA7IGxlbisrKQorICAgICAgICBpZiAobXNnW2xlbl0gPT0gKGNoYXIpMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgLy8gVGhpcyBsb29rcyBiYWQgYnV0IGl0J3MgcXVpY2sgYW5kIHJlbGlhYmxlLi4uCisgICAgcCA9IChjaGFyICopJkJ1Z0NoZWNrQ29kZTsKKyAgICBpZihsZW4gPiAwKSBwWzNdID0gbXNnWzBdOworICAgIGlmKGxlbiA+IDEpIHBbMl0gPSBtc2dbMV07CisgICAgaWYobGVuID4gMikgcFsxXSA9IG1zZ1syXTsKKyAgICBpZihsZW4gPiAzKSBwWzBdID0gbXNnWzNdOworCisgICAgcCA9IChjaGFyICopJk1vcmVCdWdDaGVja0RhdGFbMF07CisgICAgaWYobGVuID4gNCkgcFszXSA9IG1zZ1s0XTsKKyAgICBpZihsZW4gPiA1KSBwWzJdID0gbXNnWzVdOworICAgIGlmKGxlbiA+IDYpIHBbMV0gPSBtc2dbNl07CisgICAgaWYobGVuID4gNykgcFswXSA9IG1zZ1s3XTsKKworICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzFdOworICAgIGlmKGxlbiA+IDgpIHBbM10gPSBtc2dbOF07CisgICAgaWYobGVuID4gOSkgcFsyXSA9IG1zZ1s5XTsKKyAgICBpZihsZW4gPiAxMCkgcFsxXSA9IG1zZ1sxMF07CisgICAgaWYobGVuID4gMTEpIHBbMF0gPSBtc2dbMTFdOworCisgICAgcCA9IChjaGFyICopJk1vcmVCdWdDaGVja0RhdGFbMl07CisgICAgaWYobGVuID4gMTIpIHBbM10gPSBtc2dbMTJdOworICAgIGlmKGxlbiA+IDEzKSBwWzJdID0gbXNnWzEzXTsKKyAgICBpZihsZW4gPiAxNCkgcFsxXSA9IG1zZ1sxNF07CisgICAgaWYobGVuID4gMTUpIHBbMF0gPSBtc2dbMTVdOworCisgICAgcCA9IChjaGFyICopJk1vcmVCdWdDaGVja0RhdGFbM107CisgICAgaWYobGVuID4gMTYpIHBbM10gPSBtc2dbMTZdOworICAgIGlmKGxlbiA+IDE3KSBwWzJdID0gbXNnWzE3XTsKKyAgICBpZihsZW4gPiAxOCkgcFsxXSA9IG1zZ1sxOF07CisgICAgaWYobGVuID4gMTkpIHBbMF0gPSBtc2dbMTldOworCisgICAgLy8gSGFsdCB0aGUgc3lzdGVtIQorICAgIEtlQnVnQ2hlY2tFeChCdWdDaGVja0NvZGUsIE1vcmVCdWdDaGVja0RhdGFbMF0sIE1vcmVCdWdDaGVja0RhdGFbMV0sIE1vcmVCdWdDaGVja0RhdGFbMl0sIE1vcmVCdWdDaGVja0RhdGFbM10pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAorICAgIGNoYXIgKnBhdGgsCisgICAgaW50IG1heExlbikKK3sKKyAgICBzdHJuY3B5KHBhdGgsX1BNX2NudFBhdGgsbWF4TGVuKTsKKyAgICBwYXRoW21heExlbi0xXSA9IDA7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc3pLZXkgICAgICAgLSBLZXkgdG8gcXVlcnkgKGNhbiBjb250YWluIHZlcnNpb24gbnVtYmVyIGZvcm1hdHRpbmcpCitzelZhbHVlICAgICAtIFZhbHVlIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IKK3ZhbHVlICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlZ2lzdHJ5IGtleSBkYXRhIHJlYWQKK3NpemUgICAgICAgIC0gU2l6ZSBvZiB0aGUgc3RyaW5nIGJ1ZmZlciB0byByZWFkIGludG8KKworUkVUVVJOUzoKK3RydWUgaWYgdGhlIGtleSB3YXMgZm91bmQsIGZhbHNlIGlmIG5vdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nKAorICAgIGNoYXIgKnN6S2V5LAorICAgIGNvbnN0IGNoYXIgKnN6VmFsdWUsCisgICAgY2hhciAqdmFsdWUsCisgICAgRFdPUkQgc2l6ZSkKK3sKKyAgICBpYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIHJ2YWw7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGU7CisgICAgT0JKRUNUX0FUVFJJQlVURVMgICAgICAgICAgICAgICBrZXlBdHRyaWJ1dGVzOworICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICAgICAgICAgKnVuaUtleSA9IE5VTEw7CisgICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICAgICAqdW5pVmFsdWUgPSBOVUxMOworICAgIFBLRVlfVkFMVUVfRlVMTF9JTkZPUk1BVElPTgkJZnVsbEluZm8gPSBOVUxMOworICAgIFNUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nZGF0YTsKKyAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAgICAgICAgIHVuaWRhdGE7CisKKyAgICAvLyBDb252ZXJ0IHN0cmluZ3MgdG8gVW5pQ29kZQorICAgIHN0YXR1cyA9IGZhbHNlOworICAgIGlmICgodW5pS2V5ID0gX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcoc3pLZXkpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgaWYgKCh1bmlWYWx1ZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHN6VmFsdWUpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvLyBPcGVuIHRoZSBrZXkKKyAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyggJmtleUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JKX0NBU0VfSU5TRU5TSVRJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsKKyAgICBydmFsID0gWndPcGVuS2V5KCAmSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIEtFWV9BTExfQUNDRVNTLAorICAgICAgICAgICAgICAgICAgICAgICZrZXlBdHRyaWJ1dGVzICk7CisgICAgaWYgKCFOVF9TVUNDRVNTKHJ2YWwpKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvLyBRdWVyeSB0aGUgdmFsdWUKKyAgICBsZW5ndGggPSBzaXplb2YgKEtFWV9WQUxVRV9GVUxMX0lORk9STUFUSU9OKQorICAgICAgICAgICArIHNpemUgKiBzaXplb2YoV0NIQVIpOworICAgIGlmICgoZnVsbEluZm8gPSBFeEFsbG9jYXRlUG9vbCAoUGFnZWRQb29sLCBsZW5ndGgpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgUnRsWmVyb01lbW9yeShmdWxsSW5mbywgbGVuZ3RoKTsKKyAgICBydmFsID0gWndRdWVyeVZhbHVlS2V5IChIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5VmFsdWVGdWxsSW5mb3JtYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOworICAgIGlmIChOVF9TVUNDRVNTIChydmFsKSkgeworICAgICAgICAvLyBDcmVhdGUgdGhlIFVuaUNvZGUgc3RyaW5nIHNvIHdlIGNhbiBjb252ZXJ0IGl0CisgICAgICAgIHVuaWRhdGEuQnVmZmVyID0gKFBXQ0hBUikoKChQQ0hBUilmdWxsSW5mbykgKyBmdWxsSW5mby0+RGF0YU9mZnNldCk7CisgICAgICAgIHVuaWRhdGEuTGVuZ3RoID0gKFVTSE9SVClmdWxsSW5mby0+RGF0YUxlbmd0aDsKKyAgICAgICAgdW5pZGF0YS5NYXhpbXVtTGVuZ3RoID0gKFVTSE9SVClmdWxsSW5mby0+RGF0YUxlbmd0aCArIHNpemVvZihXQ0hBUik7CisKKyAgICAgICAgLy8gQ29udmVydCB1bmljb2RlIHVuaXZhbHVlIHRvIGFuc2kgc3RyaW5nLgorICAgICAgICBydmFsID0gUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZygmc3RyaW5nZGF0YSwgJnVuaWRhdGEsIFRSVUUpOworICAgICAgICBpZiAoTlRfU1VDQ0VTUyhydmFsKSkgeworICAgICAgICAgICAgc3RyY3B5KHZhbHVlLHN0cmluZ2RhdGEuQnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworRXhpdDoKKyAgICBpZiAoZnVsbEluZm8pIEV4RnJlZVBvb2woZnVsbEluZm8pOworICAgIGlmICh1bmlLZXkpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlLZXkpOworICAgIGlmICh1bmlWYWx1ZSkgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKHVuaVZhbHVlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoreworICAgIGNoYXIgcGF0aFsyNTZdOworICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pOVFdpbmRvd3NLZXksc3pOVFN5c3RlbVJvb3QscGF0aCxzaXplb2YocGF0aCkpKQorICAgICAgICByZXR1cm4gJ2MnOworICAgIHJldHVybiBwYXRoWzBdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCit7CisgICAgcmV0dXJuICJjOlxcIjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKworICAgIGlmIChzdHJsZW4oX1BNX251Y2xldXNQYXRoKSA+IDApIHsKKyAgICAgICAgc3RyY3B5KHBhdGgsX1BNX251Y2xldXNQYXRoKTsKKyAgICAgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorICAgIGlmICghUkVHX3F1ZXJ5U3RyaW5nKHN6TlRXaW5kb3dzS2V5LHN6TlRTeXN0ZW1Sb290LHBhdGgsc2l6ZW9mKHBhdGgpKSkKKyAgICAgICAgc3RyY3B5KHBhdGgsImM6XFx3aW5udCIpOworICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICBzdHJjYXQocGF0aCwic3lzdGVtMzJcXG51Y2xldXMiKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCit7CisgICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKKworICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleSxzek1hY2hpbmVOYW1lLG5hbWUsc2l6ZW9mKG5hbWUpKSkKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5TlQsc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCisgICAgICAgIHJldHVybiBuYW1lOworICAgIHJldHVybiAiVW5rbm93biI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICAvLyBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sKKyAgICAvLyBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzCisgICAgcmV0dXJuIDB4RDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitPcGVuIGEgY29uc29sZSBmb3Igb3V0cHV0IHRvIHRoZSBzY3JlZW4sIGNyZWF0aW5nIHRoZSBtYWluIGV2ZW50IGhhbmRsaW5nCit3aW5kb3cgaWYgbmVjZXNzYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCisgICAgUE1fSFdORCBod25kVXNlciwKKyAgICBpbnQgZGV2aWNlLAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzLAorICAgIGludCBicHAsCisgICAgaWJvb2wgZnVsbFNjcmVlbikKK3sKKyAgICAvLyBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzCisgICAgKHZvaWQpaHduZFVzZXI7CisgICAgKHZvaWQpZGV2aWNlOworICAgICh2b2lkKXhSZXM7CisgICAgKHZvaWQpeVJlczsKKyAgICAodm9pZClicHA7CisgICAgKHZvaWQpZnVsbFNjcmVlbjsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQoreworICAgIC8vIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCisgICAgdm9pZCAqc3RhdGVCdWYsCisgICAgUE1fSFdORCBod25kQ29uc29sZSkKK3sKKyAgICAvLyBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzCisgICAgKHZvaWQpc3RhdGVCdWY7CisgICAgKHZvaWQpaHduZENvbnNvbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAorICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCit7CisgICAgLy8gTm90IHVzZWQgaW4gTlQgZHJpdmVycworICAgICh2b2lkKXNhdmVTdGF0ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKKyAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8vIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClzdGF0ZUJ1ZjsKKyAgICAodm9pZClod25kQ29uc29sZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDbG9zZSB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLy8gTm90IHVzZWQgaW4gTlQgZHJpdmVycworICAgICh2b2lkKWh3bmRDb25zb2xlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKKyAgICBpbnQgeCwKKyAgICBpbnQgeSkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBXaW5kb3dzICovCisgICAgKHZvaWQpeDsKKyAgICAodm9pZCl5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0KQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KKyAgICAodm9pZCl3aWR0aDsKKyAgICAodm9pZCloZWlnaHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwcyBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW50byBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIERvZXMgbm90aGluZyBzaW5jZQordGhlIG1lbW9yeSBibG9ja3MgYXJlIGFscmVhZHkgZ2xvYmFsbHkgbWFwcGVkIGludG8gYWxsIHByb2Nlc3Nlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAorICAgIHZvaWQgKmJhc2UsCisgICAgdWxvbmcgbGltaXQpCit7CisgICAgLy8gTm90IHVzZWQgYW55bW9yZQorICAgICh2b2lkKWJhc2U7CisgICAgKHZvaWQpbGltaXQ7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAorICAgIHVzaG9ydCBheFZhbCwKKyAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCisgICAgdm9pZCAqbWFwcGVkQklPUywKKyAgICB1bG9uZyBCSU9TTGVuKQoreworICAgIC8vIFRoaXMgbWF5IG5vdCBiZSBwb3NzaWJsZSBpbiBOVCBhbmQgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIE9TIGFueXdheQorICAgICh2b2lkKWF4VmFsOworICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKKyAgICAodm9pZCltYXBwZWRCSU9TOworICAgICh2b2lkKUJJT1NMZW47CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICAvLyBOb3RlIHRoYXQgb24gTlQgdGhpcyBwcm9iYWJseSBkb2VzIG5vdCBkbyB3aGF0IHdlIGV4cGVjdCEKKyAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLCAweDEwMDAsIHRydWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreworICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsZmFsc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zbGVlcCgKKyAgICB1bG9uZyBtaWxsaXNlY29uZHMpCit7CisgICAgLy8gV2UgbmV2ZXIgdXNlIHRoaXMgaW4gTlQgZHJpdmVycworICAgICh2b2lkKW1pbGxpc2Vjb25kczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQ09NIHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICBjYXNlIDI6IHJldHVybiAweDNFODsKKyAgICAgICAgY2FzZSAzOiByZXR1cm4gMHgyRTg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzQkM7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4Mzc4OworICAgICAgICBjYXNlIDI6IHJldHVybiAweDI3ODsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybnMgYXZhaWxhYmxlIG1lbW9yeS4gTm90IHBvc3NpYmxlIHVuZGVyIFdpbmRvd3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCisgICAgdWxvbmcgKnBoeXNpY2FsLAorICAgIHVsb25nICp0b3RhbCkKK3sKKyAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK09TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWeEQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCisgICAgY29uc3QgY2hhciAqc3pETExOYW1lKQoreworICAgIC8vIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgIC8vIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZCloTW9kdWxlOworICAgICh2b2lkKXN6UHJvY05hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUpCit7CisgICAgLy8gTm90IHVzZWQgaW4gTlQgZHJpdmVycworICAgICh2b2lkKWhNb2R1bGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2gKKyAgICAvLyAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlCisgICAgLy8gICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClmaW5kRGF0YTsKKyAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCisgICAgdm9pZCAqaGFuZGxlLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uCisgICAgLy8gICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0bworICAgIC8vICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkCisgICAgLy8gICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uCisgICAgKHZvaWQpaGFuZGxlOworICAgICh2b2lkKWZpbmREYXRhOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvCisgICAgLy8gICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4KKyAgICAodm9pZCloYW5kbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMSAgIC0gRHJpdmUgQToKKyAgICAyICAgLSBEcml2ZSBCOgorICAgIDMgICAtIERyaXZlIEM6CisgICAgZXRjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAorICAgIGNoYXIgZHJpdmUpCit7CisgICAgLy8gTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzCisgICAgKHZvaWQpZHJpdmU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCitVbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKK29mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9nZXRkY3dkKAorICAgIGludCBkcml2ZSwKKyAgICBjaGFyICpkaXIsCisgICAgaW50IGxlbikKK3sKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClkcml2ZTsKKyAgICAodm9pZClkaXI7CisgICAgKHZvaWQpbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Jhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3NpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCit0eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFVFVSTlM6CitFcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgc2l6ZSwKKyAgICB1aW50IHR5cGUpCit7CisgICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgdWludCBhdHRyaWIpCit7CisgICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIEFDQ0VTU19NQVNLICAgICAgICAgICAgIERlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgICAgIE9iamVjdEF0dHJpYnV0ZXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQ7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisgICAgSEFORExFICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSA9IE5VTEw7CisgICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgKnVuaUZpbGUgPSBOVUxMOworICAgIElPX1NUQVRVU19CTE9DSyAgICAgICAgIElvU3RhdHVzQmxvY2s7CisgICAgRklMRV9CQVNJQ19JTkZPUk1BVElPTiAgRmlsZUJhc2ljOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGtlcm5lbEZpbGVuYW1lW1BNX01BWF9QQVRIKzVdOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIEZpbGVBdHRyaWJ1dGVzID0gMDsKKworICAgIC8vIENvbnZlcnQgZmlsZSBhdHRyaWJ1dGUgZmxhZ3MKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKKyAgICAgICAgRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7CisgICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfQVJDSElWRSkKKyAgICAgICAgRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCisgICAgICAgIEZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCisgICAgICAgIEZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX1NZU1RFTTsKKworICAgIC8vIEFkZCBwcmVmaXggZm9yIGFkZHJlc3NpbmcgdGhlIGZpbGUgc3lzdGVtLiAiXD8/XCIgaXMgc2hvcnQgZm9yICJcRG9zRGV2aWNlc1wiCisgICAgc3RyY3B5KGtlcm5lbEZpbGVuYW1lLCAiXFw/P1xcIik7CisgICAgc3RyY2F0KGtlcm5lbEZpbGVuYW1lLCBmaWxlbmFtZSk7CisKKyAgICAvLyBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZworICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgLy8gTXVzdCBvcGVuIGEgZmlsZSB0byBxdWVyeSBpdCdzIGF0dHJpYnV0ZXMKKyAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CSl9DQVNFX0lOU0VOU0lUSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7CisgICAgc3RhdHVzID0gWndDcmVhdGVGaWxlKCAmRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9iamVjdEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklvU3RhdHVzQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvL0FsbG9jYXRpb25TaXplICBPUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9SQU5ET01fQUNDRVNTLCAgICAgICAgLy9DcmVhdGVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLy9FYUJ1ZmZlciAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAvL0VhTGVuZ3RoIChyZXF1aXJlZCBpZiBFYUJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgLy8gUXVlcnkgdGltZXN0YW1wcworICAgIHN0YXR1cyA9IFp3UXVlcnlJbmZvcm1hdGlvbkZpbGUoRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJb1N0YXR1c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZpbGVCYXNpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSUxFX0JBU0lDX0lORk9STUFUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVCYXNpY0luZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgLy8gQ2hhbmdlIHRoZSBmb3VyIGJpdHMgd2UgY2hhbmdlCisgICAgRmlsZUJhc2ljLkZpbGVBdHRyaWJ1dGVzICY9IH4oRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkgfCBGSUxFX0FUVFJJQlVURV9BUkNISVZFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGSUxFX0FUVFJJQlVURV9ISURERU4gfCBGSUxFX0FUVFJJQlVURV9TWVNURU0pOworICAgIEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyB8PSBGaWxlQXR0cmlidXRlczsKKworICAgIC8vIFNldCB0aW1lc3RhbXBzCisgICAgWndTZXRJbmZvcm1hdGlvbkZpbGUoICAgRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW9TdGF0dXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmlsZUJhc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSUxFX0JBU0lDX0lORk9STUFUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0V4aXQ6CisgICAgaWYgKEZpbGVIYW5kbGUpIFp3Q2xvc2UoRmlsZUhhbmRsZSk7CisgICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBBQ0NFU1NfTUFTSyAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKKyAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICBPYmplY3RBdHRyaWJ1dGVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOOworICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgPSBOVUxMOworICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICp1bmlGaWxlID0gTlVMTDsKKyAgICBJT19TVEFUVVNfQkxPQ0sgICAgICAgICBJb1N0YXR1c0Jsb2NrOworICAgIEZJTEVfQkFTSUNfSU5GT1JNQVRJT04gIEZpbGVCYXNpYzsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlbmFtZVtQTV9NQVhfUEFUSCs1XTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBGaWxlQXR0cmlidXRlcyA9IDA7CisgICAgdWludCAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKKworICAgIC8vIEFkZCBwcmVmaXggZm9yIGFkZHJlc3NpbmcgdGhlIGZpbGUgc3lzdGVtLiAiXD8/XCIgaXMgc2hvcnQgZm9yICJcRG9zRGV2aWNlc1wiCisgICAgc3RyY3B5KGtlcm5lbEZpbGVuYW1lLCAiXFw/P1xcIik7CisgICAgc3RyY2F0KGtlcm5lbEZpbGVuYW1lLCBmaWxlbmFtZSk7CisKKyAgICAvLyBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZworICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgLy8gTXVzdCBvcGVuIGEgZmlsZSB0byBxdWVyeSBpdCdzIGF0dHJpYnV0ZXMKKyAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CSl9DQVNFX0lOU0VOU0lUSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7CisgICAgc3RhdHVzID0gWndDcmVhdGVGaWxlKCAmRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRBY2Nlc3MgfCBTWU5DSFJPTklaRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZPYmplY3RBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJklvU3RhdHVzQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8vQWxsb2NhdGlvblNpemUgIE9QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVEaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfUkFORE9NX0FDQ0VTUywgICAgICAgIC8vQ3JlYXRlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLy9FYUJ1ZmZlciAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIC8vRWFMZW5ndGggKHJlcXVpcmVkIGlmIEVhQnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgIC8vIFF1ZXJ5IHRpbWVzdGFtcHMKKyAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKEZpbGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW9TdGF0dXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGaWxlQmFzaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgIC8vIFRyYW5zbGF0ZSB0aGUgZmlsZSBhdHRyaWJ1dGVzCisgICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQorICAgICAgICByZXR2YWwgfD0gUE1fRklMRV9SRUFET05MWTsKKyAgICBpZiAoRmlsZUJhc2ljLkZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfQVJDSElWRSkKKyAgICAgICAgcmV0dmFsIHw9IFBNX0ZJTEVfQVJDSElWRTsKKyAgICBpZiAoRmlsZUJhc2ljLkZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfSElEREVOKQorICAgICAgICByZXR2YWwgfD0gUE1fRklMRV9ISURERU47CisgICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkKKyAgICAgICAgcmV0dmFsIHw9IFBNX0ZJTEVfU1lTVEVNOworCitFeGl0OgorICAgIGlmIChGaWxlSGFuZGxlKSBad0Nsb3NlKEZpbGVIYW5kbGUpOworICAgIGlmICh1bmlGaWxlKSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pRmlsZSk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fbWtkaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgLy8gTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBpYm9vbCBnbVRpbWUsCisgICAgUE1fdGltZSAqdGltZSkKK3sKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClnbVRpbWU7CisgICAgKHZvaWQpdGltZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBpYm9vbCBnbVRpbWUsCisgICAgUE1fdGltZSAqdGltZSkKK3sKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClnbVRpbWU7CisgICAgKHZvaWQpdGltZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jCkBAIC0wLDAgKzEsMzMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIKKyoKKyogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBJL08gZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGEgV2luZG93cworKiAgICAgICAgICAgICAgIE5UIGRyaXZlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgIm9zaGRyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gQ29kZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZm9wZW4gZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRklMRSAqIGZvcGVuKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgICAgQUNDRVNTX01BU0sgICAgICAgICAgICAgICAgIERlc2lyZWRBY2Nlc3M7ICAgICAgLy8gZm9yIFp3Q3JlYXRlRmlsZS4uLgorICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgICAgICAgICBPYmplY3RBdHRyaWJ1dGVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICBTaGFyZUFjY2VzczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb247CisgICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZTsKKyAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAgICAgKnVuaUZpbGUgPSBOVUxMOworICAgIFBXQ0hBUiAgICAgICAgICAgICAgICAgICAgICBidWZGaWxlID0gTlVMTDsKKyAgICBJT19TVEFUVVNfQkxPQ0sgICAgICAgICAgICAgSW9TdGF0dXNCbG9jazsKKyAgICBGSUxFX1NUQU5EQVJEX0lORk9STUFUSU9OICAgRmlsZUluZm9ybWF0aW9uOworICAgIEZJTEVfUE9TSVRJT05fSU5GT1JNQVRJT04gICBGaWxlUG9zaXRpb247CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbEZpbGVuYW1lW1BNX01BWF9QQVRIKzVdOworICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAqZjsKKworICAgIC8vIEFkZCBwcmVmaXggZm9yIGFkZHJlc3NpbmcgdGhlIGZpbGUgc3lzdGVtLiAiXD8/XCIgaXMgc2hvcnQgZm9yICJcRG9zRGV2aWNlc1wiCisgICAgc3RyY3B5KGtlcm5lbEZpbGVuYW1lLCAiXFw/P1xcIik7CisgICAgc3RyY2F0KGtlcm5lbEZpbGVuYW1lLCBmaWxlbmFtZSk7CisgICAgaWYgKChmID0gUE1fbWFsbG9jKHNpemVvZihGSUxFKSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgZi0+b2Zmc2V0ID0gMDsKKyAgICBmLT50ZXh0ID0gKG1vZGVbMV0gPT0gJ3QnIHx8IG1vZGVbMl0gPT0gJ3QnKTsKKyAgICBmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7CisgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7CisgICAgICAgIC8vIG9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7CisgICAgICAgIC8vIGFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19PUEVOIHwgQUNUSU9OX0lGTk9URVhJU1RTX0ZBSUw7CisgICAgICAgIERlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisgICAgICAgIFNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKKyAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisgICAgICAgIH0KKyAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgeworICAgICAgICAvLyBvbW9kZSA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKKyAgICAgICAgLy8gYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX1RSVU5DQVRFIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsKKyAgICAgICAgRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEU7CisgICAgICAgIFNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKKyAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb24gPSBGSUxFX1NVUEVSU0VERTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBvbW9kZSA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKKyAgICAgICAgLy8gYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX09QRU4gfCBBQ1RJT05fSUZOT1RFWElTVFNfQ1JFQVRFOworICAgICAgICBEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKKyAgICAgICAgU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQ7CisgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOX0lGOworICAgICAgICB9CisKKyAgICAvLyBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyBhbmQgdGhlbiB0byBVbmlDb2RlIHN0cmluZworICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBDcmVhdGUgdGhlIGZpbGUKKyAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CSl9DQVNFX0lOU0VOU0lUSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBzdGF0dXMgPSBad0NyZWF0ZUZpbGUoICZGaWxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRBY2Nlc3MgfCBTWU5DSFJPTklaRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT2JqZWN0QXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW9TdGF0dXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0aW9uU2l6ZSAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfUkFORE9NX0FDQ0VTUywgICAgIC8vIENyZWF0ZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gRWFCdWZmZXIgIE9QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhTGVuZ3RoIChyZXF1aXJlZCBpZiBFYUJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBmLT5oYW5kbGUgPSAoaW50KUZpbGVIYW5kbGU7CisKKyAgICAvLyBEZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZmlsZQorICAgIHN0YXR1cyA9IFp3UXVlcnlJbmZvcm1hdGlvbkZpbGUoICBGaWxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW9TdGF0dXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZpbGVJbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJTEVfU1RBTkRBUkRfSU5GT1JNQVRJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlU3RhbmRhcmRJbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBmLT5maWxlc2l6ZSA9IEZpbGVJbmZvcm1hdGlvbi5FbmRPZkZpbGUuTG93UGFydDsKKworICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBpZiB3ZSBhcmUgYXBwZW5kaW5nCisgICAgaWYgKG1vZGVbMF0gPT0gJ2EnKSB7CisgICAgICAgIEZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7CisgICAgICAgIEZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5Mb3dQYXJ0ID0gZi0+ZmlsZXNpemU7CisgICAgICAgIHN0YXR1cyA9IFp3U2V0SW5mb3JtYXRpb25GaWxlKCAgRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW9TdGF0dXNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmlsZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUG9zaXRpb25JbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICByZXR1cm4gZjsKKworRXJyb3I6CisgICAgaWYgKGYpIFBNX2ZyZWUoZik7CisgICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgZnJlYWQoCisgICAgdm9pZCAqcHRyLAorICAgIHNpemVfdCBzaXplLAorICAgIHNpemVfdCBuLAorICAgIEZJTEUgKmYpCit7CisgICAgTlRTVEFUVVMgICAgICAgIHN0YXR1czsKKyAgICBJT19TVEFUVVNfQkxPQ0sgSW9TdGF0dXNCbG9jazsKKyAgICBMQVJHRV9JTlRFR0VSICAgQnl0ZU9mZnNldDsKKworICAgIC8vIFJlYWQgYW55IGV4dHJhIGJ5dGVzIGZyb20gdGhlIGZpbGUKKyAgICBCeXRlT2Zmc2V0LkhpZ2hQYXJ0ID0gMDsKKyAgICBCeXRlT2Zmc2V0Lkxvd1BhcnQgPSBmLT5vZmZzZXQ7CisgICAgc3RhdHVzID0gWndSZWFkRmlsZSggKEhBTkRMRSlmLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIC8vSU4gSEFORExFICBFdmVudCAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIC8vICBJTiBQSU9fQVBDX1JPVVRJTkUgIEFwY1JvdXRpbmUgIE9QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAvLyAgSU4gUFZPSUQgIEFwY0NvbnRleHQgIE9QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICZJb1N0YXR1c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgICAgICAgICAgICAgICAvLyAgT1VUIFBWT0lEICBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAqIG4sICAgICAgICAgIC8vSU4gVUxPTkcgIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmQnl0ZU9mZnNldCwgICAgICAgLy9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgLy9JTiBQVUxPTkcgIEtleSAgT1BUSU9OQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZi0+b2Zmc2V0ICs9IElvU3RhdHVzQmxvY2suSW5mb3JtYXRpb247CisgICAgcmV0dXJuIElvU3RhdHVzQmxvY2suSW5mb3JtYXRpb24gLyBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ3cml0ZSBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgZndyaXRlKAorICAgIGNvbnN0IHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgbiwKKyAgICBGSUxFICpmKQoreworICAgIE5UU1RBVFVTICAgICAgICBzdGF0dXM7CisgICAgSU9fU1RBVFVTX0JMT0NLIElvU3RhdHVzQmxvY2s7CisgICAgTEFSR0VfSU5URUdFUiAgIEJ5dGVPZmZzZXQ7CisKKyAgICBpZiAoIWYtPndyaXRlbW9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7CisgICAgQnl0ZU9mZnNldC5Mb3dQYXJ0ID0gZi0+b2Zmc2V0OworICAgIHN0YXR1cyA9IFp3V3JpdGVGaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgLy9JTiBIQU5ETEUgIEV2ZW50ICBPUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgLy8gIElOIFBJT19BUENfUk9VVElORSAgQXBjUm91dGluZSAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgIC8vICBJTiBQVk9JRCAgQXBjQ29udGV4dCAgT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZJb1N0YXR1c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopcHRyLCAgICAgICAvLyAgT1VUIFBWT0lEICBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKiBuLCAgICAgICAgIC8vSU4gVUxPTkcgIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkJ5dGVPZmZzZXQsICAgICAgLy9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgLy9JTiBQVUxPTkcgIEtleSAgT1BUSU9OQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCisgICAgICAgIHJldHVybiAwOworICAgIGYtPm9mZnNldCArPSBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uOworICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKKyAgICAgICAgZi0+ZmlsZXNpemUgPSBmLT5vZmZzZXQ7CisgICAgcmV0dXJuIElvU3RhdHVzQmxvY2suSW5mb3JtYXRpb24gLyBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZmbHVzaCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmZsdXNoKAorICAgIEZJTEUgKmYpCit7CisgICAgLy8gTm90aGluZyB0byBkbyBoZXJlIGFzIHdlIGFyZSBub3QgZG9pbmcgYnVmZmVyZWQgSS9PCisgICAgKHZvaWQpZjsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmc2VlayBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZnNlZWsoCisgICAgRklMRSAqZiwKKyAgICBsb25nIGludCBvZmZzZXQsCisgICAgaW50IHdoZW5jZSkKK3sKKyAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIEZJTEVfUE9TSVRJT05fSU5GT1JNQVRJT04gICBGaWxlUG9zaXRpb247CisgICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgICAgIElvU3RhdHVzQmxvY2s7CisKKyAgICBpZiAod2hlbmNlID09IDApCisgICAgICAgIGYtPm9mZnNldCA9IG9mZnNldDsKKyAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKKyAgICAgICAgZi0+b2Zmc2V0ICs9IG9mZnNldDsKKyAgICBlbHNlIGlmICh3aGVuY2UgPT0gMikKKyAgICAgICAgZi0+b2Zmc2V0ID0gZi0+ZmlsZXNpemUgKyBvZmZzZXQ7CisgICAgRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0LkhpZ2hQYXJ0ID0gMDsKKyAgICBGaWxlUG9zaXRpb24uQ3VycmVudEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPm9mZnNldDsKKyAgICBzdGF0dXMgPSBad1NldEluZm9ybWF0aW9uRmlsZSggKEhBTkRMRSlmLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJb1N0YXR1c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmlsZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklMRV9QT1NJVElPTl9JTkZPUk1BVElPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQb3NpdGlvbkluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnRlbGwgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9uZyBmdGVsbCgKKyAgICBGSUxFICpmKQoreworICAgIHJldHVybiBmLT5vZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmVvZiBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmVvZigKKyAgICBGSUxFICpmKQoreworICAgIHJldHVybiAoZi0+b2Zmc2V0ID09IGYtPmZpbGVzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZ2V0cyBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICpmZ2V0cygKKyAgICBjaGFyICpzLAorICAgIGludCBuLAorICAgIEZJTEUgKmYpCit7CisgICAgaW50ICAgICBsZW47CisgICAgY2hhciAgICAqY3M7CisKKyAgICAvLyBSZWFkIHRoZSBlbnRpcmUgYnVmZmVyIGludG8gbWVtb3J5IChvdXIgZnVuY3Rpb25zIGFyZSB1bmJ1ZmZlcmVkISkKKyAgICBpZiAoKGxlbiA9IGZyZWFkKHMsMSxuLGYpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vIFNlYXJjaCBmb3IgJ1xuJyBvciBlbmQgb2Ygc3RyaW5nCisgICAgaWYgKG4gPiBsZW4pCisgICAgICAgIG4gPSBsZW47CisgICAgY3MgPSBzOworICAgIHdoaWxlICgtLW4gPiAwKSB7CisgICAgICAgIGlmICgqY3MgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjcysrOworICAgICAgICB9CisgICAgKmNzID0gJ1wwJzsKKyAgICByZXR1cm4gczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcHV0cyBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZnB1dHMoCisgICAgY29uc3QgY2hhciAqcywKKyAgICBGSUxFICpmKQoreworICAgIHJldHVybiBmd3JpdGUocywxLHN0cmxlbihzKSxmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitOVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmY2xvc2UgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZjbG9zZSgKKyAgICBGSUxFICpmKQoreworICAgIFp3Q2xvc2UoKEhBTkRMRSlmLT5oYW5kbGUpOworICAgIFBNX2ZyZWUoZik7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3MDUxMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGxpYi5jCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIKKyoKKyogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBzdGRsaWIuaCBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYQorKiAgICAgICAgICAgICAgIFdpbmRvd3MgTlQgZHJpdmVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAib3NoZHIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQTV9tYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gTlQgZHJpdmVycydzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBtYWxsb2MoCisgICAgc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuIFBNX21hbGxvY1NoYXJlZChzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitjYWxsb2MgbGlicmFyeSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBOVCBkcml2ZXJzJ3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIGNhbGxvYygKKyAgICBzaXplX3QgbmVsZW0sCisgICAgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChuZWxlbSAqIHNpemUpOworICAgIGlmIChwKQorICAgICAgICBtZW1zZXQocCwwLG5lbGVtICogc2l6ZSk7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUE1fcmVhbGxvYyBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogcmVhbGxvYygKKyAgICB2b2lkICpwdHIsCisgICAgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChzaXplKTsKKyAgICBpZiAocCkgeworICAgICAgICBtZW1jcHkocCxwdHIsc2l6ZSk7CisgICAgICAgIFBNX2ZyZWVTaGFyZWQocHRyKTsKKyAgICAgICAgfQorICAgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1BNX2ZyZWUgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBmcmVlKAorICAgIHZvaWQgKnApCit7CisgICAgUE1fZnJlZVNoYXJlZChwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citjc3RyICAgIC0gQyBzdHlsZSBBTlNJIHN0cmluZyB0byBjb252ZXJ0CisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBVbmlDb2RlIHN0cmluZyBzdHJ1Y3R1cmUgb3IgTlVMTCBvbiBmYWlsdXJlIHRvIGFsbG9jYXRlIG1lbW9yeQorCitSRU1BUktTOgorQ29udmVydHMgYSBDIHN0eWxlIHN0cmluZyB0byBhIFVuaUNvZGUgc3RyaW5nIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXNzZWQKK2RpcmVjdGx5IHRvIE5UIGtlcm5lbCBmdW5jdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVU5JQ09ERV9TVFJJTkcgKl9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKAorICAgIGNvbnN0IGNoYXIgKmNzdHIpCit7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBBTlNJX1NUUklORyAgICAgYW5zaVN0cjsKKyAgICBVTklDT0RFX1NUUklORyAgKnVuaVN0cjsKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyBzdHJ1Y3R1cmUKKyAgICBpZiAoKHVuaVN0ciA9IEV4QWxsb2NhdGVQb29sKE5vblBhZ2VkUG9vbCwgc2l6ZW9mKFVOSUNPREVfU1RSSU5HKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgd2lkZSBzdHJpbmcgaXRzZWxmCisgICAgbGVuZ3RoID0gKHN0cmxlbihjc3RyKSAqIHNpemVvZihXQ0hBUikpICsgc2l6ZW9mKFdDSEFSKTsKKyAgICBpZiAoKHVuaVN0ci0+QnVmZmVyID0gRXhBbGxvY2F0ZVBvb2woTm9uUGFnZWRQb29sLCBsZW5ndGgpKSA9PSBOVUxMKSB7CisgICAgICAgIEV4RnJlZVBvb2wodW5pU3RyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICBSdGxaZXJvTWVtb3J5KHVuaVN0ci0+QnVmZmVyLCBsZW5ndGgpOworICAgIHVuaVN0ci0+TGVuZ3RoID0gMDsKKyAgICB1bmlTdHItPk1heGltdW1MZW5ndGggPSAoVVNIT1JUKWxlbmd0aDsKKworICAgIC8vIENvbnZlcnQgZmlsZW5hbWUgc3RyaW5nIHRvIGFuc2kgc3RyaW5nIGFuZCB0aGVuIHRvIFVuaUNvZGUgc3RyaW5nCisgICAgUnRsSW5pdEFuc2lTdHJpbmcoJmFuc2lTdHIsIGNzdHIpOworICAgIFJ0bEFuc2lTdHJpbmdUb1VuaWNvZGVTdHJpbmcodW5pU3RyLCAmYW5zaVN0ciwgRkFMU0UpOworICAgIHJldHVybiB1bmlTdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgordW5pU3RyICAtIFVuaUNvZGUgc3RyaW5nIHN0cnVjdHVyZSB0byBmcmVlCisKK1JFTUFSS1M6CitGcmVlcyBhIHN0cmluZyBhbGxvY2F0ZWQgYnkgdGhlIGFib3ZlIF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKAorICAgIFVOSUNPREVfU1RSSU5HICp1bmlTdHIpCit7CisgICAgaWYgKHVuaVN0cikgeworICAgICAgICBFeEZyZWVQb29sKHVuaVN0ci0+QnVmZmVyKTsKKyAgICAgICAgRXhGcmVlUG9vbCh1bmlTdHIpOworICAgICAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi92ZmxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWNlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi92ZmxhdC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisKK2lib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQoreworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyNzI5NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgQ1BVX2xhcmdlSW50ZWdlciBjb3VudEZyZXE7CitzdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19aVGltZXJJbml0KHZvaWQpCit7CisgICAgS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX0xaVGltZXJPbigKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBMQVJHRV9JTlRFR0VSIGx0ID0gS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihOVUxMKTsKKyAgICB0bS0+c3RhcnQubG93ID0gbHQuTG93UGFydDsKKyAgICB0bS0+c3RhcnQuaGlnaCA9IGx0LkhpZ2hQYXJ0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBMQVJHRV9JTlRFR0VSICAgICAgIHRtTGFwID0gS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihOVUxMKTsKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7CisKKyAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwoQ1BVX2xhcmdlSW50ZWdlciopJnRtTGFwLCZ0bUNvdW50KTsKKyAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgTEFSR0VfSU5URUdFUiBsdCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7CisgICAgdG0tPmVuZC5sb3cgPSBsdC5Mb3dQYXJ0OworICAgIHRtLT5lbmQuaGlnaCA9IGx0LkhpZ2hQYXJ0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKKworICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKKyAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgTEFSR0VfSU5URUdFUiBjb3VudDsKKyAgICBLZVF1ZXJ5U3lzdGVtVGltZSgmY291bnQpOworICAgIHJldHVybiAodWxvbmcpKCooKF9pbnQ2NCopJmNvdW50KSAvIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoreyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL19wbW9zMi5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvX3Btb3MyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFmMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL19wbW9zMi5hc20KQEAgLTAsMCArMSwxODAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQorOyogRW52aXJvbm1lbnQ6IE9TLzIgMzIgYml0IHByb3RlY3RlZCBtb2RlCis7KgorOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYworOyogICAgICAgICAgICAgIHRvIE9TLzIKKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG1vczIgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX3Btb3MyCisKKyAgICAgICAgY2dsb2JhbCBfUE1faW9lbnRyeQorICAgICAgICBjZ2xvYmFsIF9QTV9nZHQKK19QTV9pb2VudHJ5ICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgT2Zmc2V0IHRvIGNhbGwgZ2F0ZQorX1BNX2dkdCAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBTZWxlY3RvciB0byBjYWxsIGdhdGUKKworZW5kZGF0YXNlZyAgX3Btb3MyCisKK2JlZ2NvZGVzZWcgIF9wbW9zMiAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9zZXRJT1BMKGludCBpb3BsKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2hhbmdlIHRoZSBJT1BMIGxldmVsIGZvciB0aGUgMzItYml0IHRhc2suIFJldHVybnMgdGhlIHByZXZpb3VzIGxldmVsCis7IHNvIGl0IGNhbiBiZSByZXN0b3JlZCBmb3IgdGhlIHRhc2sgY29ycmVjdGx5LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX3NldElPUEwKKworICAgICAgICBBUkcgICAgIGlvcGw6VUlOVAorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSB0aGUgb2xkIEVGTEFHUyBmb3IgbGF0ZXIKKyAgICAgICAgbW92ICAgICBlY3gsW2lvcGxdICAgICAgICAgIDsgRUNYIDo9IElPUEwgbGV2ZWwKKyAgICAgICAgeG9yICAgICBlYngsZWJ4ICAgICAgICAgICAgIDsgQ2hhbmdlIElPUEwgbGV2ZWwgZnVuY3Rpb24gY29kZSAoMCkKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KK2VuZGlmCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIGFuZCAgICAgZWF4LDAwMTEwMDAwMDAwMDAwMDBiCisgICAgICAgIHNociAgICAgZWF4LDEyCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3NldEdEVFNlbExpbWl0KHVzaG9ydCBzZWxlY3RvciwgdWxvbmcgbGltaXQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2hhbmdlIHRoZSBHRFQgc2VsZWN0b3IgbGltaXQgdG8gZ2l2ZW4gdmFsdWUuIFVzZWQgdG8gY2hhbmdlIHNlbGVjdG9yCis7IGxpbWl0cyB0byBhZGRyZXNzIHRoZSBlbnRpcmUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3NldEdEVFNlbExpbWl0CisKKyAgICAgICAgQVJHICAgICBzZWxlY3RvcjpVU0hPUlQsIGxpbWl0OlVJTlQKKyAgICAgICAgCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgc3ViICAgICBlc3AsMjAgICAgICAgICAgICAgIDsgTWFrZSByb29tIGZvciBzZWxlY3RvciBkYXRhIG9uIHN0YWNrCisgICAgICAgIG1vdiAgICAgZWN4LGVzcCAgICAgICAgICAgICA7IEVDWCA6PSBzZWxlY3RvciBkYXRhIHN0cnVjdHVyZQorICAgICAgICBtb3YgICAgIGJ4LFtzZWxlY3Rvcl0gICAgICAgOyBGaWxsIG91dCB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgYW5kICAgICBieCwwRkZGOGggICAgICAgICAgIDsgS2ljayBvdXQgdGhlIExEVC9HRFQgYW5kIERQTCBiaXRzICAgICAKKyAgICAgICAgbW92ICAgICBbV09SRCBlY3hdLGJ4CisgICAgICAgIG1vdiAgICAgZWJ4LFtsaW1pdF0KKyAgICAgICAgbW92ICAgICBbRFdPUkQgZWN4KzRdLGVieAorICAgICAgICBtb3YgICAgIGVieCw1ICAgICAgICAgICAgICAgOyBTZXQgR0RUIHNlbGVjdG9yIGxpbWl0IGZ1bmN0aW9uIGNvZGUgICAgICAKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KK2VuZGlmCisgICAgICAgIGFkZCAgICAgZXNwLDIwCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kICAgIAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1Y2hhciBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfTVRSUl9nZXRDeDg2CisKKyAgICAgICAgQVJHICAgICByZWc6VUNIQVIKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgYWwsW3JlZ10KKyAgICAgICAgb3V0ICAgICAyMmgsYWwKKyAgICAgICAgaW4gICAgICBhbCwyM2gKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWNoYXIgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgdmFsKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFdyaXRlIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfTVRSUl9zZXRDeDg2CisKKyAgICAgICAgQVJHICAgICByZWc6VUNIQVIsIHZhbDpVQ0hBUgorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgbW92ICAgICBhbCxbcmVnXQorICAgICAgICBvdXQgICAgIDIyaCxhbAorICAgICAgICBtb3YgICAgIGFsLFt2YWxdCisgICAgICAgIG91dCAgICAgMjNoLGFsCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50CisKKzsgRG8gbm90aGluZyEKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX01UUlJfcmVzdG9yZUludCh1bG9uZyBwcyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9NVFJSX3Jlc3RvcmVJbnQKKworOyBEbyBub3RoaW5nIQorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBEZWJ1Z0ludCh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIERlYnVnSW50CisKKyAgICAgICAgaW50ICAgICAzCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCitlbmRjb2Rlc2VnICBfcG1vczIKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCisgICAgICAgIApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlNDAwZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgT1MvMgorKgorKiBEZXNjcmlwdGlvbjogIE9TLzIgc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUT0RPOiBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBmb3IgT1MvMiEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUT0RPOiBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBmb3IgT1MvMiEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCisgICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKK3sKKyAgICBmcmVxLT5sb3cgPSAxMDAwMDA7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HICAgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEb3NRdWVyeVN5c0luZm8oIFFTVl9NU19DT1VOVCwgUVNWX01TX0NPVU5ULCAmY291bnQsIHNpemVvZihVTE9ORykgKTsgICBcCisgICAgKHQpLT5sb3cgPSBjb3VudCAqIDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jCkBAIC0wLDAgKzEsNTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBJQk0gUEMgKE9TLzIpCisqCisqIERlc2NyaXB0aW9uOiAgT1MvMiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KKyogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGVmaW5lIGdlbmVyb3VzIGtleWJvYXJkIG1vbml0b3IgY2lyY3VsYXIgYnVmZmVyIHNpemUgdG8gbWluaW1pemUKKyAqIHRoZSBkYW5nZXIgb2YgbG9zaW5nIGtleXN0cm9rZXMKKyAqLworI2RlZmluZSBLRVlCVUZTSVpFICAoRVZFTlRRU0laRSArIDEwKQorCitzdGF0aWMgaW50ICAgICAgb2xkTW91c2VTdGF0ZTsgICAgICAgICAgLyogT2xkIG1vdXNlIHN0YXRlICAgICAgICAgICAgICAgKi8KK3N0YXRpYyB1bG9uZyAgICBvbGRLZXlNZXNzYWdlOyAgICAgICAgICAvKiBPbGQga2V5Ym9hcmQgc3RhdGUgICAgICAgICAgICAqLworc3RhdGljIHVzaG9ydCAgIGtleVVwTXNnWzI1Nl0gPSB7MH07ICAgIC8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgICovCitzdGF0aWMgaW50ICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAgKi8KK0hNT1UgICAgICAgICAgICBfRVZUX2hNb3VzZTsgICAgICAgICAgICAvKiBIYW5kbGUgdG8gdGhlIG1vdXNlIGRyaXZlciAgICAqLworSE1PTklUT1IgICAgICAgIF9FVlRfaEtiZE1vbjsgICAgICAgICAgIC8qIEhhbmRsZSB0byB0aGUga2V5Ym9hcmQgZHJpdmVyICovCitUSUQgICAgICAgICAgICAga2JkTW9uVElEID0gMDsgICAgICAgICAgLyogS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQgSUQgICAgKi8KK0hFViAgICAgICAgICAgICBoZXZTdGFydDsgICAgICAgICAgICAgICAvKiBTdGFydCBldmVudCBzZW1hcGhvcmUgaGFuZGxlICAqLworQk9PTCAgICAgICAgICAgIGJNb25SdW5uaW5nOyAgICAgICAgICAgIC8qIEZsYWcgc2V0IGlmIG1vbml0b3IgdGhyZWFkIE9LICovCitITVRYICAgICAgICAgICAgaG10eEtleUJ1ZjsgICAgICAgICAgICAgLyogTXV0ZXggcHJvdGVjdGluZyBrZXkgYnVmZmVyICAgKi8KK0tFWVBBQ0tFVCAgICAgICBrZXlNb25Qa3RzW0tFWUJVRlNJWkVdOyAvKiBBcnJheSBvZiBtb25pdG9yIGtleSBwYWNrZXRzICAqLworaW50ICAgICAgICAgICAgIGtwSGVhZCA9IDA7ICAgICAgICAgICAgIC8qIEtleSBwYWNrZXQgYnVmZmVyIGhlYWQgICAgICAgICovCitpbnQgICAgICAgICAgICAga3BUYWlsID0gMDsgICAgICAgICAgICAgLyogS2V5IHBhY2tldCBidWZmZXIgdGFpbCAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIE9TLzIgKi8KKyNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQorI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAorCitSRU1BUktTOgorVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCitzdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwordGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgorZXZlbnRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKK3sKKyAgICBVTE9ORyAgIGNvdW50OworICAgIERvc1F1ZXJ5U3lzSW5mbyggUVNWX01TX0NPVU5ULCBRU1ZfTVNfQ09VTlQsICZjb3VudCwgc2l6ZW9mKFVMT05HKSApOworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb252ZXJ0cyBhIG1pY2tleSBtb3ZlbWVudCB2YWx1ZSB0byBhIHBpeGVsIGFkanVzdG1lbnQgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBNaWNrZXlUb1BpeGVsKAorICAgIGludCBtaWNrZXkpCit7CisgICAgLy8gVE9ETzogV2UgY2FuIGFkZCBzb21lIGNvZGUgaW4gaGVyZSB0byBoYW5kbGUgJ2FjY2VsZXJhdGlvbicgZm9yCisgICAgLy8gICAgICAgdGhlIG1vdXNlIGN1cnNvci4gRm9yIG5vdyBqdXN0IHVzZSB0aGUgbWlja2V5cy4KKyAgICByZXR1cm4gbWlja2V5OworfQorCisvKiBTb21lIHVzZWZ1bCBkZWZpbmVzIGFueSB0eXBlZGVmcyB1c2VkIGluIHRoZSBrZXlib2FyZCBoYW5kbGluZyAqLworI2RlZmluZSBLRVlfUkVMRUFTRSAgICAgICAgICAgICAweDQwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZyb20gT1MvMiBpbnRvIG91ciBldmVudCBxdWV1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQoreworICAgIEtCRElORk8gICAgICAgICBrZXlJbmZvOyAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KKyAgICBLQkRLRVlJTkZPICAgICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCisgICAgTU9VUVVFSU5GTyAgICAgIG1xdWV1ZTsgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLworICAgIE1PVUVWRU5USU5GTyAgICBtb3VzZTsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgbVdhaXQ7ICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCisgICAgS0VZUEFDS0VUICAgICAgIGtwOyAgICAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLworICAgIGV2ZW50X3QgICAgICAgICBldnQ7CisgICAgaW50ICAgICAgICAgICAgIHNjYW47CisgICAgaWJvb2wgICAgICAgICAgIG5vSW5wdXQgPSBUUlVFOyAvKiBGbGFnIHRvIGRldGVybWluZSBpZiBhbnkgaW5wdXQgd2FzIGF2YWlsYWJsZSAqLworCisgICAgLyogRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB3ZSBzaG91bGQgZG8gYW55IHNlc3Npb24gc3dpdGNoIHdvcmsgKi8KKyAgICBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCgpOworCisgICAgLyogUHVtcCBhbGwga2V5Ym9hcmQgbWVzc2FnZXMgZnJvbSBvdXIgY2lyY3VsYXIgYnVmZmVyICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBtb25pdG9yIHRocmVhZCBpcyBzdGlsbCBydW5uaW5nICovCisgICAgICAgIGlmICghYk1vblJ1bm5pbmcpCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJLZXlib2FyZCBtb25pdG9yIHRocmVhZCBkaWVkISIpOworCisgICAgICAgIC8qIFByb3RlY3Qga2V5cGFja2V0IGJ1ZmZlciB3aXRoIG11dGV4ICovCisgICAgICAgIERvc1JlcXVlc3RNdXRleFNlbShobXR4S2V5QnVmLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgICAgICAgaWYgKGtwSGVhZCA9PSBrcFRhaWwpIHsKKyAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShobXR4S2V5QnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIG5vSW5wdXQgPSBGQUxTRTsKKworICAgICAgICAvKiBSZWFkIHBhY2tldCBmcm9tIGNpcmN1bGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIGl0ICovCisgICAgICAgIG1lbWNweSgma3AsICZrZXlNb25Qa3RzW2twVGFpbF0sIHNpemVvZihLRVlQQUNLRVQpKTsKKyAgICAgICAgaWYgKCsra3BUYWlsID09IEtFWUJVRlNJWkUpCisgICAgICAgICAgICBrcFRhaWwgPSAwOworICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oaG10eEtleUJ1Zik7CisKKyAgICAgICAgLyogQ29tcGVuc2F0ZSBmb3IgdGhlIDB4RTAgY2hhcmFjdGVyICovCisgICAgICAgIGlmIChrcC5YbGF0ZWRTY2FuICYmIGtwLlhsYXRlZENoYXIgPT0gMHhFMCkKKyAgICAgICAgICAgIGtwLlhsYXRlZENoYXIgPSAwOworCisgICAgICAgIC8qIERldGVybWluZSB0eXBlIG9mIGtleWJvYXJkIGV2ZW50ICovCisgICAgICAgIG1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOworICAgICAgICBpZiAoa3AuS2JkRERGbGFnV29yZCAmIEtFWV9SRUxFQVNFKQorICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZVVA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047CisKKyAgICAgICAgLyogQ29udmVydCBrZXlib2FyZCBjb2RlcyAqLworICAgICAgICBzY2FuID0ga3AuTW9uRmxhZ1dvcmQgPj4gODsKKyAgICAgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlVUCkgeworICAgICAgICAgICAgLyogR2V0IG1lc3NhZ2UgZm9yIGtleXVwIGNvZGUgZnJvbSB0YWJsZSBvZiBjYWNoZWQgZG93biB2YWx1ZXMgKi8KKyAgICAgICAgICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2Nhbl07CisgICAgICAgICAgICBrZXlVcE1zZ1tzY2FuXSA9IDA7CisgICAgICAgICAgICBvbGRLZXlNZXNzYWdlID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSAoKHVsb25nKXNjYW4gPDwgOCkgfCBrcC5YbGF0ZWRDaGFyOworICAgICAgICAgICAgaWYgKGV2dC5tZXNzYWdlID09IGtleVVwTXNnW3NjYW5dKSB7CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlIHw9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkS2V5TWVzc2FnZSA9IGV2dC5tZXNzYWdlICYgMHgwRkZGRjsKKyAgICAgICAgICAgIGtleVVwTXNnW3NjYW5dID0gKHVzaG9ydClldnQubWVzc2FnZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgLyogQ29udmVydCBzaGlmdCBzdGF0ZSBtb2RpZmllcnMgKi8KKyAgICAgICAgIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDAwMDEpCisgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRTSElGVDsKKyAgICAgICAgIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDAwMDIpCisgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVFNISUZUOworICAgICAgICAgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDEwMCkKKyAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTDsKKyAgICAgICAgIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDAyMDApCisgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEFMVDsKKyAgICAgICAgIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDA0MDApCisgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRDVFJMOworICAgICAgICAgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDgwMCkKKyAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEFMVDsKKyAgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisKKyAgICAgICAgIC8qIEFkZCB0aW1lIHN0YW1wIGFuZCBhZGQgdGhlIGV2ZW50IHRvIHRoZSBxdWV1ZSAqLworICAgICAgICAgZXZ0LndoZW4gPSBrZXkudGltZTsKKyAgICAgICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQorICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgfQorCisgICAgLyogRG9uJ3QganVzdCBmbHVzaCBiZWNhdXNlIHRoYXQgdGVybWluYWxseSBjb25mdXNlcyB0aGUgbW9uaXRvciAqLworICAgIGRvIHsKKyAgICAgICAgS2JkQ2hhckluKCZrZXksIElPX05PV0FJVCwgMCk7CisgICAgICAgIH0gd2hpbGUgKGtleS5mYlN0YXR1cyAmIEtCRFRSRl9GSU5BTF9DSEFSX0lOKTsKKworICAgIC8qIFB1bXAgYWxsIG1vdXNlIG1lc3NhZ2VzICovCisgICAgS2JkR2V0U3RhdHVzKCZrZXlJbmZvLDApOworICAgIC8qIENoZWNrIHJldHVybiBjb2RlIC0gbW91c2UgbWF5IG5vdCBiZSBvcGVyYXRpb25hbCEhICovCisgICAgaWYgKE1vdUdldE51bVF1ZUVsKCZtcXVldWUsX0VWVF9oTW91c2UpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHdoaWxlIChtcXVldWUuY0V2ZW50cykgeworICAgICAgICAgICAgd2hpbGUgKG1xdWV1ZS5jRXZlbnRzLS0pIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKKyAgICAgICAgICAgICAgICBtV2FpdCA9IE1PVV9OT1dBSVQ7CisgICAgICAgICAgICAgICAgTW91UmVhZEV2ZW50UXVlKCZtb3VzZSwmbVdhaXQsX0VWVF9oTW91c2UpOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBtb3VzZSBwb3NpdGlvbi4gV2UgZ2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAqIGluIG1pY2tleXMgc28gd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlc2UgaW50byBwaXhlbHMgYW5kCisgICAgICAgICAgICAgICAgICogbW92ZSBvdXIgbW91c2UgcG9zaXRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIE9TLzIgZ2l2ZXMKKyAgICAgICAgICAgICAgICAgKiB1cyB0aGUgY29vcmRpbmF0ZXMgaW4gY2hhcmFjdGVyIHBvc2l0aW9ucyBzaW5jZSBpdCBzdGlsbAorICAgICAgICAgICAgICAgICAqIHRoaW5rcyB3ZSBhcmUgaW4gdGV4dCBtb2RlIQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEVWVC5teCArPSBNaWNrZXlUb1BpeGVsKG1vdXNlLmNvbCk7CisgICAgICAgICAgICAgICAgRVZULm15ICs9IE1pY2tleVRvUGl4ZWwobW91c2Uucm93KTsKKyAgICAgICAgICAgICAgICBpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoRVZULm15IDwgMCkgRVZULm15ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoRVZULm14ID4gcmFuZ2VYKSAgICBFVlQubXggPSByYW5nZVg7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teSA+IHJhbmdlWSkgICAgRVZULm15ID0gcmFuZ2VZOworICAgICAgICAgICAgICAgIGV2dC53aGVyZV94ID0gRVZULm14OworICAgICAgICAgICAgICAgIGV2dC53aGVyZV95ID0gRVZULm15OworICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gbW91c2UuY29sOworICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV95ID0gbW91c2Uucm93OworICAgICAgICAgICAgICAgIGV2dC53aGVuID0ga2V5LnRpbWU7CisgICAgICAgICAgICAgICAgaWYgKG1vdXNlLmZzICYgKE1PVVNFX0JOMV9ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4xX0RPV04pKQorICAgICAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQlVUOworICAgICAgICAgICAgICAgIGlmIChtb3VzZS5mcyAmIChNT1VTRV9CTjJfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMl9ET1dOKSkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRCVVQ7CisgICAgICAgICAgICAgICAgaWYgKG1vdXNlLmZzICYgKE1PVVNFX0JOM19ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4zX0RPV04pKQorICAgICAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7CisgICAgICAgICAgICAgICAgaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDAwMSkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRTSElGVDsKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMDAyKQorICAgICAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUU0hJRlQ7CisgICAgICAgICAgICAgICAgaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDEwMCkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVENUUkw7CisgICAgICAgICAgICAgICAgaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEFMVDsKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwNDAwKQorICAgICAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVENUUkw7CisgICAgICAgICAgICAgICAgaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDgwMCkKKyAgICAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRBTFQ7CisKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgbGVmdCBtb3VzZSBjbGljayBldmVudHMgKi8KKyAgICAgICAgICAgICAgICAvKiAweDA2ID09IChNT1VTRV9CTjFfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMV9ET1dOKSAqLworICAgICAgICAgICAgICAgIGlmICgoKG1vdXNlLmZzICYgMHgwMDA2KSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwMDYpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCEobW91c2UuZnMgJiAweDAwMDYpICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDA2KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlLmZzICYgMHgwMDA2KQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRVVQOworICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciByaWdodCBtb3VzZSBjbGljayBldmVudHMgKi8KKyAgICAgICAgICAgICAgICAvKiAweDAwMTggPT0gKE1PVVNFX0JOMl9ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4yX0RPV04pICovCisgICAgICAgICAgICAgICAgaWYgKCgobW91c2UuZnMgJiAweDAwMTgpICYmICEob2xkTW91c2VTdGF0ZSAmIDB4MDAxOCkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIShtb3VzZS5mcyAmIDB4MDAxOCkgJiYgKG9sZE1vdXNlU3RhdGUgJiAweDAwMTgpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobW91c2UuZnMgJiAweDAwMTgpCisgICAgICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFVVA7CisgICAgICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7CisgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBtaWRkbGUgbW91c2UgY2xpY2sgZXZlbnRzICovCisgICAgICAgICAgICAgICAgLyogMHgwMDYwID09IChNT1VTRV9CTjNfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOM19ET1dOKSAqLworICAgICAgICAgICAgICAgIGlmICgoKG1vdXNlLmZzICYgMHgwMDYwKSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwNjApKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCEobW91c2UuZnMgJiAweDAwNjApICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDYwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlLmZzICYgMHgwMDYwKQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRVVQOworICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgRVZULm9sZE1vdmUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIG1vdXNlIG1vdmVtZW50IGV2ZW50ICovCisgICAgICAgICAgICAgICAgaWYgKG1vdXNlLmZzICYgMHgwMDJCKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVWVC5vbGRNb3ZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94Oy8qIE1vZGlmeSBleGlzdGluZyBvbmUgICovCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeSA9IGV2dC53aGVyZV95OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IG1vdXNlIHN0YXRlICovCisgICAgICAgICAgICAgICAgb2xkTW91c2VTdGF0ZSA9IG1vdXNlLmZzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1vdUdldE51bVF1ZUVsKCZtcXVldWUsX0VWVF9oTW91c2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9JbnB1dCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAvKiBJZiB0aGVyZSB3YXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBnaXZlIHVwIHRoZSBjdXJyZW50IHRpbWVzbGljZQorICAgICAqIE5vdGU6IERvc1NsZWVwKDApIHdpbGwgZWZmZWN0aXZlbHkgZG8gbm90aGluZyBpZiBubyBvdGhlciB0aHJlYWQgaXMgcmVhZHkuIEhlbmNlCisgICAgICogRG9zU2xlZXAoMCkgd2lsbCBzdGlsbCB1c2UgMTAwJSBDUFUgX2J1dF8gc2hvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBwcm9ncmFtcy4KKyAgICAgKi8KKyAgICBpZiAobm9JbnB1dCkKKyAgICAgICAgRG9zU2xlZXAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQuIE5lZWRlZCB0byBjYXRjaCBib3RoIGtleXVwIGFuZCBrZXlkb3duIGV2ZW50cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfa2JkTW9uVGhyZWFkKAorICAgIHZvaWQgKnBhcmFtcykKK3sKKyAgICBBUElSRVQgICAgICAgcmM7CisgICAgS0VZUEFDS0VUICAgIGtwOworICAgIFVTSE9SVCAgICAgICBjb3VudCA9IHNpemVvZihLRVlQQUNLRVQpOworICAgIE1PTkJVRiAgICAgICBtb25JbmJ1ZjsKKyAgICBNT05CVUYgICAgICAgbW9uT3V0YnVmOworICAgIGludCAgICAgICAgICBrcE5ldzsKKworICAgIC8qIFJhaXNlIHRocmVhZCBwcmlvcml0eSBmb3IgaGlnaGVyIHJlc3BvbnNpdmVuZXNzICovCisgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19USU1FQ1JJVElDQUwsIDAsIDApOworICAgIG1vbkluYnVmLmNiICA9IHNpemVvZihtb25JbmJ1ZikgLSBzaXplb2YobW9uSW5idWYuY2IpOworICAgIG1vbk91dGJ1Zi5jYiA9IHNpemVvZihtb25PdXRidWYpIC0gc2l6ZW9mKG1vbk91dGJ1Zi5jYik7CisgICAgYk1vblJ1bm5pbmcgPSBGQUxTRTsKKworICAgIC8qIFJlZ2lzdGVyIHRoZSBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIG1vbml0b3JpbmcgZm9yIGN1cnJlbnQgc2Vzc2lvbiAqLworICAgIGlmIChEb3NNb25SZWcoX0VWVF9oS2JkTW9uLCAmbW9uSW5idWYsIChVTE9ORyopJm1vbk91dGJ1ZixNT05JVE9SX0VORCwgLTEpKSB7CisgICAgICAgIERvc1Bvc3RFdmVudFNlbShoZXZTdGFydCk7ICAvKiB1bmJsb2NrIHRoZSBtYWluIHRocmVhZCAqLworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIC8qIFVuYmxvY2sgdGhlIG1haW4gdGhyZWFkIGFuZCB0ZWxsIGl0IHdlJ3JlIE9LKi8KKyAgICBiTW9uUnVubmluZyA9IFRSVUU7CisgICAgRG9zUG9zdEV2ZW50U2VtKGhldlN0YXJ0KTsKKyAgICB3aGlsZSAoYk1vblJ1bm5pbmcpIHsgIC8qIFN0YXJ0IGFuIGVuZGxlc3MgbG9vcCAqLworICAgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBrZXlib2FyZCBkcml2ZXIgKi8KKyAgICAgICAgcmMgPSBEb3NNb25SZWFkKChQQllURSkmbW9uSW5idWYsIElPX1dBSVQsIChQQllURSkma3AsIChQVVNIT1JUKSZjb3VudCk7CisgICAgICAgIGlmIChyYykgeworI2lmZGVmIENIRUNLRUQKKyAgICAgICAgICAgIGlmIChiTW9uUnVubmluZykKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGluIERvc01vblJlYWQsIHJjID0gJWxkXG4iLCByYyk7CisjZW5kaWYKKyAgICAgICAgICAgIGJNb25SdW5uaW5nID0gRkFMU0U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogUGFzcyBGTFVTSCBwYWNrZXRzIGltbWVkaWF0ZWx5ICovCisgICAgICAgIGlmIChrcC5Nb25GbGFnV29yZCAmIDQpIHsKKyNpZmRlZiBDSEVDS0VECisgICAgICAgICAgICBwcmludGYoIkZsdXNoIHBhY2tldCFcbiIpOworI2VuZGlmCisgICAgICAgICAgICBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy9UT0RPOiB0byBiZSByZW1vdmVkCisgICAgICAgIC8qIFNraXAgZXh0ZW5kZWQgc2NhbmNvZGVzICYgc29tZSBvdGhlcnMgKi8KKyAgICAgICAgaWYgKCgoa3AuTW9uRmxhZ1dvcmQgPj4gOCkgPT0gMHhFMCkgfHwgKChrcC5LYmREREZsYWdXb3JkICYgMHgwRikgPT0gMHgwRikpIHsKKyAgICAgICAgICAgIERvc01vbldyaXRlKChQQllURSkmbW9uT3V0YnVmLCAoUEJZVEUpJmtwLCBjb3VudCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworLy8gICAgICBwcmludGYoIlJhd1NjYW4gPSAlWCwgWGxhdGVkU2NhbiA9ICVYLCBmYlN0YXR1cyA9ICVYLCBLYmREREZsYWdzID0gJVhcbiIsCisvLyAgICAgICAgICBrcC5Nb25GbGFnV29yZCA+PiA4LCBrcC5YbGF0ZWRTY2FuLCBrcC51LlNoaWZ0U3RhdGUsIGtwLktiZERERmxhZ1dvcmQpOworCisgICAgICAgIC8qIFByb3RlY3QgYWNjZXNzIHRvIGJ1ZmZlciB3aXRoIG11dGV4IHNlbWFwaG9yZSAqLworICAgICAgICByYyA9IERvc1JlcXVlc3RNdXRleFNlbShobXR4S2V5QnVmLCAxMDAwKTsKKyAgICAgICAgaWYgKHJjKSB7CisjaWZkZWYgQ0hFQ0tFRAorICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBnZXQgYWNjZXNzIHRvIG11dGV4LCByYyA9ICVsZFxuIiwgcmMpOworI2VuZGlmCisgICAgICAgICAgICBiTW9uUnVubmluZyA9IEZBTFNFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIFN0b3JlIHBhY2tldCBpbiBjaXJjdWxhciBidWZmZXIsIGRyb3AgaXQgaWYgaXQncyBmdWxsICovCisgICAgICAgIGtwTmV3ID0ga3BIZWFkICsgMTsKKyAgICAgICAgaWYgKGtwTmV3ID09IEtFWUJVRlNJWkUpCisgICAgICAgICAgICBrcE5ldyA9IDA7CisgICAgICAgIGlmIChrcE5ldyAhPSBrcFRhaWwpIHsKKyAgICAgICAgICAgIG1lbWNweSgma2V5TW9uUGt0c1trcEhlYWRdLCAma3AsIHNpemVvZihLRVlQQUNLRVQpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGZpeCB0aGlzIQorICAgICAgICAgICAgLyogQ29udmVydCBicmVhayB0byBtYWtlIGNvZGUgKi8KKyAgICAgICAgICAgIGtleU1vblBrdHNba3BIZWFkXS5Nb25GbGFnV29yZCAmPSAweDdGRkY7CisgICAgICAgICAgICBrcEhlYWQgPSBrcE5ldzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKGhtdHhLZXlCdWYpOworCisgICAgICAgIC8qIEZpbmFsbHkgd3JpdGUgdGhlIHBhY2tldCAqLworICAgICAgICByYyA9IERvc01vbldyaXRlKChQQllURSkmbW9uT3V0YnVmLCAoUEJZVEUpJmtwLCBjb3VudCk7CisgICAgICAgIGlmIChyYykgeworI2lmZGVmIENIRUNLRUQKKyAgICAgICAgICAgIGlmIChiTW9uUnVubmluZykKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGluIERvc01vbldyaXRlLCByYyA9ICVsZFxuIiwgcmMpOworI2VuZGlmCisgICAgICAgICAgICBiTW9uUnVubmluZyA9IEZBTFNFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgKHZvaWQpcGFyYW1zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfYWJvcnQoCisgICAgaW50IHNpZ25hbCkKK3sKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgdXNob3J0ICBzdGF0OworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBQTV9pbml0KCk7CisgICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKKyAgICBpbml0RXZlbnRRdWV1ZSgpOworICAgIG9sZE1vdXNlU3RhdGUgPSAwOworICAgIG9sZEtleU1lc3NhZ2UgPSAwOworICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOworCisgICAgLyogT3BlbiB0aGUgbW91c2UgZHJpdmVyLCBhbmQgc2V0IGl0IHVwIHRvIHJlcG9ydCBldmVudHMgaW4gbWlja2V5cyAqLworICAgIE1vdU9wZW4oTlVMTCwmX0VWVF9oTW91c2UpOworICAgIHN0YXQgPSAweDdGOworICAgIE1vdVNldEV2ZW50TWFzaygmc3RhdCxfRVZUX2hNb3VzZSk7CisgICAgc3RhdCA9IChNT1VfTk9EUkFXIHwgTU9VX01JQ0tFWVMpIDw8IDg7CisgICAgTW91U2V0RGV2U3RhdHVzKCZzdGF0LF9FVlRfaE1vdXNlKTsKKworICAgIC8qIE9wZW4gdGhlIGtleWJvYXJkIG1vbml0b3IgICovCisgICAgaWYgKERvc01vbk9wZW4oKFBTWikiS0JEJCIsICZfRVZUX2hLYmRNb24pKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBrZXlib2FyZCBtb25pdG9yISIpOworCisgICAgLyogQ3JlYXRlIGV2ZW50IHNlbWFwaG9yZSwgdGhlIG1vbml0b3Igd2lsbCBwb3N0IGl0IHdoZW4gaXQncyBpbml0YWxpemVkICovCisgICAgaWYgKERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZoZXZTdGFydCwgMCwgRkFMU0UpKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV2ZW50IHNlbWFwaG9yZSEiKTsKKworICAgIC8qIENyZWF0ZSBtdXRleCBzZW1hcGhvcmUgcHJvdGVjdGluZyB0aGUga2V5cGFja2V0IGJ1ZmZlciAqLworICAgIGlmIChEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmaG10eEtleUJ1ZiwgMCwgRkFMU0UpKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIG11dGV4IHNlbWFwaG9yZSEiKTsKKworICAgIC8qIFN0YXJ0IGtleWJvYXJkIG1vbml0b3IgdGhyZWFkLCB1c2UgMzJLIHN0YWNrICovCisgICAga2JkTW9uVElEID0gX2JlZ2ludGhyZWFkKF9rYmRNb25UaHJlYWQsIE5VTEwsIDB4ODAwMCwgTlVMTCk7CisKKyAgICAvKiBOb3cgYmxvY2sgdW50aWwgdGhlIG1vbml0b3IgdGhyZWFkIGlzIHVwIGFuZCBydW5uaW5nICovCisgICAgLyogR2l2ZSB0aGUgdGhyZWFkIG9uZSBzZWNvbmQgKi8KKyAgICBEb3NXYWl0RXZlbnRTZW0oaGV2U3RhcnQsIDEwMDApOworICAgIGlmICghYk1vblJ1bm5pbmcpIHsgIC8qIENoZWNrIHRoZSB0aHJlYWQgaXMgT0sgKi8KKyAgICAgICAgRG9zTW9uQ2xvc2UoX0VWVF9oS2JkTW9uKTsKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQgZGlkbid0IGluaXRpYWxpemUhIik7CisgICAgICAgIH0KKworICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KKyAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7CisgICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgcmFuZ2VYID0geFJlczsKKyAgICByYW5nZVkgPSB5UmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCithbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9zZXRNb3VzZVBvcyh4LHkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KK2NhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAorYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3Jlc3VtZSh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIE9TLzIKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfc3VzcGVuZCh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIE9TLzIKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0V4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9leGl0KHZvaWQpCit7CisgICAgQVBJUkVUICAgcmM7CisKKyAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLworICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKworICAgIC8qIENsb3NlIHRoZSBtb3VzZSBkcml2ZXIgKi8KKyAgICBNb3VDbG9zZShfRVZUX2hNb3VzZSk7CisKKyAgICAvKiBTdG9wIHRoZSBrZXlib2FyZCBtb25pdG9yIHRocmVhZCBhbmQgY2xvc2UgdGhlIG1vbml0b3IgKi8KKyAgICBiTW9uUnVubmluZyA9IEZBTFNFOworICAgIHJjID0gRG9zS2lsbFRocmVhZChrYmRNb25USUQpOworI2lmZGVmIENIRUNLRUQKKyAgICBpZiAocmMpCisgICAgICAgIHByaW50ZigiRG9zS2lsbFRocmVhZCBmYWlsZWQsIHJjID0gJWxkXG4iLCByYyk7CisjZW5kaWYKKyAgICByYyA9IERvc01vbkNsb3NlKF9FVlRfaEtiZE1vbik7CisjaWZkZWYgQ0hFQ0tFRAorICAgIGlmIChyYykgeworICAgICAgICBwcmludGYoIkRvc01vbkNsb3NlIGZhaWxlZCwgcmMgPSAlbGRcbiIsIHJjKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgRG9zQ2xvc2VFdmVudFNlbShoZXZTdGFydCk7CisgICAgRG9zQ2xvc2VNdXRleFNlbShobXR4S2V5QnVmKTsKKyAgICBLYmRGbHVzaEJ1ZmZlcigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjEyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvbW9uLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TLzIga2V5Ym9hcmQgbW9uaXRvciBzdHVmZi4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1vbml0b3JzIHN0dWZmICovCisKKyNkZWZpbmUgTU9OSVRPUl9ERUZBVUxUIDB4MDAwMAorI2RlZmluZSBNT05JVE9SX0JFR0lOICAgICAgICAxCisjZGVmaW5lIE1PTklUT1JfRU5EICAgICAgICAgIDIKKwordHlwZWRlZiBTSEFORExFICAgSE1PTklUT1I7Cit0eXBlZGVmIEhNT05JVE9SICpQSE1PTklUT1I7CisKK3R5cGVkZWYgc3RydWN0IF9LRVlQQUNLRVQgeworICBVU0hPUlQgIE1vbkZsYWdXb3JkOworICBVQ0hBUiAgIFhsYXRlZENoYXI7CisgIFVDSEFSICAgWGxhdGVkU2NhbjsKKyAgVUNIQVIgICBEQkNTU3RhdHVzOworICBVQ0hBUiAgIERCQ1NTaGlmdDsKKworICB1bmlvbgorICB7CisgICAgVVNIT1JUICBTaGlmdFN0YXRlOworICAgIFVTSE9SVCAgTGF5ZXJJbmRleDsKKyAgfSB1OworCisgIFVMT05HICAgTWlsbGlzZWNvbmRzOworICBVU0hPUlQgIEtiZERERmxhZ1dvcmQ7Cit9IEtFWVBBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTlBBQ0tFVCB7CisgIFVTSE9SVCAgTW9uRmxhZ1dvcmQ7CisgIFVTSE9SVCAgSU9DVEw7CisgIFVTSE9SVCAgQ1BJZDsKKyAgVVNIT1JUICBDUEluZGV4OworICBVTE9ORyAgIFJlc2VydmVkOworICBVU0hPUlQgIEtiZERERmxhZ1dvcmQ7Cit9IE1MTlBBQ0tFVDsKKworLy8gREJDU1N0YXR1cworCisjZGVmaW5lIFNGX1NISUZUUyAgICAgICAgICAgICAgMSAgLy8gSWYgc2V0IHRvIDEsIHNoaWZ0IHN0YXR1cyByZXR1cm5lZCB3aXRob3V0IGEgY2hhcmFjdGVyCisjZGVmaW5lIFNGX05PVENIQVIgICAgICAgICAgICAgMiAgLy8gMCAtIFNjYW4gY29kZSBpcyBhIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBTY2FuIGNvZGUgaXMgbm90IGEgY2hhcmFjdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIGl0IGlzIGFuIGV4dGVuZGVkIGtleSBjb2RlIGZyb20gdGhlIGtleWJvYXJkLgorI2RlZmluZSBTRl9JTU1FRElBVEUgICAgICAgICAgMzIgIC8vIElmIHNldCB0byAxLCBpbW1lZGlhdGUgY29udmVyc2lvbiByZXF1ZXN0ZWQKKyNkZWZpbmUgU0ZfVFlQRU1BU0sgICAgICAgICAgMTkyICAvLyBIYXMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAgLSBVbmRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMSAtIEZpbmFsIGNoYXJhY3RlcjsgaW50ZXJpbSBjaGFyYWN0ZXIgZmxhZyBpcyB0dXJuZWQgb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAgLSBJbnRlcmltIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExIC0gRmluYWwgY2hhcmFjdGVyOyBpbnRlcmltIGNoYXJhY3RlciBmbGFnIGlzIHR1cm5lZCBvbi4KKy8vIE1vbkZsYWdXb3JkCisKKyNkZWZpbmUgTUZfT1BFTiAgICAgICAgICAgICAgICAxICAvLyBvcGVuCisjZGVmaW5lIE1GX0NMT1NFICAgICAgICAgICAgICAgMiAgLy8gY2xvc2UKKyNkZWZpbmUgTUZfRkxVU0ggICAgICAgICAgICAgICA0ICAvLyBpcyBmbHVzaCBwYWNrZXQKKworLy8gS2JkRERGbGFnV29yZAorCisjZGVmaW5lIEtGX05PVFNRUEFDS0VUICAgICAgMTAyNCAgLy8gRG9uJ3QgcHV0IHRoaXMgcGFja2V0IGluIFNRIGJ1ZmZlcgorI2RlZmluZSBLRl9BQ0NFTlRFREtFWSAgICAgICA1MTIgIC8vIEtleSB3YXMgdHJhbnNsYXRlZCB1c2luZyBwcmV2aW91cyBhY2NlbnQuCisjZGVmaW5lIEtGX01VTFRJTUFLRSAgICAgICAgIDI1NiAgLy8gS2V5IHdhcyByZXBlYXRlZCBtYWtlIG9mIGEgdG9nZ2xlIGtleS4KKyNkZWZpbmUgS0ZfU0VDT05EQVJZS0VZICAgICAgMTI4ICAvLyBQcmV2aW91cyBzY2FuIGNvZGUgd2FzIHRoZSBFMCBwcmVmaXggY29kZS4KKyNkZWZpbmUgS0ZfS0VZQlJFQUsgICAgICAgICAgIDY0ICAvLyBUaGlzIGlzIHRoZSBicmVhayBvZiB0aGUga2V5LgorI2RlZmluZSBLRl9LRVlUWVBFTUFTSyAgICAgICAgNjMgIC8vIElzb2xhdGVzIHRoZSBLZXkgVHlwZSBmaWVsZCBvZiBEREZsYWdzLgorI2RlZmluZSBLRl9VTkRFRktFWSAgICAgICAgICAgNjMgIC8vIEtleSBwYWNrZXQgaXMgdW5kZWZpbmVkCisjZGVmaW5lIEtGX1NZU1JFUUtFWSAgICAgICAgICAyMyAgLy8gVGhpcyBrZXkgcGFja2V0IGlzIHRoZSBTeXNSZXEga2V5ICg0OTkwKQorI2RlZmluZSBLRl9QUklOVEZMVVNIS0VZICAgICAgMjIgIC8vIFRoaXMgcGFja2V0IGlzIEN0LUFsdC1QcnRTY3IKKyNkZWZpbmUgS0ZfUFNQUklOVEVDSE9LRVkgICAgIDIxICAvLyBUaGlzIHBhY2tldCBpcyBDdGwtUAorI2RlZmluZSBLRl9QUklOVEVDSE9LRVkgICAgICAgMjAgIC8vIFRoaXMgcGFja2V0IGlzIEN0bC1QcnRTY3IKKyNkZWZpbmUgS0ZfUFJUU0NSS0VZICAgICAgICAgIDE5ICAvLyBUaGlzIHBhY2tldCBpcyBQcnRTY3IKKyNkZWZpbmUgS0ZfUFNCUkVBS0tFWSAgICAgICAgIDE4ICAvLyBUaGlzIHBhY2tldCBpcyBDdGwtQworI2RlZmluZSBLRl9CUkVBS0tFWSAgICAgICAgICAgMTcgIC8vIFRoaXMgcGFja2V0IGlzIEN0bC1CcmVhaworI2RlZmluZSBLRl9BQ0NFTlRLRVkgICAgICAgICAgMTYgIC8vIFRoaXMgcGFja2V0IGlzIGFuIGFjY2VudCBrZXkKKyNkZWZpbmUgS0ZfWFJPUlBOT1QgICAgICAgICAgIDEzICAvLyBUaGlzIHBhY2tldCBpcyBhIFJlYWQgb3IgUGVlayBOb3RpZmljYXRpb24gUGN0LgorI2RlZmluZSBLRl9NTE5PVElGSUNBVElPTiAgICAgMTQgIC8vIHBhY2tldCBpcyBhIE11bHRpLUxheWVyIE5MUyBwYWNrZXQKKyNkZWZpbmUgS0ZfSE9US0VZUEFDS0VUICAgICAgIDEyICAvLyBUaGlzIHBhY2tldCBpcyB0aGUgaG90IGtleS4KKyNkZWZpbmUgS0ZfQkFES0VZQ09NQk8gICAgICAgIDExICAvLyBBY2NlbnQvY2hhciBjb21ibyB1bmRlZmluZWQsIGJlZXAgb25seS4KKyNkZWZpbmUgS0ZfV0FLRVVQS0VZICAgICAgICAgIDEwICAvLyBUaGlzIHBhY2tldCBpcyBvbmUgZm9sbG93aW5nIFBBVVNFS0VZCisjZGVmaW5lIEtGX1BTUEFVU0VLRVkgICAgICAgICAgOSAgLy8gVGhpcyBwYWNrZXQgaXMgQ3RsLVMKKyNkZWZpbmUgS0ZfUEFVU0VLRVkgICAgICAgICAgICA4ICAvLyBUaGlzIHBhY2tldCBpcyBDdGwtTnVtbG9jayBvciBQQVVTRQorI2RlZmluZSBLRl9TSElGVE1BU0sgICAgICAgICAgIDcgIC8vIEtleSBpcyBhIHNoaWZ0IEtleQorI2RlZmluZSBLRl9EVU1QS0VZICAgICAgICAgICAgIDYgIC8vIFRoaXMgcGFja2V0IGlzIEN0bC1OdW1sb2NrLU51bUxvY2sKKyNkZWZpbmUgS0ZfUkVCT09US0VZICAgICAgICAgICA1ICAvLyBUaGlzIHBhY2tldCBpcyBDdGwtQWx0LURlbAorI2RlZmluZSBLRl9SRVNFTkRDT0RFICAgICAgICAgIDQgIC8vIFRoaXMgcGFja2V0IGlzIHJlc2VuZCBjb2RlIGZyb20gY29udHJvbGxlcgorI2RlZmluZSBLRl9PVkVSUlVOQ09ERSAgICAgICAgIDMgIC8vIFRoaXMgcGFja2V0IGlzIG92ZXJydW4gY29kZSBmcm9tIGNvbnRyb2xsZXIKKyNkZWZpbmUgS0ZfU0VDUFJFRklYQ09ERSAgICAgICAyICAvLyBUaGlzIHBhY2tldCBpcyBFMC9FMSBzY2FuIGNvZGUKKyNkZWZpbmUgS0ZfQUNLQ09ERSAgICAgICAgICAgICAxICAvLyBUaGlzIHBhY2tldCBpcyBhY2sgY29kZSBmcm9tIGtleWJvYXJkCisKKwordHlwZWRlZiBzdHJ1Y3QgX01PTkJVRiB7CisgIFVTSE9SVCAgICBjYjsKKyAgS0VZUEFDS0VUIEJ1ZmZlcjsKKyAgQllURSAgICAgIFJlc2VydmVkWzIwXTsKK30gTU9OQlVGOworCisjZGVmaW5lIFJTX1NZU1JFRyAgICAgIDMyNzY4ICAvLyBCaXQgMTUgIFN5c1JlcSBrZXkgZG93bgorI2RlZmluZSBSU19DQVBTTE9DSyAgICAxNjM4NCAgLy8gQml0IDE0ICBDYXBzIExvY2sga2V5IGRvd24KKyNkZWZpbmUgUlNfTlVNTE9DSyAgICAgIDgxOTIgIC8vIEJpdCAxMyAgTnVtTG9jayBrZXkgZG93bgorI2RlZmluZSBSU19TQ1JPTExMT0NLICAgNDA5NiAgLy8gQml0IDEyICBTY3JvbGwgTG9jayBrZXkgZG93bgorI2RlZmluZSBSU19SQUxUICAgICAgICAgMjA0OCAgLy8gQml0IDExICBSaWdodCBBbHQga2V5IGRvd24KKyNkZWZpbmUgUlNfUkNPTlRST0wgICAgIDEwMjQgIC8vIEJpdCAxMCAgUmlnaHQgQ3RybCBrZXkgZG93bgorI2RlZmluZSBSU19MQUxUICAgICAgICAgIDUxMiAgLy8gQml0ICA5ICBMZWZ0IEFsdCBrZXkgZG93bgorI2RlZmluZSBSU19MQ09OVFJPTCAgICAgIDI1NiAgLy8gQml0ICA4ICBMZWZ0IEN0cmwga2V5IGRvd24KKyNkZWZpbmUgUlNfSU5TRVJUICAgICAgICAxMjggIC8vIEJpdCAgNyAgSW5zZXJ0IG9uCisjZGVmaW5lIFJTX0NBUFMgICAgICAgICAgIDY0ICAvLyBCaXQgIDYgIENhcHMgTG9jayBvbgorI2RlZmluZSBSU19OVU0gICAgICAgICAgICAzMiAgLy8gQml0ICA1ICBOdW1Mb2NrIG9uCisjZGVmaW5lIFJTX1NDUk9MTCAgICAgICAgIDE2ICAvLyBCaXQgIDQgIFNjcm9sbCBMb2NrIG9uCisjZGVmaW5lIFJTX0FMVCAgICAgICAgICAgICA4ICAvLyBCaXQgIDMgIEVpdGhlciBBbHQga2V5IGRvd24KKyNkZWZpbmUgUlNfQ09OVFJPTCAgICAgICAgIDQgIC8vIEJpdCAgMiAgRWl0aGVyIEN0cmwga2V5IGRvd24KKyNkZWZpbmUgUlNfTFNISUZUICAgICAgICAgIDIgIC8vIEJpdCAgMSAgTGVmdCBTaGlmdCBrZXkgZG93bgorI2RlZmluZSBSU19SU0hJRlQgICAgICAgICAgMSAgLy8gQml0ICAwICBSaWdodCBTaGlmdCBrZXkgZG93bgorCisKKyNkZWZpbmUgQ1NfUkNPTlRST0wgICAgIDkxICAgIC8vIFJpZ2h0IENvbnRyb2wKKyNkZWZpbmUgQ1NfTFNISUZUICAgICAgIDQyICAgIC8vIExlZnQgU2hpZnQKKyNkZWZpbmUgQ1NfUlNISUZUICAgICAgIDU0ICAgIC8vIFJpZ2h0IFNoaWZ0CisjZGVmaW5lIENTX0xBTFQgICAgICAgICA1NiAgICAvLyBMZWZ0IEFsdAorI2RlZmluZSBDU19SQUxUICAgICAgICAgOTQgICAgLy8gUmlnaHQgQWx0CisKKworLyogRG9zTW9uKiBwcm90b3R5cGVzICovCisjaWZkZWYgX19FTVhfXworICAgICNkZWZpbmUgIEFQSVJFVDE2ICAgICAgICBVU0hPUlQKKyAgICAjZGVmaW5lICBBUElFTlRSWTE2CisjZWxzZQorICAgICNkZWZpbmUgIERvc01vbk9wZW4gICAgICBET1MxNk1PTk9QRU4KKyAgICAjZGVmaW5lICBEb3NNb25DbG9zZSAgICAgRE9TMTZNT05DTE9TRQorICAgICNkZWZpbmUgIERvc01vblJlZyAgICAgICBET1MxNk1PTlJFRworICAgICNkZWZpbmUgIERvc01vblJlYWQgICAgICBET1MxNk1PTlJFQUQKKyAgICAjZGVmaW5lICBEb3NNb25Xcml0ZSAgICAgRE9TMTZNT05XUklURQorICAgICNkZWZpbmUgIERvc0dldEluZm9TZWcgICBET1MxNkdFVElORk9TRUcKKyNlbmRpZgorCitBUElSRVQxNiBBUElFTlRSWTE2IERvc01vbk9wZW4gICAoUFNaIHBzekRldk5hbWUsIFBITU9OSVRPUiBwaG1vbik7CitBUElSRVQxNiBBUElFTlRSWTE2IERvc01vbkNsb3NlICAoSE1PTklUT1IgaG1vbik7CitBUElSRVQxNiBBUElFTlRSWTE2IERvc01vblJlZyAgICAoSE1PTklUT1IgaG1vbiwgTU9OQlVGICpwYkluQnVmLCAvKk1PTkJVRiovVUxPTkcgKnBiT3V0QnVmLCBVU0hPUlQgZlBvc2l0aW9uLCBVU0hPUlQgdXNJbmRleCk7CitBUElSRVQxNiBBUElFTlRSWTE2IERvc01vblJlYWQgICAoUEJZVEUgcGJJbkJ1ZiwgVVNIT1JUIGZXYWl0LCBQQllURSBwYkRhdGFCdWYsIFBVU0hPUlQgcGNiRGF0YSk7CitBUElSRVQxNiBBUElFTlRSWTE2IERvc01vbldyaXRlICAoUEJZVEUgcGJPdXRCdWYsIFBCWVRFIHBiRGF0YUJ1ZiwgVVNIT1JUIGNiRGF0YSk7CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWY5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaApAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgorKgorKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOQ0xfRE9TUFJPRklMRQorI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX1NVQgorI2RlZmluZSBJTkNMX1ZJTworI2RlZmluZSBJTkNMX0tCRAorI2luY2x1ZGUgPG9zMi5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNpbmNsdWRlICJvczIvbW9uLmgiCisKK3ZvaWQgX19QTV9jaGVja0NvbnNvbGVTd2l0Y2godm9pZCk7CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyNTEwMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jCkBAIC0wLDAgKzEsMjAwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIKKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgInBtX2hlbHAuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaWZuZGVmIF9fRU1YX18KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX1NVQgorI2RlZmluZSBJTkNMX1ZJTworI2RlZmluZSBJTkNMX0tCRAorI2luY2x1ZGUgPG9zMi5oPgorCisvKiBTZW1hcGhvcmUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBvdXIgYmFja2dyb3VuZCBkYWVtb24gKi8KKyNkZWZpbmUgU0hBUkVEU0VNICAgKChQU1opIlxcU0VNMzJcXFNERFxcREFFTU9OIikKKyNkZWZpbmUgREFFTU9OX05BTUUgIlNERERBRU1OLkVYRSIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHVibGljIHN0cnVjdHVyZXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIFZJREVPUE1JIGZvciBpbXBsZW1lbnRpbmcKKyAqIHRoZSBhYmlsaXR5IHRvIGNhbGwgdGhlIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfVklERU9NT0RFSU5GTyB7CisgICAgVUxPTkcgICBtaU1vZGVJZDsKKyAgICBVU0hPUlQgIHVzVHlwZTsKKyAgICBVU0hPUlQgIHVzSW50MTBNb2RlU2V0OworICAgIFVTSE9SVCAgdXNYUmVzb2x1dGlvbjsKKyAgICBVU0hPUlQgIHVzWVJlc29sdXRpb247CisgICAgVUxPTkcgICB1bEJ1ZmZlckFkZHJlc3M7CisgICAgVUxPTkcgICB1bEFwZXJ0dXJlU2l6ZTsKKyAgICBCWVRFICAgIGJCaXRzUGVyUGl4ZWw7CisgICAgQllURSAgICBiQml0UGxhbmVzOworICAgIEJZVEUgICAgYlhDaGFyU2l6ZTsKKyAgICBCWVRFICAgIGJZQ2hhclNpemU7CisgICAgVVNIT1JUICB1c0J5dGVzUGVyU2NhbkxpbmU7CisgICAgVVNIT1JUICB1c1RleHRSb3dzOworICAgIFVMT05HICAgdWxQYWdlTGVuZ3RoOworICAgIFVMT05HICAgdWxTYXZlU2l6ZTsKKyAgICBCWVRFICAgIGJWcnRSZWZyZXNoOworICAgIEJZVEUgICAgYkhydFJlZnJlc2g7CisgICAgQllURSAgICBiVnJ0UG9sUG9zOworICAgIEJZVEUgICAgYkhydFBvbFBvczsKKyAgICBDSEFSICAgIGJSZWRNYXNrU2l6ZTsKKyAgICBDSEFSICAgIGJSZWRGaWVsZFBvc2l0aW9uOworICAgIENIQVIgICAgYkdyZWVuTWFza1NpemU7CisgICAgQ0hBUiAgICBiR3JlZW5GaWVsZFBvc2l0aW9uOworICAgIENIQVIgICAgYkJsdWVNYXNrU2l6ZTsKKyAgICBDSEFSICAgIGJCbHVlRmllbGRQb3NpdGlvbjsKKyAgICBDSEFSICAgIGJSc3ZkTWFza1NpemU7CisgICAgQ0hBUiAgICBiUnN2ZEZpZWxkUG9zaXRpb247CisgICAgVUxPTkcgICB1bENvbG9yczsKKyAgICBVTE9ORyAgIHVsUmVzZXJ2ZWRbM107CisgICAgfSBWSURFT01PREVJTkZPLCBGQVIgKlBWSURFT01PREVJTkZPOworCit0eXBlZGVmIHN0cnVjdCBfQURBUFRFUklORk8geworICAgIFVMT05HICAgICAgIHVsQWRhcHRlcklEOworICAgIENIQVIgICAgICAgIHN6T0VNU3RyaW5nWzEyOF07CisgICAgQ0hBUiAgICAgICAgc3pEQUNTdHJpbmdbMTI4XTsKKyAgICBDSEFSICAgICAgICBzelJldmlzaW9uWzEyOF07CisgICAgVUxPTkcgICAgICAgdWxUb3RhbE1lbW9yeTsKKyAgICBVTE9ORyAgICAgICB1bE1NSU9CYXNlQWRkcmVzczsKKyAgICBVTE9ORyAgICAgICB1bFBJT0Jhc2VBZGRyZXNzOworICAgIEJZVEUgICAgICAgIGJCdXNUeXBlOworICAgIEJZVEUgICAgICAgIGJFbmRpYW47CisgICAgVVNIT1JUICAgICAgdXNEZXZpY2VCdXNJRDsKKyAgICBVU0hPUlQgICAgICB1c1ZlbmRvckJ1c0lEOworICAgIFVTSE9SVCAgICAgIFNsb3RJRDsKKyAgICB9IEFEQVBURVJJTkZPLCBGQVIgKlBBREFQVEVSSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX1ZJREVPX0FEQVBURVIgeworICAgIHZvaWQgICAgICAgICAgICAqaHZpZGVvOworICAgIEFEQVBURVJJTkZPICAgICBBZGFwdGVyOworICAgIFZJREVPTU9ERUlORk8gICBNb2RlSW5mbzsKKyAgICB9IFZJREVPX0FEQVBURVIsIEZBUiAqUFZJREVPX0FEQVBURVI7CisKKy8qIFBNSVJFUVVFU1RfU09GVFdBUkVJTlQgc3RydWN0dXJlcyBmcm9tIE9TLzIgRERLICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVTE9ORyB1bEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZETSBpbml0aWFsaXphdGlvbiB0eXBlCisjZGVmaW5lIFZETV9QT1NUTE9BRCAgICAgICAgICAgICAgICAgICAgMHgxICAgICAvLyBhZGFwdGVyIGp1c3QgbG9hZGVkLCB1c2VkIGludGVybmFsbHkgZm9yIGluaXRpYWxpemF0aW9uCisjZGVmaW5lIFZETV9JTklUSUFMSVpFICAgICAgICAgICAgICAgICAgMHgyICAgICAvLyBmb3JjZSBpbml0aWFsaXphdGlvbiBvZiBhIHBlcm1hbmVudGx5IG9wZW4gVkRNLCBldmVuIGlmIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQKKyNkZWZpbmUgVkRNX1RFUk1JTkFURV9QT1NUSU5JVElBTElaRSAgICAweDYgICAgIC8vc3RhcnQgVkRNIHdpdGggaW5pdGlhbGl6YXRpb24sIGJ1dCBjbG9zZSBpdCBhZnRlcndhcmRzIChpbmNsdWRlcyBWRE1fSU5JVElBTElaRSkKKyNkZWZpbmUgVkRNX1FVRVJZX0NBUEFCSUxJVFkgICAgICAgICAgICAweDEwICAgIC8vIHF1ZXJ5IHRoZSBjdXJyZW50IGludCAxMCBjYXBhYmlsaXR5CisjZGVmaW5lIFZETV9GVUxMX1ZETV9DUkVBVEVEICAgICAgICAgICAgMHgyMCAgICAvLyBhIGZ1bGwgVkRNIGlzIGNyZWF0ZWQKKyNkZWZpbmUgVkRNX01JTklfVkRNX0NSRUFURUQgICAgICAgICAgICAweDQwICAgIC8vIGEgbWluaSBWRE0gaXMgY3JlYXRlZAorI2RlZmluZSBWRE1fTUlOSV9WRE1fU1VQUE9SVEVEICAgICAgICAgIDB4ODAgICAgLy8gbWluaSBWRE0gc3VwcG9ydCBpcyBhdmFpbGFibGUKKyAgICBQQ0hBUiBzek5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZETSBpbml0aWFsaXphdGlvbiBwcm9ncmFtCisgICAgUENIQVIgc3pBcmdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWRE0gaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzCisgICAgfUlOSVRWRE07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIGJCdWZmZXJUeXBlOworI2RlZmluZSBCVUZGRVJfTk9ORSAgICAgMAorI2RlZmluZSBJTlBVVF9CVUZGRVIgICAgMQorI2RlZmluZSBPVVRQVVRfQlVGRkVSICAgMgorICAgIEJZVEUgYlJlc2VydmVkOworICAgIEJZVEUgYlNlbENSRjsKKyAgICBCWVRFIGJPZmZDUkY7CisgICAgUFZPSUQgcEFkZHJlc3M7CisgICAgVUxPTkcgdWxTaXplOworICAgIH0gQlVGRkVSLCAqUEJVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgdmNyZl9zIHsKKyAgICBVTE9ORyByZWdfZWF4OworICAgIFVMT05HIHJlZ19lYng7CisgICAgVUxPTkcgcmVnX2VjeDsKKyAgICBVTE9ORyByZWdfZWR4OworICAgIFVMT05HIHJlZ19lYnA7CisgICAgVUxPTkcgcmVnX2VzaTsKKyAgICBVTE9ORyByZWdfZWRpOworICAgIFVMT05HIHJlZ19kczsKKyAgICBVTE9ORyByZWdfZXM7CisgICAgVUxPTkcgcmVnX2ZzOworICAgIFVMT05HIHJlZ19nczsKKyAgICBVTE9ORyByZWdfY3M7CisgICAgVUxPTkcgcmVnX2VpcDsKKyAgICBVTE9ORyByZWdfZWZsYWc7CisgICAgVUxPTkcgcmVnX3NzOworICAgIFVMT05HIHJlZ19lc3A7CisgICAgfSBWQ1JGOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUxPTkcgICB1bEJJT1NJbnRObzsKKyAgICBWQ1JGICAgIGFDUkY7CisgICAgQlVGRkVSICBwQlsyXTsKKyAgICB9IElOVENSRjsKKworI2RlZmluZSBQTUlSRVFVRVNUX0xPQURQTUlGSUxFICAgICAgICAgIDIxCisjZGVmaW5lIFBNSVJFUVVFU1RfSURFTlRJRllBREFQVEVSICAgICAgMjIKKyNkZWZpbmUgUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCAgICAgICAgICAyMworCisjaWZkZWYgIFBUUl9ERUNMX0lOX0ZST05UCisjZGVmaW5lIEVYUEVOVFJZUCAgICogRVhQRU5UUlkKKyNlbHNlCisjZGVmaW5lIEVYUEVOVFJZUCAgIEVYUEVOVFJZICoKKyNlbmRpZgorCisvKiBFbnRyeSBwb2ludCB0byBWSURFT1BNSTMyUmVxdWVzdC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBleHRlcm5hbAorICogY29kZSB0aGF0IGhhcyBhbHJlYWR5IGxvYWRlZCBWSURFT1BNSSB0byBhdm9pZCBsb2FkaW5nIGl0IHR3aWNlLgorICovCisKK0FQSVJFVCAoRVhQRU5UUllQIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KShQVklERU9fQURBUFRFUiwgVUxPTkcsIFBWT0lELCBQVk9JRCkgPSBOVUxMOworc3RhdGljIGlib29sICAgICAgICBoYXZlSW50MTAgPSAtMTsgLyogVHJ1ZSBpZiB3ZSBoYXZlIEludCAxMCBzdXBwb3J0ICAgKi8KK3N0YXRpYyBpYm9vbCAgICAgICAgdXNlVlBNSSA9IHRydWU7IC8qIEZhbHNlIGlmIFZJREVPUE1JIHVuYXZhaWxhYmxlICAgICovCitzdGF0aWMgVklERU9fQURBUFRFUiBBZGFwdGVyOyAgICAgICAvKiBWaWRlbyBhZGFwdGVyIGZvciBWSURFT1BNSSAgICAgICAqLworc3RhdGljIHVjaGFyICAgICAgICBSTUJ1ZlsxMDI0XTsgICAgLyogRmFrZSByZWFsIG1vZGUgdHJhbnNmZXIgYnVmZmVyICAgKi8KK3N0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0Oy8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICovCitzdGF0aWMgdm9pZCAgICAgICAgICpWRVNBQnVmX3B0ciA9IE5VTEw7LyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAqLworc3RhdGljIHVpbnQgICAgICAgICBWRVNBQnVmX3JzZWc7ICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KK3N0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9yb2ZmOyAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCitzdGF0aWMgdWNoYXIgKiAgICAgIGxvd01lbSA9IE5VTEw7CitzdGF0aWMgaWJvb2wgICAgICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IGZhbHNlOworc3RhdGljIHVsb25nICAgICAgICBwYXJtc0luWzRdOyAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KK3N0YXRpYyB1bG9uZyAgICAgICAgcGFybXNPdXRbNF07ICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCitleHRlcm4gdXNob3J0ICAgICAgIF9QTV9nZHQ7CitzdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7CisKKy8qIERvc1N5c0N0bCBwcm90b3R5cGUuIEl0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgaGVhZGVycyBidXQgaXQgaXMgaW4gdGhlCisgKiBzdGFuZGFyZCBpbXBvcnQgbGlicmFyaWVzIChET1NDQUxMUy44NzYpLiBGdW5ueS4KKyAqLworQVBJUkVUIEFQSUVOVFJZIERvc1N5c0N0bChVTE9ORyB1bEZ1bmN0aW9uLCBQVk9JRCBwdkRhdGEpOworCisvKiBUaGlzIGlzIHRoZSBzdGFjayBzaXplIGZvciB0aGUgdGhyZWFkcyB0aGF0IHRyYWNrIHRoZSBzZXNzaW9uIHN3aXRjaCBldmVudCAqLworI2RlZmluZSBTRVNTSU9OX1NXSVRDSF9TVEFDS19TSVpFICAgMzI3NjgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZJT01PREVJTkZPICAgICB2bWk7CisgICAgVVNIT1JUICAgICAgICAgIEN1cnNvclg7CisgICAgVVNIT1JUICAgICAgICAgIEN1cnNvclk7CisgICAgVUNIQVIgICAgICAgICAgIEZyYW1lQnVmZmVyWzFdOworICAgIH0gQ09OU09MRV9TQVZFOworCit0eXBlZGVmIHN0cnVjdCBfU0VTV0lUQ0hSRUMgeworICAgIC8qIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdm9sYXRpbGUgYmVjYXVzZSBvZiBQTV9TVVNQRU5EX0FQUCAgICAgICAgICovCisgICAgdm9sYXRpbGUgaW50ICAgIEZsYWdzOyAgICAgICAgICAvKiAtMSBvciBQTV9ERUFDVElWQVRFIG9yIFBNX1JFQUNUSVZBVEUgKi8KKyAgICBQTV9zYXZlU3RhdGVfY2IgQ2FsbGJhY2s7ICAgICAgIC8qIFNhdmUvcmVzdG9yZSBjb250ZXh0IGNhbGxiYWNrICAgICAgICAqLworICAgIEhNVFggICAgICAgICAgICBNdXRleDsgICAgICAgICAgLyogRXhjbHVzaXZlIGFjY2VzcyBtdXRleCAgICAgICAgICAgICAgICovCisgICAgSEVWICAgICAgICAgICAgIEV2ZW50OyAgICAgICAgICAvKiBQb3N0ZWQgYWZ0ZXIgY2FsbGJhY2sgaXMgY2FsbGVkICAgICAgKi8KKyAgICB9IFNFU1dJVENIUkVDOworCisvLyBQYWdlIHNpemVkIGJsb2NrIGNhY2hlCisKKyNkZWZpbmUgUEFHRVNfUEVSX0JMT0NLICAgICAzMgorI2RlZmluZSBQQUdFX0JMT0NLX1NJWkUgICAgIChQQUdFU19QRVJfQkxPQ0sgKiBQTV9QQUdFX1NJWkUgKyAoUE1fUEFHRV9TSVpFLTEpICsgc2l6ZW9mKHBhZ2VibG9jaykpCisjZGVmaW5lIEZSRUVMSVNUX05FWFQocCkgICAgKCoodm9pZCoqKShwKSkKK3R5cGVkZWYgc3RydWN0IHBhZ2VibG9jayB7CisgICAgc3RydWN0IHBhZ2VibG9jayAgICAqbmV4dDsKKyAgICBzdHJ1Y3QgcGFnZWJsb2NrICAgICpwcmV2OworICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0U3RhcnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqZnJlZUxpc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqZnJlZUxpc3RFbmQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBmcmVlQ291bnQ7CisgICAgUE1fbG9ja0hhbmRsZSAgICAgICBsb2NrSGFuZGxlOworICAgIH0gcGFnZWJsb2NrOworCitzdGF0aWMgcGFnZWJsb2NrICAgICpwYWdlQmxvY2tzID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitmdW5jICAgICAgICAtIEhlbHBlciBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9uIHRvIGNhbGwKKworUkVUVVJOUzoKK0ZpcnN0IHJldHVybiB2YWx1ZSBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyIGluIHBhcm1zT3V0WzBdCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBvcGVuIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciwgY2FsbCBpdCBhbmQgY2xvc2UgdGhlIGZpbGUKK2hhbmRsZS4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gb3BlbiB0aGUgZGV2aWNlIGRyaXZlciBmb3IgZXZlcnkgY2FsbCBiZWNhdXNlCitvZiB0d28gcHJvYmxlbXM6CisKKyAxLiBXZSBjYW5ub3Qgb3BlbiBhIHNpbmdsZSBmaWxlIGhhbmRsZSBpbiBhIERMTCB0aGF0IGlzIHNoYXJlZCBhbW9uZ3N0CisgICAgcHJvZ3JhbXMsIHNpbmNlIGV2ZXJ5IHByb2Nlc3MgbXVzdCBoYXZlIGl0J3Mgb3duIG9wZW4gZmlsZSBoYW5kbGUuCisKKyAyLiBGb3Igc29tZSByZWFzb24gdGhlcmUgYXBwZWFycyB0byBiZSBhIGxpbWl0IG9mIGFib3V0IDEyIG9wZW4gZmlsZQorICAgIGhhbmRsZXMgb24gYSBkZXZpY2UgZHJpdmVyIGluIHRoZSBzeXN0ZW0uIEhlbmNlIHdoZW4gd2Ugb3BlbiBtb3JlCisgICAgdGhhbiBhYm91dCAxMiBmaWxlIGhhbmRsZXMgdGhpbmdzIHN0YXJ0IHRvIGdvIHZlcnkgc3RyYW5nZS4KKworSGVuY2Ugd2Ugc2ltcGx5IG9wZW4gdGhlIGZpbGUgaGFuZGxlIGV2ZXJ5IHRpbWUgdGhhdCB3ZSBuZWVkIHRvIGNhbGwgdGhlCitkZXZpY2UgZHJpdmVyIHRvIHdvcmsgYXJvdW5kIHRoZXNlIHByb2JsZW1zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBDYWxsU0RESGVscCgKKyAgICBpbnQgZnVuYykKK3sKKyAgICBzdGF0aWMgdWxvbmcgICAgaW5MZW47ICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCisgICAgc3RhdGljIHVsb25nICAgIG91dExlbjsgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLworICAgIEhGSUxFICAgICAgICAgICBoU0RESGVscDsKKyAgICBVTE9ORyAgICAgICAgICAgcmM7CisgICAgdWxvbmcgICAgICAgICAgIHJlc3VsdDsKKworICAgIGlmICgocmMgPSBEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0LDAsMCwKKyAgICAgICAgICAgIEZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKKyAgICAgICAgICAgIE5VTEwpKSAhPSAwKSB7CisgICAgICAgIGlmIChyYyA9PSA0KSB7ICAvKiBEaWQgd2UgcnVuIG91dCBvZiBmaWxlIGhhbmRsZXM/ICovCisgICAgICAgICAgICBVTE9ORyAgIHVsTmV3RkhzOworICAgICAgICAgICAgTE9ORyAgICBsQWRkRkhzID0gNTsKKworICAgICAgICAgICAgaWYgKERvc1NldFJlbE1heEZIKCZsQWRkRkhzLCAmdWxOZXdGSHMpICE9IDApCisgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiRmFpbGVkIHRvIHJhaXNlIHRoZSBmaWxlIGhhbmRsZXMgbGltaXQhIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJjID0gRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEgKCMyKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEiKTsKKyAgICAgICAgfQorICAgIGlmIChEb3NEZXZJT0N0bChoU0RESGVscCxQTUhFTFBfSU9DVEwsZnVuYywKKyAgICAgICAgICAgICZwYXJtc0luLCBpbkxlbiA9IHNpemVvZihwYXJtc0luKSwgJmluTGVuLAorICAgICAgICAgICAgJnBhcm1zT3V0LCBvdXRMZW4gPSBzaXplb2YocGFybXNPdXQpLCAmb3V0TGVuKSAhPSAwKQorICAgICAgICBQTV9mYXRhbEVycm9yKCJGYWlsdXJlIGNhbGxpbmcgU0RESEVMUCQgaGVscGVyIGRldmljZSBkcml2ZXIhIik7CisgICAgRG9zQ2xvc2UoaFNEREhlbHApOworICAgIHJldHVybiBwYXJtc091dFswXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBvbiBhIERCQ1Mgc3lzdGVtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIF9fSXNEQkNTU3lzdGVtKHZvaWQpCit7CisgICAgQ0hBUiAgICAgICAgYWNoREJDU0luZm9bMTJdOworICAgIENPVU5UUllDT0RFIGNjU3RydWN0ID0gezAsIDB9OworCisgICAgbWVtc2V0KGFjaERCQ1NJbmZvLCAwLCAxMik7CisKKyAgICAvKiBHZXQgdGhlIERCQ1MgdmVjdG9yIC0gaWYgaXQncyBub3QgZW1wdHksIHdlJ3JlIG9uIERCQ1MgKi8KKyAgICBEb3NRdWVyeURCQ1NFbnYoc2l6ZW9mKGFjaERCQ1NJbmZvKSwgJmNjU3RydWN0LCBhY2hEQkNTSW5mbyk7CisgICAgaWYgKGFjaERCQ1NJbmZvWzBdICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RldGVybWluZSBpZiBQTVNIRUxMIGlzIHJ1bm5pbmcgLSBpZiBpdCBpc24ndCwgd2UgY2FuJ3QgdXNlIGNlcnRhaW4gY2FsbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBfX2lzU2hlbGxMb2FkZWQodm9pZCkKK3sKKyAgICBQVk9JRCAgIHB0cjsKKworICAgIGlmIChEb3NHZXROYW1lZFNoYXJlZE1lbSgmcHRyLCAoUFNaKSJcXFNIQVJFTUVNXFxQTUdMT0JBTC5NRU0iLCBQQUdfUkVBRCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgRG9zRnJlZU1lbShwdHIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlci4gSWYgd2UKK2Nhbm5vdCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciwgd2UgYmFpbCBvdXQgd2l0aCBhbiBlcnJvcgorbWVzc2FnZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKK3sKKyAgICBpZiAoIWxvd01lbSkgeworICAgICAgICAvKiBPYnRhaW4gdGhlIDMyLT4xNiBjYWxsZ2F0ZSBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyIHRvIGVuYWJsZSBJT1BMICovCisgICAgICAgIGlmICgoX1BNX2dkdCA9IENhbGxTRERIZWxwKFBNSEVMUF9HRVRHRFQzMikpID09IDApCisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb2J0YWluIGNhbGwgZ2F0ZSBzZWxlY3RvciEiKTsKKworICAgICAgICBQTV9zZXRJT1BMKDMpOworCisgICAgICAgIC8qIE1hcCB0aGUgZmlyc3QgTWIgb2YgcGh5c2ljYWwgbWVtb3J5IGludG8gbG93TWVtICovCisgICAgICAgIGlmICgobG93TWVtID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBtYXAgZmlyc3QgTWIgcGh5c2ljYWwgbWVtb3J5ISIpOworCisgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIE1UUlIgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworICAgICAgICBNVFJSX2luaXQoKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgZm9yIEJJT1MgYWNjZXNzIHZpYSBWSURFT1BNSS4gVGhpcyBzaG91bGQgd29yaword2l0aCBhbnkgR1JBREQgZHJpdmVyLCBpbmNsdWRpbmcgU0RELzIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlib29sIEluaXRJbnQxMCh2b2lkKQoreworICAgIEhNT0RVTEUgICAgIGhNb2RHRU5QTUksaE1vZFNERFBNSSxoTW9kVmlkZW9QTUk7CisgICAgQ0hBUiAgICAgICAgYnVmWzgwXSxwYXRoW19NQVhfUEFUSF07CisgICAgSEVWICAgICAgICAgaGV2RGFlbW9uID0gTlVMTEhBTkRMRTsKKyAgICBSRVNVTFRDT0RFUyByZXNDb2RlczsKKworICAgIGlmIChoYXZlSW50MTAgPT0gLTEpIHsKKyAgICAgICAgLyogQ29ubmVjdCB0byBWSURFT1BNSSBhbmQgZ2V0IGVudHJ5IHBvaW50LiBOb3RlIHRoYXQgd2Ugb25seQorICAgICAgICAgKiBkbyB0aGlzIGlmIEdFTlBNSSBvciBTRERQTUkgYXJlIGFscmVhZHkgbG9hZGVkLCBzaW5jZSB3ZSBuZWVkCisgICAgICAgICAqIGEgR1JBREQgYmFzZWQgZHJpdmVyIGZvciB0aGlzIHRvIHdvcmsuCisgICAgICAgICAqLworICAgICAgICBQTV9pbml0KCk7CisgICAgICAgIGhhdmVJbnQxMCA9IGZhbHNlOworICAgICAgICBpZiAoRG9zUXVlcnlNb2R1bGVIYW5kbGUoKFBTWikiR0VOUE1JLkRMTCIsJmhNb2RHRU5QTUkpICE9IDApCisgICAgICAgICAgICBoTW9kR0VOUE1JID0gTlVMTEhBTkRMRTsKKyAgICAgICAgaWYgKERvc1F1ZXJ5TW9kdWxlSGFuZGxlKChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKSAhPSAwKQorICAgICAgICAgICAgaE1vZFNERFBNSSA9IE5VTExIQU5ETEU7CisgICAgICAgIGlmIChoTW9kR0VOUE1JIHx8IGhNb2RTRERQTUkpIHsKKyAgICAgICAgICAgIGlmIChEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlZJREVPUE1JLkRMTCIsJmhNb2RWaWRlb1BNSSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChEb3NRdWVyeVByb2NBZGRyKGhNb2RWaWRlb1BNSSwwLChQU1opIlZJREVPUE1JMzJSZXF1ZXN0Iiwodm9pZCopJlBNX1ZJREVPUE1JMzJSZXF1ZXN0KSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IFZJREVPUE1JMzJSZXF1ZXN0IGVudHJ5IHBvaW50ISIpOworICAgICAgICAgICAgICAgIHN0cmNweShwYXRoLCJYOlxcT1MyXFxTVkdBREFUQS5QTUkiKTsKKyAgICAgICAgICAgICAgICBwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7CisgICAgICAgICAgICAgICAgaWYgKFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfTE9BRFBNSUZJTEUscGF0aCxOVUxMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIERvc0ZyZWVNb2R1bGUoaE1vZFZpZGVvUE1JKTsKKyAgICAgICAgICAgICAgICAgICAgUE1fVklERU9QTUkzMlJlcXVlc3QgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBoYXZlSW50MTAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBBdHRlbXB0IHRvIGluaXRpYWxpc2UgdGhlIGZ1bGwgVkRNIGluIHRoZSBzeXN0ZW0uIFRoaXMgd2lsbCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAqIHdvcmsgaWYgVlBSUE1JLlNZUyBpcyBsb2FkZWQsIGJ1dCBpdCBwcm92aWRlcyBzdXBwb3J0IGZvciBwYXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAqIHZhbHVlcyBpbiBFUy9EUy9FU0kvRURJIGJldHdlZW4gdGhlIEJJT1Mgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIGtlcm5lbCBWRE0ncyBpbiBmaXhwYWNrcyBlYXJsaWVyIHRoYW4gRlAxNS4gRlAxNSBhbmQgbGF0ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXcgV2FycCA0LjUxIGFuZCBXYXJwIFNlcnZlciBjb252ZW5pZW5jZSBwYWNrcyBzaG91bGQgd29yaworICAgICAgICAgICAgICAgICAgICAgKiBmaW5lIHdpdGggdGhlIGtlcm5lbCBtaW5pLVZETS4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogQWxzbyB0aGUgZnVsbCBWRE0gaXMgdGhlIG9ubHkgc29sdXRpb24gZm9yIHJlYWxseSBvbGQga2VybmVscworICAgICAgICAgICAgICAgICAgICAgKiAoYnV0IEdSQUREIHdvbid0IHJ1biBvbiB0aGVtIHNvIHRoaXMgaXMgc3VwZXJmbHVvdXMgOy0pLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgSU5JVFZETSBJbml0VkRNID0ge1ZETV9JTklUSUFMSVpFLE5VTEwsTlVMTH07CisgICAgICAgICAgICAgICAgICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJkluaXRWRE0sTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGhhdmVJbnQxMCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQSBHUkFERCBkcml2ZXIgaXNuJ3QgbG9hZGVkLCBoZW5jZSB3ZSBjYW4ndCB1c2UgVklERU9QTUkuIEJ1dCB3ZSB3aWxsIHRyeQorICAgICAgICAgICAgICogdG8gYWNjZXNzIHRoZSBtaW5pLVZETSBkaXJlY3RseSwgZmlyc3QgdmVyaWZ5aW5nIHRoYXQgdGhlIHN1cHBvcnQgaXMKKyAgICAgICAgICAgICAqIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsIChpdCBzaG91bGQgYmUgZm9yIGtlcm5lbHMgdGhhdCBzdXBwb3J0IEdSQUREKS4KKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIG5lZWRlZCBpbiBhIGNvbW1hbmQgbGluZSBib290IG9yIGlmIG5vbi1HUkFERCBkcml2ZXIgaXMKKyAgICAgICAgICAgICAqIHVzZWQgKE1hdHJveCBvciBjbGFzc2ljIFZHQSkuCisgICAgICAgICAgICAgKiBOb3RlOiBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggbWluaS1WRE0gc3VwcG9ydCBpbiB0aGUga2VybmVsLCB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgKiBzcGF3biBhIGRhZW1vbiBwcm9jZXNzIHRoYXQgd2lsbCBkbyB0aGUgYWN0dWFsIG1pbmktVkRNIGFjY2VzcyBmb3IgdXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAvKiBUcnkgdG8gb3BlbiBzaGFyZWQgc2VtYXBob3JlIHRvIHNlZSBpZiBvdXIgZGFlbW9uIGlzIGFscmVhZHkgdXAgKi8KKyAgICAgICAgICAgIGlmIChEb3NPcGVuRXZlbnRTZW0oU0hBUkVEU0VNLCAmaGV2RGFlbW9uKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChEb3NXYWl0RXZlbnRTZW0oaGV2RGFlbW9uLCAxKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiBzZW1hcGhvcmUgaXMgcG9zdGVkLCBhbGwgaXMgd2VsbCAqLworICAgICAgICAgICAgICAgICAgICB1c2VWUE1JICAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZUludDEwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBzaGFyZWQgZXZlbnQgc2VtYXBob3JlICovCisgICAgICAgICAgICAgICAgaWYgKERvc0NyZWF0ZUV2ZW50U2VtKFNIQVJFRFNFTSwgJmhldkRhZW1vbiwgRENfU0VNX1NIQVJFRCwgRkFMU0UpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIFBNX2ZpbmRCUEQoREFFTU9OX05BTUUsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICBzdHJjYXQocGF0aCwgREFFTU9OX05BTUUpOworICAgICAgICAgICAgICAgICAgICBpZiAoRG9zRXhlY1BnbShidWYsIHNpemVvZihidWYpLCBFWEVDX0JBQ0tHUk9VTkQsIChQU1opREFFTU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcmVzQ29kZXMsIChQU1opcGF0aCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBkYWVtb24gd2FzIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLCBub3cgZ2l2ZSBpdCBhIHNlYyB0byBjb21lIHVwICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRG9zV2FpdEV2ZW50U2VtKGhldkRhZW1vbiwgMjAwMCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIHVwISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZQTUkgICA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVJbnQxMCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIGhhdmVJbnQxMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitXZSAicHJvYmFibHkiIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgT1MvMiBidXQgd2UgaGF2ZSB0byB2ZXJpZnkvaW5pdGlhbGl6ZSBpdAorZmlyc3QuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKK3sKKyAgICByZXR1cm4gSW5pdEludDEwKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoreworICAgIHJldHVybiBfT1NfT1MyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCit7CisgICAgcmV0dXJuIFBNXzM4NjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCisgICAgY2hhciAqcykKK3sKKyAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKKyAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgeworICAgICAgICBzW3Bvc10gPSAnXFwnOworICAgICAgICBzW3BvcysxXSA9ICdcMCc7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAorICAgIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICAvKiBCZSBwcmVwYXJlIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseSAoZmFpbGVkIHRvIGZhaWwgc2l0dWF0aW9uIDotKSAqLworICAgIHN0YXRpYyBpbnQgZmF0YWxFcnJvckNvdW50ID0gMDsKKyAgICBpZiAoZmF0YWxFcnJvckNvdW50KysgPT0gMCkgeworICAgICAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgICAgICB9CisgICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAorICAgIHVpbnQgKmxlbiwKKyAgICB1aW50ICpyc2VnLAorICAgIHVpbnQgKnJvZmYpCit7CisgICAgaWYgKCFWRVNBQnVmX3B0cikgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KKyAgICAgICAgaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKKyAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKKyAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKKyAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICBLQkRLRVlJTkZPICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICAgICovCisKKyAgICBLYmRQZWVrKCZrZXksIDApOworICAgIHJldHVybiAoa2V5LmZiU3RhdHVzICYgS0JEVFJGX0ZJTkFMX0NIQVJfSU4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dhaXQgZm9yIGFuZCByZXR1cm4gdGhlIG5leHQga2V5cHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCit7CisgICAgS0JES0VZSU5GTyAgIGtleTsgICAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAgICAqLworCisgICAgS2JkQ2hhckluKCZrZXksSU9fV0FJVCwwKTsKKyAgICByZXR1cm4ga2V5LmNoQ2hhcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitPcGVuIGEgZnVsbHNjcmVlbiBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbi4gVGhpcyByZXF1aXJlcyB0aGF0Cit0aGUgYXBwbGljYXRpb24gYmUgYSBmdWxsc2NyZWVuIFZJTyBwcm9ncmFtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCisgICAgUE1fSFdORCBod25kVXNlciwKKyAgICBpbnQgZGV2aWNlLAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzLAorICAgIGludCBicHAsCisgICAgaWJvb2wgZnVsbFNjcmVlbikKK3sKKyAgICAodm9pZClod25kVXNlcjsKKyAgICAodm9pZClkZXZpY2U7CisgICAgKHZvaWQpeFJlczsKKyAgICAodm9pZCl5UmVzOworICAgICh2b2lkKWJwcDsKKyAgICAodm9pZClmdWxsU2NyZWVuOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZpbmQgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCit7CisgICAgVklPTU9ERUlORk8gdm1pOworICAgIHZtaS5jYiA9IHNpemVvZiAoVklPTU9ERUlORk8pOworICAgIFZpb0dldE1vZGUgKCZ2bWksIChIVklPKTApOworICAgIHJldHVybiBzaXplb2YgKENPTlNPTEVfU0FWRSkgLSAxICsgdm1pLmNvbCAqIHZtaS5yb3cgKiAyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKKyAgICB2b2lkICpzdGF0ZUJ1ZiwKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIFVTSE9SVCAgICAgICAgICBmYmxlbjsKKyAgICBDT05TT0xFX1NBVkUgICAgKmNzID0gKENPTlNPTEVfU0FWRSopc3RhdGVCdWY7CisgICAgVklPTU9ERUlORk8gICAgIHZtaTsKKworICAgIC8qIFRoZSByZWFzb24gZm9yIHRoZSBWSU9NT0RFSU5GTyBqdWdnbGluZyBpcyAxNi1iaXQgY29kZS4gQmVjYXVzZSB0aGUgdXNlcgorICAgICAqIGFsbG9jYXRlcyB0aGUgc3RhdGUgYnVmZmVyLCBjZC0+dm1pIG1pZ2h0IGJlIGNyb3NzaW5nIHRoZSA2NEsgYm91bmRhcnkgYW5kCisgICAgICogdGhlIDE2LWJpdCBBUEkgd291bGQgZmFpbC4gSWYgd2UgY3JlYXRlIGFub3RoZXIgY29weSBvbiBzdGFjaywgdGhlIGNvbXBpbGVyCisgICAgICogc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSA2NEsgYm91bmRhcnkgd2lsbCBub3QgYmUgY3Jvc3NlZCAoaXQgYWRqdXN0cyB0aGUgc3RhY2sKKyAgICAgKiBpZiBpdCBzaG91bGQgY3Jvc3MpLgorICAgICAqLworICAgIHZtaS5jYiA9IHNpemVvZihWSU9NT0RFSU5GTyk7CisgICAgVmlvR2V0TW9kZSgmdm1pLChIVklPKTApOworICAgIG1lbWNweSgmY3MtPnZtaSwgJnZtaSwgc2l6ZW9mKFZJT01PREVJTkZPKSk7CisgICAgVmlvR2V0Q3VyUG9zKCZjcy0+Q3Vyc29yWSwgJmNzLT5DdXJzb3JYLCAoSFZJTykwKTsKKyAgICBmYmxlbiA9IGNzLT52bWkuY29sICogY3MtPnZtaS5yb3cgKiAyOworICAgIFZpb1JlYWRDZWxsU3RyKChQQ0gpY3MtPkZyYW1lQnVmZmVyLCAmZmJsZW4sIDAsIDAsIChIVklPKTApOworfQorCisvKiBHbG9iYWwgdmFyaWFibGUgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aHJlYWRzICovCitzdGF0aWMgU0VTV0lUQ0hSRUMgU2VzU3dpdGNoUmVjID0geyAtMSB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGxlZCBieSBleHRlcm5hbCByb3V0aW5lcyBhdCBsZWFzdCBvbmNlIHBlciBmcmFtZSB0byBjaGVjayB3aGVuZXZlciBhCitzZXNzaW9uIHNhdmUvcmVzdG9yZSBzaG91bGQgYmUgcGVyZm9ybWVkLiBTaW5jZSB3ZSByZWNlaXZlIHN1Y2ggbm90aWZpY2F0aW9ucworYXN5bmNyb25vdXNseSwgd2UgY2FuJ3QgcGVyZm9ybSBhbGwgcmVxdWlyZWQgb3BlcmF0aW9ucyBhdCB0aGF0IHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCh2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBGbGFncywgTW9kZTsKKyAgICBQTV9zYXZlU3RhdGVfY2IgQ2FsbGJhY2s7CisKKyAgICAvKiBRdWljayBvcHRpbWl6ZWQgcGF0aCBmb3IgbW9zdCBjb21tb24gY2FzZSAqLworICAgIGlmIChTZXNTd2l0Y2hSZWMuRmxhZ3MgPT0gLTEpCisgICAgICAgIHJldHVybjsKKworYWdhaW46CisgICAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgsIDEwMCkpCisgICAgICAgIHJldHVybjsKKyAgICBGbGFncyA9IFNlc1N3aXRjaFJlYy5GbGFnczsKKyAgICBDYWxsYmFjayA9IFNlc1N3aXRjaFJlYy5DYWxsYmFjazsKKyAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSAtMTsKKyAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4KTsKKworICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IHRydWU7ICAgICAgICAgICAgLyogUHJldmVudCBWSU8gY2FsbHMgKi8KKyAgICBNb2RlID0gQ2FsbGJhY2soRmxhZ3MpOworICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IGZhbHNlOworICAgIERvc1Bvc3RFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQpOworICAgIGlmIChGbGFncyA9PSBQTV9ERUFDVElWQVRFICYmIE1vZGUgPT0gUE1fU1VTUEVORF9BUFApCisgICAgICAgIC8qIFN1c3BlbmQgYXBwbGljYXRpb24gdW50aWwgd2Ugc3dpdGNoIGJhY2sgdG8gb3VyIGFwcGxpY2F0aW9uICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIERvc1NsZWVwICg1MDApOworICAgICAgICAgICAgLyogU2VzU3dpdGNoUmVjLkZsYWdzIGlzIHZvbGF0aWxlIHNvIG9wdGltaXplcgorICAgICAgICAgICAgICogd29uJ3QgbG9hZCBpdCBpbnRvIGEgcmVnaXN0ZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKFNlc1N3aXRjaFJlYy5GbGFncyAhPSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dhaXRzIHVudGlsIG1haW4gdGhyZWFkIHByb2Nlc3NlcyB0aGUgc2Vzc2lvbiBzd2l0Y2ggZXZlbnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudCgKKyAgICBQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlLAorICAgIGludCBmbGFncykKK3sKKyAgICBVTE9ORyBDb3VudDsKKworICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4LCAxMDAwMCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFdlJ3JlIGdvaW5nIHRvIHdhaXQgb24gdGhhdCBzZW1hcGhvcmUgKi8KKyAgICBEb3NSZXNldEV2ZW50U2VtKFNlc1N3aXRjaFJlYy5FdmVudCwgJkNvdW50KTsKKyAgICBTZXNTd2l0Y2hSZWMuQ2FsbGJhY2sgPSBzYXZlU3RhdGU7CisgICAgU2VzU3dpdGNoUmVjLkZsYWdzID0gZmxhZ3M7CisgICAgRG9zUmVsZWFzZU11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCk7CisKKyAgICAvKiBOb3cgd2FpdCB1bnRpbCBhbGwgcmVxdWlyZWQgb3BlcmF0aW9ucyBhcmUgY29tcGxldGUgKi8KKyAgICBEb3NXYWl0RXZlbnRTZW0gKFNlc1N3aXRjaFJlYy5FdmVudCwgMTAwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgaXMgdGhlIHRocmVhZCByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgc3dpdGNoZXMgYmFjayB0byBvdXIKK2Z1bGxzY3JlZW4gc2Vzc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfUE1fQ29uc29sZVN3aXRjaCgKKyAgICBQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKQoreworICAgIFVTSE9SVCBOb3RpZnlUeXBlOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoVmlvTW9kZVdhaXQoVk1XUl9QT1BVUCwgJk5vdGlmeVR5cGUsIDApICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudChzYXZlU3RhdGUsIFBNX1JFQUNUSVZBVEUpOworICAgICAgICB9CisgICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19FUlJPUkNPREUsIChIVklPKTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgaXMgdGhlIHRocmVhZCByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgc2NyZWVuIHBvcHVwcyAodXN1YWxseSBmYXRhbAorZXJyb3IgaGFuZGxlciB1c2VzIHRoZW0pLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9QTV9Db25zb2xlUG9wdXAoCisgICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKK3sKKyAgICBVU0hPUlQgTm90aWZ5VHlwZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChWaW9TYXZSZWRyYXdXYWl0KFZTUldJX1NBVkVBTkRSRURSQVcsICZOb3RpZnlUeXBlLCAwKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChOb3RpZnlUeXBlID09IFZTUldOX1NBVkUpCisgICAgICAgICAgICBfUE1fU2Vzc2lvblN3aXRjaEV2ZW50KHNhdmVTdGF0ZSwgUE1fREVBQ1RJVkFURSk7CisgICAgICAgIGVsc2UgaWYgKE5vdGlmeVR5cGUgPT0gVlNSV05fUkVEUkFXKQorICAgICAgICAgICAgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudChzYXZlU3RhdGUsIFBNX1JFQUNUSVZBVEUpOworICAgICAgICB9CisgICAgVmlvU2F2UmVkcmF3VW5kbyhVTkRPSV9SRUxFQVNFT1dORVIsIFVORE9LX0VSUk9SQ09ERSwgKEhWSU8pMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAorICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCit7CisgICAgLy8gSWYgUE0gaXNuJ3QgbG9hZGVkLCB0aGlzIHN0dWZmIHdpbGwgY2F1c2UgY3Jhc2hlcyEKKyAgICBpZiAoX19pc1NoZWxsTG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKHNhdmVTdGF0ZSkgeworICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSB0aHJlYWRzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBjb25zb2xlIHN3aXRjaGVzICovCisgICAgICAgICAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSAtMTsKKyAgICAgICAgICAgIERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsICZTZXNTd2l0Y2hSZWMuTXV0ZXgsIDAsIEZBTFNFKTsKKyAgICAgICAgICAgIERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZTZXNTd2l0Y2hSZWMuRXZlbnQsIDAsIEZBTFNFKTsKKyAgICAgICAgICAgIF9iZWdpbnRocmVhZCAoKHZvaWQoKikodm9pZCopKV9QTV9Db25zb2xlU3dpdGNoLE5VTEwsU0VTU0lPTl9TV0lUQ0hfU1RBQ0tfU0laRSwgKHZvaWQqKXNhdmVTdGF0ZSk7CisgICAgICAgICAgICBfYmVnaW50aHJlYWQgKCh2b2lkKCopKHZvaWQqKSlfUE1fQ29uc29sZVBvcHVwLE5VTEwsU0VTU0lPTl9TV0lUQ0hfU1RBQ0tfU0laRSwgKHZvaWQqKXNhdmVTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogS2lsbCB0aGUgdGhyZWFkcyByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgY29uc29sZSBzd2l0Y2hlcyAqLworICAgICAgICAgICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19URVJNSU5BVEUsIChIVklPKTApOworICAgICAgICAgICAgVmlvU2F2UmVkcmF3VW5kbyhVTkRPSV9SRUxFQVNFT1dORVIsIFVORE9LX1RFUk1JTkFURSwgKEhWSU8pMCk7CisgICAgICAgICAgICBEb3NDbG9zZUV2ZW50U2VtKFNlc1N3aXRjaFJlYy5FdmVudCk7CisgICAgICAgICAgICBEb3NDbG9zZU11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKKyAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIENPTlNPTEVfU0FWRSAqY3MgPSAoQ09OU09MRV9TQVZFICopc3RhdGVCdWY7CisgICAgVklPTU9ERUlORk8gIHZtaTsKKworICAgIGlmICghY3MpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbWNweSgmdm1pLCAmY3MtPnZtaSwgc2l6ZW9mIChWSU9NT0RFSU5GTykpOworICAgIFZpb1NldE1vZGUoJnZtaSwgKEhWSU8pMCk7CisgICAgVmlvU2V0Q3VyUG9zKGNzLT5DdXJzb3JZLCBjcy0+Q3Vyc29yWCwgKEhWSU8pMCk7CisgICAgVmlvV3J0Q2VsbFN0cigoUENIKWNzLT5GcmFtZUJ1ZmZlciwgY3MtPnZtaS5jb2wgKiBjcy0+dm1pLnJvdyAqIDIsMCwgMCwgKEhWSU8pMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2xvc2UgdGhlIGZ1bGxzY3JlZW4gY29uc29sZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8qIEtpbGwgdGhlIHRocmVhZHMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGNvbnNvbGUgc3dpdGNoZXMgKi8KKyAgICBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soTlVMTCk7CisgICAgKHZvaWQpaHduZENvbnNvbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAorICAgIGludCB4LAorICAgIGludCB5KQoreworICAgIC8qIElmIHNlc3Npb24gc3dpdGNoIGlzIGluIHByb2dyZXNzLCBjYWxsaW5nIGludG8gVklPIGNhdXNlcyBkZWFkbG9ja3MhICovCisgICAgLyogQWxzbyB0aGlzIGNhbGwgdG8gVklPIHNjcmV3cyB1cCBvdXIgY29uc29sZSBsaWJyYXJ5IG9uIERCQ1MgYm94ZXMuLi4gKi8KKyAgICBpZiAoIWlzU2Vzc2lvblN3aXRjaGluZyAmJiAhX19Jc0RCQ1NTeXN0ZW0oKSkKKyAgICAgICAgVmlvU2V0Q3VyUG9zKHkseCwwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvIGluIGhlcmUgKi8KKyAgICAodm9pZCl3aWR0aDsKKyAgICAodm9pZCloZWlnaHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKKyAgICBQTV9pbnRIYW5kbGVyIGloLAorICAgIGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgKHZvaWQpaWg7CisgICAgKHZvaWQpZnJlcXVlbmN5OworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKKyAgICBpbnQgZnJlcXVlbmN5KQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWZyZXF1ZW5jeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAorICAgIGNoYXIgKnBhdGgsCisgICAgaW50IG1heExlbikKK3sKKyAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKK3sKKyAgICB1bG9uZyAgIGJvb3QgPSAzOworICAgIERvc1F1ZXJ5U3lzSW5mbyhRU1ZfQk9PVF9EUklWRSxRU1ZfQk9PVF9EUklWRSwmYm9vdCxzaXplb2YoYm9vdCkpOworICAgIHJldHVybiAoY2hhcikoJ2EnICsgYm9vdCAtIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKKyAgICBzdHJjcHkocGF0aCwieDpcXCIpOworICAgIHBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07CisgICAgaWYgKGdldGVudigiTlVDTEVVU19QQVRIIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGdldGVudigiTlVDTEVVU19QQVRIIik7CisgICAgc3RyY3B5KHBhdGgsIng6XFxvczJcXGRyaXZlcnMiKTsKKyAgICBwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLCJudWNsZXVzIik7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKKyAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOworICAgIHJldHVybiBwYXRoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKK3sKKyAgICByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitHZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgbmFtZVs0MF0sKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCJIT1NUTkFNRSIpKSAhPSBOVUxMKSB7CisgICAgICAgIHN0cm5jcHkobmFtZSxlbnYsc2l6ZW9mKG5hbWUpKTsKKyAgICAgICAgbmFtZVtzaXplb2YobmFtZSktMV0gPSAwOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIHJldHVybiAiT1MyIjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCit7CisgICAgUE1faW5pdCgpOworICAgIHJldHVybiBsb3dNZW0gKyAweDQwMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKK3sKKyAgICBQTV9pbml0KCk7CisgICAgcmV0dXJuIGxvd01lbSArIDB4QTAwMDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxpbWl0LAorICAgIGlib29sIGlzQ2FjaGVkKQoreworICAgIHVsb25nICAgYmFzZUFkZHIsYmFzZU9mcyxsaW5lYXI7CisKKyAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKKyAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIG1tYXAuIElmIHdlIHJvdW5kIHRoZQorICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKKyAgICAgKiB0aGF0IHdlIHJldHVybi4KKyAgICAgKi8KKyAgICBiYXNlT2ZzID0gYmFzZSAmIDQwOTU7CisgICAgYmFzZUFkZHIgPSBiYXNlICYgfjQwOTU7CisgICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOworICAgIHBhcm1zSW5bMF0gPSBiYXNlQWRkcjsKKyAgICBwYXJtc0luWzFdID0gbGltaXQ7CisgICAgcGFybXNJblsyXSA9IGlzQ2FjaGVkOworICAgIGlmICgobGluZWFyID0gQ2FsbFNEREhlbHAoUE1IRUxQX01BUFBIWVMpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKHZvaWQqKShsaW5lYXIgKyBiYXNlT2ZzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAorICAgIHZvaWQgKnB0ciwKKyAgICB1bG9uZyBsaW1pdCkKK3sKKyAgICBwYXJtc0luWzBdID0gKHVsb25nKXB0cjsKKyAgICBwYXJtc0luWzFdID0gbGltaXQ7CisgICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZSRUVQSFlTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCisgICAgdm9pZCAqcCkKK3sKKyAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7CisgICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9HRVRQSFlTSUNBTEFERFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAorICAgIHZvaWQgKnAsCisgICAgdWxvbmcgbGVuZ3RoLAorICAgIHVsb25nICpwaHlzQWRkcmVzcykKK3sKKyAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7CisgICAgcGFybXNJblsxXSA9ICh1bG9uZylsZW5ndGg7CisgICAgcGFybXNJblsyXSA9ICh1bG9uZylwaHlzQWRkcmVzczsKKyAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX0dFVFBIWVNJQ0FMQUREUlJBTkdFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2xlZXAoCisgICAgdWxvbmcgbWlsbGlzZWNvbmRzKQoreworICAgIERvc1NsZWVwKG1pbGxpc2Vjb25kcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIENPTSBwb3J0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRDT01Qb3J0KAorICAgIGludCBwb3J0KQoreworICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNGODsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgyRjg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldExQVFBvcnQoCisgICAgaW50IHBvcnQpCit7CisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0JDOworICAgICAgICBjYXNlIDE6IHJldHVybiAweDM3ODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgyNzg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBXaW45eCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5CithcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0CisoaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50CitkYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZworMCBpbnRlcnJ1cHQgY29udGV4dC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAorICAgIGxvbmcgc2l6ZSkKK3sKKyAgICBwYXJtc0luWzBdID0gc2l6ZTsKKyAgICByZXR1cm4gKHZvaWQqKUNhbGxTRERIZWxwKFBNSEVMUF9NQUxMT0NTSEFSRUQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKKyAgICB2b2lkICpwdHIpCit7CisgICAgcGFybXNJblswXSA9ICh1bG9uZylwdHI7CisgICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZSRUVTSEFSRUQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01hcCBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyB0byB0aGUgY2FsbGluZyBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIFRoZQorYWRkcmVzcyB3aWxsIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gYW5vdGhlciBwcm9jZXNzIHVzaW5nIHRoZQorUE1fbWFwUGh5c2ljYWxBZGRyIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCisgICAgdm9pZCAqYmFzZSwKKyAgICB1bG9uZyBsaW1pdCkKK3sKKyAgICB1bG9uZyAgIGJhc2VBZGRyLGJhc2VPZnM7CisKKyAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKKyAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIG1tYXAuIElmIHdlIHJvdW5kIHRoZQorICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKKyAgICAgKiB0aGF0IHdlIHJldHVybi4KKyAgICAgKi8KKyAgICBiYXNlT2ZzID0gKHVsb25nKWJhc2UgJiA0MDk1OworICAgIGJhc2VBZGRyID0gKHVsb25nKWJhc2UgJiB+NDA5NTsKKyAgICBsaW1pdCA9ICgobGltaXQrYmFzZU9mcysxKzQwOTUpICYgfjQwOTUpLTE7CisgICAgcGFybXNJblswXSA9ICh1bG9uZyliYXNlQWRkcjsKKyAgICBwYXJtc0luWzFdID0gbGltaXQ7CisgICAgcmV0dXJuICh2b2lkKikoQ2FsbFNEREhlbHAoUE1IRUxQX01BUFRPUFJPQ0VTUykrYmFzZU9mcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKKyAgICB1aW50IHJfc2VnLAorICAgIHVpbnQgcl9vZmYpCit7CisgICAgaWYgKHJfc2VnID09IDB4RkZGRikKKyAgICAgICAgcmV0dXJuICZSTUJ1ZltyX29mZl07CisgICAgcmV0dXJuIGxvd01lbSArIE1LX1BIWVMocl9zZWcscl9vZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCisgICAgdWludCBzaXplLAorICAgIHVpbnQgKnJfc2VnLAorICAgIHVpbnQgKnJfb2ZmKQoreworICAgIGlmIChzaXplID4gc2l6ZW9mKFJNQnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKnJfc2VnID0gMHhGRkZGOworICAgICpyX29mZiA9IDB4MDAwMDsKKyAgICByZXR1cm4gJlJNQnVmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCisgICAgdm9pZCAqbWVtKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLworICAgICh2b2lkKW1lbTsKK30KKworI2RlZmluZSBJTkRQTUkocmVnKSAgICAgcm1yZWdzLmFDUkYucmVnXyMjcmVnID0gcmVncy0+cmVnCisjZGVmaW5lIE9VVERQTUkocmVnKSAgICByZWdzLT5yZWcgPSBybXJlZ3MuYUNSRi5yZWdfIyNyZWcKKworI2RlZmluZSBSRUdfT0ZGU0VUKGZpZWxkKSAgKCgoVUxPTkcpJigoKFZDUkYqKTApLT5maWVsZCkpICAvIHNpemVvZihVTE9ORykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBEUE1JX2ludDg2KAorICAgIGludCBpbnRubywKKyAgICBEUE1JX3JlZ3MgKnJlZ3MpCit7CisgICAgSU5UQ1JGICBybXJlZ3M7CisgICAgdWxvbmcgICBlYXggPSAwOworCisgICAgaWYgKCFJbml0SW50MTAoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7CisgICAgcm1yZWdzLnVsQklPU0ludE5vID0gaW50bm87CisgICAgSU5EUE1JKGVheCk7IElORFBNSShlYngpOyBJTkRQTUkoZWN4KTsgSU5EUE1JKGVkeCk7IElORFBNSShlc2kpOyBJTkRQTUkoZWRpKTsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZHMgPSByZWdzLT5kczsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZXMgPSByZWdzLT5lczsKKyAgICBpZiAoaW50bm8gPT0gMHgxMCkgeworICAgICAgICBlYXggPSBybXJlZ3MuYUNSRi5yZWdfZWF4OworICAgICAgICBzd2l0Y2ggKGVheCAmIDB4RkZGRikgeworICAgICAgICAgICAgY2FzZSAweDRGMDA6CisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSB0byBoYWNrIHRoZSB3YXkgdGhpcyBmdW5jdGlvbiB3b3JrcywgZHVlIHRvCisgICAgICAgICAgICAgICAgICogc29tZSBidWdzIGluIHRoZSBJQk0gbWluaS1WRE0gQklPUyBzdXBwb3J0LiBTcGVjaWZpY2FsbHkKKyAgICAgICAgICAgICAgICAgKiB3ZSBuZWVkIHRvIG1ha2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgb3V0cHV0IGJ1ZmZlciB0aGUKKyAgICAgICAgICAgICAgICAgKiAnc2FtZScgYnVmZmVyLCBhbmQgdGhhdCBFUzpTSSBwb2ludHMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICAgICAqIGJ1ZmZlciAoaWdub3JlZCBieSB0aGUgQklPUykuIFRoZSBkYXRhIHdpbGwgZW5kIHVwCisgICAgICAgICAgICAgICAgICogYmVpbmcgcmV0dXJuZWQgaW4gdGhlIGlucHV0IGJ1ZmZlciwgZXhjZXB0IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgKiBmaXJzdCBmb3VyIGJ5dGVzICgnVkVTQScpIHRoYXQgd2lsbCBub3QgYmUgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gSU5QVVRfQlVGRkVSOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMF0ucEFkZHJlc3MgPSBSTUJ1ZjsKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMF0udWxTaXplID0gNDsKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMV0uYkJ1ZmZlclR5cGUgPSBPVVRQVVRfQlVGRkVSOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlsxXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlsxXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZXNpKTsKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMV0ucEFkZHJlc3MgPSAoKFBCWVRFKVJNQnVmKSs0OworICAgICAgICAgICAgICAgIHJtcmVncy5wQlsxXS51bFNpemUgPSA1MTItNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0RjAxOgorICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5iQnVmZmVyVHlwZSA9IE9VVFBVVF9CVUZGRVI7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS51bFNpemUgPSAyNTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NEYwMjoKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMF0uYkJ1ZmZlclR5cGUgPSBJTlBVVF9CVUZGRVI7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS51bFNpemUgPSAyNTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NEYwOToKKyAgICAgICAgICAgICAgICBybXJlZ3MucEJbMF0uYkJ1ZmZlclR5cGUgPSBJTlBVVF9CVUZGRVI7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7CisgICAgICAgICAgICAgICAgcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOworICAgICAgICAgICAgICAgIHJtcmVncy5wQlswXS51bFNpemUgPSAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDRGMEE6CisgICAgICAgICAgICAgICAgLyogRHVlIHRvIGJ1Z3MgaW4gdGhlIG1pbmktVkRNIGluIE9TLzIsIHRoZSAweDRGMEEgcHJvdGVjdGVkCisgICAgICAgICAgICAgICAgICogbW9kZSBpbnRlcmZhY2UgZnVuY3Rpb25zIHdpbGwgbm90IHdvcmsgKHdlIG5ldmVyIGdldCBhbnkKKyAgICAgICAgICAgICAgICAgKiBzZWxlY3RvcnMgcmV0dXJuZWQpLCBzbyB3ZSBmYWlsIHRoaXMgZnVuY3Rpb24gaGVyZS4gVGhlCisgICAgICAgICAgICAgICAgICogcmVzdCBvZiB0aGUgVkJFL0NvcmUgZHJpdmVyIHdpbGwgd29yayBwcm9wZXJseSBpZiB0aGlzCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gaXMgZmFpbGVkLCBiZWNhdXNlIHRoZSBWQkUgMi4wIGFuZCAzLjAgc3BlY3MKKyAgICAgICAgICAgICAgICAgKiBhbGxvdyBmb3IgdGhpcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZWdzLT5lYXggPSAweDAxNEY7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgaWYgKHVzZVZQTUkpCisgICAgICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsTlVMTCwmcm1yZWdzKTsKKyAgICBlbHNlIHsKKyAgICAgICAgRG9zU3lzQ3RsKDYsICZybXJlZ3MpOworICAgICAgICB9CisKKyAgICBPVVREUE1JKGVheCk7IE9VVERQTUkoZWJ4KTsgT1VURFBNSShlY3gpOyBPVVREUE1JKGVkeCk7IE9VVERQTUkoZXNpKTsgT1VURFBNSShlZGkpOworICAgIGlmICgoKHJlZ3MtPmVheCAmIDB4RkZGRikgPT0gMHgwMDRGKSAmJiAoKGVheCAmIDB4RkZGRikgPT0gMHg0RjAwKSkgeworICAgICAgICAvKiBIYWNrIHRvIGZpeCB1cCB0aGUgbWlzc2luZyAnVkVTQScgc3RyaW5nIGZvciBtaW5pLVZETSAqLworICAgICAgICBtZW1jcHkoUk1CdWYsIlZFU0EiLDQpOworICAgICAgICB9CisgICAgcmVncy0+ZHMgPSBybXJlZ3MuYUNSRi5yZWdfZHM7CisgICAgcmVncy0+ZXMgPSBybXJlZ3MuYUNSRi5yZWdfZXM7CisgICAgcmVncy0+ZmxhZ3MgPSBybXJlZ3MuYUNSRi5yZWdfZWZsYWc7Cit9CisKKyNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZworI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1faW50ODYoCisgICAgaW50IGludG5vLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1SRUdTICpvdXQpCit7CisgICAgRFBNSV9yZWdzICAgcm1yZWdzOworCisgICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKKyAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOworICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7CisgICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKKyAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7CisgICAgcmV0dXJuIG91dC0+eC5heDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBEUE1JX3JlZ3MgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisgICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOworICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKKyAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOworICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7CisgICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOworICAgIHNyZWdzLT5jcyA9IHJtcmVncy5jczsKKyAgICBzcmVncy0+c3MgPSBybXJlZ3Muc3M7CisgICAgc3JlZ3MtPmRzID0gcm1yZWdzLmRzOworICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKKyAgICByZXR1cm4gb3V0LT54LmF4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAorICAgIHVpbnQgc2VnLAorICAgIHVpbnQgb2ZmLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgUE1fZmF0YWxFcnJvcigiUE1fY2FsbFJlYWxNb2RlIG5vdCBzdXBwb3J0ZWQgb24gT1MvMiEiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAorICAgIHVsb25nICpwaHlzaWNhbCwKKyAgICB1bG9uZyAqdG90YWwpCit7CisgICAgLyogVW5hYmxlIHRvIGdldCByZWxpYWJsZSB2YWx1ZXMgZnJvbSBPUy8yIGZvciB0aGlzICovCisgICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IGZvciBETUEgb3BlcmF0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCisgICAgdWludCBzaXplLAorICAgIHVsb25nICpwaHlzQWRkciwKKyAgICBpYm9vbCBjb250aWd1b3VzLAorICAgIGlib29sIGJlbG93MTZNKQoreworICAgIHBhcm1zSW5bMF0gPSBzaXplOworICAgIHBhcm1zSW5bMV0gPSBjb250aWd1b3VzOworICAgIHBhcm1zSW5bMl0gPSBiZWxvdzE2TTsKKyAgICBDYWxsU0RESGVscChQTUhFTFBfQUxMT0NMT0NLRUQpOworICAgICpwaHlzQWRkciA9IHBhcm1zT3V0WzFdOworICAgIHJldHVybiAodm9pZCopcGFybXNPdXRbMF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAorICAgIHZvaWQgKnAsCisgICAgdWludCBzaXplLAorICAgIGlib29sIGNvbnRpZ3VvdXMpCit7CisgICAgcGFybXNJblswXSA9ICh1bG9uZylwOworICAgIENhbGxTRERIZWxwKFBNSEVMUF9GUkVFTE9DS0VEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2YgcGFnZXMgZm9yIHRoZSBwYWdlIGJsb2NrIG1hbmFnZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHBhZ2VibG9jayAqUE1fYWRkTmV3UGFnZUJsb2NrKHZvaWQpCit7CisgICAgaW50ICAgICAgICAgaTsKKyAgICBwYWdlYmxvY2sgICAqbmV3QmxvY2s7CisgICAgY2hhciAgICAgICAgKnAsKm5leHQ7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgcGFnZSBibG9jaywgYW5kIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KKyAgICBpZiAoRG9zQWxsb2NTaGFyZWRNZW0oKHZvaWQqKikmbmV3QmxvY2ssTlVMTCxQQUdFX0JMT0NLX1NJWkUsT0JKX0dFVFRBQkxFIHwgUEFHX1JFQUQgfCBQQUdfV1JJVEUgfCBQQUdfQ09NTUlUKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQTV9sb2NrRGF0YVBhZ2VzKG5ld0Jsb2NrLFBBR0VfQkxPQ0tfU0laRSwmbmV3QmxvY2stPmxvY2tIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdCbG9jay0+cHJldiA9IE5VTEw7CisgICAgbmV3QmxvY2stPm5leHQgPSBwYWdlQmxvY2tzOworICAgIGlmIChwYWdlQmxvY2tzKQorICAgICAgICBwYWdlQmxvY2tzLT5wcmV2ID0gbmV3QmxvY2s7CisgICAgcGFnZUJsb2NrcyA9IG5ld0Jsb2NrOworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgcGFnZSBhbGlnbmVkIGZyZWUgbGlzdCBmb3IgdGhlIHBhZ2UgYmxvY2sgKi8KKyAgICBuZXdCbG9jay0+ZnJlZUNvdW50ID0gUEFHRVNfUEVSX0JMT0NLOworICAgIG5ld0Jsb2NrLT5mcmVlTGlzdCA9IHAgPSAoY2hhciopKCgodWxvbmcpKG5ld0Jsb2NrICsgMSkgKyAoUE1fUEFHRV9TSVpFLTEpKSAmIH4oUE1fUEFHRV9TSVpFLTEpKTsKKyAgICBuZXdCbG9jay0+ZnJlZUxpc3RTdGFydCA9IG5ld0Jsb2NrLT5mcmVlTGlzdDsKKyAgICBuZXdCbG9jay0+ZnJlZUxpc3RFbmQgPSBwICsgKFBBR0VTX1BFUl9CTE9DSy0xKSAqIFBNX1BBR0VfU0laRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUEFHRVNfUEVSX0JMT0NLOyBpKysscCA9IG5leHQpCisgICAgICAgIEZSRUVMSVNUX05FWFQocCkgPSBuZXh0ID0gcCArIFBNX1BBR0VfU0laRTsKKyAgICBGUkVFTElTVF9ORVhUKHAgLSBQTV9QQUdFX1NJWkUpID0gTlVMTDsKKyAgICByZXR1cm4gbmV3QmxvY2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCisgICAgaWJvb2wgbG9ja2VkKQoreworICAgIHBhZ2VibG9jayAgICpibG9jazsKKyAgICB2b2lkICAgICAgICAqcDsKKworICAgIC8qIFNjYW4gdGhlIGJsb2NrIGxpc3QgbG9va2luZyBmb3IgYW55IGZyZWUgYmxvY2tzLiBBbGxvY2F0ZSBhIG5ldworICAgICAqIHBhZ2UgYmxvY2sgaWYgbm8gZnJlZSBibG9ja3MgYXJlIGZvdW5kLgorICAgICAqLworICAgIGZvciAoYmxvY2sgPSBwYWdlQmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5uZXh0KSB7CisgICAgICAgIGlmIChibG9jay0+ZnJlZUNvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBpZiAoYmxvY2sgPT0gTlVMTCAmJiAoYmxvY2sgPSBQTV9hZGROZXdQYWdlQmxvY2soKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmxvY2stPmZyZWVDb3VudC0tOworICAgIHAgPSBibG9jay0+ZnJlZUxpc3Q7CisgICAgYmxvY2stPmZyZWVMaXN0ID0gRlJFRUxJU1RfTkVYVChwKTsKKyAgICAodm9pZClsb2NrZWQ7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAorICAgIHZvaWQgKnApCit7CisgICAgcGFnZWJsb2NrICAgKmJsb2NrOworCisgICAgLyogRmlyc3QgZmluZCB0aGUgcGFnZSBibG9jayB0aGF0IHRoaXMgcGFnZSBiZWxvbmdzIHRvICovCisgICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKKyAgICAgICAgaWYgKHAgPj0gYmxvY2stPmZyZWVMaXN0U3RhcnQgJiYgcCA8PSBibG9jay0+ZnJlZUxpc3RFbmQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIENIRUNLKGJsb2NrICE9IE5VTEwpOworCisgICAgLyogTm93IGZyZWUgdGhlIGJsb2NrIGJ5IGFkZGluZyBpdCB0byB0aGUgZnJlZSBsaXN0ICovCisgICAgRlJFRUxJU1RfTkVYVChwKSA9IGJsb2NrLT5mcmVlTGlzdDsKKyAgICBibG9jay0+ZnJlZUxpc3QgPSBwOworICAgIGlmICgrK2Jsb2NrLT5mcmVlQ291bnQgPT0gUEFHRVNfUEVSX0JMT0NLKSB7CisgICAgICAgIC8qIElmIGFsbCBwYWdlcyBpbiB0aGUgcGFnZSBibG9jayBhcmUgbm93IGZyZWUsIGZyZWUgdGhlIGVudGlyZQorICAgICAgICAgKiBwYWdlIGJsb2NrIGl0c2VsZi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChibG9jayA9PSBwYWdlQmxvY2tzKSB7CisgICAgICAgICAgICAvKiBEZWxldGUgZnJvbSBoZWFkICovCisgICAgICAgICAgICBwYWdlQmxvY2tzID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICBpZiAoYmxvY2stPm5leHQpCisgICAgICAgICAgICAgICAgYmxvY2stPm5leHQtPnByZXYgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIERlbGV0ZSBmcm9tIG1pZGRsZSBvZiBsaXN0ICovCisgICAgICAgICAgICBDSEVDSyhibG9jay0+cHJldiAhPSBOVUxMKTsKKyAgICAgICAgICAgIGJsb2NrLT5wcmV2LT5uZXh0ID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICBpZiAoYmxvY2stPm5leHQpCisgICAgICAgICAgICAgICAgYmxvY2stPm5leHQtPnByZXYgPSBibG9jay0+cHJldjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBVbmxvY2sgdGhlIG1lbW9yeSBhbmQgZnJlZSBpdCAqLworICAgICAgICBQTV91bmxvY2tEYXRhUGFnZXMoYmxvY2ssUEFHRV9CTE9DS19TSVpFLCZibG9jay0+bG9ja0hhbmRsZSk7CisgICAgICAgIERvc0ZyZWVNZW0oYmxvY2spOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGluIGFsbCB0aGUgc2hhcmVkIG1lbW9yeSBibG9ja3MgZm9yIG1hbmFnaW5nIHRoZSBtZW1vcnkgcGFnZXMgYWJvdmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9tYXBTaGFyZWRQYWdlcyh2b2lkKQoreworICAgIHBhZ2VibG9jayAgICpibG9jazsKKworICAgIC8qIE1hcCBhbGwgdGhlIHBhZ2UgYmxvY2tzIGFib3ZlIGludG8gdGhlIHNoYXJlZCBtZW1vcnkgZm9yIHByb2Nlc3MgKi8KKyAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgeworICAgICAgICBEb3NHZXRTaGFyZWRNZW0oYmxvY2ssIFBBR19SRUFEIHwgUEFHX1dSSVRFKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKKyAgICB2b2lkICpwLAorICAgIHVpbnQgbGVuLAorICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCit7CisgICAgcGFybXNJblswXSA9ICh1bG9uZylwOworICAgIHBhcm1zSW5bMV0gPSBsZW47CisgICAgQ2FsbFNEREhlbHAoUE1IRUxQX0xPQ0tQQUdFUyk7CisgICAgbG9ja0hhbmRsZS0+aFswXSA9IHBhcm1zT3V0WzFdOworICAgIGxvY2tIYW5kbGUtPmhbMV0gPSBwYXJtc091dFsyXTsKKyAgICBsb2NrSGFuZGxlLT5oWzJdID0gcGFybXNPdXRbM107CisgICAgcmV0dXJuIHBhcm1zT3V0WzBdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXMoCisgICAgdm9pZCAqcCwKKyAgICB1aW50IGxlbiwKKyAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQoreworICAgIHBhcm1zSW5bMF0gPSBsb2NrSGFuZGxlLT5oWzBdOworICAgIHBhcm1zSW5bMV0gPSBsb2NrSGFuZGxlLT5oWzFdOworICAgIHBhcm1zSW5bMl0gPSBsb2NrSGFuZGxlLT5oWzJdOworICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfVU5MT0NLUEFHRVMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcygKKyAgICB2b2lkICgqcCkoKSwKKyAgICB1aW50IGxlbiwKKyAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQoreworICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKKyAgICBwYXJtc0luWzFdID0gbGVuOworICAgIENhbGxTRERIZWxwKFBNSEVMUF9MT0NLUEFHRVMpOworICAgIGxvY2tIYW5kbGUtPmhbMF0gPSBwYXJtc091dFsxXTsKKyAgICBsb2NrSGFuZGxlLT5oWzFdID0gcGFybXNPdXRbMl07CisgICAgbG9ja0hhbmRsZS0+aFsyXSA9IHBhcm1zT3V0WzNdOworICAgIHJldHVybiBwYXJtc091dFswXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAorICAgIHZvaWQgKCpwKSgpLAorICAgIHVpbnQgbGVuLAorICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCit7CisgICAgcGFybXNJblswXSA9IGxvY2tIYW5kbGUtPmhbMF07CisgICAgcGFybXNJblsxXSA9IGxvY2tIYW5kbGUtPmhbMV07CisgICAgcGFybXNJblsyXSA9IGxvY2tIYW5kbGUtPmhbMl07CisgICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9VTkxPQ0tQQUdFUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCisgICAgaW50IGJhbmspCit7CisgICAgSU5UQ1JGICBybXJlZ3M7CisKKyAgICBpZiAoIUluaXRJbnQxMCgpKQorICAgICAgICByZXR1cm47CisgICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKKyAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSAweDEwOworICAgIHJtcmVncy5hQ1JGLnJlZ19lYXggPSAweDRGMDU7CisgICAgcm1yZWdzLmFDUkYucmVnX2VieCA9IDB4MDAwMDsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0gYmFuazsKKyAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAorICAgIGludCBiYW5rKQoreworICAgIElOVENSRiAgcm1yZWdzOworCisgICAgaWYgKCFJbml0SW50MTAoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7CisgICAgcm1yZWdzLnVsQklPU0ludE5vID0gMHgxMDsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZWF4ID0gMHg0RjA1OworICAgIHJtcmVncy5hQ1JGLnJlZ19lYnggPSAweDAwMDA7CisgICAgcm1yZWdzLmFDUkYucmVnX2VkeCA9IGJhbms7CisgICAgUE1fVklERU9QTUkzMlJlcXVlc3QoJkFkYXB0ZXIsUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCwmcm1yZWdzLE5VTEwpOworICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7CisgICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNTsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gMHgwMDAxOworICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSBiYW5rOworICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KAorICAgIGludCB4LAorICAgIGludCB5LAorICAgIGludCB3YWl0VlJUKQoreworICAgIElOVENSRiAgcm1yZWdzOworCisgICAgaWYgKCFJbml0SW50MTAoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7CisgICAgcm1yZWdzLnVsQklPU0ludE5vID0gMHgxMDsKKyAgICBybXJlZ3MuYUNSRi5yZWdfZWF4ID0gMHg0RjA3OworICAgIHJtcmVncy5hQ1JGLnJlZ19lYnggPSB3YWl0VlJUOworICAgIHJtcmVncy5hQ1JGLnJlZ19lY3ggPSB4OworICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSB5OworICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitFeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TLAorICAgIHVsb25nIEJJT1NMZW4pCit7CisgICAgKHZvaWQpYXhWYWw7CisgICAgKHZvaWQpQklPU1BoeXNBZGRyOworICAgICh2b2lkKW1hcHBlZEJJT1M7CisgICAgKHZvaWQpQklPU0xlbjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KK3R5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKKworUkVUVVJOUzoKK0Vycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCisgICAgdWxvbmcgYmFzZSwKKyAgICB1bG9uZyBzaXplLAorICAgIHVpbnQgdHlwZSkKK3sKKyAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOworfQorCisvLyBUT0RPOiBNb3ZlIHRoZSBNVFJSIGhlbHBlciBzdHVmZiBpbnRvIHRoZSBjYWxsIGdhdGUsIG9yIGJldHRlciB5ZXQKKy8vICAgICAgIGVudGlyZWx5IGludG8gdGhlIHJpbmcgMCBoZWxwZXIgZHJpdmVyISEKKworLyogTVRSUiBoZWxwZXIgZnVuY3Rpb25zLiBUbyBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQgdGhlIE1UUlIgc3VwcG9ydAorICogdW5kZXIgT1MvMiwgd2Ugc2ltcGx5IHB1dCBvdXIgcmluZyAwIGhlbHBlciBmdW5jdGlvbnMgaW50byB0aGUKKyAqIGhlbHBlciBkZXZpY2UgZHJpdmVyIHJhdGhlciB0aGFuIHRoZSBlbnRpcmUgTVRSUiBtb2R1bGUuIFRoaXMgbWFrZXMKKyAqIGl0IGVhc2llciB0byBtYWludGFpbiB0aGUgTVRSUiBzdXBwb3J0IHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVhbAorICogd2l0aCAxNi1iaXQgcmluZyAwIGNvZGUgaW4gdGhlIE1UUlIgbGlicmFyeS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZsdXNoIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKK3sKKyAgICBDYWxsU0RESGVscChQTUhFTFBfRkxVU0hUTEIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0cnVlIGlmIHJpbmcgMCAob3IgaWYgd2UgY2FuIGNhbGwgdGhlIGhlbHBlcnMgZnVuY3Rpb25zIGF0IHJpbmcgMCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfQVNNQVBJIF9NVFJSX3NhdmVDUjQodm9pZCkKK3sKKyAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX1NBVkVDUjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Jlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9BU01BUEkgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCit7CisgICAgcGFybXNJblswXSA9IGNyNFZhbDsKKyAgICBDYWxsU0RESGVscChQTUhFTFBfUkVTVE9SRUNSNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKAorICAgIHVsb25nIHJlZywKKyAgICB1bG9uZyAqZWF4LAorICAgIHVsb25nICplZHgpCit7CisgICAgcGFybXNJblswXSA9IHJlZzsKKyAgICBDYWxsU0RESGVscChQTUhFTFBfUkVBRE1TUik7CisgICAgKmVheCA9IHBhcm1zT3V0WzBdOworICAgICplZHggPSBwYXJtc091dFsxXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitXcml0ZSBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0FTTUFQSSBfTVRSUl93cml0ZU1TUigKKyAgICB1bG9uZyByZWcsCisgICAgdWxvbmcgZWF4LAorICAgIHVsb25nIGVkeCkKK3sKKyAgICBwYXJtc0luWzBdID0gcmVnOworICAgIHBhcm1zSW5bMV0gPSBlYXg7CisgICAgcGFybXNJblsyXSA9IGVkeDsKKyAgICBDYWxsU0RESGVscChQTUhFTFBfV1JJVEVNU1IpOworfQorCitQTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCisgICAgY29uc3QgY2hhciAqc3pETExOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEKKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWhNb2R1bGU7CisgICAgKHZvaWQpc3pQcm9jTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyEKKyAgICAodm9pZCloTW9kdWxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKKyAgICBGSUxFRklOREJVRjMgKmJsaykKK3sKKyAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7CisKKyAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKKyAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOworICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9SRUFET05MWSkKKyAgICAgICAgZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOworICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9ESVJFQ1RPUlkpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7CisgICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX0FSQ0hJVkVEKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKKyAgICBpZiAoYmxrLT5hdHRyRmlsZSAmIEZJTEVfSElEREVOKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOworICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9TWVNURU0pCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07CisgICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+Y2JGaWxlOworICAgIGZpbmREYXRhLT5zaXplSGkgPSAwOworICAgIHN0cm5jcHkoZmluZERhdGEtPm5hbWUsYmxrLT5hY2hOYW1lLFBNX01BWF9QQVRIKTsKKyAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Cit9CisKKyNkZWZpbmUgRklORF9NQVNLICAgKEZJTEVfQVJDSElWRUQgfCBGSUxFX0RJUkVDVE9SWSB8IEZJTEVfU1lTVEVNIHwgRklMRV9ISURERU4gfCBGSUxFX1JFQURPTkxZKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgRklMRUZJTkRCVUYzICAgIGJsazsKKyAgICBIRElSICAgICAgICAgICAgaGRpciA9IEhESVJfQ1JFQVRFOworICAgIHVsb25nICAgICAgICAgICBjb3VudCA9IDE7CisKKyAgICBpZiAoRG9zRmluZEZpcnN0KChQU1opZmlsZW5hbWUsJmhkaXIsRklORF9NQVNLLCZibGssc2l6ZW9mKGJsayksJmNvdW50LEZJTF9TVEFOREFSRCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOworICAgICAgICByZXR1cm4gKHZvaWQqKWhkaXI7CisgICAgICAgIH0KKyAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCisgICAgdm9pZCAqaGFuZGxlLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICBGSUxFRklOREJVRjMgICAgYmxrOworICAgIHVsb25nICAgICAgICAgICBjb3VudCA9IDE7CisKKyAgICBpZiAoRG9zRmluZE5leHQoKEhESVIpaGFuZGxlLCZibGssc2l6ZW9mKGJsayksJmNvdW50KSA9PSBOT19FUlJPUikgeworICAgICAgICBjb252ZXJ0RmluZERhdGEoZmluZERhdGEsJmJsayk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKKyAgICB2b2lkICpoYW5kbGUpCit7CisgICAgRG9zRmluZENsb3NlKChIRElSKWhhbmRsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMCAgIC0gQ3VycmVudCBkcml2ZQorICAgIDEgICAtIERyaXZlIEE6CisgICAgMiAgIC0gRHJpdmUgQjoKKyAgICAzICAgLSBEcml2ZSBDOgorICAgIGV0YworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKKyAgICBjaGFyIGRyaXZlKQoreworICAgIHVsb25nICAgY250RGlzayxjbnREcml2ZU1hcDsKKyAgICBpYm9vbCAgIHZhbGlkOworCisgICAgRG9zUXVlcnlDdXJyZW50RGlzaygmY250RGlzaywmY250RHJpdmVNYXApOworICAgIHZhbGlkID0gKERvc1NldERlZmF1bHREaXNrKGRyaXZlKSA9PSBOT19FUlJPUik7CisgICAgRG9zU2V0RGVmYXVsdERpc2soY250RGlzayk7CisgICAgcmV0dXJuIHZhbGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCitVbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKK29mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9nZXRkY3dkKAorICAgIGludCBkcml2ZSwKKyAgICBjaGFyICpkaXIsCisgICAgaW50IGxlbikKK3sKKyAgICB1bG9uZyBsZW5ndGggPSBsZW47CisKKyAgICBEb3NRdWVyeUN1cnJlbnREaXIoZHJpdmUsIChQU1opZGlyLCAmbGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgdWludCBhdHRyaWIpCit7CisgICAgRklMRVNUQVRVUzMgczsKKworICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmcyxzaXplb2YocykpKQorICAgICAgICByZXR1cm47CisgICAgcy5hdHRyRmlsZSA9IDA7CisgICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCisgICAgICAgIHMuYXR0ckZpbGUgfD0gRklMRV9SRUFET05MWTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQorICAgICAgICBzLmF0dHJGaWxlIHw9IEZJTEVfQVJDSElWRUQ7CisgICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQorICAgICAgICBzLmF0dHJGaWxlIHw9IEZJTEVfSElEREVOOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKKyAgICAgICAgcy5hdHRyRmlsZSB8PSBGSUxFX1NZU1RFTTsKKyAgICBEb3NTZXRQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpLDBMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRklMRVNUQVRVUzMgZnMzOworICAgIHVpbnQgICAgICAgIHJldHZhbCA9IDA7CisKKyAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLCBGSUxfU1RBTkRBUkQsICZmczMsIHNpemVvZihGSUxFU1RBVFVTMykpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZnMzLmF0dHJGaWxlICYgRklMRV9SRUFET05MWSkKKyAgICAgICAgcmV0dmFsIHw9IFBNX0ZJTEVfUkVBRE9OTFk7CisgICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfQVJDSElWRUQpCisgICAgICAgIHJldHZhbCB8PSBQTV9GSUxFX0FSQ0hJVkU7CisgICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfSElEREVOKQorICAgICAgICByZXR2YWwgfD0gUE1fRklMRV9ISURERU47CisgICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfU1lTVEVNKQorICAgICAgICByZXR2YWwgfD0gUE1fRklMRV9TWVNURU07CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fbWtkaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIERvc0NyZWF0ZURpcigoUFNaKWZpbGVuYW1lLE5VTEwpID09IE5PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4gRG9zRGVsZXRlRGlyKChQU1opZmlsZW5hbWUpID09IE5PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgRklMRVNUQVRVUzMgZnMzOworICAgIHN0cnVjdCB0bSAgIHRjOworICAgIHN0cnVjdCB0bSAgICpyZXQ7CisgICAgdGltZV90ICAgICAgdHQ7CisKKyAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLCBGSUxfU1RBTkRBUkQsICZmczMsIHNpemVvZihGSUxFU1RBVFVTMykpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdtVGltZSkgeworICAgICAgICB0Yy50bV95ZWFyID0gZnMzLmZkYXRlTGFzdFdyaXRlLnllYXIgKyA4MDsKKyAgICAgICAgdGMudG1fbW9uID0gZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoIC0gMTsKKyAgICAgICAgdGMudG1fbWRheSA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5kYXk7CisgICAgICAgIHRjLnRtX2hvdXIgPSBmczMuZnRpbWVMYXN0V3JpdGUuaG91cnM7CisgICAgICAgIHRjLnRtX21pbiA9IGZzMy5mdGltZUxhc3RXcml0ZS5taW51dGVzOworICAgICAgICB0Yy50bV9zZWMgPSBmczMuZnRpbWVMYXN0V3JpdGUudHdvc2VjcyAqIDI7CisgICAgICAgIGlmKCh0dCA9IG1rdGltZSgmdGMpKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYoIShyZXQgPSBnbXRpbWUoJnR0KSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHRpbWUtPnNlYyA9IHJldC0+dG1fc2VjOworICAgICAgICB0aW1lLT5kYXkgPSByZXQtPnRtX21kYXk7CisgICAgICAgIHRpbWUtPm1vbiA9IHJldC0+dG1fbW9uICsgMTsKKyAgICAgICAgdGltZS0+eWVhciA9IHJldC0+dG1feWVhciAtIDgwOworICAgICAgICB0aW1lLT5taW4gPSByZXQtPnRtX21pbjsKKyAgICAgICAgdGltZS0+aG91ciA9IHJldC0+dG1faG91cjsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lLT5zZWMgPSBmczMuZnRpbWVMYXN0V3JpdGUudHdvc2VjcyAqIDI7CisgICAgICAgIHRpbWUtPmRheSA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5kYXk7CisgICAgICAgIHRpbWUtPm1vbiA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aDsKKyAgICAgICAgdGltZS0+eWVhciA9IGZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyOworICAgICAgICB0aW1lLT5taW4gPSBmczMuZnRpbWVMYXN0V3JpdGUubWludXRlczsKKyAgICAgICAgdGltZS0+aG91ciA9IGZzMy5mdGltZUxhc3RXcml0ZS5ob3VyczsKKyAgICAgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgRklMRVNUQVRVUzMgZnMzOworICAgIHN0cnVjdCB0bSAgIHRjOworICAgIHN0cnVjdCB0bSAgICpyZXQ7CisgICAgdGltZV90ICAgICAgdHQ7CisKKyAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJmZzMyxzaXplb2YoZnMzKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZ21UaW1lKSB7CisgICAgICAgIHRjLnRtX3llYXIgPSB0aW1lLT55ZWFyICsgODA7CisgICAgICAgIHRjLnRtX21vbiA9IHRpbWUtPm1vbiAtIDE7CisgICAgICAgIHRjLnRtX21kYXkgPSB0aW1lLT5kYXk7CisgICAgICAgIHRjLnRtX2hvdXIgPSB0aW1lLT5ob3VyOworICAgICAgICB0Yy50bV9taW4gPSB0aW1lLT5taW47CisgICAgICAgIHRjLnRtX3NlYyA9IHRpbWUtPnNlYzsKKyAgICAgICAgaWYoKHR0ID0gbWt0aW1lKCZ0YykpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXQgPSBsb2NhbHRpbWUoJnR0KTsKKyAgICAgICAgZnMzLmZ0aW1lTGFzdFdyaXRlLnR3b3NlY3MgPSByZXQtPnRtX3NlYyAvIDI7CisgICAgICAgIGZzMy5mZGF0ZUxhc3RXcml0ZS5kYXkgPSByZXQtPnRtX21kYXk7CisgICAgICAgIGZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aCA9IHJldC0+dG1fbW9uICsgMTsKKyAgICAgICAgZnMzLmZkYXRlTGFzdFdyaXRlLnllYXIgPSByZXQtPnRtX3llYXIgLSA4MDsKKyAgICAgICAgZnMzLmZ0aW1lTGFzdFdyaXRlLm1pbnV0ZXMgPSByZXQtPnRtX21pbjsKKyAgICAgICAgZnMzLmZ0aW1lTGFzdFdyaXRlLmhvdXJzID0gcmV0LT50bV9ob3VyOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzID0gdGltZS0+c2VjIC8gMjsKKyAgICAgICAgZnMzLmZkYXRlTGFzdFdyaXRlLmRheSA9IHRpbWUtPmRheTsKKyAgICAgICAgZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoID0gdGltZS0+bW9uOworICAgICAgICBmczMuZmRhdGVMYXN0V3JpdGUueWVhciA9IHRpbWUtPnllYXI7CisgICAgICAgIGZzMy5mdGltZUxhc3RXcml0ZS5taW51dGVzID0gdGltZS0+bWluOworICAgICAgICBmczMuZnRpbWVMYXN0V3JpdGUuaG91cnMgPSB0aW1lLT5ob3VyOworICAgICAgICB9CisgICAgbWVtY3B5KCZmczMuZmRhdGVMYXN0QWNjZXNzLCAmZnMzLmZkYXRlTGFzdFdyaXRlLCBzaXplb2YoRkRBVEUpKTsKKyAgICBtZW1jcHkoJmZzMy5mZGF0ZUNyZWF0aW9uLCAmZnMzLmZkYXRlTGFzdFdyaXRlLCBzaXplb2YoRkRBVEUpKTsKKyAgICBtZW1jcHkoJmZzMy5mdGltZUxhc3RBY2Nlc3MsICZmczMuZnRpbWVMYXN0V3JpdGUsIHNpemVvZihGVElNRSkpOworICAgIG1lbWNweSgmZnMzLmZ0aW1lQ3JlYXRpb24sICZmczMuZnRpbWVMYXN0V3JpdGUsIHNpemVvZihGVElNRSkpOworICAgIERvc1NldFBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmZnMzLHNpemVvZihGSUxFU1RBVFVTMyksMEwpOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzllZjJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3ZmbGF0LmMKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKworaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCit7CisgICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKKyAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOworICAgIGNvZGVMZW4gPSBjb2RlTGVuOworICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmZlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvenRpbWVyLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIE9TLzIKKyoKKyogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdWxvbmcgICAgZnJlcXVlbmN5OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX19aVGltZXJJbml0KHZvaWQpCit7CisgICAgRG9zVG1yUXVlcnlGcmVxKCZmcmVxdWVuY3kpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPbih0bSkgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopJnRtLT5zdGFydCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7CisKKyAgICBEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKikmdG1MYXApOworICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bUxhcCwmdG1Db3VudCk7CisgICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGZyZXF1ZW5jeSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopJnRtLT5lbmQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgQ1BVX2xhcmdlSW50ZWdlciB0bUNvdW50OworCisgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOworICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQoreworICAgIFVMT05HICAgY291bnQ7CisgICAgRG9zUXVlcnlTeXNJbmZvKCBRU1ZfTVNfQ09VTlQsIFFTVl9NU19DT1VOVCwgJmNvdW50LCBzaXplb2YoVUxPTkcpICk7CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKK3doZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bworYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcworcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCit7IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjMmNhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIElCTSBQQyAoT1MvMikKKyoKKyogRGVzY3JpcHRpb246ICBPUy8yIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQorKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50ICAgICAgICAgIG9sZE1vdXNlU3RhdGU7ICAgICAgLyogT2xkIG1vdXNlIHN0YXRlICAgICAgICAgICAgICAqLworc3RhdGljIHVsb25nICAgICAgICBvbGRLZXlNZXNzYWdlOyAgICAgIC8qIE9sZCBrZXlib2FyZCBzdGF0ZSAgICAgICAgICAgKi8KK3N0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCitzdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLworSE1PVSAgICAgICAgICAgICAgICBfRVZUX2hNb3VzZTsgICAgICAgIC8qIEhhbmRsZSB0byB0aGUgbW91c2UgZHJpdmVyICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIE9TLzIgKi8KKyNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQorI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAorCitSRU1BUktTOgorVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBPUy8yIGludG8gb3VyIGV2ZW50IHF1ZXVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIE9TLzIgUHJlc2VudGF0aW9uIE1hbmFnZXIgYXBwcyEKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCitrZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KK2NvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQorQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCitidXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawordG8gdGhlIHJhdyBmb3JtYXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX2Fib3J0KCkKK3sKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOworICAgIGluaXRFdmVudFF1ZXVlKCk7CisgICAgb2xkTW91c2VTdGF0ZSA9IDA7CisgICAgb2xkS2V5TWVzc2FnZSA9IDA7CisgICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7CisKKyAgICAvLyBUT0RPOiBPUy8yIFBNIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGNvZGUhCisKKyAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCisgICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKK3NwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKK21vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzKQoreworICAgIHJhbmdlWCA9IHhSZXM7CisgICAgcmFuZ2VZID0geVJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfcmVzdW1lKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgT1MvMgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bworZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9zdXNwZW5kKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgT1MvMgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX2V4aXQodm9pZCkKK3sKKyAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLworICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKworICAgIC8vIFRPRE86IE9TLzIgUE0gc3BlY2lmaWMgZXhpdCBjb2RlCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitNb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKK2FuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjlmODIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9vc2hkci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKKyNkZWZpbmUgSU5DTF9ET1MKKyNkZWZpbmUgSU5DTF9TVUIKKyNkZWZpbmUgSU5DTF9WSU8KKyNkZWZpbmUgSU5DTF9LQkQKKyNpbmNsdWRlIDxvczIuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGU1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIHRvIHB1bGwgaW4gT1Mgc3BlY2lmaWMgaGVhZGVycyBmb3IgdGhlIHRhcmdldAorKiAgICAgICAgICAgICAgIE9TIGVudmlyb25tZW50LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICAgICBkZWZpbmVkKF9fU01YMzJfXykKKyNpbmNsdWRlICJzbXgvb3NoZHIuaCIKKyNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCisjaW5jbHVkZSAicnR0YXJnZXQvb3NoZHIuaCIKKyNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKKyNpbmNsdWRlICJkb3Mvb3NoZHIuaCIKKyNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQorI2luY2x1ZGUgInZ4ZC9vc2hkci5oIgorI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCisjaW5jbHVkZSAibnRkcnYvb3NoZHIuaCIKKyNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQorI2luY2x1ZGUgIndpbjMyL29zaGRyLmgiCisjZWxpZiAgIGRlZmluZWQoX19PUzJfVkREX18pCisjaW5jbHVkZSAidnhkL29zaGRyLmgiCisjZWxpZiAgIGRlZmluZWQoX19PUzJfXykKKyNpZiAgICAgZGVmaW5lZChfX09TMl9QTV9fKQorI2luY2x1ZGUgIm9zMnBtL29zaGRyLmgiCisjZWxzZQorI2luY2x1ZGUgIm9zMi9vc2hkci5oIgorI2VuZGlmCisjZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQorI2lmICAgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQorI2luY2x1ZGUgIngxMS9vc2hkci5oIgorI2Vsc2UKKyNpbmNsdWRlICJsaW51eC9vc2hkci5oIgorI2VuZGlmCisjZWxpZiAgIGRlZmluZWQoX19RTlhfXykKKyNpZiAgICAgZGVmaW5lZChfX1VTRV9QSE9UT05fXykKKyNpbmNsdWRlICJwaG90b24vb3NoZHIuaCIKKyNlbGlmICAgZGVmaW5lZChfX1VTRV9YMTFfXykKKyNpbmNsdWRlICJ4MTEvb3NoZHIuaCIKKyNlbHNlCisjaW5jbHVkZSAicW54L29zaGRyLmgiCisjZW5kaWYKKyNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKKyNpbmNsdWRlICJiZW9zL29zaGRyLmgiCisjZWxzZQorI2Vycm9yICBQTSBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4ZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUU5YIFBob3RvbiBHVUkKKyoKKyogRGVzY3JpcHRpb246ICBRTlggZnVsbHNjcmVlbiBjb25zb2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaAorKiAgICAgICAgICAgICAgIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgTGludXggKi8KKyNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQorI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAorCitSRU1BUktTOgorVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBfRVZUX2lzS2V5RG93bigKKyAgICB1Y2hhciBzY2FuY29kZSkKK3sKKyAgICByZXR1cm4gKEtleVN0YXRlWyhzY2FuY29kZSAmIDB4ZjgpID4+IDNdICYgKDEgPDwgKHNjYW5jb2RlICYgMHg3KSkgPworICAgICAgICB0cnVlIDogZmFsc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHJpZXZlcyBhbGwgZXZlbnRzIGZyb20gdGhlIG1vdXNlL2tleWJvYXJkIGV2ZW50IHF1ZXVlIGFuZCBzdHVmZnMgdGhlbQoraW50byB0aGUgTUdMIGV2ZW50IHF1ZXVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKK3sKKyAgICBpbnQgICAgICAgICBwaWQ7CisgICAgdWludCAgICAgICAgICAgIG1zZywgYnV0X3N0YXQsIG1lc3NhZ2U7CisgICAgdWNoYXIgICAgICAgICAgIGV2dFtzaXplb2YgKFBoRXZlbnRfdCkgKyAxMDI0XTsKKyAgICBQaEV2ZW50X3QgICAgICAgKmV2ZW50ID0gKHZvaWQgKilldnQ7CisgICAgUGhLZXlFdmVudF90ICAgICAgICAqa2V5OworICAgIFBoUG9pbnRlckV2ZW50X3QgICAgKm1vdXNlOworICAgIHN0YXRpYyBpbnQgICAgICBleHRlbmRlZDsKKyAgICBldmVudF90ICAgICAgICAgX2V2dDsKKworICAgIHdoaWxlIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgdWludCAgICBtb2RzID0gMCwga2V5cCA9IDA7CisKKyAgICAgICAgcGlkID0gQ3JlY2VpdmUoMCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKKworICAgICAgICBpZiAocGlkID09IC0xKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChQaEV2ZW50UmVhZChwaWQsIGV2ZW50LCBzaXplb2YgKGV2dCkpID09IFBoX0VWRU5UX01TRykgeworICAgICAgICAgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZiAoZXZ0KSk7CisgICAgICAgICAgICBpZiAoZXZlbnQtPnR5cGUgPT0gUGhfRVZfS0VZKSB7CisgICAgICAgICAgICAgICAga2V5ID0gUGhHZXREYXRhKGV2ZW50KTsKKworICAgICAgICAgICAgICAgIGlmIChrZXktPmtleV9mbGFncyAmIEtFWV9TQ0FOX1ZBTElEKSB7CisgICAgICAgICAgICAgICAgICAgIGtleXAgPSBrZXktPmtleV9zY2FuOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LT5rZXlfZmxhZ3MgJiBLRVlfRE9XTikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVN0YXRlWyhrZXlwICYgMHhmODAwKSA+PiAxMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PSAxIDw8ICgoa2V5cCAmIDB4NzAwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgS2V5U3RhdGVbKGtleXAgJiAweGY4MDApID4+IDExXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oMSA8PCAoKGtleXAgJiAweDcwMCkgPj4gOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGtleS0+a2V5X2ZsYWdzICYgS0VZX1NZTV9WQUxJRCkgfHwgZXh0ZW5kZWQpCisgICAgICAgICAgICAgICAgICAgIGtleXAgfD0ga2V5LT5rZXlfc3ltOworCisgICAgICAgICAgICAgICAgLyogTm8gd2F5IHRvIHRlbGwgbGVmdCBmcm9tIHJpZ2h0Li4uICovCisgICAgICAgICAgICAgICAgaWYgKGtleS0+a2V5X21vZHMgJiBLRVlNT0RfU0hJRlQpCisgICAgICAgICAgICAgICAgICAgIG1vZHMgPSAoRVZUX0xFRlRTSElGVCB8IEVWVF9SSUdIVFNISUZUKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9DVFJMKQorICAgICAgICAgICAgICAgICAgICBtb2RzIHw9IChFVlRfQ1RSTFNUQVRFIHwgRVZUX0xFRlRDVFJMKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9BTFQpCisgICAgICAgICAgICAgICAgICAgIG1vZHMgfD0gKEVWVF9BTFRTVEFURSB8IEVWVF9MRUZUQUxUKTsKKworICAgICAgICAgICAgICAgIF9ldnQud2hlbiA9IGV2dC0+dGltZXN0YW1wOworICAgICAgICAgICAgICAgIGlmIChrZXktPmtleV9mbGFncyAmIEtFWV9SRVBFQVQpIHsKKyAgICAgICAgICAgICAgICAgICAgX2V2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKKyAgICAgICAgICAgICAgICAgICAgX2V2dC5tZXNzYWdlID0gMHgxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX0RPV04pCisgICAgICAgICAgICAgICAgICAgIF9ldnQud2hhdCA9IEVWVF9LRVlET1dOOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX2V2dC53aGF0ID0gRVZUX0tFWVVQOworICAgICAgICAgICAgICAgIF9ldnQubW9kaWZpZXJzID0gbW9kczsKKyAgICAgICAgICAgICAgICBfZXZ0Lm1lc3NhZ2UgfD0ga2V5cDsKKworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZfZXZ0KTsKKworICAgICAgICAgICAgICAgIHN3aXRjaChrZXktPmtleV9zY2FuICYgMHhmZjAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHhlMDAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHhlMDAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlICYgUGhfRVZfUFRSX0FMTCkgeworICAgICAgICAgICAgICAgIGJ1dF9zdGF0ID0gbWVzc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgbW91c2UgPSBQaEdldERhdGEoZXZlbnQpOworCisgICAgICAgICAgICAgICAgaWYgKG1vdXNlLT5idXR0b25fc3RhdGUgJiBQaF9CVVRUT05fMykKKyAgICAgICAgICAgICAgICAgICAgYnV0X3N0YXQgPSBFVlRfTEVGVEJVVDsKKyAgICAgICAgICAgICAgICBpZiAobW91c2UtPmJ1dHRvbnMgJiBQaF9CVVRUT05fMykKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisKKyAgICAgICAgICAgICAgICBpZiAobW91c2UtPmJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl8xKQorICAgICAgICAgICAgICAgICAgICBidXRfc3RhdCB8PSBFVlRfUklHSFRCVVQ7CisgICAgICAgICAgICAgICAgaWYgKG1vdXNlLT5idXR0b25zICYgUGhfQlVUVE9OXzEpIAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHw9IEVWVF9SSUdIVEJNQVNLOworCisgICAgICAgICAgICAgICAgX2V2dC53aGVuID0gZXZ0LT50aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LT50eXBlICYgUGhfRVZfUFRSX01PVElPTikgeworICAgICAgICAgICAgICAgICAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOworICAgICAgICAgICAgICAgICAgICBfZXZ0LndoZXJlX3ggPSBtb3VzZS0+cG9zLng7CisgICAgICAgICAgICAgICAgICAgIF9ldnQud2hlcmVfeSA9IG1vdXNlLT5wb3MueTsKKyAgICAgICAgICAgICAgICAgICAgX2V2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKKyAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJl9ldnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LT50eXBlICYgUGhfRVZfQlVUX1BSRVNTKQorICAgICAgICAgICAgICAgICAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX2V2dC53aGF0ID0gRVZUX01PVVNFVVA7CisgICAgICAgICAgICAgICAgX2V2dC53aGVyZV94ID0gbW91c2UtPnBvcy54OworICAgICAgICAgICAgICAgIF9ldnQud2hlcmVfeSA9IG1vdXNlLT5wb3MueTsKKyAgICAgICAgICAgICAgICBfZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OworICAgICAgICAgICAgICAgIF9ldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgYWRkRXZlbnQoJl9ldnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0VWVF9hYm9ydCgKKyAgICBpbnQgc2lnbm8pCit7CisgICAgY2hhciAgICBidWZbODBdOworCisgICAgRVZUX2V4aXQoKTsKKyAgICBzcHJpbnRmKGJ1ZiwiVGVybWluYXRpbmcgb24gc2lnbmFsICVkIixzaWdubyk7CisgICAgUE1fZmF0YWxFcnJvcihidWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAorCitSRU1BUktTOgorSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgordG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAordGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgorCitXZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCitldmVudCBoYW5kbGluZyByb3V0aW5lcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfaW5pdCgKKyAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQoreworICAgIGludCAgICAgICAgIGk7CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLworICAgIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7CisgICAgaW5pdEV2ZW50UXVldWUoKTsKKyAgICBtZW1zZXQoKHZvaWQgKilLZXlTdGF0ZSwgMCwgc2l6ZW9mIChLZXlTdGF0ZSkpOworCisgICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLworICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0NoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCitzcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCittb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKKyAgICBpbnQgeFJlcywKKyAgICBpbnQgeVJlcykKK3sKKyAgICAvLyBUT0RPOiBOZWVkIHRvIGNhbGwgSW5wdXQgdG8gY2hhbmdlIHRoZSBjb29yZGluYXRlcyB0aGF0IGl0IHJldHVybnMKKyAgICAvLyAgICAgICBmb3IgbW91c2UgZXZlbnRzISEKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfcmVzdW1lKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgUGhvdG9uCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitTdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCitkZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3N1c3BlbmQodm9pZCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGZvciBQaG90b24KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0V4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9leGl0KHZvaWQpCit7CisgICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzI1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUU5YIFBob3RvbiBHVUkKKyoKKyogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5cy9tb3VzZS5oPgorI2luY2x1ZGUgPHN5cy9rZXlib2FyZC5oPgorI2luY2x1ZGUgPHN5cy9mZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPFBoLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlNjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtLnZwdwpAQCAtMCwwICsxLDQzIEBACitbRGVwZW5kZW5jaWVzXQ0KK1tDdXJyZW50UHJvamVjdF0NCitjdXJwcm9qPXBtbGludXgudnBqDQorW1Byb2plY3RGaWxlc10NCitwbWNvbW1vbi52cGoNCitwbWRvcy52cGoNCitwbWxpbnV4LnZwag0KK3BtcW54LnZwag0KK3BtdnhkLnZwag0KK3Btd2luMzIudnBqDQorel9zYW1wbGVzLnZwag0KKy4uXGEtZ2xvYmFsIGluY2x1ZGVzLnZwag0KK1tUcmVlRXhwYW5zaW9uXQ0KKyIuLlxhLWdsb2JhbCBpbmNsdWRlcy52cGoiIDANCitwbWNvbW1vbi52cGogMA0KK3BtZG9zLnZwaiAwDQorcG1saW51eC52cGogMA0KK3BtcW54LnZwaiAwDQorcG12eGQudnBqIDANCitwbXdpbjMyLnZwaiAwDQorel9zYW1wbGVzLnZwaiAxIDENCitbU3RhdGVdDQorU0NSRUVOOiAxMjgwIDEwMjQgMCAwIDk2MCA3NDYgMCAwIE0gMCAwIDAgMCA5NzcgNjMxDQorQ1dEOiBDOlxzY2l0ZWNoXHNyY1xwbQ0KK0ZJTEVISVNUOiA5DQorQzpcc2NpdGVjaFxtYWtlZGVmc1xnY2Nfd2luMzIubWsNCitDOlxzY2l0ZWNoXGJpblxnY2MyLXczMi5iYXQNCitDOlxzY2l0ZWNoXGJpblxnY2MyLWMzMi5iYXQNCitDOlxzY2l0ZWNoXGJpblxnY2MyLWxpbnV4LmJhdA0KK0M6XHNjaXRlY2hcbWFrZWRlZnNcZ2NjX2xpbnV4Lm1rDQorQzpcc2NpdGVjaFxzcmNccG1cbGludXhcZXZlbnQuYw0KK0M6XHNjaXRlY2hcc3JjXHBtXGxpbnV4XG9zaGRyLmgNCitDOlxzY2l0ZWNoXHNyY1xwbVxldmVudC5jDQorQzpcc2NpdGVjaFxzcmNccG1ccG1saW51eC52cGoNCitbUHJvamVjdERhdGVzXQ0KK3BtY29tbW9uLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KK3BtZG9zLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KK3BtbGludXgudnBqPTIwMDEwNjIwMTc1ODI5ODEyDQorcG1xbngudnBqPTIwMDEwNTE3MTY0MzM1MjkwDQorcG12eGQudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQorcG13aW4zMi52cGo9MjAwMTA1MTcxNjQzMzUzMDYNCit6X3NhbXBsZXMudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQorLi5cYS1nbG9iYWwgaW5jbHVkZXMudnBqPTIwMDEwNTE3MTY0MzM0OTc4DQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Yjg3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWNvbW1vbi52cGoKQEAgLTAsMCArMSw0NSBAQAorW0NPTVBJTEVSXQ0KK3ZlcnNpb249NS4wYg0KK01BQ1JPPVxuDQorYWN0aXZlY29uZmlnPSx3YzEwLWQzMg0KK0ZJTFRFUk5BTUU9U291cmNlIEZpbGVzXG5JbmNsdWRlIEZpbGVzXG5Bc3NlbWJsZXIgRmlsZXNcbk90aGVyIEZpbGVzXG4NCitGSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbiouKlxuDQorRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgMCAwIDAgDQorRklMVEVSQVBQQ09NTUFORD1cblxuXG5cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxoaWRlfDpDb21waWxlOiZDb21waWxlLA0KK21ha2U9Y29uY3VyfGNhcHR1cmV8aGlkZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsDQorcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxoaWRlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsDQorZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KK2V4ZWN1dGU9aGlkZXxzYXZlbm9uZXw6RXhlY3V0ZTpFJnhlY3V0ZSwNCit1c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KK3VzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQord29ya2luZ2Rpcj0uDQoraW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KK3JlZmZpbGU9DQorW0ZJTEVTXQ0KK2NvbW1vbi5jDQorY3B1aW5mby5jDQorZGVidWcuYw0KK2V2ZW50LmMNCittYWtlZmlsZQ0KK29zaGRyLmgNCit6dGltZXIuYw0KKy4uXGNvbW1vblxhZ3BsaWIuYw0KK2NvZGVwYWdlXHVzX2VuZy5jDQorY29tbW9uXF9jcHVpbmZvLmFzbQ0KK2NvbW1vblxfZG1hLmFzbQ0KK2NvbW1vblxfaW50NjQuYXNtDQorY29tbW9uXF9qb3kuYXNtDQorY29tbW9uXF9tdHJyLmFzbQ0KK2NvbW1vblxfcGNpbGliLmFzbQ0KK2NvbW1vblxhZ3AuYw0KK2NvbW1vblxrZXlib2FyZC5jDQorY29tbW9uXG1hbGxvYy5jDQorY29tbW9uXG10cnIuYw0KK2NvbW1vblxwY2lsaWIuYw0KK2NvbW1vblx1bml4aW8uYw0KK2NvbW1vblx2Z2FzdGF0ZS5jDQorW0FTU09DSUFUSU9OXQ0KK1tDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWRvcy52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWRvcy52cGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1NzUxMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtZG9zLnZwagpAQCAtMCwwICsxLDQxIEBACitbU2NpVGVjaF0NCitjb21waWxlcj13YzEwLSANCit0YXJnZXRvcz1kMzIgDQorW0NPTVBJTEVSXQ0KK3ZlcnNpb249NS4wYg0KK01BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCithY3RpdmVjb25maWc9LFRFU1RfSEFSTkVTUz0xDQorRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQorRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCitGSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgDQorRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCit2Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KK3Zjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KK2NvbXBpbGU9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqIC11ICViDQorbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbCAlYg0KK3JlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUgJWINCitkZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQorZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KK3VzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQordXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCit1c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6Q2xlYW4gRGlyZWN0b3J5OkMmbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCit3b3JraW5nZGlyPS4NCitpbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQorcmVmZmlsZT0NCitbRklMRVNdDQorZG9zXF9ldmVudC5hc20NCitkb3NcX2x6dGltZXIuYXNtDQorZG9zXF9wbS5hc20NCitkb3NcX3BtZG9zLmFzbQ0KK2Rvc1xfdmZsYXQuYXNtDQorZG9zXGNwdWluZm8uYw0KK2Rvc1xldmVudC5jDQorZG9zXG9zaGRyLmgNCitkb3NccG0uYw0KK2Rvc1xwbWRvcy5jDQorZG9zXHZmbGF0LmMNCitkb3NcenRpbWVyLmMNCitbQVNTT0NJQVRJT05dDQorW0NPTkZJR1VSQVRJT05TXQ0KK2NvbmZpZz0sTk9STUFMX0JVSUxEPTENCitjb25maWc9LFRFU1RfSEFSTkVTUz0xDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1saW51eC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWxpbnV4LnZwagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmZiZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1saW51eC52cGoKQEAgLTAsMCArMSwzNSBAQAorW1NjaVRlY2hdDQorY29tcGlsZXI9Z2NjMi0NCit0YXJnZXRvcz1saW51eA0KK1tDT01QSUxFUl0NCit2ZXJzaW9uPTUuMGINCitNQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQorRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQorRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCitGSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCitGSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorYWN0aXZlY29uZmlnPSxpbnN0YWxsIEJVSUxEX0RMTD0xDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vIC11DQorbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgJWINCityZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSAtdSAlYg0KK2RlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCitleGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQordXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCit1c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KK3VzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KK3dvcmtpbmdkaXI9Lg0KK2luY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCityZWZmaWxlPQ0KK1tGSUxFU10NCitsaW51eFxjcHVpbmZvLmMNCitsaW51eFxldmVudC5jDQorbGludXhcb3NoZHIuaA0KK2xpbnV4XHBtLmMNCitsaW51eFx2ZmxhdC5jDQorbGludXhcenRpbWVyLmMNCitbQVNTT0NJQVRJT05dDQorW0NPTkZJR1VSQVRJT05TXQ0KK2NvbmZpZz0saW5zdGFsbCBCVUlMRF9ETEw9MQ0KK2NvbmZpZz0saW5zdGFsbA0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1udGRydi52cGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjMzVhNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqCkBAIC0wLDAgKzEsMzkgQEAKK1tTY2lUZWNoXQ0KK2NvbXBpbGVyPXZjNjAtIA0KK3RhcmdldG9zPWRydncyaw0KK1tDT01QSUxFUl0NCit2ZXJzaW9uPTUuMGINCitNQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQorYWN0aXZlY29uZmlnPSx3YzEwLWQzMg0KK0ZJTFRFUk5BTUU9U291cmNlIEZpbGVzXG5JbmNsdWRlIEZpbGVzXG5Bc3NlbWJsZXIgRmlsZXNcbg0KK0ZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuKi5oXG4qLmFzbVxuDQorRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgMCAwDQorRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCit2Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KK3Zjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KK2NvbXBpbGU9Y29uY3VyfGNhcHR1cmV8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqDQorbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbA0KK3JlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUNCitkZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQorZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KK3VzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQordXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCit1c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6Q2xlYW4gRGlyZWN0b3J5OiZDbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCit3b3JraW5nZGlyPS4NCitpbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQorcmVmZmlsZT0NCitbRklMRVNdDQorLi5cLi5caW5jbHVkZVxudGRyaXZlci5oDQorbnRkcnZcX3BtLmFzbQ0KK250ZHJ2XGNwdWluZm8uYw0KK250ZHJ2XGludDg2LmMNCitudGRydlxpcnEuYw0KK250ZHJ2XG1lbS5jDQorbnRkcnZcb3NoZHIuaA0KK250ZHJ2XHBtLmMNCitudGRydlxzdGRpby5jDQorbnRkcnZcc3RkbGliLmMNCitudGRydlx2ZmxhdC5jDQorbnRkcnZcenRpbWVyLmMNCitbQVNTT0NJQVRJT05dDQorW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtcW54LnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtcW54LnZwagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQxNzAyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1xbngudnBqCkBAIC0wLDAgKzEsMzUgQEAKK1tTY2lUZWNoXQ0KK2NvbXBpbGVyPXdjMTAtDQordGFyZ2V0b3M9cW54DQorW0NPTVBJTEVSXQ0KK3ZlcnNpb249NS4wYg0KK01BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCithY3RpdmVjb25maWc9LHdjMTAtZDMyDQorRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQorRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCitGSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCitGSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCittYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQorcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KK2RlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCitleGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQordXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCit1c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KK3VzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KK3dvcmtpbmdkaXI9Lg0KK2luY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCityZWZmaWxlPQ0KK1tGSUxFU10NCitxbnhcX210cnJxbnguYXNtDQorcW54XGNwdWluZm8uYw0KK3FueFxldmVudC5jDQorcW54XG10cnJxbnguYw0KK3FueFxvc2hkci5oDQorcW54XHBtLmMNCitxbnhcdmZsYXQuYw0KK3FueFx6dGltZXIuYw0KK1tBU1NPQ0lBVElPTl0NCitbQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2Y5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXZ4ZC52cGoKQEAgLTAsMCArMSwzNCBAQAorW1NjaVRlY2hdDQorY29tcGlsZXI9YmM1MC0NCit0YXJnZXRvcz12eGQNCitbQ09NUElMRVJdDQordmVyc2lvbj01LjBiDQorTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KK2FjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCitGSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCitGSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KK0ZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCitGSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxub2NoYW5nZWRpcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCittYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8bm9jaGFuZ2VkaXJ8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQorcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfG5vY2hhbmdlZGlyfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KK2RlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkRlYnVnOiZEZWJ1ZywNCitleGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQordXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCit1c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KK3VzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KK3dvcmtpbmdkaXI9Lg0KK2luY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCityZWZmaWxlPQ0KK1tGSUxFU10NCit2eGRcX3BtLmFzbQ0KK3Z4ZFxjcHVpbmZvLmMNCit2eGRcZmlsZWlvLmMNCit2eGRcb3NoZHIuaA0KK3Z4ZFxwbS5jDQordnhkXHZmbGF0LmMNCit2eGRcenRpbWVyLmMNCitbQVNTT0NJQVRJT05dDQorW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG13aW4zMi52cGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlNjgyMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqCkBAIC0wLDAgKzEsMzUgQEAKK1tTY2lUZWNoXQ0KK2NvbXBpbGVyPXZjNjAtIA0KK3RhcmdldG9zPWMzMiANCitbQ09NUElMRVJdDQordmVyc2lvbj01LjBiDQorTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KK2FjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCitGSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCitGSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KK0ZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCitGSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCittYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQorcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KK2RlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCitleGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQordXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCit1c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KK3VzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxzYXZlbm9uZXw6Q2xlYW4gRGlyZWN0b3J5OiZDbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCit3b3JraW5nZGlyPS4NCitpbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQorcmVmZmlsZT0NCitbRklMRVNdDQord2luMzJcX3Btd2luMzIuYXNtDQord2luMzJcY3B1aW5mby5jDQord2luMzJcZGRyYXcuYw0KK3dpbjMyXGV2ZW50LmMNCit3aW4zMlxvc2hkci5oDQord2luMzJccG0uYw0KK3dpbjMyXHZmbGF0LmMNCit3aW4zMlx6dGltZXIuYw0KK1tBU1NPQ0lBVElPTl0NCitbQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L19tdHJycW54LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzZmUxMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20KQEAgLTAsMCArMSwyMjYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIE5BU00KKzsqIEVudmlyb25tZW50OiBRTlgKKzsqCis7KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcgorOyogICAgICAgICAgICAgIChNVFJSKSBtb2R1bGUgZm9yIFFOWC4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCisKK2hlYWRlciAgICAgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitiZWdkYXRhc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitpZmRlZiAgIFVTRV9OQVNNCislZGVmaW5lIFIwX0ZMVVNIX1RMQiAgICAwCislZGVmaW5lIFIwX1NBVkVfQ1I0ICAgICAxCislZGVmaW5lIFIwX1JFU1RPUkVfQ1I0ICAyCislZGVmaW5lIFIwX1JFQURfTVNSICAgICAzCislZGVmaW5lIFIwX1dSSVRFX01TUiAgICA0CitlbHNlCitSMF9GTFVTSF9UTEIgICAgICAgIEVRVSAwCitSMF9TQVZFX0NSNCAgICAgICAgIEVRVSAxCitSMF9SRVNUT1JFX0NSNCAgICAgIEVRVSAyCitSMF9SRUFEX01TUiAgICAgICAgIEVRVSAzCitSMF9XUklURV9NU1IgICAgICAgIEVRVSA0CitlbmRpZgorCitjcHVibGljIF9QTV9SMAorX1BNX1IwX3NlcnZpY2UgICAgICBkZCAgMAorX1BNX1IwX3JlZyAgICAgICAgICBkZCAgMAorX1BNX1IwX2VheCAgICAgICAgICBkZCAgMAorX1BNX1IwX2VkeCAgICAgICAgICBkZCAgMAorCitlbmRkYXRhc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitiZWdjb2Rlc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitQNTg2CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50CisKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCis7ICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfTVRSUl9yZXN0b3JlSW50KHVsb25nIHBzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUludAorCisgICAgICAgIEFSRyAgICAgcHM6VUxPTkcKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQorICAgICAgICBwdXNoICAgIFtVTE9ORyBwc10KKyAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHByb2Nlc3NvciBzdGF0dXMgKGFuZCBpbnRlcnJ1cHRzKQorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWNoYXIgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmVhZCBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfZ2V0Q3g4NgorCisgICAgICAgIEFSRyAgICAgcmVnOlVDSEFSCisKKyAgICAgICAgZW50ZXJfYworICAgICAgICBtb3YgICAgIGFsLFtyZWddCisgICAgICAgIG91dCAgICAgMjJoLGFsCisgICAgICAgIGluICAgICAgYWwsMjNoCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVjaGFyIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIHZhbCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBXcml0ZSBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX01UUlJfc2V0Q3g4NgorCisgICAgICAgIEFSRyAgICAgcmVnOlVDSEFSLCB2YWw6VUNIQVIKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIG1vdiAgICAgYWwsW3JlZ10KKyAgICAgICAgb3V0ICAgICAyMmgsYWwKKyAgICAgICAgbW92ICAgICBhbCxbdmFsXQorICAgICAgICBvdXQgICAgIDIzaCxhbAorICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1bG9uZyBfUE1fcmluZzBfaXNyKHZvaWQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmluZyAwIGNsb2NrIGludGVycnVwdCBoYW5kbGVyIHRoYXQgd2UgdXNlIHRvIGV4ZWN1dGUgdGhlIE1UUlIgc3VwcG9ydAorOyBjb2RlLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jbmVhciAgIF9QTV9yaW5nMF9pc3IKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fZmx1c2hUTEIodm9pZCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcHVzaGFkCisgICAgICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9GTFVTSF9UTEIKKyAgICAgICAgam5lICAgICBAQDEKKyAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgIAorICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKKyAgICAgICAgam1wICAgICBAQEV4aXQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHVsb25nIF9NVFJSX3NhdmVDUjQodm9pZCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0BAMTogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1NBVkVfQ1I0CisgICAgICAgIGpuZSAgICAgQEAyCisKKzsgU2F2ZSB2YWx1ZSBvZiBDUjQgYW5kIGNsZWFyIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpCisKKyAgICAgICAgbW92ICAgICBlYngsY3I0CisgICAgICAgIG1vdiAgICAgZWF4LGVieAorICAgICAgICBhbmQgICAgIGFsLDdGaAorICAgICAgICBtb3YgICAgIGNyNCxlYXgKKworOyBEaXNhYmxlIGFuZCBmbHVzaCBjYWNoZXMKKworICAgICAgICBtb3YgICAgIGVheCxjcjAKKyAgICAgICAgb3IgICAgICBlYXgsNDAwMDAwMDBoCisgICAgICAgIHdiaW52ZAorICAgICAgICBtb3YgICAgIGNyMCxlYXgKKyAgICAgICAgd2JpbnZkCisKKzsgUmV0dXJuIHZhbHVlIGZyb20gQ1I0CisKKyAgICAgICAgbW92ICAgICBbX1BNX1IwX3JlZ10sZWJ4CisgICAgICAgIGptcCAgICAgQEBFeGl0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAQDI6ICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9SRVNUT1JFX0NSNAorICAgICAgICBqbmUgICAgIEBAMworCisgICAgICAgIG1vdiAgICAgZWF4LGNyMAorICAgICAgICBhbmQgICAgIGVheCwwQkZGRkZGRkZoCisgICAgICAgIG1vdiAgICAgY3IwLGVheAorICAgICAgICBtb3YgICAgIGVheCxbX1BNX1IwX3JlZ10KKyAgICAgICAgbW92ICAgICBjcjQsZWF4CisgICAgICAgIGptcCAgICAgQEBFeGl0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIF9NVFJSX3JlYWRNU1IoaW50IHJlZywgdWxvbmcgRkFSICplYXgsIHVsb25nIEZBUiAqZWR4KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQEAzOiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfUkVBRF9NU1IKKyAgICAgICAgam5lICAgICBAQDQKKworICAgICAgICBtb3YgICAgIGVjeCxbX1BNX1IwX3JlZ10KKyAgICAgICAgcmRtc3IKKyAgICAgICAgbW92ICAgICBbX1BNX1IwX2VheF0sZWF4CisgICAgICAgIG1vdiAgICAgW19QTV9SMF9lZHhdLGVkeAorICAgICAgICBqbXAgICAgIEBARXhpdAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfTVRSUl93cml0ZU1TUihpbnQgcmVnLCB1bG9uZyBlYXgsIHVsb25nIGVkeCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0BANDogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1dSSVRFX01TUgorICAgICAgICBqbmUgICAgIEBARXhpdAorCisgICAgICAgIG1vdiAgICAgZWN4LFtfUE1fUjBfcmVnXQorICAgICAgICBtb3YgICAgIGVheCxbX1BNX1IwX2VheF0KKyAgICAgICAgbW92ICAgICBlZHgsW19QTV9SMF9lZHhdCisgICAgICAgIHdybXNyCisgICAgICAgIGptcCAgICAgQEBFeGl0CisKK0BARXhpdDogbW92ICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLC0xCisgICAgICAgIHBvcGFkCisgICAgICAgIG1vdiAgICAgZWF4LDAKKyAgICAgICAgcmV0ZgorCitjcHJvY2VuZAorCitlbmRjb2Rlc2VnICBfbXRycnFueAorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ODI1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvY3B1aW5mby5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFFOWAorKgorKiBEZXNjcmlwdGlvbjogIFFOWCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgUU5YIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgUU5YIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQoreworICAgIGZyZXEtPmxvdyA9IENMT0NLU19QRVJfU0VDICogMTAwMDsKKyAgICBmcmVxLT5oaWdoID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodCktPmxvdyA9IGNsb2NrKCkgKiAxMDAwOyAgXAorICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICBcCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmY4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvZXZlbnQuYwpAQCAtMCwwICsxLDYwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFFOWAorKgorKiBEZXNjcmlwdGlvbjogIFFOWCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCisqICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fUU5YTlRPX18KK3N0YXRpYyBzdHJ1Y3QgX21vdXNlX2N0cmwgICAqX1BNX21vdXNlX2N0bDsKK3N0YXRpYyBpbnQgICAgICAgICAgX1BNX2tleWJvYXJkX2ZkID0gLTE7CisvL3N0YXRpYyBpbnQgICAgICAgICAgICBfUE1fbW9kaWZpZXJzLCBfUE1fbGVkczsKKyNlbHNlCitzdGF0aWMgaW50ICAgICAgICAgIGtiZF9mZCA9IC0xLCBtb3VzZV9mZCA9IC0xOworI2VuZGlmCitzdGF0aWMgaW50ICAgICAgICAgIGtpbGxfcGlkID0gMDsKK3N0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCitzdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLworCisjZGVmaW5lIFRJTUVfVE9fTVNFQyhfX3QpICAgKChfX3QpLnR2X25zZWMgLyAxMDAwMDAwICsgKF9fdCkudHZfc2VjICogMTAwMCkKKworI2RlZmluZSBMRURfTlVNICAgICAgICAgMQorI2RlZmluZSBMRURfQ0FQICAgICAgICAgMgorI2RlZmluZSBMRURfU0NSICAgICAgICAgNAorCisvKiBTY2FuY29kZSBtYXBwaW5ncyBvbiBRTlggZm9yIHNwZWNpYWwga2V5cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNjYW47CisgICAgaW50IG1hcDsKKyAgICB9IGtleW1hcDsKKworLy8gVE9ETzogRml4IHRoaXMgYW5kIHNldCBpdCB1cCBzbyB3ZSBjYW4gZG8gYSBiaW5hcnkgc2VhcmNoIQorCitrZXltYXAga2V5bWFwc1tdID0geworICAgIHs5NiwgS0JfcGFkRW50ZXJ9LAorICAgIHs3NCwgS0JfcGFkTWludXN9LAorICAgIHs3OCwgS0JfcGFkUGx1c30sCisgICAgezU1LCBLQl9wYWRUaW1lc30sCisgICAgezk4LCBLQl9wYWREaXZpZGV9LAorICAgIHs3MSwgS0JfcGFkSG9tZX0sCisgICAgezcyLCBLQl9wYWRVcH0sCisgICAgezczLCBLQl9wYWRQYWdlVXB9LAorICAgIHs3NSwgS0JfcGFkTGVmdH0sCisgICAgezc2LCBLQl9wYWRDZW50ZXJ9LAorICAgIHs3NywgS0JfcGFkUmlnaHR9LAorICAgIHs3OSwgS0JfcGFkRW5kfSwKKyAgICB7ODAsIEtCX3BhZERvd259LAorICAgIHs4MSwgS0JfcGFkUGFnZURvd259LAorICAgIHs4MiwgS0JfcGFkSW5zZXJ0fSwKKyAgICB7ODMsIEtCX3BhZERlbGV0ZX0sCisgICAgezEwNSxLQl9sZWZ0fSwKKyAgICB7MTA4LEtCX2Rvd259LAorICAgIHsxMDYsS0JfcmlnaHR9LAorICAgIHsxMDMsS0JfdXB9LAorICAgIHsxMTAsS0JfaW5zZXJ0fSwKKyAgICB7MTAyLEtCX2hvbWV9LAorICAgIHsxMDQsS0JfcGFnZVVwfSwKKyAgICB7MTExLEtCX2RlbGV0ZX0sCisgICAgezEwNyxLQl9lbmR9LAorICAgIHsxMDksS0JfcGFnZURvd259LAorICAgIHsxMjUsS0JfbGVmdFdpbmRvd3N9LAorICAgIHsxMjYsS0JfcmlnaHRXaW5kb3dzfSwKKyAgICB7MTI3LEtCX21lbnV9LAorICAgIHsxMDAsS0JfcmlnaHRBbHR9LAorICAgIHs5NyxLQl9yaWdodEN0cmx9LAorICAgIH07CisKKy8qIEFuZCB0aGUga2V5cGFkIHdpdGggbnVtIGxvY2sgdHVybmVkIG9uIChjaGFuZ2VzIHRoZSBBU0NJSSBjb2RlIG9ubHkpICovCisKK2tleW1hcCBrZXlwYWRbXSA9IHsKKyAgICB7NzEsIEFTQ0lJXzd9LAorICAgIHs3MiwgQVNDSUlfOH0sCisgICAgezczLCBBU0NJSV85fSwKKyAgICB7NzUsIEFTQ0lJXzR9LAorICAgIHs3NiwgQVNDSUlfNX0sCisgICAgezc3LCBBU0NJSV82fSwKKyAgICB7NzksIEFTQ0lJXzF9LAorICAgIHs4MCwgQVNDSUlfMn0sCisgICAgezgxLCBBU0NJSV8zfSwKKyAgICB7ODIsIEFTQ0lJXzB9LAorICAgIHs4MywgQVNDSUlfcGVyaW9kfSwKKyAgICB9OworCisjZGVmaW5lIE5CX0tFWU1BUFMgKHNpemVvZihrZXltYXBzKS9zaXplb2Yoa2V5bWFwc1swXSkpCisjZGVmaW5lIE5CX0tFWVBBRCAoc2l6ZW9mKGtleXBhZCkvc2l6ZW9mKGtleXBhZFswXSkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5jbHVkZSBnZW5lcmljIHJhdyBzY2FuY29kZSBrZXlib2FyZCBtb2R1bGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNvbW1vbi9rZXlib2FyZC5jIgorCisvKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgUU5YICovCisjZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKKyNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KK3N0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCit0aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCitldmVudHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0OworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsJnQpOworICAgIHJldHVybiAodC50dl9uc2VjIC8gMTAwMDAwMCArIHQudHZfc2VjICogMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29udmVydHMgYSBtaWNrZXkgbW92ZW1lbnQgdmFsdWUgdG8gYSBwaXhlbCBhZGp1c3RtZW50IHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgTWlja2V5VG9QaXhlbCgKKyAgICBpbnQgbWlja2V5KQoreworICAgIC8vIFRPRE86IFdlIGNhbiBhZGQgc29tZSBjb2RlIGluIGhlcmUgdG8gaGFuZGxlICdhY2NlbGVyYXRpb24nIGZvcgorICAgIC8vICAgICAgIHRoZSBtb3VzZSBjdXJzb3IuIEZvciBub3cganVzdCB1c2UgdGhlIG1pY2tleXMuCisgICAgcmV0dXJuIG1pY2tleTsKK30KKworI2lmZGVmIF9fUU5YTlRPX18KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0cmlldmVzIGFsbCBldmVudHMgZnJvbSB0aGUgbW91c2Uva2V5Ym9hcmQgZXZlbnQgcXVldWUgYW5kIHN0dWZmcyB0aGVtCitpbnRvIHRoZSBNR0wgZXZlbnQgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQoreworICAgIGludCAgICAgICAgIHJjMSwgcmMyOworICAgIHN0cnVjdCBfa2V5Ym9hcmRfcGFja2V0IGtleTsKKyAgICBzdHJ1Y3QgX21vdXNlX3BhY2tldCAgICBtczsKKyAgICBzdGF0aWMgbG9uZyAgICAgb2xkX2J1dHRvbnMgPSAwOworICAgIHVpbnQgICAgICAgICAgICBtZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwLCBtb2RzID0gMDsKKyAgICBldmVudF90ICAgICAgICAgZXZ0OworCisgICAgd2hpbGUgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgcmMxID0gcmVhZChrYmRfZmQsICh2b2lkICopJmtleSwgc2l6ZW9mKGtleSkpOworICAgICAgICBpZiAocmMxID09IC0xKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQorICAgICAgICAgICAgICAgIHJjMSA9IDA7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImdldEV2ZW50cyIpOworICAgICAgICAgICAgICAgIFBNX2ZhdGFsRXJyb3IoIktleWJvYXJkIGVycm9yIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBpZiAocmMxID4gMCkgeworICAgICAgICAgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKKyAgICAgICAgICAgIGlmIChrZXkuZGF0YS5tb2RpZmllcnMgJiBLRVlNT0RfU0hJRlQpCisgICAgICAgICAgICAgICAgbW9kcyB8PSBFVlRfTEVGVFNISUZUOworICAgICAgICAgICAgaWYgKGtleS5kYXRhLm1vZGlmaWVycyAmIEtFWU1PRF9DVFJMKQorICAgICAgICAgICAgICAgIG1vZHMgfD0gRVZUX0NUUkxTVEFURTsKKyAgICAgICAgICAgIGlmIChrZXkuZGF0YS5tb2RpZmllcnMgJiBLRVlNT0RfQUxUKQorICAgICAgICAgICAgICAgIG1vZHMgfD0gRVZUX0FMVFNUQVRFOworCisgICAgICAgICAgICAvKiBOb3cgc3RvcmUgdGhlIGtleWJvYXJkIGV2ZW50IGRhdGEgKi8KKyAgICAgICAgICAgIGV2dC53aGVuID0gVElNRV9UT19NU0VDKGtleS50aW1lKTsKKyAgICAgICAgICAgIGlmIChrZXkuZGF0YS5mbGFncyAmIEtFWV9TQ0FOX1ZBTElEKQorICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlIHw9IChrZXkuZGF0YS5rZXlfc2NhbiAmIDB4N0YpIDw8IDg7CisgICAgICAgICAgICBpZiAoKGtleS5kYXRhLmZsYWdzICYgS0VZX1NZTV9WQUxJRCkgJiYKKyAgICAgICAgICAgICAgICAoKChrZXkuZGF0YS5rZXlfc3ltICYgMHhmZjAwKSA9PSAweGYwMDAgJiYKKyAgICAgICAgICAgICAgICAoa2V5LmRhdGEua2V5X3N5bSAmIDB4ZmYpIDwgMHgyMCkgfHwKKyAgICAgICAgICAgICAgICBrZXkuZGF0YS5rZXlfc3ltIDwgMHg4MCkpCisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgfD0gKGtleS5kYXRhLmtleV9zeW0gJiAweEZGKTsKKyAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RzOworICAgICAgICAgICAgaWYgKGtleS5kYXRhLmZsYWdzICYgS0VZX0RPV04pIHsKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOworICAgICAgICAgICAgICAgIGtleVVwTXNnW2V2dC5tZXNzYWdlID4+IDhdID0gKHVzaG9ydClldnQubWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXkuZGF0YS5mbGFncyAmIEtFWV9SRVBFQVQpIHsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSB8PSAweDEwMDAwOworICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IGtleVVwTXNnW2V2dC5tZXNzYWdlID4+IDhdOworICAgICAgICAgICAgICAgIGlmIChldnQubWVzc2FnZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBrZXlVcE1zZ1tldnQubWVzc2FnZSA+PiA4XSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBOb3cgYWRkIHRoZSBuZXcgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlICovCisgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmMyID0gcmVhZChtb3VzZV9mZCwgKHZvaWQgKikmbXMsIHNpemVvZiAobXMpKTsKKyAgICAgICAgaWYgKHJjMiA9PSAtMSkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgICAgICByYzIgPSAwOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGVycm9yKCJnZXRFdmVudHMiKTsKKyAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJNb3VzZSBlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJjMiA+IDApIHsKKyAgICAgICAgICAgIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7CisgICAgICAgICAgICBtcy5oZHIuYnV0dG9ucyAmPQorICAgICAgICAgICAgICAgIChfUE9JTlRFUl9CVVRUT05fTEVGVCB8IF9QT0lOVEVSX0JVVFRPTl9SSUdIVCk7CisgICAgICAgICAgICBpZiAobXMuaGRyLmJ1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fTEVGVCkKKyAgICAgICAgICAgICAgICBidXRfc3RhdCA9IEVWVF9MRUZUQlVUOworICAgICAgICAgICAgaWYgKChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9MRUZUKSAhPQorICAgICAgICAgICAgICAgIChvbGRfYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9MRUZUKSkKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKKyAgICAgICAgICAgIGlmIChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9SSUdIVCkKKyAgICAgICAgICAgICAgICBidXRfc3RhdCB8PSBFVlRfUklHSFRCVVQ7CisgICAgICAgICAgICBpZiAoKG1zLmhkci5idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX1JJR0hUKSAhPQorICAgICAgICAgICAgICAgIChvbGRfYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9SSUdIVCkpCisgICAgICAgICAgICAgICAgbWVzc2FnZSB8PSBFVlRfUklHSFRCTUFTSzsKKyAgICAgICAgICAgIGlmIChtcy5keCB8fCBtcy5keSkgeworICAgICAgICAgICAgICAgIG1zLmR5ID0gLW1zLmR5OworICAgICAgICAgICAgICAgIEVWVC5teCArPSBNaWNrZXlUb1BpeGVsKG1zLmR4KTsKKyAgICAgICAgICAgICAgICBFVlQubXkgKz0gTWlja2V5VG9QaXhlbChtcy5keSk7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5teCA+IHJhbmdlWCkgICAgRVZULm14ID0gcmFuZ2VYOworICAgICAgICAgICAgICAgIGlmIChFVlQubXkgPiByYW5nZVkpICAgIEVWVC5teSA9IHJhbmdlWTsKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7CisgICAgICAgICAgICAgICAgZXZ0LndoZW4gPSBUSU1FX1RPX01TRUMobXMuaGRyLnRpbWUpOworICAgICAgICAgICAgICAgIGV2dC53aGVyZV94ID0gRVZULm14OworICAgICAgICAgICAgICAgIGV2dC53aGVyZV95ID0gRVZULm15OworICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gbXMuZHg7CisgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3kgPSBtcy5keTsKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7CisgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZ0LndoYXQgPSBtcy5oZHIuYnV0dG9ucyA8IG9sZF9idXR0b25zID8KKyAgICAgICAgICAgICAgICBFVlRfTU9VU0VVUCA6IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICBldnQud2hlbiA9IFRJTUVfVE9fTVNFQyhtcy5oZHIudGltZSk7CisgICAgICAgICAgICBldnQud2hlcmVfeCA9IEVWVC5teDsKKyAgICAgICAgICAgIGV2dC53aGVyZV95ID0gRVZULm15OworICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBtcy5keDsKKyAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV95ID0gbXMuZHk7CisgICAgICAgICAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7CisgICAgICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICBpZiAobXMuaGRyLmJ1dHRvbnMgIT0gb2xkX2J1dHRvbnMpIHsKKyAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgICAgICBvbGRfYnV0dG9ucyA9IG1zLmhkci5idXR0b25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJjMSArIHJjMiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KK30KKyNlbHNlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHJpZXZlcyBhbGwgZXZlbnRzIGZyb20gdGhlIG1vdXNlL2tleWJvYXJkIGV2ZW50IHF1ZXVlIGFuZCBzdHVmZnMgdGhlbQoraW50byB0aGUgTUdMIGV2ZW50IHF1ZXVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKK3sKKyAgICBzdHJ1Y3QgbW91c2VfZXZlbnQgICAgICBldjsKKyAgICBpbnQgICAgICAgICAgICAgcmM7CisgICAgc3RhdGljIGxvbmcgICAgICAgICBvbGRfYnV0dG9ucyA9IDA7CisgICAgdWludCAgICAgICAgICAgICAgICBtZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwOworICAgIGV2ZW50X3QgICAgICAgICAgICAgZXZ0OworICAgIGNoYXIgICAgICAgICAgICAgICAgYnVmWzMyXTsKKyAgICBpbnQgICAgICAgICAgICAgbnVta2V5cywgaTsKKworICAgIC8qIFBvbGwga2V5Ym9hcmQgZXZlbnRzICovCisgICAgd2hpbGUgKChudW1rZXlzID0gcmVhZChfUE1fa2V5Ym9hcmRfZmQsIGJ1Ziwgc2l6ZW9mIGJ1ZikpID4gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7CisgICAgICAgICAgICBwcm9jZXNzUmF3U2NhbkNvZGUoYnVmW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYgKF9QTV9tb3VzZV9jdGwgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogR29iYmxlIHBlbmRpbmcgbW91c2UgZXZlbnRzICovCisgICAgd2hpbGUgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKKyAgICAgICAgcmMgPSBtb3VzZV9yZWFkKF9QTV9tb3VzZV9jdGwsICZldiwgMSwgMCwgTlVMTCk7CisgICAgICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgICAgICAgcGVycm9yKCJnZXRFdmVudHMiKTsKKyAgICAgICAgICAgIFBNX2ZhdGFsRXJyb3IoIk1vdXNlIGVycm9yIChJbnB1dCB0ZXJtaW5hdGVkPykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJjID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwOworICAgICAgICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOworCisgICAgICAgIGV2LmJ1dHRvbnMgJj0gKF9NT1VTRV9MRUZUIHwgX01PVVNFX1JJR0hUKTsKKyAgICAgICAgaWYgKGV2LmJ1dHRvbnMgJiBfTU9VU0VfTEVGVCkKKyAgICAgICAgICAgIGJ1dF9zdGF0ID0gRVZUX0xFRlRCVVQ7CisgICAgICAgIGlmICgoZXYuYnV0dG9ucyAmIF9NT1VTRV9MRUZUKSAhPSAob2xkX2J1dHRvbnMgJiBfTU9VU0VfTEVGVCkpCisgICAgICAgICAgICBtZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKKyAgICAgICAgaWYgKGV2LmJ1dHRvbnMgJiBfTU9VU0VfUklHSFQpCisgICAgICAgICAgICBidXRfc3RhdCB8PSBFVlRfUklHSFRCVVQ7CisgICAgICAgIGlmICgoZXYuYnV0dG9ucyAmIF9NT1VTRV9SSUdIVCkgIT0gKG9sZF9idXR0b25zICYgX01PVVNFX1JJR0hUKSkKKyAgICAgICAgICAgIG1lc3NhZ2UgfD0gRVZUX1JJR0hUQk1BU0s7CisgICAgICAgIGlmIChldi5keCB8fCBldi5keSkgeworICAgICAgICAgICAgZXYuZHkgPSAtZXYuZHk7CisgICAgICAgICAgICBFVlQubXggKz0gTWlja2V5VG9QaXhlbChldi5keCk7CisgICAgICAgICAgICBFVlQubXkgKz0gTWlja2V5VG9QaXhlbChldi5keSk7CisgICAgICAgICAgICBpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKKyAgICAgICAgICAgIGlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOworICAgICAgICAgICAgaWYgKEVWVC5teCA+IHJhbmdlWCkgICAgRVZULm14ID0gcmFuZ2VYOworICAgICAgICAgICAgaWYgKEVWVC5teSA+IHJhbmdlWSkgICAgRVZULm15ID0gcmFuZ2VZOworICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOworICAgICAgICAgICAgZXZ0LndoZW4gPSBldi50aW1lc3RhbXAqMTAwOworICAgICAgICAgICAgZXZ0LndoZXJlX3ggPSBFVlQubXg7CisgICAgICAgICAgICBldnQud2hlcmVfeSA9IEVWVC5teTsKKyAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gZXYuZHg7CisgICAgICAgICAgICBldnQucmVsYXRpdmVfeSA9IGV2LmR5OworICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OworICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgIGV2dC53aGF0ID0gZXYuYnV0dG9ucyA8IG9sZF9idXR0b25zID8gRVZUX01PVVNFVVAgOiBFVlRfTU9VU0VET1dOOworICAgICAgICBldnQud2hlbiA9IGV2LnRpbWVzdGFtcCoxMDA7CisgICAgICAgIGV2dC53aGVyZV94ID0gRVZULm14OworICAgICAgICBldnQud2hlcmVfeSA9IEVWVC5teTsKKyAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBldi5keDsKKyAgICAgICAgZXZ0LnJlbGF0aXZlX3kgPSBldi5keTsKKyAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OworICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIGlmIChldi5idXR0b25zICE9IG9sZF9idXR0b25zKSB7CisgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgIG9sZF9idXR0b25zID0gZXYuYnV0dG9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorI2VuZGlmICAvKiBfX1FOWE5UT19fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0VWVF9hYm9ydCgKKyAgICBpbnQgc2lnbm8pCit7CisgICAgY2hhciAgICBidWZbODBdOworCisgICAgRVZUX2V4aXQoKTsKKyAgICBzcHJpbnRmKGJ1ZiwiVGVybWluYXRpbmcgb24gc2lnbmFsICVkIixzaWdubyk7CisgICAgUE1fZmF0YWxFcnJvcihidWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAorCitSRU1BUktTOgorSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgordG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAordGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgorCitXZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCitldmVudCBoYW5kbGluZyByb3V0aW5lcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfaW5pdCgKKyAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQoreworICAgIGludCAgICAgICAgIGk7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgY2hhciAgICAgICAgKmlhcmdbMTZdOworI2lmZGVmIF9fUU5YTlRPX18KKyAgICBjaGFyICAgICAgICBidWZbMTI4XTsKKyAgICBGSUxFICAgICAgICAqcDsKKyAgICBpbnQgICAgICAgICBhcmdubyxsZW47CisjZW5kaWYgIAorCisjaWZkZWYgX19RTlhOVE9fXworICAgIFRocmVhZEN0bChfTlRPX1RDVExfSU8sIDApOyAvKiBTbyBqb3lzdGljayBjb2RlIHdvbid0IGJsb3cgdXAgKi8KKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOworICAgIGluaXRFdmVudFF1ZXVlKCk7CisgICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7CisgICAgCisjaWZkZWYgX19RTlhOVE9fXworICAgIC8qCisgICAgICogVXNlciBtYXkgYWxyZWFkeSBoYXZlIGlucHV0IHJ1bm5pbmcgd2l0aCB0aGUgcmlnaHQgcGFyYW1ldGVycy4KKyAgICAgKiBUaHVzIHRoZXkgY291bGQgc3RhcnQgaW5wdXQgYXQgYm9vdCB0aW1lLCB1c2luZyB0aGUgb3V0cHV0IG9mCisgICAgICogaW5wdXR0cmFwLCBwYXNzaW5nIHRoZSB0aGUgLXIgZmxhZyB0byBtYWtlIGl0IHJ1biBhcyBhIHJlc291cmNlCisgICAgICogbWFuYWdlci4KKyAgICAgKi8KKyAgICBpZiAoKG1vdXNlX2ZkID0gb3BlbigiL2Rldi9tb3VzZTAiLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spKSA8IDApIHsKKyAgICAgICAgLyogUnVuIGlucHV0dHJhcCB0byBnZXQgdGhlIGFyZ3MgZm9yIGlucHV0ICovCisgICAgICAgIGlmICgocCA9IHBvcGVuKCJpbnB1dHRyYXAiLCAiciIpKSA9PSBOVUxMKQorICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiRXJyb3IgcnVubmluZyAnaW5wdXR0cmFwJyIpOworICAgICAgICBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBwKTsKKyAgICAgICAgcGNsb3NlKHApOworCisgICAgICAgIC8qIEJ1aWxkIHRoZSBhcmd1bWVudCBsaXN0ICovCisgICAgICAgIGxlbiA9IHN0cmxlbihidWYpOworICAgICAgICBpYXJnWzBdID0gYnVmOworICAgICAgICBmb3IgKGkgPSAwLCBhcmdubyA9IDA7IGkgPCBsZW4gJiYgYXJnbm8gPCAxNTspIHsKKyAgICAgICAgICAgIGlmIChhcmdubyA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBZGQgZmxhZ3MgdG8gaW5wdXQncyBhcmcgbGlzdC4KKyAgICAgICAgICAgICAgICAgKiAnLXInIG1lYW5zIHJ1biBhcyByZXNvdXJjZQorICAgICAgICAgICAgICAgICAqIG1hbmFnZXIsIHByb3ZpZGluZyB0aGUgL2Rldi9tb3VzZQorICAgICAgICAgICAgICAgICAqIGFuZCAvZGV2L2tleWJvYXJkIGludGVyZmFjZXMuCisgICAgICAgICAgICAgICAgICogJy1QJyBzdXByZXNzZXMgdGhlIC9kZXYvcGhvdG9uCisgICAgICAgICAgICAgICAgICogbWVjaGFuaXNtLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlhcmdbYXJnbm8rK10gPSAiLVByIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoYnVmW2ldID09ICcgJykKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoYnVmW2ldID09ICdcMCcgfHwgYnVmW2ldID09ICdcbicpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpYXJnW2FyZ25vKytdID0gJmJ1ZltpXTsKKyAgICAgICAgICAgIHdoaWxlIChidWZbaV0gIT0gJyAnCisgICAgICAgICAgICAgICAgJiYgYnVmW2ldICE9ICdcMCcgJiYgYnVmW2ldICE9ICdcbicpCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgYnVmW2krK10gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICBpYXJnW2FyZ25vXSA9IE5VTEw7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKChraWxsX3BpZCA9IHNwYXdudnAoUF9OT1dBSVRPLCBpYXJnWzBdLCBpYXJnKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigic3Bhd25pbmcgaW5wdXQgcmVzbWdyIik7CisgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3Qgc3RhcnQgaW5wdXQgcmVzbWdyIik7CisgICAgICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RhdCgiL2Rldi9tb3VzZTAiLCAmc3QpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKChtb3VzZV9mZCA9IG9wZW4oIi9kZXYvbW91c2UwIiwgT19SRE9OTFl8T19OT05CTE9DSykpIDwgMCkgeworICAgICAgICAgICAgcGVycm9yKCIvZGV2L21vdXNlMCIpOworICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IG9wZW4gL2Rldi9tb3VzZTAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGlmICgoa2JkX2ZkID0gb3BlbigiL2Rldi9rZXlib2FyZDAiLCBPX1JET05MWXxPX05PTkJMT0NLKSkgPCAwKSB7CisgICAgICAgIHBlcnJvcigiL2Rldi9rZXlib2FyZDAiKTsKKyAgICAgICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IG9wZW4gL2Rldi9rZXlib2FyZDAiKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAvKiBDb25uZWN0IHRvIElucHV0L01vdXNlIGZvciBldmVudCBoYW5kbGluZyAqLworICAgIGlmIChfUE1fbW91c2VfY3RsID09IE5VTEwpIHsKKyAgICAgICAgX1BNX21vdXNlX2N0bCA9IG1vdXNlX29wZW4oMCwgIi9kZXYvbW91c2UiLCAwKTsKKworICAgICAgICAvKiAiTW91c2UiIGlzIG5vdCBydW5uaW5nOyBhdHRlbXB0IHRvIHN0YXJ0IGl0ICovCisgICAgICAgIGlmIChfUE1fbW91c2VfY3RsID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlhcmdbMF0gPSAibW91c2V0cmFwIjsKKyAgICAgICAgICAgIGlhcmdbMV0gPSAic3RhcnQiOworICAgICAgICAgICAgaWFyZ1syXSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKGtpbGxfcGlkID0gc3Bhd252cChQX05PV0FJVE8sIGlhcmdbMF0sICh2b2lkKilpYXJnKSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcGVycm9yKCJzcGF3biAobW91c2V0cmFwKSIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQoIi9kZXYvbW91c2UiLCAmc3QpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfUE1fbW91c2VfY3RsID0gbW91c2Vfb3BlbigwLCAiL2Rldi9tb3VzZSIsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGlmIChfUE1fa2V5Ym9hcmRfZmQgPT0gLTEpCisgICAgICAgIF9QTV9rZXlib2FyZF9mZCA9IG9wZW4oIi9kZXYva2JkIiwgT19SRE9OTFl8T19OT05CTE9DSyk7CisjZW5kaWYKKworICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KKyAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7CisgICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgcmFuZ2VYID0geFJlczsKKyAgICByYW5nZVkgPSB5UmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCithbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9zZXRNb3VzZVBvcyh4LHkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KK2NhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAorYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3Jlc3VtZSh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIFFOWAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bworZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9zdXNwZW5kKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgUU5YCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitFeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfZXhpdCh2b2lkKQoreworI2lmZGVmIF9fUU5YTlRPX18KKyAgICBjaGFyICAgIGM7CisgICAgaW50IGZsYWdzOworCisgICAgaWYgKGtiZF9mZCAhPSAtMSkgeworICAgICAgICBjbG9zZShrYmRfZmQpOworICAgICAgICBrYmRfZmQgPSAtMTsKKyAgICAgICAgfQorICAgIGlmIChtb3VzZV9mZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtb3VzZV9mZCk7CisgICAgICAgIG1vdXNlX2ZkID0gLTE7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisKKyNpZm5kZWYgX19RTlhOVE9fXworICAgIC8qIEtpbGwgdGhlIElucHV0L01vdXNlIGRyaXZlciBpZiB3ZSBoYXZlIHNwYXduZWQgaXQgKi8KKyAgICBpZiAoX1BNX21vdXNlX2N0bCAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCBfZmRfZW50cnkgICAgZmRlOworICAgICAgICB1aW50ICAgICAgICAgICAgcGlkID0gMDsKKworICAgICAgICAvKiBGaW5kIG91dCB0aGUgcGlkIG9mIHRoZSBtb3VzZSBkcml2ZXIgKi8KKyAgICAgICAgaWYgKGtpbGxfcGlkID4gMCkgeworICAgICAgICAgICAgaWYgKHFueF9mZF9xdWVyeSgwLAorICAgICAgICAgICAgICAgIDAsIF9QTV9tb3VzZV9jdGwtPmZkLCAmZmRlKSAhPSAtMSkKKyAgICAgICAgICAgICAgICBwaWQgPSBmZGUucGlkOworICAgICAgICAgICAgfQorICAgICAgICBtb3VzZV9jbG9zZShfUE1fbW91c2VfY3RsKTsKKyAgICAgICAgX1BNX21vdXNlX2N0bCA9IE5VTEw7CisKKyAgICAgICAgaWYgKHBpZCA+IDApIHsKKyAgICAgICAgICAgIC8qIEZvciBzb21lIHJlYXNvbnMgdGhlIFBJRCdzIGFyZSBkaWZmZXJlbnQgdW5kZXIgUU5YNCwKKyAgICAgICAgICAgICAqIHNvIHdlIHVzZSB0aGUgb2xkIG1lY2hhbmlzbSB0byBraWxsIHRoZSBtb3VzZSBzZXJ2ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGtpbGwocGlkLCBTSUdURVJNKTsKKyAgICAgICAgICAgIGtpbGxfcGlkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgaWYgKGtpbGxfcGlkID4gMCkgeworICAgICAgICBraWxsKGtpbGxfcGlkLCBTSUdURVJNKTsKKyAgICAgICAga2lsbF9waWQgPSAwOworICAgICAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9tdHJycW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvbXRycnFueC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzQ5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvbXRycnFueC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBRTlgKKyoKKyogRGVzY3JpcHRpb246ICBNVFJSIGhlbHBlciBmdW5jdGlvbnMgbW9kdWxlLiBUbyBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQKKyogICAgICAgICAgICAgICB0aGUgTVRSUiBzdXBwb3J0IHVuZGVyIFFOWCwgd2Ugc2ltcGx5IHB1dCBvdXIgcmluZyAwIGhlbHBlcgorKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBpbnRvIHN0dWJzIHRoYXQgcnVuIHRoZW0gYXQgcmluZyAwIHVzaW5nIHdoYXRldmVyCisqICAgICAgICAgICAgICAgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgX19RTlhOVE9fXworI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgorI2luY2x1ZGUgPHN5cy9zeXNwYWdlLmg+CisjZWxzZQorI2luY2x1ZGUgPGk4Ni5oPgorI2luY2x1ZGUgPHN5cy9pcnFpbmZvLmg+CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBSMF9GTFVTSF9UTEIgICAgMAorI2RlZmluZSBSMF9TQVZFX0NSNCAgICAgMQorI2RlZmluZSBSMF9SRVNUT1JFX0NSNCAgMgorI2RlZmluZSBSMF9SRUFEX01TUiAgICAgMworI2RlZmluZSBSMF9XUklURV9NU1IgICAgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICBzZXJ2aWNlOworICAgIGludCAgICAgcmVnOworICAgIHVsb25nICAgZWF4OworICAgIHVsb25nICAgZWR4OworICAgIH0gUjBfZGF0YTsKKworZXh0ZXJuIHZvbGF0aWxlIFIwX2RhdGEgX1BNX1IwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19RTlhOVE9fXworY29uc3Qgc3RydWN0IHNpZ2V2ZW50ICogX0FTTUFQSSBfUE1fcmluZzBfaXNyKHZvaWQgKmFyZywgaW50IGlkKTsKKyNlbHNlCitwaWRfdCBmYXIgX0FTTUFQSSBfUE1fcmluZzBfaXNyKCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdHJ1ZSBpZiByaW5nIDAgKG9yIGlmIHdlIGNhbiBjYWxsIHRoZSBoZWxwZXJzIGZ1bmN0aW9ucyBhdCByaW5nIDApCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgX0FTTUFQSSBfTVRSUl9pc1JpbmcwKHZvaWQpCit7CisjaWZkZWYgX19RTlhOVE9fXworICAgIHJldHVybiBmYWxzZTsgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0IQorI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGV4ZWN1dGUgYSBzZXJ2aWNlIGF0IHJpbmcgMC4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBjbG9jaworaW50ZXJydXB0IGhhbmRsZXIgc2luY2UgdGhlIGNvZGUgd2UgYXR0YWNoIHRvIGl0IHdpbGwgYWx3YXlzIHJ1biBhdCByaW5nIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQ2FsbFJpbmcwKHZvaWQpCit7CisjaWZkZWYgX19RTlhOVE9fXworICAgIHVpbnQgICAgY2xvY2tfaW50bm8gPSBTWVNQQUdFX0VOVFJZKHF0aW1lKS0+aW50cjsKKyNlbHNlCisgICAgdWludCAgICBjbG9ja19pbnRubyA9IDA7ICAgIC8qIGNsb2NrIGlycSAqLworI2VuZGlmCisgICAgaW50ICAgICBpbnRyaWQ7CisKKyNpZmRlZiBfX1FOWE5UT19fCisgICAgbWxvY2soKHZvaWQqKSZfUE1fUjAsIHNpemVvZihfUE1fUjApKTsKKyAgICBUaHJlYWRDdGwoX05UT19UQ1RMX0lPLCAwKTsKKyNlbmRpZgorI2lmZGVmIF9fUU5YTlRPX18KKyAgICBpZiAoKGludHJpZCA9IEludGVycnVwdEF0dGFjaChfTlRPX0lOVFJfQ0xBU1NfRVhURVJOQUwgfCBjbG9ja19pbnRubywKKyAgICAgICAgX1BNX3JpbmcwX2lzciwgKHZvaWQqKSZfUE1fUjAsIHNpemVvZihfUE1fUjApLCBfTlRPX0lOVFJfRkxBR1NfRU5EKSkgPT0gLTEpIHsKKyNlbHNlCisgICAgaWYgKChpbnRyaWQgPSBxbnhfaGludF9hdHRhY2goY2xvY2tfaW50bm8sIF9QTV9yaW5nMF9pc3IsIEZQX1NFRygmX1BNX1IwKSkpID09IC0xKSB7CisjZW5kaWYKKyAgICAgICAgcGVycm9yKCJBdHRhY2giKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB3aGlsZSAoX1BNX1IwLnNlcnZpY2UgIT0gLTEpCisgICAgICAgIDsKKyNpZmRlZiBfX1FOWE5UT19fCisgICAgSW50ZXJydXB0RGV0YWNoSWQoaW50cmlkKTsKKyNlbHNlCisgICAgcW54X2hpbnRfZGV0YWNoKGludHJpZCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGbHVzaCB0aGUgdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCit7CisgICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9GTFVTSF9UTEI7CisgICAgQ2FsbFJpbmcwKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX0FTTUFQSSBfTVRSUl9zYXZlQ1I0KHZvaWQpCit7CisgICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9TQVZFX0NSNDsKKyAgICBDYWxsUmluZzAoKTsKKyAgICByZXR1cm4gX1BNX1IwLnJlZzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQoreworICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfUkVTVE9SRV9DUjQ7CisgICAgX1BNX1IwLnJlZyA9IGNyNFZhbDsKKyAgICBDYWxsUmluZzAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIGEgbWFjaGluZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHRoZSBDUFUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfQVNNQVBJIF9NVFJSX3JlYWRNU1IoCisgICAgaW50IHJlZywKKyAgICB1bG9uZyAqZWF4LAorICAgIHVsb25nICplZHgpCit7CisgICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9SRUFEX01TUjsKKyAgICBfUE1fUjAucmVnID0gcmVnOworICAgIENhbGxSaW5nMCgpOworICAgICplYXggPSBfUE1fUjAuZWF4OworICAgICplZHggPSBfUE1fUjAuZWR4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dyaXRlIGEgbWFjaGluZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHRoZSBDUFUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfQVNNQVBJIF9NVFJSX3dyaXRlTVNSKAorICAgIGludCByZWcsCisgICAgdWxvbmcgZWF4LAorICAgIHVsb25nIGVkeCkKK3sKKyAgICBfUE1fUjAuc2VydmljZSA9IFIwX1dSSVRFX01TUjsKKyAgICBfUE1fUjAucmVnID0gcmVnOworICAgIF9QTV9SMC5lYXggPSBlYXg7CisgICAgX1BNX1IwLmVkeCA9IGVkeDsKKyAgICBDYWxsUmluZzAoKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2MTE5MwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9vc2hkci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUU5YCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZm5kZWYgX19RTlhOVE9fXworI2luY2x1ZGUgPHN5cy9tb3VzZS5oPgorI2luY2x1ZGUgPHN5cy9rZXlib2FyZC5oPgorI2luY2x1ZGUgPHN5cy9mZC5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9kY21kX2lucHV0Lmg+CisKKy8qIFRoaW5ncyAnYm9ycm93ZWQnIGZyb20gcGhvdG9uL2tleWNvZGVzLmggKi8KKworLyoKKyAqIEtleWJvYXJkIG1vZGlmaWVycworICovCisjZGVmaW5lIEtFWU1PREJJVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBLRVlNT0RCSVRfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgS0VZTU9EQklUX0FMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEtFWU1PREJJVF9BTFRHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBLRVlNT0RCSVRfU0hMMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgS0VZTU9EQklUX01PRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEtFWU1PREJJVF9NT0Q3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBLRVlNT0RCSVRfTU9EOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBLRVlNT0RCSVRfU0hJRlRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgS0VZTU9EQklUX0NUUkxfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEtFWU1PREJJVF9BTFRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgS0VZTU9EQklUX0FMVEdSX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBLRVlNT0RCSVRfU0hMM19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEtFWU1PREJJVF9NT0Q2X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgS0VZTU9EQklUX01PRDdfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBLRVlNT0RCSVRfTU9EOF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgS0VZTU9EQklUX0NBUFNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBLRVlNT0RCSVRfTlVNX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIEtFWU1PREJJVF9TQ1JPTExfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKKworI2RlZmluZSBLRVlNT0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSElGVCkKKyNkZWZpbmUgS0VZTU9EX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQ1RSTCkKKyNkZWZpbmUgS0VZTU9EX0FMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQUxUKQorI2RlZmluZSBLRVlNT0RfQUxUR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFRHUikKKyNkZWZpbmUgS0VZTU9EX1NITDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0hMMykKKyNkZWZpbmUgS0VZTU9EX01PRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9ENikKKyNkZWZpbmUgS0VZTU9EX01PRDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9ENykKKyNkZWZpbmUgS0VZTU9EX01PRDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9EOCkKKworI2RlZmluZSBLRVlNT0RfU0hJRlRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSElGVF9MT0NLKQorI2RlZmluZSBLRVlNT0RfQ1RSTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9DVFJMX0xPQ0spCisjZGVmaW5lIEtFWU1PRF9BTFRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0FMVF9MT0NLKQorI2RlZmluZSBLRVlNT0RfQUxUR1JfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFRHUl9MT0NLKQorI2RlZmluZSBLRVlNT0RfU0hMM19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSEwzX0xPQ0spCisjZGVmaW5lIEtFWU1PRF9NT0Q2X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDZfTE9DSykKKyNkZWZpbmUgS0VZTU9EX01PRDdfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9EN19MT0NLKQorI2RlZmluZSBLRVlNT0RfTU9EOF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q4X0xPQ0spCisKKyNkZWZpbmUgS0VZTU9EX0NBUFNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQ0FQU19MT0NLKQorI2RlZmluZSBLRVlNT0RfTlVNX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9OVU1fTE9DSykKKyNkZWZpbmUgS0VZTU9EX1NDUk9MTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0NST0xMX0xPQ0spCisKKy8qCisgKiBLZXlib2FyZCBmbGFncworICovCisjZGVmaW5lIEtFWV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEtleSB3YXMgcHJlc3NlZCBkb3duICovCisjZGVmaW5lIEtFWV9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIEtleSB3YXMgcmVwZWF0ZWQgKi8KKyNkZWZpbmUgS0VZX1NDQU5fVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgICAgLyogU2NhbmNvZGUgaXMgdmFsaWQgKi8KKyNkZWZpbmUgS0VZX1NZTV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogS2V5IHN5bWJvbCBpcyB2YWxpZCAqLworI2RlZmluZSBLRVlfQ0FQX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgICAgICAvKiBLZXkgY2FwIGlzIHZhbGlkICovCisjZGVmaW5lIEtFWV9ERUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMCAgICAgIC8qIEtleSBzeW1ib2wgaXMgYSBERUFEIGtleSAqLworI2RlZmluZSBLRVlfT0VNX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiBLZXkgY2FwIGlzIGFuIE9FTSBzY2FuIGNvZGUgZnJvbSBrZXlib2FyZCAqLworCisjZW5kaWYgIC8qIF9fUU5YTlRPX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNDFlYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9wbS5jCkBAIC0wLDAgKzEsODkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBRTlgKKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgIm10cnIuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgInFueC92Ymlvcy5oIgorI2lmbmRlZiBfX1FOWE5UT19fCisjaW5jbHVkZSA8c3lzL3NlZ2luZm8uaD4KKyNpbmNsdWRlIDxzeXMvY29uc29sZS5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaW5jbHVkZSA8aTg2Lmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgorI2luY2x1ZGUgPHN5cy9kY21kX2Noci5oPgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1aW50IFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCitzdGF0aWMgdm9pZCAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLworc3RhdGljIHVpbnQgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KK3N0YXRpYyB1aW50IFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCitzdGF0aWMgVkJJT1NyZWdzX3QgICpWUmVncyA9IE5VTEw7ICAvKiBQb2ludGVyIHRvIFZCSU9TIHJlZ2lzdGVycyAgICAgICAqLworc3RhdGljIGludCByYXdfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCBfY29uc29sZV9jdHJsICpjYyA9IE5VTEw7CitzdGF0aWMgaW50IGNvbnNvbGVfY291bnQgPSAwOworc3RhdGljIGludCBybWJ1Zl9pbnVzZSA9IDA7CisKK3N0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCit7CisgICAgY2hhciAqZm9yY2U7CisKKyAgICBpZiAoVlJlZ3MgPT0gTlVMTCkgeworI2lmZGVmICBfX1FOWE5UT19fCisgICAgICAgIFRocmVhZEN0bChfTlRPX1RDVExfSU8sIDApOyAvKiBHZXQgSU8gcHJpdmlsaWRnZSAqLworI2VuZGlmCisgICAgICAgIGZvcmNlID0gZ2V0ZW52KCJWQklPU19NRVRIT0QiKTsKKyAgICAgICAgVlJlZ3MgPSBWQklPU2luaXQoZm9yY2UgPyBhdG9pKGZvcmNlKSA6IDApOworICAgICAgICB9CisjaWZuZGVmICBfX1FOWE5UT19fCisgICAgTVRSUl9pbml0KCk7CisjZW5kaWYKK30KKworaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKK3sgcmV0dXJuIFZSZWdzICE9IE5VTEw7IH0KKworbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKK3sgcmV0dXJuIF9PU19RTlg7IH0KKworaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCit7IHJldHVybiBQTV8zODY7IH0KKwordm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKK3sKKyAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKKyAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7CisgICAgICAgIHNbcG9zXSA9ICcvJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKwordm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7CisgICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKK3sKKyAgICBpZiAoVkVTQUJ1Zl9wdHIpCisgICAgICAgIFBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKKyAgICBWRVNBQnVmX3B0ciA9IDA7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCit7CisgICAgaWYgKCFWRVNBQnVmX3B0cikgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KKyAgICAgICAgaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXRleGl0KEV4aXRWQkVCdWYpOworICAgICAgICB9CisgICAgKmxlbiA9IFZFU0FCdWZfbGVuOworICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOworICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOworICAgIHJldHVybiBWRVNBQnVmX3B0cjsKK30KKworc3RhdGljIGludCB0ZXJtX3Jhdyh2b2lkKQoreworICAgIHN0cnVjdCB0ZXJtaW9zICB0ZXJtaW9zX3A7CisKKyAgICBpZiAocmF3X2NvdW50KysgPiAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEdvIGludG8gInJhdyIgaW5wdXQgbW9kZSAqLworICAgIGlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmdGVybWlvc19wKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdGVybWlvc19wLmNfY2NbVk1JTl0gPSAgMTsKKyAgICB0ZXJtaW9zX3AuY19jY1tWVElNRV0gPSAgMDsKKyAgICB0ZXJtaW9zX3AuY19sZmxhZyAmPSB+KCBFQ0hPfElDQU5PTnxJU0lHfEVDSE9FfEVDSE9LfEVDSE9OTCk7CisgICAgdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQURSQUlOLCAmdGVybWlvc19wKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVybV9yZXN0b3JlKHZvaWQpCit7CisgICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pb3NfcDsKKworICAgIGlmIChyYXdfY291bnQtLSAhPSAxKQorICAgICAgICByZXR1cm47CisKKyAgICB0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmdGVybWlvc19wKTsKKyAgICB0ZXJtaW9zX3AuY19sZmxhZyB8PSAoRUNIT3xJQ0FOT058SVNJR3xFQ0hPRXxFQ0hPS3xFQ0hPTkwpOworICAgIHRlcm1pb3NfcC5jX29mbGFnIHw9IChPUE9TVCk7CisgICAgdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQURSQUlOLCAmdGVybWlvc19wKTsKK30KKworaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCit7CisgICAgaW50IGJsb2NraW5nLCBjOworCisgICAgaWYgKHRlcm1fcmF3KCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogR28gaW50byBub24gYmxvY2tpbmcgbW9kZSAqLworICAgIGJsb2NraW5nID0gZmNudGwoU1RESU5fRklMRU5PLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0s7CisgICAgZmNudGwoU1RESU5fRklMRU5PLCBGX1NFVEZMLCBibG9ja2luZyk7CisgICAgYyA9IGdldGMoc3RkaW4pOworCisgICAgLyogcmVzdG9yZSBibG9ja2luZyBtb2RlICovCisgICAgZmNudGwoU1RESU5fRklMRU5PLCBGX1NFVEZMLCBibG9ja2luZyAmIH5PX05PTkJMT0NLKTsKKyAgICB0ZXJtX3Jlc3RvcmUoKTsKKyAgICBpZiAoYyAhPSBFT0YpIHsKKyAgICAgICAgdW5nZXRjKGMsIHN0ZGluKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICBjbGVhcmVycihzdGRpbik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQoreworICAgIGludCBjOworCisgICAgaWYgKHRlcm1fcmF3KCkgPT0gLTEpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgYyA9IGdldGMoc3RkaW4pOworI2lmIGRlZmluZWQoX19RTlhfXykgJiYgIWRlZmluZWQoX19RTlhOVE9fXykKKyAgICBpZiAoYyA9PSAweEEpCisgICAgICAgIGMgPSAweDBEOworICAgIGVsc2UgaWYgKGMgPT0gMHg3RikKKyAgICAgICAgYyA9IDB4MDg7CisjZW5kaWYKKyAgICB0ZXJtX3Jlc3RvcmUoKTsKKyAgICByZXR1cm4gYzsKK30KKworUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKKyAgICBQTV9IV05EIGh3bmRVc2VyLAorICAgIGludCBkZXZpY2UsCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMsCisgICAgaW50IGJwcCwKKyAgICBpYm9vbCBmdWxsU2NyZWVuKQoreworI2lmbmRlZiBfX1FOWE5UT19fCisgICAgaW50IGZkOworCisgICAgaWYgKGNvbnNvbGVfY291bnQrKykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uMSIsIE9fUkRXUikpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgY2MgPSBjb25zb2xlX29wZW4oZmQsIE9fUkRXUik7CisgICAgY2xvc2UoZmQpOworICAgIGlmIChjYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYKKyAgICByZXR1cm4gMTsKK30KKworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICByZXR1cm4gUE1fZ2V0VkdBU3RhdGVTaXplKCkgKyBzaXplb2YoaW50KSAqIDM7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixpbnQgY29uc29sZV9pZCkKK3sKKyNpZmRlZiBfX1FOWE5UT19fCisgICAgaW50ICAgICBmZDsKKyAgICBpbnQgICAgIGZsYWdzOworCisgICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uMSIsIE9fUkRXUikpID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgZmxhZ3MgPSBfQ09OQ1RMX0lOVklTSUJMRV9DSEcgfCBfQ09OQ1RMX0lOVklTSUJMRTsKKyAgICBkZXZjdGwoZmQsIERDTURfQ0hSX1NFUkNUTCwgJmZsYWdzLCBzaXplb2YgZmxhZ3MsIDApOworICAgIGNsb3NlKGZkKTsKKyNlbHNlCisgICAgdWNoYXIgICAqYnVmID0gJigodWNoYXIqKXN0YXRlQnVmKVtQTV9nZXRWR0FTdGF0ZVNpemUoKV07CisKKyAgICAvKiBTYXZlIFFOWCA0IGNvbnNvbGUgc3RhdGUgKi8KKyAgICBjb25zb2xlX3JlYWQoY2MsIC0xLCAwLCBOVUxMLCAwLAorICAgICAgICAoaW50ICopYnVmKzEsIChpbnQgKilidWYrMiwgTlVMTCk7CisgICAgKihpbnQgKilidWYgPSBjb25zb2xlX2N0cmwoY2MsIC0xLAorICAgICAgICBDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFLAorICAgICAgICBDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFKTsKKworICAgIC8qIFNhdmUgc3RhdGUgb2YgVkdBIHJlZ2lzdGVycyAqLworICAgIFBNX3NhdmVWR0FTdGF0ZShzdGF0ZUJ1Zik7CisjZW5kaWYKK30KKwordm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCit7CisgICAgLyogVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgZm9yIGNvbnNvbGUgc3dpdGNoaW5nIGlmIHBvc3NpYmxlICovCit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQoreworI2lmZGVmIF9fUU5YTlRPX18KKyAgICBpbnQgICAgIGZkOworICAgIGludCAgICAgZmxhZ3M7CisKKyAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9jb24xIiwgT19SRFdSKSkgPT0gLTEpCisgICAgICAgIHJldHVybjsKKyAgICBmbGFncyA9IF9DT05DVExfSU5WSVNJQkxFX0NIRzsKKyAgICBkZXZjdGwoZmQsIERDTURfQ0hSX1NFUkNUTCwgJmZsYWdzLCBzaXplb2YgZmxhZ3MsIDApOworICAgIGNsb3NlKGZkKTsKKyNlbHNlCisgICAgdWNoYXIgICAqYnVmID0gJigodWNoYXIqKXN0YXRlQnVmKVtQTV9nZXRWR0FTdGF0ZVNpemUoKV07CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgVkdBIGNvbXBhdGlibGUgcmVnaXN0ZXJzICovCisgICAgUE1fcmVzdG9yZVZHQVN0YXRlKHN0YXRlQnVmKTsKKworICAgIC8qIFJlc3RvcmUgUU5YIDQgY29uc29sZSBzdGF0ZSAqLworICAgIGNvbnNvbGVfY3RybChjYywgLTEsICooaW50ICopYnVmLAorICAgICAgICBDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFKTsKKyAgICBjb25zb2xlX3dyaXRlKGNjLCAtMSwgMCwgTlVMTCwgMCwKKyAgICAgICAgKGludCAqKWJ1ZisxLCAoaW50ICopYnVmKzIsIE5VTEwpOworI2VuZGlmCit9CisKK3ZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisjaWZuZGVmIF9fUU5YTlRPX18KKyAgICBpZiAoLS1jb25zb2xlX2NvdW50ID09IDApIHsKKyAgICAgICAgY29uc29sZV9jbG9zZShjYyk7CisgICAgICAgIGNjID0gTlVMTDsKKyAgICAgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKK3sKKyAgICBpZiAoIWNjKQorICAgICAgICByZXR1cm47CisjaWZuZGVmIF9fUU5YTlRPX18KKyAgICBjb25zb2xlX3dyaXRlKGNjLCAtMSwgMCwgTlVMTCwgMCwgJnksICZ4LCBOVUxMKTsKKyNlbmRpZgorfQorCit2b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCit7Cit9CisKK2lib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgsIGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIFFOWAorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIFFOWAorfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBRTlgKK30KKworY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAorICAgIGNoYXIgKnBhdGgsCisgICAgaW50IG1heExlbikKK3sKKyAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKK30KKworY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKK3sgcmV0dXJuICcvJzsgfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCit7IHJldHVybiBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpOyB9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIGNoYXIgKmVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIik7CisjaWZkZWYgX19RTlhOVE9fXworI2lmZGVmIF9fWDg2X18KKyAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC94ODYvYmluIjsKKyNlbGlmIGRlZmluZWQgKF9fUFBDX18pCisgICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvcHBjYmUvYmluIjsKKyNlbGlmIGRlZmluZWQgKF9fTUlQU19fKQorI2lmZGVmIF9fQklHRU5ESUFOX18KKyAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9taXBzYmUvYmluIjsKKyNlbHNlCisgICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvbWlwc2xlL2JpbiI7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fU0hfXykKKyNpZmRlZiBfX0JJR0VORElBTl9fCisgICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvc2hiZS9iaW4iOworI2Vsc2UKKyAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9zaGxlL2JpbiI7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fQVJNX18pCisgICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvYXJtbGUvYmluIjsKKyNlbmRpZgorI2Vsc2UgICAvKiBRTlggNCAqLworICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3FueDQvc2NpdGVjaC9iaW4iOworI2VuZGlmCit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbNTEyXTsKKyAgICBjaGFyICAgICAgICAqZW52OworI2lmZGVmIF9fUU5YTlRPX18KKyAgICBjaGFyIHRlbXBbNjRdOworICAgIGdldGhvc3RuYW1lKHRlbXAsIHNpemVvZiAodGVtcCkpOworICAgIHRlbXBbc2l6ZW9mICh0ZW1wKSAtIDFdID0gJ1wwJzsgICAgIC8qIFBhcmFub2lkICovCisgICAgc3ByaW50ZihwYXRoLCIvZXRjL2NvbmZpZy9zY2l0ZWNoLyVzL2NvbmZpZyIsIHRlbXApOworI2Vsc2UKKyAgICBzcHJpbnRmKHBhdGgsIi9ldGMvY29uZmlnL3NjaXRlY2gvJWQvY29uZmlnIiwgZ2V0bmlkKCkpOworI2VuZGlmCisgICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKSB7CisgICAgICAgIHN0cmNweShwYXRoLGVudik7CisgICAgICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICAgICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOworICAgICAgICB9CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworI2lmZGVmIF9fUU5YTlRPX18KKyAgICBnZXRob3N0bmFtZShidWYsIHNpemVvZiAoYnVmKSk7CisjZWxzZQorICAgIHNwcmludGYoYnVmLCJub2RlJWQiLCBnZXRuaWQoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKKyNpZmRlZiBfX1FOWE5UT19fCisgICAgZ2V0aG9zdG5hbWUoYnVmLCBzaXplb2YgKGJ1ZikpOworI2Vsc2UKKyAgICBzcHJpbnRmKGJ1Ziwibm9kZSVkIiwgZ2V0bmlkKCkpOworI2VuZGlmCisgICAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCit7CisgICAgcmV0dXJuIFBNX21hcFJlYWxQb2ludGVyKDAsIDB4NDAwKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreworICAgIHN0YXRpYyB2b2lkICpwdHIgPSBOVUxMOworICAgIHZvaWQgKmZyZWVwdHI7CisgICAgdW5zaWduZWQgb2Zmc2V0LCBpLCBtYXBsZW47CisKKyAgICBpZiAocHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBwdHI7CisKKyAgICAvKiBTb21lIHRyaWNrZXJ5IGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgbGluZWFyIGFkZHJlc3MgNjRLIGFsaWduZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIHB0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKKyAgICAgICAgb2Zmc2V0ID0gMHgxMDAwMCAtICgodW5zaWduZWQpcHRyICUgMHgxMDAwMCk7CisgICAgICAgIGlmICghb2Zmc2V0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG11bm1hcChwdHIsIDB4MTAwMDApOworICAgICAgICBtYXBsZW4gPSAweDEwMDAwICsgb2Zmc2V0OworICAgICAgICBmcmVlcHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAtb2Zmc2V0LCBtYXBsZW4tMSx0cnVlKTsKKyAgICAgICAgcHRyID0gKHZvaWQgKikob2Zmc2V0ICsgKHVuc2lnbmVkKWZyZWVwdHIpOworICAgICAgICBpZiAoMHgxMDAwMCAtICgodW5zaWduZWQpcHRyICUgMHgxMDAwMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbXVubWFwKGZyZWVwdHIsIG1hcGxlbik7CisgICAgICAgIH0KKyAgICBpZiAoaSA9PSA1KSB7CisgICAgICAgIHByaW50ZigiQ291bGQgbm90IGdldCBhIDY0SyBhbGlnbmVkIGxpbmVhciBhZGRyZXNzIGZvciBBMDAwMCByZWdpb25cbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoreworICAgIHVjaGFyX3QgKnA7CisgICAgdW5zaWduZWQgbzsKKyAgICB1bnNpZ25lZCBwcm90ID0gUFJPVF9SRUFEfFBST1RfV1JJVEV8KGlzQ2FjaGVkPzA6UFJPVF9OT0NBQ0hFKTsKKyNpZmRlZiBfX1BBR0VTSVpFCisgICAgaW50IHBhZ2VzaXplID0gX19QQUdFU0laRTsKKyNlbHNlCisgICAgaW50IHBhZ2VzaXplID0gNDA5NjsKKyNlbmRpZgorICAgIGludCByb3VuZGRvd24gPSBiYXNlICUgcGFnZXNpemU7CisjaWZuZGVmIF9fUU5YTlRPX18KKyAgICBzdGF0aWMgaW50IF9fVmlkRkQgPSAtMTsKKyNlbmRpZgorCisgICAgaWYgKHJvdW5kZG93bikgeworICAgICAgICBpZiAoYmFzZSA8IHJvdW5kZG93bikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBiYXNlIC09IHJvdW5kZG93bjsKKyAgICAgICAgbGltaXQgKz0gcm91bmRkb3duOworICAgICAgICB9CisKKyNpZm5kZWYgX19RTlhOVE9fXworICAgIGlmIChfX1ZpZEZEIDwgMCkgeworICAgICAgICBpZiAoKF9fVmlkRkQgPSBzaG1fb3BlbiggIlBoeXNpY2FsIiwgT19SRFdSLCAwNzc3ICkpID09IC0xKSB7CisgICAgICAgICAgICBwZXJyb3IoICJDYW5ub3Qgb3BlbiBQaHlzaWNhbCBtZW1vcnkiICk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgbyA9IGJhc2UgJiAweEZGRjsKKyAgICBsaW1pdCA9IChsaW1pdCArIG8gKyAweEZGRikgJiB+MHhGRkY7CisgICAgaWYgKChpbnQpKHAgPSBtbWFwKCAwLCBsaW1pdCwgcHJvdCwgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgIF9fVmlkRkQsIGJhc2UgKSkgPT0gLTEgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgcCArPSBvOworI2Vsc2UKKyAgICBpZiAoKHAgPSBtbWFwKDAsIGxpbWl0LCBwcm90LCBNQVBfUEhZUyB8IE1BUF9TSEFSRUQsCisgICAgICAgICAgICBOT0ZELCBiYXNlKSkgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICByZXR1cm4gKHZvaWQgKiktMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChwICsgcm91bmRkb3duKTsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKKyAgICBtdW5tYXAocHRyLGxpbWl0KzEpOworfQorCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyCisgICAgLy8gICAgICAgYWRkcmVzcy4KKyAgICByZXR1cm4gMHhGRkZGRkZGRlVMOworfQorCitpYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKKyAgICB2b2lkICpwLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKK3sKKyAgICAvLyBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICAvLyBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5CisgICAgLy8gICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLgorICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNGODsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgyRjg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzQkM7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4Mzc4OworICAgICAgICBjYXNlIDI6IHJldHVybiAweDI3ODsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKK3sKKyAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQoreworICAgIFBNX2ZyZWUocHRyKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sKKyAgICB2b2lkICpwOworCisgICAgUE1faW5pdCgpOworCisgICAgaWYgKChwID0gVkJJT1NnZXRtZW1wdHIocl9zZWcsIHJfb2ZmLCBWUmVncykpID09ICh2b2lkICopLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBwOworfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKK3sKKyAgICBpZiAoc2l6ZSA+IDEwMjQpIHsKKyAgICAgICAgcHJpbnRmKCJQTV9hbGxvY1JlYWxTZWc6IGNhbid0IGhhbmRsZSAlZCBieXRlc1xuIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgaWYgKHJtYnVmX2ludXNlICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJQTV9hbGxvY1JlYWxTZWc6IHRyYW5zZmVyIGFyZWEgYWxyZWFkeSBpbiB1c2VcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIFBNX2luaXQoKTsKKyAgICBybWJ1Zl9pbnVzZSA9IDE7CisgICAgKnJfc2VnID0gVkJJT1NfVHJhbnNCdWZWU2VnKFZSZWdzKTsKKyAgICAqcl9vZmYgPSBWQklPU19UcmFuc0J1ZlZPZmYoVlJlZ3MpOworICAgIHJldHVybiAodm9pZCopVkJJT1NfVHJhbnNCdWZQdHIoVlJlZ3MpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKK3sKKyAgICBpZiAocm1idWZfaW51c2UgPT0gMCkgeworICAgICAgICBwcmludGYoIlBNX2ZyZWVSZWFsU2VnOiBub3RoaW5nIHdhcyBhbGxvY2F0ZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBybWJ1Zl9pbnVzZSA9IDA7Cit9CisKK3ZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKK3sKKyAgICBQTV9pbml0KCk7CisgICAgaWYgKFZSZWdzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIFZSZWdzLT5sLmVheCA9IHJlZ3MtPmVheDsKKyAgICBWUmVncy0+bC5lYnggPSByZWdzLT5lYng7CisgICAgVlJlZ3MtPmwuZWN4ID0gcmVncy0+ZWN4OworICAgIFZSZWdzLT5sLmVkeCA9IHJlZ3MtPmVkeDsKKyAgICBWUmVncy0+bC5lc2kgPSByZWdzLT5lc2k7CisgICAgVlJlZ3MtPmwuZWRpID0gcmVncy0+ZWRpOworCisgICAgVkJJT1NpbnQoaW50bm8sIFZSZWdzLCAxMDI0KTsKKworICAgIHJlZ3MtPmVheCA9IFZSZWdzLT5sLmVheDsKKyAgICByZWdzLT5lYnggPSBWUmVncy0+bC5lYng7CisgICAgcmVncy0+ZWN4ID0gVlJlZ3MtPmwuZWN4OworICAgIHJlZ3MtPmVkeCA9IFZSZWdzLT5sLmVkeDsKKyAgICByZWdzLT5lc2kgPSBWUmVncy0+bC5lc2k7CisgICAgcmVncy0+ZWRpID0gVlJlZ3MtPmwuZWRpOworICAgIHJlZ3MtPmZsYWdzID0gVlJlZ3MtPncuZmxhZ3MgJiAweDE7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQoreworICAgIFBNX2luaXQoKTsKKyAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7CisgICAgVlJlZ3MtPmwuZWJ4ID0gaW4tPmUuZWJ4OworICAgIFZSZWdzLT5sLmVjeCA9IGluLT5lLmVjeDsKKyAgICBWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7CisgICAgVlJlZ3MtPmwuZXNpID0gaW4tPmUuZXNpOworICAgIFZSZWdzLT5sLmVkaSA9IGluLT5lLmVkaTsKKworICAgIFZCSU9TaW50KGludG5vLCBWUmVncywgMTAyNCk7CisKKyAgICBvdXQtPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OworICAgIG91dC0+ZS5lYnggPSBWUmVncy0+bC5lYng7CisgICAgb3V0LT5lLmVjeCA9IFZSZWdzLT5sLmVjeDsKKyAgICBvdXQtPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OworICAgIG91dC0+ZS5lc2kgPSBWUmVncy0+bC5lc2k7CisgICAgb3V0LT5lLmVkaSA9IFZSZWdzLT5sLmVkaTsKKyAgICBvdXQtPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKKworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBQTV9pbml0KCk7CisgICAgaWYgKFZSZWdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGludG5vID09IDB4MjEpIHsKKyAgICAgICAgdGltZV90IHRvZGF5ID0gdGltZShOVUxMKTsKKyAgICAgICAgc3RydWN0IHRtICp0OworICAgICAgICB0ID0gbG9jYWx0aW1lKCZ0b2RheSk7CisgICAgICAgIG91dC0+eC5jeCA9IHQtPnRtX3llYXIgKyAxOTAwOworICAgICAgICBvdXQtPmguZGggPSB0LT50bV9tb24gKyAxOworICAgICAgICBvdXQtPmguZGwgPSB0LT50bV9tZGF5OworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7CisgICAgICAgIFZSZWdzLT5sLmVieCA9IGluLT5lLmVieDsKKyAgICAgICAgVlJlZ3MtPmwuZWN4ID0gaW4tPmUuZWN4OworICAgICAgICBWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7CisgICAgICAgIFZSZWdzLT5sLmVzaSA9IGluLT5lLmVzaTsKKyAgICAgICAgVlJlZ3MtPmwuZWRpID0gaW4tPmUuZWRpOworICAgICAgICBWUmVncy0+dy5lcyA9IHNyZWdzLT5lczsKKyAgICAgICAgVlJlZ3MtPncuZHMgPSBzcmVncy0+ZHM7CisKKyAgICAgICAgVkJJT1NpbnQoaW50bm8sIFZSZWdzLCAxMDI0KTsKKworICAgICAgICBvdXQtPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OworICAgICAgICBvdXQtPmUuZWJ4ID0gVlJlZ3MtPmwuZWJ4OworICAgICAgICBvdXQtPmUuZWN4ID0gVlJlZ3MtPmwuZWN4OworICAgICAgICBvdXQtPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OworICAgICAgICBvdXQtPmUuZXNpID0gVlJlZ3MtPmwuZXNpOworICAgICAgICBvdXQtPmUuZWRpID0gVlJlZ3MtPmwuZWRpOworICAgICAgICBvdXQtPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKKyAgICAgICAgc3JlZ3MtPmVzID0gVlJlZ3MtPncuZXM7CisgICAgICAgIHNyZWdzLT5kcyA9IFZSZWdzLT53LmRzOworCisgICAgICAgIHJldHVybiBvdXQtPnguYXg7CisgICAgICAgIH0KK30KKwordm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqaW4sCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgUE1faW5pdCgpOworICAgIGlmIChWUmVncyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7CisgICAgVlJlZ3MtPmwuZWJ4ID0gaW4tPmUuZWJ4OworICAgIFZSZWdzLT5sLmVjeCA9IGluLT5lLmVjeDsKKyAgICBWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7CisgICAgVlJlZ3MtPmwuZXNpID0gaW4tPmUuZXNpOworICAgIFZSZWdzLT5sLmVkaSA9IGluLT5lLmVkaTsKKyAgICBWUmVncy0+dy5lcyA9IHNyZWdzLT5lczsKKyAgICBWUmVncy0+dy5kcyA9IHNyZWdzLT5kczsKKworICAgIFZCSU9TY2FsbChzZWcsIG9mZiwgVlJlZ3MsIDEwMjQpOworCisgICAgaW4tPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OworICAgIGluLT5lLmVieCA9IFZSZWdzLT5sLmVieDsKKyAgICBpbi0+ZS5lY3ggPSBWUmVncy0+bC5lY3g7CisgICAgaW4tPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OworICAgIGluLT5lLmVzaSA9IFZSZWdzLT5sLmVzaTsKKyAgICBpbi0+ZS5lZGkgPSBWUmVncy0+bC5lZGk7CisgICAgaW4tPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKKyAgICBzcmVncy0+ZXMgPSBWUmVncy0+dy5lczsKKyAgICBzcmVncy0+ZHMgPSBWUmVncy0+dy5kczsKK30KKwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKK3sKKyNpZm5kZWYgX19RTlhOVE9fXworICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IF9tZW1hdmwoKTsKKyNlbmRpZgorfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCisgICAgdWludCBzaXplLAorICAgIHVsb25nICpwaHlzQWRkciwKKyAgICBpYm9vbCBjb250aWd1b3VzLAorICAgIGlib29sIGJlbG93MTZNKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uIFFOWAorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCisgICAgdm9pZCAqcCwKKyAgICB1aW50IHNpemUsCisgICAgaWJvb2wgY29udGlndW91cykKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlgKK30KKwordm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKKyAgICBpYm9vbCBsb2NrZWQpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgb24gUU5YCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCisgICAgdm9pZCAqcCkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlgKK30KKwordm9pZCBQTUFQSSBQTV9zZXRCYW5rQShpbnQgYmFuaykKK3sKKyAgICBQTV9pbml0KCk7CisgICAgaWYgKFZSZWdzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNTsKKyAgICBWUmVncy0+bC5lYnggPSAweDAwMDA7CisgICAgVlJlZ3MtPmwuZWR4ID0gYmFuazsKKyAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKGludCBiYW5rKQoreworICAgIFBNX2luaXQoKTsKKyAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgVlJlZ3MtPmwuZWF4ID0gMHg0RjA1OworICAgIFZSZWdzLT5sLmVieCA9IDB4MDAwMDsKKyAgICBWUmVncy0+bC5lZHggPSBiYW5rOworICAgIFZCSU9TaW50KDB4MTAsIFZSZWdzLCAxMDI0KTsKKworICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNTsKKyAgICBWUmVncy0+bC5lYnggPSAweDAwMDE7CisgICAgVlJlZ3MtPmwuZWR4ID0gYmFuazsKKyAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCit7CisgICAgUE1faW5pdCgpOworICAgIGlmIChWUmVncyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBWUmVncy0+bC5lYXggPSAweDRGMDc7CisgICAgVlJlZ3MtPmwuZWJ4ID0gd2FpdFZSVDsKKyAgICBWUmVncy0+bC5lY3ggPSB4OworICAgIFZSZWdzLT5sLmVkeCA9IHk7CisgICAgVkJJT1NpbnQoMHgxMCwgVlJlZ3MsIDEwMjQpOworfQorCitpYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAorICAgIHVzaG9ydCBheFZhbCwKKyAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCisgICAgdm9pZCAqY29weU9mQklPUywKKyAgICB1bG9uZyBCSU9TTGVuKQoreworICAgICh2b2lkKWF4VmFsOworICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKKyAgICAodm9pZCljb3B5T2ZCSU9TOworICAgICh2b2lkKUJJT1NMZW47CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcCA9IHA7ICBsZW4gPSBsZW47CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHAgPSBwOyAgbGVuID0gbGVuOworICAgIHJldHVybiAxOworfQorCitQTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCisgICAgY29uc3QgY2hhciAqc3pETExOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEKKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWhNb2R1bGU7CisgICAgKHZvaWQpc3pQcm9jTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyEKKyAgICAodm9pZCloTW9kdWxlOworfQorCitpbnQgUE1BUEkgUE1fc2V0SU9QTCgKKyAgICBpbnQgbGV2ZWwpCit7CisgICAgLy8gUU5YIGhhbmRsZXMgSU9QTCBzZWxlY3Rpb24gYXQgdGhlIHByb2dyYW0gbGluayBsZXZlbC4KKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KK3R5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKKworUkVUVVJOUzoKK0Vycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCisgICAgdWxvbmcgYmFzZSwKKyAgICB1bG9uZyBzaXplLAorICAgIHVpbnQgdHlwZSkKK3sKKyNpZm5kZWYgIF9fUU5YTlRPX18KKyAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOworI2Vsc2UKKyAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC92ZmxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWVmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvdmZsYXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKK3sKKyAgICBiYXNlQWRkciA9IGJhc2VBZGRyOworICAgIGJhbmtTaXplID0gYmFua1NpemU7CisgICAgY29kZUxlbiA9IGNvZGVMZW47CisgICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3NDA5NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC96dGltZXIuYwpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBRTlgKKyoKKyogRGVzY3JpcHRpb246ICBRTlggc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9fWlRpbWVySW5pdCh2b2lkKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VzZSB0aGUgZ2V0dGltZW9mZGF5KCkgZnVuY3Rpb24gdG8gZ2V0IG1pY3Jvc2Vjb25kIHByZWNpc2lvbiAocHJvYmFibHkgbGVzcwordGhvdWdoKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisgICAgcmV0dXJuICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIHRtLT5zdGFydC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJMYXAodG0pICAgICAgICAoX19VTFpSZWFkVGltZSgpIC0gdG0tPnN0YXJ0LmxvdykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICAgICAgdG0tPmVuZC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyQ291bnQodG0pICAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQord2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCithY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCitwYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKK3sgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2NwdWluZm8uYwpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKKyogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCit7CisgICAgaW50ICAgICBvbGRQcmlvcml0eTsKKyAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisKKyAgICBvbGRQcmlvcml0eSA9IEdldFRocmVhZFByaW9yaXR5KGhUaHJlYWQpOworICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQorICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7CisgICAgcmV0dXJuIG9sZFByaW9yaXR5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Jlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoCisgICAgaW50IG9sZFByaW9yaXR5KQoreworICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKKworICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQorICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBvbGRQcmlvcml0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQoreworICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopZnJlcSkpIHsKKyAgICAgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOworICAgICAgICBmcmVxLT5sb3cgPSAxMDAwMDA7CisgICAgICAgIGZyZXEtPmhpZ2ggPSAwOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdCk7ICAgICAgICAgXAorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodCktPmxvdyA9IHRpbWVHZXRUaW1lKCkgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYmEyMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2V2ZW50LmMKQEAgLTAsMCArMSwyODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgorKgorKiBEZXNjcmlwdGlvbjogIFdpbjMyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQorKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdXNob3J0ICAga2V5VXBNc2dbMjU2XSA9IHswfTsgICAgLyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLworc3RhdGljIGludCAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIFdpbjMyICovCisjZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKKyNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKKworUkVNQVJLUzoKK1RoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCit0aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQorc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KK3RoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KK2V2ZW50cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCit7IHJldHVybiB0aW1lR2V0VGltZSgpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZyb20gV2luMzIgaW50byBvdXIgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQoreworICAgIE1TRyAgICAgbXNnOworICAgIE1TRyAgICAgY2hhck1zZzsKKyAgICBldmVudF90IGV2dDsKKworICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLE5VTEwsMCwwLFBNX1JFTU9WRSkpIHsKKyAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgIHN3aXRjaCAobXNnLm1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLIHwgRVZUX0RCTENMSUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9MQlVUVE9OVVA6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOIHwgRVZUX0RCTENMSUNLOworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9LRVlET1dOOgorICAgICAgICAgICAgY2FzZSBXTV9TWVNLRVlET1dOOgorICAgICAgICAgICAgICAgIGlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9SRVBFQVQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV01fS0VZVVA6CisgICAgICAgICAgICBjYXNlIFdNX1NZU0tFWVVQOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgbW91c2UgZXZlbnQgbW9kaWZpZXIgZmxhZ3MgKi8KKyAgICAgICAgaWYgKGV2dC53aGF0ICYgRVZUX01PVVNFRVZUKSB7CisgICAgICAgICAgICBldnQud2hlcmVfeCA9IG1zZy5wdC54OworICAgICAgICAgICAgZXZ0LndoZXJlX3kgPSBtc2cucHQueTsKKyAgICAgICAgICAgIGlmIChldnQud2hhdCA9PSBFVlRfTU9VU0VNT1ZFKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZE1vdmUgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZ0cVtvbGRNb3ZlXS53aGVyZV94ID0gZXZ0LndoZXJlX3g7LyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgZXZ0cVtvbGRNb3ZlXS53aGVyZV95ID0gZXZ0LndoZXJlX3k7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvbGRNb3ZlID0gZnJlZUhlYWQ7IC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvbGRNb3ZlID0gLTE7CisgICAgICAgICAgICBpZiAobXNnLndQYXJhbSAmIE1LX0xCVVRUT04pCisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKKyAgICAgICAgICAgIGlmIChtc2cud1BhcmFtICYgTUtfUkJVVFRPTikKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEJVVDsKKyAgICAgICAgICAgIGlmIChtc2cud1BhcmFtICYgTUtfU0hJRlQpCisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7CisgICAgICAgICAgICBpZiAobXNnLndQYXJhbSAmIE1LX0NPTlRST0wpCisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQga2V5Ym9hcmQgY29kZXMgKi8KKyAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgaWYgKGV2dC53aGF0ICYgRVZUX0tFWUVWVCkgeworICAgICAgICAgICAgaW50IHNjYW5Db2RlID0gKG1zZy5sUGFyYW0gPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZVVApIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgbWVzc2FnZSBmb3Iga2V5dXAgY29kZSBmcm9tIHRhYmxlIG9mIGNhY2hlZCBkb3duIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2NhbkNvZGVdOworICAgICAgICAgICAgICAgIGtleVVwTXNnW3NjYW5Db2RlXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fQ0hBUixXTV9DSEFSLFBNX1JFTU9WRSkpCisgICAgICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07CisgICAgICAgICAgICAgICAgaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fU1lTQ0hBUixXTV9TWVNDSEFSLFBNX1JFTU9WRSkpCisgICAgICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgfD0gKChtc2cubFBhcmFtID4+IDgpICYgMHhGRjAwKTsKKyAgICAgICAgICAgICAgICBrZXlVcE1zZ1tzY2FuQ29kZV0gPSAodXNob3J0KWV2dC5tZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZUkVQRUFUKQorICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlIHw9IChtc2cubFBhcmFtIDw8IDE2KTsKKyAgICAgICAgICAgIGlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9BTFRET1dOKQorICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOworICAgICAgICAgICAgaWYgKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMFUpCisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7CisgICAgICAgICAgICBpZiAoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDBVKQorICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKKyAgICAgICAgICAgIG9sZE1vdmUgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoZXZ0LndoYXQgIT0gMCkgeworICAgICAgICAgICAgLyogQWRkIHRpbWUgc3RhbXAgYW5kIGFkZCB0aGUgZXZlbnQgdG8gdGhlIHF1ZXVlICovCisgICAgICAgICAgICBldnQud2hlbiA9IG1zZy50aW1lOworICAgICAgICAgICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgeworICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0VWVF9hYm9ydCgpCit7CisgICAgRVZUX2V4aXQoKTsKKyAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAorCitSRU1BUktTOgorSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgordG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAordGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgorCitXZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCitldmVudCBoYW5kbGluZyByb3V0aW5lcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfaW5pdCgKKyAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQoreworICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCisgICAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKKyAgICBpbml0RXZlbnRRdWV1ZSgpOworICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOworCisgICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLworICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKKyAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0NoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCitzcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCittb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKKyAgICBpbnQgeFJlcywKKyAgICBpbnQgeVJlcykKK3sKKyAgICByYW5nZVggPSB4UmVzOworICAgIHJhbmdlWSA9IHlSZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitNb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKK2FuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX3NldE1vdXNlUG9zKAorICAgIGludCAqeCwKKyAgICBpbnQgKnkpCit7CisgICAgU2V0Q3Vyc29yUG9zKCp4LCp5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfcmVzdW1lKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3IgV2luMzIKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfc3VzcGVuZCh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIFdpbjMyCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitFeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfZXhpdCh2b2lkKQoreworICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCisgICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1MmRhZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L29zaGRyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKKyoKKyogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjMWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3BtLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCisqCisqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCisqICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCisqICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQorKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCisqICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2lmZGVmICBfX0JPUkxBTkRDX18KKyNwcmFnbWEgd2FybiAtcGFyCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgICAgIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBNVFJSX2luaXQodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBkTyBhbnkgc3BlY2lhbCBpbml0IGNvZGUgaW4gaGVyZS4KKyAgICBNVFJSX2luaXQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7CisgICAgcmV0dXJuIF9PU19SVFRBUkdFVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreworICAgIHJldHVybiBQTV8zODY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAorICAgIGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKKyAgICAgICAgc1twb3NdID0gJ1xcJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAorICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKK3sKKyAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKKyAgICBjb25zdCBjaGFyICptc2cpCit7CisgICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQorICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgIC8vIFRPRE86IERpc3BsYXkgYSBmYXRhbCBlcnJvciBtZXNzYWdlIGFuZCBleGl0IQorLy8gIE1lc3NhZ2VCb3goTlVMTCxtc2csIkZhdGFsIEVycm9yISIsIE1CX0lDT05FWENMQU1BVElPTik7CisgICAgZXhpdCgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCisgICAgdWludCAqbGVuLAorICAgIHVpbnQgKnJzZWcsCisgICAgdWludCAqcm9mZikKK3sKKyAgICAvKiBObyBCSU9TIGFjY2VzcyBmb3IgdGhlIFJUVGFyZ2V0ICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBOZWVkIHRvIGNoZWNrIGlmIGEga2V5IGlzIHdhaXRpbmcgb24gdGhlIGtleWJvYXJkIHF1ZXVlCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sKKyAgICAvLyBUT0RPOiBOZWVkIHRvIG9idGFpbiB0aGUgbmV4dCBrZXlwcmVzcywgYW5kIGJsb2NrIHVudGlsIG9uZSBpcyBoaXQKKyAgICByZXR1cm4gMHhEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKKyAgICBpbnQgeCwKKyAgICBpbnQgeSkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBSVFRhcmdldC0zMiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0KQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFJUVGFyZ2V0LTMyICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKKyAgICBQTV9pbnRIYW5kbGVyIGloLAorICAgIGludCBmcmVxdWVuY3kpCit7CisgICAgLyogTm90IHN1cHBvcnRlZCBmb3IgUlRUYXJnZXQtMzIgKi8KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCisgICAgaW50IGZyZXF1ZW5jeSkKK3sKKyAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFJUVGFyZ2V0LTMyICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKK3sKKyAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFJUVGFyZ2V0LTMyICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCisgICAgY2hhciAqcGF0aCwKKyAgICBpbnQgbWF4TGVuKQoreworICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoreworICAgIHJldHVybiAnYyc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKK3sKKyAgICByZXR1cm4gImM6XFwiOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCit7CisgICAgLy8gVE9ETzogUG9pbnQgdGhpcyBhdCB0aGUgcGF0aCB3aGVuIHRoZSBOdWNsZXVzIGRyaXZlcnMgd2lsbCBiZSBmb3VuZAorICAgIHJldHVybiAiYzpcXG51Y2xldXMiOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKyAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOworICAgIHJldHVybiBwYXRoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKK3sKKyAgICByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitHZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCit7CisgICAgLyogTm90IG5lY2Vzc2FyeSBmb3IgUlRUYXJnZXQtMzIgKi8KKyAgICByZXR1cm4gIlVua25vd24iOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKK3sKKyAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKKyAgICBpZiAoIWJhbmtQdHIpCisgICAgICAgIGJhbmtQdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7CisgICAgcmV0dXJuIGJhbmtQdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxpbWl0LAorICAgIGlib29sIGlzQ2FjaGVkKQoreworICAgIC8vIFRPRE86IE1hcCBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAorICAgIHZvaWQgKnB0ciwKKyAgICB1bG9uZyBsaW1pdCkKK3sKKyAgICAvLyBUT0RPOiBGcmVlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcKK30KKwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhcgorICAgIC8vICAgICAgIGFkZHJlc3MuCisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKwordm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCit7CisgICAgU2xlZXAobWlsbGlzZWNvbmRzKTsKK30KKworaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIC8vIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkKKyAgICAvLyAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuCisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0JDOworICAgICAgICBjYXNlIDE6IHJldHVybiAweDM3ODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgyNzg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mICh1bm5hbWVkKSBzaGFyZWQgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCisgICAgbG9uZyBzaXplKQoreworICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKAorICAgIHZvaWQgKnB0cikKK3sKKyAgICBQTV9mcmVlKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCithZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCitQTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKKyAgICB2b2lkICpiYXNlLAorICAgIHVsb25nIGxpbWl0KQoreworICAgIHJldHVybiBiYXNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCisgICAgdWludCByX3NlZywKKyAgICB1aW50IHJfb2ZmKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCisgICAgdWludCBzaXplLAorICAgIHVpbnQgKnJfc2VnLAorICAgIHVpbnQgKnJfb2ZmKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCisgICAgdm9pZCAqbWVtKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdCAocGFyYW1ldGVycyBpbiBEUE1JIGNvbXBhdGlibGUgc3RydWN0dXJlKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgRFBNSV9yZWdzICpyZWdzKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1faW50ODYoCisgICAgaW50IGludG5vLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1SRUdTICpvdXQpCit7CisgICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9pbnQ4NngoCisgICAgaW50IGludG5vLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCisgICAgdWludCBzZWcsCisgICAgdWludCBvZmYsCisgICAgUk1SRUdTICppbiwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAorICAgIHVsb25nICpwaHlzaWNhbCwKKyAgICB1bG9uZyAqdG90YWwpCit7CisgICAgLy8gVE9ETzogRmlndXJlIG91dCBob3cgdG8gZGV0ZXJtaW5lIHRoZSBhdmFpbGFibGUgbWVtb3J5LiBOb3QgZW50aXJlbHkKKyAgICAvLyAgICAgICBjcml0aWNhbCBzbyByZXR1cm5pbmcgMCBpcyBPSy4KKyAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgLy8gVE9ETzogQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoc3lpY2FsbHkgY29udGlnb3VzIG1lbW9yeSBmb3IgRE1BCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAorICAgIHZvaWQgKnAsCisgICAgdWludCBzaXplLAorICAgIAorICAgIGlib29sIGNvbnRpZ3VvdXMpCit7CisgICAgLy8gVE9ETzogRnJlZSBhIGxvY2tlZCBtZW1vcnkgYnVmZmVyCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCisgICAgaW50IGJhbmspCit7CisgICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAorICAgIGludCBiYW5rKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IHdhaXRWUlQpCit7CisgICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAorICAgIHVzaG9ydCBheFZhbCwKKyAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCisgICAgdm9pZCAqbWFwcGVkQklPUykKK3sKKyAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgdG8gbG9hZCBzaGFyZWQgbGlicmFyaWVzIQorICAgICh2b2lkKXN6RExMTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAorICAgIFBNX01PRFVMRSBoTW9kdWxlLAorICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgKHZvaWQpaE1vZHVsZTsKKyAgICAodm9pZClzelByb2NOYW1lOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAorICAgIFBNX01PRFVMRSBoTW9kdWxlKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgICh2b2lkKWhNb2R1bGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2gKKyAgICAvLyAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlCisgICAgLy8gICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClmaW5kRGF0YTsKKyAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCisgICAgdWxvbmcgaGFuZGxlLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uCisgICAgLy8gICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0bworICAgIC8vICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkCisgICAgLy8gICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uCisgICAgKHZvaWQpaGFuZGxlOworICAgICh2b2lkKWZpbmREYXRhOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdWxvbmcgaGFuZGxlKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvCisgICAgLy8gICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4KKyAgICAodm9pZCloYW5kbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMSAgIC0gRHJpdmUgQToKKyAgICAyICAgLSBEcml2ZSBCOgorICAgIDMgICAtIERyaXZlIEM6CisgICAgZXRjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAorICAgIGNoYXIgZHJpdmUpCit7CisgICAgaWYgKGRyaXZlID09IDMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgorVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCitvZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKKyAgICBpbnQgZHJpdmUsCisgICAgY2hhciAqZGlyLAorICAgIGludCBsZW4pCit7CisgICAgKHZvaWQpZHJpdmU7CisgICAgZ2V0Y3dkKGRpcixsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyAgICAvLyBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpYXR0cmliOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ta2RpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX3JtZGlyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC92ZmxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOWRmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC92ZmxhdC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCisqCisqIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpZmRlZiAgX19CT1JMQU5EQ19fCisjcHJhZ21hIHdhcm4gLXBhcgorI2VuZGlmCisKK2lib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQoreworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NzJjMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3p0aW1lci5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50RnJlcTsKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7CitzdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX1pUaW1lckluaXQodm9pZCkKK3sKKyNpZmRlZiAgTk9fQVNTRU1CTEVSCisgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOworI2Vsc2UKKyAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQorICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5zdGFydCk7CisgICAgZWxzZQorICAgICAgICB0bS0+c3RhcnQubG93ID0gdGltZUdldFRpbWUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7CisKKyAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgeworICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtTGFwKTsKKyAgICAgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKKyAgICAgICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRtTGFwLmxvdyA9IHRpbWVHZXRUaW1lKCk7CisgICAgICAgIHJldHVybiAodG1MYXAubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPmVuZCk7CisgICAgZWxzZQorICAgICAgICB0bS0+ZW5kLmxvdyA9IHRpbWVHZXRUaW1lKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OworCisgICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKKyAgICAgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOworICAgICAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKK3sgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoreyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fZXZlbnQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19ldmVudC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2MmIxZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fZXZlbnQuYXNtCkBAIC0wLDAgKzEsMTc1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyCis7KiBFbnZpcm9ubWVudDogSUJNIFBDIChNUyBET1MpCis7KgorOyogRGVzY3JpcHRpb246IEFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBldmVudCBtb2R1bGUuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBpZGVhbAorCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitpZmRlZiBmbGF0bW9kZWwKKworaGVhZGVyICBfZXZlbnQgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX2V2ZW50CisKKyAgICBjZXh0ZXJuICBfRVZUX2Jpb3NQdHIsRFBUUgorCisgICAgY3B1YmxpYyBfRVZUX2RhdGFTdGFydAorCitpZmRlZiAgIFVTRV9OQVNNCislZGVmaW5lIEtCX0hFQUQgICAgIFdPUkQgZXNpKzAxQWggICA7IEtleWJvYXJkIGJ1ZmZlciBoZWFkIGluIEJJT1MgZGF0YSBhcmVhCislZGVmaW5lIEtCX1RBSUwgICAgIFdPUkQgZXNpKzAxQ2ggICA7IEtleWJvYXJkIGJ1ZmZlciB0YWlsIGluIEJJT1MgZGF0YSBhcmVhCislZGVmaW5lIEtCX1NUQVJUICAgIFdPUkQgZXNpKzA4MGggICA7IFN0YXJ0IG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQorJWRlZmluZSBLQl9FTkQgICAgICBXT1JEIGVzaSswODJoICAgOyBFbmQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCitlbHNlCitLQl9IRUFEICAgICBFUVUgV09SRCBlc2krMDFBaCAgICAgICA7IEtleWJvYXJkIGJ1ZmZlciBoZWFkIGluIEJJT1MgZGF0YSBhcmVhCitLQl9UQUlMICAgICBFUVUgV09SRCBlc2krMDFDaCAgICAgICA7IEtleWJvYXJkIGJ1ZmZlciB0YWlsIGluIEJJT1MgZGF0YSBhcmVhCitLQl9TVEFSVCAgICBFUVUgV09SRCBlc2krMDgwaCAgICAgICA7IFN0YXJ0IG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQorS0JfRU5EICAgICAgRVFVIFdPUkQgZXNpKzA4MmggICAgICAgOyBFbmQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCitlbmRpZgorCisgICAgY3B1YmxpYyBfRVZUX2RhdGFFbmQKKworZW5kZGF0YXNlZyAgX2V2ZW50CisKK2JlZ2NvZGVzZWcgIF9ldmVudCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKKworICAgIGNwdWJsaWMgX0VWVF9jb2RlU3RhcnQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IF9FVlRfZ2V0S2V5Q29kZSh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyB0aGUga2V5IGNvZGUgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBrZXkgYnkgZXh0cmFjdGluZyBpdCBmcm9tCis7IHRoZSBCSU9TIGtleWJvYXJkIGJ1ZmZlci4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfRVZUX2dldEtleUNvZGUKKworICAgICAgICBlbnRlcl9jCisKKyAgICAgICAgbW92ICAgICBlc2ksW19FVlRfYmlvc1B0cl0KKyAgICAgICAgeG9yICAgICBlYngsZWJ4CisgICAgICAgIHhvciAgICAgZWF4LGVheAorICAgICAgICBtb3YgICAgIGJ4LFtLQl9IRUFEXQorICAgICAgICBjbXAgICAgIGJ4LFtLQl9UQUlMXQorICAgICAgICBqeiAgICAgIEBARG9uZQorICAgICAgICB4b3IgICAgIGVheCxlYXgKKyAgICAgICAgbW92ICAgICBheCxbZXNpK2VieF0gICAgOyBFQVggOj0gY2hhcmFjdGVyIGZyb20ga2V5Ym9hcmQgYnVmZmVyCisgICAgICAgIGluYyAgICAgX2J4CisgICAgICAgIGluYyAgICAgX2J4CisgICAgICAgIGNtcCAgICAgYngsW0tCX0VORF0gICAgIDsgSGl0IHRoZSBlbmQgb2YgdGhlIGtleWJvYXJkIGJ1ZmZlcj8KKyAgICAgICAgamwgICAgICBAQDEKKyAgICAgICAgbW92ICAgICBieCxbS0JfU1RBUlRdCitAQDE6ICAgIG1vdiAgICAgW0tCX0hFQURdLGJ4ICAgIDsgVXBkYXRlIGtleWJvYXJkIGJ1ZmZlciBoZWFkIHBvaW50ZXIKKworQEBEb25lOiBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgX0VWVF9kaXNhYmxlSW50KHZvaWQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0VWVF9kaXNhYmxlSW50CisKKyAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCisgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfRVZUX3Jlc3RvcmVJbnQoaW50IHBzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX0VWVF9yZXN0b3JlSW50CisKKyAgICAgICAgQVJHICAgICBwczpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKKyAgICAgICAgcHVzaCAgICBbRFdPUkQgcHNdCisgICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBwcm9jZXNzb3Igc3RhdHVzIChhbmQgaW50ZXJydXB0cykKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmVhZHMgYW4gaW5kZXhlZCByZWdpc3RlciB2YWx1ZSBmcm9tIGFuIEkvTyBwb3J0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEVWVF9yZGlueAorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBvdXQgICAgIGR4LGFsCisgICAgICAgIGluYyAgICAgZHgKKyAgICAgICAgaW4gICAgICBhbCxkeAorICAgICAgICBtb3Z6eCAgIGVheCxhbAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBFVlRfd3JpbngoaW50IHBvcnQsaW50IGluZGV4LGludCB2YWx1ZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFdyaXRlcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIHRvIGFuIEkvTyBwb3J0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEVWVF93cmlueAorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5ULCB2YWx1ZTpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQorICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQorICAgICAgICBtb3YgICAgIGFoLFtCWVRFIHZhbHVlXQorICAgICAgICBvdXQgICAgIGR4LGF4CisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCisgICAgY3B1YmxpYyBfRVZUX2NvZGVFbmQKKworZW5kY29kZXNlZyAgX2V2ZW50CisKK2VuZGlmCisKKyAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19senRpbWVyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fbHp0aW1lci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ZWVhNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fbHp0aW1lci5hc20KQEAgLTAsMCArMSw1OCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgTkFTTSBvciBUQVNNIEFzc2VtYmxlcgorOyogRW52aXJvbm1lbnQ6IHNteCAzMiBiaXQgaW50ZWwgQ1BVCis7KgorOyogRGVzY3JpcHRpb246IFNNWCBkb2VzIG5vdCBzdXBwb3J0IDQ4NidzLCBzbyB0aGlzIG1vZHVsZSBpcyBub3QgbmVjZXNzYXJ5LgorOyoKKzsqICBBbGwgcmVnaXN0ZXJzIGFuZCBhbGwgZmxhZ3MgYXJlIHByZXNlcnZlZCBieSBhbGwgcm91dGluZXMsIGV4Y2VwdAorOyogIGludGVycnVwdHMgd2hpY2ggYXJlIGFsd2F5cyB0dXJuZWQgb24KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIgorCitoZWFkZXIgICAgICBfbHp0aW1lcgorCitiZWdkYXRhc2VnICBfbHp0aW1lcgorCitlbmRkYXRhc2VnICBfbHp0aW1lcgorCitiZWdjb2Rlc2VnICBfbHp0aW1lciAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitjcHJvY3N0YXJ0ICAgTFpfZGlzYWJsZQorICAgICAgICBjbGkKKyAgICAgICAgcmV0CitjcHJvY2VuZAorCitjcHJvY3N0YXJ0ICAgTFpfZW5hYmxlCisgICAgICAgIHN0aQorICAgICAgICByZXQKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF9senRpbWVyCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3BtLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG0uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2NiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3BtLmFzbQpAQCAtMCwwICsxLDQ0OCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Cis7KgorOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bworOyogICAgICAgICAgICAgIFNNWC4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG0gICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX3BtCisKKyAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorCitpbnRlbF9pZCAgICAgICAgZGIgICJHZW51aW5lSW50ZWwiICA7IEludGVsIHZlbmRvciBJRAorCitlbmRkYXRhc2VnICBfcG0KKworYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnRkbGwxNiBQTV9zZWdyZWFkCisKKyAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgYXgsZXMKKyAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQorICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAorICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCisgICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcworICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCisgICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCisKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOyBDcmVhdGUgYSB0YWJsZSBvZiB0aGUgMjU2IGRpZmZlcmVudCBpbnRlcnJ1cHQgY2FsbHMgdGhhdCB3ZSBjYW4ganVtcAorOyBpbnRvCisKK2lmZGVmICAgVVNFX05BU00KKworJWFzc2lnbiBpbnRubyAwCisKK2ludFRhYmxlOgorJXJlcCAgICAyNTYKKyAgICAgICAgZGIgICAgICAwQ0RoCisgICAgICAgIGRiICAgICAgaW50bm8KKyVhc3NpZ24gaW50bm8gICBpbnRubyArIDEKKyAgICAgICAgcmV0CisgICAgICAgIG5vcAorJWVuZHJlcAorCitlbHNlCisKK2ludG5vID0gMAorCitpbnRUYWJsZToKKyAgICAgICAgUkVQVCAgICAyNTYKKyAgICAgICAgZGIgICAgICAwQ0RoCisgICAgICAgIGRiICAgICAgaW50bm8KK2ludG5vID0gaW50bm8gKyAxCisgICAgICAgIHJldAorICAgICAgICBub3AKKyAgICAgICAgRU5ETQorCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBfUE1fZ2VuSW50ICAgIC0gR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jbmVhciAgIF9QTV9nZW5JbnQKKworICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYXgKKyAgICAgICAgcHVzaCAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2J4CisgICAgICAgIG1vdiAgICAgZWJ4LFtVSU5UIGVzcCsxMl0gICAgICAgOyBFQlggOj0gaW50ZXJydXB0IG51bWJlcgorICAgICAgICBtb3YgICAgIF9heCxvZmZzZXQgaW50VGFibGUgICAgIDsgUG9pbnQgdG8gaW50ZXJydXB0IGdlbmVyYXRpb24gdGFibGUKKyAgICAgICAgc2hsICAgICBfYngsMiAgICAgICAgICAgICAgICAgICA7IF9CWCA6PSBpbmRleCBpbnRvIHRhYmxlCisgICAgICAgIGFkZCAgICAgX2F4LF9ieCAgICAgICAgICAgICAgICAgOyBfQVggOj0gcG9pbnRlciB0byBpbnRlcnJ1cHQgY29kZQorICAgICAgICB4Y2hnICAgIGVheCxbZXNwKzRdICAgICAgICAgICAgIDsgUmVzdG9yZSBlYXgsIGFuZCBzZXQgZm9yIGludAorICAgICAgICBwb3AgICAgIF9ieCAgICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBfYngKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJc3N1ZXMgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgcm91dGluZSBoYXMgYmVlbgorOyB3cml0dGVuIHRvIGFsbG93IHVzZXIgcHJvZ3JhbXMgdG8gbG9hZCBDUyBhbmQgRFMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCis7IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydGRsbDE2IFBNX2ludDM4NngKKworICAgICAgICBBUkcgICAgIGludG5vOlVJTlQsIGlucHRyOkRQVFIsIG91dHB0cjpEUFRSLCBzcmVnczpEUFRSCisKKyAgICAgICAgTE9DQUwgICBmbGFnczpVSU5ULCBzdl9kczpVSU5ULCBzdl9lc2k6VUxPTkcgPSBMb2NhbFNpemUKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2ggICAgZHMKKyAgICAgICAgcHVzaCAgICBlcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzZWdtZW50IHJlZ2lzdGVycworICAgICAgICBwdXNoICAgIGZzCisgICAgICAgIHB1c2ggICAgZ3MKKworICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBEUzpfU0kgLT4gTG9hZCBzZWdtZW50IHJlZ2lzdGVycworICAgICAgICBtb3YgICAgIGVzLFtfc2ldCisgICAgICAgIG1vdiAgICAgYngsW19zaSs2XQorICAgICAgICBtb3YgICAgIFtzdl9kc10sX2J4ICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIHVzZXIgRFMgb24gc3RhY2sKKyAgICAgICAgbW92ICAgICBmcyxbX3NpKzhdCisgICAgICAgIG1vdiAgICAgZ3MsW19zaSsxMF0KKworICAgICAgICBfbGRzICAgIF9zaSxbaW5wdHJdICAgICAgICAgOyBMb2FkIENQVSByZWdpc3RlcnMKKyAgICAgICAgbW92ICAgICBlYXgsW19zaV0KKyAgICAgICAgbW92ICAgICBlYngsW19zaSs0XQorICAgICAgICBtb3YgICAgIGVjeCxbX3NpKzhdCisgICAgICAgIG1vdiAgICAgZWR4LFtfc2krMTJdCisgICAgICAgIG1vdiAgICAgZWRpLFtfc2krMjBdCisgICAgICAgIG1vdiAgICAgZXNpLFtfc2krMTZdCisKKyAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIF9icCAgICAgICAgICAgICAgICAgOyBTb21lIGludGVycnVwdHMgdHJhc2ggdGhpcyEKKyAgICAgICAgY2xjICAgICAgICAgICAgICAgICAgICAgICAgIDsgR2VuZXJhdGUgdGhlIGludGVycnVwdAorICAgICAgICBwdXNoICAgIFtVSU5UIGludG5vXQorICAgICAgICBtb3YgICAgIGRzLFtXT1JEIHN2X2RzXSAgICAgOyBTZXQgdmFsdWUgb2YgdXNlcidzIERTIHNlbGVjdG9yCisgICAgICAgIGNhbGwgICAgX1BNX2dlbkludAorICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBQb3AgaW50bm8gZnJvbSBzdGFjayAoZmxhZ3MgdW5jaGFuZ2VkKQorICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIHN0YWNrIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB2YWx1ZSBvZiBEUworCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgZmxhZ3MgZm9yIGxhdGVyCisgICAgICAgIHBvcCAgICAgW1VJTlQgZmxhZ3NdCisgICAgICAgIHB1c2ggICAgZXNpICAgICAgICAgICAgICAgICA7IFNhdmUgRVNJIGZvciBsYXRlcgorICAgICAgICBwb3AgICAgIFtEV09SRCBzdl9lc2ldCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgRFMgZm9yIGxhdGVyCisgICAgICAgIHBvcCAgICAgW1VJTlQgc3ZfZHNdCisKKyAgICAgICAgX2xkcyAgICBfc2ksW291dHB0cl0gICAgICAgIDsgU2F2ZSBDUFUgcmVnaXN0ZXJzCisgICAgICAgIG1vdiAgICAgW19zaV0sZWF4CisgICAgICAgIG1vdiAgICAgW19zaSs0XSxlYngKKyAgICAgICAgbW92ICAgICBbX3NpKzhdLGVjeAorICAgICAgICBtb3YgICAgIFtfc2krMTJdLGVkeAorICAgICAgICBwdXNoICAgIFtEV09SRCBzdl9lc2ldCisgICAgICAgIHBvcCAgICAgW0RXT1JEIF9zaSsxNl0KKyAgICAgICAgbW92ICAgICBbX3NpKzIwXSxlZGkKKworICAgICAgICBtb3YgICAgIF9ieCxbZmxhZ3NdICAgICAgICAgOyBSZXR1cm4gZmxhZ3MKKyAgICAgICAgYW5kICAgICBlYngsMWggICAgICAgICAgICAgIDsgSXNvbGF0ZSBjYXJyeSBmbGFnCisgICAgICAgIG1vdiAgICAgW19zaSsyNF0sZWJ4ICAgICAgICA7IFNhdmUgY2FycnkgZmxhZyBzdGF0dXMKKworICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCisgICAgICAgIG1vdiAgICAgW19zaV0sZXMKKyAgICAgICAgbW92ICAgICBfYngsW3N2X2RzXQorICAgICAgICBtb3YgICAgIFtfc2krNl0sYnggICAgICAgICAgOyBHZXQgcmV0dXJuZWQgRFMgZnJvbSBzdGFjaworICAgICAgICBtb3YgICAgIFtfc2krOF0sZnMKKyAgICAgICAgbW92ICAgICBbX3NpKzEwXSxncworCisgICAgICAgIHBvcCAgICAgZ3MgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc2VnbWVudCByZWdpc3RlcnMKKyAgICAgICAgcG9wICAgICBmcworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9zYXZlRFModm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNhdmUgdGhlIHZhbHVlIG9mIERTIGludG8gYSBzZWN0aW9uIG9mIHRoZSBjb2RlIHNlZ21lbnQsIHNvIHRoYXQgd2UgY2FuCis7IHF1aWNrbHkgbG9hZCB0aGlzIHZhbHVlIGF0IGEgbGF0ZXIgZGF0ZSBpbiB0aGUgUE1fbG9hZERTKCkgcm91dGluZSBmcm9tCis7IGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZXRjLiBUaGUgbWV0aG9kIHRvIGRvIHRoaXMgaXMgZGlmZmVyZW50Cis7IGRlcGVuZGluZyBvbiB0aGUgRE9TIGV4dGVuZGVyIGJlaW5nIHVzZWQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydGRsbDE2IFBNX3NhdmVEUworCisgICAgICAgIG1vdiAgICAgW19QTV9zYXZlZERTXSxkcyAgICA7IFN0b3JlIGF3YXkgaW4gZGF0YSBzZWdtZW50CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX2xvYWREUyh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUm91dGluZSB0byBsb2FkIHRoZSBEUyByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY3VycmVudAorOyBET1MgZXh0ZW5kZXIuIE9ubHkgdGhlIERTIHJlZ2lzdGVyIGlzIGxvYWRlZCwgbm90IHRoZSBFUyByZWdpc3Rlciwgc28KKzsgaWYgeW91IHdpc2ggdG8gY2FsbCBDIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gYWxzbyBsb2FkIHRoZSBFUyByZWdpc3RlcgorOyBpbiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydGRsbDE2IFBNX2xvYWREUworCisgICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXSA7IFdlIGNhbiBhY2Nlc3MgdGhlIHByb3BlciBEUyB0aHJvdWdoIENTCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX3NldEJhbmtBKGludCBiYW5rKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQQorCisgICAgICAgIEFSRyAgICAgYmFuazpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIG1vdiAgICAgX2J4LDAKKyAgICAgICAgbW92ICAgICBfYXgsNEYwNWgKKyAgICAgICAgbW92ICAgICBfZHgsW2JhbmtdCisgICAgICAgIGludCAgICAgMTBoCisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX3NldEJhbmtBQihpbnQgYmFuaykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0FCCisKKyAgICAgICAgQVJHICAgICBiYW5rOlVJTlQKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCxlc3AKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgbW92ICAgICBfYngsMAorICAgICAgICBtb3YgICAgIF9heCw0RjA1aAorICAgICAgICBtb3YgICAgIF9keCxbYmFua10KKyAgICAgICAgaW50ICAgICAxMGgKKyAgICAgICAgbW92ICAgICBfYngsMQorICAgICAgICBtb3YgICAgIF9heCw0RjA1aAorICAgICAgICBtb3YgICAgIF9keCxbYmFua10KKyAgICAgICAgaW50ICAgICAxMGgKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgICAgIFBNX3NldENSVFN0YXJ0CisKKyAgICAgICAgQVJHICAgICB4OlVJTlQsIHk6VUlOVCwgd2FpdFZSVDpVSU5UCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIG1vdiAgICAgX2J4LFt3YWl0VlJUXQorICAgICAgICBtb3YgICAgIF9jeCxbeF0KKyAgICAgICAgbW92ICAgICBfZHgsW3ldCisgICAgICAgIG1vdiAgICAgX2F4LDRGMDdoCisgICAgICAgIGludCAgICAgMTBoCisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgX1BNX2lucChpbnQgcG9ydCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9pbnAKKworICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICB4b3IgICAgIF9heCxfYXgKKyAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCisgICAgICAgIGluICAgICAgYWwsZHgKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX291dHAoaW50IHBvcnQsaW50IHZhbHVlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fb3V0cAorCisgICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCisKKyAgICAgICAgcHVzaCAgICBfYnAKKyAgICAgICAgbW92ICAgICBfYnAsX3NwCisgICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQorICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgZHgsYWwKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCis7IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAorOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCisKK2lmZGVmICAgVVNFX05BU00KKyVtYWNybyAgREVMQVkgMAorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorJWVuZG1hY3JvCislbWFjcm8gIElPREVMQVlOIDEKKyVyZXAgICAgJTEKKyAgICAgICAgREVMQVkKKyVlbmRyZXAKKyVlbmRtYWNybworZWxzZQorbWFjcm8gICBERUxBWQorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorICAgICAgICBqbXAgICAgIHNob3J0ICQrMgorZW5kbQorbWFjcm8gICBJT0RFTEFZTiAgICBOCisgICAgcmVwdCAgICBOCisgICAgICAgIERFTEFZCisgICAgZW5kbQorZW5kbQorZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdWNoYXIgX1BNX3JlYWRDTU9TKGludCBpbmRleCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKKzsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fcmVhZENNT1MKKworICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQKKworICAgICAgICBwdXNoICAgIF9icAorICAgICAgICBtb3YgICAgIF9icCxfc3AKKyAgICAgICAgcHVzaGZkCisgICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCisgICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCisgICAgICAgIGNsaQorICAgICAgICBvdXQgICAgIDcwaCxhbAorICAgICAgICBJT0RFTEFZTiA1CisgICAgICAgIGluICAgICAgYWwsNzFoCisgICAgICAgIG1vdiAgICAgYWgsYWwKKyAgICAgICAgeG9yICAgICBhbCxhbAorICAgICAgICBJT0RFTEFZTiA1CisgICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKKyAgICAgICAgc3RpCisgICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAorICAgICAgICBwb3BmZAorICAgICAgICBwb3AgICAgIF9icAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKKzsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCisKKyAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICBwdXNoZmQKKyAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KKyAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKKyAgICAgICAgY2xpCisgICAgICAgIG91dCAgICAgNzBoLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCisgICAgICAgIG91dCAgICAgNzFoLGFsCisgICAgICAgIHhvciAgICAgYWwsYWwKKyAgICAgICAgSU9ERUxBWU4gNQorICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCisgICAgICAgIHN0aQorICAgICAgICBwb3BmZAorICAgICAgICBwb3AgICAgIF9icAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX2dldFBEQgorCisgICAgICAgIG1vdiAgICAgZWF4LGNyMworICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBfUE1fZmx1c2hUTEIgLSBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCisKKyAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgIAorICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF9wbQorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbXNteC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3Btc214LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUyY2UzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbXNteC5hc20KQEAgLTAsMCArMSw5MzMgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKzsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCis7KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKzsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorOyoKKzsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis7KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCis7KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOyoKKzsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqCis7KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQorOyogRW52aXJvbm1lbnQ6IDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KKzsqICAgICAgICAgICAgICBTTVggaW50ZXJydXB0IGhhbmRsaW5nLgorOyoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgSURFQUwKKworaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKKworaGVhZGVyICAgICAgX3Btc214ICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworOyBEZWZpbmUgdGhlIHNpemUgb2Ygb3VyIGxvY2FsIHN0YWNrcy4gRm9yIHJlYWwgbW9kZSBjb2RlIHRoZXkgY2FudCBiZQorOyB0aGF0IGJpZywgYnV0IGZvciAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSB3ZSBjYW4gbWFrZSB0aGVtIG5pY2UgYW5kCis7IGxhcmdlIHNvIHRoYXQgY29tcGxleCBDIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZC4KKworTU9VU0VfU1RBQ0sgRVFVIDQwOTYKK1RJTUVSX1NUQUNLIEVRVSA0MDk2CitLRVlfU1RBQ0sgICBFUVUgMTAyNAorSU5UMTBfU1RBQ0sgRVFVIDEwMjQKKworaWZkZWYgICBVU0VfTkFTTQorCis7IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCisKKyVpbWFjcm8gICBMT0FEX0RTIDAKKyAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdCisgICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQorJWVuZG1hY3JvCisKKzsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCis7ICVpbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQorOyB0aGVzZSAlaW1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCis7IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKKzsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgorCis7IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KKworJWltYWNybyBORVdTVEsgIDEKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgW3NlZ18lMV0sc3MKKyAgICAgICAgbW92ICAgICBbcHRyXyUxXSxfc3AKKyAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKKyAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KKyAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0ICUxCislZW5kbWFjcm8KKworOyAlaW1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCisKKyVpbWFjcm8gICBSRVNUU1RLICAgMQorICAgICAgICBjbGkKKyAgICAgICAgbW92ICAgICBzcyxbc2VnXyUxXQorICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyUxXQorJWVuZG1hY3JvCisKKzsgJWltYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgorCislaW1hY3JvIFNXQVBTVEsgMQorICAgICAgICBjbGkKKyAgICAgICAgbW92ICAgICBheCxzcworICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJTFdCisgICAgICAgIG1vdiAgICAgc3MsYXgKKyAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8lMV0KKyVlbmRtYWNybworCitlbHNlCisKKzsgTWFjcm8gdG8gbG9hZCBEUyBhbmQgRVMgcmVnaXN0ZXJzIHdpdGggY29ycmVjdCB2YWx1ZS4KKworTUFDUk8gICBMT0FEX0RTCisgICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXQorICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KK0VORE0KKworOyBOb3RlIHRoYXQgaW50ZXJydXB0cyB3ZSBkaXNhYmxlIGludGVycnVwdHMgZHVyaW5nIHRoZSBmb2xsb3dpbmcgc3RhY2sKKzsgbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQorOyB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBzbyBpbnRlcnJ1cHRzIHNob3VsZAorOyBhbHJlYWR5IGJlIG9mZi4gV2UgdHVybiB0aGVtIGJhY2sgb24gZXhwbGljaXRseSBsYXRlciBpZiB0aGUgdXNlciBjb2RlCis7IG5lZWRzIHRoZW0gdG8gYmUgYmFjayBvbi4KKworOyBNYWNybyB0byBzd2l0Y2ggdG8gYSBuZXcgbG9jYWwgc3RhY2suCisKK01BQ1JPICAgTkVXU1RLICBzdGtuYW1lCisgICAgICAgIGNsaQorICAgICAgICBtb3YgICAgIFtzZWdfJnN0a25hbWUmXSxzcworICAgICAgICBtb3YgICAgIFtwdHJfJnN0a25hbWUmXSxfc3AKKyAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKKyAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KKyAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0IHN0a25hbWUKK0VORE0KKworOyBNYWNybyB0byBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrLgorCitNQUNSTyAgIFJFU1RTVEsgc3RrbmFtZQorICAgICAgICBjbGkKKyAgICAgICAgbW92ICAgICBzcyxbc2VnXyZzdGtuYW1lJl0KKyAgICAgICAgbW92ICAgICBfc3AsW3B0cl8mc3RrbmFtZSZdCitFTkRNCisKKzsgTWFjcm8gdG8gc3dhcCB0aGUgY3VycmVudCBzdGFjayB3aXRoIHRoZSBvbmUgc2F2ZWQgYXdheS4KKworTUFDUk8gICBTV0FQU1RLIHN0a25hbWUKKyAgICAgICAgY2xpCisgICAgICAgIG1vdiAgICAgYXgsc3MKKyAgICAgICAgeGNoZyAgICBheCxbc2VnXyZzdGtuYW1lJl0KKyAgICAgICAgbW92ICAgICBzcyxheAorICAgICAgICB4Y2hnICAgIF9zcCxbcHRyXyZzdGtuYW1lJl0KK0VORE0KKworZW5kaWYKKworYmVnZGF0YXNlZyAgX3Btc214CisKKyAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorICAgIGNleHRlcm4gX1BNX2NyaXRIYW5kbGVyLENQVFIKKyAgICBjZXh0ZXJuIF9QTV9icmVha0hhbmRsZXIsQ1BUUgorICAgIGNleHRlcm4gX1BNX3RpbWVySGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1fcnRjSGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1fa2V5SGFuZGxlcixDUFRSCisgICAgY2V4dGVybiBfUE1fa2V5MTVIYW5kbGVyLENQVFIKKyAgICBjZXh0ZXJuIF9QTV9tb3VzZUhhbmRsZXIsQ1BUUgorICAgIGNleHRlcm4gX1BNX2ludDEwSGFuZGxlcixDUFRSCisKKyAgICBjZXh0ZXJuIF9QTV9jdHJsQ1B0cixEUFRSCisgICAgY2V4dGVybiBfUE1fY3RybEJQdHIsRFBUUgorICAgIGNleHRlcm4gX1BNX2NyaXRQdHIsRFBUUgorCisgICAgY2V4dGVybiBfUE1fcHJldlRpbWVyLEZDUFRSCisgICAgY2V4dGVybiBfUE1fcHJldlJUQyxGQ1BUUgorICAgIGNleHRlcm4gX1BNX3ByZXZLZXksRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2S2V5MTUsRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2QnJlYWssRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2Q3RybEMsRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2Q3JpdGljYWwsRkNQVFIKKyAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbFRpbWVyLFVMT05HCisgICAgY2V4dGVybiBfUE1fcHJldlJlYWxSVEMsVUxPTkcKKyAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEtleSxVTE9ORworICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsS2V5MTUsVUxPTkcKKyAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEludDEwLFVMT05HCisKK2NwdWJsaWMgX1BNX3Btc214RGF0YVN0YXJ0CisKKzsgQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgbG9jYWwgc3RhY2tzIHRoYXQgd2UgbmVlZC4gVGhlc2Ugc3RhY2tzCis7IGFyZSBub3QgdmVyeSBsYXJnZSwgYnV0IHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMKKzsgKGdlbmVyYWxseSB5b3Ugd2FudCB0byBoYW5kbGUgdGhlc2UgaW50ZXJydXB0cyBxdWlja2x5LCBzaW1wbHkgc3RvcmluZworOyB0aGUgaW5mb3JtYXRpb24gZm9yIGxhdGVyIGFuZCB0aGVuIHJldHVybmluZykuIElmIHlvdSBuZWVkIGJpZ2dlcgorOyBzdGFja3MgdGhlbiBjaGFuZ2UgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIGhlcmUuCisKKyAgICAgICAgICAgIEFMSUdOICAgNAorICAgICAgICAgICAgZGNsYiBNT1VTRV9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCitNc1N0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKK3B0cl9Nc1N0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0CitzZWdfTXNTdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKKworICAgICAgICAgICAgQUxJR04gICA0CisgICAgICAgICAgICBkY2xiIElOVDEwX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKK0ludDEwU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQorcHRyX0ludDEwU3RhY2sgIERVSU5UICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKK3NlZ19JbnQxMFN0YWNrICBkdyAgICAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAorCisgICAgICAgICAgICBBTElHTiAgIDQKKyAgICAgICAgICAgIGRjbGIgVElNRVJfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQorVG1TdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCitwdHJfVG1TdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAorc2VnX1RtU3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50CisKKyAgICAgICAgICAgIEFMSUdOICAgNAorICAgICAgICAgICAgZGNsYiBUSU1FUl9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCitSdGNTdGFjazogICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKK3B0cl9SdGNTdGFjayBEVUlOVCAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0CitzZWdfUnRjU3RhY2sgZHcgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKK1J0Y0luc2lkZSAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKKworICAgICAgICAgICAgQUxJR04gICA0CisgICAgICAgICAgICBkY2xiIEtFWV9TVEFDSyAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKK0t5U3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQorcHRyX0t5U3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKK3NlZ19LeVN0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAorS3lJbnNpZGUgICAgZHcgICAgICAwICAgICAgICAgICA7IEFyZSB3ZSBzdGlsbCBoYW5kbGluZyBjdXJyZW50IGludGVycnVwdAorCisgICAgICAgICAgICBBTElHTiAgIDQKKyAgICAgICAgICAgIGRjbGIgS0VZX1NUQUNLICAgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQorS3kxNVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCitwdHJfS3kxNVN0YWNrICAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAorc2VnX0t5MTVTdGFjayAgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50CisKK1RlbXBTZWcgICAgIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBzdGFjayBzZWdtZW50CisKK2NwdWJsaWMgX1BNX3Btc214RGF0YUVuZAorCitlbmRkYXRhc2VnICBfcG1zbXgKKworYmVnY29kZXNlZyAgX3Btc214ICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAorCitjcHVibGljIF9QTV9wbXNteENvZGVTdGFydAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9tb3VzZUlTUiAtIE1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEludGVycnVwdCBzdWJyb3V0aW5lIGNhbGxlZCBieSB0aGUgbW91c2UgZHJpdmVyIHVwb24gaW50ZXJydXB0cywgdG8KKzsgZGlzcGF0Y2ggY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIEludGVycnVwdHMgYXJlIG9uCis7IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgorOworOyBJdCBpcyBfZXh0cmVtZWx5XyBpbXBvcnRhbnQgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGV4dGVuZGVkIHJlZ2lzdGVycworOyBhcyB0aGVzZSBtYXkgd2VsbCBiZSB0cmFzaGVkIGJ5IHRoZSByb3V0aW5lcyBjYWxsZWQgZnJvbSBoZXJlIGFuZCBub3QKKzsgcmVzdG9yZWQgY29ycmVjdGx5IGJ5IHRoZSBtb3VzZSBpbnRlcmZhY2UgbW9kdWxlLgorOworOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAorOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gRm9yIG1vdXNlIGhhbmRsZXJzIHRoaXMgaXMgbm90IGEKKzsgICAgICAgcHJvYmxlbSwgYXMgdGhlIG1vdXNlIGRyaXZlciBhcmJpdHJhdGVzIGNhbGxzIHRvIHRoZSB1c2VyIG1vdXNlCis7ICAgICAgIGhhbmRsZXIgZm9yIHVzLgorOworOyBFbnRyeTogICAgQVggIC0gQ29uZGl0aW9uIG1hc2sgZ2l2aW5nIHJlYXNvbiBmb3IgY2FsbAorOyAgICAgICAgICAgQlggIC0gTW91c2UgYnV0dG9uIHN0YXRlCis7ICAgICAgICAgICBDWCAgLSBIb3Jpem9udGFsIGN1cnNvciBjb29yZGluYXRlCis7ICAgICAgICAgICBEWCAgLSBWZXJ0aWNhbCBjdXJzb3IgY29vcmRpbmF0ZQorOyAgICAgICAgICAgU0kgIC0gSG9yaXpvbnRhbCBtaWNrZXkgdmFsdWUKKzsgICAgICAgICAgIERJICAtIFZlcnRpY2FsIG1pY2tleSB2YWx1ZQorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9tb3VzZUlTUgorCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIGVzCisgICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworCisgICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorICAgICAgICBORVdTVEsgIE1zU3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjaworCis7IENhbGwgdGhlIGluc3RhbGxlZCBoaWdoIGxldmVsIEMgY29kZSByb3V0aW5lCisKKyAgICAgICAgY2xyaGkgICBkeCAgICAgICAgICAgICAgOyBDbGVhciBvdXQgaGlnaCBvcmRlciB2YWx1ZXMKKyAgICAgICAgY2xyaGkgICBjeAorICAgICAgICBjbHJoaSAgIGJ4CisgICAgICAgIGNscmhpICAgYXgKKyAgICAgICAgc2duaGkgICBzaQorICAgICAgICBzZ25oaSAgIGRpCisKKyAgICAgICAgcHVzaCAgICBfZGkKKyAgICAgICAgcHVzaCAgICBfc2kKKyAgICAgICAgcHVzaCAgICBfZHgKKyAgICAgICAgcHVzaCAgICBfY3gKKyAgICAgICAgcHVzaCAgICBfYngKKyAgICAgICAgcHVzaCAgICBfYXgKKyAgICAgICAgc3RpICAgICAgICAgICAgICAgICAgICAgOyBFbmFibGUgaW50ZXJydXB0cworICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9tb3VzZUhhbmRsZXJdCisgICAgICAgIF9hZGQgICAgc3AsMTIsMjQKKworICAgICAgICBSRVNUU1RLIE1zU3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKworICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgcmV0ICAgICAgICAgICAgICAgICAgICAgOyBXZSBhcmUgZG9uZSEhCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBNX3RpbWVySVNSIC0gVGltZXIgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKKzsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCis7IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgorOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KKzsKKzsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKKzsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcworOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKKzsgICAgICAgc3lzdGVtLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV90aW1lcklTUgorCisgICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUworICAgICAgICBwdXNoICAgIGVzCisgICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworCisgICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorCisgICAgICAgIE5FV1NUSyAgVG1TdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3RpbWVySGFuZGxlcl0KKyAgICAgICAgUkVTVFNUSyBUbVN0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCisKKyAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBNX2NoYWluUHJldlRpbWVyIC0gQ2hhaW4gdG8gcHJldmlvdXMgdGltZXIgaW50ZXJydXB0IGFuZCByZXR1cm4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENoYWlucyB0byB0aGUgcHJldmlvdXMgdGltZXIgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHJldHVybnMgY29udHJvbAorOyBiYWNrIHRvIHRoZSBoaWdoIGxldmVsIGludGVycnVwdCBoYW5kbGVyLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2NoYWluUHJldlRpbWVyCisKK2lmZGVmICAgVE5UCisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKKyAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KKyAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbFRpbWVyXQorICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjaworICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCisgICAgICAgIHBvcGZkCisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHJldAorZWxzZQorICAgICAgICBTV0FQU1RLIFRtU3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBwcmV2aW91cyBzdGFjaworICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgc3RhdGUgb2YgaW50ZXJydXB0IGZsYWcKKyAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZUaW1lcl0KK2Vsc2UKKyAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZUaW1lcl0KK2VuZGlmCisgICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBzdGF0ZSBvZiBpbnRlcnJ1cHQgZmxhZworICAgICAgICBTV0FQU1RLIFRtU3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBDIHN0YWNrIGFnYWluCisgICAgICAgIHJldAorZW5kaWYKKworY3Byb2NlbmQKKworOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KKzsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCis7IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KKworaWZkZWYgICBVU0VfTkFTTQorJW1hY3JvICBERUxBWSAwCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCislZW5kbWFjcm8KKyVtYWNybyAgSU9ERUxBWU4gMQorJXJlcCAgICAlMQorICAgICAgICBERUxBWQorJWVuZHJlcAorJWVuZG1hY3JvCitlbHNlCittYWNybyAgIERFTEFZCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCitlbmRtCittYWNybyAgIElPREVMQVlOICAgIE4KKyAgICByZXB0ICAgIE4KKyAgICAgICAgREVMQVkKKyAgICBlbmRtCitlbmRtCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9ydGNJU1IgLSBSZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKKzsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCis7IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgorOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KKzsKKzsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKKzsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcworOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKKzsgICAgICAgc3lzdGVtLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9ydGNJU1IKKworICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKKworOyBDbGVhciBwcmlvcml0eSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgcmUtZW5hYmxlIGludGVycnVwdHMgc28gd2UKKzsgZG9udCBsb2NrIHRoaW5ncyB1cCBmb3IgbG9uZy4KKworICAgICAgICBtb3YgICAgIGFsLDIwaAorICAgICAgICBvdXQgICAgIDBBMGgsYWwKKyAgICAgICAgb3V0ICAgICAwMjBoLGFsCisKKzsgQ2xlYXIgcmVhbC10aW1lIGNsb2NrIHRpbWVvdXQKKworICAgICAgICBpbiAgICAgIGFsLDcwaCAgICAgICAgICAgICAgOyBSZWFkIENNT1MgaW5kZXggcmVnaXN0ZXIKKyAgICAgICAgcHVzaCAgICBfYXggICAgICAgICAgICAgICAgIDsgIGFuZCBzYXZlIGZvciBsYXRlcgorICAgICAgICBJT0RFTEFZTiAzCisgICAgICAgIG1vdiAgICAgYWwsMENoCisgICAgICAgIG91dCAgICAgNzBoLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgaW4gICAgICBhbCw3MWgKKworOyBDYWxsIHRoZSBDIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uCisKKyAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorICAgICAgICBjbXAgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMSAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgorICAgICAgICBqZSAgICAgIEBARXhpdAorICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMQorICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cworICAgICAgICBORVdTVEsgIFJ0Y1N0YWNrICAgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKKyAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fcnRjSGFuZGxlcl0KKyAgICAgICAgUkVTVFNUSyBSdGNTdGFjayAgICAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjaworICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMAorCitAQEV4aXQ6IHBvcCAgICAgX2F4CisgICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlc3RvcmUgQ01PUyBpbmRleCByZWdpc3RlcgorICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9rZXlJU1IgLSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGtleWJvYXJkIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAorOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKKzsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCis7IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgorOworOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAorOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gSG93ZXZlciB3ZSBlbnN1cmUgd2l0aGluIHRoaXMgcm91dGluZQorOyAgICAgICBtdXR1YWwgZXhjbHVzaW9uIHRvIHRoZSBrZXlib2FyZCBoYW5kbGluZyByb3V0aW5lLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9rZXlJU1IKKworICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCisgICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKKworICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKKworICAgICAgICBjbXAgICAgIFtCWVRFIEt5SW5zaWRlXSwxICAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgorICAgICAgICBqZSAgICAgIEBAUmVpc3N1ZWQKKworICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwxCisgICAgICAgIE5FV1NUSyAgS3lTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleUhhbmRsZXJdICAgOyBDYWxsIEMgY29kZQorICAgICAgICBSRVNUU1RLIEt5U3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKyAgICAgICAgbW92ICAgICBbQllURSBLeUluc2lkZV0sMAorCitAQEV4aXQ6IHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAorCis7IFdoZW4gdGhlIEJJT1Mga2V5Ym9hcmQgaGFuZGxlciBuZWVkcyB0byBjaGFuZ2UgdGhlIFNISUZUIHN0YXR1cyBsaWdodHMKKzsgb24gdGhlIGtleWJvYXJkLCBpbiB0aGUgcHJvY2VzcyBvZiBkb2luZyB0aGlzIHRoZSBrZXlib2FyZCBjb250cm9sbGVyCis7IHJlLWlzc3VlcyBhbm90aGVyIGludGVycnVwdCwgd2hpbGUgdGhlIGN1cnJlbnQgaGFuZGxlciBpcyBzdGlsbCBleGVjdXRpbmcuCis7IElmIHdlIHJlY2lldmUgYW5vdGhlciBpbnRlcnJ1cHQgd2hpbGUgc3RpbGwgaGFuZGxpbmcgdGhlIGN1cnJlbnQgb25lLAorOyB0aGVuIHNpbXBseSBjaGFpbiBkaXJlY3RseSB0byB0aGUgcHJldmlvdXMgaGFuZGxlci4KKzsKKzsgTm90ZSB0aGF0IGZvciBtb3N0IERPUyBleHRlbmRlcnMsIHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZQorOyBpbnN0YWxsIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMuCisKK0BAUmVpc3N1ZWQ6CitpZmRlZiAgIFROVAorICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVjeAorICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0CisgICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCisgICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCisgICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCisgICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBlY3gKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYXgKK2Vsc2UKKyAgICAgICAgcHVzaGYKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KK2VuZGlmCitlbmRpZgorICAgICAgICBqbXAgICAgIEBARXhpdAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9jaGFpblByZXZrZXkgLSBDaGFpbiB0byBwcmV2aW91cyBrZXkgaW50ZXJydXB0IGFuZCByZXR1cm4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENoYWlucyB0byB0aGUgcHJldmlvdXMga2V5IGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKKzsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZLZXkKKworaWZkZWYgICBUTlQKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlY3gKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAorICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5XQorICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjaworICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCisgICAgICAgIHBvcGZkCisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHJldAorZWxzZQorCis7IFlJS0VTISBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgd2hlbiBleGVjdXRpb24gcmV0dXJucyBmcm9tIHRoZQorOyBwcmV2aW91cyBrZXlib2FyZCBoYW5kbGVyLCBpbnRlcnJ1cHRzIGFyZSByZS1lbmFibGVkISEgU2luY2Ugd2UgZXhwZWN0Cis7IGludGVycnVwdHMgdG8gcmVtYWluIG9mZiBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIG91ciBoYW5kbGVyLCB0aGlzIGNhbgorOyBjYXVzZSBoYXZvYy4gSG93ZXZlciBvdXIgc3RhY2sgbWFjcm9zIGFsd2F5cyB0dXJuIG9mZiBpbnRlcnJ1cHRzLCBzbyB0aGV5Cis7IHdpbGwgYmUgb2ZmIHdoZW4gd2UgZXhpdCB0aGlzIHJvdXRpbmUuIE9idmlvdXNseSB0aGVyZSBpcyBhIHRpbnkgd2VlbnkKKzsgd2luZG93IHdoZW4gaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQsIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbgorOyBkbyBhYm91dCB0aGlzLgorCisgICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQorZWxzZQorICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KK2VuZGlmCisgICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KKyAgICAgICAgcmV0CitlbmRpZgorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9rZXkxNUlTUiAtIEludCAxNWgga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgYmVlbiBjYWxsZWQgdG8gaGFuZGxlIHRoZSBJbnQgMTVoCis7IGtleWJvYXJkIGludGVycnVwdCBjYWxsb3V0IGZyb20gcmVhbCBtb2RlLgorOworOyAgIEVudHJ5OiAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MKKzsgICBFeGl0OiAgIEFYICAtIEhhcmR3YXJlIHNjYW4gY29kZSB0byBwcm9jZXNzICgwIHRvIGlnbm9yZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBfUE1fa2V5MTVJU1IKKworICAgICAgICBwdXNoICAgIGRzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgTE9BRF9EUworICAgICAgICBjbXAgICAgIGFoLDRGaAorICAgICAgICBqbnogICAgIEBATm90T3VycyAgICAgICA7IFF1aXQgaWYgbm90IGtleWJvYXJkIGNhbGxvdXQKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworICAgICAgICB4b3IgICAgIGFoLGFoICAgICAgICAgICA7IEFYIDo9IHNjYW4gY29kZQorICAgICAgICBORVdTVEsgIEt5MTVTdGFjayAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjaworICAgICAgICBwdXNoICAgIF9heAorICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9rZXkxNUhhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKKyAgICAgICAgX2FkZCAgICBzcCwyLDQKKyAgICAgICAgUkVTVFNUSyBLeTE1U3RhY2sgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCisgICAgICAgIHRlc3QgICAgYXgsYXgKKyAgICAgICAganogICAgICBAQDEKKyAgICAgICAgc3RjICAgICAgICAgICAgICAgICAgICAgOyBTZXQgY2FycnkgdG8gcHJvY2VzcyBhcyBub3JtYWwKKyAgICAgICAgam1wICAgICBAQDIKK0BAMTogICAgY2xjICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBjYXJyeSB0byBpZ25vcmUgc2NhbiBjb2RlCitAQDI6ICAgIHBvcGFkCisgICAgICAgIGptcCAgICAgQEBFeGl0ICAgICAgICAgIDsgV2UgYXJlIGRvbmUKKworQEBOb3RPdXJzOgoraWZkZWYgICBUTlQKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlY3gKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAorICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5MTVdCisgICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCisgICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBlY3gKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcG9wICAgICBlYXgKK2Vsc2UKKyAgICAgICAgcHVzaGYKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5MTVdCitlbHNlCisgICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5MTVdCitlbmRpZgorZW5kaWYKK0BARXhpdDogcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIHJldGYgICAgNAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9icmVha0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUJyZWFrIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAorOyB0aGUgQ3RybC1CcmVhayBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKKzsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBfUE1fYnJlYWtJU1IKKworICAgICAgICBzdGkKKyAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcHVzaCAgICBfYngKKworICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCisKKzsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCisKKyAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCisgICAgICAgIGplICAgICAgQEBFeGl0CisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIG1vdiAgICAgX2F4LDEKKyAgICAgICAgcHVzaCAgICBfYXgKKyAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCisgICAgICAgIHBvcCAgICAgX2F4CisgICAgICAgIHBvcGFkCisKK0BARXhpdDogcG9wICAgICBfYngKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3AgICAgIGRzCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9jdHJsQnJlYWtIaXQoaW50IGNsZWFyRmxhZykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEN0cmwtQnJlYWsgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2N0cmxCcmVha0hpdAorCisgICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KKyAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKKyAgICAgICAgbW92ICAgICBfYXgsW19FUyBfYnhdCisgICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCisgICAgICAgIGp6ICAgICAgQEBEb25lCisgICAgICAgIG1vdiAgICAgW1VJTlQgX0VTIF9ieF0sMAorCitAQERvbmU6IHBvcCAgICAgZXMKKyAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUE1fY3RybENJU1IgLSBDb250cm9sIEJyZWFrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ3RybC1DIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAorOyB0aGUgQ3RybC1DIGZsYWcgdG8gYSAxIGFuZCBsZWF2ZSAobm90ZSB0aGF0IHRoaXMgaXMgYWNjZXNzZWQgdGhyb3VnaAorOyBhIGZhciBwb2ludGVyLCBhcyBpdCBtYXkgd2VsbCBiZSBsb2NhdGVkIGluIGNvbnZlbnRpb25hbCBtZW1vcnkpLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9jdHJsQ0lTUgorCisgICAgICAgIHN0aQorICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoICAgIF9ieAorCisgICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQorICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKKworOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKKworICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKKyAgICAgICAgamUgICAgICBAQEV4aXQKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgbW92ICAgICBfYXgsMAorICAgICAgICBwdXNoICAgIF9heAorICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKKyAgICAgICAgcG9wICAgICBfYXgKKyAgICAgICAgcG9wYWQKKworQEBFeGl0OiBwb3AgICAgIF9ieAorICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKyAgICAgICAgaXJldGQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IFBNX2N0cmxDSGl0KGludCBjbGVhckZsYWcpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBDdHJsLUMgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX2N0cmxDSGl0CisKKyAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQorICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KKyAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKKyAgICAgICAganogICAgICBAQERvbmUKKyAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCisKK0BARG9uZToKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQTV9jcml0aWNhbElTUiAtIENvbnRyb2wgRXJyb3IgaGFuZGxlciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE1TRE9TIENyaXRpY2FsIEVycm9yIGludGVycnVwdCwgdG8gZGlzcGF0Y2gKKzsgY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbAorOyByZWdpc3RlcnMgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIFdlIGFsc28gcGFzcworOyB0aGUgdmFsdWVzIG9mIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIHRoZSBhcyBwb2ludGVycywgc28gdGhhdCB0aGUKKzsgdmFsdWVzIGNhbiBiZSBtb2RpZmllZCBiZWZvcmUgcmV0dXJuaW5nIHRvIE1TRE9TLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9jcml0aWNhbElTUgorCisgICAgICAgIHN0aQorICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICA7IFNhdmUgcmVnaXN0ZXIgdmFsdWVzIGNoYW5nZWQKKyAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZworCisgICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgorICAgICAgICBtb3YgICAgIGVieCxbX1BNX2NyaXRQdHJdCisgICAgICAgIG1vdiAgICAgW19FUyBfYnhdLGF4CisgICAgICAgIG1vdiAgICAgW19FUyBfYngrMl0sZGkKKworOyBSdW4gYWx0ZXJuYXRlIGNyaXRpY2FsIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKKworICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0sMAorICAgICAgICBqZSAgICAgIEBATm9BbHRIYW5kbGVyCisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIHB1c2ggICAgX2RpCisgICAgICAgIHB1c2ggICAgX2F4CisgICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2NyaXRIYW5kbGVyXSAgOyBDYWxsIEMgY29kZQorICAgICAgICBfYWRkICAgIHNwLDQsOAorICAgICAgICBwb3BhZAorCisgICAgICAgIHBvcCAgICAgX2J4CisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAorCitAQE5vQWx0SGFuZGxlcjoKKyAgICAgICAgbW92ICAgICBheCwzICAgICAgICAgICAgOyBUZWxsIE1TRE9TIHRvIGZhaWwgdGhlIG9wZXJhdGlvbgorICAgICAgICBwb3AgICAgIF9ieAorICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IFBNX2NyaXRpY2FsRXJyb3IoaW50ICpheFZhbCxpbnQgKmRpVmFsLGludCBjbGVhckZsYWcpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjcml0aWNhbCBlcnJvciBmbGFncywgYW5kIHRoZSB2YWx1ZXMgdGhhdAorOyBNU0RPUyBwYXNzZWQgaW4gdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gb3VyIGhhbmRsZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fY3JpdGljYWxFcnJvcgorCisgICAgICAgIEFSRyAgICAgYXhWYWw6RFBUUiwgZGlWYWw6RFBUUiwgY2xlYXJGbGFnOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQorICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQorICAgICAgICB4b3IgICAgIF9heCxfYXgKKyAgICAgICAgeG9yICAgICBfZGksX2RpCisgICAgICAgIG1vdiAgICAgYXgsW19FUyBfYnhdCisgICAgICAgIG1vdiAgICAgZGksW19FUyBfYngrMl0KKyAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKKyAgICAgICAganogICAgICBAQE5vQ2xlYXIKKyAgICAgICAgbW92ICAgICBbVUxPTkcgX0VTIF9ieF0sMAorQEBOb0NsZWFyOgorICAgICAgICBfbGVzICAgIF9ieCxbYXhWYWxdCisgICAgICAgIG1vdiAgICAgW19FUyBfYnhdLF9heAorICAgICAgICBfbGVzICAgIF9ieCxbZGlWYWxdCisgICAgICAgIG1vdiAgICAgW19FUyBfYnhdLF9kaQorICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3NldE1vdXNlSGFuZGxlcgorCisgICAgICAgIEFSRyAgICAgbW91c2VNYXNrOlVJTlQKKworICAgICAgICBlbnRlcl9jCisgICAgICAgIHB1c2ggICAgZXMKKworICAgICAgICBtb3YgICAgIGF4LDBDaCAgICAgICAgICA7IEFYIDo9IEZ1bmN0aW9uIDEyIC0gaW5zdGFsbCBpbnRlcnJ1cHQgc3ViCisgICAgICAgIG1vdiAgICAgX2N4LFttb3VzZU1hc2tdIDsgQ1ggOj0gbW91c2UgbWFzaworICAgICAgICBtb3YgICAgIF9keCxvZmZzZXQgX1BNX21vdXNlSVNSCisgICAgICAgIHB1c2ggICAgY3MKKyAgICAgICAgcG9wICAgICBlcyAgICAgICAgICAgICAgOyBFUzpfRFggLT4gbW91c2UgaGFuZGxlcgorICAgICAgICBpbnQgICAgIDMzaCAgICAgICAgICAgICA7IENhbGwgbW91c2UgZHJpdmVyCisKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX21vdXNlUE1DQih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTW91c2UgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKKzsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKKzsKKzsgICBFbnRyeTogIERTOl9TSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAorOyAgICAgICAgICAgRVM6X0RJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKKzsgICAgICAgICAgIFNTOl9TUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgIF9QTV9tb3VzZVBNQ0IKKworICAgICAgICBwdXNoYWQKKyAgICAgICAgbW92ICAgICBlYXgsW2VzOl9kaSsxQ2hdICAgIDsgTG9hZCByZWdpc3RlciB2YWx1ZXMgZnJvbSByZWFsIG1vZGUKKyAgICAgICAgbW92ICAgICBlYngsW2VzOl9kaSsxMGhdCisgICAgICAgIG1vdiAgICAgZWN4LFtlczpfZGkrMThoXQorICAgICAgICBtb3YgICAgIGVkeCxbZXM6X2RpKzE0aF0KKyAgICAgICAgbW92ICAgICBlc2ksW2VzOl9kaSswNGhdCisgICAgICAgIG1vdiAgICAgZWRpLFtlczpfZGldCisgICAgICAgIGNhbGwgICAgX1BNX21vdXNlSVNSICAgICAgICA7IENhbGwgdGhlIG1vdXNlIGhhbmRsZXIKKyAgICAgICAgcG9wYWQKKworICAgICAgICBtb3YgICAgIGF4LFtkczpfc2ldCisgICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQWhdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIElQIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBheCxbZHM6X3NpKzJdCisgICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQ2hdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIENTIHZhbHVlCisgICAgICAgIGFkZCAgICAgW1dPUkQgZXM6X2RpKzJFaF0sNCA7IFJlbW92ZSByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrCisgICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgdG8gcmVhbCBtb2RlIQorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX2ludDEwUE1DQih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50MTAgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKKzsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKKzsKKzsgICBFbnRyeTogIERTOkVTSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAorOyAgICAgICAgICAgRVM6RURJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKKzsgICAgICAgICAgIFNTOkVTUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jZmFyICAgICAgICBfUE1faW50MTBQTUNCCisKKyAgICAgICAgcHVzaGFkCisgICAgICAgIHB1c2ggICAgZHMKKyAgICAgICAgcHVzaCAgICBlcworICAgICAgICBwdXNoICAgIGZzCisKKyAgICAgICAgcHVzaGZkCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIG1vdiAgICAgW2VzOmVkaSsyMGhdLGF4ICAgICA7IFNhdmUgcmV0dXJuIGZsYWcgc3RhdHVzCisgICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaV0KKyAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcworICAgICAgICBtb3YgICAgIGF4LFtkczplc2krMl0KKyAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKKyAgICAgICAgYWRkICAgICBbV09SRCBlczplZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKKworOyBDYWxsIHRoZSBpbnN0YWxsIGludDEwIGhhbmRsZXIgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKKzsgd2l0aCBEUyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0YSBzZWxlY3RvciwgYW5kIEVTOkVESSBwb2ludGluZyB0aGUgdGhlCis7IHJlYWwgbW9kZSBEUE1JIHJlZ2lzdGVyIHN0cnVjdHVyZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LiBUaGUKKzsgaGFuZGxlIG11c3QgYmUgd3JpdHRlbiBpbiBhc3NlbWJsZXIgdG8gYmUgYWJsZSB0byBleHRyYWN0IHRoZSByZWFsIG1vZGUKKzsgcmVnaXN0ZXIgdmFsdWVzIGZyb20gdGhlIHN0cnVjdHVyZQorCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgcG9wICAgICBmcyAgICAgICAgICAgICAgICAgIDsgRlM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlcnMKKyAgICAgICAgTE9BRF9EUworICAgICAgICBORVdTVEsgIEludDEwU3RhY2sgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKKworICAgICAgICBjYWxsICAgIFtfUE1faW50MTBIYW5kbGVyXQorCisgICAgICAgIFJFU1RTVEsgSW50MTBTdGFjayAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKKyAgICAgICAgcG9wICAgICBmcworICAgICAgICBwb3AgICAgIGVzCisgICAgICAgIHBvcCAgICAgZHMKKyAgICAgICAgcG9wYWQKKyAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCisKK2Nwcm9jZW5kCisKK2NwdWJsaWMgX1BNX3Btc214Q29kZUVuZAorCitlbmRjb2Rlc2VnICBfcG1zbXgKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fdmZsYXQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L192ZmxhdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5ODVhOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fdmZsYXQuYXNtCkBAIC0wLDAgKzEsNjUyIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoKKzsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKzsqCis7KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7KgorOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCis7KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCis7KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKzsqCis7KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKzsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsqCis7KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KgorOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKzsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgICAgICAgICAgQmFzZWQgb24gb3JpZ2luYWwgY29kZSBDb3B5cmlnaHQgMTk5NCBPdHRvIENocm9ucworOyoKKzsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIGxhdGVyCis7KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQorOyoKKzsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGVyIGZvciB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlcnMuCis7KgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBJREVBTAorICAgICAgICBKVU1QUworCitpbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfdmZsYXQgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAorCitWRkxBVF9TVEFSVCAgICAgRVFVIDBGMDAwMDAwMGgKK1ZGTEFUX0VORCAgICAgICBFUVUgMEYwM0ZGRkZGaAorUEFHRV9QUkVTRU5UICAgIEVRVSAxCitQQUdFX05PVFBSRVNFTlQgRVFVIDAKK1BBR0VfUkVBRCAgICAgICBFUVUgMAorUEFHRV9XUklURSAgICAgIEVRVSAyCisKK2lmZGVmICAgRE9TNEdXCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERPUzRHL1cgZmxhdCBsaW5lYXIgZnJhbWVidWZmZXIgZW11bGF0aW9uLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYmVnZGF0YXNlZyAgX3ZmbGF0CisKKzsgTmVhciBwb2ludGVycyB0byB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSBhbmQgb3VyIHBhZ2UgdGFibGVzLiBBbGwgb2YKKzsgdGhpcyBtZW1vcnkgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IE1iIG9mIERPUyBtZW1vcnkuCisKK1BEQlIgICAgICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgUGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciAoQ1IzKQorYWNjZXNzUGFnZUFkZHIgIGRkICAwCithY2Nlc3NQYWdlVGFibGUgZGQgIDAKKworOyBDYXVzZVdheSBwYWdlIGRpcmVjdG9yeSAmIDFzdCBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzZXMuCisKK0NhdXNlV2F5RElSTGluZWFyIGRkIDAKK0NhdXNlV2F5MXN0TGluZWFyIGRkIDAKKworOyBQbGFjZSB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFBhZ2UgVGFibGUgRGlyZWN0b3J5IGJlZm9yZSB3ZQorOyBpbnRpYWxpc2VkIG91ciB2aXJ0dWFsIGJ1ZmZlciBjb2RlLgorCitwYWdlRGlyZWN0b3J5OiAgcmVzZCAxMDI0ICAgICAgICAgICA7IFNhdmVkIHBhZ2UgdGFibGUgZGlyZWN0b3J5CisKK1ZhbGlkQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgVmFsaWQgQ1MgZm9yIHBhZ2UgZmF1bHRzCitSaW5nMENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IE91ciByaW5nIDAgY29kZSBzZWxlY3RvcgorTGFzdFBhZ2UgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBMYXN0IHBhZ2Ugd2UgbWFwcGVkIGluCitCYW5rRnVuY0J1ZjogICAgcmVzYiAxMDEgICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIGJhbmsgc3dpdGNoIGNvZGUKK0JhbmtGdW5jUHRyICAgICBkZCAgb2Zmc2V0IEJhbmtGdW5jQnVmCisKK0lOVDE0R2F0ZToKK0lOVDE0T2Zmc2V0ICAgICBkZCAgICAgIDAgICAgICAgICAgIDsgZWlwIG9mIG9yaWdpbmFsIHZlY3RvcgorSU5UMTRTZWxlY3RvciAgIGR3ICAgICAgMCAgICAgICAgICAgOyBjcyBvZiBvcmlnaW5hbCB2ZWN0b3IKKworICAgICAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorICAgICAgICBjZXh0ZXJuIFZGX2hhdmVDYXVzZVdheSxCT09MCisKK2VuZGRhdGFzZWcgIF92ZmxhdAorCitiZWdjb2Rlc2VnICBfdmZsYXQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKyAgICAgICAgY2V4dGVybiBWRl9tYWxsb2MsRlBUUgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQRl9oYW5kbGVyNjRrIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA2NGsgYmFua3MKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcworOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCis7IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKKzsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKKzsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQorOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCis7IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKKzsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBQRl9oYW5kbGVyNjRrCisKKzsgQ2hlY2sgaWYgdGhpcyBpcyBhIHByb2Nlc3NvciBleGVjZXB0aW9uIG9yIGEgcGFnZSBmYXVsdAorCisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIG1vdiAgICAgYXgsW2NzOlZhbGlkQ1NdICAgICA7IFVzZSBDUyBvdmVycmlkZSB0byBhY2Nlc3MgZGF0YQorICAgICAgICBjbXAgICAgIFtzczplc3ArMTJdLGF4ICAgICAgOyBJcyB0aGlzIGEgcGFnZSBmYXVsdD8KKyAgICAgICAgam5lICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgTm9wZSwganVtcCB0byB0aGUgcHJldmlvdXMgaGFuZGxlcgorCis7IEdldCBhZGRyZXNzIG9mIHBhZ2UgZmF1bHQgYW5kIGNoZWNrIGlmIHdpdGhpbiBvdXIgaGFuZGxlcnMgcmFuZ2UKKworICAgICAgICBtb3YgICAgIGVheCxjcjIgICAgICAgICAgICAgOyBFQlggaGFzIHBhZ2UgZmF1bHQgbGluZWFyIGFkZHJlc3MKKyAgICAgICAgY21wICAgICBlYXgsVkZMQVRfU1RBUlQgICAgIDsgSXMgdGhlIGZhdWx0IGxlc3MgdGhhbiBvdXJzPworICAgICAgICBqYiAgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKKyAgICAgICAgY21wICAgICBlYXgsVkZMQVRfRU5EICAgICAgIDsgSXMgdGhlIGZhdWx0IG1vcmUgdGhhbiBvdXJzPworICAgICAgICBqYWUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKKworOyBUaGlzIGlzIG91ciBwYWdlIGZhdWx0LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdAorCisgICAgICAgIHB1c2hhZAorICAgICAgICBwdXNoICAgIGRzCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgIDsgRUJYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcworICAgICAgICBhbmQgICAgIGVieCxpbnZlcnQgMEZGRkZoICAgOyBNYXNrIHRvIDY0ayBiYW5rIGJvdW5kYXJ5CisgICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXTsgTG9hZCBzZWdtZW50IHJlZ2lzdGVycworICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KKworOyBNYXAgaW4gdGhlIHBhZ2UgdGFibGUgZm9yIG91ciB2aXJ0dWFsIGZyYW1lYnVmZmVyIGFyZWEgZm9yIG1vZGlmaWNhdGlvbgorCisgICAgICAgIG1vdiAgICAgZWRpLFtQREJSXSAgICAgICAgICA7IEVESSBwb2ludHMgdG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlZHgsZWJ4ICAgICAgICAgICAgIDsgRURYID0gbGluZWFyIGFkZHJlc3MKKyAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgIDsgRURYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5CisgICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlZGldICAgICA7IEVEWCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcworICAgICAgICBtb3YgICAgIGVheCxlZHgKKyAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KKyAgICAgICAgb3IgICAgICBlYXgsNworICAgICAgICBtb3YgICAgIFtlZHhdLGVheAorICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKKworOyBNYXJrIGFsbCBwYWdlcyB2YWxpZCBmb3IgdGhlIG5ldyBwYWdlIGZhdWx0IGFyZWEKKworICAgICAgICBtb3YgICAgIGVzaSxlYnggICAgICAgICAgICAgOyBFU0kgOj0gbGluZWFyIGFkZHJlc3MgZm9yIHBhZ2UKKyAgICAgICAgc2hyICAgICBlc2ksMTAKKyAgICAgICAgYW5kICAgICBlc2ksMEZGRmggICAgICAgICAgIDsgT2Zmc2V0IGludG8gcGFnZSB0YWJsZQorICAgICAgICBhZGQgICAgIGVzaSxbYWNjZXNzUGFnZUFkZHJdCitpZmRlZiAgIFVTRV9OQVNNCislYXNzaWduIG9mZiAwCislcmVwIDE2CisgICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCislYXNzaWduIG9mZiBvZmYrNAorJWVuZHJlcAorZWxzZQorb2ZmID0gMAorUkVQVCAgICAxNgorICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcworb2ZmID0gb2ZmKzQKK0VORE0KK2VuZGlmCisKKzsgTWFyayBhbGwgcGFnZXMgaW52YWxpZCBmb3IgdGhlIHByZXZpb3VzbHkgbWFwcGVkIGFyZWEKKworICAgICAgICB4Y2hnICAgIGVzaSxbTGFzdFBhZ2VdICAgICAgOyBTYXZlIGxhc3QgcGFnZSBmb3IgbmV4dCBwYWdlIGZhdWx0CisgICAgICAgIHRlc3QgICAgZXNpLGVzaQorICAgICAgICBqeiAgICAgIEBARG9uZU1hcHBpbmcgICAgICAgOyBEb250IHVwZGF0ZSBpZiBmaXJzdCB0aW1lIHJvdW5kCitpZmRlZiAgIFVTRV9OQVNNCislYXNzaWduIG9mZiAwCislcmVwIDE2CisgICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcworJWFzc2lnbiBvZmYgb2ZmKzQKKyVlbmRyZXAKK2Vsc2UKK29mZiA9IDAKK1JFUFQgICAgMTYKKyAgICAgICAgYW5kICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCitvZmYgPSBvZmYrNAorRU5ETQorZW5kaWYKKworQEBEb25lTWFwcGluZzoKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IEZsdXNoIHRoZSBUTEIKKworOyBOb3cgcHJvZ3JhbSB0aGUgbmV3IFN1cGVyVkdBIHN0YXJ0aW5nIGJhbmsgYWRkcmVzcworCisgICAgICAgIG1vdiAgICAgZWF4LGVieCAgICAgICAgICAgICA7IEVBWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKKyAgICAgICAgc2hyICAgICBlYXgsMTYKKyAgICAgICAgYW5kICAgICBlYXgsMEZGaCAgICAgICAgICAgIDsgTWFzayB0byAwLTI1NQorICAgICAgICBjYWxsICAgIFtCYW5rRnVuY1B0cl0gICAgICAgOyBDYWxsIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbgorCisgICAgICAgIHBvcCAgICAgZXMKKyAgICAgICAgcG9wICAgICBkcworICAgICAgICBwb3BhZAorICAgICAgICBwb3AgICAgIGVheAorICAgICAgICBhZGQgICAgIGVzcCw0ICAgICAgICAgICAgICAgOyBQb3AgdGhlIGVycm9yIGNvZGUgZnJvbSBzdGFjaworICAgICAgICBpcmV0ZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gdG8gZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KKworQEBUb09sZEhhbmRsZXI6CisgICAgICAgIHBvcCAgICAgZWF4CitpZmRlZiAgIFVTRV9OQVNNCisgICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKK2Vsc2UKKyAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgorZW5kaWYKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUEZfaGFuZGxlcjRrICAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNGsgYmFua3MKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcworOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCis7IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKKzsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKKzsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQorOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCis7IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKKzsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY2ZhciAgICBQRl9oYW5kbGVyNGsKKworOyBGaWxsIGluIHdoZW4gd2UgaGF2ZSB0ZXN0ZWQgYWxsIHRoZSA2NEtiIGNvZGUKKworaWZkZWYgICBVU0VfTkFTTQorICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCitlbHNlCisgICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKK2VuZGlmCisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgSW5zdGFsbEZhdWx0SGFuZGxlcih2b2lkICpiYXNlQWRkcixpbnQgYmFua1NpemUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnN0YWxsZXMgdGhlIHBhZ2UgZmF1bHQgaGFuZGxlciBkaXJlY3RseSBpbnQgdGhlIGludGVycnVwdCBkZXNjcmlwdG9yCis7IHRhYmxlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyByaW5nIDAgYWNjZXNzLAorOyBidXQgbm9uZSBvZiB0aGlzIHN0dWZmIHdpbGwgcnVuIHdpdGhvdXQgcmluZyAwIQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluc3RhbGxGYXVsdEhhbmRsZXIKKworICAgICAgICBBUkcgICAgIGJhc2VBZGRyOlVMT05HLCBiYW5rU2l6ZTpVSU5UCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgW0RXT1JEIExhc3RQYWdlXSwwICA7IE5vIHBhZ2VzIGhhdmUgYmVlbiBtYXBwZWQKKyAgICAgICAgbW92ICAgICBheCxjcworICAgICAgICBtb3YgICAgIFtWYWxpZENTXSxheCAgICAgICAgOyBTYXZlIENTIHZhbHVlIGZvciBwYWdlIGZhdWx0cworCis7IFB1dCBhZGRyZXNzIG9mIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgaW50byB0aGUgSURUIGRpcmVjdGx5CisKKyAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKK2lmZGVmICAgVVNFX05BU00KKyAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKK2Vsc2UKKyAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKK2VuZGlmCisgICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgorICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAorICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0CisKKzsgTm90ZSB0aGF0IEludGVycnVwdCBnYXRlcyBkbyBub3QgaGF2ZSB0aGUgaGlnaCBhbmQgbG93IHdvcmQgb2YgdGhlCis7IG9mZnNldCBpbiBhZGphY2VudCB3b3JkcyBpbiBtZW1vcnksIHRoZXJlIGFyZSA0IGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KKworICAgICAgICBtb3YgICAgIGVjeCxbZWF4XSAgICAgICAgICAgOyBHZXQgY3MgYW5kIGxvdyAxNiBiaXRzIG9mIG9mZnNldAorICAgICAgICBtb3YgICAgIGVkeCxbZWF4KzZdICAgICAgICAgOyBHZXQgaGlnaCAxNiBiaXRzIG9mIG9mZnNldCBpbiBkeAorICAgICAgICBzaGwgICAgIGVkeCwxNgorICAgICAgICBtb3YgICAgIGR4LGN4ICAgICAgICAgICAgICAgOyBlZHggaGFzIG9mZnNldAorICAgICAgICBtb3YgICAgIFtJTlQxNE9mZnNldF0sZWR4ICAgOyBTYXZlIG9mZnNldAorICAgICAgICBzaHIgICAgIGVjeCwxNgorICAgICAgICBtb3YgICAgIFtJTlQxNFNlbGVjdG9yXSxjeCAgOyBTYXZlIG9yaWdpbmFsIGNzCisgICAgICAgIG1vdiAgICAgW2VheCsyXSxjcyAgICAgICAgICA7IEluc3RhbGwgbmV3IGNzCisgICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNjRrCisgICAgICAgIGNtcCAgICAgW1VJTlQgYmFua1NpemVdLDQKKyAgICAgICAgam5lICAgICBAQDEKKyAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI0aworQEAxOiAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAorICAgICAgICBzaHIgICAgIGVkeCwxNgorICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKKworICAgICAgICBsZWF2ZV9jCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kIHJlc3RvcmVzIHRoZSBwcmV2aW91cworOyBwYWdlIGZhdWx0IGhhbmRsZXIuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUmVtb3ZlRmF1bHRIYW5kbGVyCisKKyAgICAgICAgZW50ZXJfYworCis7IFJlbW92ZSBwYWdlIGZhdWx0IGhhbmRsZXIgZnJvbSBJRFQKKworICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjaworaWZkZWYgICBVU0VfTkFTTQorICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAorZWxzZQorICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAorZW5kaWYKKworICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKKyAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKKyAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAorICAgICAgICBtb3YgICAgIGN4LFtJTlQxNFNlbGVjdG9yXQorICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3ggICAgICAgICAgOyBSZXN0b3JlIG9yaWdpbmFsIENTCisgICAgICAgIG1vdiAgICAgZWR4LFtJTlQxNE9mZnNldF0KKyAgICAgICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKKyAgICAgICAgc2hyICAgICBlZHgsMTYKKyAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0CisKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbnN0YWxscyB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgcmVsb2NhdGluZyBpdCBpbnRvIG91ciBkYXRhIHNlZ21lbnQKKzsgYW5kIG1ha2luZyBpdCBpbnRvIGEgY2FsbGFibGUgZnVuY3Rpb24uIFdlIGRvIGl0IHRoaXMgd2F5IHRvIG1ha2UgdGhlCis7IGNvZGUgaWRlbnRpY2FsIHRvIHRoZSB3YXkgdGhhdCB0aGUgVmZsYXREIGRldmljZXMgd29yayB1bmRlciBXaW5kb3dzLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluc3RhbGxCYW5rRnVuYworCisgICAgICAgIEFSRyAgICAgY29kZUxlbjpVSU5ULCBiYW5rRnVuYzpEUFRSCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIG1vdiAgICAgZXNpLFtiYW5rRnVuY10gICAgICA7IENvcHkgdGhlIGNvZGUgaW50byBidWZmZXIKKyAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IEJhbmtGdW5jQnVmCisgICAgICAgIG1vdiAgICAgZWN4LFtjb2RlTGVuXQorICAgIHJlcCBtb3ZzYgorICAgICAgICBtb3YgICAgIFtCWVRFIGVkaV0sMEMzaCAgICAgOyBUZXJtaW5hdGUgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZWFyIHJldAorCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBJbml0UGFnaW5nKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJbml0aWFsaXplcyBwYWdpbmcgc3lzdGVtLiBJZiBwYWdpbmcgaXMgbm90IGVuYWJsZWQsIGJ1aWxkcyBhIHBhZ2UgdGFibGUKKzsgZGlyZWN0b3J5IGFuZCBwYWdlIHRhYmxlcyBmb3IgcGh5c2ljYWwgbWVtb3J5Cis7Cis7ICAgRXhpdDogICAgICAgMCAgIC0gU3VjY2Vzc2Z1bAorOyAgICAgICAgICAgICAgIC0xICAtIENvdWxkbid0IGluaXRpYWxpemUgcGFnaW5nIG1lY2hhbmlzbQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIEluaXRQYWdpbmcKKworICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVjeAorICAgICAgICBwdXNoICAgIGVkeAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQorCis7IEFyZSB3ZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5PworCisgICAgICAgIG1vdiAgICAgYXgsMEZGRjloCisgICAgICAgIGludCAgICAgMzFoCisgICAgICAgIGpjICAgICAgQEBOb3RDYXVzZXdheQorICAgICAgICBjbXAgICAgIGVjeCwiQ0FVUyIKKyAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5CisgICAgICAgIGNtcCAgICAgZWR4LCJFV0FZIgorICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKKworICAgICAgICBtb3YgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMQorICAgICAgICBtb3YgICAgIFtDYXVzZVdheURJUkxpbmVhcl0sZXNpCisgICAgICAgIG1vdiAgICAgW0NhdXNlV2F5MXN0TGluZWFyXSxlZGkKKworOyBDaGVjayBmb3IgRFBNSQorCisgICAgICAgIG1vdiAgICAgYXgsMGZmMDBoCisgICAgICAgIHB1c2ggICAgZXMKKyAgICAgICAgaW50ICAgICAzMWgKKyAgICAgICAgcG9wICAgICBlcworICAgICAgICBzaHIgICAgIGVkaSwyCisgICAgICAgIGFuZCAgICAgZWRpLDMKKyAgICAgICAgY21wICAgICBlZGksMgorICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm90IHN1cHBvcnRlZCB1bmRlciBEUE1JCisKKyAgICAgICAgbW92ICAgICBlYXgsW0NhdXNlV2F5RElSTGluZWFyXQorICAgICAgICBqbXAgICAgIEBAQ29weUNSMworCitAQE5vdENhdXNld2F5OgorICAgICAgICBtb3YgICAgIGF4LGNzCisgICAgICAgIHRlc3QgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgOyBXaGljaCByaW5nIGFyZSB3ZSBydW5uaW5nCisgICAgICAgIGpueiAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOZWVkcyB6ZXJvIHJpbmcgdG8gYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWdlIHRhYmxlcyAoQ1IzKQorICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKKyAgICAgICAgdGVzdCAgICBlYXgsODAwMDAwMDBoICAgICAgICAgICA7IElzIHBhZ2luZyBlbmFibGVkPworICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm8sIHdlIG11c3QgaGF2ZSBwYWdpbmchCisKKyAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgICAgICAgICA7IExvYWQgZGlyZWN0b3J5IGFkZHJlc3MKKyAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAorCitAQENvcHlDUjM6CisgICAgICAgIG1vdiAgICAgW1BEQlJdLGVheCAgICAgICAgICAgICAgOyBTYXZlIGl0CisgICAgICAgIG1vdiAgICAgZXNpLGVheAorICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgcGFnZURpcmVjdG9yeQorICAgICAgICBtb3YgICAgIGVjeCwxMDI0CisgICAgICAgIGNsZAorICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgQ29weSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKKyAgICAgICAgY21wICAgICBbRFdPUkQgYWNjZXNzUGFnZUFkZHJdLDA7IENoZWNrIGlmIHdlIGhhdmUgYWxsb2NhdGVkIHBhZ2UKKyAgICAgICAgam5lICAgICBAQEhhdmVSZWFsTWVtICAgICAgICAgICA7IHRhYmxlIGFscmVhZHkgKHdlIGNhbnQgZnJlZSBpdCkKKworICAgICAgICBtb3YgICAgIGVheCwwMTAwaCAgICAgICAgICAgICAgIDsgRFBNSSBET1MgYWxsb2NhdGUKKyAgICAgICAgbW92ICAgICBlYngsODE5Mi8xNgorICAgICAgICBpbnQgICAgIDMxaCAgICAgICAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgODE5MiBieXRlcworICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKKyAgICAgICAgc2hsICAgICBlYXgsNCAgICAgICAgICAgICAgICAgICA7IEVBWCBwb2ludHMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQorICAgICAgICBhZGQgICAgIGVheCw0MDk1CisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduCisgICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VBZGRyXSxlYXgKKworQEBIYXZlUmVhbE1lbToKKyAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXSAgICA7IEVBWCAtPiBwYWdlIHRhYmxlIGluIDFzdCBNYgorICAgICAgICBzaHIgICAgIGVheCwxMgorICAgICAgICBhbmQgICAgIGVheCwzRkZoICAgICAgICAgICAgICAgIDsgUGFnZSB0YWJsZSBvZmZzZXQKKyAgICAgICAgc2hsICAgICBlYXgsMgorICAgICAgICBjbXAgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMAorICAgICAgICBqeiAgICAgIEBATm90Q1cwCisgICAgICAgIG1vdiAgICAgZWJ4LFtDYXVzZVdheTFzdExpbmVhcl0KKyAgICAgICAgam1wICAgICBAQFB1dDFzdAorCitAQE5vdENXMDoKKyAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCisgICAgICAgIG1vdiAgICAgZWJ4LFtlYnhdCisgICAgICAgIGFuZCAgICAgZWJ4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIHRhYmxlIGZvciAxc3QgbWVnYWJ5dGUKKworQEBQdXQxc3Q6CisgICAgICAgIGFkZCAgICAgZWF4LGVieAorICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlVGFibGVdLGVheAorICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgTm8gZXJyb3IKKyAgICAgICAgam1wICAgICBAQEV4aXQKKworQEBFcnJFeGl0OgorICAgICAgICBtb3YgICAgIGVheCwtMQorCitAQEV4aXQ6IHBvcCAgICAgZWRpCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIHBvcCAgICAgZWR4CisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIENsb3NlUGFnaW5nKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDbG9zZXMgdGhlIHBhZ2luZyBzeXN0ZW0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBDbG9zZVBhZ2luZworCisgICAgICAgIHB1c2ggICAgZWF4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIHB1c2ggICAgZWRpCisKKyAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQorICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgUmVzdG9yZSBBY2Nlc3NQYWdlIG1hcHBpbmcKKyAgICAgICAgbW92ICAgICBlZGksW1BEQlJdCisgICAgICAgIG1vdiAgICAgZXNpLG9mZnNldCBwYWdlRGlyZWN0b3J5CisgICAgICAgIG1vdiAgICAgZWN4LDEwMjQKKyAgICAgICAgY2xkCisgICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQorCitAQEV4aXQ6IHBvcCAgICAgZWRpCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIHBvcCAgICAgZWR4CisgICAgICAgIHBvcCAgICAgZWN4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBsb25nIEFjY2Vzc1BhZ2UobG9uZyBwaHlzKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFwcyBhIGtub3duIHBhZ2UgdG8gZ2l2ZW4gcGh5c2ljYWwgbWVtb3J5Cis7ICAgRW50cnk6ICAgICAgRUFYIC0gUGh5c2ljYWwgbWVtb3J5Cis7ICAgRXhpdDogICAgICAgRUFYIC0gTGluZWFyIG1lbW9yeSBhZGRyZXNzIG9mIG1hcHBlZCBwaHlzIG1lbQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhdGljICAgICBBY2Nlc3NQYWdlCisKKyAgICAgICAgcHVzaCAgICBlZHgKKyAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KKyAgICAgICAgb3IgICAgICBlYXgsNworICAgICAgICBtb3YgICAgIFtlZHhdLGVheAorICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCisgICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KKyAgICAgICAgcG9wICAgICBlZHgKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGxvbmcgR2V0UGh5c2ljYWxBZGRyZXNzKGxvbmcgbGluZWFyKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIgYWRkcmVzcworOyAgIEVudHJ5OiAgICAgIEVBWCAtIExpbmVhciBhZGRyZXNzIHRvIGNvbnZlcnQKKzsgICBFeGl0OiAgICAgICBFQVggLSBQaHlzaWNhbCBhZGRyZXNzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgICAgIEdldFBoeXNpY2FsQWRkcmVzcworCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIG1vdiAgICAgZWR4LGVheAorICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYIGlzIHRoZSBkaXJlY3Rvcnkgb2Zmc2V0CisgICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQorICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWJ4XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgcHVzaCAgICBlYXgKKyAgICAgICAgbW92ICAgICBlYXgsZWR4CisgICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBBY2Nlc3MgdGhlIHBhZ2UgdGFibGUKKyAgICAgICAgbW92ICAgICBlZHgsZWF4CisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIHNociAgICAgZWF4LDEyCisgICAgICAgIGFuZCAgICAgZWF4LDAzRkZoICAgICAgICAgICAgICAgOyBFQVggb2Zmc2V0IGludG8gcGFnZSB0YWJsZQorICAgICAgICBtb3YgICAgIGVheCxbZWR4K2VheCo0XSAgICAgICAgIDsgTG9hZCBwaHlzaWNhbCBhZGRyZXNzCisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKKyAgICAgICAgcG9wICAgICBlZHgKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgQ3JlYXRlUGFnZVRhYmxlKGxvbmcgcGFnZURFbnRyeSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IENyZWF0ZXMgYSBwYWdlIHRhYmxlIGZvciBzcGVjaWZpYyBhZGRyZXNzICg0TUIpCis7ICAgICAgIEVudHJ5OiAgRUFYIC0gUGFnZSBkaXJlY3RvcnkgZW50cnkgKHRvcCAxMC1iaXRzIG9mIGFkZHJlc3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGF0aWMgICAgIENyZWF0ZVBhZ2VUYWJsZQorCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIHB1c2ggICAgZWRpCisgICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIGFkZHJlc3MKKyAgICAgICAgbW92ICAgICBlYXgsODE5MgorICAgICAgICBwdXNoICAgIGVheAorICAgICAgICBjYWxsICAgIFZGX21hbGxvYyAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBwYWdlIHRhYmxlIGRpcmVjdG9yeQorICAgICAgICBhZGQgICAgIGVzcCw0CisgICAgICAgIGFkZCAgICAgZWF4LDBGRkZoCisgICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduICg0S0IpCisgICAgICAgIG1vdiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3MKKyAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEZpbGwgd2l0aCB6ZXJvCisgICAgICAgIG1vdiAgICAgZWN4LDEwMjQKKyAgICAgICAgY2xkCisgICAgICAgIHJlcCAgICAgc3Rvc2QgICAgICAgICAgICAgICAgICAgOyBDbGVhciBwYWdlIHRhYmxlCisgICAgICAgIHN1YiAgICAgZWRpLDQwOTYKKyAgICAgICAgbW92ICAgICBlYXgsZWRpCisgICAgICAgIGNhbGwgICAgR2V0UGh5c2ljYWxBZGRyZXNzCisgICAgICAgIG1vdiAgICAgZWR4LFtQREJSXQorICAgICAgICBvciAgICAgIGVheCw3ICAgICAgICAgICAgICAgICAgIDsgUHJlc2VudC93cml0ZS91c2VyIGJpdAorICAgICAgICBtb3YgICAgIFtlZHgrZWJ4KjRdLGVheCAgICAgICAgIDsgU2F2ZSBwaHlzaWNhbCBhZGRyZXNzIGludG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQorICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVkeAorICAgICAgICBwb3AgICAgIGVjeAorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNYXBzIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxpbmVhciBtZW1vcnkKKzsgICBFbnRyeTogICAgICBwQWRkciAgIC0gUGh5c2ljYWwgYWRkcmVzcworOyAgICAgICAgICAgICAgIGxBZGRyICAgLSBMaW5lYXIgYWRkcmVzcworOyAgICAgICAgICAgICAgIHBhZ2VzICAgLSBOdW1iZXIgb2YgNEsgcGFnZXMgdG8gbWFwCis7ICAgICAgICAgICAgICAgZmxhZ3MgICAtIFBhZ2UgZmxhZ3MKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAgID0gICAgICAgcHJlc2VudAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxICAgPSAgICAgICBSZWFkKDApL1dyaXRlKDEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgTWFwUGh5c2ljYWwyTGluZWFyCisKKyAgICAgICAgQVJHICAgICBwQWRkcjpVTE9ORywgbEFkZHI6VUxPTkcsIHBhZ2VzOlVJTlQsIHBmbGFnczpVSU5UCisKKyAgICAgICAgZW50ZXJfYworCisgICAgICAgIGFuZCAgICAgW1VMT05HIHBBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5CisgICAgICAgIGFuZCAgICAgW1VMT05HIGxBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5CisgICAgICAgIG1vdiAgICAgZWN4LFtwZmxhZ3NdCisgICAgICAgIGFuZCAgICAgZWN4LDExYiAgICAgICAgICAgICAgICAgOyBKdXN0IHR3byBiaXRzCisgICAgICAgIG9yICAgICAgZWN4LDEwMGIgICAgICAgICAgICAgICAgOyBTdXBlcnZpc29yIGJpdAorICAgICAgICBtb3YgICAgIFtwZmxhZ3NdLGVjeAorCisgICAgICAgIG1vdiAgICAgZWR4LFtsQWRkcl0KKyAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCA9IERpcmVjdG9yeQorICAgICAgICBtb3YgICAgIGVzaSxbUERCUl0KKyAgICAgICAgbW92ICAgICBlZGksW3BhZ2VzXSAgICAgICAgICAgICA7IEVESSBwYWdlIGNvdW50CisgICAgICAgIG1vdiAgICAgZWJ4LFtsQWRkcl0KKworQEBDcmVhdGVMb29wOgorICAgICAgICBtb3YgICAgIGVjeCxbZXNpK2VkeCo0XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgdGVzdCAgICBlY3gsMSAgICAgICAgICAgICAgICAgICA7IElzIGl0IHByZXNlbnQ/CisgICAgICAgIGpueiAgICAgQEBUYWJsZU9LCisgICAgICAgIG1vdiAgICAgZWF4LGVkeAorICAgICAgICBjYWxsICAgIENyZWF0ZVBhZ2VUYWJsZSAgICAgICAgIDsgQ3JlYXRlIGEgcGFnZSB0YWJsZQorQEBUYWJsZU9LOgorICAgICAgICBtb3YgICAgIGVheCxlYngKKyAgICAgICAgc2hyICAgICBlYXgsMTIKKyAgICAgICAgYW5kICAgICBlYXgsM0ZGaAorICAgICAgICBzdWIgICAgIGVheCwxMDI0CisgICAgICAgIG5lZyAgICAgZWF4ICAgICAgICAgICAgICAgICAgICAgOyBFQVggPSBwYWdlIGNvdW50IGluIHRoaXMgdGFibGUKKyAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgICAgICA7IE5leHQgdGFibGUKKyAgICAgICAgbW92ICAgICBlYngsMCAgICAgICAgICAgICAgICAgICA7IE5leHQgdGltZSB3ZSdsbCBtYXAgMUsgcGFnZXMKKyAgICAgICAgc3ViICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFN1YnRyYWN0IG1hcHBlZCBwYWdlcyBmcm9tIHBhZ2UgY291bnQKKyAgICAgICAgam5zICAgICBAQENyZWF0ZUxvb3AgICAgICAgICAgICA7IENyZWF0ZSBtb3JlIHRhYmxlcyBpZiBuZWNlc3NhcnkKKworICAgICAgICBtb3YgICAgIGVjeCxbcGFnZXNdICAgICAgICAgICAgIDsgRUNYID0gUGFnZSBjb3VudAorICAgICAgICBtb3YgICAgIGVzaSxbbEFkZHJdCisgICAgICAgIHNociAgICAgZXNpLDEyICAgICAgICAgICAgICAgICAgOyBPZmZzZXQgcGFydCBpc24ndCBuZWVkZWQKKyAgICAgICAgbW92ICAgICBlZGksW3BBZGRyXQorQEBNYXBwaW5nTG9vcDoKKyAgICAgICAgbW92ICAgICBlYXgsZXNpCisgICAgICAgIHNociAgICAgZWF4LDEwICAgICAgICAgICAgICAgICAgOyBFQVggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKKyAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCisgICAgICAgIG1vdiAgICAgZWF4LFtlYXgqNCtlYnhdICAgICAgICAgOyBFQVggPSBwYWdlIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlCisgICAgICAgIG1vdiAgICAgZWJ4LGVzaQorICAgICAgICBhbmQgICAgIGVieCwzRkZoICAgICAgICAgICAgICAgIDsgRUJYID0gb2Zmc2V0IHRvIHBhZ2UgdGFibGUKKyAgICAgICAgbW92ICAgICBlZHgsZWRpCisgICAgICAgIGFkZCAgICAgZWRpLDQwOTYgICAgICAgICAgICAgICAgOyBOZXh0IHBoeXNpY2FsIGFkZHJlc3MKKyAgICAgICAgaW5jICAgICBlc2kgICAgICAgICAgICAgICAgICAgICA7IE5leHQgbGluZWFyIHBhZ2UKKyAgICAgICAgb3IgICAgICBlZHgsW3BmbGFnc10gICAgICAgICAgICA7IFVwZGF0ZSBmbGFncy4uLgorICAgICAgICBtb3YgICAgIFtlYXgrZWJ4KjRdLGVkeCAgICAgICAgIDsgU3RvcmUgcGFnZSB0YWJsZSBlbnRyeQorICAgICAgICBsb29wICAgIEBATWFwcGluZ0xvb3AKKyAgICAgICAgbW92ICAgICBlYXgsY3IzCisgICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQorCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKK2VuZGNvZGVzZWcgIF92ZmxhdAorCitlbmRpZgorCisgICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0N2U1NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9jcHVpbmZvLmMKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50LgorKgorKiBEZXNjcmlwdGlvbjogIFNNWCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHRlcm5hbCB0aW1pbmcgZnVuY3Rpb24gKi8KKwordm9pZCBfX1pUaW1lckluaXQodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAorICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCit7CisgICAgdWxvbmcgcmVzb2x1dGlvbjsKKworICAgIF9fWlRpbWVySW5pdCgpOworICAgIFVMWlRpbWVyUmVzb2x1dGlvbigmcmVzb2x1dGlvbik7CisgICAgZnJlcS0+bG93ID0gKHVsb25nKSgxMDAwMDAwMDAwMC4wIC8gcmVzb2x1dGlvbik7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+bG93ID0gVUxaUmVhZFRpbWUoKSAqIDEwMDAwTDsgIFwKKyAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTNiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvZXZlbnQuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50CisqCisqIERlc2NyaXB0aW9uOiAgMzItYml0IFNNWCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KKyogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNteC9wczJtb3VzZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpYm9vbCBfVkFSQVBJICAgX0VWVF91c2VFdmVudHMgPSB0cnVlOyAgLyogVHJ1ZSB0byB1c2UgZXZlbnQgaGFuZGxpbmcgICAqLworaWJvb2wgX1ZBUkFQSSAgIF9FVlRfaW5zdGFsbGVkID0gMDsgICAgIC8qIEV2ZW50IGhhbmRlcnMgaW5zdGFsbGVkPyAgICAgKi8KK3VjaGFyIF9WQVJBUEkgICAqX0VWVF9iaW9zUHRyID0gTlVMTDsgICAvKiBQb2ludGVyIHRvIHRoZSBCSU9TIGRhdGEgYXJlYSAqLworc3RhdGljIGlib29sICAgIGhhdmVNb3VzZSA9IGZhbHNlOyAgICAgIC8qIFRydWUgaWYgd2UgaGF2ZSBhIG1vdXNlICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLworCit2b2lkICAgIEVWVEFQSSBfRVZUX3BvbGxKb3lzdGljayh2b2lkKTsKK3VpbnQgICAgRVZUQVBJIF9FVlRfZGlzYWJsZUludCh2b2lkKTsKK3VpbnQgICAgRVZUQVBJIF9FVlRfcmVzdG9yZUludCh1aW50IGZsYWdzKTsKK3ZvaWQgICAgRVZUQVBJIF9FVlRfY29kZVN0YXJ0KHZvaWQpOwordm9pZCAgICBFVlRBUEkgX0VWVF9jb2RlRW5kKHZvaWQpOwordm9pZCAgICBFVlRBUEkgX0VWVF9jQ29kZVN0YXJ0KHZvaWQpOwordm9pZCAgICBFVlRBUEkgX0VWVF9jQ29kZUVuZCh2b2lkKTsKK2ludCAgICAgRVZUQVBJIF9FVlRfZ2V0S2V5Q29kZSh2b2lkKTsKK2ludCAgICAgRVZUQVBJIEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpOwordm9pZCAgICBFVlRBUEkgRVZUX3dyaW54KGludCBwb3J0LGludCBpbmRleCxpbnQgdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RvIG5vdGhpbmcgZm9yIERPUywgYmVjYXVzZSB3ZSBhcmUgZnVsbHkgaW50ZXJydXB0IGRyaXZlbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfcHVtcE1lc3NhZ2VzKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCitzdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwordGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgorZXZlbnRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKK3sKKyAgICByZXR1cm4gKHVsb25nKVBNX2dldExvbmcoX0VWVF9iaW9zUHRyKzB4NkMpICogNTVVTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbmNsdWRlIGdlbmVyaWMgcmF3IHNjYW5jb2RlIGtleWJvYXJkIG1vZHVsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY29tbW9uL2tleWJvYXJkLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIGEgbW91c2UgYXR0YWNoZWQgYW5kIGZ1bmN0aW9uaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBkZXRlY3RNb3VzZSh2b2lkKQoreworICAgcmV0dXJuKHBzMlF1ZXJ5KCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3doYXQgICAgICAgIC0gRXZlbnQgY29kZQorbWVzc2FnZSAgICAgLSBFdmVudCBtZXNzYWdlCit4LHkgICAgICAgICAtIE1vdXNlIHBvc2l0aW9uIGF0IHRpbWUgb2YgZXZlbnQKK2J1dF9zdGF0ICAgIC0gTW91c2UgYnV0dG9uIHN0YXR1cyBhdCB0aW1lIG9mIGV2ZW50CisKK1JFTUFSS1M6CitBZGRzIGEgbmV3IG1vdXNlIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHdpdGhpbgordGhlIG1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lLCBzbyBpdCBtdXN0IGJlIGVmZmljaWVudC4KKworTk9URTogICBJbnRlcnJ1cHRzIE1VU1QgYmUgT0ZGIHdoaWxlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZW5zdXJlIHdlIGhhdmUKKyAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgorICAgICAgICBpbnRlcnJ1cHQgZHJpdmVuIHN5c3RlbXMgKGxpa2UgdW5kZXIgRE9TKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhZGRNb3VzZUV2ZW50KAorICAgIHVpbnQgd2hhdCwKKyAgICB1aW50IG1lc3NhZ2UsCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IG1pY2tleVgsCisgICAgaW50IG1pY2tleVksCisgICAgdWludCBidXRfc3RhdCkKK3sKKyAgICBldmVudF90IGV2dDsKKworICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7CisgICAgICAgIC8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkLiAqLworICAgICAgICBldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKKyAgICAgICAgZXZ0LndoYXQgPSB3aGF0OworICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIGV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKKyAgICAgICAgZXZ0LndoZXJlX3ggPSB4OyAgICAgICAgICAgICAgICAvKiBTYXZlIG1vdXNlIGV2ZW50IHBvc2l0aW9uICAgICovCisgICAgICAgIGV2dC53aGVyZV95ID0geTsKKyAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBtaWNrZXlYOworICAgICAgICBldnQucmVsYXRpdmVfeSA9IG1pY2tleVk7CisgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZULmtleU1vZGlmaWVyczsKKyAgICAgICAgYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CittYXNrICAgICAgICAtIEV2ZW50IG1hc2sKK2J1dHN0YXRlICAgIC0gQnV0dG9uIHN0YXRlCit4ICAgICAgICAgICAtIE1vdXNlIHggY29vcmRpbmF0ZQoreSAgICAgICAgICAgLSBNb3VzZSB5IGNvb3JkaW5hdGUKKworUkVNQVJLUzoKK01vdXNlIGV2ZW50IGhhbmRsaW5nIHJvdXRpbmUuIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vdXNlIGV2ZW50IG9jY3VycywKK2FuZCB3ZSBjYWxsIHRoZSBhZGRNb3VzZUV2ZW50KCkgcm91dGluZSB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIG1vdXNlIGV2ZW50Cit0byB0aGUgZXZlbnQgcXVldWUuCisKK05vdGU6IEludGVycnVwdHMgYXJlIE9OIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbW91c2UgZHJpdmVyIGNvZGUuCisvL0FNOiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGhhcyBub3QgYWN0dWFsbHkgYmVlbiBwb3J0ZWQgZnJvbSBET1MgeWV0IGFuZCBzaG91bGQgbm90CisvL0FNOiBiZSBpbnN0YWxsZWQgdW50aWwgaXQgaXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRVZUQVBJIG1vdXNlSVNSKAorICAgIHVpbnQgbWFzaywKKyAgICB1aW50IGJ1dHN0YXRlLAorICAgIGludCB4LAorICAgIGludCB5LAorICAgIGludCBtaWNrZXlYLAorICAgIGludCBtaWNrZXlZKQoreworICAgIFJNUkVHUyAgcmVnczsKKyAgICB1aW50ICAgIHBzOworCisgICAgaWYgKG1hc2sgJiAxKSB7CisgICAgICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgbW91c2UgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgRVZULm14ID0geDsgRVZULm15ID0geTsKKworICAgICAgICAvKiBJZiB0aGUgbGFzdCBldmVudCB3YXMgYSBtb3ZlbWVudCBldmVudCwgdGhlbiBtb2RpZnkgdGhlIGxhc3QKKyAgICAgICAgICogZXZlbnQgcmF0aGVyIHRoYW4gcG9zdCBhIG5ldyBvbmUsIHNvIHRoYXQgdGhlIHF1ZXVlIHdpbGwgbm90CisgICAgICAgICAqIGJlY29tZSBzYXR1cmF0ZWQuIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIGRhdGEgc3RydWN0dXJlcywgd2UKKyAgICAgICAgICogTVVTVCBlbnN1cmUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBvZmYuCisgICAgICAgICAqLworICAgICAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOworICAgICAgICBpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKKyAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV94ID0geDsgICAgICAgICAgLyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KKyAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0geTsKKyAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7CisgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeSArPSBtaWNrZXlZOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAgICAgICAgIC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KKyAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFTU9WRSwwLHgseSxtaWNrZXlYLG1pY2tleVksYnV0c3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOworICAgICAgICB9CisgICAgaWYgKG1hc2sgJiAweDJBKSB7CisgICAgICAgIHBzID0gX0VWVF9kaXNhYmxlSW50KCk7CisgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFRE9XTixtYXNrID4+IDEseCx5LDAsMCxidXRzdGF0ZSk7CisgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgIH0KKyAgICBpZiAobWFzayAmIDB4NTQpIHsKKyAgICAgICAgcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKKyAgICAgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VVUCxtYXNrID4+IDIseCx5LDAsMCxidXRzdGF0ZSk7CisgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgICAgIF9FVlRfcmVzdG9yZUludChwcyk7CisgICAgICAgIH0KKyAgICBFVlQub2xkS2V5ID0gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24uCisKK05PVEU6ICAgSW50ZXJydXB0cyBhcmUgT0ZGIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgSVNSLAorICAgICAgICBhbmQgd2UgbGVhdmUgdGhlbSBPRkYgdGhlIGVudGlyZSB0aW1lLiBUaGlzIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsKKyAgICAgIGluIGNvbmp1bmN0aW9uIHdpdGggc214IGtleWJvYXJkIGhhbmRsZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRVZUQVBJIGtleWJvYXJkSVNSKHZvaWQpCit7CisgICBQTV9jaGFpblByZXZLZXkoKTsKKyAgICBwcm9jZXNzUmF3U2NhbkNvZGUoUE1faW5wYigweDYwKSk7CisgICAgUE1fb3V0cGIoMHgyMCwweDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfRVZUX2Fib3J0KCkKK3sKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgaW50ICAgICBpOworCisgICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKKyAgICBfRVZUX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworICAgIEVWVF9yZXN1bWUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOworICAgIGludCAgICAgICAgICAgICBzdGF0OworICAgIHVjaGFyICAgICAgICAgICBtb2RzOworICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKKworICAgIGlmIChfRVZUX3VzZUV2ZW50cykgeworICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSBhbmQgZW5hYmxlIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KKyAgICAgICAgaW5pdEV2ZW50UXVldWUoKTsKKyAgICAgICAgUE1fc2V0S2V5SGFuZGxlcihrZXlib2FyZElTUik7CisgICAgICAgIGlmICgoaGF2ZU1vdXNlID0gZGV0ZWN0TW91c2UoKSkgIT0gMCkKKyAgICAgICAgICAgIFBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsbW91c2VJU1IpOworCisgICAgICAgIC8qIFJlYWQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGZyb20gdGhlIEJJT1MgdG8gZ2V0IHRoZQorICAgICAgICAgKiBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIHN0YXRlLiBUaGUgb25seSBzdGF0ZSB3ZSBjYXJlIGFib3V0IGlzCisgICAgICAgICAqIHRoZSBjb3JyZWN0IHRvZ2dsZSBzdGF0ZSBmbGFncyBzdWNoIGFzIFNDUk9MTExPQ0ssIE5VTUxPQ0sgYW5kCisgICAgICAgICAqIENBUFNMT0NLLgorICAgICAgICAgKi8KKyAgICAgICAgRVZULmtleU1vZGlmaWVycyA9IDA7CisgICAgICAgIG1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KTsKKyAgICAgICAgaWYgKG1vZHMgJiAweDEwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfU0NST0xMTE9DSzsKKyAgICAgICAgaWYgKG1vZHMgJiAweDIwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfTlVNTE9DSzsKKyAgICAgICAgaWYgKG1vZHMgJiAweDQwKQorICAgICAgICAgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfQ0FQU0xPQ0s7CisKKyAgICAgICAgLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0CisgICAgICAgICAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKKyAgICAgICAgICogdW5kZXIgcmVhbCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIC8qIEl0IGlzIGRpZmZpY3VsdCB0byBlbnN1cmUgdGhhdCB3ZSBsb2NrIG91ciBnbG9iYWwgZGF0YSwgc28gd2UKKyAgICAgICAgICAgICAqIGRvIHRoaXMgYnkgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgbG9ja2luZyBhbGwgZGF0YQorICAgICAgICAgICAgICogMktiIG9uIGVpdGhlciBzaWRlLiBUaGlzIHNob3VsZCBwcm9wZXJseSBjb3ZlciB0aGUgZ2xvYmFsIGRhdGEKKyAgICAgICAgICAgICAqIHVzZWQgYnkgdGhlIG1vZHVsZSAodGhlIG90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGRlY2xhcmUgdGhlCisgICAgICAgICAgICAgKiB2YXJpYWJsZXMgaW4gYXNzZW1ibGVyLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgaXQgd2lsbCBiZQorICAgICAgICAgICAgICogY29ycmVjdCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXQgID0gIVBNX2xvY2tEYXRhUGFnZXMoJkVWVCxzaXplb2YoRVZUKSwmbGgpOworICAgICAgICAgICAgc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX0VWVF9iaW9zUHRyLHNpemVvZihfRVZUX2Jpb3NQdHIpLCZsaCk7CisgICAgICAgICAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jQ29kZVN0YXJ0LChpbnQpX0VWVF9jQ29kZUVuZC0oaW50KV9FVlRfY0NvZGVTdGFydCwmbGgpOworICAgICAgICAgICAgc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9FVlRfY29kZVN0YXJ0LChpbnQpX0VWVF9jb2RlRW5kLShpbnQpX0VWVF9jb2RlU3RhcnQsJmxoKTsKKyAgICAgICAgICAgIGlmIChzdGF0KSB7CisgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiUGFnZSBsb2NraW5nIHNlcnZpY2VzIGZhaWxlZCAtIGludGVycnVwdCBoYW5kbGluZyBub3Qgc2FmZSEiKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2tlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgX0VWVF9pbnN0YWxsZWQgPSB0cnVlOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgaWYgKGhhdmVNb3VzZSkgeworICAgICAgICBwczJNb3VzZVN0b3AoKTsKKyAgICAgICAgcHMyTW91c2VTdGFydCggMCwgeFJlcywgMCwgeVJlcywgLTEsIC0xLCAtMSk7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK01vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAorYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfc2V0TW91c2VQb3MoCisgICAgaW50ICp4LAorICAgIGludCAqeSkKK3sKKyAgICBpZiAoaGF2ZU1vdXNlKQorICAgICAgICBwczJNb3VzZU1vdmUoKngsICp5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCkKK3sKKyAgICB1Y2hhciAgIG1vZHM7CisKKyAgICBpZiAoX0VWVF9pbnN0YWxsZWQpIHsKKyAgICAgICAgUE1fcmVzdG9yZUtleUhhbmRsZXIoKTsKKyAgICBpZiAoaGF2ZU1vdXNlKQorICAgICAgICBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBrZXlib2FyZCBtb2RpZmllciBmbGFncyBpbiB0aGUgQklPUyB0byBvdXIgdmFsdWVzICovCisgICAgICAgIEVWVF9hbGxvd0xFRFModHJ1ZSk7CisgICAgICAgIG1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KSAmIH4weDcwOworICAgICAgICBpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9TQ1JPTExMT0NLKQorICAgICAgICAgICAgbW9kcyB8PSAweDEwOworICAgICAgICBpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKQorICAgICAgICAgICAgbW9kcyB8PSAweDIwOworICAgICAgICBpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9DQVBTTE9DSykKKyAgICAgICAgICAgIG1vZHMgfD0gMHg0MDsKKyAgICAgICAgUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNyxtb2RzKTsKKworICAgICAgICAvKiBGbGFnIHRoYXQgd2UgYXJlIG5vIGxvbmdlciBpbnN0YWxsZWQgKi8KKyAgICAgICAgX0VWVF9pbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9leGl0KHZvaWQpCit7CisgICAgRVZUX3N1c3BlbmQoKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmOGRhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9vc2hkci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudC4KKyoKKyogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjOTVkNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbS5jCkBAIC0wLDAgKzEsMTE4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzIgYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50LgorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaW5jbHVkZSAienRpbWVyYy5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAibXRyci5oIgorI2luY2x1ZGUgInBtX2hlbHAuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRvcy5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWZkZWYgIF9fR05VQ19fCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL25lYXJwdHIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorI2lmZGVmICBfX0JPUkxBTkRDX18KKyNwcmFnbWEgd2FybiAtcGFyCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgb2xkTW9kZTsKKyAgICBpbnQgICAgIG9sZDUwTGluZXM7CisgICAgfSBET1Nfc3RhdGVCdWY7CisKKyNkZWZpbmUgTUFYX1JNX0JMT0NLUyAgIDEwCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHZvaWQgICAgKnA7CisgICAgdWludCAgICB0YWc7CisgICAgfSBybUJsb2Nrc1tNQVhfUk1fQkxPQ0tTXTsKKworc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCitzdGF0aWMgdm9pZCAgICAgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KK3N0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLworc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCitzdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwordXNob3J0IF9WQVJBUEkgIF9QTV9zYXZlZERTID0gMDsKK3N0YXRpYyB1bG9uZyAgICBQREIgPSAwLCpwUERCID0gTlVMTDsKK3N0YXRpYyB1aW50ICAgICBWWERfdmVyc2lvbiA9IC0xOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1bG9uZyAgIF9BU01BUEkgX1BNX2dldFBEQih2b2lkKTsKK3ZvaWQgICAgX0FTTUFQSSBfUE1fVnhEQ2FsbChWWERfcmVncyAqcmVncyx1aW50IG9mZix1aW50IHNlbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRXh0ZXJuYWwgZnVuY3Rpb24gdG8gY2FsbCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9WeERDYWxsKAorICAgIFZYRF9yZWdzICpyZWdzKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0JDRCBjb2RlZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELCBvciAwIGlmIG5vdCBsb2FkZWQgKGllOiAweDIwMiAtIDIuMikKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWeEQgdGhhdCB3ZSBoYXZlIGNvbm5lY3RlZCB0by4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKK30KKwordm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCit7CisjaWZuZGVmIFJFQUxNT0RFCisgICAgTVRSUl9pbml0KCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitiYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCitzaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgordHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgorCitSRVRVUk5TOgorRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIHNpemUsCisgICAgdWludCB0eXBlKQoreworI2lmbmRlZiBSRUFMTU9ERQorICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7CisjZWxzZQorICAgIHJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKK30KKworaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKK3sgcmV0dXJuIGZhbHNlOyB9CisKK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7IHJldHVybiBfT1NfU01YOyB9CisKK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreyByZXR1cm4gUE1fMzg2OyB9CisKK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKKyAgICAgICAgc1twb3NdID0gJ1xcJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKwordm9pZCBNR0xPdXRwdXQoY2hhciAqKTsKKwordm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7CisgICAgTUdMT3V0cHV0KG1zZyk7CisvLyBObyBzdXBwb3J0IGZvciBmcHJpbnRmKCkgdW5kZXIgc214IGN1cnJlbnRseSEKKy8vICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7CisgICAgZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQoreworICAgIGlmIChWRVNBQnVmX3B0cikKKyAgICAgICAgUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOworICAgIFZFU0FCdWZfcHRyID0gMDsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKK3sKKyAgICBpZiAoIVZFU0FCdWZfcHRyKSB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLworICAgICAgICBpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhdGV4aXQoRXhpdFZCRUJ1Zik7CisgICAgICAgIH0KKyAgICAqbGVuID0gVkVTQUJ1Zl9sZW47CisgICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7CisgICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7CisgICAgcmV0dXJuIFZFU0FCdWZfcHRyOworfQorCitpbnQgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LCZzcmVncyk7Cit9CisKKy8qIFJvdXRpbmVzIHRvIHNldCBhbmQgZ2V0IHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IHZlY3RvcnMsIGJ5IG1ha2luZworICogZGlyZWN0IHJlYWwgbW9kZSBjYWxscyB0byBET1MgYW5kIGJ5cGFzc2luZyB0aGUgRE9TIGV4dGVuZGVycyBBUEkuCisgKiBUaGlzIGlzIHRoZSBzYWZlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzLCBhcyBzb21lIHNlcnZlcnMgdHJ5IHRvIGJlCisgKiBzbWFydCBhYm91dCBjaGFuZ2luZyByZWFsIG1vZGUgdmVjdG9ycy4KKyAqLworCit2b2lkIFBNQVBJIF9QTV9nZXRSTXZlY3QoaW50IGludG5vLCBsb25nICpyZWFsaXNyKQoreworICAgIFJNUkVHUyAgcmVnczsKKyAgICBSTVNSRUdTIHNyZWdzOworCisgICAgUE1fc2F2ZURTKCk7CisgICAgcmVncy5oLmFoID0gMHgzNTsKKyAgICByZWdzLmguYWwgPSBpbnRubzsKKyAgICBQTV9pbnQ4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOworICAgICpyZWFsaXNyID0gKChsb25nKXNyZWdzLmVzIDw8IDE2KSB8IHJlZ3MueC5ieDsKK30KKwordm9pZCBQTUFQSSBfUE1fc2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyByZWFsaXNyKQoreworICAgIFJNUkVHUyAgcmVnczsKKyAgICBSTVNSRUdTIHNyZWdzOworCisgICAgUE1fc2F2ZURTKCk7CisgICAgcmVncy5oLmFoID0gMHgyNTsKKyAgICByZWdzLmguYWwgPSBpbnRubzsKKyAgICBzcmVncy5kcyA9IChpbnQpKHJlYWxpc3IgPj4gMTYpOworICAgIHJlZ3MueC5keCA9IChpbnQpKHJlYWxpc3IgJiAweEZGRkYpOworICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Cit9CisKK3ZvaWQgUE1BUEkgX1BNX2FkZFJlYWxNb2RlQmxvY2sodm9pZCAqbWVtLHVpbnQgdGFnKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9STV9CTE9DS1M7IGkrKykgeworICAgICAgICBpZiAocm1CbG9ja3NbaV0ucCA9PSBOVUxMKSB7CisgICAgICAgICAgICBybUJsb2Nrc1tpXS5wID0gbWVtOworICAgICAgICAgICAgcm1CbG9ja3NbaV0udGFnID0gdGFnOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgUE1fZmF0YWxFcnJvcigiVG8gbWFueSByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb25zISIpOworfQorCit1aW50IFBNQVBJIF9QTV9maW5kUmVhbE1vZGVCbG9jayh2b2lkICptZW0pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7CisgICAgICAgIGlmIChybUJsb2Nrc1tpXS5wID09IG1lbSkKKyAgICAgICAgICAgIHJldHVybiBybUJsb2Nrc1tpXS50YWc7CisgICAgICAgIH0KKyAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3QgZmluZCBwcmlvciByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24hIik7CisgICAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKKyAgICBjaGFyICpwYXRoLAorICAgIGludCBtYXhMZW4pCit7CisgICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Cit9CisKK2NoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCit7IHJldHVybiAnQyc7IH0KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoreyByZXR1cm4gImM6XFwiOyB9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKyAgICBjaGFyICAgICAgICAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZW52OworICAgIHJldHVybiAiYzpcXG51Y2xldXMiOworfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCit7IHJldHVybiAiU01YIjsgfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKK3sgcmV0dXJuICJTTVgiOyB9CisKK2ludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQoreworICAgIGludCAgICAgaGl0OworICAgIGV2ZW50X3QgZXZ0OworCisgICAgaGl0ID0gRVZUX3BlZWtOZXh0KCZldnQsRVZUX0tFWURPV04gfCBFVlRfS0VZUkVQRUFUKTsKKyAgICBFVlRfZmx1c2gofihFVlRfS0VZRE9XTiB8IEVWVF9LRVlSRVBFQVQpKTsKKyAgICByZXR1cm4gaGl0OworfQorCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sKKyAgIGV2ZW50X3QgZXZ0OworCisgICAgRVZUX2hhbHQoJmV2dCxFVlRfS0VZRE9XTik7CisgICByZXR1cm4gRVZUX2FzY2lpQ29kZShldnQubWVzc2FnZSk7Cit9CisKK1BNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbikKK3sKKyAgICAvKiBOb3QgdXNlZCBmb3IgU01YICovCisgICAgKHZvaWQpaHduZFVzZXI7CisgICAgKHZvaWQpZGV2aWNlOworICAgICh2b2lkKXhSZXM7CisgICAgKHZvaWQpeVJlczsKKyAgICAodm9pZClicHA7CisgICAgKHZvaWQpZnVsbFNjcmVlbjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICByZXR1cm4gc2l6ZW9mKERPU19zdGF0ZUJ1Zik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIERPU19zdGF0ZUJ1ZiAgICAqc2IgPSBzdGF0ZUJ1ZjsKKworICAgIC8qIFNhdmUgdGhlIG9sZCB2aWRlbyBtb2RlIHN0YXRlICovCisgICAgcmVncy5oLmFoID0gMHgwRjsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICBzYi0+b2xkTW9kZSA9IHJlZ3MuaC5hbCAmIDB4N0Y7CisgICAgc2ItPm9sZDUwTGluZXMgPSBmYWxzZTsKKyAgICBpZiAoc2ItPm9sZE1vZGUgPT0gMHgzKSB7CisgICAgICAgIHJlZ3MueC5heCA9IDB4MTEzMDsKKyAgICAgICAgcmVncy54LmJ4ID0gMDsKKyAgICAgICAgcmVncy54LmR4ID0gMDsKKyAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgICAgIHNiLT5vbGQ1MExpbmVzID0gKHJlZ3MuaC5kbCA9PSA0MiB8fCByZWdzLmguZGwgPT0gNDkpOworICAgICAgICB9CisgICAgKHZvaWQpaHduZENvbnNvbGU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBTTVggKi8KKyAgICAodm9pZClzYXZlU3RhdGU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIFJNUkVHUyAgICAgICAgICAgICAgcmVnczsKKyAgICBjb25zdCBET1Nfc3RhdGVCdWYgICpzYiA9IHN0YXRlQnVmOworCisgICAgLyogUmV0b3JlIDUwIGxpbmUgbW9kZSBpZiBzZXQgKi8KKyAgICBpZiAoc2ItPm9sZDUwTGluZXMpIHsKKyAgICAgICAgcmVncy54LmF4ID0gMHgxMTEyOworICAgICAgICByZWdzLnguYnggPSAwOworICAgICAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICAgICAgfQorICAgICh2b2lkKWh3bmRDb25zb2xlOworfQorCit2b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBTTVggKi8KKyAgICAodm9pZClod25kQ29uc29sZTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOworICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRBLHdpZHRoKTsKKyAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NEMsd2lkdGgqMik7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKKyAgICBpZiAoaGVpZ2h0ID4gMjUpIHsKKyAgICAgICAgUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MDYwNyk7CisgICAgICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NSwweDA4KTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwRDBFKTsKKyAgICAgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDE2KTsKKyAgICAgICAgfQorfQorCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKK3sKKyAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQoreworICAgIFBNX2ZyZWUocHRyKTsKK30KKworI2RlZmluZSBHZXRSTVZlY3QoaW50bm8saXNyKSAgICAqKGlzcikgPSAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXQorI2RlZmluZSBTZXRSTVZlY3QoaW50bm8saXNyKSAgICAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXSA9IChpc3IpCisKK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TLAorICAgIHVsb25nIEJJT1NMZW4pCit7CisgICAgc3RhdGljIGludCAgICAgIGZpcnN0VGltZSA9IHRydWU7CisgICAgc3RhdGljIHVjaGFyICAgICpybVplcm9QdHI7CisgICAgbG9uZyAgICAgICAgICAgIEN1cnJlbnQxMCxDdXJyZW50NkQsQ3VycmVudDQyOworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKKworICAgIC8qIENyZWF0ZSBhIHplcm8gbWVtb3J5IG1hcHBpbmcgZm9yIHVzIHRvIHVzZSAqLworICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgcm1aZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHg3RkZGLHRydWUpOworICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgLyogUmVtYXAgdGhlIHNlY29uZGFyeSBCSU9TIHRvIDB4QzAwMDAgcGh5c2ljYWwgKi8KKyAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDBMIHx8IEJJT1NMZW4gPiAzMjc2OCkgeworICAgICAgICAvKiBTTVggY2Fubm90IHZpcnR1YWxseSByZW1hcCB0aGUgQklPUywgc28gd2UgY2FuIG9ubHkgd29yayBpZiBhbGwKKyAgICAgICAgICogdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBhcmUgaWRlbnRpY2FsLCBhbmQgd2UgdGhlbiB1c2UgdGhlCisgICAgICAgICAqIEJJT1Mgb24gdGhlIGZpcnN0IGNvbnRyb2xsZXIgZm9yIGFsbCB0aGUgcmVtYWluaW5nIGNvbnRyb2xsZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgT1MnZXMgdGhhdCBkbyB2aXJ0dWFsIG1lbW9yeSwgYW5kIHJlbWFwcGluZyBvZiAweEMwMDAwCisgICAgICAgICAqIHBoeXNpY2FsIChwZXJoYXBzIGEgY29weSBvbiB3cml0ZSBtYXBwaW5nKSBzaG91bGQgYmUgYWxsIHRoYXQKKyAgICAgICAgICogaXMgbmVlZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAvKiBTYXZlIGN1cnJlbnQgaGFuZGxlcnMgb2YgaW50IDEwaCBhbmQgNkRoICovCisgICAgR2V0Uk1WZWN0KDB4MTAsJkN1cnJlbnQxMCk7CisgICAgR2V0Uk1WZWN0KDB4NkQsJkN1cnJlbnQ2RCk7CisKKyAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLworICAgIEdldFJNVmVjdCgweDQyLCZDdXJyZW50NDIpOworICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQ0Mik7ICAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KKyAgICByZWdzLnguYXggPSBheFZhbDsKKyAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOworCisgICAgLyogUmVzdG9yZSBjdXJyZW50IGhhbmRsZXJzICovCisgICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDEwKTsKKyAgICBTZXRSTVZlY3QoMHg2RCxDdXJyZW50NkQpOworCisgICAgLyogU2Vjb25kIHRoZSBwcmltYXJ5IEJJT1MgbWFwcGluIDE6MSBmb3IgMHhDMDAwMCBwaHlzaWNhbCAqLworICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwpIHsKKyAgICAgICAgLyogU01YIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLworICAgICAgICAodm9pZCltYXBwZWRCSU9TOworICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQoreworICAgIHVsb25nICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTDsKKyAgICBMWlRpbWVyT2JqZWN0ICAgdG07CisKKyAgICBMWlRpbWVyT25FeHQoJnRtKTsKKyAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQorICAgICAgICA7CisgICAgTFpUaW1lck9mZkV4dCgmdG0pOworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNCQzsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgzNzg7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIDB4Mjc4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgKHZvaWQpc3pETExOYW1lOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUsCisgICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKK3sKKyAgICAodm9pZCloTW9kdWxlOworICAgICh2b2lkKXN6UHJvY05hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUpCit7CisgICAgKHZvaWQpaE1vZHVsZTsKK30KKworaW50IFBNQVBJIFBNX3NldElPUEwoCisgICAgaW50IGxldmVsKQoreworICAgIHJldHVybiBsZXZlbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCisgICAgc3RydWN0IGZpbmRfdCAqYmxrKQoreworICAgIHVsb25nICAgZHdTaXplID0gZmluZERhdGEtPmR3U2l6ZTsKKworICAgIG1lbXNldChmaW5kRGF0YSwwLGZpbmREYXRhLT5kd1NpemUpOworICAgIGZpbmREYXRhLT5kd1NpemUgPSBkd1NpemU7CisgICAgaWYgKGJsay0+YXR0cmliICYgX0FfUkRPTkxZKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7CisgICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1VCRElSKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOworICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0FSQ0gpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9BUkNISVZFOworICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0hJRERFTikKKyAgICAgICAgZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKKyAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TWVNURU0pCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07CisgICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+c2l6ZTsKKyAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+bmFtZSxQTV9NQVhfUEFUSCk7CisgICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOworfQorCisjZGVmaW5lIEZJTkRfTUFTSyAgIChfQV9SRE9OTFkgfCBfQV9BUkNIIHwgX0FfU1VCRElSIHwgX0FfSElEREVOIHwgX0FfU1lTVEVNKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQoreworICAgIHN0cnVjdCBmaW5kX3QgKmJsazsKKworICAgIGlmICgoYmxrID0gUE1fbWFsbG9jKHNpemVvZigqYmxrKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7CisgICAgaWYgKF9kb3NfZmluZGZpcnN0KChjaGFyKilmaWxlbmFtZSxGSU5EX01BU0ssYmxrKSA9PSAwKSB7CisgICAgICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOworICAgICAgICByZXR1cm4gYmxrOworICAgICAgICB9CisgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAorICAgIHZvaWQgKmhhbmRsZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgc3RydWN0IGZpbmRfdCAqYmxrID0gaGFuZGxlOworCisgICAgaWYgKF9kb3NfZmluZG5leHQoYmxrKSA9PSAwKSB7CisgICAgICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIFBNX2ZyZWUoaGFuZGxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCitmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAordGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCitudW1iZXJpbmcgaXM6CisKKyAgICAxICAgLSBEcml2ZSBBOgorICAgIDIgICAtIERyaXZlIEI6CisgICAgMyAgIC0gRHJpdmUgQzoKKyAgICBldGMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCisgICAgY2hhciBkcml2ZSkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgcmVncy5oLmRsID0gKHVjaGFyKShkcml2ZSAtICdBJyArIDEpOworICAgIHJlZ3MuaC5haCA9IDB4MzY7ICAgICAgICAgICAgICAgLy8gR2V0IGRpc2sgaW5mb3JtYXRpb24gc2VydmljZQorICAgIFBNX2ludDg2KDB4MjEsJnJlZ3MsJnJlZ3MpOworICAgIHJldHVybiByZWdzLnguYXggIT0gMHhGRkZGOyAgICAgLy8gQVggPSAweEZGRkYgaWYgZGlzayBpcyBpbnZhbGlkCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KK1VuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcworb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2dldGRjd2QoCisgICAgaW50IGRyaXZlLAorICAgIGNoYXIgKmRpciwKKyAgICBpbnQgbGVuKQoreworICAgIHVpbnQgb2xkRHJpdmUsbWF4RHJpdmVzOworICAgIF9kb3NfZ2V0ZHJpdmUoJm9sZERyaXZlKTsKKyAgICBfZG9zX3NldGRyaXZlKGRyaXZlLCZtYXhEcml2ZXMpOworICAgIGdldGN3ZChkaXIsbGVuKTsKKyAgICBfZG9zX3NldGRyaXZlKG9sZERyaXZlLCZtYXhEcml2ZXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyNpZiBkZWZpbmVkKFROVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBEV09SRCBhdHRyID0gMDsKKworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKKyAgICAgICAgYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07CisgICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKKyNlbHNlCisgICAgdWludCBhdHRyID0gMDsKKworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBhdHRyIHw9IF9BX1JET05MWTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQorICAgICAgICBhdHRyIHw9IF9BX0FSQ0g7CisgICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQorICAgICAgICBhdHRyIHw9IF9BX0hJRERFTjsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCisgICAgICAgIGF0dHIgfD0gX0FfU1lTVEVNOworICAgIF9kb3Nfc2V0ZmlsZWF0dHIoZmlsZW5hbWUsYXR0cik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fbWtkaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisjaWZkZWYgIF9fR05VQ19fCisgICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lLFNfSVJVU1IpID09IDA7CisjZWxzZQorLy9BTTogICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7CisgICAgcmV0dXJuKGZhbHNlKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKy8vQU06ICAgcmV0dXJuIHJtZGlyKGZpbGVuYW1lKSA9PSAwOworICAgIHJldHVybihmYWxzZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LiBUaGUgbWVtb3J5CittYXkgYmUgcmVxdWlyZWQgdG8gYmUgYmVsb3cgdGhlIDE2TWVnIGJvdW5kYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgdm9pZCAgICAgICAgICAgICpwOworICAgIHVpbnQgICAgICAgICAgICByX3NlZyxyX29mZjsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7CisKKyAgICAvKiBVbmRlciBET1MgdGhlIG9ubHkgd2F5IHRvIGtub3cgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGlzIHRvCisgICAgICogYWxsb2NhdGUgdGhlIG1lbW9yeSBiZWxvdyB0aGUgMU1lZyBib3VuZGFyeSBhcyByZWFsIG1vZGUgbWVtb3J5LgorICAgICAqIFdlIGFsc28gYWxsb2NhdGUgNDA5NSBieXRlcyBtb3JlIG1lbW9yeSB0aGFuIHdlIG5lZWQsIHNvIHdlIGNhbgorICAgICAqIHByb3Blcmx5IHBhZ2UgYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBtZW1vcnkgYmxvY2sgZm9yIERNQSBvcGVyYXRpb25zLgorICAgICAqLworICAgIGlmIChzaXplID4gNDA5NikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwID0gUE1fYWxsb2NSZWFsU2VnKChzaXplICsgMHhGRkYpICYgfjB4RkZGLCZyX3NlZywmcl9vZmYpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqcGh5c0FkZHIgPSAoKHJfc2VnIDw8IDQpICsgcl9vZmYgKyAweEZGRikgJiB+MHhGRkY7CisgICAgUE1fbG9ja0RhdGFQYWdlcyhwLHNpemUqMiwmbGgpOworICAgIHJldHVybiBwOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cykKK3sKKyAgICAodm9pZClzaXplOworICAgIFBNX2ZyZWVSZWFsU2VnKHApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogR2VuZXJpYyBEUE1JIHJvdXRpbmVzIGNvbW1vbiB0byAxNi8zMiBiaXQgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3Vsb25nIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcih1bG9uZyBwaHlzQWRkcix1bG9uZyBsaW1pdCkKK3sKKyAgICBQTVJFR1MgIHI7CisgICAgdWxvbmcgICBwaHlzT2ZzOworCisgICAgaWYgKHBoeXNBZGRyIDwgMHgxMDAwMDBMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IG1hcCBtZW1vcnkgYmVsb3cgMU1iLCBidXQgdGhlIGxpbmVhciBhZGRyZXNzIGFyZSBhbHJlYWR5CisgICAgICAgICAqIG1hcHBlZCAxOjEgZm9yIHRoaXMgbWVtb3J5IGFueXdheSBzbyB3ZSBqdXN0IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHBoeXNBZGRyOworICAgICAgICB9CisKKyAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKKyAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIERQTUkgYXMgc29tZSBleHRlbmRlcnMKKyAgICAgKiB3aWxsIGZhaWwgdGhlIGNhbGxzIHVubGVzcyB0aGlzIGlzIHRoZSBjYXNlLiBJZiB3ZSByb3VuZCB0aGUKKyAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCisgICAgICogdGhhdCB3ZSByZXR1cm4uCisgICAgICovCisgICAgcGh5c09mcyA9IHBoeXNBZGRyICYgNDA5NTsKKyAgICBwaHlzQWRkciA9IHBoeXNBZGRyICYgfjQwOTU7CisgICAgbGltaXQgPSAoKGxpbWl0K3BoeXNPZnMrMSs0MDk1KSAmIH40MDk1KS0xOworCisgICAgci54LmF4ID0gMHg4MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIG1hcCBwaHlzaWNhbCB0byBsaW5lYXIgICAgICAqLworICAgIHIueC5ieCA9IHBoeXNBZGRyID4+IDE2OworICAgIHIueC5jeCA9IHBoeXNBZGRyICYgMHhGRkZGOworICAgIHIueC5zaSA9IGxpbWl0ID4+IDE2OworICAgIHIueC5kaSA9IGxpbWl0ICYgMHhGRkZGOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIGlmIChyLnguY2ZsYWcpCisgICAgICAgIHJldHVybiAweEZGRkZGRkZGVUw7CisgICAgcmV0dXJuICgodWxvbmcpci54LmJ4IDw8IDE2KSArIHIueC5jeCArIHBoeXNPZnM7Cit9CisKK2ludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpCit7CisgICAgUE1SRUdTICByOworCisgICAgci54LmF4ID0gNzsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLworICAgIHIueC5ieCA9IHNlbDsKKyAgICByLnguY3ggPSBsaW5BZGRyID4+IDE2OworICAgIHIueC5keCA9IGxpbkFkZHIgJiAweEZGRkY7CisgICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7CisgICAgaWYgKHIueC5jZmxhZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3Vsb25nIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpCit7CisgICAgUE1SRUdTICByOworCisgICAgci54LmF4ID0gNjsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLworICAgIHIueC5ieCA9IHNlbDsKKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICByZXR1cm4gKCh1bG9uZylyLnguY3ggPDwgMTYpICsgci54LmR4OworfQorCitpbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpCit7CisgICAgUE1SRUdTICByOworCisgICAgci54LmF4ID0gODsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBsaW1pdCAgICAgICAgICAqLworICAgIHIueC5ieCA9IHNlbDsKKyAgICByLnguY3ggPSBsaW1pdCA+PiAxNjsKKyAgICByLnguZHggPSBsaW1pdCAmIDB4RkZGRjsKKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICBpZiAoci54LmNmbGFnKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKwordWludCBQTUFQSSBEUE1JX2NyZWF0ZVNlbGVjdG9yKHVsb25nIGJhc2UsdWxvbmcgbGltaXQpCit7CisgICAgdWludCAgICBzZWw7CisgICAgUE1SRUdTICByOworCisgICAgLyogQWxsb2NhdGUgMSBkZXNjcmlwdG9yICovCisgICAgci54LmF4ID0gMDsKKyAgICByLnguY3ggPSAxOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIGlmIChyLnguY2ZsYWcpIHJldHVybiAwOworICAgIHNlbCA9IHIueC5heDsKKworICAgIC8qIFNldCB0aGUgZGVzY3JpcHRvciBhY2Nlc3MgcmlnaHRzIChmb3IgYSAzMiBiaXQgcGFnZSBncmFudWxhcgorICAgICAqIHNlZ21lbnQsIHJpbmcgMCkuCisgICAgICovCisgICAgci54LmF4ID0gOTsKKyAgICByLnguYnggPSBzZWw7CisgICAgci54LmN4ID0gMHg0MDkzOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworCisgICAgLyogTWFwIHBoeXNpY2FsIG1lbW9yeSBhbmQgY3JlYXRlIHNlbGVjdG9yICovCisgICAgaWYgKChiYXNlID0gRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQpKSA9PSAweEZGRkZGRkZGVUwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckJhc2Uoc2VsLGJhc2UpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JMaW1pdChzZWwsbGltaXQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2VsOworfQorCit2b2lkIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDE7CisgICAgci54LmJ4ID0gc2VsOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworfQorCitpbnQgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKK3sKKyAgICBQTVJFR1MgIHI7CisKKyAgICByLnguYXggPSAweDYwMDsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIExvY2sgTGluZWFyIFJlZ2lvbiAgICAgICovCisgICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLworICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOworICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KKyAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICByZXR1cm4gKCFyLnguY2ZsYWcpOworfQorCitpbnQgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQoreworICAgIFBNUkVHUyAgcjsKKworICAgIHIueC5heCA9IDB4NjAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgVW5sb2NrIExpbmVhciBSZWdpb24gICAgKi8KKyAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCisgICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7CisgICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLworICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworICAgIHJldHVybiAoIXIueC5jZmxhZyk7Cit9CisKK3ZvaWQgKiBQTUFQSSBEUE1JX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoreworICAgIFBNU1JFR1Mgc3JlZ3M7CisgICAgdWxvbmcgICBsaW5BZGRyOworICAgIHVsb25nICAgRFNCYXNlQWRkcjsKKworICAgIC8qIEdldCB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCBEUyBzZWxlY3RvciAqLworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOworICAgIGlmICgoYmFzZSA8IDB4MTAwMDAwKSAmJiAoRFNCYXNlQWRkciA9PSAwKSkgeworICAgICAgICAvKiBEUyBpcyB6ZXJvIGJhc2VkLCBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBmaXJzdCAxTWIgb2YKKyAgICAgICAgICogc3lzdGVtIG1lbW9yeSAobGlrZSB1bmRlciBET1M0R1cpLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuICh2b2lkKiliYXNlOworICAgICAgICB9CisKKyAgICAvKiBNYXAgdGhlIG1lbW9yeSB0byBhIGxpbmVhciBhZGRyZXNzIHVzaW5nIERQTUkgZnVuY3Rpb24gMHg4MDAgKi8KKyAgICBpZiAoKGxpbkFkZHIgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDApIHsKKyAgICAgICAgaWYgKGJhc2UgPj0gMHgxMDAwMDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogSWYgdGhlIGxpbmVhciBhZGRyZXNzIG1hcHBpbmcgZmFpbHMgYnV0IHdlIGFyZSB0cnlpbmcgdG8KKyAgICAgICAgICogbWFwIGFuIGFyZWEgaW4gdGhlIGZpcnN0IDFNYiBvZiBzeXN0ZW0gbWVtb3J5LCB0aGVuIHdlIG11c3QKKyAgICAgICAgICogYmUgcnVubmluZyB1bmRlciBhIFdpbmRvd3Mgb3IgT1MvMiBET1MgYm94LiBVbmRlciB0aGVzZQorICAgICAgICAgKiBlbnZpcm9ubWVudHMgd2UgY2FuIHVzZSB0aGUgc2VnbWVudCB3cmFwIGFyb3VuZCBhcyBhIGZhbGxiYWNrCisgICAgICAgICAqIG1lYXN1cmUsIGFzIHRoaXMgZG9lcyB3b3JrIHByb3Blcmx5LgorICAgICAgICAgKi8KKyAgICAgICAgbGluQWRkciA9IGJhc2U7CisgICAgICAgIH0KKworICAgIC8qIE5vdyBleHBhbmQgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgdG8gNEdiIHNvIHdlIGNhbiBhY2Nlc3MgaXQgKi8KKyAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JMaW1pdChzcmVncy5kcywweEZGRkZGRkZGVUwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEZpbmFsbHkgZW5hYmxlIGNhY2hpbmcgZm9yIHRoZSBwYWdlIHRhYmxlcyB0aGF0IHdlIGp1c3QgbWFwcGVkIGluLAorICAgICAqIHNpbmNlIERPUzRHVyBhbmQgUE1PREUvVyBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aXRob3V0CisgICAgICogY2FjaGluZyBlbmFibGVkIHdoaWNoIGh1cnRzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGluZWFyIGZyYW1lYnVmZmVyCisgICAgICogYXMgaXQgZGlzYWJsZXMgd3JpdGUgY29tYmluaW5nIG9uIFBlbnRpdW0gUHJvIGFuZCBhYm92ZSBwcm9jZXNzb3JzLgorICAgICAqCisgICAgICogRm9yIHRob3NlIHByb2Nlc3NvcnMgY2FjaGUgZGlzYWJsaW5nIGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggdGhlCisgICAgICogTVRSUiByZWdpc3RlcnMgYW55d2F5ICh3ZSBjYW4gd3JpdGUgY29tYmluZSBhIHJlZ2lvbiBidXQgZGlzYWJsZQorICAgICAqIGNhY2hpbmcpIHNvIHRoYXQgTU1JTyByZWdpc3RlciByZWdpb25zIGRvIG5vdCBzY3JldyB1cC4KKyAgICAgKi8KKyAgICBpZiAoaXNDYWNoZWQpIHsKKyAgICAgICAgaWYgKChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDAgJiYgRFNCYXNlQWRkciA9PSAwKSB7CisgICAgICAgICAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKKyAgICAgICAgICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlOworICAgICAgICAgICAgaWYgKCFwUERCKSB7CisgICAgICAgICAgICAgICAgaWYgKFBEQiA+PSAweDEwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwUERCID0gKHVsb25nKilQREI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQREIpIHsKKyAgICAgICAgICAgICAgICBzdGFydFBEQiA9IChsaW5BZGRyID4+IDIyKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgIHN0YXJ0UGFnZSA9IChsaW5BZGRyID4+IDEyKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgIGVuZFBEQiA9ICgobGluQWRkcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7CisgICAgICAgICAgICAgICAgZW5kUGFnZSA9ICgobGluQWRkcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7CisgICAgICAgICAgICAgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VUYWJsZSA+PSAweDEwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZVRhYmxlID0gKHVsb25nKilwYWdlVGFibGU7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZVRhYmxlW2lQYWdlXSAmPSB+MHgxODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyogTm93IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgaW50byB0aGUgZGVmYXVsdCBEUyAqLworICAgIHJldHVybiAodm9pZCopKGxpbkFkZHIgLSBEU0Jhc2VBZGRyKTsKK30KKworLyogU29tZSBET1MgZXh0ZW5kZXIgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGNhbGxpbmcgYQorICogcmVhbCBtb2RlIHByb2NlZHVyZSBmcm9tIHByb3RlY3RlZCBtb2RlLiBIb3dldmVyIHdlIGNhbiBzaW11bGF0ZSB3aGF0CisgKiB3ZSBuZWVkIHRlbXBvcmFyaWx5IGhvb2tpbmcgdGhlIElOVCA2QWggdmVjdG9yIHdpdGggYSBzbWFsbCByZWFsIG1vZGUKKyAqIHN0dWIgdGhhdCB3aWxsIGNhbGwgb3VyIHJlYWwgbW9kZSBjb2RlIGZvciB1cy4KKyAqLworCitzdGF0aWMgdWNoYXIgaW50NkFIYW5kbGVyW10gPSB7CisgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgIC8qICBfX1BNT0RFX2NhbGxSZWFsIHZhcmlhYmxlICAgICAgICAgICAqLworICAgIDB4RkIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9fUE1PREVfY2FsbFJlYWxdICAgICAgICovCisgICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH07CitzdGF0aWMgdWNoYXIgKmNyUHRyID0gTlVMTDsgLyogUG9pbnRlciB0byBvZiBpbnQgNkEgaGFuZGxlciAgICAgICAgICovCitzdGF0aWMgdWludCBjclJTZWcsY3JST2ZmOyAgLyogUmVhbCBtb2RlIHNlZzpvZmZzZXQgb2YgaGFuZGxlciAgICAgICovCisKK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAorICAgIFJNU1JFR1MgKnNyZWdzKQoreworICAgIHVjaGFyICAgKnA7CisgICAgdWludCAgICBvbGRTZWcsb2xkT2ZmOworCisgICAgaWYgKCFjclB0cikgeworICAgICAgICAvKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbWVtb3J5IGJsb2NrIG9ubHkgb25jZSAqLworICAgICAgICBjclB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoaW50NkFIYW5kbGVyKSwgJmNyUlNlZywgJmNyUk9mZik7CisgICAgICAgIG1lbWNweShjclB0cixpbnQ2QUhhbmRsZXIsc2l6ZW9mKGludDZBSGFuZGxlcikpOworICAgICAgICB9CisgICAgUE1fc2V0V29yZChjclB0cixvZmYpOyAgICAgICAgICAgICAgLyogUGx1ZyBpbiBhZGRyZXNzIHRvIGNhbGwgICovCisgICAgUE1fc2V0V29yZChjclB0cisyLHNlZyk7CisgICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKDAsMHg2QSAqIDQpOworICAgIG9sZE9mZiA9IFBNX2dldFdvcmQocCk7ICAgICAgICAgICAgIC8qIFNhdmUgb2xkIGhhbmRsZXIgYWRkcmVzcyAqLworICAgIG9sZFNlZyA9IFBNX2dldFdvcmQocCsyKTsKKyAgICBQTV9zZXRXb3JkKHAsY3JST2ZmKzQpOyAgICAgICAgICAgICAvKiBIb29rIDZBIGhhbmRsZXIgICAgICAgICAgKi8KKyAgICBQTV9zZXRXb3JkKHArMixjclJTZWcpOworICAgIFBNX2ludDg2eCgweDZBLCBpbiwgaW4sIHNyZWdzKTsgICAgIC8qIENhbGwgcmVhbCBtb2RlIGNvZGUgICAgICAqLworICAgIFBNX3NldFdvcmQocCxvbGRPZmYpOyAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb2xkIGhhbmRsZXIgICAgICAqLworICAgIFBNX3NldFdvcmQocCsyLG9sZFNlZyk7Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoreyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLDB4RkZGRix0cnVlKTsgfQorCit2b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCit7IHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7IH0KKwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoreyByZXR1cm4gRFBNSV9tYXBQaHlzaWNhbEFkZHIoYmFzZSxsaW1pdCxpc0NhY2hlZCk7IH0KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKKyAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlICovCit9CisKK3Vsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIKKyAgICAvLyAgICAgICBhZGRyZXNzLgorICAgICh2b2lkKXA7CisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoreworICAgICh2b2lkKWxpbWl0OworICAgIHJldHVybiAodm9pZCopYmFzZTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sKKyAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOworCisgICAgaWYgKCF6ZXJvUHRyKQorICAgICAgICB6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKKyAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOworfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKK3sKKyAgICBQTVJFR1MgICAgICByOworICAgIHZvaWQgICAgICAgICpwOworCisgICAgci54LmF4ID0gMHgxMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgICAgICAgICAqLworICAgIHIueC5ieCA9IChzaXplICsgMHhGKSA+PiA0OyAgICAgLyogbnVtYmVyIG9mIHBhcmFncmFwaHMgICAgICAgICAgICAgKi8KKyAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKKyAgICBpZiAoci54LmNmbGFnKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogRFBNSSBjYWxsIGZhaWxlZCAgICAgICAgICAgICAgICAgKi8KKyAgICAqcl9zZWcgPSByLnguYXg7ICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50ICAgICAgICAgICAgICAgICovCisgICAgKnJfb2ZmID0gMDsKKyAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7CisgICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxyLnguZHgpOworICAgIHJldHVybiBwOworfQorCit2b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKK3sKKyAgICBQTVJFR1MgIHI7CisKKyAgICByLnguYXggPSAweDEwMTsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGZyZWUgRE9TIG1lbW9yeSAgICAgICAgICovCisgICAgci54LmR4ID0gX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKG1lbSk7LyogRFggOj0gc2VsZWN0b3IgZnJvbSAweDEwMCAgICAqLworICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOworfQorCitzdGF0aWMgRFBNSV9oYW5kbGVyX3QgICBEUE1JX2ludDEwID0gTlVMTDsKKwordm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKQoreworICAgIERQTUlfaW50MTAgPSBoYW5kbGVyOworfQorCit2b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCit7CisgICAgUE1SRUdTICAgICAgcjsKKyAgICBQTVNSRUdTICAgICBzcjsKKworICAgIGlmIChpbnRubyA9PSAweDEwICYmIERQTUlfaW50MTApIHsKKyAgICAgICAgaWYgKERQTUlfaW50MTAocmVncykpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBQTV9zZWdyZWFkKCZzcik7CisgICAgci54LmF4ID0gMHgzMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCisgICAgci5oLmJsID0gaW50bm87CisgICAgci5oLmJoID0gMDsKKyAgICByLnguY3ggPSAwOworICAgIHNyLmVzID0gc3IuZHM7CisgICAgci5lLmVkaSA9ICh1aW50KXJlZ3M7CisgICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICAgICAgICAgICovCit9CisKKyNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZworI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZworCitpbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKK3sKKyAgICBEUE1JX3JlZ3MgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisKKy8vIFRoZXNlIHJlYWwgbW9kZSBpbnRzIG1heSBjYXVzZSBjcmFzaGVzLgorLy9BTTogICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KKworICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7CisgICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBEUE1JX3JlZ3MgICBybXJlZ3M7CisKKyAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOworICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7CisgICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOworICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKKworLy9BTTogICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KKworICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7CisgICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOworICAgIHNyZWdzLT5jcyA9IHJtcmVncy5jczsKKyAgICBzcmVncy0+c3MgPSBybXJlZ3Muc3M7CisgICAgc3JlZ3MtPmRzID0gcm1yZWdzLmRzOworICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKKyAgICByZXR1cm4gb3V0LT54LmF4OworfQorCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1aW50ICAgIExhcmdlc3RCbG9ja0F2YWlsOworICAgICAgICB1aW50ICAgIE1heFVubG9ja2VkUGFnZTsKKyAgICAgICAgdWludCAgICBMYXJnZXN0TG9ja2FibGVQYWdlOworICAgICAgICB1aW50ICAgIExpbkFkZHJTcGFjZTsKKyAgICAgICAgdWludCAgICBOdW1GcmVlUGFnZXNBdmFpbDsKKyAgICAgICAgdWludCAgICBOdW1QaHlzaWNhbFBhZ2VzRnJlZTsKKyAgICAgICAgdWludCAgICBUb3RhbFBoeXNpY2FsUGFnZXM7CisgICAgICAgIHVpbnQgICAgRnJlZUxpbkFkZHJTcGFjZTsKKyAgICAgICAgdWludCAgICBTaXplT2ZQYWdlRmlsZTsKKyAgICAgICAgdWludCAgICByZXNbM107CisgICAgICAgIH0gTWVtSW5mbzsKKworI3ByYWdtYSBwYWNrKCkKKwordm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKK3sKKyAgICBQTVJFR1MgIHI7CisgICAgUE1TUkVHUyBzcjsKKyAgICBNZW1JbmZvIG1lbUluZm87CisKKyAgICBQTV9zZWdyZWFkKCZzcik7CisgICAgci54LmF4ID0gMHg1MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBmcmVlIG1lbW9yeSBpbmZvICovCisgICAgc3IuZXMgPSBzci5kczsKKyAgICByLmUuZWRpID0gKHVpbnQpJm1lbUluZm87CisgICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICovCisgICAgKnBoeXNpY2FsID0gbWVtSW5mby5OdW1QaHlzaWNhbFBhZ2VzRnJlZSAqIDQwOTY7CisgICAgKnRvdGFsID0gbWVtSW5mby5MYXJnZXN0QmxvY2tBdmFpbDsKKyAgICBpZiAoKnRvdGFsIDwgKnBoeXNpY2FsKQorICAgICAgICAqcGh5c2ljYWwgPSAqdG90YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3Btc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG1zbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk2Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3Btc214LmMKQEAgLTAsMCArMSw0NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkb3MuaD4KKyNpbmNsdWRlICJzbXgvcHMybW91c2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCAgZ2xvYmFsRGF0YVN0YXJ0OworCitQTV9jcml0aWNhbEhhbmRsZXIgIF9WQVJBUEkgX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKK1BNX2JyZWFrSGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKK1BNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKK1BNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fcnRjSGFuZGxlciA9IE5VTEw7CitQTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2tleUhhbmRsZXIgPSBOVUxMOworUE1fa2V5MTVIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOworUE1fbW91c2VIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOworUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9pbnQxMEhhbmRsZXIgPSBOVUxMOworaW50ICAgICAgICAgICAgICAgICBfVkFSQVBJIF9QTV9tb3VzZU1hc2s7CisKK3VjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxDUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQyBmbGFnICAgICAgKi8KK3VjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxCUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQnJlYWsgZmxhZyAgKi8KK3VjaGFyICogICAgIF9WQVJBUEkgX1BNX2NyaXRQdHI7ICAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIENyaXRpY2FsIGVycm9yIEJmKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZUaW1lciA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIHRpbWVyIGhhbmRsZXIgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZSVEMgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIFJUQyBoYW5kbGVyICAgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIGtleSBoYW5kbGVyICAgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkxNSA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGtleTE1IGhhbmRsZXIgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZCcmVhayA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGJyZWFrIGhhbmRsZXIgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDdHJsQyA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIEN0cmxDIGhhbmRsZXIgICAgICAgKi8KK1BNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDcml0aWNhbCA9IFBNTlVMTDsgIC8qIFByZXZpb3VzIGNyaXRpY2FsIGhhbmRsZXIgICAgKi8KK2xvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsVGltZXI7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSB0aW1lciAgICAgKi8KK2xvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsUlRDOyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBSVEMgICAgICAgKi8KK2xvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5OyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkgICAgICAgKi8KK2xvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5MTU7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkxNSAgICAgKi8KK2xvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsSW50MTA7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBpbnQgMTBoICAgKi8KK3N0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQSBjb250ZW50cyAgICAgKi8KK3N0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQiBjb250ZW50cyAgICAgKi8KK3N0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZFJUQ1BJQzI7ICAgICAgICAgICAgIC8qIE1hc2sgdmFsdWUgZm9yIFJUQyBJUlE4ICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR2xvYmFscyBmb3IgbG9ja2luZyBpbnRlcnJ1cHQgaGFuZGxlcnMgaW4gX3Btc214LmFzbSAqLworCitleHRlcm4gaW50ICBfQVNNQVBJIF9QTV9wbXNteERhdGFTdGFydDsKK2V4dGVybiBpbnQgIF9BU01BUEkgX1BNX3Btc214RGF0YUVuZDsKK3ZvaWQgX0FTTUFQSSBfUE1fcG1zbXhDb2RlU3RhcnQodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX3Btc214Q29kZUVuZCh2b2lkKTsKKworLyogUHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IGhhbmRsZXJzLCBhbHNvIGNhbGxlZCBieSBQTSBjYWxsYmFja3MgYmVsb3cgKi8KKwordm9pZCBfQVNNQVBJIF9QTV90aW1lcklTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1fcnRjSVNSKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9rZXlJU1Iodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX2tleTE1SVNSKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9icmVha0lTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1fY3RybENJU1Iodm9pZCk7Cit2b2lkIF9BU01BUEkgX1BNX2NyaXRpY2FsSVNSKHZvaWQpOwordm9pZCBfQVNNQVBJIF9QTV9tb3VzZUlTUih2b2lkKTsKK3ZvaWQgX0FTTUFQSSBfUE1faW50MTBQTUNCKHZvaWQpOworCisvKiBQcm90ZWN0ZWQgbW9kZSBEUE1JIGNhbGxiYWNrIGhhbmRsZXJzICovCisKK3ZvaWQgX0FTTUFQSSBfUE1fbW91c2VQTUNCKHZvaWQpOworCisvKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBoYW5kbGVyIGZ1bmN0aW9uICovCisKK3ZvaWQgX0FTTUFQSSBfUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrKTsKKworLyogUm91dGluZSB0byBhbGxvY2F0ZSBEUE1JIHJlYWwgbW9kZSBjYWxsYmFjayByb3V0aW5lcyAqLworCit2b2lkIF9BU01BUEkgX0RQTUlfYWxsb2NhdGVDYWxsYmFjayh2b2lkIChfQVNNQVBJICpwbWNvZGUpKCksdm9pZCAqcm1yZWdzLGxvbmcgKlJNQ0IpOwordm9pZCBfQVNNQVBJIF9EUE1JX2ZyZWVDYWxsYmFjayhsb25nIFJNQ0IpOworCisvKiBEUE1JIGhlbHBlciBmdW5jdGlvbnMgaW4gUE1MSVRFLkMgKi8KKwordWxvbmcgICBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpOworaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpOwordWxvbmcgICBQTUFQSSBEUE1JX2dldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsKTsKK2ludCAgICAgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpOwordWludCAgICBQTUFQSSBEUE1JX2NyZWF0ZVNlbGVjdG9yKHVsb25nIGJhc2UsdWxvbmcgbGltaXQpOwordm9pZCAgICBQTUFQSSBEUE1JX2ZyZWVTZWxlY3Rvcih1aW50IHNlbCk7CitpbnQgICAgIFBNQVBJIERQTUlfbG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOworaW50ICAgICBQTUFQSSBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOworCisvKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KKwordWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogR2VuZXJpYyByb3V0aW5lcyBjb21tb24gdG8gYWxsIGVudmlyb25tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KQoreworICAgIHBzMk1vdXNlUmVzZXQoKTsKK30KKwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCit7CisgICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKKyAgICAgICAgODE5MiwKKyAgICAgICAgNDA5NiwKKyAgICAgICAgMjA0OCwKKyAgICAgICAgMTAyNCwKKyAgICAgICAgNTEyLAorICAgICAgICAyNTYsCisgICAgICAgIDEyOCwKKyAgICAgICAgNjQsCisgICAgICAgIDMyLAorICAgICAgICAxNiwKKyAgICAgICAgOCwKKyAgICAgICAgNCwKKyAgICAgICAgMiwKKyAgICAgICAgLTEsCisgICAgICAgIH07CisgICAgaW50IGk7CisKKyAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLworICAgIF9QTV9yZWFkQ01PUygweDBDKTsKKyAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQSwoX1BNX29sZENNT1NSZWdBICYgMHhGMCkgfCAoaSszKSk7CisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQiwoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBQTUFQSSBsb2NrUE1IYW5kbGVycyh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOworICAgIGludCAgICAgICAgICAgICBzdGF0ID0gMDsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7CisgICAgCisgICAgLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0CisgICAgICogaGFuZGxpbmcgcm91dGluZXMsIHNvIHRoYXQgaXQgd2lsbCBjb250aW51ZSB0byB3b3JrIGNvcnJlY3RseQorICAgICAqIHVuZGVyIHJlYWwgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICBQTV9zYXZlRFMoKTsKKyAgICAgICAgc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmZ2xvYmFsRGF0YVN0YXJ0LTIwNDgsNDA5NiwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfUE1fcG1zbXhEYXRhU3RhcnQsKGludCkmX1BNX3Btc214RGF0YUVuZCAtIChpbnQpJl9QTV9wbXNteERhdGFTdGFydCwmbGgpOworICAgICAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX3Btc214Q29kZVN0YXJ0LChpbnQpX1BNX3Btc214Q29kZUVuZC0oaW50KV9QTV9wbXNteENvZGVTdGFydCwmbGgpOworICAgICAgICBpZiAoc3RhdCkgeworICAgICAgICAgICAgcHJpbnRmKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlIVxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICBsb2NrZWQgPSAxOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKK3sKKyAgICBQTVJFR1MgIHJlZ3M7CisKKyAgICByZWdzLnguYXggPSAweDIwNDsKKyAgICByZWdzLmguYmwgPSBpbnRubzsKKyAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7CisgICAgaXNyLT5zZWwgPSByZWdzLnguY3g7CisgICAgaXNyLT5vZmYgPSByZWdzLmUuZWR4OworfQorCit2b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQoreworICAgIFBNU1JFR1Mgc3JlZ3M7CisgICAgUE1SRUdTICByZWdzOworCisgICAgUE1fc2F2ZURTKCk7CisgICAgcmVncy54LmF4ID0gMHgyMDU7ICAgICAgICAgIC8qIFNldCBwcm90ZWN0ZWQgbW9kZSB2ZWN0b3IgICAgICAgICovCisgICAgcmVncy5oLmJsID0gaW50bm87CisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJlZ3MueC5jeCA9IHNyZWdzLmNzOworICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7CisgICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCit7CisgICAgUE1SRUdTICByZWdzOworCisgICAgcmVncy54LmF4ID0gMHgyMDU7CisgICAgcmVncy5oLmJsID0gaW50bm87CisgICAgcmVncy54LmN4ID0gaXNyLnNlbDsKKyAgICByZWdzLmUuZWR4ID0gaXNyLm9mZjsKKyAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Cit9CisKK3N0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCitzdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLworc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KKworaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQoreworICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLworCisgICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOworICAgIHJldHVybiAwOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikKKyAgICAgICAgX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKK3sKKyAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKK3sKKyAgICBQTV9yZXN0b3JlUE12ZWN0KGludG5vLHBtaXNyKTsKK30KKworc3RhdGljIHZvaWQgc2V0SVNSKGludCBpbnRubywgdm9pZCAoKiBQTUFQSSBwbWlzcikoKSkKK3sKKyAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KKyAgICBQTV9zZXRQTXZlY3QoaW50bm8scG1pc3IpOworfQorCit2b2lkIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoKQoreworICAgIGdldElTUihQTV9JUlEwLCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKKyAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7CisgICAgc2V0SVNSKFBNX0lSUTAsIF9QTV90aW1lcklTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7CisgICAgICAgIHJlc3RvcmVJU1IoUE1fSVJRMCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOworICAgICAgICBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoLGludCBmcmVxdWVuY3kpCit7CisgICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLworICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKKyAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7CisKKyAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLworICAgIGdldElTUigweDcwLCAmX1BNX3ByZXZSVEMsICZfUE1fcHJldlJlYWxSVEMpOworICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7CisgICAgc2V0SVNSKDB4NzAsIF9QTV9ydGNJU1IpOworCisgICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCisgICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOworCisgICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KKyAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7CisgICAgUE1fb3V0cGIoMHhBMSxfUE1fb2xkUlRDUElDMiAmIDB4RkUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChfUE1fcnRjSGFuZGxlcikgeworICAgICAgICAvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7CisgICAgICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7CisKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICByZXN0b3JlSVNSKDB4NzAsIF9QTV9wcmV2UlRDLCBfUE1fcHJldlJlYWxSVEMpOworICAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKwordm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCit7CisgICAgZ2V0SVNSKFBNX0lSUTEsICZfUE1fcHJldktleSwgJl9QTV9wcmV2UmVhbEtleSk7CisgICAgX1BNX2tleUhhbmRsZXIgPSBraDsKKyAgICBzZXRJU1IoUE1fSVJRMSwgX1BNX2tleUlTUik7Cit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKKyAgICAgICAgcmVzdG9yZUlTUihQTV9JUlExLCBfUE1fcHJldktleSwgX1BNX3ByZXZSZWFsS2V5KTsKKyAgICAgICAgX1BNX2tleUhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKK3sKKyAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7CisgICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOworICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKK3sKKyAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgeworICAgICAgICByZXN0b3JlSVNSKDB4MTUsIF9QTV9wcmV2S2V5MTUsIF9QTV9wcmV2UmVhbEtleTE1KTsKKyAgICAgICAgX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7CisgICAgICAgIH0KK30KKworLyogUmVhbCBtb2RlIEN0cmwtQyBhbmQgQ3RybC1CcmVhayBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgc2ltcGx5IHNldHMgYQorICogZmxhZyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBhbmQgZXhpdC4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KKyAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAorICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KKyAqLworCitzdGF0aWMgdWNoYXIgY3RybEhhbmRsZXJbXSA9IHsKKyAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBjdHJsQkZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMHg2NiwweDJFLDB4QzcsMHgwNiwweDAwLDB4MDAsCisgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6Y3RybEJGbGFnXSwxICAgICAgICAqLworICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9OworCit2b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQoreworICAgIHVpbnQgICAgcnNlZyxyb2ZmOworCisgICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7CisgICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7CisgICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOworICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOworICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOworCisgICAgLyogSG9vayB0aGUgcmVhbCBtb2RlIHZlY3RvcnMgZm9yIHRoZXNlIGhhbmRsZXJzLCBhcyB0aGVzZSBhcmUgbm90CisgICAgICogbm9ybWFsbHkgcmVmbGVjdGVkIGJ5IHRoZSBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZQorICAgICAqLworICAgIF9QTV9jdHJsQlB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3RybEhhbmRsZXIpKjIsICZyc2VnLCAmcm9mZik7CisgICAgbWVtY3B5KF9QTV9jdHJsQlB0cixjdHJsSGFuZGxlcixzaXplb2YoY3RybEhhbmRsZXIpKTsKKyAgICBtZW1jcHkoX1BNX2N0cmxCUHRyK3NpemVvZihjdHJsSGFuZGxlciksY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7CisgICAgX1BNX2N0cmxDUHRyID0gX1BNX2N0cmxCUHRyICsgc2l6ZW9mKGN0cmxIYW5kbGVyKTsKKyAgICBfUE1fc2V0Uk12ZWN0KDB4MUIsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrNCkpOworICAgIF9QTV9zZXRSTXZlY3QoMHgyMywoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZitzaXplb2YoY3RybEhhbmRsZXIpKzQpKTsKK30KKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCit7CisgICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7CisgICAgICAgIHJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7CisgICAgICAgIHJlc3RvcmVJU1IoMHgyMywgX1BNX3ByZXZDdHJsQywgcHJldlJlYWxDdHJsQyk7CisgICAgICAgIF9QTV9wcmV2QnJlYWsuc2VsID0gMDsKKyAgICAgICAgX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7CisgICAgICAgIFBNX2ZyZWVSZWFsU2VnKF9QTV9jdHJsQlB0cik7CisgICAgICAgIH0KK30KKworLyogUmVhbCBtb2RlIENyaXRpY2FsIEVycm9yIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2F2ZXMgdGhlIEFYIGFuZAorICogREkgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0cy4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KKyAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAorICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KKyAqLworCitzdGF0aWMgdWNoYXIgY3JpdGljYWxIYW5kbGVyW10gPSB7CisgICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgYXhDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGRpQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweDJFLDB4QTMsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBtb3YgICAgIFtjczpheENvZGVdLGF4ICAgICAgICAgICovCisgICAgMHgyRSwweDg5LDB4M0UsMHgwMiwweDAwLCAgICAgICAvKiAgbW92ICAgICBbY3M6ZGlDb2RlXSxkaSAgICAgICAgICAqLworICAgIDB4QjgsMHgwMywweDAwLCAgICAgICAgICAgICAgICAgLyogIG1vdiAgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAweENGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgfTsKKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKK3sKKyAgICB1aW50ICAgIHJzZWcscm9mZjsKKworICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOworICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOworICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOworCisgICAgLyogSG9vayB0aGUgcmVhbCBtb2RlIHZlY3RvciwgYXMgdGhpcyBpcyBub3Qgbm9ybWFsbHkgcmVmbGVjdGVkIGJ5IHRoZQorICAgICAqIERQTUkgc2VydmVyIHVwIHRvIHByb3RlY3RlZCBtb2RlLgorICAgICAqLworICAgIF9QTV9jcml0UHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihjcml0aWNhbEhhbmRsZXIpKjIsICZyc2VnLCAmcm9mZik7CisgICAgbWVtY3B5KF9QTV9jcml0UHRyLGNyaXRpY2FsSGFuZGxlcixzaXplb2YoY3JpdGljYWxIYW5kbGVyKSk7CisgICAgX1BNX3NldFJNdmVjdCgweDI0LCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKK30KKwordm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCit7CisgICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKK30KKwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCit7CisgICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7CisgICAgICAgIHJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7CisgICAgICAgIFBNX2ZyZWVSZWFsU2VnKF9QTV9jcml0UHRyKTsKKyAgICAgICAgX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOworICAgICAgICBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOworICAgICAgICB9Cit9CisKK2ludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisgICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKK30KKworaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIFBNU1JFR1Mgc3JlZ3M7CisgICAgUE1fc2VncmVhZCgmc3JlZ3MpOworICAgIHJldHVybiBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKK30KKworaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgUE1TUkVHUyBzcmVnczsKKyAgICBQTV9zZWdyZWFkKCZzcmVncyk7CisvL0FNOiBjYXVzZXMgbWlub3IgZ2xpdGNoIHdpdGgKKy8vQU06IG9sZGVyIHZlcnNpb25zIHBtRWFzeSB3aGljaCBkb24ndCBhbGxvdyBEUE1JIDA2IG9uCisvL0FNOiBDb2RlIHNlbGVjdG9yIDB4MEMgLS0gYXNzdW1lIGJhc2UgaXMgMCB3aGljaCBpdCBzaG91bGQgYmUuCisgICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAsbGVuKTsKK30KKworaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBQTVNSRUdTIHNyZWdzOworICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKKyAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwLGxlbik7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC92ZmxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWVmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvdmZsYXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKK3sKKyAgICBiYXNlQWRkciA9IGJhc2VBZGRyOworICAgIGJhbmtTaXplID0gYmFua1NpemU7CisgICAgY29kZUxlbiA9IGNvZGVMZW47CisgICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMTgwYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC96dGltZXIuYwpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50CisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgorKiAgICAgTFpUaW1lciBub3Qgc3VwcG9ydGVkIGZvciBzbXggKGFzIG5lZWRlZCBmb3IgaTQ4NiBwcm9jZXNzb3JzKSwgb25seQorKiAgICAgVUxaVGltZXIgaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgc214IHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiB1bG9uZyAgICAgIF9jZGVjbCBldGltZTsgICAgIC8qIGVsYXBzZWQgdGltZSAqLworZXh0ZXJuIHVsb25nICAgICAgX2NkZWNsIHh0aWNrc19wZXJfc2Vjb25kKHZvaWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCisKK3ZvaWQgICAgX0FTTUFQSSBMWl9kaXNhYmxlKHZvaWQpOwordm9pZCAgICBfQVNNQVBJIExaX2VuYWJsZSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX19aVGltZXJJbml0KHZvaWQpCit7Cit9CisKK3Vsb25nIHJldGVycih2b2lkKQoreworICAgUE1fZmF0YWxFcnJvcigiWmVuIFRpbWVyIG5vdCBzdXBwb3J0ZWQgZm9yIHNteC4iKTsKKyAgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBQTV9mYXRhbEVycm9yKCJaZW4gVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214LiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgcmV0ZXJyKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBQTV9mYXRhbEVycm9yKCJaZW4gVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214LiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9fTFpUaW1lckNvdW50KHRtKSAgcmV0ZXJyKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIHNlY29uZHMgcGVyIHRpbWVyIHRpY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAodWxvbmcpKDEwMDAwMDAveHRpY2tzX3Blcl9zZWNvbmQoKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBzbXggdGltZXIgdGljay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQoreworICAgIHVsb25nICAgdGlja3M7CisgICAgTFpfZGlzYWJsZSgpOyAgICAgICAgICAgIC8qIFR1cm4gb2YgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCisgICAgdGlja3MgPSBldGltZTsKKyAgICBMWl9lbmFibGUoKTsgICAgICAgICAgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzIGFnYWluICAgICAgICAgKi8KKyAgICByZXR1cm4gdGlja3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQord2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCithY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCitwYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKK3sKKyAgICBpZiAoZmluaXNoIDwgc3RhcnQpCisgICAgICAgIGZpbmlzaCArPSB4dGlja3NfcGVyX3NlY29uZCgpICogMzYwMCAqMjQ7ICAgICAgIC8qIE51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycyAgICAgICovCisgICAgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2NwdWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODMzYTcyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9jcHVpbmZvLmMKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIHRvIG1lYXN1cmUgdGhlCisqICAgICAgICAgICAgICAgQ1BVIGZyZXF1ZW5jeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCit7CisgICAgLy8gVE9ETzogSWYgeW91IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMsIGluY3JlYXNlIGl0IHRvIG1heGltdW0gZm9yIHRoZQorICAgIC8vICAgICAgIHRocmVhZCBmb3IgdGltaW5nIHRoZSBDUFUgZnJlcXVlbmN5LgorICAgIHJldHVybiBvbGRQcmlvcml0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAorICAgIGludCBwcmlvcml0eSkKK3sKKyAgICAvLyBUT0RPOiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkgb24gZXhpdC4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAorICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCit7CisgICAgLy8gVE9ETzogUmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIgaW4gaGVyZS4gWW91IHNob3VsZCB0cnkgdG8KKyAgICAvLyAgICAgICBub3JtYWxpc2UgdGhpcyB2YWx1ZSB0byBiZSBhcm91bmQgMTAwLDAwMCB0aWNrcyBwZXIgc2Vjb25kLgorICAgIGZyZXEtPmxvdyA9IDA7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorCitUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byByZWFkIHRoZSBjb3VudGVyLiBJdCBzaG91bGQgYmUgZG9uZSBhcyBhIG1hY3JvCisgICAgICBmb3IgYWNjdXJhY3kuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+bG93ID0gMDsgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgXAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODA1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2V2ZW50LmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCisqCisqIERlc2NyaXB0aW9uOiAgKioqKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KKyogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBub24tRE9TIHN5c3RlbXMgKi8KKyNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQorI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAorCitSRU1BUktTOgorVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCitzdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwordGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgorZXZlbnRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgeW91ciBPUyEKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lc3NhZ2UgcXVldWUgaW50byBvdXIgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKK3sKKyAgICAvLyBUT0RPOiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlYWQgYWxsIGtleWJvYXJkIGFuZCBtb3VzZQorICAgIC8vICAgICAgIGV2ZW50cyBmcm9tIHRoZSBPUyBzcGVjaWZpYyBldmVudCBxdWV1ZSwgdHJhbnNsYXRlIHRoZW0gYW5kIHBvc3QKKyAgICAvLyAgICAgICB0aGVtIGludG8gdGhlIFNjaVRlY2ggZXZlbnQgcXVldWUuCisgICAgLy8KKyAgICAvLyBOT1RFOiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgaW1wb3J0YW50IHRoaW5ncyB0aGF0IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIC8vICAgICAgIHRha2UgY2FyZSBvZjoKKyAgICAvLworICAgIC8vICAxLiBTdXBwb3J0IGZvciBLRVlET1dOLCBLRVlSRVBFQVQgYW5kIEtFWVVQIGlzIHJlcXVpcmVkLgorICAgIC8vCisgICAgLy8gIDIuIFN1cHBvcnQgZm9yIHJlYWRpbmcgaGFyZHdhcmUgc2NhbiBjb2RlIGFzIHdlbGwgYXMgQVNDSUkKKyAgICAvLyAgICAgdHJhbnNsYXRlZCB2YWx1ZXMgaXMgcmVxdWlyZWQuIEdhbWVzIHVzZSB0aGUgc2NhbiBjb2RlcyByYXRoZXIKKyAgICAvLyAgICAgdGhhbiBBU0NJSSB2YWx1ZXMuIFNjYW4gY29kZXMgZ28gaW50byB0aGUgaGlnaCBvcmRlciBieXRlIG9mIHRoZQorICAgIC8vICAgICBrZXlib2FyZCBtZXNzYWdlIGZpZWxkLgorICAgIC8vCisgICAgLy8gIDMuIFN1cHBvcnQgZm9yIGF0IGxlYXN0IHJlYWRpbmcgbW91c2UgbW90aW9uIGRhdGEgKG1pY2tleXMpIGZyb20gdGhlCisgICAgLy8gICAgIG1vdXNlIGlzIHJlcXVpcmVkLiBVc2luZyB0aGUgbWlja2V5IHZhbHVlcywgd2UgY2FuIHRoZW4gdHJhbnNsYXRlCisgICAgLy8gICAgIHRvIG1vdXNlIGN1cnNvciBjb29yZGluYXRlcyBzY2FsZWQgdG8gdGhlIHJhbmdlIG9mIHRoZSBjdXJyZW50CisgICAgLy8gICAgIGdyYXBoaWNzIGRpc3BsYXkgbW9kZS4gTW91c2UgdmFsdWVzIGFyZSBzY2FsZWQgYmFzZWQgb24gdGhlCisgICAgLy8gICAgIGdsb2JhbCAncmFuZ2VYJyBhbmQgJ3JhbmdlWScuCisgICAgLy8KKyAgICAvLyAgNC4gU3VwcG9ydCBmb3IgYSB0aW1lc3RhbXAgZm9yIHRoZSBldmVudHMgaXMgcmVxdWlyZWQsIHdoaWNoIGlzCisgICAgLy8gICAgIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2Ugc29tZSBldmVudCAodXN1YWxseQorICAgIC8vICAgICBzeXN0ZW0gc3RhcnR1cCkuIFRoaXMgaXMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBldmVudCBvY2N1cnJlZAorICAgIC8vICAgICAoaWU6IGF0IGludGVycnVwdCB0aW1lKSBub3Qgd2hlbiBpdCB3YXMgc3R1ZmYgaW50byB0aGUgU2NpVGVjaAorICAgIC8vICAgICBldmVudCBxdWV1ZS4KKyAgICAvLworICAgIC8vICA1LiBTdXBwb3J0IGZvciBtb3VzZSBkb3VibGUgY2xpY2sgZXZlbnRzLiBJZiB0aGUgT1MgaGFzIGEgbmF0aXZlCisgICAgLy8gICAgIG1lY2hhbmlzbSB0byBkZXRlcm1pbmUgdGhpcywgaXQgc2hvdWxkIGJlIHVzZWQuIE90aGVyd2lzZSB0aGUKKyAgICAvLyAgICAgdGltZSBzdGFtcCBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlIGdlbmVyaWMgZXZlbnQgY29kZQorICAgIC8vICAgICB0byBnZW5lcmF0ZSBkb3VibGUgY2xpY2sgZXZlbnRzLgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKK2tleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgorY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCitDdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKK2J1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCit0byB0aGUgcmF3IGZvcm1hdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfYWJvcnQoKQoreworICAgIEVWVF9leGl0KCk7CisgICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKKworUkVNQVJLUzoKK0luaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKK3RvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKK3RoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KKworV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgorZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2luaXQoCisgICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKK3sKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLworICAgIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7CisgICAgaW5pdEV2ZW50UXVldWUoKTsKKyAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKKworICAgIC8vIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbiBoZXJlCisKKyAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCisgICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKK3NwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKK21vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzKQoreworICAgIHJhbmdlWCA9IHhSZXM7CisgICAgcmFuZ2VZID0geVJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgorY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCithbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfcmVzdW1lKHZvaWQpCit7CisgICAgLy8gRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitTdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCitkZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3N1c3BlbmQodm9pZCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK0V4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9leGl0KHZvaWQpCit7CisgICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisKKyAgICAvLyBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgY2xlYW51cCBpbiBoZXJlCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhMjBhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvb3NoZHIuaApAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBCZU9TCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFRPRE86IFRoaXMgaXMgd2hlcmUgeW91IGluY2x1ZGUgT1Mgc3BlY2lmaWMgaGVhZGVycyBmb3IgdGhlIGV2ZW50IGhhbmRsaW5nCisvLyAgICAgICBsaWJyYXJ5LiBZb3UgbWF5IGxlYXZlIHRoaXMgZW1wdHkgaWYgeW91IGhhdmUgbm8gT1Mgc3BlY2lmaWMgaGVhZGVycworLy8gICAgICAgdG8gaW5jbHVkZS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY1NmIwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9wbS5jCkBAIC0wLDAgKzEsOTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gVE9ETzogSW5jbHVkZSBhbnkgT1Mgc3BlY2lmaWMgaGVhZGVycyBoZXJlIQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyBUT0RPOiBJZiB5b3Ugc3VwcG9ydCBhY2Nlc3MgdG8gdGhlIEJJT1MsIHRoZSBmb2xsb3dpbmcgVkVTQUJ1ZiBnbG9iYWxzCisvLyAgICAgICBrZWVwIHRyYWNrIG9mIGEgc2luZ2xlIFZFU0EgdHJhbnNmZXIgYnVmZmVyLiBJZiB5b3UgZG9uJ3Qgc3VwcG9ydAorLy8gICAgICAgYWNjZXNzIHRvIHRoZSBCSU9TLCByZW1vdmUgdGhlc2UgdmFyaWFibGVzLgorCitzdGF0aWMgdWludCBWRVNBQnVmX2xlbiA9IDEwMjQ7ICAgICAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLworc3RhdGljIHZvaWQgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KK3N0YXRpYyB1aW50IFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCitzdGF0aWMgdWludCBWRVNBQnVmX3JvZmY7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLworCitzdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBEbyBhbnkgaW5pdGlhbGlzYXRpb24gaW4gaGVyZS4gVGhpcyBpbmNsdWRlcyBnZXR0aW5nIElPUEwKKyAgICAvLyAgICAgICBhY2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNhbGxpbmcgUE1faW5pdC4gVGhpcyB3aWxsIGdldCBjYWxsZWQKKyAgICAvLyAgICAgICBtb3JlIHRoYW4gb25jZS4KKworICAgIC8vIFRPRE86IElmIHlvdSBzdXBwb3J0IHRoZSBzdXBwbGllZCBNVFJSIHJlZ2lzdGVyIHN0dWZmICh5b3UgbmVlZCB0bworICAgIC8vICAgICAgIGJlIGF0IHJpbmcgMCBmb3IgdGhpcyEpLCB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgaXQgaW4gaGVyZS4KKworLyogTVRSUl9pbml0KCk7ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoreworICAgIC8vIFRPRE86IENoYW5nZSB0aGlzIHRvIHJldHVybiB0aGUgZGVmaW5lIGZvciB5b3VyIE9TIGZyb20gZHJ2bGliL29zLmgKKyAgICByZXR1cm4gX09TX01ZT1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBydW50aW1lIHR5cGUgaWRlbnRpZmllciAoYWx3YXlzIFBNXzM4NiBmb3IgcHJvdGVjdGVkIG1vZGUpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCit7IHJldHVybiBQTV8zODY7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCisgICAgY2hhciAqcykKK3sKKyAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKKyAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7CisgICAgICAgIHNbcG9zXSA9ICcvJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAorICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKK3sKKyAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKKyAgICBjb25zdCBjaGFyICptc2cpCit7CisgICAgLy8gVE9ETzogSWYgeW91IGFyZSBydW5uaW5nIGluIGEgR1VJIGVudmlyb25tZW50IHdpdGhvdXQgYSBjb25zb2xlLAorICAgIC8vICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBicmluZyB1cCBhIGZhdGFsIGVycm9yIG1lc3NhZ2UKKyAgICAvLyAgICAgICBib3ggYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4KKyAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7CisgICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRXhpdCBoYW5kbGVyIHRvIGtpbGwgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBJZiB5b3UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MsIHJlbW92ZSB0aGlzIGZ1bmN0aW9uLgorICAgIGlmIChWRVNBQnVmX3B0cikKKyAgICAgICAgUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOworICAgIFZFU0FCdWZfcHRyID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCisgICAgdWludCAqbGVuLAorICAgIHVpbnQgKnJzZWcsCisgICAgdWludCAqcm9mZikKK3sKKyAgICAvLyBUT0RPOiBJZiB5b3UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MsIHNpbXBseSBkZWxldGUgdGhlIGd1dHMgb2YKKyAgICAvLyAgICAgICB0aGlzIGZ1bmN0aW9uIGFuZCByZXR1cm4gTlVMTC4KKyAgICBpZiAoIVZFU0FCdWZfcHRyKSB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLworICAgICAgICBpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhdGV4aXQoRXhpdFZCRUJ1Zik7CisgICAgICAgIH0KKyAgICAqbGVuID0gVkVTQUJ1Zl9sZW47CisgICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7CisgICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7CisgICAgcmV0dXJuIFZFU0FCdWZfcHRyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NoZWNrIGlmIGEga2V5IGhhcyBiZWVuIHByZXNzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBrZXkgaXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuIFRoaXMKKyAgICAvLyAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcworICAgIC8vICAgICAgIHRoZXNlIGRheXMuCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIHJldHVybnMgdGhlIEFTQ0lJIGNvZGUgb2YgdGhlIGtleSBwcmVzc2VkLiBUaGlzCisgICAgLy8gICAgICAgc2hvdWxkIGJlIGltcGxlbWVudGVkLCBidXQgaXMgbW9zdGx5IHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMKKyAgICAvLyAgICAgICB0aGVzZSBkYXlzLgorICAgIHJldHVybiAweEQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT3BlbiBhIGZ1bGxzY3JlZW4gY29uc29sZSBtb2RlIGZvciBvdXRwdXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX29wZW5Db25zb2xlKHZvaWQpCit7CisgICAgLy8gVE9ETzogT3BlbnMgdXAgYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIGdyYXBoaWNzIG91dHB1dC4gSWYgeW91cgorICAgIC8vICAgICAgIGNvbnNvbGUgZG9lcyBub3QgaGF2ZSBncmFwaGljcy90ZXh0IG1vZGVzLCB0aGlzIGNhbiBiZSBsZWZ0CisgICAgLy8gICAgICAgZW1wdHkuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBkaXNhYmxlIGNvbnNvbGUgc3dpdGNoaW5nCisgICAgLy8gICAgICAgd2hlbiBpbiBncmFwaGljcyBtb2RlcyBpZiB5b3UgY2FuIHN3aXRjaCBhd2F5IGZyb20gZnVsbHNjcmVlbgorICAgIC8vICAgICAgIGNvbnNvbGVzIChpZiB5b3Ugd2FudCB0byBhbGxvdyBzd2l0Y2hpbmcsIHRoaXMgY2FuIGJlIGRvbmUKKyAgICAvLyAgICAgICBlbHNld2hlcmUgd2l0aCBhIGZ1bGwgc2F2ZS9yZXN0b3JlIHN0YXRlIG9mIHRoZSBncmFwaGljcyBtb2RlKS4KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlIGNvbnNvbGUgc3RhdGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlCisgICAgLy8gICAgICAgc3RhdGUgb2YgdGhlIGNvbnNvbGUgYmVmb3JlIGdvaW5nIGludG8gZ3JhcGhpY3MgbW9kZS4gVGhpcyBpcworICAgIC8vICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLgorICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCisgICAgdm9pZCAqc3RhdGVCdWYsCisgICAgaW50IGNvbnNvbGVfaWQpCit7CisgICAgLy8gVE9ETzogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcworICAgIC8vICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLgorICAgIC8vICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzCisgICAgLy8gICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4KKyAgICAvLyAgICAgICBiZSBsZWZ0IGVtcHR5LgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Jlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGZyb20gdGhlIHN0YXRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCisgICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCisgICAgaW50IGNvbnNvbGVfaWQpCit7CisgICAgLy8gVE9ETzogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgZnJvbSB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzCisgICAgLy8gICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuCisgICAgLy8gICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MKKyAgICAvLyAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbgorICAgIC8vICAgICAgIGJlIGxlZnQgZW1wdHkuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2xvc2UgdGhlIGNvbnNvbGUgYW5kIHJldHVybiB0byBub24tZnVsbHNjcmVlbiBjb25zb2xlIG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCisgICAgaW50IGNvbnNvbGVfaWQpCit7CisgICAgLy8gVE9ETzogQ2xvc2UgdGhlIGNvbnNvbGUgd2hlbiB3ZSBhcmUgZG9uZSwgZ29pbmcgYmFjayB0byB0ZXh0IG1vZGUuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAorICAgIGludCB4LAorICAgIGludCB5KQoreworICAgIC8vIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBjdXJzb3IgbG9jYXRpb24gdG8gdGhlIG5ldyB2YWx1ZS4gVGhpcyBpcworICAgIC8vICAgICAgIGdlbmVyYWxseSB1c2VkIGZvciBuZXcgT1MgcG9ydHMgKHVzZWQgbW9zdGx5IGZvciBET1MpLgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0KQoreworICAgIC8vIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBzY3JlZW4gd2lkdGguIFRoaXMgaXMgZ2VuZXJhbGx5IHVudXNlZCBmb3IKKyAgICAvLyAgICAgICBuZXcgT1MgcG9ydHMuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKKyAgICBQTV9pbnRIYW5kbGVyIGloLAorICAgIGludCBmcmVxdWVuY3kpCit7CisgICAgLy8gVE9ETzogSW5zdGFsbCBhIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4gTm9ybWFsbHkgdGhpcworICAgIC8vICAgICAgIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBmcm9tIG1vc3QgT1MnZXMgaW4gdXNlciBsYW5kLCBzbyBhbgorICAgIC8vICAgICAgIGFsdGVybmF0aXZlIG1lY2hhbmlzbSBpcyBuZWVkZWQgdG8gZW5hYmxlIHNvZnR3YXJlIHN0ZXJlby4KKyAgICAvLyAgICAgICBIZW5jZSBsZWF2ZSB0aGlzIHVuaW1wbGVtZW50ZWQgdW5sZXNzIHlvdSBoYXZlIGEgaGlnaCBwcmlvcml0eQorICAgIC8vICAgICAgIG1lY2hhbmlzbSB0byBjYWxsIHRoZSAzMi1iaXQgY2FsbGJhY2sgd2hlbiB0aGUgcmVhbCB0aW1lIGNsb2NrCisgICAgLy8gICAgICAgaW50ZXJydXB0IGZpcmVzLgorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKKyAgICBpbnQgZnJlcXVlbmN5KQoreworICAgIC8vIFRPRE86IFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBmcmVxdWVuY3kuIFVzZWQgZm9yIHN0ZXJlbworICAgIC8vICAgICAgIExDIHNodXR0ZXIgZ2xhc3NlcyB3aGVuIGRvaW5nIHNvZnR3YXJlIHN0ZXJlby4gVXN1YWxseSBzZXRzCisgICAgLy8gICAgICAgdGhlIGZyZXF1ZW5jeSB0byBhcm91bmQgMjA0OCBIei4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIC8vIFRPRE86IFJlc3RvcmVzIHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKKyAgICBjaGFyICpwYXRoLAorICAgIGludCBtYXhMZW4pCit7CisgICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBib290IGRyaXZlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCit7CisgICAgLy8gVE9ETzogUmV0dXJuIHRoZSBib290IGRyaXZlIGxldHRlciBmb3IgdGhlIE9TLiBOb3JtYWxseSB0aGlzIGlzICdjJworICAgIC8vICAgICAgIGZvciBET1MgYmFzZWQgT1MnZXMgYW5kICcvJyBmb3IgVW5pY2VzLgorICAgIHJldHVybiAnLyc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzIChsZWdhY3kgYW5kIG5vdCB1c2VkKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCit7CisgICAgcmV0dXJuIFBNX2dldE51Y2xldXNDb25maWdQYXRoKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBDaGFuZ2UgdGhpcyB0byB0aGUgZGVmYXVsdCBwYXRoIHRvIE51Y2xldXMgZHJpdmVyIGZpbGVzLiBUaGUKKyAgICAvLyAgICAgICBmb2xsb3dpbmcgaXMgdGhlIGRlZmF1bHQgZm9yIFVuaWNlcy4KKyAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOworICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOworICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOworICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoreworICAgIC8vIFRPRE86IFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhlIG1hY2hpbmUuIElmIGEgdW5pcXVlIElEIGlzIG5vdAorICAgIC8vICAgICAgIGF2YWlsYWJsZSwgcmV0dXJuIHRoZSBtYWNoaW5lIG5hbWUuCisgICAgc3RhdGljIGNoYXIgYnVmWzEyOF07CisgICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOworICAgIHJldHVybiBidWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoreworICAgIC8vIFRPRE86IFJldHVybiB0aGUgbmV0d29yayBtYWNoaW5lIG5hbWUgZm9yIHRoZSBtYWNoaW5lLgorICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKKyAgICByZXR1cm4gYnVmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuIElmIHlvdQorICAgIC8vICAgICAgIGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB5b3UgY2FuIHNpbXBseSByZXR1cm4gTlVMTCBoZXJlLgorICAgIGlmICghemVyb1B0cikKKyAgICAgICAgemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYsdHJ1ZSk7CisgICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIDB4NDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKK3sKKyAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKKyAgICBpZiAoIWJhbmtQdHIpCisgICAgICAgIGJhbmtQdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7CisgICAgcmV0dXJuIGJhbmtQdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxpbWl0LAorICAgIGlib29sIGlzQ2FjaGVkKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gbWFwcyBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIGEgbGluZWFyCisgICAgLy8gICAgICAgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorCisgICAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgYWJsZSB0byBoYW5kbGUgYW55IHBoc3lpY2FsIGJhc2UKKyAgICAvLyAgICAgICBhZGRyZXNzLCBhbmQgaGVuY2UgeW91IHdpbGwgaGF2ZSB0byBoYW5kbGUgcm91bmRpbmcgb2YKKyAgICAvLyAgICAgICB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIHRvIGEgcGFnZSBib3VuZGFyeSAoaWU6IDRLYiBvbgorICAgIC8vICAgICAgIHg4NiBDUFUncykgdG8gYmUgYWJsZSB0byBwcm9wZXJseSBtYXAgaW4gdGhlIG1lbW9yeQorICAgIC8vICAgICAgIHJlZ2lvbi4KKworICAgIC8vIE5PVEU6IElmIHBvc3NpYmxlIHRoZSBpc0NhY2hlZCBiaXQgc2hvdWxkIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQKKyAgICAvLyAgICAgICB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGFuZCBQV1QgKFBhZ2UgV3JpdGUgVGhyb3VnaCkKKyAgICAvLyAgICAgICBiaXRzIGFyZSBzZXQgdG8gZGlzYWJsZSBjYWNoaW5nIGZvciBhIG1lbW9yeSBtYXBwaW5nIHVzZWQKKyAgICAvLyAgICAgICBmb3IgTU1JTyByZWdpc3RlciBhY2Nlc3MuIFdlIGFsc28gZGlzYWJsZSBjYWNoaW5nIHVzaW5nCisgICAgLy8gICAgICAgdGhlIE1UUlIgcmVnaXN0ZXJzIGZvciBQZW50aXVtIFBybyBhbmQgbGF0ZXIgY2hpcHNldHMgc28gaWYKKyAgICAvLyAgICAgICBNVFJSIHN1cHBvcnQgaXMgZW5hYmxlZCBmb3IgeW91ciBPUyB0aGVuIHlvdSBjYW4gc2FmZWx5IGlnbm9yZQorICAgIC8vICAgICAgIHRoZSBpc0NhY2hlZCBmbGFnIGFuZCBhbHdheXMgZW5hYmxlIGNhY2hpbmcgaW4gdGhlIHBhZ2UKKyAgICAvLyAgICAgICB0YWJsZXMuCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKKyAgICB2b2lkICpwdHIsCisgICAgdWxvbmcgbGltaXQpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyBwcmV2aW91c2x5CisgICAgLy8gICAgICAgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyKCkgaWYgYXQgYWxsIHBvc3NpYmxlLiBJZgorICAgIC8vICAgICAgIHlvdSBjYW4ndCBmcmVlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5ncywgc2ltcGx5IGRvIG5vdGhpbmcuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhcgorICAgIC8vICAgICAgIGFkZHJlc3MuCisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKwordm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCit7CisgICAgLy8gVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMKK30KKworaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzRjg7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4MkY4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIC8vIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkKKyAgICAvLyAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuCisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0JDOworICAgICAgICBjYXNlIDE6IHJldHVybiAweDM3ODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgyNzg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mICh1bm5hbWVkKSBzaGFyZWQgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCisgICAgbG9uZyBzaXplKQoreworICAgIC8vIFRPRE86IFRoaXMgaXMgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzCisgICAgLy8gICAgICAgdGhhdCBhbGwgYWNjZXNzIHRoZSBjb21tb24gTnVjbGV1cyBkcml2ZXJzIHZpYSBhIGNvbW1vbiBkaXNwbGF5CisgICAgLy8gICAgICAgZHJpdmVyIERMTC4gSWYgeW91ciBPUyBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBtZW1vcnkgKG9yIGlmCisgICAgLy8gICAgICAgdGhlIGRpc3BsYXkgZHJpdmVyIGRvZXMgbm90IG5lZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQorICAgIC8vICAgICAgIGZvciBlYWNoIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSksIHRoaXMgc2hvdWxkIGp1c3QgY2FsbCBQTV9tYWxsb2MuCisgICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCisgICAgdm9pZCAqcHRyKQoreworICAgIC8vIFRPRE86IEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmxvY2suIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQKKyAgICAvLyAgICAgICBvZiB0aGUgb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHRoYXQgYWxsb2NhdGVkIHRoZSBzaGFyZWQKKyAgICAvLyAgICAgICBtZW1vcnkgd2l0aCBQTV9tYWxsb2NTaGFyZWQuIFNpbXBseSBjYWxsIFBNX2ZyZWUgaWYgeW91IGRvIG5vdAorICAgIC8vICAgICAgIG5lZWQgdGhpcy4KKyAgICBQTV9mcmVlKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCithZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCitQTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKKyAgICB2b2lkICpiYXNlLAorICAgIHVsb25nIGxpbWl0KQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZworICAgIC8vICAgICAgIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyIGludG8gdGhlCisgICAgLy8gICAgICAgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiBJZiB0aGUgbWVtb3J5IG1hcHBpbmcKKyAgICAvLyAgICAgICBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyIGlzIGdsb2JhbCB0byBhbGwgcHJvY2Vzc2VzLAorICAgIC8vICAgICAgIHNpbXBseSByZXR1cm4gdGhlIHBvaW50ZXIuCisKKyAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIG11c3QgYWxzbyBoYW5kbGUgcm91bmRpbmcgdG8gcGFnZSBib3VuZGFyaWVzLAorICAgIC8vICAgICAgIHNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgaW4gc2hhcmVkIG1lbW9yeSBidWZmZXJzCisgICAgLy8gICAgICAgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyKCkuIEhlbmNlIGlmIHlvdSBhbGlnbmVkCisgICAgLy8gICAgICAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYWJvdmUsIHRoZW4geW91IGFsc28gbmVlZCB0byBkbyBpdCBoZXJlLgorICAgIHJldHVybiBiYXNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCisgICAgdWludCByX3NlZywKKyAgICB1aW50IHJfb2ZmKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gbWFwcyBhIHJlYWwgbW9kZSBtZW1vcnkgcG9pbnRlciBpbnRvIHRoZQorICAgIC8vICAgICAgIGNhbGxpbmcgcHJvY2Vzc2VzIGFkZHJlc3Mgc3BhY2UgYXMgYSAzMi1iaXQgbmVhciBwb2ludGVyLiBJZgorICAgIC8vICAgICAgIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2Vzcywgc2ltcGx5IHJldHVybiBOVUxMIGhlcmUuCisgICAgaWYgKCF6ZXJvUHRyKQorICAgICAgICB6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRik7CisgICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIE1LX1BIWVMocl9zZWcscl9vZmYpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAorICAgIHVpbnQgc2l6ZSwKKyAgICB1aW50ICpyX3NlZywKKyAgICB1aW50ICpyX29mZikKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkgZm9yIHRoZQorICAgIC8vICAgICAgIGNhbGxpbmcgcHJvY2VzcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggcmVhbCBtb2RlIEJJT1MKKyAgICAvLyAgICAgICBmdW5jdGlvbnMuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2Vzcywgc2ltcGx5IHJldHVybgorICAgIC8vICAgICAgIE5VTEwgaGVyZS4KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAorICAgIHZvaWQgKm1lbSkKK3sKKyAgICAvLyBUT0RPOiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2suIElmIHlvdQorICAgIC8vICAgICAgIGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBlbXB0eS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIERQTUlfaW50ODYoCisgICAgaW50IGludG5vLAorICAgIERQTUlfcmVncyAqcmVncykKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByZWFsIG1vZGUgQklPUyB1c2luZyB0aGUgcGFzc2VkIGluCisgICAgLy8gICAgICAgcmVnaXN0ZXIgc3RydWN0dXJlLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgcmVhbCBtb2RlIEJJT1MKKyAgICAvLyAgICAgICBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGVtcHR5LgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1faW50ODYoCisgICAgaW50IGludG5vLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1SRUdTICpvdXQpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcmVhbCBtb2RlIEJJT1MgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgIC8vICAgICAgIHJlZ2lzdGVyIHN0cnVjdHVyZS4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IHJlYWwgbW9kZSBCSU9TCisgICAgLy8gICAgICAgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMC4KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByZWFsIG1vZGUgQklPUyB1c2luZyB0aGUgcGFzc2VkIGluCisgICAgLy8gICAgICAgcmVnaXN0ZXIgc3RydWN0dXJlLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgcmVhbCBtb2RlIEJJT1MKKyAgICAvLyAgICAgICBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwLgorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAorICAgIHVpbnQgc2VnLAorICAgIHVpbnQgb2ZmLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gd2l0aCBhIGZhciBjYWxsLgorICAgIC8vICAgICAgIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUKKyAgICAvLyAgICAgICBlbXB0eS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAorICAgIHVsb25nICpwaHlzaWNhbCwKKyAgICB1bG9uZyAqdG90YWwpCit7CisgICAgLy8gVE9ETzogUmVwb3J0IHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIG1lbW9yeSwgYm90aCB0aGUgYW1vdW50IG9mCisgICAgLy8gICAgICAgcGh5c2ljYWwgbWVtb3J5IGxlZnQgYW5kIHRoZSBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgbGVmdC4KKyAgICAvLyAgICAgICBJZiB0aGUgT1MgZG9lcyBub3QgcHJvdmlkZSB0aGVzZSBzZXJ2aWNlcywgcmVwb3J0IDAncy4KKyAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgLy8gVE9ETzogQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsIG1lbW9yeSBvZiB0aGUgc3BlY2lmaWVkCisgICAgLy8gICAgICAgc2l6ZS4gVGhpcyBpcyB1c2VkIGZvciBidXMgbWFzdGVyIG9wZXJhdGlvbnMuIElmIHRoaXMgaXMgbm90CisgICAgLy8gICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPUywgcmV0dXJuIE5VTEwgYW5kIGJ1cyBtYXN0ZXJpbmcgd2lsbCBub3QKKyAgICAvLyAgICAgICBiZSB1c2VkLgorICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKKyAgICB2b2lkICpwLAorICAgIHVpbnQgc2l6ZSwKKyAgICBpYm9vbCBjb250aWd1b3VzKQoreworICAgIC8vIFRPRE86IEZyZWUgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggUE1fYWxsb2NMb2NrZWRNZW0uCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCisgICAgaW50IGJhbmspCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgLy8gVE9ETzogVGhpcyBkb2VzIGEgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgY2FsbGluZyB0aGUgcmVhbCBtb2RlCisgICAgLy8gICAgICAgVkVTQSBCSU9TLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgICAgLy8gICAgICAgYmUgZW1wdHkuCisgICAgcmVncy54LmF4ID0gMHg0RjA1OworICAgIHJlZ3MueC5ieCA9IDB4MDAwMDsKKyAgICByZWdzLnguZHggPSBiYW5rOworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldEJhbmtBQigKKyAgICBpbnQgYmFuaykKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisKKyAgICAvLyBUT0RPOiBUaGlzIGRvZXMgYSBiYW5rIHN3aXRjaCBmdW5jdGlvbiBieSBjYWxsaW5nIHRoZSByZWFsIG1vZGUKKyAgICAvLyAgICAgICBWRVNBIEJJT1MuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICAvLyAgICAgICBiZSBlbXB0eS4KKyAgICByZWdzLnguYXggPSAweDRGMDU7CisgICAgcmVncy54LmJ4ID0gMHgwMDAwOworICAgIHJlZ3MueC5keCA9IGJhbms7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7CisgICAgcmVncy54LmF4ID0gMHg0RjA1OworICAgIHJlZ3MueC5ieCA9IDB4MDAwMTsKKyAgICByZWdzLnguZHggPSBiYW5rOworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IHdhaXRWUlQpCit7CisgICAgUk1SRUdTICByZWdzOworCisgICAgLy8gVE9ETzogVGhpcyBjaGFuZ2VzIHRoZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MgYnkgY2FsbGluZyB0aGUgcmVhbCBtb2RlCisgICAgLy8gICAgICAgVkVTQSBCSU9TLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24KKyAgICAvLyAgICAgICBzaG91bGQgYmUgZW1wdHkuCisgICAgcmVncy54LmF4ID0gMHg0RjA3OworICAgIHJlZ3MueC5ieCA9IHdhaXRWUlQ7CisgICAgcmVncy54LmN4ID0geDsKKyAgICByZWdzLnguZHggPSB5OworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBtZW1vcnkgcmVnaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1aW50IHR5cGUpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZW5hYmxlIFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIE1UUlIKKyAgICAvLyAgICAgICB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBwYXNzZWQgaW4gcGh5c2ljYWwgbWVtb3J5IGJhc2UgYWRkcmVzcworICAgIC8vICAgICAgIGFuZCBsZW5ndGguIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSB2aWEgY2FsbHMgdG8gYW4gT1Mgc3BlY2lmaWMKKyAgICAvLyAgICAgICBkZXZpY2UgZHJpdmVyIGFzIHRoaXMgY2FuIG9ubHkgYmUgZG9uZSBhdCByaW5nIDAuCisgICAgLy8KKyAgICAvLyBOT1RFOiBUaGlzIGlzIGEgKnZlcnkqIGltcG9ydGFudCBmdW5jdGlvbiB0byBpbXBsZW1lbnQhIElmIHlvdSBkbworICAgIC8vICAgICAgIG5vdCBpbXBsZW1lbnQsIGdyYXBoaWNzIHBlcmZvcm1hbmNlIG9uIHRoZSBsYXRlc3QgSW50ZWwgY2hpcHMKKyAgICAvLyAgICAgICB3aWxsIGJlIHNldmVybHkgaW1wYWlyZWQuIEZvciBzYW1wbGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkCisgICAgLy8gICAgICAgZGlyZWN0bHkgaW4gYSByaW5nIDAgZGV2aWNlIGRyaXZlciwgc2VlIHRoZSBNU0RPUyBpbXBsZW1lbnRhdGlvbgorICAgIC8vICAgICAgIHdoaWNoIGluY2x1ZGVzIGFzc2VtYmxlciBjb2RlIHRvIGRvIHRoaXMgZGlyZWN0bHkgKGlmIHRoZQorICAgIC8vICAgICAgIHByb2dyYW0gaXMgcnVubmluZyBhdCByaW5nIDApLgorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitFeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBydW4gdGhlIEJJT1MgUE9TVCBjb2RlIG9uIGEgc2Vjb25kYXJ5CisgICAgLy8gICAgICAgY29udHJvbGxlciB0byBpbml0aWFsaXNlIGl0IGZvciB1c2UuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeQorICAgIC8vICAgICAgIGZvciBtdWx0aS1jb250cm9sbGVyIG9wZXJhdGlvbiwgYnV0IGl0IHdpbGwgbWFrZSBpdCBhIGxvdAorICAgIC8vICAgICAgIG1vcmUgY29udmVuaWNlbnQgZm9yIGVuZCB1c2VycyAob3RoZXJ3aXNlIHRoZXkgaGF2ZSB0byBib290CisgICAgLy8gICAgICAgdGhlIHN5c3RlbSBvbmNlIHdpdGggdGhlIHNlY29uZGFyeSBjb250cm9sbGVyIGFzIHByaW1hcnksIGFuZAorICAgIC8vICAgICAgIHRoZW4gYm9vdCB3aXRoIGJvdGggY29udHJvbGxlcnMgaW5zdGFsbGVkKS4KKyAgICAvLworICAgIC8vICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHN1cHBvcnQgZnVsbCBCSU9TIGFjY2VzcywgaXQgd291bGQgYmUKKyAgICAvLyAgICAgICBhZHZpc2VhYmxlIHRvIGJlIGFibGUgdG8gUE9TVCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGluIHRoZQorICAgIC8vICAgICAgIHN5c3RlbSB1c2luZyB0aGlzIGZ1bmN0aW9uIGFzIGEgbWluaW11bSByZXF1aXJlbWVudC4gU29tZQorICAgIC8vICAgICAgIGdyYXBoaWNzIGhhcmR3YXJlIGhhcyByZWdpc3RlcnMgdGhhdCBjb250YWluIHZhbHVlcyB0aGF0IG9ubHkKKyAgICAvLyAgICAgICB0aGUgQklPUyBrbm93cyBhYm91dCwgd2hpY2ggbWFrZXMgYnJpbmcgdXAgYSBjYXJkIGZyb20gY29sZAorICAgIC8vICAgICAgIHJlc2V0IGRpZmZpY3VsdCBpZiB0aGUgQklPUyBoYXMgbm90IFBPU1QnZWQgaXQuCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvYWQgYW4gT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcnkgb3IgRExMLiBJZiB0aGUgT1MgZG9lcyBub3Qgc3VwcG9ydAorc2hhcmVkIGxpYnJhcmllcywgc2ltcGx5IHJldHVybiBOVUxMLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgbG9hZCBhIG5hdGl2ZSBzaGFyZWQgbGlicmFyeSBmcm9tIGRpc2sKKyAgICAvLyAgICAgICBnaXZlbiB0aGUgcGF0aCB0byB0aGUgbGlicmFyeS4KKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2V0IHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgcHJvY2VkdXJlIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUsCisgICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBwcm9jZWR1cmUKKyAgICAvLyAgICAgICBmcm9tIGEgbmF0aXZlIHNoYXJlZCBsaWJyYXJ5LgorICAgICh2b2lkKWhNb2R1bGU7CisgICAgKHZvaWQpc3pQcm9jTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVbmxvYWQgYSBzaGFyZWQgbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAorICAgIFBNX01PRFVMRSBoTW9kdWxlKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gZnJlZSBhIHByZXZpb3VzbHkgbG9hZGVkIG5hdGl2ZSBzaGFyZWQgbGlicmFyeS4KKyAgICAodm9pZCloTW9kdWxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VuYWJsZSByZXF1ZXN0ZWQgSS9PIHByaXZsZWRnZSBsZXZlbCAodXN1YWxseSBvbmx5IHRvIHNldCB0byBhIHZhbHVlIG9mCiszLCBhbmQgdGhlbiByZXN0b3JlIGl0IGJhY2sgYWdhaW4pLiBJZiB0aGUgT1MgaXMgcHJvdGVjdGVkIHRoaXMgZnVuY3Rpb24KK211c3QgYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gZW5hYmxlIEkvTyBwb3J0IGFjY2VzcyBmb3IgcmluZyAzCithcHBsaWNhdGlvbnMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBJT1BMIGxldmVsIGFjdGl2ZSBiZWZvcmUKK3RoZSBzd2l0Y2ggb2NjdXJyZWQgc28gaXQgY2FuIGJlIHByb3Blcmx5IHJlc3RvcmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9zZXRJT1BMKAorICAgIGludCBsZXZlbCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBlbmFibGUgSU9QTCBmb3IgdGhlIHRhc2sgKGlmIElPUEwgaXMKKyAgICAvLyAgICAgICBub3QgYWx3YXlzIGVuYWJsZWQgZm9yIHRoZSBhcHAgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zKS4KKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2gKKyAgICAvLyAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlCisgICAgLy8gICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClmaW5kRGF0YTsKKyAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCisgICAgdm9pZCAqaGFuZGxlLAorICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uCisgICAgLy8gICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0bworICAgIC8vICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkCisgICAgLy8gICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uCisgICAgKHZvaWQpaGFuZGxlOworICAgICh2b2lkKWZpbmREYXRhOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvCisgICAgLy8gICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4KKyAgICAodm9pZCloYW5kbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMSAgIC0gRHJpdmUgQToKKyAgICAyICAgLSBEcml2ZSBCOgorICAgIDMgICAtIERyaXZlIEM6CisgICAgZXRjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAorICAgIGNoYXIgZHJpdmUpCit7CisgICAgaWYgKGRyaXZlID09IDMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgorVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCitvZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKKyAgICBpbnQgZHJpdmUsCisgICAgY2hhciAqZGlyLAorICAgIGludCBsZW4pCit7CisgICAgKHZvaWQpZHJpdmU7CisgICAgZ2V0Y3dkKGRpcixsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyAgICAvLyBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpYXR0cmliOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ta2RpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX3JtZGlyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzllZjJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi92ZmxhdC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisKK2lib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQoreworICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7CisgICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKKyAgICBjb2RlTGVuID0gY29kZUxlbjsKKyAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3p0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWQ2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3p0aW1lci5jCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX1pUaW1lckluaXQodm9pZCkKK3sKKyAgICAvLyBUT0RPOiBEbyBhbnkgc3BlY2lmaWMgaW50ZXJuYWwgaW5pdGlhbGlzYXRpb24gaW4gaGVyZQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgLy8gVE9ETzogU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4gVGhpcyBzaG91bGQgYmUgYSBtYWNybyBpZgorICAgIC8vICAgICAgIHBvc3NpYmxlLgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIC8vIFRPRE86IENvbXB1dGUgdGhlIGxhcCB0aW1lIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgd2hlbiB0aGUKKyAgICAvLyAgICAgICB0aW1lciB3YXMgc3RhcnRlZC4KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdG9wIHRoZSBaZW4gVGltZXIgY291bnRpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIC8vIFRPRE86IFN0b3AgdGhlIHRpbWVyIGNvdW50aW5nLiBTaG91bGQgYmUgYSBtYWNybyBpZiBwb3NzaWJsZS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICAvLyBUT0RPOiBDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgYW5kIHJldHVybiBpdC4gQWx3YXlzIG1pY3Jvc2Vjb25kcy4KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciBmcm9tIHRoZSBPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgLy8gVE9ETzogUmVhZCB0aGUgbG9uZyBwZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MuIFRoZSByZXNvbHV0aW9uIG9mIHRoaXMKKyAgICAvLyAgICAgICB0aW1lciBzaG91bGQgYmUgYXJvdW5kIDEvMjAgb2YgYSBzZWNvbmQgZm9yIHRpbWluZyBsb25nCisgICAgLy8gICAgICAgcGVyaW9kcyBpZiBwb3NzaWJsZS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoreyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGJyay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0YnJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4OTliNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGJyay5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAorKiAgICAgICAgICAgICAgIGNvbnRyb2wgQy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlci4gTm90ZSB0aGF0IHRoaXMKKyogICAgICAgICAgICAgICBhbHRlcm5hdGUgdmVyc2lvbiBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGV4dGVuZGVycy4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJwbWFwaS5oIgorCit2b2xhdGlsZSBpbnQgYnJlYWtIaXQgPSBmYWxzZTsKK3ZvbGF0aWxlIGludCBjdHJsQ0hpdCA9IGZhbHNlOworCisjcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLworCit2b2lkIFBNQVBJIGJyZWFrSGFuZGxlcih1aW50IGJIaXQpCit7CisgICAgaWYgKGJIaXQpCisgICAgICAgIGJyZWFrSGl0ID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIGN0cmxDSGl0ID0gdHJ1ZTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKKyAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQTV9yZWFsTW9kZToKKyAgICAgICAgICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzI4NjoKKyAgICAgICAgICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzM4NjoKKyAgICAgICAgICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKGJyZWFrSGFuZGxlcik7CisgICAgcHJpbnRmKCJDb250cm9sIEMvQnJlYWsgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkXG4iKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoY3RybENIaXQpIHsKKyAgICAgICAgICAgIHByaW50ZigiQ29kZSB0ZXJtaW1hdGVkIHdpdGggQ3RybC1DLlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGJyZWFrSGl0KSB7CisgICAgICAgICAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQnJlYWsuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoUE1fa2JoaXQoKSAmJiBQTV9nZXRjaCgpID09IDB4MUIpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm8gYnJlYWsgY29kZSBkZXRlY3RlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHByaW50ZigiSGl0IEN0cmwtQyBvciBDdHJsLUJyZWFrIHRvIGV4aXQhXG4iKTsKKyAgICAgICAgfQorCisgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0Y3JpdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0Y3JpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzkwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRjcml0LmMKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgYW55CisqCisqIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCisqICAgICAgICAgICAgICAgY3JpdGljYWwgZXJyb3IgaGFuZGxlci4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY3JpdGljYWxFcnJvcigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKCkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3ZvbGF0aWxlIHVpbnQgY3JpdGljYWxFcnJvciA9IGZhbHNlOwordm9sYXRpbGUgdWludCBheFZhbHVlOwordm9sYXRpbGUgdWludCBkaVZhbHVlOworCisjcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLworCit1aW50IFBNQVBJIGNyaXRpY2FsSGFuZGxlcih1aW50IGF4VmFsLHVpbnQgZGlWYWwpCit7CisgICAgY3JpdGljYWxFcnJvciA9IHRydWU7CisgICAgYXhWYWx1ZSA9IGF4VmFsOworICAgIGRpVmFsdWUgPSBkaVZhbDsKKyAgICByZXR1cm4gMzsgICAgICAgLyogVGVsbCBNUy1ET1MgdG8gZmFpbCB0aGUgb3BlcmF0aW9uICovCit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgRklMRSAgICAqZjsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoY3JpdGljYWxIYW5kbGVyKTsKKyAgICBwcmludGYoIkNyaXRpY2FsIEVycm9yIGhhbmRsZXIgaW5zdGFsbGVkIC0gdHJ5aW5nIHRvIHJlYWQgZnJvbSBBOiBkcml2ZS4uLlxuIik7CisgICAgZiA9IGZvcGVuKCJhOlxib2cuYm9nIiwicmIiKTsKKyAgICBpZiAoZikgZmNsb3NlKGYpOworICAgIGlmIChjcml0aWNhbEVycm9yKSB7CisgICAgICAgIHByaW50ZigiQ3JpdGljYWwgZXJyb3Igb2NjdXJlZCBvbiBJTlQgMjFoIGZ1bmN0aW9uICUwMlghXG4iLAorICAgICAgICAgICAgYXhWYWx1ZSA+PiA4KTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJDcml0aWNhbCBlcnJvciB3YXMgbm90IGNhdWdodCFcbiIpOworICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jpb3NwdHIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jpb3NwdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzY2ODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmlvc3B0ci5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBtYW5pcHVsYXRlIHRoZQorKiAgICAgICAgICAgICAgIEJJT1MgZGF0YSBhcmVhIGZyb20gcHJvdGVjdGVkIG1vZGUgdXNpbmcgdGhlIFBNCisqICAgICAgICAgICAgICAgbGlicmFyeS4gQ29tcGlsZSBhbmQgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kCisqICAgICAgICAgICAgICAgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCisqCisqICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9nZXRCSU9TU2VsZWN0b3IoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fZ2V0TG9uZygpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9nZXRCeXRlKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2dldFdvcmQoKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworLyogTWFjcm9zIHRvIG9idGFpbiB2YWx1ZXMgZnJvbSB0aGUgQklPUyBkYXRhIGFyZWEgKi8KKworI2RlZmluZSBUSUNLUygpICAgICBQTV9nZXRMb25nKGJpb3MrMHg2QykKKyNkZWZpbmUgS0JfU1RBVCAgICAgUE1fZ2V0Qnl0ZShiaW9zKzB4MTcpCisjZGVmaW5lIEtCX0hFQUQgICAgIFBNX2dldFdvcmQoYmlvcysweDFBKQorI2RlZmluZSBLQl9UQUlMICAgICBQTV9nZXRXb3JkKGJpb3MrMHgxQykKKworLyogTWFjcm9zIGZvciB3b3JraW5nIHdpdGggdGhlIGtleWJvYXJkIGJ1ZmZlciAqLworCisjZGVmaW5lIEtCX0hJVCgpICAgIChLQl9IRUFEICE9IEtCX1RBSUwpCisjZGVmaW5lIENUUkwoKSAgICAgIChLQl9TVEFUICYgNCkKKyNkZWZpbmUgU0hJRlQoKSAgICAgKEtCX1NUQVQgJiAyKQorI2RlZmluZSBFU0MgICAgICAgICAweDFCCisKKy8qIFNlbGVjdG9yIGZvciBCSU9TIGRhdGEgYXJlYSAqLworCit1Y2hhciAqYmlvczsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgYyxkb25lID0gMDsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGJpb3MgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworICAgIHByaW50ZigiSGl0IGFueSBrZXkgdG8gdGVzdCwgQ3RybC1TaGlmdC1Fc2MgdG8gcXVpdFxuIik7CisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIGlmIChLQl9ISVQoKSkgeworICAgICAgICAgICAgYyA9IFBNX2dldGNoKCk7CisgICAgICAgICAgICBpZiAoYyA9PSAwKSBQTV9nZXRjaCgpOworICAgICAgICAgICAgcHJpbnRmKCJUSU1FPSUtOGxYIFNUPSUwMlggQ0hBUj0lMDJYICIsIFRJQ0tTKCksIEtCX1NUQVQsIGMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKChjID09IEVTQykgJiYgU0hJRlQoKSAmJiBDVFJMKCkpLyogQ3RybC1TaGlmdC1Fc2MgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ibG9jay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ4ODcyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmxvY2suYwpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBQTV9ibG9ja1VudGlsVGltZW91dCBmdW5jdGlvbi4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKKyNkZWZpbmUgREVMQVlfTVNFQ1MgMTEwMAorI2RlZmluZSBMT09QUyAgICAgICA1CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB0YWtlcyBhIGxvbmcgY291bnQgaW4gbWljcm9zZWNvbmRzIGFuZCBvdXRwdXRzCisgKiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IGluIHNlY29uZHMuIEl0IGNvdWxkIGJlIG1vZGlmaWVkIHRvCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RhdGljIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IHJhdGhlcgorICogdGhhbiBwcmludGluZyBpdCBvdXQuCisgKi8KKwordm9pZCBSZXBvcnRUaW1lKHVsb25nIGNvdW50KQoreworICAgIHVsb25nICAgc2VjczsKKworICAgIHNlY3MgPSBjb3VudCAvIDEwMDAwMDBMOworICAgIGNvdW50ID0gY291bnQgLSBzZWNzICogMTAwMDAwMEw7CisgICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlbHUuJTA2bHUgc2Vjb25kc1xuIixzZWNzLGNvdW50KTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiRGV0ZWN0aW5nIHByb2Nlc3NvciBpbmZvcm1hdGlvbiAuLi4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBwcmludGYoIlxuXG4lc1xuIiwgQ1BVX2dldFByb2Nlc3Nvck5hbWUoKSk7CisgICAgWlRpbWVySW5pdCgpOworICAgIExaVGltZXJPbigpOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QUzsgaSsrKSB7CisgICAgICAgIFBNX2Jsb2NrVW50aWxUaW1lb3V0KERFTEFZX01TRUNTKTsKKyAgICAgICAgUmVwb3J0VGltZShMWlRpbWVyTGFwKCkpOworICAgICAgICB9CisgICAgTFpUaW1lck9mZigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYnJrLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9icmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYxZmVlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYnJrLmMKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgYW55CisqCisqIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCisqICAgICAgICAgICAgICAgY29udHJvbCBDL2JyZWFrIGludGVycnVwdCBoYW5kbGVyLgorKgorKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jdHJsQ0hpdCgpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jdHJsQnJlYWtIaXQoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJwbWFwaS5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsKKyAgICBwcmludGYoIkNvbnRyb2wgQy9CcmVhayBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWRcbiIpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChQTV9jdHJsQ0hpdCgxKSkgeworICAgICAgICAgICAgcHJpbnRmKCJDb2RlIHRlcm1pbWF0ZWQgd2l0aCBDdHJsLUMuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoUE1fY3RybEJyZWFrSGl0KDEpKSB7CisgICAgICAgICAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQnJlYWsuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoUE1fa2JoaXQoKSAmJiBQTV9nZXRjaCgpID09IDB4MUIpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm8gYnJlYWsgY29kZSBkZXRlY3RlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHByaW50ZigiSGl0IEN0cmwtQyBvciBDdHJsLUJyZWFrIHRvIGV4aXQhXG4iKTsKKyAgICAgICAgfQorCisgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2FsbHJlYWwuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NhbGxyZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5N2NlOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NhbGxyZWFsLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBjYWxsIGEgcmVhbCBtb2RlCisqICAgICAgICAgICAgICAgcHJvY2VkdXJlLiBXZSBzaW1wbHkgY29weSBhIHRlcnJpYmx5IHNpbXBsZSBhc3NlbWJseQorKiAgICAgICAgICAgICAgIGxhbmd1YWdlIHJvdXRpbmUgaW50byBhIHJlYWwgbW9kZSBibG9jayB0aGF0IHdlIGFsbG9jYXRlLAorKiAgICAgICAgICAgICAgIGFuZCB0aGVuIGF0dGVtcHQgdG8gY2FsbCB0aGUgcm91dGluZSBhbmQgdmVyaWZ5IHRoYXQgaXQKKyogICAgICAgICAgICAgICB3YXMgc3VjY2Vzc2Z1bC4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2FsbG9jUmVhbFNlZygpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9mcmVlUmVhbFNlZygpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jYWxsUmVhbE1vZGUoKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworLyogQmxvY2sgb2YgcmVhbCBtb2RlIGNvZGUgd2Ugd2lsbCBldmVudHVhbGx5IGNhbGwgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhbE1vZGVDb2RlW10gPSB7CisgICAgMHg5MywgICAgICAgICAgIC8qICB4Y2hnICAgIGF4LGJ4ICAgKi8KKyAgICAweDg3LCAweENBLCAgICAgLyogIHhjaGcgICAgY3gsZHggICAqLworICAgIDB4Q0IgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICovCisgICAgfTsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBSTVJFR1MgICAgICAgICAgcmVnczsKKyAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7CisgICAgdWNoYXIgICAgICAgICAgICpwOworICAgIHVuc2lnbmVkICAgICAgICByX3NlZyxyX29mZjsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGEgdGhlIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkgKi8KKyAgICBpZiAoKHAgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKHJlYWxNb2RlQ29kZSksICZyX3NlZywgJnJfb2ZmKSkgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSByZWFsIG1vZGUgbWVtb3J5IVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBjb2RlICovCisgICAgbWVtY3B5KHAscmVhbE1vZGVDb2RlLHNpemVvZihyZWFsTW9kZUNvZGUpKTsKKworICAgIC8qIE5vdyBjYWxsIHRoZSByZWFsIG1vZGUgY29kZSAqLworICAgIHJlZ3MueC5heCA9IDE7CisgICAgcmVncy54LmJ4ID0gMjsKKyAgICByZWdzLnguY3ggPSAzOworICAgIHJlZ3MueC5keCA9IDQ7CisgICAgcmVncy54LnNpID0gNTsKKyAgICByZWdzLnguZGkgPSA2OworICAgIHNyZWdzLmVzID0gNzsKKyAgICBzcmVncy5kcyA9IDg7CisgICAgUE1fY2FsbFJlYWxNb2RlKHJfc2VnLHJfb2ZmLCZyZWdzLCZzcmVncyk7CisgICAgaWYgKHJlZ3MueC5heCAhPSAyIHx8IHJlZ3MueC5ieCAhPSAxIHx8IHJlZ3MueC5jeCAhPSA0IHx8IHJlZ3MueC5keCAhPSAzCisgICAgICAgICAgICB8fCByZWdzLnguc2kgIT0gNSB8fCByZWdzLnguZGkgIT0gNiB8fCBzcmVncy5lcyAhPSA3CisgICAgICAgICAgICB8fCBzcmVncy5kcyAhPSA4KSB7CisgICAgICAgIHByaW50ZigiUmVhbCBtb2RlIGNhbGwgZmFpbGVkIVxuIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJheCA9ICUwNFgsIGJ4ID0gJTA0WCwgY3ggPSAlMDRYLCBkeCA9ICUwNFhcbiIsCisgICAgICAgICAgICByZWdzLnguYXgscmVncy54LmJ4LHJlZ3MueC5jeCxyZWdzLnguZHgpOworICAgICAgICBwcmludGYoInNpID0gJTA0WCwgZGkgPSAlMDRYLCBlcyA9ICUwNFgsIGRzID0gJTA0WFxuIiwKKyAgICAgICAgICAgIHJlZ3MueC5zaSxyZWdzLnguZGksc3JlZ3MuZXMsc3JlZ3MuZHMpOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoIlJlYWwgbW9kZSBjYWxsIHN1Y2NlZWRlZCFcbiIpOworCisgICAgLyogRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZCAqLworICAgIFBNX2ZyZWVSZWFsU2VnKHApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2hlY2tzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jaGVja3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTczN2UxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2hlY2tzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKgorKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIGZvciBidWlsZGluZyBjaGVja2VkIGJ1aWxkcyBvZiBwcm9kdWN0cyB3aXRoCisqICAgICAgICAgICAgICAgYXNzZXJ0aW9ucyBhbmQgdHJhY2UgY29kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzY2l0ZWNoLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiAgX19XSU5ET1dTX18KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBTVFJJQ1QKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmICBDSEVDS0VECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTE9HRklMRSAiXFxzY2l0ZWNoLmxvZyIKKwordm9pZCAoKl9DSEtfZmFpbCkoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpID0gX0NIS19kZWZhdWx0RmFpbDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorSGFuZGxlcyBmYXRhbCBlcnJvciBhbmQgd2FybmluZyBjb25kaXRpb25zIGZvciBjaGVja2VkIGJ1aWxkcy4KKworSEVBREVSOgorc2NpdGVjaC5oCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpbmxpbmUgY2hlY2sgb3Igd2FybmluZyBmYWlscyBpbiBhbnkKK29mIHRoZSBTY2lUZWNoIHJ1bnRpbWUgbGlicmFyaWVzLiBXYXJuaW5nIGNvbmRpdGlvbnMgc2ltcGx5IGNhdXNlIHRoZQorY29uZGl0aW9uIHRvIGJlIGxvZ2dlZCB0byB0aGUgbG9nIGZpbGUgYW5kIHNlbmQgdG8gdGhlIHN5c3RlbSBkZWJ1Z2dlcgordW5kZXIgV2luZG93LiBGYXRhbCBlcnJvciBjb25kaXRpb25zIGRvIGFsbCBvZiB0aGUgYWJvdmUsIGFuZCB0aGVuCit0ZXJtaW5hdGUgdGhlIHByb2dyYW0gd2l0aCBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbnMuCisKK1RoaXMgaGFuZGxlciBtYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSB1c2VyIGNvZGUgaWYgbmVjZXNzYXJ5IHRvIHJlcGxhY2UgaXQKK3dpdGggYSBkaWZmZXJlbnQgaGFuZGxlciAodGhlIE1HTCBmb3IgaW5zdGFuY2Ugb3ZlcnJpZGVzIHRoaXMgYW5kIHJlcGxhY2VzCitpdCB3aXRoIGEgaGFuZGxlciB0aGF0IGRvZXMgYW4gTUdMX2V4aXQoKSBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGFwcGxpY2F0aW9uCitzbyB0aGF0IGl0IHdpbGwgY2xlYW4gdXAgY29ycmVjdGx5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0NIS19kZWZhdWx0RmFpbCgKKyAgICBpbnQgZmF0YWwsCisgICAgY29uc3QgY2hhciAqbXNnLAorICAgIGNvbnN0IGNoYXIgKmNvbmQsCisgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICBpbnQgbGluZSkKK3sKKyAgICBjaGFyICAgIGJ1ZlsyNTZdOworICAgIEZJTEUgICAgKmxvZyA9IGZvcGVuKExPR0ZJTEUsICJhdCsiKTsKKworICAgIHNwcmludGYoYnVmLG1zZyxjb25kLGZpbGUsbGluZSk7CisgICAgaWYgKGxvZykgeworICAgICAgICBmcHV0cyhidWYsbG9nKTsKKyAgICAgICAgZmZsdXNoKGxvZyk7CisgICAgICAgIGZjbG9zZShsb2cpOworI2lmZGVmICBfX1dJTkRPV1NfXworICAgICAgICBPdXRwdXREZWJ1Z1N0cihidWYpOworI2VuZGlmCisgICAgICAgIH0KKyAgICBpZiAoZmF0YWwpIHsKKyNpZmRlZiAgX19XSU5ET1dTX18KKyAgICAgICAgTWVzc2FnZUJveChOVUxMLCBidWYsIkZhdGFsIEVycm9yISIsTUJfSUNPTkVYQ0xBTUFUSU9OKTsKKyNlbHNlCisgICAgICAgIGZwdXRzKGJ1ZixzdGRlcnIpOworI2VuZGlmCisgICAgICAgIGV4aXQoLTEpOworICAgICAgICB9Cit9CisKKyNlbmRpZiAgLyogQ0hFQ0tFRCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3B1LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFiYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3B1LmMKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBjb2RlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInp0aW1lci5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBwcmludGYoIkRldGVjdGluZyBwcm9jZXNzb3IgaW5mb3JtYXRpb24gLi4uIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcHJpbnRmKCJcblxuJXNcbiIsIENQVV9nZXRQcm9jZXNzb3JOYW1lKCkpOworICAgIGlmIChDUFVfaGF2ZVJEVFNDKCkpCisgICAgICAgIHByaW50ZigiXG5Qcm9jZXNzb3Igc3VwcG9ydHMgUmVhZCBUaW1lIFN0YW1wIENvdW50ZXIgcGVyZm9ybWFuY2UgdGltZXIuXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NyaXRpY2FsLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWM5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcml0aWNhbC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAorKiAgICAgICAgICAgICAgIGNyaXRpY2FsIGVycm9yIGhhbmRsZXIuCisqCisqICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBGSUxFICAgICpmOworICAgIGludCAgICAgYXhjb2RlLGRpY29kZTsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIoKTsKKyAgICBwcmludGYoIkNyaXRpY2FsIEVycm9yIGhhbmRsZXIgaW5zdGFsbGVkIC0gdHJ5aW5nIHRvIHJlYWQgZnJvbSBBOiBkcml2ZS4uLlxuIik7CisgICAgZiA9IGZvcGVuKCJhOlxib2cuYm9nIiwicmIiKTsKKyAgICBpZiAoZikgZmNsb3NlKGYpOworICAgIGlmIChQTV9jcml0aWNhbEVycm9yKCZheGNvZGUsJmRpY29kZSwxKSkgeworICAgICAgICBwcmludGYoIkNyaXRpY2FsIGVycm9yIG9jY3VyZWQgb24gSU5UIDIxaCBmdW5jdGlvbiAlMDJYIVxuIiwKKyAgICAgICAgICAgIGF4Y29kZSA+PiA4KTsKKyAgICAgICAgfQorICAgIGVsc2UgcHJpbnRmKCJDcml0aWNhbCBlcnJvciB3YXMgbm90IGNhdWdodCFcbiIpOworICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2dldGNoLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9nZXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGY3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9nZXRjaC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gdGVzdCBvdXQgdGhlIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGhhbmRsaW5nCisqICAgICAgICAgICAgICAgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJldmVudC5oIgorCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Iga2V5IGNvZGVzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgIGNvZGU7CisgICAgY2hhciAgICAqbmFtZTsKKyAgICB9IEtleUVudHJ5OworCitLZXlFbnRyeSBBU0NJSUNvZGVzW10gPSB7CisgICAge0FTQ0lJX2N0cmxBICAgICAgICAgICAgLCJBU0NJSV9jdHJsQSJ9LAorICAgIHtBU0NJSV9jdHJsQiAgICAgICAgICAgICwiQVNDSUlfY3RybEIifSwKKyAgICB7QVNDSUlfY3RybEMgICAgICAgICAgICAsIkFTQ0lJX2N0cmxDIn0sCisgICAge0FTQ0lJX2N0cmxEICAgICAgICAgICAgLCJBU0NJSV9jdHJsRCJ9LAorICAgIHtBU0NJSV9jdHJsRSAgICAgICAgICAgICwiQVNDSUlfY3RybEUifSwKKyAgICB7QVNDSUlfY3RybEYgICAgICAgICAgICAsIkFTQ0lJX2N0cmxGIn0sCisgICAge0FTQ0lJX2N0cmxHICAgICAgICAgICAgLCJBU0NJSV9jdHJsRyJ9LAorICAgIHtBU0NJSV9iYWNrc3BhY2UgICAgICAgICwiQVNDSUlfYmFja3NwYWNlIn0sCisgICAge0FTQ0lJX2N0cmxIICAgICAgICAgICAgLCJBU0NJSV9jdHJsSCJ9LAorICAgIHtBU0NJSV90YWIgICAgICAgICAgICAgICwiQVNDSUlfdGFiIn0sCisgICAge0FTQ0lJX2N0cmxJICAgICAgICAgICAgLCJBU0NJSV9jdHJsSSJ9LAorICAgIHtBU0NJSV9jdHJsSiAgICAgICAgICAgICwiQVNDSUlfY3RybEoifSwKKyAgICB7QVNDSUlfY3RybEsgICAgICAgICAgICAsIkFTQ0lJX2N0cmxLIn0sCisgICAge0FTQ0lJX2N0cmxMICAgICAgICAgICAgLCJBU0NJSV9jdHJsTCJ9LAorICAgIHtBU0NJSV9lbnRlciAgICAgICAgICAgICwiQVNDSUlfZW50ZXIifSwKKyAgICB7QVNDSUlfY3RybE0gICAgICAgICAgICAsIkFTQ0lJX2N0cmxNIn0sCisgICAge0FTQ0lJX2N0cmxOICAgICAgICAgICAgLCJBU0NJSV9jdHJsTiJ9LAorICAgIHtBU0NJSV9jdHJsTyAgICAgICAgICAgICwiQVNDSUlfY3RybE8ifSwKKyAgICB7QVNDSUlfY3RybFAgICAgICAgICAgICAsIkFTQ0lJX2N0cmxQIn0sCisgICAge0FTQ0lJX2N0cmxRICAgICAgICAgICAgLCJBU0NJSV9jdHJsUSJ9LAorICAgIHtBU0NJSV9jdHJsUiAgICAgICAgICAgICwiQVNDSUlfY3RybFIifSwKKyAgICB7QVNDSUlfY3RybFMgICAgICAgICAgICAsIkFTQ0lJX2N0cmxTIn0sCisgICAge0FTQ0lJX2N0cmxUICAgICAgICAgICAgLCJBU0NJSV9jdHJsVCJ9LAorICAgIHtBU0NJSV9jdHJsVSAgICAgICAgICAgICwiQVNDSUlfY3RybFUifSwKKyAgICB7QVNDSUlfY3RybFYgICAgICAgICAgICAsIkFTQ0lJX2N0cmxWIn0sCisgICAge0FTQ0lJX2N0cmxXICAgICAgICAgICAgLCJBU0NJSV9jdHJsVyJ9LAorICAgIHtBU0NJSV9jdHJsWCAgICAgICAgICAgICwiQVNDSUlfY3RybFgifSwKKyAgICB7QVNDSUlfY3RybFkgICAgICAgICAgICAsIkFTQ0lJX2N0cmxZIn0sCisgICAge0FTQ0lJX2N0cmxaICAgICAgICAgICAgLCJBU0NJSV9jdHJsWiJ9LAorICAgIHtBU0NJSV9lc2MgICAgICAgICAgICAgICwiQVNDSUlfZXNjIn0sCisgICAge0FTQ0lJX3NwYWNlICAgICAgICAgICAgLCJBU0NJSV9zcGFjZSJ9LAorICAgIHtBU0NJSV9leGNsYW1hdGlvbiAgICAgICwiQVNDSUlfZXhjbGFtYXRpb24ifSwKKyAgICB7QVNDSUlfcXVvdGUgICAgICAgICAgICAsIkFTQ0lJX3F1b3RlIn0sCisgICAge0FTQ0lJX3BvdW5kICAgICAgICAgICAgLCJBU0NJSV9wb3VuZCJ9LAorICAgIHtBU0NJSV9kb2xsYXIgICAgICAgICAgICwiQVNDSUlfZG9sbGFyIn0sCisgICAge0FTQ0lJX3BlcmNlbnQgICAgICAgICAgLCJBU0NJSV9wZXJjZW50In0sCisgICAge0FTQ0lJX2FtcGVyc2FuZCAgICAgICAgLCJBU0NJSV9hbXBlcnNhbmQifSwKKyAgICB7QVNDSUlfYXBvc3Ryb3BoZSAgICAgICAsIkFTQ0lJX2Fwb3N0cm9waGUifSwKKyAgICB7QVNDSUlfbGVmdEJyYWNlICAgICAgICAsIkFTQ0lJX2xlZnRCcmFjZSJ9LAorICAgIHtBU0NJSV9yaWdodEJyYWNlICAgICAgICwiQVNDSUlfcmlnaHRCcmFjZSJ9LAorICAgIHtBU0NJSV90aW1lcyAgICAgICAgICAgICwiQVNDSUlfdGltZXMifSwKKyAgICB7QVNDSUlfcGx1cyAgICAgICAgICAgICAsIkFTQ0lJX3BsdXMifSwKKyAgICB7QVNDSUlfY29tbWEgICAgICAgICAgICAsIkFTQ0lJX2NvbW1hIn0sCisgICAge0FTQ0lJX21pbnVzICAgICAgICAgICAgLCJBU0NJSV9taW51cyJ9LAorICAgIHtBU0NJSV9wZXJpb2QgICAgICAgICAgICwiQVNDSUlfcGVyaW9kIn0sCisgICAge0FTQ0lJX2RpdmlkZSAgICAgICAgICAgLCJBU0NJSV9kaXZpZGUifSwKKyAgICB7QVNDSUlfMCAgICAgICAgICAgICAgICAsIkFTQ0lJXzAifSwKKyAgICB7QVNDSUlfMSAgICAgICAgICAgICAgICAsIkFTQ0lJXzEifSwKKyAgICB7QVNDSUlfMiAgICAgICAgICAgICAgICAsIkFTQ0lJXzIifSwKKyAgICB7QVNDSUlfMyAgICAgICAgICAgICAgICAsIkFTQ0lJXzMifSwKKyAgICB7QVNDSUlfNCAgICAgICAgICAgICAgICAsIkFTQ0lJXzQifSwKKyAgICB7QVNDSUlfNSAgICAgICAgICAgICAgICAsIkFTQ0lJXzUifSwKKyAgICB7QVNDSUlfNiAgICAgICAgICAgICAgICAsIkFTQ0lJXzYifSwKKyAgICB7QVNDSUlfNyAgICAgICAgICAgICAgICAsIkFTQ0lJXzcifSwKKyAgICB7QVNDSUlfOCAgICAgICAgICAgICAgICAsIkFTQ0lJXzgifSwKKyAgICB7QVNDSUlfOSAgICAgICAgICAgICAgICAsIkFTQ0lJXzkifSwKKyAgICB7QVNDSUlfY29sb24gICAgICAgICAgICAsIkFTQ0lJX2NvbG9uIn0sCisgICAge0FTQ0lJX3NlbWljb2xvbiAgICAgICAgLCJBU0NJSV9zZW1pY29sb24ifSwKKyAgICB7QVNDSUlfbGVzc1RoYW4gICAgICAgICAsIkFTQ0lJX2xlc3NUaGFuIn0sCisgICAge0FTQ0lJX2VxdWFscyAgICAgICAgICAgLCJBU0NJSV9lcXVhbHMifSwKKyAgICB7QVNDSUlfZ3JlYXRlclRoYW4gICAgICAsIkFTQ0lJX2dyZWF0ZXJUaGFuIn0sCisgICAge0FTQ0lJX3F1ZXN0aW9uICAgICAgICAgLCJBU0NJSV9xdWVzdGlvbiJ9LAorICAgIHtBU0NJSV9hdCAgICAgICAgICAgICAgICwiQVNDSUlfYXQifSwKKyAgICB7QVNDSUlfQSAgICAgICAgICAgICAgICAsIkFTQ0lJX0EifSwKKyAgICB7QVNDSUlfQiAgICAgICAgICAgICAgICAsIkFTQ0lJX0IifSwKKyAgICB7QVNDSUlfQyAgICAgICAgICAgICAgICAsIkFTQ0lJX0MifSwKKyAgICB7QVNDSUlfRCAgICAgICAgICAgICAgICAsIkFTQ0lJX0QifSwKKyAgICB7QVNDSUlfRSAgICAgICAgICAgICAgICAsIkFTQ0lJX0UifSwKKyAgICB7QVNDSUlfRiAgICAgICAgICAgICAgICAsIkFTQ0lJX0YifSwKKyAgICB7QVNDSUlfRyAgICAgICAgICAgICAgICAsIkFTQ0lJX0cifSwKKyAgICB7QVNDSUlfSCAgICAgICAgICAgICAgICAsIkFTQ0lJX0gifSwKKyAgICB7QVNDSUlfSSAgICAgICAgICAgICAgICAsIkFTQ0lJX0kifSwKKyAgICB7QVNDSUlfSiAgICAgICAgICAgICAgICAsIkFTQ0lJX0oifSwKKyAgICB7QVNDSUlfSyAgICAgICAgICAgICAgICAsIkFTQ0lJX0sifSwKKyAgICB7QVNDSUlfTCAgICAgICAgICAgICAgICAsIkFTQ0lJX0wifSwKKyAgICB7QVNDSUlfTSAgICAgICAgICAgICAgICAsIkFTQ0lJX00ifSwKKyAgICB7QVNDSUlfTiAgICAgICAgICAgICAgICAsIkFTQ0lJX04ifSwKKyAgICB7QVNDSUlfTyAgICAgICAgICAgICAgICAsIkFTQ0lJX08ifSwKKyAgICB7QVNDSUlfUCAgICAgICAgICAgICAgICAsIkFTQ0lJX1AifSwKKyAgICB7QVNDSUlfUSAgICAgICAgICAgICAgICAsIkFTQ0lJX1EifSwKKyAgICB7QVNDSUlfUiAgICAgICAgICAgICAgICAsIkFTQ0lJX1IifSwKKyAgICB7QVNDSUlfUyAgICAgICAgICAgICAgICAsIkFTQ0lJX1MifSwKKyAgICB7QVNDSUlfVCAgICAgICAgICAgICAgICAsIkFTQ0lJX1QifSwKKyAgICB7QVNDSUlfVSAgICAgICAgICAgICAgICAsIkFTQ0lJX1UifSwKKyAgICB7QVNDSUlfViAgICAgICAgICAgICAgICAsIkFTQ0lJX1YifSwKKyAgICB7QVNDSUlfVyAgICAgICAgICAgICAgICAsIkFTQ0lJX1cifSwKKyAgICB7QVNDSUlfWCAgICAgICAgICAgICAgICAsIkFTQ0lJX1gifSwKKyAgICB7QVNDSUlfWSAgICAgICAgICAgICAgICAsIkFTQ0lJX1kifSwKKyAgICB7QVNDSUlfWiAgICAgICAgICAgICAgICAsIkFTQ0lJX1oifSwKKyAgICB7QVNDSUlfbGVmdFNxdWFyZUJyYWNlICAsIkFTQ0lJX2xlZnRTcXVhcmVCcmFjZSJ9LAorICAgIHtBU0NJSV9iYWNrU2xhc2ggICAgICAgICwiQVNDSUlfYmFja1NsYXNoIn0sCisgICAge0FTQ0lJX3JpZ2h0U3F1YXJlQnJhY2UgLCJBU0NJSV9yaWdodFNxdWFyZUJyYWNlIn0sCisgICAge0FTQ0lJX2NhcmV0ICAgICAgICAgICAgLCJBU0NJSV9jYXJldCJ9LAorICAgIHtBU0NJSV91bmRlcnNjb3JlICAgICAgICwiQVNDSUlfdW5kZXJzY29yZSJ9LAorICAgIHtBU0NJSV9sZWZ0QXBvc3Ryb3BoZSAgICwiQVNDSUlfbGVmdEFwb3N0cm9waGUifSwKKyAgICB7QVNDSUlfYSAgICAgICAgICAgICAgICAsIkFTQ0lJX2EifSwKKyAgICB7QVNDSUlfYiAgICAgICAgICAgICAgICAsIkFTQ0lJX2IifSwKKyAgICB7QVNDSUlfYyAgICAgICAgICAgICAgICAsIkFTQ0lJX2MifSwKKyAgICB7QVNDSUlfZCAgICAgICAgICAgICAgICAsIkFTQ0lJX2QifSwKKyAgICB7QVNDSUlfZSAgICAgICAgICAgICAgICAsIkFTQ0lJX2UifSwKKyAgICB7QVNDSUlfZiAgICAgICAgICAgICAgICAsIkFTQ0lJX2YifSwKKyAgICB7QVNDSUlfZyAgICAgICAgICAgICAgICAsIkFTQ0lJX2cifSwKKyAgICB7QVNDSUlfaCAgICAgICAgICAgICAgICAsIkFTQ0lJX2gifSwKKyAgICB7QVNDSUlfaSAgICAgICAgICAgICAgICAsIkFTQ0lJX2kifSwKKyAgICB7QVNDSUlfaiAgICAgICAgICAgICAgICAsIkFTQ0lJX2oifSwKKyAgICB7QVNDSUlfayAgICAgICAgICAgICAgICAsIkFTQ0lJX2sifSwKKyAgICB7QVNDSUlfbCAgICAgICAgICAgICAgICAsIkFTQ0lJX2wifSwKKyAgICB7QVNDSUlfbSAgICAgICAgICAgICAgICAsIkFTQ0lJX20ifSwKKyAgICB7QVNDSUlfbiAgICAgICAgICAgICAgICAsIkFTQ0lJX24ifSwKKyAgICB7QVNDSUlfbyAgICAgICAgICAgICAgICAsIkFTQ0lJX28ifSwKKyAgICB7QVNDSUlfcCAgICAgICAgICAgICAgICAsIkFTQ0lJX3AifSwKKyAgICB7QVNDSUlfcSAgICAgICAgICAgICAgICAsIkFTQ0lJX3EifSwKKyAgICB7QVNDSUlfciAgICAgICAgICAgICAgICAsIkFTQ0lJX3IifSwKKyAgICB7QVNDSUlfcyAgICAgICAgICAgICAgICAsIkFTQ0lJX3MifSwKKyAgICB7QVNDSUlfdCAgICAgICAgICAgICAgICAsIkFTQ0lJX3QifSwKKyAgICB7QVNDSUlfdSAgICAgICAgICAgICAgICAsIkFTQ0lJX3UifSwKKyAgICB7QVNDSUlfdiAgICAgICAgICAgICAgICAsIkFTQ0lJX3YifSwKKyAgICB7QVNDSUlfdyAgICAgICAgICAgICAgICAsIkFTQ0lJX3cifSwKKyAgICB7QVNDSUlfeCAgICAgICAgICAgICAgICAsIkFTQ0lJX3gifSwKKyAgICB7QVNDSUlfeSAgICAgICAgICAgICAgICAsIkFTQ0lJX3kifSwKKyAgICB7QVNDSUlfeiAgICAgICAgICAgICAgICAsIkFTQ0lJX3oifSwKKyAgICB7QVNDSUlfbGVmdEN1cmx5QnJhY2UgICAsIkFTQ0lJX2xlZnRDdXJseUJyYWNlIn0sCisgICAge0FTQ0lJX3ZlcnRpY2FsQmFyICAgICAgLCJBU0NJSV92ZXJ0aWNhbEJhciJ9LAorICAgIHtBU0NJSV9yaWdodEN1cmx5QnJhY2UgICwiQVNDSUlfcmlnaHRDdXJseUJyYWNlIn0sCisgICAge0FTQ0lJX3RpbGRlICAgICAgICAgICAgLCJBU0NJSV90aWxkZSJ9LAorICAgIHswICAgICAgICAgICAgICAgICAgICAgICwiQVNDSUlfdW5rbm93biJ9LAorICAgIH07CisKK0tleUVudHJ5IFNjYW5Db2Rlc1tdID0geworICAgIHtLQl9wYWRFbnRlciAgICAgICAgICAgICwiS0JfcGFkRW50ZXIifSwKKyAgICB7S0JfcGFkTWludXMgICAgICAgICAgICAsIktCX3BhZE1pbnVzIn0sCisgICAge0tCX3BhZFBsdXMgICAgICAgICAgICAgLCJLQl9wYWRQbHVzIn0sCisgICAge0tCX3BhZFRpbWVzICAgICAgICAgICAgLCJLQl9wYWRUaW1lcyJ9LAorICAgIHtLQl9wYWREaXZpZGUgICAgICAgICAgICwiS0JfcGFkRGl2aWRlIn0sCisgICAge0tCX3BhZExlZnQgICAgICAgICAgICAgLCJLQl9wYWRMZWZ0In0sCisgICAge0tCX3BhZFJpZ2h0ICAgICAgICAgICAgLCJLQl9wYWRSaWdodCJ9LAorICAgIHtLQl9wYWRVcCAgICAgICAgICAgICAgICwiS0JfcGFkVXAifSwKKyAgICB7S0JfcGFkRG93biAgICAgICAgICAgICAsIktCX3BhZERvd24ifSwKKyAgICB7S0JfcGFkSW5zZXJ0ICAgICAgICAgICAsIktCX3BhZEluc2VydCJ9LAorICAgIHtLQl9wYWREZWxldGUgICAgICAgICAgICwiS0JfcGFkRGVsZXRlIn0sCisgICAge0tCX3BhZEhvbWUgICAgICAgICAgICAgLCJLQl9wYWRIb21lIn0sCisgICAge0tCX3BhZEVuZCAgICAgICAgICAgICAgLCJLQl9wYWRFbmQifSwKKyAgICB7S0JfcGFkUGFnZVVwICAgICAgICAgICAsIktCX3BhZFBhZ2VVcCJ9LAorICAgIHtLQl9wYWRQYWdlRG93biAgICAgICAgICwiS0JfcGFkUGFnZURvd24ifSwKKyAgICB7S0JfcGFkQ2VudGVyICAgICAgICAgICAsIktCX3BhZENlbnRlciJ9LAorICAgIHtLQl9GMSAgICAgICAgICAgICAgICAgICwiS0JfRjEifSwKKyAgICB7S0JfRjIgICAgICAgICAgICAgICAgICAsIktCX0YyIn0sCisgICAge0tCX0YzICAgICAgICAgICAgICAgICAgLCJLQl9GMyJ9LAorICAgIHtLQl9GNCAgICAgICAgICAgICAgICAgICwiS0JfRjQifSwKKyAgICB7S0JfRjUgICAgICAgICAgICAgICAgICAsIktCX0Y1In0sCisgICAge0tCX0Y2ICAgICAgICAgICAgICAgICAgLCJLQl9GNiJ9LAorICAgIHtLQl9GNyAgICAgICAgICAgICAgICAgICwiS0JfRjcifSwKKyAgICB7S0JfRjggICAgICAgICAgICAgICAgICAsIktCX0Y4In0sCisgICAge0tCX0Y5ICAgICAgICAgICAgICAgICAgLCJLQl9GOSJ9LAorICAgIHtLQl9GMTAgICAgICAgICAgICAgICAgICwiS0JfRjEwIn0sCisgICAge0tCX0YxMSAgICAgICAgICAgICAgICAgLCJLQl9GMTEifSwKKyAgICB7S0JfRjEyICAgICAgICAgICAgICAgICAsIktCX0YxMiJ9LAorICAgIHtLQl9sZWZ0ICAgICAgICAgICAgICAgICwiS0JfbGVmdCJ9LAorICAgIHtLQl9yaWdodCAgICAgICAgICAgICAgICwiS0JfcmlnaHQifSwKKyAgICB7S0JfdXAgICAgICAgICAgICAgICAgICAsIktCX3VwIn0sCisgICAge0tCX2Rvd24gICAgICAgICAgICAgICAgLCJLQl9kb3duIn0sCisgICAge0tCX2luc2VydCAgICAgICAgICAgICAgLCJLQl9pbnNlcnQifSwKKyAgICB7S0JfZGVsZXRlICAgICAgICAgICAgICAsIktCX2RlbGV0ZSJ9LAorICAgIHtLQl9ob21lICAgICAgICAgICAgICAgICwiS0JfaG9tZSJ9LAorICAgIHtLQl9lbmQgICAgICAgICAgICAgICAgICwiS0JfZW5kIn0sCisgICAge0tCX3BhZ2VVcCAgICAgICAgICAgICAgLCJLQl9wYWdlVXAifSwKKyAgICB7S0JfcGFnZURvd24gICAgICAgICAgICAsIktCX3BhZ2VEb3duIn0sCisgICAge0tCX2NhcHNMb2NrICAgICAgICAgICAgLCJLQl9jYXBzTG9jayJ9LAorICAgIHtLQl9udW1Mb2NrICAgICAgICAgICAgICwiS0JfbnVtTG9jayJ9LAorICAgIHtLQl9zY3JvbGxMb2NrICAgICAgICAgICwiS0Jfc2Nyb2xsTG9jayJ9LAorICAgIHtLQl9sZWZ0U2hpZnQgICAgICAgICAgICwiS0JfbGVmdFNoaWZ0In0sCisgICAge0tCX3JpZ2h0U2hpZnQgICAgICAgICAgLCJLQl9yaWdodFNoaWZ0In0sCisgICAge0tCX2xlZnRDdHJsICAgICAgICAgICAgLCJLQl9sZWZ0Q3RybCJ9LAorICAgIHtLQl9yaWdodEN0cmwgICAgICAgICAgICwiS0JfcmlnaHRDdHJsIn0sCisgICAge0tCX2xlZnRBbHQgICAgICAgICAgICAgLCJLQl9sZWZ0QWx0In0sCisgICAge0tCX3JpZ2h0QWx0ICAgICAgICAgICAgLCJLQl9yaWdodEFsdCJ9LAorICAgIHtLQl9sZWZ0V2luZG93cyAgICAgICAgICwiS0JfbGVmdFdpbmRvd3MifSwKKyAgICB7S0JfcmlnaHRXaW5kb3dzICAgICAgICAsIktCX3JpZ2h0V2luZG93cyJ9LAorICAgIHtLQl9tZW51ICAgICAgICAgICAgICAgICwiS0JfbWVudSJ9LAorICAgIHtLQl9zeXNSZXEgICAgICAgICAgICAgICwiS0Jfc3lzUmVxIn0sCisgICAge0tCX2VzYyAgICAgICAgICAgICAgICAgLCJLQl9lc2MifSwKKyAgICB7S0JfMSAgICAgICAgICAgICAgICAgICAsIktCXzEifSwKKyAgICB7S0JfMiAgICAgICAgICAgICAgICAgICAsIktCXzIifSwKKyAgICB7S0JfMyAgICAgICAgICAgICAgICAgICAsIktCXzMifSwKKyAgICB7S0JfNCAgICAgICAgICAgICAgICAgICAsIktCXzQifSwKKyAgICB7S0JfNSAgICAgICAgICAgICAgICAgICAsIktCXzUifSwKKyAgICB7S0JfNiAgICAgICAgICAgICAgICAgICAsIktCXzYifSwKKyAgICB7S0JfNyAgICAgICAgICAgICAgICAgICAsIktCXzcifSwKKyAgICB7S0JfOCAgICAgICAgICAgICAgICAgICAsIktCXzgifSwKKyAgICB7S0JfOSAgICAgICAgICAgICAgICAgICAsIktCXzkifSwKKyAgICB7S0JfMCAgICAgICAgICAgICAgICAgICAsIktCXzAifSwKKyAgICB7S0JfbWludXMgICAgICAgICAgICAgICAsIktCX21pbnVzIn0sCisgICAge0tCX2VxdWFscyAgICAgICAgICAgICAgLCJLQl9lcXVhbHMifSwKKyAgICB7S0JfYmFja1NsYXNoICAgICAgICAgICAsIktCX2JhY2tTbGFzaCJ9LAorICAgIHtLQl9iYWNrc3BhY2UgICAgICAgICAgICwiS0JfYmFja3NwYWNlIn0sCisgICAge0tCX3RhYiAgICAgICAgICAgICAgICAgLCJLQl90YWIifSwKKyAgICB7S0JfUSAgICAgICAgICAgICAgICAgICAsIktCX1EifSwKKyAgICB7S0JfVyAgICAgICAgICAgICAgICAgICAsIktCX1cifSwKKyAgICB7S0JfRSAgICAgICAgICAgICAgICAgICAsIktCX0UifSwKKyAgICB7S0JfUiAgICAgICAgICAgICAgICAgICAsIktCX1IifSwKKyAgICB7S0JfVCAgICAgICAgICAgICAgICAgICAsIktCX1QifSwKKyAgICB7S0JfWSAgICAgICAgICAgICAgICAgICAsIktCX1kifSwKKyAgICB7S0JfVSAgICAgICAgICAgICAgICAgICAsIktCX1UifSwKKyAgICB7S0JfSSAgICAgICAgICAgICAgICAgICAsIktCX0kifSwKKyAgICB7S0JfTyAgICAgICAgICAgICAgICAgICAsIktCX08ifSwKKyAgICB7S0JfUCAgICAgICAgICAgICAgICAgICAsIktCX1AifSwKKyAgICB7S0JfbGVmdFNxdWFyZUJyYWNlICAgICAsIktCX2xlZnRTcXVhcmVCcmFjZSJ9LAorICAgIHtLQl9yaWdodFNxdWFyZUJyYWNlICAgICwiS0JfcmlnaHRTcXVhcmVCcmFjZSJ9LAorICAgIHtLQl9lbnRlciAgICAgICAgICAgICAgICwiS0JfZW50ZXIifSwKKyAgICB7S0JfQSAgICAgICAgICAgICAgICAgICAsIktCX0EifSwKKyAgICB7S0JfUyAgICAgICAgICAgICAgICAgICAsIktCX1MifSwKKyAgICB7S0JfRCAgICAgICAgICAgICAgICAgICAsIktCX0QifSwKKyAgICB7S0JfRiAgICAgICAgICAgICAgICAgICAsIktCX0YifSwKKyAgICB7S0JfRyAgICAgICAgICAgICAgICAgICAsIktCX0cifSwKKyAgICB7S0JfSCAgICAgICAgICAgICAgICAgICAsIktCX0gifSwKKyAgICB7S0JfSiAgICAgICAgICAgICAgICAgICAsIktCX0oifSwKKyAgICB7S0JfSyAgICAgICAgICAgICAgICAgICAsIktCX0sifSwKKyAgICB7S0JfTCAgICAgICAgICAgICAgICAgICAsIktCX0wifSwKKyAgICB7S0Jfc2VtaWNvbG9uICAgICAgICAgICAsIktCX3NlbWljb2xvbiJ9LAorICAgIHtLQl9hcG9zdHJvcGhlICAgICAgICAgICwiS0JfYXBvc3Ryb3BoZSJ9LAorICAgIHtLQl9aICAgICAgICAgICAgICAgICAgICwiS0JfWiJ9LAorICAgIHtLQl9YICAgICAgICAgICAgICAgICAgICwiS0JfWCJ9LAorICAgIHtLQl9DICAgICAgICAgICAgICAgICAgICwiS0JfQyJ9LAorICAgIHtLQl9WICAgICAgICAgICAgICAgICAgICwiS0JfViJ9LAorICAgIHtLQl9CICAgICAgICAgICAgICAgICAgICwiS0JfQiJ9LAorICAgIHtLQl9OICAgICAgICAgICAgICAgICAgICwiS0JfTiJ9LAorICAgIHtLQl9NICAgICAgICAgICAgICAgICAgICwiS0JfTSJ9LAorICAgIHtLQl9jb21tYSAgICAgICAgICAgICAgICwiS0JfY29tbWEifSwKKyAgICB7S0JfcGVyaW9kICAgICAgICAgICAgICAsIktCX3BlcmlvZCJ9LAorICAgIHtLQl9kaXZpZGUgICAgICAgICAgICAgICwiS0JfZGl2aWRlIn0sCisgICAge0tCX3NwYWNlICAgICAgICAgICAgICAgLCJLQl9zcGFjZSJ9LAorICAgIHtLQl90aWxkZSAgICAgICAgICAgICAgICwiS0JfdGlsZGUifSwKKyAgICB7MCAgICAgICAgICAgICAgICAgICAgICAsIktCX3Vua25vd24ifSwKKyAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3ggICAtIFggY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIChzY3JlZW4gY29vcmRpbmF0ZXMpCit5ICAgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBwb3NpdGlvbiAoc2NyZWVuIGNvb3JkaW5hdGVzKQorCitSRU1BUktTOgorVGhpcyBnZXRzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gbW92ZSB0aGUgbW91c2UuIEl0IHdpbGwgZ2V0IGNhbGxlZCB3aGVuCit0aGUgbW91c2UgbWF5IG5vdCBoYXZlIGFjdHVhbGx5IG1vdmVkLCBzbyBjaGVjayBpZiBpdCBoYXMgYmVmb3JlIHJlZHJhd2luZworaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgbW92ZU1vdXNlKAorICAgIGludCB4LAorICAgIGludCB5KQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2NvZGUgICAgLSBDb2RlIHRvIHRyYW5zbGF0ZQora2V5cyAgICAtIFRhYmxlIG9mIHRyYW5zbGF0aW9uIGtleSB2YWx1ZXMgdG8gbG9vayB1cAorCitSRU1BUktTOgorU2ltcGxlIGZ1bmN0aW9uIHRvIGxvb2sgdXAgdGhlIHByaW50YWJsZSBuYW1lIGZvciB0aGUga2V5Ym9hcmQgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitLZXlFbnRyeSAqRmluZEtleSgKKyAgICBpbnQgY29kZSwKKyAgICBLZXlFbnRyeSAqa2V5cykKK3sKKyAgICBLZXlFbnRyeSAgICAqa2V5OworCisgICAgZm9yIChrZXkgPSBrZXlzOyBrZXktPmNvZGUgIT0gMDsga2V5KyspIHsKKyAgICAgICAgaWYgKGtleS0+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICByZXR1cm4ga2V5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2V2dCAtIEV2ZW50IHRvIGRpc3BsYXkgbW9kaWZpZXJzIGZvcgorCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGlzcGxheSBzaGlmdCBtb2RpZmllcnMgZmxhZ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIERpc3BsYXlNb2RpZmllcnMoCisgICAgZXZlbnRfdCAqZXZ0KQoreworICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9MRUZUQlVUKQorICAgICAgICBwcmludGYoIiwgTEJVVCIpOworICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVEJVVCkKKyAgICAgICAgcHJpbnRmKCIsIFJCVVQiKTsKKyAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTUlERExFQlVUKQorICAgICAgICBwcmludGYoIiwgTUJVVCIpOworICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkgeworICAgICAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVFNISUZUKQorICAgICAgICAgICAgcHJpbnRmKCIsIExTSElGVCIpOworICAgICAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfUklHSFRTSElGVCkKKyAgICAgICAgICAgIHByaW50ZigiLCBSU0hJRlQiKTsKKyAgICAgICAgfQorICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9DVFJMU1RBVEUpIHsKKyAgICAgICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0xFRlRDVFJMKQorICAgICAgICAgICAgcHJpbnRmKCIsIExDVFJMIik7CisgICAgICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVENUUkwpCisgICAgICAgICAgICBwcmludGYoIiwgUkNUUkwiKTsKKyAgICAgICAgfQorICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkgeworICAgICAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVEFMVCkKKyAgICAgICAgICAgIHByaW50ZigiLCBMQUxUIik7CisgICAgICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVEFMVCkKKyAgICAgICAgICAgIHByaW50ZigiLCBSQUxUIik7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittc2cgLSBNZXNzYWdlIHRvIGRpc3BsYXkgZm9yIHR5cGUgb2YgZXZlbnQKK2V2dCAtIEV2ZW50IHRvIGRpc3BsYXkKKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHN0YXR1cyBvZiB0aGUga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIHNjcmVlbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIERpc3BsYXlLZXkoCisgICAgY2hhciAqbXNnLAorICAgIGV2ZW50X3QgKmV2dCkKK3sKKyAgICBLZXlFbnRyeSAgICAqYXNjaWksKnNjYW47CisgICAgY2hhciAgICAgICAgY2ggPSBFVlRfYXNjaWlDb2RlKGV2dC0+bWVzc2FnZSk7CisKKyAgICBhc2NpaSA9IEZpbmRLZXkoY2gsQVNDSUlDb2Rlcyk7CisgICAgc2NhbiA9IEZpbmRLZXkoRVZUX3NjYW5Db2RlKGV2dC0+bWVzc2FnZSksU2NhbkNvZGVzKTsKKyAgICBwcmludGYoIiVzOiAweCUwNFggLT4gJXMsICVzLCAnJWMnIiwKKyAgICAgICAgbXNnLCAoaW50KWV2dC0+bWVzc2FnZSAmIDB4RkZGRiwgc2Nhbi0+bmFtZSwgYXNjaWktPm5hbWUsIGlzcHJpbnQoY2gpID8gY2ggOiAnICcpOworICAgIERpc3BsYXlNb2RpZmllcnMoZXZ0KTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbXNnIC0gTWVzc2FnZSB0byBkaXNwbGF5IGZvciB0eXBlIG9mIGV2ZW50CitldnQgLSBFdmVudCB0byBkaXNwbGF5CisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzdGF0dXMgb2YgdGhlIG1vdXNlIGV2ZW50IHRvIHRoZSBzY3JlZW4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBEaXNwbGF5TW91c2UoCisgICAgY2hhciAqbXNnLAorICAgIGV2ZW50X3QgKmV2dCkKK3sKKyAgICBwcmludGYoIiVzOiAiLCBtc2cpOworICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfTEVGVEJNQVNLKQorICAgICAgICBwcmludGYoIkxFRlQgIik7CisgICAgaWYgKGV2dC0+bWVzc2FnZSAmIEVWVF9SSUdIVEJNQVNLKQorICAgICAgICBwcmludGYoIlJJR0hUICIpOworICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfTUlERExFQk1BU0spCisgICAgICAgIHByaW50ZigiTUlERExFICIpOworICAgIHByaW50ZigiYWJzKCVkLCVkKSwgcmVsKCVkLCVkKSIsIGV2dC0+d2hlcmVfeCwgZXZ0LT53aGVyZV95LCBldnQtPnJlbGF0aXZlX3gsIGV2dC0+cmVsYXRpdmVfeSk7CisgICAgRGlzcGxheU1vZGlmaWVycyhldnQpOworICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfREJMQ0xJQ0spCisgICAgICAgIHByaW50ZigiLCBEQkxDTElDSyIpOworICAgIHByaW50ZigiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittc2cgLSBNZXNzYWdlIHRvIGRpc3BsYXkgZm9yIHR5cGUgb2YgZXZlbnQKK2V2dCAtIEV2ZW50IHRvIGRpc3BsYXkKKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHN0YXR1cyBvZiB0aGUgam95c3RpY2sgZXZlbnQgdG8gdGhlIHNjcmVlbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIERpc3BsYXlKb3koCisgICAgY2hhciAqbXNnLAorICAgIGV2ZW50X3QgKmV2dCkKK3sKKyAgICBwcmludGYoIiVzOiBKb3kxKCU0ZCwlNGQsJWMlYyksIEpveTIoJTRkLCU0ZCwlYyVjKVxuIiwgbXNnLAorICAgICAgICBldnQtPndoZXJlX3gsZXZ0LT53aGVyZV95LAorICAgICAgICAoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTFfQlVUVE9OQSkgPyAnQScgOiAnYScsCisgICAgICAgIChldnQtPm1lc3NhZ2UgJiBFVlRfSk9ZMV9CVVRUT05CKSA/ICdCJyA6ICdiJywKKyAgICAgICAgZXZ0LT5yZWxhdGl2ZV94LGV2dC0+cmVsYXRpdmVfeSwKKyAgICAgICAgKGV2dC0+bWVzc2FnZSAmIEVWVF9KT1kyX0JVVFRPTkEpID8gJ0EnIDogJ2EnLAorICAgICAgICAoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTJfQlVUVE9OQikgPyAnQicgOiAnYicpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0pveXN0aWNrIGNhbGlicmF0aW9uIHJvdXRpbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIENhbGlicmF0ZUpveSh2b2lkKQoreworICBldmVudF90IGV2dDsKKyAgaWYoRVZUX2pveUlzUHJlc2VudCgpKXsKKyAgICBwcmludGYoIkpveXN0aWNrIENhbGlicmF0aW9uXG5Nb3ZlIHRoZSBqb3lzdGljayB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgYW5kIHByZXNzIGFueSBidXR0b24uXG4iKTsKKyAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOworICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7CisgICAgRVZUX2pveVNldFVwcGVyTGVmdCgpOworICAgIHByaW50ZigiTW92ZSB0aGUgam95c3RpY2sgdG8gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBhbmQgcHJlc3MgYW55IGJ1dHRvbi5cbiIpOworICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7CisgICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKKyAgICBFVlRfam95U2V0TG93ZXJSaWdodCgpOworICAgIHByaW50ZigiTW92ZSB0aGUgam95c3RpY2sgdG8gY2VudGVyIHBvc2l0aW9uIGFuZCBwcmVzcyBhbnkgYnV0dG9uLlxuIik7CisgICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKKyAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOworICAgIEVWVF9qb3lTZXRDZW50ZXIoKTsKKyAgICBwcmludGYoIkpveXN0aWNrIGNhbGlicmF0ZWRcbiIpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1haW4odm9pZCkKK3sKKyAgICBldmVudF90ICAgICBldnQ7CisgICAgaWJvb2wgICAgICAgZG9uZSA9IGZhbHNlOworICAgIFBNX0hXTkQgICAgIGh3bmRDb25zb2xlOworCisgICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7CisgICAgRVZUX2luaXQoJm1vdmVNb3VzZSk7CisgICAgRVZUX3NldE1vdXNlUmFuZ2UoMTAyNCw3NjgpOworICAgIENhbGlicmF0ZUpveSgpOworICAgIGRvIHsKKyAgICAgICAgRVZUX3BvbGxKb3lzdGljaygpOworICAgICAgICBpZiAoRVZUX2dldE5leHQoJmV2dCxFVlRfRVZFUllFVlQpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBFVlRfS0VZRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgRGlzcGxheUtleSgiRVZUX0tFWURPV04gICIsICZldnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoRVZUX3NjYW5Db2RlKGV2dC5tZXNzYWdlKSA9PSBLQl9lc2MpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFVlRfS0VZUkVQRUFUOgorICAgICAgICAgICAgICAgICAgICBEaXNwbGF5S2V5KCJFVlRfS0VZUkVQRUFUIiwgJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZUX0tFWVVQOgorICAgICAgICAgICAgICAgICAgICBEaXNwbGF5S2V5KCJFVlRfS0VZVVAgICAgIiwgJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZUX01PVVNFRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VET1dOIiwgJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZUX01PVVNFQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VBVVRPIiwgJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZUX01PVVNFVVA6CisgICAgICAgICAgICAgICAgICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFVVAgICIsICZldnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVWVF9NT1VTRU1PVkU6CisgICAgICAgICAgICAgICAgICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFTU9WRSIsICZldnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVWVF9KT1lDTElDSzoKKyAgICAgICAgICAgICAgICAgICAgRGlzcGxheUpveSgiRVZUX0pPWUNMSUNLICIsICZldnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVWVF9KT1lNT1ZFOgorICAgICAgICAgICAgICAgICAgICBEaXNwbGF5Sm95KCJFVlRfSk9ZTU9WRSAgIiwgJmV2dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIWRvbmUpOworICAgIEVWVF9leGl0KCk7CisgICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2lzdmVzYS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvaXN2ZXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2lzdmVzYS5jCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gYWxsb2NhdGUgcmVhbCBtb2RlCisqICAgICAgICAgICAgICAgbWVtb3J5IGFuZCB0byBjYWxsIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlcnMgc3VjaCBhcworKiAgICAgICAgICAgICAgIHRoZSBWRVNBIFZCRSBCSU9TIGZyb20gcHJvdGVjdGVkIG1vZGUuIENvbXBpbGUgYW5kIGxpbmsKKyogICAgICAgICAgICAgICB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgorKgorKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fZ2V0VkVTQUJ1ZigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9tYXBSZWFsUG9pbnRlcigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9pbnQ4NngoKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworLyogU3VwZXJWR0EgaW5mb3JtYXRpb24gYmxvY2sgKi8KKworI3ByYWdtYSBwYWNrKDEpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgIFZFU0FTaWduYXR1cmVbNF07ICAgICAgIC8qICdWRVNBJyA0IGJ5dGUgc2lnbmF0dXJlICAgICAgICAgICovCisgICAgc2hvcnQgICBWRVNBVmVyc2lvbjsgICAgICAgICAgICAvKiBWQkUgdmVyc2lvbiBudW1iZXIgICAgICAgICAgICAgICAqLworICAgIHVsb25nICAgT0VNU3RyaW5nUHRyOyAgICAgICAgICAgLyogRmFyIHBvaW50ZXIgdG8gT0VNIHN0cmluZyAgICAgICAgKi8KKyAgICB1bG9uZyAgIENhcGFiaWxpdGllczsgICAgICAgICAgIC8qIENhcGFiaWxpdGllcyBvZiB2aWRlbyBjYXJkICAgICAgICovCisgICAgdWxvbmcgICBWaWRlb01vZGVQdHI7ICAgICAgICAgICAvKiBGYXIgcG9pbnRlciB0byBzdXBwb3J0ZWQgbW9kZXMgICAqLworICAgIHNob3J0ICAgVG90YWxNZW1vcnk7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIDY0a2IgbWVtb3J5IGJsb2NrcyAgICAgKi8KKyAgICBjaGFyICAgIHJlc2VydmVkWzIzNl07ICAgICAgICAgIC8qIFBhZCB0byAyNTYgYnl0ZSBibG9jayBzaXplICAgICAgICovCisgICAgfSBWZ2FJbmZvQmxvY2s7CisKKyNwcmFnbWEgcGFjaygpCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgUk1SRUdTICAgICAgICAgIHJlZ3M7CisgICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOworICAgIFZnYUluZm9CbG9jayAgICB2Z2FJbmZvOworICAgIHVzaG9ydCAgICAgICAgICAqbW9kZTsKKyAgICB1aW50ICAgICAgICAgICAgdmdMZW47CisgICAgdWNoYXIgICAgICAgICAgICp2Z1B0cjsKKyAgICB1bnNpZ25lZCAgICAgICAgcl92Z3NlZyxyX3Znb2ZmOworCisgICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7CisgICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUE1fcmVhbE1vZGU6CisgICAgICAgICAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8yODY6CisgICAgICAgICAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8zODY6CisgICAgICAgICAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgLyogQWxsb2NhdGUgYSAyNTYgYnl0ZSBibG9jayBvZiByZWFsIG1lbW9yeSBmb3IgY29tbXVuaWNhdGluZyB3aXRoCisgICAgICogdGhlIFZFU0EgQklPUy4KKyAgICAgKi8KKyAgICBpZiAoKHZnUHRyID0gUE1fZ2V0VkVTQUJ1ZigmdmdMZW4sJnJfdmdzZWcsJnJfdmdvZmYpKSA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIFZFU0EgbWVtb3J5IGJ1ZmZlciFcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAvKiBDYWxsIHRoZSBWRVNBIFZCRSB0byBzZWUgaWYgaXQgaXMgb3V0IHRoZXJlICovCisgICAgcmVncy54LmF4ID0gMHg0RjAwOworICAgIHJlZ3MueC5kaSA9IHJfdmdvZmY7CisgICAgc3JlZ3MuZXMgPSByX3Znc2VnOworICAgIG1lbWNweSh2Z1B0ciwiVkJFMiIsNCk7CisgICAgUE1faW50ODZ4KDB4MTAsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKKyAgICBtZW1jcHkoJnZnYUluZm8sdmdQdHIsc2l6ZW9mKFZnYUluZm9CbG9jaykpOworICAgIGlmIChyZWdzLnguYXggPT0gMHg0RiAmJiBzdHJuY21wKHZnYUluZm8uVkVTQVNpZ25hdHVyZSwiVkVTQSIsNCkgPT0gMCkgeworICAgICAgICBwcmludGYoIlZFU0EgVkJFIHZlcnNpb24gJWQuJWQgQklPUyBkZXRlY3RlZFxuXG4iLAorICAgICAgICAgICAgdmdhSW5mby5WRVNBVmVyc2lvbiA+PiA4LCB2Z2FJbmZvLlZFU0FWZXJzaW9uICYgMHhGKTsKKyAgICAgICAgcHJpbnRmKCJBdmFpbGFibGUgdmlkZW8gbW9kZXM6XG4iKTsKKyAgICAgICAgbW9kZSA9IFBNX21hcFJlYWxQb2ludGVyKHZnYUluZm8uVmlkZW9Nb2RlUHRyID4+IDE2LCB2Z2FJbmZvLlZpZGVvTW9kZVB0ciAmIDB4RkZGRik7CisgICAgICAgIHdoaWxlICgqbW9kZSAhPSAweEZGRkYpIHsKKyAgICAgICAgICAgIHByaW50ZigiICAgICUwNGhYaCAoJTA4WClcbiIsICptb2RlLCAoaW50KW1vZGUpOworICAgICAgICAgICAgbW9kZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoIlZFU0EgVkJFIG5vdCBmb3VuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODlmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkuYwpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKKyogICAgICAgICAgICAgICBrZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlci4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldEtleUhhbmRsZXIoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY2hhaW5QcmV2S2V5KCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKCkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3ZvbGF0aWxlIGxvbmcgY291bnQgPSAwOworCisjcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLworCit2b2lkIFBNQVBJIGtleUhhbmRsZXIodm9pZCkKK3sKKyAgICBjb3VudCsrOworICAgIFBNX2NoYWluUHJldktleSgpOyAgLyogQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlciAgICAqLworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBjaDsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7CisKKyAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKKyAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQTV9yZWFsTW9kZToKKyAgICAgICAgICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzI4NjoKKyAgICAgICAgICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzM4NjoKKyAgICAgICAgICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcworICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKKyAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCisgICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgorICAgICAqLworICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOworICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVha3MhICovCisgICAgUE1fc2V0S2V5SGFuZGxlcihrZXlIYW5kbGVyKTsKKyAgICBwcmludGYoIktleWJvYXJkIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZCAtIFR5cGUgc29tZSBjaGFyYWN0ZXJzIGFuZFxuIik7CisgICAgcHJpbnRmKCJoaXQgRVNDIHRvIGV4aXRcbiIpOworICAgIHdoaWxlICgoY2ggPSBQTV9nZXRjaCgpKSAhPSAweDFCKSB7CisgICAgICAgIHByaW50ZigiJWMiLCBjaCk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisKKyAgICBQTV9yZXN0b3JlS2V5SGFuZGxlcigpOworICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKKyAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpa2V5SGFuZGxlciwxMDAsJmxoKTsKKyAgICBwcmludGYoIlxuXG5LZXlib2FyZCBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkxNS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5MTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBkMjdhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5MTUuYwpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKKyogICAgICAgICAgICAgICBrZXlib2FyZCBJbnQgMTVoIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGlzIGFuIGFsdGVybmF0ZQorKiAgICAgICAgICAgICAgIHdheSB0byBpbnRlcmNlcHQgc2NhbmNvZGVzIGZyb20gdGhlIGtleWJvYXJkIGJ5IGhvb2tpbmcKKyogICAgICAgICAgICAgICB0aGUgSW50IDE1aCBrZXlib2FyZCBpbnRlcmNlcHQgY2FsbG91dC4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldEtleTE1SGFuZGxlcigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKCkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3ZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwordm9sYXRpbGUgc2hvcnQgbGFzdFNjYW5Db2RlID0gMDsKKworI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KKworc2hvcnQgUE1BUEkga2V5SGFuZGxlcihzaG9ydCBzY2FuQ29kZSkKK3sKKyAgICBjb3VudCsrOworICAgIGxhc3RTY2FuQ29kZSA9IHNjYW5Db2RlOworICAgIHJldHVybiBzY2FuQ29kZTsgICAgICAgICAgICAvKiBMZXQgQklPUyBwcm9jZXNzIGFzIG5vcm1hbCAqLworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBjaDsKKyAgICBQTV9sb2NrSGFuZGxlICAgbGg7CisKKyAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKKyAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQTV9yZWFsTW9kZToKKyAgICAgICAgICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzI4NjoKKyAgICAgICAgICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNXzM4NjoKKyAgICAgICAgICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcworICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKKyAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCisgICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgorICAgICAqLworICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOworICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAvKiBXZSAqRE9OVCogd2FudCBDdHJsLUJyZWFrJ3MhICovCisgICAgUE1fc2V0S2V5MTVIYW5kbGVyKGtleUhhbmRsZXIpOworICAgIHByaW50ZigiS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gVHlwZSBzb21lIGNoYXJhY3RlcnMgYW5kXG4iKTsKKyAgICBwcmludGYoImhpdCBFU0MgdG8gZXhpdFxuIik7CisgICAgd2hpbGUgKChjaCA9IFBNX2dldGNoKCkpICE9IDB4MUIpIHsKKyAgICAgICAgcHJpbnRmKCIlYyIsIGNoKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIH0KKworICAgIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIoKTsKKyAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7CisgICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOworICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKWtleUhhbmRsZXIsMTAwLCZsaCk7CisgICAgcHJpbnRmKCJcblxuS2V5Ym9hcmQgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOworICAgIHByaW50ZigiTGFzdCBzY2FuIGNvZGUgJTA0WFxuIiwgbGFzdFNjYW5Db2RlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21lbXRlc3QuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21lbXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFiZmIxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbWVtdGVzdC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gZGV0ZXJtaW5lIGp1c3QgaG93IG11Y2ggbWVtb3J5IGNhbiBiZQorKiAgICAgICAgICAgICAgIGFsbG9jYXRlZCB3aXRoIHRoZSBjb21waWxlciBpbiB1c2UuIENvbXBpbGUgYW5kIGxpbmsKKyogICAgICAgICAgICAgICB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgorKgorKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fbWFsbG9jKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgpCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworI2lmZGVmICBfXzE2QklUX18KKyNkZWZpbmUgTUFYQUxMT0MgICAgNjQKKyNlbHNlCisjZGVmaW5lIE1BWEFMTE9DICAgIDIwMDAKKyNlbmRpZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCAgICAgaTsKKyAgICB1bG9uZyAgIGFsbG9jczsKKyAgICB1bG9uZyAgIHBoeXNpY2FsLHRvdGFsOworICAgIGNoYXIgICAgKnAsKnBhW01BWEFMTE9DXTsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIHByaW50ZigiTWVtb3J5IGF2YWlsYWJsZSBhdCBzdGFydDpcbiIpOworICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgmcGh5c2ljYWwsJnRvdGFsKTsKKyAgICBwcmludGYoIiAgIFBoeXNpY2FsIG1lbW9yeTogICAgICAgICAgICVsZCBLYlxuIiwgcGh5c2ljYWwgLyAxMDI0KTsKKyAgICBwcmludGYoIiAgIFRvdGFsIChpbmNsdWRpbmcgdmlydHVhbCk6ICVsZCBLYlxuIiwgdG90YWwgLyAxMDI0KTsKKyAgICBwcmludGYoIlxuIik7CisgICAgZm9yIChhbGxvY3MgPSBpID0gMDsgaSA8IE1BWEFMTE9DOyBpKyspIHsKKyAgICAgICAgaWYgKChwYVtpXSA9IFBNX21hbGxvYygxMCoxMDI0KSkgIT0gMCkgeyAgICAvKiBpbiAxMGsgYmxvY2tzICAgICovCisgICAgICAgICAgICBwID0gcGFbYWxsb2NzXTsKKyAgICAgICAgICAgIG1lbXNldChwLCAwLCAxMCoxMDI0KTsgLyogdG91Y2ggZXZlcnkgYnl0ZSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICpwID0gJ3gnOyAgICAgICAgICAgLyogZG8gc29tZXRoaW5nLCBhbnl0aGluZyB3aXRoICAgICAgKi8KKyAgICAgICAgICAgIHBbMTAyM10gPSAneSc7ICAgICAgLyogdGhlIGFsbG9jYXRlZCBtZW1vcnkgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFsbG9jcysrOworICAgICAgICAgICAgcHJpbnRmKCJBbGxvY2F0ZWQgJWx1IGJ5dGVzXHIiLCAxMCooYWxsb2NzIDw8IDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGlmIChQTV9rYmhpdCgpICYmIChQTV9nZXRjaCgpID09IDB4MUIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIHByaW50ZigiXG5cbkFsbG9jYXRlZCB0b3RhbCBvZiAlbHUgYnl0ZXNcbiIsIDEwICogKGFsbG9jcyA8PCAxMCkpOworCisgICAgcHJpbnRmKCJcbk1lbW9yeSBhdmFpbGFibGUgYXQgZW5kOlxuIik7CisgICAgUE1fYXZhaWxhYmxlTWVtb3J5KCZwaHlzaWNhbCwmdG90YWwpOworICAgIHByaW50ZigiICAgUGh5c2ljYWwgbWVtb3J5OiAgICAgICAgICAgJWxkIEtiXG4iLCBwaHlzaWNhbCAvIDEwMjQpOworICAgIHByaW50ZigiICAgVG90YWwgKGluY2x1ZGluZyB2aXJ0dWFsKTogJWxkIEtiXG4iLCB0b3RhbCAvIDEwMjQpOworCisgICAgZm9yIChpID0gYWxsb2NzLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICBQTV9mcmVlKHBhW2ldKTsKKworICAgIHByaW50ZigiXG5NZW1vcnkgYXZhaWxhYmxlIGFmdGVyIGZyZWVpbmcgYWxsIGJsb2NrcyAobm90ZSB0aGF0IHVuZGVyIHByb3RlY3RlZCBtb2RlXG4iKTsKKyAgICBwcmludGYoInRoaXMgd2lsbCBtb3N0IGxpa2VseSBub3QgYmUgY29ycmVjdCBhZnRlciBmcmVlaW5nIGJsb2Nrcyk6XG5cbiIpOworICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgmcGh5c2ljYWwsJnRvdGFsKTsKKyAgICBwcmludGYoIiAgIFBoeXNpY2FsIG1lbW9yeTogICAgICAgICAgICVsZCBLYlxuIiwgcGh5c2ljYWwgLyAxMDI0KTsKKyAgICBwcmludGYoIiAgIFRvdGFsIChpbmNsdWRpbmcgdmlydHVhbCk6ICVsZCBLYlxuIiwgdG90YWwgLyAxMDI0KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbW91c2UuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21vdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MjY1MQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21vdXNlLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGFuIGFzc2VtYmx5CisqICAgICAgICAgICAgICAgbGFuZ3VhZ2UgbW91c2UgaW50ZXJydXB0IGhhbmRsZXIuIFdlIHVzZSBhc3NlbWJseSBsYW5ndWFnZQorKiAgICAgICAgICAgICAgIGFzIGl0IG11c3QgYmUgYSBmYXIgZnVuY3Rpb24gYW5kIHNob3VsZCBzd2FwIHRvIGEgbG9jYWwKKyogICAgICAgICAgICAgICAzMiBiaXQgc3RhY2sgaWYgaXQgaXMgZ29pbmcgdG8gY2FsbCBhbnkgQyBiYXNlZCBjb2RlICh3aGljaAorKiAgICAgICAgICAgICAgIHdlIGRvIGluIHRoaXMgZXhhbXBsZSkuCisqCisqICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsTW91c2VIYW5kbGVyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ludDg2KCkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3ZvbGF0aWxlIGxvbmcgY291bnQgPSAwOworCisjcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLworCit2b2lkIFBNQVBJIG1vdXNlSGFuZGxlcigKKyAgICB1aW50IG1hc2ssCisgICAgdWludCBidXRzdGF0ZSwKKyAgICBpbnQgeCwKKyAgICBpbnQgeSwKKyAgICBpbnQgbWlja2V5WCwKKyAgICBpbnQgbWlja2V5WSkKK3sKKyAgICBtYXNrID0gbWFzazsgICAgICAgICAgICAgICAgLyogV2UgZG9udCB1c2UgYW55IG9mIHRoZSBwYXJhbWV0ZXJzICAgICovCisgICAgYnV0c3RhdGUgPSBidXRzdGF0ZTsKKyAgICB4ID0geDsKKyAgICB5ID0geTsKKyAgICBtaWNrZXlYID0gbWlja2V5WDsKKyAgICBtaWNrZXlZID0gbWlja2V5WTsKKyAgICBjb3VudCsrOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIFJNUkVHUyAgICAgICAgICByZWdzOworICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIHJlZ3MueC5heCA9IDMzOyAgICAgLyogTW91c2UgZnVuY3Rpb24gMzMgLSBTb2Z0d2FyZSByZXNldCAgICAgICAqLworICAgIFBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOworICAgIGlmIChyZWdzLnguYnggPT0gMCkgeworICAgICAgICBwcmludGYoIk5vIG1vdXNlIGluc3RhbGxlZC5cbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAvKiBJbnN0YWxsIG91ciBtb3VzZSBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcworICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKKyAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCisgICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgorICAgICAqLworICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0ciltb3VzZUhhbmRsZXIsMTAwLCZsaCk7CisgICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKKyAgICBpZiAoIVBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsIG1vdXNlSGFuZGxlcikpIHsKKyAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gaW5zdGFsbCBtb3VzZSBoYW5kbGVyIVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICBwcmludGYoIk1vdXNlIGhhbmRsZXIgaW5zdGFsbGVkIC0gSGl0IGFueSBrZXkgdG8gZXhpdFxuIik7CisgICAgUE1fZ2V0Y2goKTsKKworICAgIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKKyAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpbW91c2VIYW5kbGVyLDEwMCwmbGgpOworICAgIHByaW50ZigiTW91c2UgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcmVzdG9yZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcmVzdG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDgwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9yZXN0b3JlLmMKQEAgLTAsMCArMSw4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgvUU5YCisqCisqIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byByZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlIHN0YXRlIGZyb20gYSBwcmV2aW91c2x5CisqICAgICAgICAgICAgICAgc2F2ZWQgc3RhdGUgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZCB3aGlsZSB0aGUgY29uc29sZQorKiAgICAgICAgICAgICAgIHdhcyBpbiBncmFwaGljcyBtb2RlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKwordm9pZCBzZXRWaWRlb01vZGUoaW50IG1vZGUpCit7CisgICAgUk1SRUdTIHI7CisKKyAgICByLnguYXggPSBtb2RlOworICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgUE1fSFdORCBod25kQ29uc29sZTsKKyAgICB1bG9uZyAgIHN0YXRlU2l6ZTsgICAgICAKKyAgICB2b2lkICAgICpzdGF0ZUJ1ZjsKKyAgICBGSUxFICAgICpmOworCisgICAgLyogV3JpdGUgdGhlIHNhdmVkIGNvbnNvbGUgc3RhdGUgYnVmZmVyIHRvIGRpc2sgKi8KKyAgICBpZiAoKGYgPSBmb3BlbigiL2V0Yy9wbXNhdmUuZGF0IiwicmIiKSkgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIlVuYWJsZSB0byBvcGVuIC9ldGMvcG1zYXZlLmRhdCBmb3IgcmVhZGluZyFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICBmcmVhZCgmc3RhdGVTaXplLDEsc2l6ZW9mKHN0YXRlU2l6ZSksZik7CisgICAgaWYgKHN0YXRlU2l6ZSAhPSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKCkpIHsKKyAgICAgICAgcHJpbnRmKCJTaXplIG1pc21hdGNoIGluIC9ldGMvcG1zYXZlLmRhdCFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICBpZiAoKHN0YXRlQnVmID0gUE1fbWFsbG9jKHN0YXRlU2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgY29uc29sZSBzdGF0ZSBidWZmZXIhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgZnJlYWQoc3RhdGVCdWYsMSxzdGF0ZVNpemUsZik7CisgICAgZmNsb3NlKGYpOworCisgICAgLyogT3BlbiB0aGUgY29uc29sZSAqLworICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOworCisgICAgLyogRm9yY2libHkgc2V0IDgweDI1IHRleHQgbW9kZSB1c2luZyB0aGUgQklPUyAqLworICAgIHNldFZpZGVvTW9kZSgweDMpOworICAgIAorICAgIC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGNvbnNvbGUgc3RhdGUgKi8KKyAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOworICAgIFBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7CisgICAgUE1fZnJlZShzdGF0ZUJ1Zik7CisgICAgcHJpbnRmKCJDb25zb2xlIHN0YXRlIHN1Y2Nlc3NmdWxseSByZXN0b3JlZCBmcm9tIC9ldGMvcG1zYXZlLmRhdFxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3J0Yy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjNmVhYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3J0Yy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAorKiAgICAgICAgICAgICAgIFJlYWwgVGltZSBDbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcigpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJwbWFwaS5oIgorCit2b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKKworI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KKwordm9pZCBQTUFQSSBSVENIYW5kbGVyKHZvaWQpCit7CisgICAgY291bnQrKzsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBsb25nICAgICAgICAgICAgb2xkQ291bnQ7CisgICAgUE1fbG9ja0hhbmRsZSAgIGxoOworCisgICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7CisgICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUE1fcmVhbE1vZGU6CisgICAgICAgICAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8yODY6CisgICAgICAgICAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8zODY6CisgICAgICAgICAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKKyAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCisgICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAorICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KKyAgICAgKi8KKyAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpUlRDSGFuZGxlciwxMDAsJmxoKTsKKyAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOworICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsgICAgICAgICAgIC8qIFdlICpET05UKiB3YW50IEN0cmwtQnJlYWtzISAqLworICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFJUQ0hhbmRsZXIsMTI4KTsKKyAgICBwcmludGYoIlJlYWxUaW1lQ2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gSGl0IEVTQyB0byBleGl0XG4iKTsKKyAgICBvbGRDb3VudCA9IGNvdW50OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChQTV9rYmhpdCgpICYmIChQTV9nZXRjaCgpID09IDB4MUIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb3VudCAhPSBvbGRDb3VudCkgeworICAgICAgICAgICAgcHJpbnRmKCJUaWNrLCBUb2NrOiAlbGRcbiIsIGNvdW50KTsKKyAgICAgICAgICAgIG9sZENvdW50ID0gY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcigpOworICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKKyAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpUlRDSGFuZGxlciwxMDAsJmxoKTsKKyAgICBwcmludGYoIlJlYWxUaW1lQ2xvY2sgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2F2ZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTY5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zYXZlLmMKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgTGludXgvUU5YCisqCisqIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byBzYXZlIHRoZSBjb25zb2xlIHN0YXRlIHN0YXRlIHNvIHRoYXQgaXQgY2FuCisqICAgICAgICAgICAgICAgYmUgbGF0ZXIgcmVzdG9yZWQgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZCB3aGlsZSB0aGUgY29uc29sZQorKiAgICAgICAgICAgICAgIHdhcyBpbiBncmFwaGljcyBtb2RlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlOworICAgIHVsb25nICAgc3RhdGVTaXplOyAgICAgIAorICAgIHZvaWQgICAgKnN0YXRlQnVmOworICAgIEZJTEUgICAgKmY7CisKKyAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzYXZlIGNvbnNvbGUgc3RhdGUgYW5kIHNhdmUgdGhlIHN0YXRlICovCisgICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7CisgICAgc3RhdGVTaXplID0gUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpOworICAgIGlmICgoc3RhdGVCdWYgPSBQTV9tYWxsb2Moc3RhdGVTaXplKSkgPT0gTlVMTCkgeworICAgICAgICBQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOworICAgICAgICBwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICBQTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOworICAgIAorICAgIC8qIFJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUgb24gZXhpdCAqLworICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7CisgICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKKyAgICAKKyAgICAvKiBXcml0ZSB0aGUgc2F2ZWQgY29uc29sZSBzdGF0ZSBidWZmZXIgdG8gZGlzayAqLworICAgIGlmICgoZiA9IGZvcGVuKCIvZXRjL3Btc2F2ZS5kYXQiLCJ3YiIpKSA9PSBOVUxMKQorICAgICAgICBwcmludGYoIlVuYWJsZSB0byBvcGVuIC9ldGMvcG1zYXZlL2RhdCBmb3Igd3JpdGluZyFcbiIpOworICAgIGVsc2UgeworICAgICAgICBmd3JpdGUoJnN0YXRlU2l6ZSwxLHNpemVvZihzdGF0ZVNpemUpLGYpOworICAgICAgICBmd3JpdGUoc3RhdGVCdWYsMSxzdGF0ZVNpemUsZik7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgcHJpbnRmKCJDb25zb2xlIHN0YXRlIHN1Y2Nlc3NmdWxseSBzYXZlZCB0byAvZXRjL3Btc2F2ZS5kYXRcbiIpOworICAgICAgICB9ICAgCisgICAgUE1fZnJlZShzdGF0ZUJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Nob3dwY2kuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Nob3dwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIyYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2hvd3BjaS5jCkBAIC0wLDAgKzEsMjUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gdGVzdCB0aGUgUENJIGxpYnJhcnkgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAicGNpbGliLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtUENJID0gLTE7CitzdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqUENJOworc3RhdGljIGludCAgICAgICAgICAgICAgKkJyaWRnZUluZGV4Oworc3RhdGljIGludCAgICAgICAgICAgICAgKkRldmljZUluZGV4Oworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtQnJpZGdlczsKK3N0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpBR1BCcmlkZ2UgPSBOVUxMOworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitFbnVtZXJhdGVzIHRoZSBQQ0kgYnVzIGFuZCBkdW1wcyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlCitsb2cgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBFbnVtZXJhdGVQQ0kodm9pZCkKK3sKKyAgICBpbnQgICAgICAgICAgICAgaSxpbmRleDsKKyAgICBQQ0lEZXZpY2VJbmZvICAgKmluZm87CisKKyAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgUENJIGJ1cyAoJWQgZGV2aWNlcywgJWQgZGlzcGxheSBkZXZpY2VzKVxuIiwKKyAgICAgICAgTnVtUENJLCBOdW1EZXZpY2VzKTsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKQorICAgICAgICBwcmludGYoIiAgRGlzcGxheSBkZXZpY2UgJWQgaXMgUENJIGRldmljZSAlZFxuIixpbmRleCxEZXZpY2VJbmRleFtpbmRleF0pOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIkJ1cyBTbG90IEZuYyBEZXZpY2VJRCAgU3ViU3lzdGVtIFJldiBDbGFzcyBJUlEgSW50IENtZFxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJTJkICAgJTJkICAlMmQgICUwNFg6JTA0WCAlMDRYOiUwNFggJTAyWCAgJTAyWDolMDJYICUwMlggICUwMlggICUwNFggICAiLAorICAgICAgICAgICAgUENJW2ldLnNsb3QucC5CdXMsCisgICAgICAgICAgICBQQ0lbaV0uc2xvdC5wLkRldmljZSwKKyAgICAgICAgICAgIFBDSVtpXS5zbG90LnAuRnVuY3Rpb24sCisgICAgICAgICAgICBQQ0lbaV0uVmVuZG9ySUQsCisgICAgICAgICAgICBQQ0lbaV0uRGV2aWNlSUQsCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1WZW5kb3JJRCwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbUlELAorICAgICAgICAgICAgUENJW2ldLlJldklELAorICAgICAgICAgICAgUENJW2ldLkJhc2VDbGFzcywKKyAgICAgICAgICAgIFBDSVtpXS5TdWJDbGFzcywKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkludGVycnVwdExpbmUsCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5JbnRlcnJ1cHRQaW4sCisgICAgICAgICAgICBQQ0lbaV0uQ29tbWFuZCk7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKKyAgICAgICAgICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiRGV2aWNlSUQgIFN0YXQgSWZjIENjaCBMYXQgSGRyIEJJU1RcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICBwcmludGYoIiUwNFg6JTA0WCAlMDRYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAgIiwKKyAgICAgICAgICAgIFBDSVtpXS5WZW5kb3JJRCwKKyAgICAgICAgICAgIFBDSVtpXS5EZXZpY2VJRCwKKyAgICAgICAgICAgIFBDSVtpXS5TdGF0dXMsCisgICAgICAgICAgICBQQ0lbaV0uSW50ZXJmYWNlLAorICAgICAgICAgICAgUENJW2ldLkNhY2hlTGluZVNpemUsCisgICAgICAgICAgICBQQ0lbaV0uTGF0ZW5jeVRpbWVyLAorICAgICAgICAgICAgUENJW2ldLkhlYWRlclR5cGUsCisgICAgICAgICAgICBQQ0lbaV0uQklTVCk7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKKyAgICAgICAgICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiRGV2aWNlSUQgIEJhc2UxMGggIEJhc2UxNGggIEJhc2UxOGggIEJhc2UxQ2ggIEJhc2UyMGggIEJhc2UyNGggIFJPTUJhc2VcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICBwcmludGYoIiUwNFg6JTA0WCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAiLAorICAgICAgICAgICAgUENJW2ldLlZlbmRvcklELAorICAgICAgICAgICAgUENJW2ldLkRldmljZUlELAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQsCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE4LAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxQywKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjAsCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczI0LAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuUk9NQmFzZUFkZHJlc3MpOworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA8IE51bURldmljZXMpCisgICAgICAgICAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIkRldmljZUlEICBCQVIxMExlbiBCQVIxNExlbiBCQVIxOExlbiBCQVIxQ0xlbiBCQVIyMExlbiBCQVIyNExlbiBST01MZW5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICBwcmludGYoIiUwNFg6JTA0WCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAiLAorICAgICAgICAgICAgUENJW2ldLlZlbmRvcklELAorICAgICAgICAgICAgUENJW2ldLkRldmljZUlELAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4sCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE4TGVuLAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxQ0xlbiwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjBMZW4sCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczI0TGVuLAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuUk9NQmFzZUFkZHJlc3NMZW4pOworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA8IE51bURldmljZXMpCisgICAgICAgICAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgJWQgYnJpZGdlIGRldmljZXNcbiIsTnVtQnJpZGdlcyk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiRGV2aWNlSUQgIFAjIFMjIEIjIElPQiAgSU9MICBNZW1CYXNlICBNZW1MaW1pdCBQcmVCYXNlICBQcmVMaW1pdCBDdHJsXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTnVtQnJpZGdlczsgaSsrKSB7CisgICAgICAgIGluZm8gPSAoUENJRGV2aWNlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtpXV07CisgICAgICAgIHByaW50ZigiJTA0WDolMDRYICUwMlggJTAyWCAlMDJYICUwNFggJTA0WCAlMDhYICUwOFggJTA4WCAlMDhYICUwNFhcbiIsCisgICAgICAgICAgICBpbmZvLT5WZW5kb3JJRCwKKyAgICAgICAgICAgIGluZm8tPkRldmljZUlELAorICAgICAgICAgICAgaW5mby0+dS50eXBlMS5QcmltYXJ5QnVzTnVtYmVyLAorICAgICAgICAgICAgaW5mby0+dS50eXBlMS5TZWNvbmRheUJ1c051bWJlciwKKyAgICAgICAgICAgIGluZm8tPnUudHlwZTEuU3Vib3JkaW5hdGVCdXNOdW1iZXIsCisgICAgICAgICAgICAoKHUxNilpbmZvLT51LnR5cGUxLklPQmFzZSA8PCA4KSAmIDB4RjAwMCwKKyAgICAgICAgICAgIGluZm8tPnUudHlwZTEuSU9MaW1pdCA/CisgICAgICAgICAgICAgICAgKCh1MTYpaW5mby0+dS50eXBlMS5JT0xpbWl0IDw8IDgpIHwgMHhGRkYgOiAwLAorICAgICAgICAgICAgKCh1MzIpaW5mby0+dS50eXBlMS5NZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCisgICAgICAgICAgICBpbmZvLT51LnR5cGUxLk1lbW9yeUxpbWl0ID8KKyAgICAgICAgICAgICAgICAoKHUzMilpbmZvLT51LnR5cGUxLk1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAorICAgICAgICAgICAgKCh1MzIpaW5mby0+dS50eXBlMS5QcmVmZXRjaGFibGVNZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCisgICAgICAgICAgICBpbmZvLT51LnR5cGUxLlByZWZldGNoYWJsZU1lbW9yeUxpbWl0ID8KKyAgICAgICAgICAgICAgICAoKHUzMilpbmZvLT51LnR5cGUxLlByZWZldGNoYWJsZU1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAorICAgICAgICAgICAgaW5mby0+dS50eXBlMS5CcmlkZ2VDb250cm9sKTsKKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitOdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKK1BDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBpLGo7CisgICAgUENJRGV2aWNlSW5mbyAgICppbmZvOworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsCisgICAgLy8gZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4KKyAgICBpZiAoTnVtUENJID09IC0xKSB7CisgICAgICAgIGlmICgoTnVtUENJID0gUENJX2dldE51bURldmljZXMoKSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUENJID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihQQ0lbMF0pKTsKKyAgICAgICAgQnJpZGdlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKEJyaWRnZUluZGV4WzBdKSk7CisgICAgICAgIERldmljZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihEZXZpY2VJbmRleFswXSkpOworICAgICAgICBpZiAoIVBDSSB8fCAhQnJpZGdlSW5kZXggfHwgIURldmljZUluZGV4KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspCisgICAgICAgICAgICBQQ0lbaV0uZHdTaXplID0gc2l6ZW9mKFBDSVtpXSk7CisgICAgICAgIGlmIChQQ0lfZW51bWVyYXRlKFBDSSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgYWxsIFBDSSBicmlkZ2UgZGV2aWNlcworICAgICAgICBmb3IgKGkgPSAwLE51bUJyaWRnZXMgPSAwLEJyaWRnZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICAgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykKKyAgICAgICAgICAgICAgICBCcmlkZ2VJbmRleFtOdW1CcmlkZ2VzKytdID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMKKyAgICAgICAgZm9yIChpID0gMCxOdW1EZXZpY2VzID0gMSxEZXZpY2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgeworICAgICAgICAgICAgICAgIGlmICgoUENJW2ldLkNvbW1hbmQgJiAweDMpID09IDB4MykKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5kZXhbMF0gPSBpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5kZXhbTnVtRGV2aWNlcysrXSA9IGk7CisgICAgICAgICAgICAgICAgaWYgKFBDSVtpXS5zbG90LnAuQnVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkKKyAgICAgICAgICAgICAgICAgICAgLy8gUENJIGJ1cywgc28gaXQgaXMgcHJvYmFibHkgYW4gQUdQIGRldmljZS4gRmluZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gQUdQIGJ1cyBkZXZpY2UgdGhhdCBjb250cm9scyB0aGF0IGJ1cyBzbyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbCBpdC4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE51bUJyaWRnZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChQQ0lEZXZpY2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2pdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT51LnR5cGUxLlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtpXS5zbG90LnAuQnVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdQQnJpZGdlID0gaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gRW51bWVyYXRlIGFsbCBQQ0kgYW5kIGJyaWRnZSBkZXZpY2VzIHRvIHN0YW5kYXJkIG91dHB1dAorICAgICAgICBFbnVtZXJhdGVQQ0koKTsKKyAgICAgICAgfQorICAgIHJldHVybiBOdW1EZXZpY2VzOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIC8vIEVudW1lcmF0ZSBhbGwgUENJIGRldmljZXMKKyAgICBQTV9pbml0KCk7CisgICAgaWYgKFBDSV9lbnVtZXJhdGVEZXZpY2VzKCkgPCAxKSB7CisgICAgICAgIHByaW50ZigiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpY2suYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEwMTRmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGljay5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAorKiAgICAgICAgICAgICAgIHRpbWVyIGludGVycnVwdCBoYW5kbGVyLgorKgorKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fc2V0VGltZXJIYW5kbGVyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2NoYWluUHJldlRpbWVyKCk7CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKCkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3ZvbGF0aWxlIGxvbmcgY291bnQgPSAwOworCisjcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLworCit2b2lkIFBNQVBJIHRpbWVySGFuZGxlcih2b2lkKQoreworICAgIFBNX2NoYWluUHJldlRpbWVyKCk7ICAgICAgICAvKiBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyICovCisgICAgY291bnQrKzsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBsb25nICAgICAgICAgICAgb2xkQ291bnQ7CisgICAgUE1fbG9ja0hhbmRsZSAgIGxoOworCisgICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7CisgICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUE1fcmVhbE1vZGU6CisgICAgICAgICAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8yODY6CisgICAgICAgICAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8zODY6CisgICAgICAgICAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKKyAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCisgICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAorICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KKyAgICAgKi8KKyAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpdGltZXJIYW5kbGVyLDEwMCwmbGgpOworICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVha3MhICovCisgICAgUE1fc2V0VGltZXJIYW5kbGVyKHRpbWVySGFuZGxlcik7CisgICAgcHJpbnRmKCJUaW1lciBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgLSBIaXQgRVNDIHRvIGV4aXRcbiIpOworICAgIG9sZENvdW50ID0gY291bnQ7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKFBNX2tiaGl0KCkgJiYgKFBNX2dldGNoKCkgPT0gMHgxQikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNvdW50ICE9IG9sZENvdW50KSB7CisgICAgICAgICAgICBwcmludGYoIlRpY2ssIFRvY2s6ICVsZFxuIiwgY291bnQpOworICAgICAgICAgICAgb2xkQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgUE1fcmVzdG9yZVRpbWVySGFuZGxlcigpOworICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKKyAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7CisgICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpdGltZXJIYW5kbGVyLDEwMCwmbGgpOworICAgIHByaW50ZigiVGltZXIgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWU5NWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjLmMKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgWmVuIFRpbWVyIExpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgInp0aW1lci5oIgorCisjZGVmaW5lIERFTEFZX1NFQ1MgIDEwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB0YWtlcyBhIGxvbmcgY291bnQgaW4gbWljcm9zZWNvbmRzIGFuZCBvdXRwdXRzCisgKiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IGluIHNlY29uZHMuIEl0IGNvdWxkIGJlIG1vZGlmaWVkIHRvCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RhdGljIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IHJhdGhlcgorICogdGhhbiBwcmludGluZyBpdCBvdXQuCisgKi8KKwordm9pZCBSZXBvcnRUaW1lKHVsb25nIGNvdW50KQoreworICAgIHVsb25nICAgc2VjczsKKworICAgIHNlY3MgPSBjb3VudCAvIDEwMDAwMDBMOworICAgIGNvdW50ID0gY291bnQgLSBzZWNzICogMTAwMDAwMEw7CisgICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlbHUuJTA2bHUgc2Vjb25kc1xuIixzZWNzLGNvdW50KTsKK30KKworaW50ICAgICBpLGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04gcmVnaXN0ZXIgdmFyaWFibGVzISAqLworCitpbnQgbWFpbih2b2lkKQoreworI2lmZGVmICBMT05HX1RFU1QKKyAgICB1bG9uZyAgIHN0YXJ0LGZpbmlzaDsKKyNlbmRpZgorCisgICAgcHJpbnRmKCJQcm9jZXNzb3IgdHlwZTogJWQgJWxkIE1IelxuIiwgQ1BVX2dldFByb2Nlc3NvclR5cGUoKSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkKHRydWUpKTsKKworICAgIFpUaW1lckluaXQoKTsKKworICAgIC8qIFRlc3QgdGhlIGxvbmcgcGVyaW9kIFplbiBUaW1lciAod2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93IGNvegorICAgICAqIGl0IHdvdWxkIHRha2UgdG9vb29vIGxvbmchKQorICAgICAqLworCisgICAgTFpUaW1lck9uKCk7CisgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQorICAgICAgICAgICAgaSA9IGk7CisgICAgTFpUaW1lck9mZigpOworICAgIFJlcG9ydFRpbWUoTFpUaW1lckNvdW50KCkpOworCisgICAgLyogVGVzdCB0aGUgdWx0cmEgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICovCisjaWZkZWYgTE9OR19URVNUCisgICAgc3RhcnQgPSBVTFpSZWFkVGltZSgpOworICAgIGRlbGF5KERFTEFZX1NFQ1MgKiAxMDAwKTsKKyAgICBmaW5pc2ggPSBVTFpSZWFkVGltZSgpOworICAgIHByaW50ZigiRGVsYXkgb2YgJWQgc2VjcyB0b29rICVkIDEvMTB0aHMgb2YgYSBzZWNvbmRcbiIsCisgICAgICAgIERFTEFZX1NFQ1MsVUxaRWxhcHNlZFRpbWUoc3RhcnQsZmluaXNoKSk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjcHAuY3BwIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNThhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmNwcC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEMrKyAzLjAKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBaZW4gVGltZXIgTGlicmFyeSBDKysgaW50ZXJmYWNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtLmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJ6dGltZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50ICAgICBpLGosazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04gcmVnaXN0ZXIgdmFyaWFibGVzISAqLworCit2b2lkIGR1bW15KCkge30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBMWlRpbWVyICAgICBsdGltZXI7CisgICAgVUxaVGltZXIgICAgdWx0aW1lcjsKKworICAgIFpUaW1lckluaXQoKTsKKworICAgIC8qIFRlc3QgdGhlIGxvbmcgcGVyaW9kIFplbiBUaW1lciAod2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93IGNvegorICAgICAqIGl0IHdvdWxkIHRha2UgdG9vb29vIGxvbmchKQorICAgICAqLworCisgICAgY291dCA8PCBlbmRsOworICAgIHVsdGltZXIucmVzdGFydCgpOworICAgIGx0aW1lci5zdGFydCgpOworICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKKyAgICAgICAgICAgIGR1bW15KCk7CisgICAgbHRpbWVyLnN0b3AoKTsKKyAgICB1bHRpbWVyLnN0b3AoKTsKKyAgICBjb3V0IDw8ICJMQ291bnQ6ICAiIDw8IGx0aW1lci5jb3VudCgpIDw8IGVuZGw7CisgICAgY291dCA8PCAiVGltZTogICAgIiA8PCBsdGltZXIgPDwgIiBzZWNzXG4iOworICAgIGNvdXQgPDwgIlVMQ291bnQ6ICIgPDwgdWx0aW1lci5jb3VudCgpIDw8IGVuZGw7CisgICAgY291dCA8PCAiVUxUaW1lOiAgIiA8PCB1bHRpbWVyIDw8ICIgc2Vjc1xuIjsKKworICAgIGNvdXQgPDwgZW5kbCA8PCAiVGltaW5nIC4uLiBcbiI7CisgICAgdWx0aW1lci5yZXN0YXJ0KCk7CisgICAgbHRpbWVyLnJlc3RhcnQoKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMjAwOyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQorICAgICAgICAgICAgZHVtbXkoKTsKKyAgICBsdGltZXIuc3RvcCgpOworICAgIHVsdGltZXIuc3RvcCgpOworICAgIGNvdXQgPDwgIkxDb3VudDogICIgPDwgbHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJUaW1lOiAgICAiIDw8IGx0aW1lciA8PCAiIHNlY3NcbiI7CisgICAgY291dCA8PCAiVUxDb3VudDogIiA8PCB1bHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJVTFRpbWU6ICAiIDw8IHVsdGltZXIgPDwgIiBzZWNzXG4iOworCisgICAgLyogVGVzdCB0aGUgbGFwIGZ1bmN0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKi8KKworICAgIGNvdXQgPDwgZW5kbCA8PCAiVGltaW5nIC4uLiBcbiI7CisgICAgdWx0aW1lci5yZXN0YXJ0KCk7CisgICAgbHRpbWVyLnJlc3RhcnQoKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMjA7IGorKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTA7IGsrKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQorICAgICAgICAgICAgICAgIGR1bW15KCk7CisgICAgICAgIGNvdXQgPDwgImxhcDogIiA8PCBsdGltZXIubGFwKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIGx0aW1lci5zdG9wKCk7CisgICAgdWx0aW1lci5zdG9wKCk7CisgICAgY291dCA8PCAiTENvdW50OiAgIiA8PCBsdGltZXIuY291bnQoKSA8PCBlbmRsOworICAgIGNvdXQgPDwgIlRpbWU6ICAgICIgPDwgbHRpbWVyIDw8ICIgc2Vjc1xuIjsKKyAgICBjb3V0IDw8ICJVTENvdW50OiAiIDw8IHVsdGltZXIuY291bnQoKSA8PCBlbmRsOworICAgIGNvdXQgPDwgIlVMVGltZTogICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7CisKKyNpZmRlZiAgTE9OR19URVNUCisgICAgLyogVGVzdCB0aGUgdWx0cmEgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICovCisKKyAgICB1bHRpbWVyLnN0YXJ0KCk7CisgICAgZGVsYXkoREVMQVlfU0VDUyAqIDEwMDApOworICAgIHVsdGltZXIuc3RvcCgpOworICAgIGNvdXQgPDwgIkRlbGF5IG9mICIgPDwgREVMQVlfU0VDUyA8PCAiIHNlY3MgdG9vayAiIDw8IHVsdGltZXIuY291bnQoKQorICAgICAgICAgPDwgIiAxLzEwdGhzIG9mIGEgc2Vjb25kXG4iOworICAgIGNvdXQgPDwgIlRpbWU6ICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Vzd2MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Vzd2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkyZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdXN3Yy5jCkBAIC0wLDAgKzEsMzExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBTaW1wbGUgdGVzdCBwcm9ncmFtIHRvIHRlc3QgdGhlIHdyaXRlIGNvbWJpbmUgZnVuY3Rpb25zLgorKgorKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHByb2dyYW0gc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gYSBwcm9kdWN0aW9uCisqICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsIGJlY2F1c2Ugd3JpdGUgY29tYmluaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQKKyogICAgICAgICAgICAgICB3aXRoIG1vcmUgaW50aW1hdGUga25vd2xlZGdlIG9mIHRoZSBkaXNwbGF5IGhhcmR3YXJlIHRoYW4KKyogICAgICAgICAgICAgICB5b3UgY2FuIG9idGFpbiBieSBzaW1wbHkgZXhhbWluaW5nIHRoZSBQQ0kgY29uZmlndXJhdGlvbgorKiAgICAgICAgICAgICAgIHNwYWNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAicGNpbGliLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtUENJID0gLTE7CitzdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqUENJOworc3RhdGljIGludCAgICAgICAgICAgICAgKkJyaWRnZUluZGV4Oworc3RhdGljIGludCAgICAgICAgICAgICAgKkRldmljZUluZGV4Oworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtQnJpZGdlczsKK3N0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpBR1BCcmlkZ2UgPSBOVUxMOworc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitOdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKK1BDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQoreworICAgIGludCAgICAgICAgICAgICBpLGo7CisgICAgUENJRGV2aWNlSW5mbyAgICppbmZvOworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsCisgICAgLy8gZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4KKyAgICBpZiAoTnVtUENJID09IC0xKSB7CisgICAgICAgIGlmICgoTnVtUENJID0gUENJX2dldE51bURldmljZXMoKSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUENJID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihQQ0lbMF0pKTsKKyAgICAgICAgQnJpZGdlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKEJyaWRnZUluZGV4WzBdKSk7CisgICAgICAgIERldmljZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihEZXZpY2VJbmRleFswXSkpOworICAgICAgICBpZiAoIVBDSSB8fCAhQnJpZGdlSW5kZXggfHwgIURldmljZUluZGV4KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspCisgICAgICAgICAgICBQQ0lbaV0uZHdTaXplID0gc2l6ZW9mKFBDSVtpXSk7CisgICAgICAgIGlmIChQQ0lfZW51bWVyYXRlKFBDSSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgYWxsIFBDSSBicmlkZ2UgZGV2aWNlcworICAgICAgICBmb3IgKGkgPSAwLE51bUJyaWRnZXMgPSAwLEJyaWRnZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgeworICAgICAgICAgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykKKyAgICAgICAgICAgICAgICBCcmlkZ2VJbmRleFtOdW1CcmlkZ2VzKytdID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMKKyAgICAgICAgZm9yIChpID0gMCxOdW1EZXZpY2VzID0gMSxEZXZpY2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgeworICAgICAgICAgICAgICAgIGlmICgoUENJW2ldLkNvbW1hbmQgJiAweDMpID09IDB4MykKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5kZXhbMF0gPSBpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5kZXhbTnVtRGV2aWNlcysrXSA9IGk7CisgICAgICAgICAgICAgICAgaWYgKFBDSVtpXS5zbG90LnAuQnVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkKKyAgICAgICAgICAgICAgICAgICAgLy8gUENJIGJ1cywgc28gaXQgaXMgcHJvYmFibHkgYW4gQUdQIGRldmljZS4gRmluZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gQUdQIGJ1cyBkZXZpY2UgdGhhdCBjb250cm9scyB0aGF0IGJ1cyBzbyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbCBpdC4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE51bUJyaWRnZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChQQ0lEZXZpY2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2pdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT51LnR5cGUxLlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtpXS5zbG90LnAuQnVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdQQnJpZGdlID0gaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gTnVtRGV2aWNlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitFbnVtZXJhdGVzIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBhdHRhY2hlZCBkaXNwbGF5IGRldmljZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU2hvd0Rpc3BsYXlEZXZpY2VzKHZvaWQpCit7CisgICAgaW50IGksaW5kZXg7CisKKyAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgJWQgUENJIGRpc3BsYXkgZGV2aWNlc1xuIiwgTnVtRGV2aWNlcyk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiRGV2aWNlSUQgIFN1YlN5c3RlbSAgQmFzZTEwaCAgKGxlbmd0aCAgKSAgQmFzZTE0aCAgKGxlbmd0aCAgKVxuIik7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgeworICAgICAgICBpID0gRGV2aWNlSW5kZXhbaW5kZXhdOworICAgICAgICBwcmludGYoIiUwNFg6JTA0WCAlMDRYOiUwNFggICUwOGxYICglNmxkIEtCKSAlMDhsWCAoJTZsZCBLQilcbiIsCisgICAgICAgICAgICBQQ0lbaV0uVmVuZG9ySUQsCisgICAgICAgICAgICBQQ0lbaV0uRGV2aWNlSUQsCisgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1WZW5kb3JJRCwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbUlELAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTBMZW4gLyAxMDI0LAorICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCwKKyAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4gLyAxMDI0KTsKKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNoYXIgKkRlY29kZVdDVHlwZSgKKyAgICB1aW50IHR5cGUpCit7CisgICAgc3RhdGljIGNoYXIgKm5hbWVzW10gPSB7CisgICAgICAgICJVTkNBQ0hBQkxFIiwKKyAgICAgICAgIldSQ09NQiIsCisgICAgICAgICJVTktOT1dOIiwKKyAgICAgICAgIlVOS05PV04iLAorICAgICAgICAiV1JUSFJPVUdIIiwKKyAgICAgICAgIldSUFJPVCIsCisgICAgICAgICJXUkJBQ0siLAorICAgICAgICB9OworICAgIGlmICh0eXBlIDw9IFBNX01UUlJfTUFYKQorICAgICAgICByZXR1cm4gbmFtZXNbdHlwZV07CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUE1BUEkgRW51bVdyaXRlQ29tYmluZSgKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1aW50IHR5cGUpCit7CisgICAgcHJpbnRmKCIlMDhsWCAlLTEwbGQgJXNcbiIsIGJhc2UsIGxlbmd0aCAvIDEwMjQsIERlY29kZVdDVHlwZSh0eXBlKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZXJyIC0gRXJyb3IgdG8gbG9nCisKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgTVRSUiB3cml0ZSBjb21iaW5pbmcgYXR0ZW1wdCBmYWlsZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgTG9nTVRSUkVycm9yKAorICAgIGludCBlcnIpCit7CisgICAgaWYgKGVyciA9PSBQTV9NVFJSX0VSUl9PSykKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgUE1fTVRSUl9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IE1UUlIgaXMgbm90IHN1cHBvcnRlZCBieSBob3N0IENQVVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV9NVFJSX0VSUl9QQVJBTVM6CisgICAgICAgICAgICBwcmludGYoIkZhaWxlZDogSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBQTV9lbmFibGVXcml0ZUNvbWJpbmVkIVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQ6CisgICAgICAgICAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzcyBpcyBub3QgNEtiIGFsaWduZWQhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNX01UUlJfRVJSX0JFTE9XXzFNQjoKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzZXMgYmVsb3cgMU1iIGNhbm5vdCBiZSB3cml0ZSBjb21iaW5lZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQ6CisgICAgICAgICAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzcyBpcyBub3QgY29ycmVjdGx5IGFsaWduZWQgZm9yIHByb2Nlc3NvciFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fTVRSUl9FUlJfT1ZFUkxBUDoKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzIG92ZXJsYXBzIGFuIGV4aXN0aW5nIHJlZ2lvbiFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSDoKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkOiBBZHJlc3MgaXMgY29udGFpbmVkIHdpdGggZXhpc3RpbmcgcmVnaW9uLCBidXQgdHlwZSBpcyBkaWZmZXJlbnQhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNX01UUlJfRVJSX05PTkVfRlJFRToKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkOiBPdXQgb2YgTVRSUiByZWdpc3RlcnMhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBNX01UUlJfRVJSX05PV1JDT01COgorICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IFRoaXMgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgd3JpdGUgY29tYmluaW5nIVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOgorICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IE1UUlIgaXMgbm90IHN1cHBvcnRlZCBieSBob3N0IE9TXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IFVOS05PV04gRVJST1IhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZXhpdCgtMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2hvd3MgYWxsIHdyaXRlIGNvbWJpbmUgcmVnaW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBTaG93V3JpdGVDb21iaW5lKHZvaWQpCit7CisgICAgcHJpbnRmKCJCYXNlICAgICBMZW5ndGgoS0IpIFR5cGVcbiIpOworICAgIExvZ01UUlJFcnJvcihQTV9lbnVtV3JpdGVDb21iaW5lKEVudW1Xcml0ZUNvbWJpbmUpKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEVuYWJsZVdyaXRlQ29tYmluZSh2b2lkKQoreworICAgIGludCBpLGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgeworICAgICAgICBpID0gRGV2aWNlSW5kZXhbaW5kZXhdOworICAgICAgICBpZiAoUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4OCkgeworICAgICAgICAgICAgTG9nTVRSUkVycm9yKFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKKyAgICAgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwICYgMHhGRkZGRkZGMCwKKyAgICAgICAgICAgICAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwTGVuLAorICAgICAgICAgICAgICAgIFBNX01UUlJfV1JDT01CKSk7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0ICYgMHg4KSB7CisgICAgICAgICAgICBMb2dNVFJSRXJyb3IoUE1fZW5hYmxlV3JpdGVDb21iaW5lKAorICAgICAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweEZGRkZGRkYwLAorICAgICAgICAgICAgICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4sCisgICAgICAgICAgICAgICAgUE1fTVRSUl9XUkNPTUIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBTaG93RGlzcGxheURldmljZXMoKTsKKyAgICBTaG93V3JpdGVDb21iaW5lKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIERpc2FibGVXcml0ZUNvbWJpbmUodm9pZCkKK3sKKyAgICBpbnQgaSxpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKKyAgICAgICAgaSA9IERldmljZUluZGV4W2luZGV4XTsKKyAgICAgICAgaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAgJiAweDgpIHsKKyAgICAgICAgICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCisgICAgICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4RkZGRkZGRjAsCisgICAgICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiwKKyAgICAgICAgICAgICAgICBQTV9NVFJSX1VOQ0FDSEFCTEUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweDgpIHsKKyAgICAgICAgICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCisgICAgICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCAmIDB4RkZGRkZGRjAsCisgICAgICAgICAgICAgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNExlbiwKKyAgICAgICAgICAgICAgICBQTV9NVFJSX1VOQ0FDSEFCTEUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBTaG93RGlzcGxheURldmljZXMoKTsKKyAgICBTaG93V3JpdGVDb21iaW5lKCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBQTV9pbml0KCk7CisgICAgaWYgKFBDSV9lbnVtZXJhdGVEZXZpY2VzKCkgPCAxKSB7CisgICAgICAgIHByaW50ZigiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogdXN3YyBbLXNob3cgLW9uIC1vZmZdXG5cbiIpOworICAgICAgICBTaG93RGlzcGxheURldmljZXMoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgaWYgKHN0cmljbXAoYXJndlsxXSwiLXNob3ciKSA9PSAwKQorICAgICAgICBTaG93V3JpdGVDb21iaW5lKCk7CisgICAgZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItb24iKSA9PSAwKQorICAgICAgICBFbmFibGVXcml0ZUNvbWJpbmUoKTsKKyAgICBlbHNlIGlmIChzdHJpY21wKGFyZ3ZbMV0sIi1vZmYiKSA9PSAwKQorICAgICAgICBEaXNhYmxlV3JpdGVDb21iaW5lKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92ZnRlc3QuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZmdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2E3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92ZnRlc3QuYwpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogRmlsZW5hbWU6ICAgICAkV29ya2ZpbGUkCisqIFZlcnNpb246ICAgICAgJFJldmlzaW9uOiAxLjEgJAorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIGFueQorKgorKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byB0ZXN0IHRoZSBWRmxhdCB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZ1bmN0aW9ucy4KKyoKKyogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFZGX2F2YWlsYWJsZSgpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRl9pbml0KCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGX2V4aXQoKQorKgorKiAkRGF0ZTogMjAwMi8xMC8wMiAxNTozNToyMSAkICRBdXRob3I6IGhmcmllZGVuICQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3VjaGFyIGNvZGVbXSA9IHsKKyAgICAweEMzLCAgICAgICAgICAgICAgICAgICAvKiByZXQgICAgICAgICAgKi8KKyAgICB9OworCitpbnQgbWFpbih2b2lkKQoreworICAgIHZvaWQgICAgKnZmQnVmZmVyOworCisgICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7CisgICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUE1fcmVhbE1vZGU6CisgICAgICAgICAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8yODY6CisgICAgICAgICAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQTV8zODY6CisgICAgICAgICAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgaWYgKCFWRl9hdmFpbGFibGUoKSkgeworICAgICAgICBwcmludGYoIlZpcnR1YWwgTGluZWFyIEZyYW1lYnVmZmVyIG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgdmZCdWZmZXIgPSBWRl9pbml0KDB4QTAwMDAsNjQsc2l6ZW9mKGNvZGUpLGNvZGUpOworICAgIGlmICghdmZCdWZmZXIpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsdXJlIHRvIGluaXRpYWxpc2UgVmlydHVhbCBMaW5lYXIgRnJhbWVidWZmZXIhXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIFZGX2V4aXQoKTsKKyAgICBwcmludGYoIlZpcnR1YWwgTGluZWFyIEZyYW1lYnVmZmVyIHNldCB1cCBzdWNjZXNzZnVsbHkhXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZpZGVvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNmY2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92aWRlby5jCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBhbnkKKyoKKyogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gZ2VuZXJhdGUgcmVhbCBtb2RlCisqICAgICAgICAgICAgICAgaW50ZXJydXB0cyBhbmQgdG8gYmUgYWJsZSB0byBvYnRhaW4gZGlyZWN0IGFjY2VzcyB0byB0aGUKKyogICAgICAgICAgICAgICB2aWRlbyBtZW1vcnkgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gQ29tcGlsZSBhbmQgbGluayB3aXRoCisqICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCisqCisqICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9nZXRCSU9TU2VsZWN0b3IoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fbWFwUGh5c2ljYWxBZGRyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ludDg2KCkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBtYXBpLmgiCisKK3VjaGFyICAgKmJpb3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gQklPUyBkYXRhIGFyZWEgICAgICAgICovCit1Y2hhciAgICp2aWRlb1B0cjsgICAgICAvKiBQb2ludGVyIHRvIFZHQSBmcmFtZWJ1ZmZlciAgICAgICAqLwordm9pZCAgICAqc3RhdGVCdWY7ICAgICAgLyogQ29uc29sZSBzdGF0ZSBzYXZlIGJ1ZmZlciAgICAgICAgKi8KKworLyogUm91dGluZSB0byByZXR1cm4gdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBudW1iZXIgKi8KKworaW50IGdldFZpZGVvTW9kZSh2b2lkKQoreworICAgIHJldHVybiBQTV9nZXRCeXRlKGJpb3MrMHg0OSk7Cit9CisKKy8qIFJvdXRpbmUgdG8gc2V0IGEgc3BlY2lmaWVkIHZpZGVvIG1vZGUgKi8KKwordm9pZCBzZXRWaWRlb01vZGUoaW50IG1vZGUpCit7CisgICAgUk1SRUdTIHI7CisKKyAgICByLnguYXggPSBtb2RlOworICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Cit9CisKKy8qIFJvdXRpbmUgdG8gY2xlYXIgYSByZWN0YW5ndWxhciByZWdpb24gb24gdGhlIGRpc3BsYXkgYnkgY2FsbGluZyB0aGUKKyAqIHZpZGVvIEJJT1MuCisgKi8KKwordm9pZCBjbGVhclNjcmVlbihpbnQgc3RhcnR4LCBpbnQgc3RhcnR5LCBpbnQgZW5keCwgaW50IGVuZHksIHVuc2lnbmVkIGNoYXIgYXR0cikKK3sKKyAgICBSTVJFR1MgcjsKKworICAgIHIueC5heCA9IDB4MDYwMDsKKyAgICByLmguYmggPSBhdHRyOworICAgIHIuaC5jbCA9IHN0YXJ0eDsKKyAgICByLmguY2ggPSBzdGFydHk7CisgICAgci5oLmRsID0gZW5keDsKKyAgICByLmguZGggPSBlbmR5OworICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Cit9CisKKy8qIFJvdXRpbmUgdG8gZmlsbCBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvbiB0aGUgZGlzcGxheSB1c2luZyBkaXJlY3QKKyAqIHZpZGVvIHdyaXRlcy4KKyAqLworCisjZGVmaW5lIFNDUkVFTih4LHkpICh2aWRlb1B0ciArICgoeSkgKiAxNjApICsgKCh4KSA8PCAxKSkKKwordm9pZCBmaWxsKGludCBzdGFydHgsIGludCBzdGFydHksIGludCBlbmR4LCBpbnQgZW5keSwgdW5zaWduZWQgY2hhciBjLAorICAgIHVuc2lnbmVkIGNoYXIgYXR0cikKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgKnY7CisgICAgaW50ICAgICAgICAgICAgIHgseTsKKworICAgIGZvciAoeSA9IHN0YXJ0eTsgeSA8PSBlbmR5OyB5KyspIHsKKyAgICAgICAgdiA9IFNDUkVFTihzdGFydHgseSk7CisgICAgICAgIGZvciAoeCA9IHN0YXJ0eDsgeCA8PSBlbmR4OyB4KyspIHsKKyAgICAgICAgICAgICp2KysgPSBjOworICAgICAgICAgICAgKnYrKyA9IGF0dHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworLyogUm91dGluZSB0byBkaXNwbGF5IGEgc2luZ2xlIGNoYXJhY3RlciB1c2luZyBkaXJlY3QgdmlkZW8gd3JpdGVzICovCisKK3ZvaWQgd3JpdGVDaGFyKGludCB4LCBpbnQgeSwgdW5zaWduZWQgY2hhciBjLCB1bnNpZ25lZCBjaGFyIGF0dHIpCit7CisgICAgdW5zaWduZWQgY2hhciAqdiA9IFNDUkVFTih4LHkpOworICAgICp2KysgPSBjOworICAgICp2ID0gYXR0cjsKK30KKworLyogUm91dGluZSB0byBkcmF3IGEgYm9yZGVyIGFyb3VuZCBhIHJlY3Rhbmd1bGFyIGFyZWEgdXNpbmcgZGlyZWN0IHZpZGVvCisgKiB3cml0ZXMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYm9yZGVyX2NoYXJzW10gPSB7CisgICAgMTg2LCAyMDUsIDIwMSwgMTg3LCAyMDAsIDE4OCAgICAgICAgLyogZG91YmxlIGJveCBjaGFycyAqLworICAgIH07CisKK3ZvaWQgYm9yZGVyKGludCBzdGFydHgsIGludCBzdGFydHksIGludCBlbmR4LCBpbnQgZW5keSwgdW5zaWduZWQgY2hhciBhdHRyKQoreworICAgIHVuc2lnbmVkIGNoYXIgICAqdjsKKyAgICB1bnNpZ25lZCBjaGFyICAgKmI7CisgICAgaW50ICAgICAgICAgICAgIGk7CisKKyAgICBiID0gYm9yZGVyX2NoYXJzOworCisgICAgZm9yIChpID0gc3RhcnR5KzE7IGkgPCBlbmR5OyBpKyspIHsKKyAgICAgICAgd3JpdGVDaGFyKHN0YXJ0eCwgaSwgKmIsIGF0dHIpOworICAgICAgICB3cml0ZUNoYXIoZW5keCwgaSwgKmIsIGF0dHIpOworICAgICAgICB9CisgICAgYisrOworICAgIGZvciAoaSA9IHN0YXJ0eCsxLCB2ID0gU0NSRUVOKHN0YXJ0eCsxLCBzdGFydHkpOyBpIDwgZW5keDsgaSsrKSB7CisgICAgICAgICp2KysgPSAqYjsKKyAgICAgICAgKnYrKyA9IGF0dHI7CisgICAgICAgIH0KKyAgICBmb3IgKGkgPSBzdGFydHgrMSwgdiA9IFNDUkVFTihzdGFydHgrMSwgZW5keSk7IGkgPCBlbmR4OyBpKyspIHsKKyAgICAgICAgKnYrKyA9ICpiOworICAgICAgICAqdisrID0gYXR0cjsKKyAgICAgICAgfQorICAgIGIrKzsKKyAgICB3cml0ZUNoYXIoc3RhcnR4LCBzdGFydHksICpiKyssIGF0dHIpOworICAgIHdyaXRlQ2hhcihlbmR4LCBzdGFydHksICpiKyssIGF0dHIpOworICAgIHdyaXRlQ2hhcihzdGFydHgsIGVuZHksICpiKyssIGF0dHIpOworICAgIHdyaXRlQ2hhcihlbmR4LCBlbmR5LCAqYisrLCBhdHRyKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgICAgIG9yZ01vZGU7CisgICAgUE1fSFdORCBod25kQ29uc29sZTsKKworICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOworICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIFBNX3JlYWxNb2RlOgorICAgICAgICAgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMjg2OgorICAgICAgICAgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE1fMzg2OgorICAgICAgICAgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOworICAgIHByaW50ZigiSGl0IGFueSBrZXkgdG8gc3RhcnQgODB4MjUgdGV4dCBtb2RlIGFuZCBwZXJmb3JtIHNvbWUgZGlyZWN0IHZpZGVvIG91dHB1dC5cbiIpOworICAgIFBNX2dldGNoKCk7CisKKyAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzYXZlIGNvbnNvbGUgc3RhdGUgYW5kIHNhdmUgdGhlIHN0YXRlICovCisgICAgaWYgKChzdGF0ZUJ1ZiA9IFBNX21hbGxvYyhQTV9nZXRDb25zb2xlU3RhdGVTaXplKCkpKSA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICBQTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOworICAgIGJpb3MgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworICAgIG9yZ01vZGUgPSBnZXRWaWRlb01vZGUoKTsKKyAgICBzZXRWaWRlb01vZGUoMHgzKTsKKyAgICBpZiAoKHZpZGVvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QjgwMDAsMHhGRkZGLHRydWUpKSA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIG9idGFpbiBwb2ludGVyIHRvIGZyYW1lYnVmZmVyIVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgIC8qIERyYXcgc29tZSB0ZXh0IG9uIHRoZSBzY3JlZW4gKi8KKyAgICBmaWxsKDAsIDAsIDc5LCAyNCwgMTc2LCAweDFFKTsKKyAgICBib3JkZXIoMCwgMCwgNzksIDI0LCAweDFGKTsKKyAgICBQTV9nZXRjaCgpOworICAgIGNsZWFyU2NyZWVuKDAsIDAsIDc5LCAyNCwgMHg3KTsKKworICAgIC8qIFJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUgb24gZXhpdCAqLworICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7CisgICAgUE1fZnJlZShzdGF0ZUJ1Zik7CisgICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKKworICAgIC8qIERpc3BsYXkgdXNlZnVsIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIk9yaWdpbmFsIFZpZGVvIE1vZGUgPSAlMDJYXG4iLCBvcmdNb2RlKTsKKyAgICBwcmludGYoIkJJT1MgUG9pbnRlciA9ICUwOFhcbiIsIChpbnQpYmlvcyk7CisgICAgcHJpbnRmKCJWaWRlbyBNZW1vcnkgPSAlMDhYXG4iLCAoaW50KXZpZGVvUHRyKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2MGI3MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9jcHVpbmZvLmMKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECisqCisqIERlc2NyaXB0aW9uOiAgVkREIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgVkREJ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRG8gbm90aGluZyBmb3IgVkREJ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAorICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCit7CisgICAgZnJlcS0+bG93ICA9IDEwMDAwMDsKKyAgICBmcmVxLT5oaWdoID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HICAgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdW50ID0gVkRIUXVlcnlTeXNWYWx1ZSgwLCBWREhHU1ZfTVNFQ1NCT09UKTsgXAorICAgICh0KS0+bG93ICA9IGNvdW50ICogMTAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2ZpbGVpby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2ZpbGVpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmFmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvZmlsZWlvLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAorKgorKiBEZXNjcmlwdGlvbjogIEMgbGlicmFyeSBjb21wYXRpYmxlIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYSBWREQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJ2ZGRmaWxlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gQ29kZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRU9GIC0xCisKKy8qIE5COiBub25lIG9mIHRoZSBmaWxlIFZESHMgYXJlIGF2YWlsYWJsZSBkdXJpbmcgdGhlIERPUyBzZXNzaW9uICAgICAgICAgICovCisvKiBpbml0aWFsemF0aW9uIGNvbnRleHQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBNYWNyb3MgZm9yIE9wZW4vQ2xvc2UgQVBJcyB0byBhbGxvdyB1c2luZyB0aGlzIG1vZHVsZSBpbiBib3RoIFZERHMgYW5kICAqLworLyogbm9ybWFsIE9TLzIgYXBwbGljYXRpb25zLiBVbmZvcnR1bmF0ZWx5IFZESFJlYWQvV3JpdGUvU2VlayBkb24ndCBtYXAgdG8gKi8KKy8qIHRoZWlyIERvcyogY291bnRlcnBhcnRzIHNvIGNsZWFubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgX19PUzJfVkREX18KKyNkZWZpbmUgX09TMk9wZW4gICAgVkRIT3BlbgorI2RlZmluZSBfT1MyQ2xvc2UgICBWREhDbG9zZQorI2Vsc2UKKyNkZWZpbmUgX09TMk9wZW4gICAgRG9zT3BlbgorI2RlZmluZSBfT1MyQ2xvc2UgICBEb3NDbG9zZQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZm9wZW4gZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRklMRSAqIGZvcGVuKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgICAgRklMRSAgICAqZiA9IFBNX21hbGxvYyhzaXplb2YoRklMRSkpOworICAgIGxvbmcgICAgb2xkcG9zOworICAgIFVMT05HICAgcmMsIHVsQWN0aW9uOworICAgIFVMT05HICAgb21vZGUsIG9mbGFnczsKKworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgZi0+b2Zmc2V0ID0gMDsKKyAgICAgICAgZi0+dGV4dCA9IChtb2RlWzFdID09ICd0JyB8fCBtb2RlWzJdID09ICd0Jyk7CisgICAgICAgIGYtPndyaXRlbW9kZSA9IChtb2RlWzBdID09ICd3JykgfHwgKG1vZGVbMF0gPT0gJ2EnKTsKKyAgICAgICAgZi0+dW5wdXRjID0gRU9GOworICAgICAgICBmLT5lbmRwID0gZi0+YnVmICsgc2l6ZW9mKGYtPmJ1Zik7CisgICAgICAgIGYtPmN1cnAgPSBmLT5zdGFydHAgPSBmLT5idWY7CisKKyAgICAgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7CisgICAgICAgICAgICAjaWZkZWYgX19PUzJfVkREX18KKyAgICAgICAgICAgIG9tb2RlICA9IFZESE9QRU5fQUNDRVNTX1JFQURPTkxZIHwgVkRIT1BFTl9TSEFSRV9ERU5ZTk9ORTsKKyAgICAgICAgICAgIG9mbGFncyA9IFZESE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgVkRIT1BFTl9BQ1RJT05fRkFJTF9JRl9ORVc7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgb21vZGUgID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0RFTllOT05FOworICAgICAgICAgICAgb2ZsYWdzID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9GQUlMX0lGX05FVzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgeworICAgICAgICAgICAgI2lmZGVmIF9fT1MyX1ZERF9fCisgICAgICAgICAgICBvbW9kZSAgPSBWREhPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBWREhPUEVOX1NIQVJFX0RFTllXUklURTsKKyAgICAgICAgICAgIG9mbGFncyA9IFZESE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgVkRIT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICBvbW9kZSAgPSBPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBPUEVOX1NIQVJFX0RFTllXUklURTsKKyAgICAgICAgICAgIG9mbGFncyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICNpZmRlZiBfX09TMl9WRERfXworICAgICAgICAgICAgb21vZGUgID0gVkRIT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgVkRIT1BFTl9TSEFSRV9ERU5ZV1JJVEU7CisgICAgICAgICAgICBvZmxhZ3MgPSBWREhPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IFZESE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgb21vZGUgID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7CisgICAgICAgICAgICBvZmxhZ3MgPSBPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmMgPSBfT1MyT3BlbigoUFNaKWZpbGVuYW1lLCAoUEhGSUxFKSZmLT5oYW5kbGUsICZ1bEFjdGlvbiwgMCwgVkRIT1BFTl9GSUxFX05PUk1BTCwgb2ZsYWdzLCBvbW9kZSwgTlVMTCk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBQTV9mcmVlKGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgI2lmZGVmIF9fT1MyX1ZERF9fCisgICAgICAgIGYtPmZpbGVzaXplID0gVkRIU2VlaygoSEZJTEUpZi0+aGFuZGxlLCAwLCBWREhTS19FTkRfT0ZfRklMRSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJjID0gRG9zU2V0RmlsZVB0cigoSEZJTEUpZi0+aGFuZGxlLCAwLCBGSUxFX0VORCwgJmYtPmZpbGVzaXplKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaWYgKG1vZGVbMF0gPT0gJ2EnKQorICAgICAgICAgICAgZnNlZWsoZiwwLDIpOworICAgIH0KKyAgICByZXR1cm4gZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4gTm90ZSB0aGF0IHVubGlrZSBXaW5kb3dzIFZ4RHMsCitPUy8yIFZERHMgYXJlIG5vdCBsaW1pdGVkIHRvIDY0SyByZWFkcyBvciB3cml0ZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc2l6ZV90IGZyZWFkKAorICAgIHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgbiwKKyAgICBGSUxFICpmKQoreworICAgIGNoYXIgICAgKmJ1ZiA9IHB0cjsKKyAgICBpbnQgICAgIGJ5dGVzLHJlYWRieXRlcyx0b3RhbGJ5dGVzID0gMDsKKworICAgIC8qIEZpcnN0IGNvcHkgYW55IGRhdGEgYWxyZWFkeSByZWFkIGludG8gb3VyIGJ1ZmZlciAqLworICAgIGlmICgoYnl0ZXMgPSAoZi0+Y3VycCAtIGYtPnN0YXJ0cCkpID4gMCkgeworICAgICAgICBtZW1jcHkoYnVmLGYtPmN1cnAsYnl0ZXMpOworICAgICAgICBmLT5zdGFydHAgPSBmLT5jdXJwID0gZi0+YnVmOworICAgICAgICBidWYgKz0gYnl0ZXM7CisgICAgICAgIHRvdGFsYnl0ZXMgKz0gYnl0ZXM7CisgICAgICAgIGJ5dGVzID0gKHNpemUgKiBuKSAtIGJ5dGVzOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBieXRlcyA9IHNpemUgKiBuOworICAgIGlmIChieXRlcykgeworICAgICAgICAjaWZkZWYgX19PUzJfVkREX18KKyAgICAgICAgcmVhZGJ5dGVzID0gVkRIUmVhZCgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgRG9zUmVhZCgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzLCAmcmVhZGJ5dGVzKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOworICAgICAgICBmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOworICAgICAgICB9CisgICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1ZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ3cml0ZSBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgZndyaXRlKAorICAgIHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgbiwKKyAgICBGSUxFICpmKQoreworICAgIGNoYXIgICAgICAgICpidWYgPSBwdHI7CisgICAgaW50ICAgICAgICAgYnl0ZXMsd3JpdHRlbmJ5dGVzLHRvdGFsYnl0ZXMgPSAwOworCisgICAgLyogRmx1c2ggYW55dGhpbmcgYWxyZWFkeSBpbiB0aGUgYnVmZmVyICovCisgICAgaWYgKCFmLT53cml0ZW1vZGUpCisgICAgICAgIHJldHVybiAwOworICAgIGZmbHVzaChmKTsKKyAgICBieXRlcyA9IHNpemUgKiBuOworICAgICNpZmRlZiBfX09TMl9WRERfXworICAgIHdyaXR0ZW5ieXRlcyA9IFZESFdyaXRlKChIRklMRSlmLT5oYW5kbGUsIGJ1ZiwgYnl0ZXMpOworICAgICNlbHNlCisgICAgRG9zV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgYnVmLCBieXRlcywgJndyaXR0ZW5ieXRlcyk7CisgICAgI2VuZGlmCisgICAgdG90YWxieXRlcyArPSB3cml0dGVuYnl0ZXM7CisgICAgZi0+b2Zmc2V0ICs9IHdyaXR0ZW5ieXRlczsKKyAgICBpZiAoZi0+b2Zmc2V0ID4gZi0+ZmlsZXNpemUpCisgICAgICAgIGYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OworICAgIHJldHVybiB0b3RhbGJ5dGVzIC8gc2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZmx1c2ggZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZmbHVzaCgKKyAgICBGSUxFICpmKQoreworICAgIFVMT05HICAgICBieXRlczsKKworICAgIC8qIEZpcnN0IGNvcHkgYW55IGRhdGEgYWxyZWFkeSB3cml0dGVuIGludG8gb3VyIGJ1ZmZlciAqLworICAgIGlmIChmLT53cml0ZW1vZGUgJiYgKGJ5dGVzID0gKGYtPmN1cnAgLSBmLT5zdGFydHApKSA+IDApIHsKKyAgICAgICAgI2lmZGVmIF9fT1MyX1ZERF9fCisgICAgICAgIGJ5dGVzID0gVkRIV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgZi0+c3RhcnRwLCBieXRlcyk7CisgICAgICAgICNlbHNlCisgICAgICAgIERvc1dyaXRlKChIRklMRSlmLT5oYW5kbGUsIGYtPnN0YXJ0cCwgYnl0ZXMsICZieXRlcyk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmLT5vZmZzZXQgKz0gYnl0ZXM7CisgICAgICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKKyAgICAgICAgICAgIGYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OworICAgICAgICBmLT5zdGFydHAgPSBmLT5jdXJwID0gZi0+YnVmOworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnNlZWsgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZzZWVrKAorICAgIEZJTEUgKmYsCisgICAgbG9uZyBpbnQgb2Zmc2V0LAorICAgIGludCB3aGVuY2UpCit7CisgICAgZmZsdXNoKGYpOworCisgICAgaWYgKHdoZW5jZSA9PSAwKQorICAgICAgICBmLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZWxzZSBpZiAod2hlbmNlID09IDEpCisgICAgICAgIGYtPm9mZnNldCArPSBvZmZzZXQ7CisgICAgZWxzZSBpZiAod2hlbmNlID09IDIpCisgICAgICAgIGYtPm9mZnNldCA9IGYtPmZpbGVzaXplICsgb2Zmc2V0OworCisgICAgI2lmZGVmIF9fT1MyX1ZERF9fCisgICAgVkRIU2VlaygoSEZJTEUpZi0+aGFuZGxlLCBmLT5vZmZzZXQsIFZESFNLX0FCU09MVVRFKTsKKyAgICAjZWxzZQorICAgIERvc1NldEZpbGVQdHIoKEhGSUxFKWYtPmhhbmRsZSwgZi0+b2Zmc2V0LCBGSUxFX0JFR0lOLCBOVUxMKTsKKyAgICAjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1ZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ0ZWxsIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgZnRlbGwoCisgICAgRklMRSAqZikKK3sKKyAgICBsb25nICAgIG9mZnNldDsKKworICAgIG9mZnNldCA9IChmLT5jdXJwIC0gZi0+c3RhcnRwKTsKKyAgICBvZmZzZXQgKz0gZi0+b2Zmc2V0OworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmVvZiBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmVvZigKKyAgICBGSUxFICpmKQoreworICAgIHJldHVybiAoZi0+b2Zmc2V0ID09IGYtPmZpbGVzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBmaWxlIGJ1ZmZlciwgaW5jbHVkaW5nIHRyYW5zbGF0aW9uCitvZiB0aGUgY2hhcmFjdGVyIGluIHRleHQgdHJhbnNhdGlvbiBtb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9fZ2V0YygKKyAgICBGSUxFICpmKQoreworICAgIGludCBjOworCisgICAgaWYgKGYtPnVucHV0YyAhPSBFT0YpIHsKKyAgICAgICAgYyA9IGYtPnVucHV0YzsKKyAgICAgICAgZi0+dW5wdXRjID0gRU9GOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChmLT5zdGFydHAgPT0gZi0+Y3VycCkgeworICAgICAgICAgICAgaW50IGJ5dGVzID0gZnJlYWQoZi0+YnVmLDEsc2l6ZW9mKGYtPmJ1ZiksZik7CisgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgZi0+Y3VycCA9IGYtPnN0YXJ0cCArIGJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICBjID0gKmYtPnN0YXJ0cCsrOworICAgICAgICBpZiAoZi0+dGV4dCAmJiBjID09ICdccicpIHsKKyAgICAgICAgICAgIGludCBuYyA9IF9fZ2V0YyhmKTsKKyAgICAgICAgICAgIGlmIChuYyAhPSAnXG4nKQorICAgICAgICAgICAgICAgIGYtPnVucHV0YyA9IG5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdG8gaW5wdXQgYnVmZmVyLCBpbmNsdWRpbmcgdHJhbnNsYXRpb24gb2YgdGhlCitjaGFyYWN0ZXIgaW4gdGV4dCB0cmFuc2F0aW9uIG1vZGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19wdXRjKGludCBjLEZJTEUgKmYpCit7CisgICAgaW50IGNvdW50ID0gMTsKKyAgICBpZiAoZi0+dGV4dCAmJiBjID09ICdcbicpIHsKKyAgICAgICAgX19wdXRjKCdccicsZik7CisgICAgICAgIGNvdW50ID0gMjsKKyAgICAgICAgfQorICAgIGlmIChmLT5jdXJwID09IGYtPmVuZHApCisgICAgICAgIGZmbHVzaChmKTsKKyAgICAqZi0+Y3VycCsrID0gYzsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmdldHMgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqZmdldHMoCisgICAgY2hhciAqcywKKyAgICBpbnQgbiwKKyAgICBGSUxFICpmKQoreworICAgIGludCBjID0gMDsKKyAgICBjaGFyICpjczsKKworICAgIGNzID0gczsKKyAgICB3aGlsZSAoLS1uID4gMCAmJiAoYyA9IF9fZ2V0YyhmKSkgIT0gRU9GKSB7CisgICAgICAgICpjcysrID0gYzsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKGMgPT0gRU9GICYmIGNzID09IHMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICpjcyA9ICdcMCc7CisgICAgcmV0dXJuIHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnB1dHMgZnVuY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZwdXRzKAorICAgIGNvbnN0IGNoYXIgKnMsCisgICAgRklMRSAqZikKK3sKKyAgICBpbnQgciA9IDA7CisgICAgaW50IGM7CisKKyAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAwKQorICAgICAgICByID0gX19wdXRjKGMsIGYpOworICAgIHJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Z4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZjbG9zZSBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmNsb3NlKAorICAgIEZJTEUgKmYpCit7CisgICAgZmZsdXNoKGYpOworICAgIF9PUzJDbG9zZSgoSEZJTEUpZi0+aGFuZGxlKTsKKyAgICBQTV9mcmVlKGYpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvb3NoZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI4NmJkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL29zaGRyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTc3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvcG0uYwpAQCAtMCwwICsxLDEwNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCisjaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKKyNpbmNsdWRlICJtdHJyLmgiCisKKyNkZWZpbmUgVFJBQ0UoYSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfTUVNT1JZX1NIQVJFRCAgICAgICAgICAgMTAwCisjZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgICAgICAgICAxMDAKKworLy8gVE9ETzogSSB0aGluayB0aGUgZ2xvYmFsIGFuZCBsaW5lYXIgbWVtYmVycyB3aWxsIGJlIHRoZSBzYW1lLCBidXQgbm90IHN1cmUgeWV0LgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgICAgKmxpbmVhcjsKKyAgICB1bG9uZyAgIGdsb2JhbDsKKyAgICB1bG9uZyAgIGxlbmd0aDsKKyAgICBpbnQgICAgIG5wYWdlczsKKyAgICB9IG1lbXNoYXJlZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nICAgcGh5c2ljYWw7CisgICAgdWxvbmcgICBsaW5lYXI7CisgICAgdWxvbmcgICBsZW5ndGg7CisgICAgaW50ICAgICBucGFnZXM7CisgICAgaWJvb2wgICBpc0NhY2hlZDsKKyAgICB9IG1tYXBwaW5nOworCitzdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHBpbmdzID0gMDsKK3N0YXRpYyBtZW1zaGFyZWQgICAgc2hhcmVkW01BWF9NRU1PUllfTUFQUElOR1NdID0gezB9Oworc3RhdGljIG1tYXBwaW5nICAgICBtYXBzW01BWF9NRU1PUllfTUFQUElOR1NdOworaWJvb2wgICAgICAgICAgICAgICBfUE1faGF2ZUJJT1MgPSBUUlVFOworY2hhciAgICAgICAgICAgICAgICBfUE1fY250UGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsgICAgIC8qIHRoZXJlIGp1c3QgaXNuJ3QgYW55ICovCit1Y2hhciAgICAgICAgICAgICAgICpfUE1fcm1CdWZBZGRyID0gTlVMTDsKK3VzaG9ydCBfVkFSQVBJICAgICAgUE1fc2F2ZWREUyA9IDA7ICAgLyogd2h5IGNhbid0IEkgdXNlIHRoZSB1bmRlcnNjb3JlIHByZWZpeD8gKi8KKworSFZESFNFTSAgICAgICAgICAgICBoZXZGYXJDYWxsUmV0ID0gTlVMTDsKK0hWREhTRU0gICAgICAgICAgICAgaGV2SVJldCAgICAgICA9IE5VTEw7CitISE9PSyAgICAgICAgICAgICAgIGhob29rVXNlclJldHVybkhvb2sgPSBOVUxMOworSEhPT0sgICAgICAgICAgICAgICBoaG9va1VzZXJJUmV0SG9vayAgID0gTlVMTDsKKworc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KKwordWxvbmcgICBQTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwordWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKK3ZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOworCitWT0lEIEhPT0tFTlRSWSBVc2VyUmV0dXJuSG9vayhQVk9JRCBwUmVmRGF0YSwgUENSRiBwY3JmKTsKK1ZPSUQgSE9PS0VOVFJZIFVzZXJJUmV0SG9vayhQVk9JRCBwUmVmRGF0YSwgUENSRiBwY3JmKTsKKwordm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCit7CisgICAgTVRSUl9pbml0KCk7CisKKyAgICAvLyBJbml0aWFsaXplIFZERC1zcGVjaWZpYyBkYXRhCisgICAgLy8gTm90ZTogUE1faW5pdCBtdXN0IGJlIChvYnZpb3VzbHkpIGNhbGxlZCBpbiBWRE0gdGFzayBjb250ZXh0IQorICAgIFZESENyZWF0ZVNlbSgmaGV2RmFyQ2FsbFJldCwgVkRIX0VWRU5UU0VNKTsKKyAgICBWREhDcmVhdGVTZW0oJmhldklSZXQsIFZESF9FVkVOVFNFTSk7CisgICAgaGhvb2tVc2VyUmV0dXJuSG9vayA9IFZESEFsbG9jSG9vayhWREhfUkVUVVJOX0hPT0ssIChQRk5BUk0pVXNlclJldHVybkhvb2ssIDApOworICAgIGhob29rVXNlcklSZXRIb29rICAgPSBWREhBbGxvY0hvb2soVkRIX1JFVFVSTl9IT09LLCAoUEZOQVJNKVVzZXJJUmV0SG9vaywgMCk7CisKKyAgICBpZiAoKGhldklSZXQgPT0gTlVMTCkgfHwgKGhldkZhckNhbGxSZXQgPT0gTlVMTCkgfHwKKyAgICAgICAgKGhob29rVXNlclJldHVybkhvb2sgPT0gTlVMTCkgfHwgKGhob29rVXNlcklSZXRIb29rID09IE5VTEwpKSB7CisgICAgICAgIC8vIHNvbWV0aGluZyBmYWlsZWQsIHdlIGNhbid0IGdvIG9uCisgICAgICAgIC8vIFRPRE86IHRha2Ugc29tZSBhY3Rpb24gaGVyZSEKKyAgICAgICAgfQorfQorCisvKiBEbyBzb21lIGNsZWFuaW5nIHVwICovCit2b2lkIFBNQVBJIFBNX2V4aXQodm9pZCkKK3sKKyAgICAvKiBOb3RlOiBIb29rcyBhbGxvY2F0ZWQgZHVyaW5nIG9yIGFmdGVyIFZETSBjcmVhdGlvbiBhcmUgZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSAqLworICAgIGlmIChoZXZJUmV0ICE9IE5VTEwpCisgICAgICAgIFZESERlc3Ryb3lTZW0oaGV2SVJldCk7CisKKyAgICBpZiAoaGV2RmFyQ2FsbFJldCAhPSBOVUxMKQorICAgICAgICBWREhEZXN0cm95U2VtKGhldkZhckNhbGxSZXQpOworfQorCitpYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoreyByZXR1cm4gX1BNX2hhdmVCSU9TOyB9CisKK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7IHJldHVybiAvKl9PU19PUzJWREQqLyBfT1NfT1MyOyB9ICAvL0ZJWCEhCisKK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreyByZXR1cm4gUE1fMzg2OyB9CisKK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKKyAgICAgICAgc1twb3NdID0gJ1xcJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCisgICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQoreworICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKK30KKwordm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCisgICAgICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7CisvLyAgICBGYXRhbF9FcnJvcl9IYW5kbGVyKG1zZywwKTsgIFRPRE86IGltcGxlbWVudCBzb21laG93IQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2xlbiAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKK3JzZWcgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlcgorcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgb2Zmc2V0IG9mIHRoZSBidWZmZXIKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBnbG9iYWwgVkVTQSB0cmFuc2ZlcgorYnVmZmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAorICAgIHVpbnQgKmxlbiwKKyAgICB1aW50ICpyc2VnLAorICAgIHVpbnQgKnJvZmYpCit7CisgICAgaWYgKF9QTV9ybUJ1ZkFkZHIpIHsKKyAgICAgICAgKmxlbiA9IDA7IC8vVkVTQV9CVUZfU0laRTsKKyAgICAgICAgKnJzZWcgPSAodWxvbmcpKF9QTV9ybUJ1ZkFkZHIpID4+IDQ7CisgICAgICAgICpyb2ZmID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSAmIDB4RjsKKyAgICAgICAgcmV0dXJuIF9QTV9ybUJ1ZkFkZHI7CisgICAgICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KQoreworICAgIC8qIFVudXNlZCBpbiBWRERzICovCisgICAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aChjaGFyICpwYXRoLGludCBtYXhMZW4pCit7CisgICAgc3RybmNweShwYXRoLCBfUE1fY250UGF0aCwgbWF4TGVuKTsKKyAgICBwYXRoW21heExlbiAtIDFdID0gMDsKKyAgICByZXR1cm4gcGF0aDsKK30KKworY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKK3sKKyAgICB1bG9uZyAgIGJvb3QgPSAzOworICAgIGJvb3QgPSBWREhRdWVyeVN5c1ZhbHVlKDAsIFZESEdTVl9CT09URFJWKTsKKyAgICByZXR1cm4gKGNoYXIpKCdhJyArIGJvb3QgLSAxKTsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07CisgICAgc3RyY3B5KHBhdGgsIng6XFwiKTsKKyAgICBwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgICAgICBzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOworICAgICAgICBzdHJjcHkocGF0aCwieDpcXG9zMlxcZHJpdmVycyIpOworICAgICAgICBwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7CisgICAgICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKKyAgICAgICAgc3RyY2F0KHBhdGgsIm51Y2xldXMiKTsKKyAgICAgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKyAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOworICAgIHJldHVybiBwYXRoOworfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKK3sgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7IH0KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCit7CisgICAgcmV0dXJuICJVbmtub3duIjsKK30KKworaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCit7IHJldHVybiAxOyB9CisKK2ludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQoreyByZXR1cm4gMDsgfQorCitQTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKFBNX0hXTkQgaHduZFVzZXIsaW50IGRldmljZSxpbnQgeFJlcyxpbnQgeVJlcyxpbnQgYnBwLGlib29sIGZ1bGxTY3JlZW4pCit7CisgICAgLyogVW51c2VkIGluIFZERHMgKi8KKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICAvKiBVbnVzZWQgaW4gVkREcyAqLworICAgIHJldHVybiAxOworfQorCit2b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKK3sKKyAgICAvKiBVbnVzZWQgaW4gVkREcyAqLworfQorCit2b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKK3sKKyAgICAvKiBVbnVzZWQgaW4gVkREcyAqLworfQorCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKK3sKKyAgICAvKiBVbnVzZWQgaW4gVkREcyAqLworfQorCit2b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8qIFVudXNlZCBpbiBWRERzICovCit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKK3sKKyAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKKyAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Cit9CisKK3ZvaWQgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKK3sKKyAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOworICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBPUy8yIFZERCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5CithcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0CisoaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50CitkYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZworMCBpbnRlcnJ1cHQgY29udGV4dC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKK3sKKyAgICBVTE9ORyAgICAgICBuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKKyAgICBpbnQgICAgICAgICBpOworCisgICAgLyogRmlyc3QgZmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgc2hhcmVkIG1lbW9yeSB0YWJsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7CisgICAgICAgIGlmIChzaGFyZWRbaV0ubGluZWFyID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmIChpIDwgTUFYX01FTU9SWV9TSEFSRUQpIHsKKyAgICAgICAgc2hhcmVkW2ldLmxpbmVhciA9IFZESEFsbG9jUGFnZXMoTlVMTCwgblBhZ2VzLCBWREhBUF9TWVNURU0gfCBWREhBUF9GSVhFRCk7CisgICAgICAgIHNoYXJlZFtpXS5ucGFnZXMgPSBuUGFnZXM7CisgICAgICAgIHNoYXJlZFtpXS5nbG9iYWwgPSAoVUxPTkcpc2hhcmVkW2ldLmxpbmVhcjsKKyAgICAgICAgcmV0dXJuICh2b2lkKilzaGFyZWRbaV0uZ2xvYmFsOworICAgICAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpbmQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7CisgICAgICAgIGlmIChzaGFyZWRbaV0uZ2xvYmFsID09ICh1bG9uZylwKSB7CisgICAgICAgICAgICBWREhGcmVlUGFnZXMoc2hhcmVkW2ldLmxpbmVhcik7CisgICAgICAgICAgICBzaGFyZWRbaV0ubGluZWFyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3ZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKK3sgcmV0dXJuICh2b2lkKiliYXNlOyB9CisKK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TLAorICAgIHVsb25nIEJJT1NMZW4pCit7CisgICAgLy8gVE9ETzogRmlndXJlIG91dCBob3cgdG8gZG8gdGhpcworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCit7IHJldHVybiAodm9pZCopMHg0MDA7IH0KKwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCitsaW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgorCitSRVRVUk5TOgorTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCisKK1JFTUFSS1M6CitNYXBzIGEgcGh5c2ljYWwgbWVtb3J5IHJhbmdlIHRvIGEgbGluZWFyIG1lbW9yeSByYW5nZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBNYXBQaHlzaWNhbFRvTGluZWFyKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgbGltaXQsCisgICAgaW50ICpucGFnZXMpCit7CisgICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKKyAgICBpbnQgICAgIGkscHBhZ2UsZmxhZ3M7CisjaWYgMAorICAgIHBwYWdlID0gYmFzZSA+PiAxMjsKKyAgICAqbnBhZ2VzID0gKGxlbmd0aCArIChiYXNlICYgMHhGRkYpICsgNDA5NSkgPj4gMTI7CisgICAgZmxhZ3MgPSBQUl9GSVhFRCB8IFBSX1NUQVRJQzsKKyAgICBpZiAoYmFzZSA9PSAweEEwMDAwKSB7CisgICAgICAgIC8qIFdlIHJlcXVpcmUgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQgdG8gYSA2NEtiIGJvdW5kYXJ5CisgICAgICAgICAqIGZvciBtYXBwaW5nIHRoZSBiYW5rZWQgZnJhbWVidWZmZXIgKHNvIHdlIGNhbiBkbyBlZmZpY2llbnQKKyAgICAgICAgICogY2FycnkgY2hlY2tpbmcgZm9yIGJhbmsgY2hhbmdlcyBpbiB0aGUgYXNzZW1ibGVyIGNvZGUpLiBUaGUgb25seQorICAgICAgICAgKiB3YXkgdG8gZW5zdXJlIHRoaXMgaXMgdG8gZm9yY2UgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQKKyAgICAgICAgICogdG8gYSA0TWIgYm91bmRhcnkuCisgICAgICAgICAqLworICAgICAgICBmbGFncyB8PSBQUl80TUVHOworICAgICAgICB9CisgICAgaWYgKChsaW5lYXIgPSAodWxvbmcpUGFnZVJlc2VydmUoUFJfU1lTVEVNLCpucGFnZXMsZmxhZ3MpKSA9PSAodWxvbmcpLTEpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUGFnZUNvbW1pdFBoeXMobGluZWFyID4+IDEyLCpucGFnZXMscHBhZ2UsUENfSU5DUiB8IFBDX1VTRVIgfCBQQ19XUklURUFCTEUpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIHJldHVybiBsaW5lYXIgKyAoYmFzZSAmIDB4RkZGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitiYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcCBpbgorbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcCBpbgoraXNDYWNoZWQgICAgLSBUcnVlIGlmIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGNhY2hlZCwgZmFsc2UgaWYgbm90CisKK1JFVFVSTlM6CitMaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gbWFwcyBwaHlzaWNhbCBtZW1vcnkgdG8gbGluZWFyIG1lbW9yeSwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZAordG8gY3JlYXRlIGEgc2VsZWN0b3Igb3IgdXNlZCBkaXJlY3RseSBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBwcm9ncmFtcy4KK1RoaXMgaXMgYmV0dGVyIHRoYW4gRFBNSSAweDgwMCwgc2luY2UgaXQgYWxsb3dzIHlvdSB0byBtYXBzIHBoeXNpY2FsCittZW1vcnkgYmVsb3cgMU1iLCB3aGljaCBnZXRzIHRoaXMgbWVtb3J5IG91dCBvZiB0aGUgd2F5IG9mIHRoZSBXaW5kb3dzIFZ4RCdzCitzdGlja3kgcGF3cy4KKworTk9URTogICBJZiB0aGUgbWVtb3J5IGlzIG5vdCBleHBlY3RlZCB0byBiZSBjYWNoZWQsIHRoaXMgZnVuY3Rpb24gd2lsbAorICAgICAgICBkaXJlY3RseSByZS1wcm9ncmFtIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYml0IGluIHRoZQorICAgICAgICBwYWdlIHRhYmxlcy4gVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgbWVjaGFuaXNtIGluIHRoZSBWTU0KKyAgICAgICAgdG8gY29udHJvbCB0aGlzIGJpdCB2aWEgdGhlIHJlZ3VsYXIgaW50ZXJmYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCisgICAgdWxvbmcgYmFzZSwKKyAgICB1bG9uZyBsaW1pdCwKKyAgICBpYm9vbCBpc0NhY2hlZCkKK3sKKyAgICB1bG9uZyAgIGxpbmVhcixsZW5ndGggPSBsaW1pdCsxOworICAgIGludCAgICAgaSxucGFnZXM7CisgICAgdWxvbmcgICBQREIsKnBQREI7CisKKyAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQKKyAgICAgKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgeworICAgICAgICBpZiAobWFwc1tpXS5waHlzaWNhbCA9PSBiYXNlICYmIG1hcHNbaV0ubGVuZ3RoID09IGxlbmd0aCAmJiBtYXBzW2ldLmlzQ2FjaGVkID09IGlzQ2FjaGVkKQorICAgICAgICAgICAgcmV0dXJuICh2b2lkKiltYXBzW2ldLmxpbmVhcjsKKyAgICAgICAgfQorICAgIGlmIChudW1NYXBwaW5ncyA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFdlIGRpZCBub3QgZmluZCBhbnkgcHJldmlvdXNseSBtYXBwZWQgbWVtb3J5IHJlZ2lvbiwgc28gbWFwIGl0IGluLgorICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgdXNlIE1hcFBoeXNUb0xpbmVhciwgc2luY2UgdGhpcyBmdW5jdGlvbiBhcHBlYXJzCisgICAgICogdG8gaGF2ZSBwcm9ibGVtcyBtYXBwaW5nIG1lbW9yeSBpbiB0aGUgMU1iIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCisgICAgICogSGVuY2Ugd2UgdXNlIFBhZ2VSZXNlcnZlIGFuZCBQYWdlQ29tbWl0UGh5cy4KKyAgICAgKi8KKyAgICBpZiAoKGxpbmVhciA9IE1hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCwmbnBhZ2VzKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKKyAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7CisgICAgbWFwc1tudW1NYXBwaW5nc10ubnBhZ2VzID0gbnBhZ2VzOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7CisgICAgbnVtTWFwcGluZ3MrKzsKKworI2lmIDAKKyAgICAvKiBGaW5hbGx5IGRpc2FibGUgY2FjaGluZyB3aGVyZSBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIWlzQ2FjaGVkICYmIChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDApIHsKKyAgICAgICAgaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7CisgICAgICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlOworCisgICAgICAgIGlmIChQREIgPj0gMHgxMDAwMDApCisgICAgICAgICAgICBwUERCID0gKHVsb25nKilNYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRiwmbnBhZ2VzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcFBEQiA9ICh1bG9uZyopUERCOworICAgICAgICBpZiAocFBEQikgeworICAgICAgICAgICAgc3RhcnRQREIgPSAobGluZWFyID4+IDIyKSAmIDB4M0ZGOworICAgICAgICAgICAgc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMikgJiAweDNGRjsKKyAgICAgICAgICAgIGVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKKyAgICAgICAgICAgIGVuZFBhZ2UgPSAoKGxpbmVhcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7CisgICAgICAgICAgICBmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgeworICAgICAgICAgICAgICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2VUYWJsZSA+PSAweDEwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopTWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYsJm5wYWdlcyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwUGFnZVRhYmxlID0gKHVsb25nKilwYWdlVGFibGU7CisgICAgICAgICAgICAgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOworICAgICAgICAgICAgICAgIGVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkY7CisgICAgICAgICAgICAgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCisgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGVbaVBhZ2VdIHw9IDB4MTA7CisgICAgICAgICAgICAgICAgUGFnZUZyZWUoKHVsb25nKXBQYWdlVGFibGUsUFJfU1RBVElDKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBQYWdlRnJlZSgodWxvbmcpcFBEQixQUl9TVEFUSUMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKK3sKKyAgICAvKiBXZSBuZXZlciBmcmVlIHRoZSBtYXBwaW5ncyAqLworfQorCit2b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKK3sKKyAgICAvKiBXZSBuZXZlciBzbGVlcCBpbiBhIFZERCAqLworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICAvLyBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5CisgICAgLy8gICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLgorICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNGODsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgyRjg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCit7CisgICAgLy8gVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheQorICAgIC8vICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4KKyAgICBzd2l0Y2ggKHBvcnQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gMHgzQkM7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIDB4Mzc4OworICAgICAgICBjYXNlIDI6IHJldHVybiAweDI3ODsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKK3sKKyAgICAgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhcgorICAgICAgICAvLyAgICAgICAgICAgICAgIGFkZHJlc3MuCisgICAgICAgIHJldHVybiAweEZGRkZGRkZGVUw7Cit9CisKK3ZvaWQgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKQoreworICAgIGludCBpOworLy8gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspCisvLyAgICAgICAgUGFnZUZyZWUobWFwc1tpXS5saW5lYXIsUFJfU1RBVElDKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKK3sgcmV0dXJuICh2b2lkKilNS19QSFlTKHJfc2VnLHJfb2ZmKTsgfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKK3sgcmV0dXJuIE5VTEw7IH0KKwordm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCit7IH0KKwordm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQoreworICAgIC8qIFVuc2VkIGluIFZERHMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitMb2FkIHRoZSBWODYgcmVnaXN0ZXJzIGluIHRoZSBjbGllbnQgc3RhdGUsIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBzdGF0ZQorYmVmb3JlIGxvYWRpbmcgdGhlIHJlZ2lzdGVycy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBMb2FkVjg2UmVnaXN0ZXJzKAorICAgIFBDUkYgc2F2ZVJlZ3MsCisgICAgUk1SRUdTICppbiwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBQQ1JGICAgICAgICAgICAgcGNyZjsgICAgIC8vIGN1cnJlbnQgY2xpZW50IHJlZ2lzdGVyIGZyYW1lCisKKyAgICAvLyBnZXQgcG9pbnRlciB0byByZWdpc3RlcnMKKyAgICBwY3JmID0gKFBDUkYpVkRIUXVlcnlTeXNWYWx1ZShDVVJSRU5UX1ZETSwgVkRITFNWX1BDUkYpOworCisgICAgLy8gTm90ZTogV2UgY291bGQgZG8gVkRIUHVzaFJlZ3MgaW5zdGVhZCBidXQgdGhpcyBzaG91bGQgYmUgc2FmZXIgYXMgaXQKKyAgICAvLyBkb2Vzbid0IHJlbHkgb24gdGhlIFZETSBzZXNzaW9uIGhhdmluZyBlbm91Z2ggZnJlZSBzdGFjayBzcGFjZS4KKyAgICAqc2F2ZVJlZ3MgPSAqcGNyZjsgICAgICAgIC8vIHNhdmUgYWxsIHJlZ2lzdGVycworCisgICAgcGNyZi0+Y3JmX2VheCA9IGluLT5lLmVheDsgICAgLy8gbG9hZCBuZXcgdmFsdWVzCisgICAgcGNyZi0+Y3JmX2VieCA9IGluLT5lLmVieDsKKyAgICBwY3JmLT5jcmZfZWN4ID0gaW4tPmUuZWN4OworICAgIHBjcmYtPmNyZl9lZHggPSBpbi0+ZS5lZHg7CisgICAgcGNyZi0+Y3JmX2VzaSA9IGluLT5lLmVzaTsKKyAgICBwY3JmLT5jcmZfZWRpID0gaW4tPmUuZWRpOworICAgIHBjcmYtPmNyZl9lcyAgPSBzcmVncy0+ZXM7CisgICAgcGNyZi0+Y3JmX2RzICA9IHNyZWdzLT5kczsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIFY4NiByZWdpc3RlcnMgZnJvbSB0aGUgY2xpZW50IHN0YXRlIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZWFkVjg2UmVnaXN0ZXJzKAorICAgIFBDUkYgc2F2ZVJlZ3MsCisgICAgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgUENSRiAgICAgICAgICAgIHBjcmY7ICAgICAvLyBjdXJyZW50IGNsaWVudCByZWdpc3RlciBmcmFtZQorCisgICAgLy8gZ2V0IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgICAgcGNyZiA9IChQQ1JGKVZESFF1ZXJ5U3lzVmFsdWUoQ1VSUkVOVF9WRE0sIFZESExTVl9QQ1JGKTsKKworICAgIC8vIHJlYWQgbmV3IHJlZ2lzdGVyIHZhbHVlcworICAgIG91dC0+ZS5lYXggPSBwY3JmLT5jcmZfZWF4OworICAgIG91dC0+ZS5lYnggPSBwY3JmLT5jcmZfZWJ4OworICAgIG91dC0+ZS5lY3ggPSBwY3JmLT5jcmZfZWN4OworICAgIG91dC0+ZS5lZHggPSBwY3JmLT5jcmZfZWR4OworICAgIG91dC0+ZS5lc2kgPSBwY3JmLT5jcmZfZXNpOworICAgIG91dC0+ZS5lZGkgPSBwY3JmLT5jcmZfZWRpOworICAgIHNyZWdzLT5lcyAgPSBwY3JmLT5jcmZfZXM7CisgICAgc3JlZ3MtPmRzICA9IHBjcmYtPmNyZl9kczsKKworICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgY2xpZW50IHJlZ2lzdGVycworICAgICpwY3JmID0gKnNhdmVSZWdzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzogVXNlZCBmb3IgZmFyIGNhbGxzIGludG8gVjg2IGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIEhPT0tFTlRSWSBVc2VyUmV0dXJuSG9vaygKKyAgUFZPSUQgcFJlZkRhdGEsCisgIFBDUkYgcGNyZiApCit7CisgICAgVkRIUG9zdEV2ZW50U2VtKGhldkZhckNhbGxSZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzogVXNlZCBmb3IgY2FsbGluZyBCSU9TIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIEhPT0tFTlRSWSBVc2VySVJldEhvb2soCisgIFBWT0lEIHBSZWZEYXRhLAorICBQQ1JGIHBjcmYgKQoreworICAgIFZESFBvc3RFdmVudFNlbShoZXZJUmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIGEgVjg2IHJlYWwgbW9kZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCitsb2FkZWQgYmVmb3JlIHRoZSBjYWxsLiBUaGUgY2FsbCByZXR1cm5zIHdpdGggYSBmYXIgcmV0LgorTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBET1Mgc2Vzc2lvbiBjb250ZXh0IQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAorICAgIHVpbnQgc2VnLAorICAgIHVpbnQgb2ZmLAorICAgIFJNUkVHUyAqcmVncywKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBDUkYgICBzYXZlUmVnczsKKyAgICBGUEZOICBmbkFkZHJlc3M7CisgICAgVUxPTkcgcmM7CisKKyAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOworICAgIExvYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncykscmVncyxzcmVncyk7CisKKyAgICAvLyBzZXQgdXAgcmV0dXJuIGhvb2sgZm9yIGNhbGwKKyAgICByYyA9IFZESEFybVJldHVybkhvb2soaGhvb2tVc2VyUmV0dXJuSG9vaywgVkRIQVJIX0NTRUlQX0hPT0spOworCisgICAgVkRIUmVzZXRFdmVudFNlbShoZXZGYXJDYWxsUmV0KTsKKworICAgIC8vIHRoZSBhZGRyZXNzIGlzIGEgMTY6MzIgcG9pbnRlcgorICAgIE9GRlNFVE9GMzIoZm5BZGRyZXNzKSAgPSBvZmY7CisgICAgU0VHTUVOVE9GMzIoZm5BZGRyZXNzKSA9IHNlZzsKKyAgICByYyA9IFZESFB1c2hGYXJDYWxsKGZuQWRkcmVzcyk7CisgICAgVkRIWWllbGQoMCk7CisKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBWODYgY2FsbCByZXR1cm5zIC0gb3VyIHJldHVybiBob29rIHBvc3RzIHRoZSBzZW1hcGhvcmUKKyAgICByYyA9IFZESFdhaXRFdmVudFNlbShoZXZGYXJDYWxsUmV0LCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKworICAgIFJlYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncykscmVncyxzcmVncyk7CisgICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcworbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgorTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBET1Mgc2Vzc2lvbiBjb250ZXh0IQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCkKK3sKKyAgICBSTVNSRUdTICAgIHNyZWdzID0gezB9OworICAgIENSRiAgICAgICAgc2F2ZVJlZ3M7CisgICAgdXNob3J0ICAgICBvbGREaXNhYmxlOworICAgIFVMT05HICAgICAgcmM7CisKKyAgICBtZW1zZXQoU1NUb0RTKCZzcmVncyksIDAsIHNpemVvZihzcmVncykpOworCisjaWYgMCAgIC8vIGRvIHdlIG5lZWQgdGhpcz8/CisgICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWREQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KKyAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODYoKVxuIik7CisgICAgaWYgKGRpc2FibGVUU1JGbGFnKSB7CisgICAgICAgIG9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7CisgICAgICAgICpkaXNhYmxlVFNSRmxhZyA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgTG9hZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgaW4sIFNTVG9EUygmc3JlZ3MpKTsKKworICAgIFZESFJlc2V0RXZlbnRTZW0oaGV2SVJldCk7CisgICAgcmMgPSBWREhQdXNoSW50KGludG5vKTsKKworICAgIC8vIHNldCB1cCByZXR1cm4gaG9vayBmb3IgaW50ZXJydXB0CisgICAgcmMgPSBWREhBcm1SZXR1cm5Ib29rKGhob29rVXNlcklSZXRIb29rLCBWREhBUkhfTk9STUFMX0lSRVQpOworCisgICAgVkRIWWllbGQoMCk7CisKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBWODYgSVJFVHMgLSBvdXIgcmV0dXJuIGhvb2sgcG9zdHMgdGhlIHNlbWFwaG9yZQorICAgIHJjID0gVkRIV2FpdEV2ZW50U2VtKGhldklSZXQsIDUwMDApOyAvL1NFTV9JTkRFRklOSVRFX1dBSVQpOworCisgICAgUmVhZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgb3V0LCBTU1RvRFMoJnNyZWdzKSk7CisKKyNpZiAwCisgICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZERCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLworICAgIGlmIChkaXNhYmxlVFNSRmxhZykKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKKyNlbmRpZgorCisgICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODYoKVxuIik7CisgICAgcmV0dXJuIG91dC0+eC5heDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcworbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9pbnQ4NngoCisgICAgaW50IGludG5vLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgQ1JGICAgICAgICAgICAgIHNhdmVSZWdzOworICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOworICAgIFVMT05HICAgICAgIHJjOworCisjaWYgMAorICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCisgICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKKyAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKKyAgICAgICAgb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgTG9hZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgaW4sIHNyZWdzKTsKKworICAgIFZESFJlc2V0RXZlbnRTZW0oaGV2SVJldCk7CisgICAgcmMgPSBWREhQdXNoSW50KGludG5vKTsKKworICAgIC8vIHNldCB1cCByZXR1cm4gaG9vayBmb3IgaW50ZXJydXB0CisgICAgcmMgPSBWREhBcm1SZXR1cm5Ib29rKGhob29rVXNlcklSZXRIb29rLCBWREhBUkhfTk9STUFMX0lSRVQpOworCisgICAgVkRIWWllbGQoMCk7CisKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBWODYgSVJFVHMgLSBvdXIgcmV0dXJuIGhvb2sgcG9zdHMgdGhlIHNlbWFwaG9yZQorICAgIHJjID0gVkRIV2FpdEV2ZW50U2VtKGhldklSZXQsIDUwMDApOyAvL1NFTV9JTkRFRklOSVRFX1dBSVQpOworCisgICAgUmVhZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgb3V0LCBzcmVncyk7CisKKyNpZiAwCisgICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLworICAgIGlmIChkaXNhYmxlVFNSRmxhZykKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKKyNlbmRpZgorCisgICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODZ4KClcbiIpOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCit7ICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgVUxPTkcgICAgICAgZmxhZ3MgPSBWREhBUF9TWVNURU07CisgICAgVUxPTkcgICAgICAgblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7CisKKyAgICBmbGFncyB8PSAocGh5c0FkZHIgIT0gTlVMTCkgPyBWREhBUF9QSFlTSUNBTCA6IFZESEFQX0ZJWEVEOworCisgICAgcmV0dXJuIFZESEFsbG9jUGFnZXMocGh5c0FkZHIsIG5QYWdlcywgVkRIQVBfU1lTVEVNIHwgVkRIQVBfUEhZU0lDQUwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCisgICAgdm9pZCAqcCwKKyAgICB1aW50IHNpemUsCisgICAgaWJvb2wgY29udGlndW91cykKK3sKKyAgICBpZiAocCkKKyAgICAgICAgVkRIRnJlZVBhZ2VzKChQVk9JRClwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitMb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBVTE9ORyAgbG9ja0hhbmRsZTsKKworICAgIC8vIFRPRE86IHRoZSBsb2NrIGhhbmRsZSBpcyBlc3NlbnRpYWwgZm9yIHRoZSB1bmxvY2sgb3BlcmF0aW9uISEKKyAgICBsb2NrSGFuZGxlID0gVkRITG9ja01lbShwLCBsZW4sIDAsIChQVk9JRClWREhMTV9OT19BRERSLCBOVUxMKTsKKworICAgIGlmIChsb2NrSGFuZGxlICE9IE5VTEwpCisgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgLSB1c2UgYSB0YWJsZSBvZiBsb2NrIGhhbmRsZXM/CisgICAgLy8gVkRIVW5sb2NrUGFnZXMobG9ja0hhbmRsZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHJldHVybiBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICByZXR1cm4gUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZERAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgKHZvaWQpc3pETExOYW1lOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK09TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWREQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUsCisgICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKK3sKKyAgICAodm9pZCloTW9kdWxlOworICAgICh2b2lkKXN6UHJvY05hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZERAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUpCit7CisgICAgKHZvaWQpaE1vZHVsZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaAorICAgIC8vICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUKKyAgICAvLyAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLgorICAgICh2b2lkKWZpbGVuYW1lOworICAgICh2b2lkKWZpbmREYXRhOworICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKKyAgICB2b2lkICpoYW5kbGUsCisgICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQoreworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24KKyAgICAvLyAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvCisgICAgLy8gICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQKKyAgICAvLyAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4KKyAgICAodm9pZCloYW5kbGU7CisgICAgKHZvaWQpZmluZERhdGE7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKKyAgICB2b2lkICpoYW5kbGUpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8KKyAgICAvLyAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLgorICAgICh2b2lkKWhhbmRsZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCitmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAordGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCitudW1iZXJpbmcgaXM6CisKKyAgICAxICAgLSBEcml2ZSBBOgorICAgIDIgICAtIERyaXZlIEI6CisgICAgMyAgIC0gRHJpdmUgQzoKKyAgICBldGMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCisgICAgY2hhciBkcml2ZSkKK3sKKyAgICAvLyBOb3QgYXBwbGljYWJsZSBpbiBhIFZERAorICAgICh2b2lkKWRyaXZlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgorVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCitvZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKKyAgICBpbnQgZHJpdmUsCisgICAgY2hhciAqZGlyLAorICAgIGludCBsZW4pCit7CisgICAgLy8gTm90IGFwcGxpY2FibGUgaW4gYSBWREQKKyAgICAodm9pZClkcml2ZTsKKyAgICAodm9pZClkaXI7CisgICAgKHZvaWQpbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Jhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3NpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCit0eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFVFVSTlM6CitFcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgc2l6ZSwKKyAgICB1aW50IHR5cGUpCit7CisgICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgdWludCBhdHRyaWIpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgPworICAgICh2b2lkKWZpbGVuYW1lOworICAgICh2b2lkKWF0dHJpYjsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQhIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzID8KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQhIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX21rZGlyKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzID8KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9ta2RpciBub3QgaW1wbGVtZW50ZWQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/CisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgUE1fZmF0YWxFcnJvcigiUE1fcm1kaXIgbm90IGltcGxlbWVudGVkISIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGlib29sIGdtVGltZSwKKyAgICBQTV90aW1lICp0aW1lKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzID8KKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClnbVRpbWU7CisgICAgKHZvaWQpdGltZTsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgPworICAgICh2b2lkKWZpbGVuYW1lOworICAgICh2b2lkKWdtVGltZTsKKyAgICAodm9pZCl0aW1lOworICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCEiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC92ZmxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzYzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvdmZsYXQuYwpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgICAgICAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKworaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCit7CisgICAgICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQoreworICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxZjY1NQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC96dGltZXIuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECisqCisqIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVsb25nICAgIGZyZXF1ZW5jeSA9IDExOTMxODA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX1pUaW1lckluaXQoKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+c3RhcnQuaGlnaCwmdG0tPnN0YXJ0LmxvdykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgQ1BVX2xhcmdlSW50ZWdlciAgICBsYXAsY291bnQ7CisgICAgVlREX0dldF9SZWFsX1RpbWUoJmxhcC5oaWdoLCZsYXAubG93KTsKKyAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmbGFwLCZjb3VudCk7CisgICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZjb3VudCxmcmVxdWVuY3kpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+ZW5kLmhpZ2gsJnRtLT5lbmQubG93KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIENQVV9sYXJnZUludGVnZXIgdG1Db3VudDsKKyAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7CisgICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGZyZXF1ZW5jeSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCit7CisgICAgcmV0dXJuIFZESFF1ZXJ5U3lzVmFsdWUoMCwgVkRIR1NWX01TRUNTQk9PVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQord2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCithY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCitwYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKK3sgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvX3BtLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9fcG0uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTdjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvX3BtLmFzbQpAQCAtMCwwICsxLDI5OSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgVnhECis7KgorOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bworOyogICAgICAgICAgICAgIFdpbmRvd3MgVnhEcy4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG0gICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKKworYmVnZGF0YXNlZyAgX3BtCisKKyAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAorCitlbmRkYXRhc2VnICBfcG0KKworUDU4NgorCitiZWdjb2Rlc2VnICBfcG0gICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIHNlZ21lbnQgcmVnaXN0ZXJzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fc2VncmVhZAorCisgICAgICAgIEFSRyAgICAgc3JlZ3M6RFBUUgorCisgICAgICAgIGVudGVyX2MKKworICAgICAgICBtb3YgICAgIGF4LGVzCisgICAgICAgIF9sZXMgICAgX3NpLFtzcmVnc10KKyAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sYXgKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSsyXSxjcworICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzRdLHNzCisgICAgICAgIG1vdiAgICAgW19FUyBfc2krNl0sZHMKKyAgICAgICAgbW92ICAgICBbX0VTIF9zaSs4XSxmcworICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzEwXSxncworCisgICAgICAgIGxlYXZlX2MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJc3N1ZXMgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgcm91dGluZSBoYXMgYmVlbgorOyB3cml0dGVuIHRvIGFsbG93IHVzZXIgcHJvZ3JhbXMgdG8gbG9hZCBDUyBhbmQgRFMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCis7IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1faW50Mzg2eAorCis7IE5vdCB1c2VkIGZvciBWeERzCisKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2F2ZURTKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTYXZlIHRoZSB2YWx1ZSBvZiBEUyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY29kZSBzZWdtZW50LCBzbyB0aGF0IHdlIGNhbgorOyBxdWlja2x5IGxvYWQgdGhpcyB2YWx1ZSBhdCBhIGxhdGVyIGRhdGUgaW4gdGhlIFBNX2xvYWREUygpIHJvdXRpbmUgZnJvbQorOyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzIGV0Yy4gVGhlIG1ldGhvZCB0byBkbyB0aGlzIGlzIGRpZmZlcmVudAorOyBkZXBlbmRpbmcgb24gdGhlIERPUyBleHRlbmRlciBiZWluZyB1c2VkLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIFBNX3NhdmVEUworCisgICAgICAgIG1vdiAgICAgW19QTV9zYXZlZERTXSxkcyAgICA7IFN0b3JlIGF3YXkgaW4gZGF0YSBzZWdtZW50CisgICAgICAgIHJldAorCitjcHJvY2VuZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIFBNX2xvYWREUyh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUm91dGluZSB0byBsb2FkIHRoZSBEUyByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY3VycmVudAorOyBET1MgZXh0ZW5kZXIuIE9ubHkgdGhlIERTIHJlZ2lzdGVyIGlzIGxvYWRlZCwgbm90IHRoZSBFUyByZWdpc3Rlciwgc28KKzsgaWYgeW91IHdpc2ggdG8gY2FsbCBDIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gYWxzbyBsb2FkIHRoZSBFUyByZWdpc3RlcgorOyBpbiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgUE1fbG9hZERTCisKKyAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdIDsgV2UgY2FuIGFjY2VzcyB0aGUgcHJvcGVyIERTIHRocm91Z2ggQ1MKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2V0QmFua0EoaW50IGJhbmspCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBCisKKzsgTm90IHVzZWQgZm9yIFZ4RHMKKworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgorCis7IE5vdCB1c2VkIGZvciBWeERzCisKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgICAgIFBNX3NldENSVFN0YXJ0CisKKzsgTm90IHVzZWQgZm9yIFZ4RHMKKworICAgICAgICByZXQKKworY3Byb2NlbmQKKworOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KKzsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCis7IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KKworaWZkZWYgICBVU0VfTkFTTQorJW1hY3JvICBERUxBWSAwCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCislZW5kbWFjcm8KKyVtYWNybyAgSU9ERUxBWU4gMQorJXJlcCAgICAlMQorICAgICAgICBERUxBWQorJWVuZHJlcAorJWVuZG1hY3JvCitlbHNlCittYWNybyAgIERFTEFZCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCisgICAgICAgIGptcCAgICAgc2hvcnQgJCsyCitlbmRtCittYWNybyAgIElPREVMQVlOICAgIE4KKyAgICByZXB0ICAgIE4KKyAgICAgICAgREVMQVkKKyAgICBlbmRtCitlbmRtCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAorOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUworCisgICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAorCisgICAgICAgIHB1c2ggICAgX2JwCisgICAgICAgIG1vdiAgICAgX2JwLF9zcAorICAgICAgICBwdXNoZmQKKyAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KKyAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKKyAgICAgICAgY2xpCisgICAgICAgIG91dCAgICAgNzBoLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgaW4gICAgICBhbCw3MWgKKyAgICAgICAgbW92ICAgICBhaCxhbAorICAgICAgICB4b3IgICAgIGFsLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQorICAgICAgICBtb3YgICAgIGFsLGFoICAgICAgICAgICAgICAgOyBSZXR1cm4gdmFsdWUgaW4gQUwKKyAgICAgICAgcG9wZmQKKyAgICAgICAgcG9wICAgICBfYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCis7IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX1BNX3dyaXRlQ01PUworCisgICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVCwgdmFsdWU6VUNIQVIKKworICAgICAgICBwdXNoICAgIF9icAorICAgICAgICBtb3YgICAgIF9icCxfc3AKKyAgICAgICAgcHVzaGZkCisgICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCisgICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCisgICAgICAgIGNsaQorICAgICAgICBvdXQgICAgIDcwaCxhbAorICAgICAgICBJT0RFTEFZTiA1CisgICAgICAgIG1vdiAgICAgYWwsW3ZhbHVlXQorICAgICAgICBvdXQgICAgIDcxaCxhbAorICAgICAgICB4b3IgICAgIGFsLGFsCisgICAgICAgIElPREVMQVlOIDUKKyAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQorICAgICAgICBwb3BmZAorICAgICAgICBwb3AgICAgIF9icAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgZG91YmxlIF9mdG9sKGRvdWJsZSBmKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2FsbHMgdG8gX19mdG9sIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIEJvcmxhbmQgQysrIGNvbXBpbGVyIGZvciBjb2RlCis7IHRoYXQgbmVlZHMgdG8gY29udmVydCBhIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gYW4gaW50ZWdyYWwgdHlwZS4KKzsKKzsgSW5wdXQ6IGZsb2F0aW5nIHBvaW50IG51bWJlciBvbiB0aGUgdG9wIG9mIHRoZSAnODcuCis7Cis7IE91dHB1dDogYSAoc2lnbmVkIG9yIHVuc2lnbmVkKSBsb25nIGluIEVBWAorOyBBbGwgb3RoZXIgcmVnaXN0ZXJzIHByZXNlcnZlZC4KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Byb2NzdGFydCAgX2Z0b2wKKworICAgICAgICBMT0NBTCAgIHRlbXAxOldPUkQsIHRlbXAyOlFXT1JEID0gTG9jYWxTaXplCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsZXNwCisgICAgICAgIHN1YiAgICAgZXNwLExvY2FsU2l6ZQorCisgICAgICAgIGZzdGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyBzYXZlIHRoZSBjb250cm9sIHdvcmQKKyAgICAgICAgZndhaXQKKyAgICAgICAgbW92ICAgICBhbCxbQllURSB0ZW1wMSsxXQorICAgICAgICBvciAgICAgIFtCWVRFIHRlbXAxKzFdLDBDaCAgICAgIDsgc2V0IHJvdW5kaW5nIGNvbnRyb2wgdG8gY2hvcAorICAgICAgICBmbGRjdyAgIFt0ZW1wMV0KKyAgICAgICAgZmlzdHAgICBbdGVtcDJdICAgICAgICAgICAgICAgICA7IGNvbnZlcnQgdG8gNjQtYml0IGludGVnZXIKKyAgICAgICAgbW92ICAgICBbQllURSB0ZW1wMSsxXSxhbAorICAgICAgICBmbGRjdyAgIFt0ZW1wMV0gICAgICAgICAgICAgICAgIDsgcmVzdG9yZSB0aGUgY29udHJvbCB3b3JkCisgICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCB0ZW1wMl0gICAgICAgOyByZXR1cm4gTFMgMzIgYml0cworICAgICAgICBtb3YgICAgIGVkeCxbRFdPUkQgdGVtcDIrNF0gICAgIDsgICAgICAgIE1TIDMyIGJpdHMKKworICAgICAgICBtb3YgICAgIGVzcCxlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK2Nwcm9jZW5kCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IF9QTV9nZXRQREIgLSBSZXR1cm4gdGhlIFBhZ2UgVGFibGUgRGlyZWN0b3J5IEJhc2UgYWRkcmVzcworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9nZXRQREIKKworICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAorICAgICAgICByZXQKKworY3Byb2NlbmQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRmx1c2ggdGhlIFRyYW5zbGF0aW9uIExvb2thc2lkZSBidWZmZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcHJvY3N0YXJ0ICBQTV9mbHVzaFRMQgorCisgICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQorICAgICAgICBtb3YgICAgIGVheCxjcjMKKyAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCisgICAgICAgIHJldAorCitjcHJvY2VuZAorCitlbmRjb2Rlc2VnICBfcG0KKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvY3B1aW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2VhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvY3B1aW5mby5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAorKgorKiBEZXNjcmlwdGlvbjogIFZ4RCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RvIG5vdGhpbmcgZm9yIFZ4RCdzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RvIG5vdGhpbmcgZm9yIFZ4RCdzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQoreworICAgIGZyZXEtPmxvdyA9IDExOTMxODA7CisgICAgZnJlcS0+aGlnaCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWVERfR2V0X1JlYWxfVGltZSgmY291bnQuaGlnaCwmY291bnQubG93KTsgIFwKKyAgICAodCktPmxvdyA9IGNvdW50LmxvdzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodCktPmhpZ2ggPSBjb3VudC5oaWdoOyAgICAgICAgICAgICAgICAgICAgIFwKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9maWxlaW8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9maWxlaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZmNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2ZpbGVpby5jCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKKyoKKyogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBJL08gZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGEgVnhELgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAidnhkZmlsZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIENvZGUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEVPRiAtMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Z4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZvcGVuIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZJTEUgKiBmb3BlbigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBjb25zdCBjaGFyICptb2RlKQoreworICAgIEZJTEUgICAgKmYgPSBQTV9tYWxsb2Moc2l6ZW9mKEZJTEUpKTsKKyAgICBsb25nICAgIG9sZHBvczsKKworICAgIGlmIChmKSB7CisgICAgICAgIGYtPm9mZnNldCA9IDA7CisgICAgICAgIGYtPnRleHQgPSAobW9kZVsxXSA9PSAndCcgfHwgbW9kZVsyXSA9PSAndCcpOworICAgICAgICBmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7CisgICAgICAgIGlmIChpbml0Q29tcGxldGUpIHsKKyAgICAgICAgICAgIFdPUkQgICAgb21vZGUsZXJyb3I7CisgICAgICAgICAgICBCWVRFICAgIGFjdGlvbjsKKworICAgICAgICAgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7CisgICAgICAgICAgICAgICAgb21vZGUgPSBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19GQUlMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVbMF0gPT0gJ3cnKSB7CisgICAgICAgICAgICAgICAgb21vZGUgPSBPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX1RSVU5DQVRFIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvbW9kZSA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZi0+aGFuZGxlID0gKGludClSMF9PcGVuQ3JlYXRlRmlsZShmYWxzZSwoY2hhciopZmlsZW5hbWUsb21vZGUsQVRUUl9OT1JNQUwsYWN0aW9uLDAsJmVycm9yLCZhY3Rpb24pOworICAgICAgICAgICAgaWYgKGYtPmhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUE1fZnJlZShmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmLT5maWxlc2l6ZSA9IFIwX0dldEZpbGVTaXplKChIQU5ETEUpZi0+aGFuZGxlLCZlcnJvcik7CisgICAgICAgICAgICBpZiAobW9kZVswXSA9PSAnYScpCisgICAgICAgICAgICAgICAgZnNlZWsoZiwwLDIpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBvZmxhZyxwbW9kZTsKKworICAgICAgICAgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7CisgICAgICAgICAgICAgICAgcG1vZGUgPSBfU19JUkVBRDsKKyAgICAgICAgICAgICAgICBvZmxhZyA9IF9PX1JET05MWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgeworICAgICAgICAgICAgICAgIHBtb2RlID0gX1NfSVdSSVRFOworICAgICAgICAgICAgICAgIG9mbGFnID0gX09fV1JPTkxZIHwgX09fQ1JFQVQgfCBfT19UUlVOQzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwbW9kZSA9IF9TX0lXUklURTsKKyAgICAgICAgICAgICAgICBvZmxhZyA9IF9PX1JEV1IgfCBfT19DUkVBVCB8IF9PX0FQUEVORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZi0+dGV4dCkKKyAgICAgICAgICAgICAgICBvZmxhZyB8PSBfT19URVhUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mbGFnIHw9IF9PX0JJTkFSWTsKKyAgICAgICAgICAgIGlmICgoZi0+aGFuZGxlID0gaV9vcGVuKGZpbGVuYW1lLG9mbGFnLHBtb2RlKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTV9mcmVlKGYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZHBvcyA9IGlfbHNlZWsoZi0+aGFuZGxlLDAsMSk7CisgICAgICAgICAgICBmLT5maWxlc2l6ZSA9IGlfbHNlZWsoZi0+aGFuZGxlLDAsMik7CisgICAgICAgICAgICBpX2xzZWVrKGYtPmhhbmRsZSxvbGRwb3MsMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSBWeEQgZmlsZSBJL08KK2Z1bmN0aW9ucyBhcmUgbGF5ZXJlZCBvbiBET1MsIHNvIGNhbiBvbmx5IHJlYWQgdXAgdG8gNjRLIGF0IGEgdGltZS4gU2luY2UKK3dlIGFyZSBleHBlY3RlZCB0byBoYW5kbGUgbXVjaCBsYXJnZXIgY2h1bmtzIHRoYW4gdGhpcywgd2UgaGFuZGxlIGxhcmdlcgorYmxvY2tzIGF1dG9tYXRpY2FsbHkgaW4gaGVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgZnJlYWQoCisgICAgdm9pZCAqcHRyLAorICAgIHNpemVfdCBzaXplLAorICAgIHNpemVfdCBuLAorICAgIEZJTEUgKmYpCit7CisgICAgY2hhciAgICAqYnVmID0gcHRyOworICAgIFdPUkQgICAgZXJyb3I7CisgICAgaW50ICAgICBieXRlcyA9IHNpemUgKiBuOworICAgIGludCAgICAgcmVhZGJ5dGVzLHRvdGFsYnl0ZXMgPSAwOworCisgICAgd2hpbGUgKGJ5dGVzID4gMHgxMDAwMCkgeworICAgICAgICBpZiAoaW5pdENvbXBsZXRlKSB7CisgICAgICAgICAgICByZWFkYnl0ZXMgID0gUjBfUmVhZEZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLDB4ODAwMCxmLT5vZmZzZXQsJmVycm9yKTsKKyAgICAgICAgICAgIHJlYWRieXRlcyArPSBSMF9SZWFkRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCxmLT5vZmZzZXQrMHg4MDAwLCZlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVhZGJ5dGVzICA9IGlfcmVhZChmLT5oYW5kbGUsYnVmLDB4ODAwMCk7CisgICAgICAgICAgICByZWFkYnl0ZXMgKz0gaV9yZWFkKGYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIHRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOworICAgICAgICBmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOworICAgICAgICBidWYgKz0gMHgxMDAwMDsKKyAgICAgICAgYnl0ZXMgLT0gMHgxMDAwMDsKKyAgICAgICAgfQorICAgIGlmIChieXRlcykgeworICAgICAgICBpZiAoaW5pdENvbXBsZXRlKQorICAgICAgICAgICAgcmVhZGJ5dGVzID0gUjBfUmVhZEZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLGJ5dGVzLGYtPm9mZnNldCwmZXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWFkYnl0ZXMgPSBpX3JlYWQoZi0+aGFuZGxlLGJ1ZixieXRlcyk7CisgICAgICAgIHRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOworICAgICAgICBmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOworICAgICAgICB9CisgICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Z4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ3cml0ZSBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSBWeEQgZmlsZSBJL08KK2Z1bmN0aW9ucyBhcmUgbGF5ZXJlZCBvbiBET1MsIHNvIGNhbiBvbmx5IHJlYWQgdXAgdG8gNjRLIGF0IGEgdGltZS4gU2luY2UKK3dlIGFyZSBleHBlY3RlZCB0byBoYW5kbGUgbXVjaCBsYXJnZXIgY2h1bmtzIHRoYW4gdGhpcywgd2UgaGFuZGxlIGxhcmdlcgorYmxvY2tzIGF1dG9tYXRpY2FsbHkgaW4gaGVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgZndyaXRlKAorICAgIGNvbnN0IHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgbiwKKyAgICBGSUxFICpmKQoreworICAgIGNvbnN0IGNoYXIgICpidWYgPSBwdHI7CisgICAgV09SRCAgICAgICAgZXJyb3I7CisgICAgaW50ICAgICAgICAgYnl0ZXMgPSBzaXplICogbjsKKyAgICBpbnQgICAgICAgICB3cml0dGVuYnl0ZXMsdG90YWxieXRlcyA9IDA7CisKKyAgICBpZiAoIWYtPndyaXRlbW9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKGJ5dGVzID4gMHgxMDAwMCkgeworICAgICAgICBpZiAoaW5pdENvbXBsZXRlKSB7CisgICAgICAgICAgICB3cml0dGVuYnl0ZXMgID0gUjBfV3JpdGVGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZiwweDgwMDAsZi0+b2Zmc2V0LCZlcnJvcik7CisgICAgICAgICAgICB3cml0dGVuYnl0ZXMgKz0gUjBfV3JpdGVGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZisweDgwMDAsMHg4MDAwLGYtPm9mZnNldCsweDgwMDAsJmVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0dGVuYnl0ZXMgID0gaV93cml0ZShmLT5oYW5kbGUsYnVmLDB4ODAwMCk7CisgICAgICAgICAgICB3cml0dGVuYnl0ZXMgKz0gaV93cml0ZShmLT5oYW5kbGUsYnVmKzB4ODAwMCwweDgwMDApOworICAgICAgICAgICAgfQorICAgICAgICB0b3RhbGJ5dGVzICs9IHdyaXR0ZW5ieXRlczsKKyAgICAgICAgZi0+b2Zmc2V0ICs9IHdyaXR0ZW5ieXRlczsKKyAgICAgICAgYnVmICs9IDB4MTAwMDA7CisgICAgICAgIGJ5dGVzIC09IDB4MTAwMDA7CisgICAgICAgIH0KKyAgICBpZiAoaW5pdENvbXBsZXRlKQorICAgICAgICB3cml0dGVuYnl0ZXMgPSBSMF9Xcml0ZUZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLGJ5dGVzLGYtPm9mZnNldCwmZXJyb3IpOworICAgIGVsc2UKKyAgICAgICAgd3JpdHRlbmJ5dGVzID0gaV93cml0ZShmLT5oYW5kbGUsYnVmLGJ5dGVzKTsKKyAgICB0b3RhbGJ5dGVzICs9IHdyaXR0ZW5ieXRlczsKKyAgICBmLT5vZmZzZXQgKz0gd3JpdHRlbmJ5dGVzOworICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKKyAgICAgICAgZi0+ZmlsZXNpemUgPSBmLT5vZmZzZXQ7CisgICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Z4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZmbHVzaCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmZsdXNoKAorICAgIEZJTEUgKmYpCit7CisgICAgLy8gTm90aGluZyB0byBkbyBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIGJ1ZmZlcmVkIGZpbGUgSS9PCisgICAgKHZvaWQpZjsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmc2VlayBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZnNlZWsoCisgICAgRklMRSAqZiwKKyAgICBsb25nIGludCBvZmZzZXQsCisgICAgaW50IHdoZW5jZSkKK3sKKyAgICBpZiAod2hlbmNlID09IDApCisgICAgICAgIGYtPm9mZnNldCA9IG9mZnNldDsKKyAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKKyAgICAgICAgZi0+b2Zmc2V0ICs9IG9mZnNldDsKKyAgICBlbHNlIGlmICh3aGVuY2UgPT0gMikKKyAgICAgICAgZi0+b2Zmc2V0ID0gZi0+ZmlsZXNpemUgKyBvZmZzZXQ7CisgICAgaWYgKCFpbml0Q29tcGxldGUpCisgICAgICAgIGlfbHNlZWsoZi0+aGFuZGxlLGYtPm9mZnNldCwwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmdGVsbCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIGZ0ZWxsKAorICAgIEZJTEUgKmYpCit7CisgICAgcmV0dXJuIGYtPm9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitWeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZW9mIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZW9mKAorICAgIEZJTEUgKmYpCit7CisgICAgcmV0dXJuIChmLT5vZmZzZXQgPT0gZi0+ZmlsZXNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZnZXRzIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgKmZnZXRzKAorICAgIGNoYXIgKnMsCisgICAgaW50IG4sCisgICAgRklMRSAqZikKK3sKKyAgICBpbnQgICAgIGxlbjsKKyAgICBjaGFyICAgICpjczsKKworICAgIC8vIFJlYWQgdGhlIGVudGlyZSBidWZmZXIgaW50byBtZW1vcnkgKG91ciBmdW5jdGlvbnMgYXJlIHVuYnVmZmVyZWQhKQorICAgIGlmICgobGVuID0gZnJlYWQocywxLG4sZikpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gU2VhcmNoIGZvciAnXG4nIG9yIGVuZCBvZiBzdHJpbmcKKyAgICBpZiAobiA+IGxlbikKKyAgICAgICAgbiA9IGxlbjsKKyAgICBjcyA9IHM7CisgICAgd2hpbGUgKC0tbiA+IDApIHsKKyAgICAgICAgaWYgKCpjcyA9PSAnXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNzKys7CisgICAgICAgIH0KKyAgICAqY3MgPSAnXDAnOworICAgIHJldHVybiBzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK05UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZwdXRzIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmcHV0cygKKyAgICBjb25zdCBjaGFyICpzLAorICAgIEZJTEUgKmYpCit7CisgICAgcmV0dXJuIGZ3cml0ZShzLDEsc3RybGVuKHMpLGYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Z4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZjbG9zZSBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmNsb3NlKAorICAgIEZJTEUgKmYpCit7CisgICAgV09SRCBlcnJvcjsKKworICAgIGlmIChpbml0Q29tcGxldGUpCisgICAgICAgIFIwX0Nsb3NlRmlsZSgoSEFORExFKWYtPmhhbmRsZSwmZXJyb3IpOworICAgIGVsc2UKKyAgICAgICAgaV9jbG9zZShmLT5oYW5kbGUpOworICAgIFBNX2ZyZWUoZik7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL29zaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmYzBmOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9vc2hkci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAorKgorKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAwZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3BtLmMKQEAgLTAsMCArMSwxMzYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKKyoKKyogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKKyogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKKyogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5CisqICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKKyogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgorI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCisjaW5jbHVkZSAibXRyci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9NRU1PUllfU0hBUkVEICAgICAgICAgICAxMDAKKyNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAgICAgICAgIDEwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAgICAqbGluZWFyOworICAgIHVsb25nICAgZ2xvYmFsOworICAgIHVsb25nICAgbGVuZ3RoOworICAgIGludCAgICAgbnBhZ2VzOworICAgIH0gbWVtc2hhcmVkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmcgICBwaHlzaWNhbDsKKyAgICB1bG9uZyAgIGxpbmVhcjsKKyAgICB1bG9uZyAgIGxlbmd0aDsKKyAgICBpbnQgICAgIG5wYWdlczsKKyAgICBpYm9vbCAgIGlzQ2FjaGVkOworICAgIH0gbW1hcHBpbmc7CisKK3N0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcGluZ3MgPSAwOworc3RhdGljIG1lbXNoYXJlZCAgICBzaGFyZWRbTUFYX01FTU9SWV9NQVBQSU5HU10gPSB7MH07CitzdGF0aWMgbW1hcHBpbmcgICAgIG1hcHNbTUFYX01FTU9SWV9NQVBQSU5HU107CitleHRlcm4gaWJvb2wgICAgICAgIF9QTV9oYXZlQklPUzsKK2NoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7CitjaGFyICAgICAgICAgICAgICAgIF9QTV9udWNsZXVzUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKK3VjaGFyICAgICAgICAgICAgICAgKl9QTV9ybUJ1ZkFkZHIgPSBOVUxMOwordXNob3J0IF9WQVJBUEkgICAgICBfUE1fc2F2ZWREUyA9IDA7CitzdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsKK3N0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOworUE1faW50SGFuZGxlciAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7CitJUlFIQU5ETEUgICAgICAgICAgIFJUQ0lSUUhhbmRsZSA9IDA7CitWUElDRF9IV0ludF9USFVOSyAgIFJUQ0ludF9UaHVuazsKKworc3RhdGljIGNoYXIgKnN6V2luZG93c0tleSAgICAgICA9ICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvbiI7CitzdGF0aWMgY2hhciAqc3pTeXN0ZW1Sb290ICAgICAgID0gIlN5c3RlbVJvb3QiOworc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7CitzdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZSAgICAgID0gIkNvbXB1dGVyTmFtZSI7CitzdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLworCit1bG9uZyAgIFBNQVBJIF9QTV9nZXRQREIodm9pZCk7Cit1Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwordm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUE1fbWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBWWERfbWFsbG9jKAorICAgIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBQTV9tYWxsb2NTaGFyZWQoc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUE1fY2FsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBWWERfY2FsbG9jKAorICAgIHNpemVfdCBuZWxlbSwKKyAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwID0gUE1fbWFsbG9jU2hhcmVkKG5lbGVtICogc2l6ZSk7CisgICAgaWYgKHApCisgICAgICAgIG1lbXNldChwLDAsbmVsZW0gKiBzaXplKTsKKyAgICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQTV9yZWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBWWERfcmVhbGxvYygKKyAgICB2b2lkICpwdHIsCisgICAgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChzaXplKTsKKyAgICBpZiAocCkgeworICAgICAgICBtZW1jcHkocCxwdHIsc2l6ZSk7CisgICAgICAgIFBNX2ZyZWVTaGFyZWQocHRyKTsKKyAgICAgICAgfQorICAgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1BNX2ZyZWUgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBWWERfZnJlZSgKKyAgICB2b2lkICpwKQoreworICAgIFBNX2ZyZWVTaGFyZWQocCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKK3sKKyAgICAvKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9ycyBmb3IgYWxsIE51Y2xldXMgZHJpdmVycworICAgICAqIGxvYWRlZCBpbiBTRERIRUxQL1BNSEVMUC4gV2UgZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgYWxsIG1lbW9yeQorICAgICAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSBOdWNsZXVzIGRyaXZlcnMgYW5kIGludGVybmFsIEMgcnVudGltZQorICAgICAqIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBzaGFyZWQgbWVtb3J5IGJsb2NrcyB0aGF0IGFsbCBwcm9jZXNzZXMKKyAgICAgKiBjb25uZWN0aW5nIHRvIFNEREhFTFAgY2FuIHNlZS4KKyAgICAgKi8KKyAgICBQTV91c2VMb2NhbE1hbGxvYyhWWERfbWFsbG9jLFZYRF9jYWxsb2MsVlhEX3JlYWxsb2MsVlhEX2ZyZWUpOworCisgICAgLyogSW5pdGlhbGlhc2UgdGhlIE1UUlIgbW9kdWxlICovCisgICAgTVRSUl9pbml0KCk7Cit9CisKK2lib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCit7IHJldHVybiBfUE1faGF2ZUJJT1M7IH0KKworbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKK3sgcmV0dXJuIF9PU19XSU4zMlZYRDsgfQorCitpbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKK3sgcmV0dXJuIFBNXzM4NjsgfQorCit2b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQoreworICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOworICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7CisgICAgICAgIHNbcG9zXSA9ICdcXCc7CisgICAgICAgIHNbcG9zKzFdID0gJ1wwJzsKKyAgICAgICAgfQorfQorCit2b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAorICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKK3sKKyAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Cit9CisKK3ZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQorICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgIEZhdGFsX0Vycm9yX0hhbmRsZXIobXNnLDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2xlbiAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKK3JzZWcgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlcgorcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgb2Zmc2V0IG9mIHRoZSBidWZmZXIKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBnbG9iYWwgVkVTQSB0cmFuc2ZlcgorYnVmZmVyIHRoYXQgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIEJJT1MgZnVuY3Rpb25zIGZyb20KK1dpbjE2IGFuZCBXaW4zMiBwcm9ncmFtcyB1bmRlciBXaW5kb3dzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAorICAgIHVpbnQgKmxlbiwKKyAgICB1aW50ICpyc2VnLAorICAgIHVpbnQgKnJvZmYpCit7CisgICAgLyogSWYgdGhlIFZ4RCBpcyBkeW5hbWljYWxseSBsb2FkZWQgd2Ugd2lsbCBub3QgaGF2ZSBhIHJlYWwgbW9kZQorICAgICAqIHRyYW5zZmVyIGJ1ZmZlciB0byByZXR1cm4sIHNvIHdlIGZhaWwgdGhlIGNhbGwuCisgICAgICovCisgICAgaWYgKF9QTV9ybUJ1ZkFkZHIpIHsKKyAgICAgICAgKmxlbiA9IFZFU0FfQlVGX1NJWkU7CisgICAgICAgICpyc2VnID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSA+PiA0OworICAgICAgICAqcm9mZiA9ICh1bG9uZykoX1BNX3JtQnVmQWRkcikgJiAweEY7CisgICAgICAgIHJldHVybiBfUE1fcm1CdWZBZGRyOworICAgICAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBQTUFQSSBQTV9pbnQzODYoCisgICAgaW50IGludG5vLAorICAgIFBNUkVHUyAqaW4sCisgICAgUE1SRUdTICpvdXQpCit7CisgICAgLyogVW51c2VkIGluIFZ4RHMgKi8KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBQTUFQSSBfUE1fZ2V0Uk12ZWN0KAorICAgIGludCBpbnRubywKKyAgICBsb25nICpyZWFsaXNyKQoreworICAgIFdPUkQgICAgc2VnOworICAgIERXT1JEICAgb2ZmOworCisgICAgR2V0X1Y4Nl9JbnRfVmVjdG9yKGludG5vLCZzZWcsJm9mZik7CisgICAgKnJlYWxpc3IgPSAoKGxvbmcpc2VnIDw8IDE2KSB8IChvZmYgJiAweEZGRkYpOworfQorCit2b2lkIFBNQVBJIF9QTV9zZXRSTXZlY3QoCisgICAgaW50IGludG5vLAorICAgIGxvbmcgcmVhbGlzcikKK3sKKyAgICBTZXRfVjg2X0ludF9WZWN0b3IoaW50bm8scmVhbGlzciA+PiAxNixyZWFsaXNyICYgMHhGRkZGKTsKK30KKworY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAorICAgIGNoYXIgKnBhdGgsCisgICAgaW50IG1heExlbikKK3sKKyAgICBzdHJuY3B5KHBhdGgsX1BNX2NudFBhdGgsbWF4TGVuKTsKKyAgICBwYXRoW21heExlbi0xXSA9IDA7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCit7IHJldHVybiAnYyc7IH0KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoreyByZXR1cm4gImM6XFwiOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc3pLZXkgICAgICAgLSBLZXkgdG8gcXVlcnkgKGNhbiBjb250YWluIHZlcnNpb24gbnVtYmVyIGZvcm1hdHRpbmcpCitzelZhbHVlICAgICAtIFZhbHVlIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IKK3ZhbHVlICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlZ2lzdHJ5IGtleSBkYXRhIHJlYWQKK3NpemUgICAgICAgIC0gU2l6ZSBvZiB0aGUgc3RyaW5nIGJ1ZmZlciB0byByZWFkIGludG8KKworUkVUVVJOUzoKK3RydWUgaWYgdGhlIGtleSB3YXMgZm91bmQsIGZhbHNlIGlmIG5vdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nKAorICAgIGNoYXIgKnN6S2V5LAorICAgIGNoYXIgKnN6VmFsdWUsCisgICAgY2hhciAqdmFsdWUsCisgICAgdWxvbmcgc2l6ZSkKK3sKKyAgICBIS0VZICAgIGhLZXk7CisgICAgdWxvbmcgICB0eXBlOworICAgIGlib29sICAgc3RhdHVzID0gZmFsc2U7CisKKyAgICBtZW1zZXQodmFsdWUsMCxzaXplb2YodmFsdWUpKTsKKyAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsc3pLZXksJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LChQQ0hBUilzelZhbHVlLCh1bG9uZyopTlVMTCwodWxvbmcqKSZ0eXBlLHZhbHVlLCh1bG9uZyopJnNpemUpID09IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICAgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKKworICAgIGlmIChzdHJsZW4oX1BNX251Y2xldXNQYXRoKSA+IDApIHsKKyAgICAgICAgc3RyY3B5KHBhdGgsX1BNX251Y2xldXNQYXRoKTsKKyAgICAgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorICAgIGlmICghUkVHX3F1ZXJ5U3RyaW5nKHN6V2luZG93c0tleSxzelN5c3RlbVJvb3QscGF0aCxzaXplb2YocGF0aCkpKQorICAgICAgICBzdHJjcHkocGF0aCwiYzpcXHdpbmRvd3MiKTsKKyAgICBQTV9iYWNrc2xhc2gocGF0aCk7CisgICAgc3RyY2F0KHBhdGgsInN5c3RlbVxcbnVjbGV1cyIpOworICAgIHJldHVybiBwYXRoOworfQorCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCit7IHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOyB9CisKK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKKyAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXksc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCisgICAgICAgIHJldHVybiBuYW1lOworICAgIHJldHVybiAiVW5rbm93biI7Cit9CisKK2ludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQoreyByZXR1cm4gMTsgfQorCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sgcmV0dXJuIDA7IH0KKworUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKKyAgICBQTV9IV05EIGh3bmRVc2VyLAorICAgIGludCBkZXZpY2UsCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMsCisgICAgaW50IGJwcCwKKyAgICBpYm9vbCBmdWxsU2NyZWVuKQoreworICAgIC8qIFVudXNlZCBpbiBWeERzICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCit7CisgICAgLyogVW51c2VkIGluIFZ4RHMgKi8KKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAorICAgIHZvaWQgKnN0YXRlQnVmLAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLyogVW51c2VkIGluIFZ4RHMgKi8KK30KKwordm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCisgICAgaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKAorICAgICAgICBpbnQgZmxhZ3MpKQoreworICAgIC8qIFVudXNlZCBpbiBWeERzICovCit9CisKK3ZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKKyAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKKyAgICBQTV9IV05EIGh3bmRDb25zb2xlKQoreworICAgIC8qIFVudXNlZCBpbiBWeERzICovCit9CisKK3ZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLyogVW51c2VkIGluIFZ4RHMgKi8KK30KKwordm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAorICAgIGludCB4LAorICAgIGludCB5KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOworICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKK30KKwordm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0KQoreworICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7CisgICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDRBLHdpZHRoKTsKKyAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODQsaGVpZ2h0LTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIFdpbjl4IHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKK2FzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKKyhpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKK2RhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCiswIGludGVycnVwdCBjb250ZXh0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCisgICAgbG9uZyBzaXplKQoreworICAgIE1FTUhBTkRMRSAgIGhNZW07CisgICAgRFdPUkQgICAgICAgcGdOdW0sblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7CisgICAgaW50ICAgICAgICAgaTsKKworICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgeworICAgICAgICBpZiAoc2hhcmVkW2ldLmxpbmVhciA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBpZiAoaSA8IE1BWF9NRU1PUllfU0hBUkVEKSB7CisgICAgICAgIFBhZ2VBbGxvY2F0ZShuUGFnZXMsUEdfU1lTLDAsMCwwLDAsTlVMTCwwLCZoTWVtLCZzaGFyZWRbaV0ubGluZWFyKTsKKyAgICAgICAgc2hhcmVkW2ldLm5wYWdlcyA9IG5QYWdlczsKKyAgICAgICAgcGdOdW0gPSAodWxvbmcpc2hhcmVkW2ldLmxpbmVhciA+PiAxMjsKKyAgICAgICAgc2hhcmVkW2ldLmdsb2JhbCA9IExpblBhZ2VMb2NrKHBnTnVtLG5QYWdlcyxQQUdFTUFQR0xPQkFMKTsKKyAgICAgICAgcmV0dXJuICh2b2lkKilzaGFyZWRbaV0uZ2xvYmFsOworICAgICAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpbmQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7CisgICAgICAgIGlmIChzaGFyZWRbaV0uZ2xvYmFsID09ICh1bG9uZylwKSB7CisgICAgICAgICAgICBMaW5QYWdlVW5Mb2NrKHNoYXJlZFtpXS5nbG9iYWwgPj4gMTIsc2hhcmVkW2ldLm5wYWdlcyxQQUdFTUFQR0xPQkFMKTsKKyAgICAgICAgICAgIFBhZ2VGcmVlKCh1bG9uZylzaGFyZWRbaV0ubGluZWFyLDApOworICAgICAgICAgICAgc2hhcmVkW2ldLmxpbmVhciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01hcHMgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGludG8gcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBEb2VzIG5vdGhpbmcgc2luY2UKK3RoZSBtZW1vcnkgYmxvY2tzIGFyZSBhbHJlYWR5IGdsb2JhbGx5NyBtYXBwZWQgaW50byBhbGwgcHJvY2Vzc2VzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCisgICAgdm9pZCAqYmFzZSwKKyAgICB1bG9uZyBsaW1pdCkKK3sKKyAgICByZXR1cm4gKHZvaWQqKWJhc2U7Cit9CisKK2lib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCisgICAgdXNob3J0IGF4VmFsLAorICAgIHVsb25nIEJJT1NQaHlzQWRkciwKKyAgICB2b2lkICptYXBwZWRCSU9TLAorICAgIHVsb25nIEJJT1NMZW4pCit7CisgICAgLy8gVE9ETzogRmlndXJlIG91dCBob3cgdG8gZG8gdGhpcworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCit7IHJldHVybiAodm9pZCopMHg0MDA7IH0KKwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCitsaW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgorCitSRVRVUk5TOgorTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCisKK1JFTUFSS1M6CitNYXBzIGEgcGh5c2ljYWwgbWVtb3J5IHJhbmdlIHRvIGEgbGluZWFyIG1lbW9yeSByYW5nZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxpbWl0LAorICAgIGludCAqbnBhZ2VzKQoreworICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7CisgICAgaW50ICAgICBpLHBwYWdlLGZsYWdzOworCisgICAgaWYgKGJhc2UgPCAweDEwMDAwMCkgeworICAgICAgICAvKiBXaW5kb3dzIDl4IGlzIHplcm8gYmFzZWQgZm9yIHRoZSBmaXJzdCBtZWcgb2YgbWVtb3J5ICovCisgICAgICAgIHJldHVybiBiYXNlOworICAgICAgICB9CisgICAgcHBhZ2UgPSBiYXNlID4+IDEyOworICAgICpucGFnZXMgPSAobGVuZ3RoICsgKGJhc2UgJiAweEZGRikgKyA0MDk1KSA+PiAxMjsKKyAgICBmbGFncyA9IFBSX0ZJWEVEIHwgUFJfU1RBVElDOworICAgIGlmIChiYXNlID09IDB4QTAwMDApIHsKKyAgICAgICAgLyogV2UgcmVxdWlyZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZCB0byBhIDY0S2IgYm91bmRhcnkKKyAgICAgICAgICogZm9yIG1hcHBpbmcgdGhlIGJhbmtlZCBmcmFtZWJ1ZmZlciAoc28gd2UgY2FuIGRvIGVmZmljaWVudAorICAgICAgICAgKiBjYXJyeSBjaGVja2luZyBmb3IgYmFuayBjaGFuZ2VzIGluIHRoZSBhc3NlbWJsZXIgY29kZSkuIFRoZSBvbmx5CisgICAgICAgICAqIHdheSB0byBlbnN1cmUgdGhpcyBpcyB0byBmb3JjZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZAorICAgICAgICAgKiB0byBhIDRNYiBib3VuZGFyeS4KKyAgICAgICAgICovCisgICAgICAgIGZsYWdzIHw9IFBSXzRNRUc7CisgICAgICAgIH0KKyAgICBpZiAoKGxpbmVhciA9ICh1bG9uZylQYWdlUmVzZXJ2ZShQUl9TWVNURU0sKm5wYWdlcyxmbGFncykpID09ICh1bG9uZyktMSkKKyAgICAgICAgcmV0dXJuIDB4RkZGRkZGRkY7CisgICAgaWYgKCFQYWdlQ29tbWl0UGh5cyhsaW5lYXIgPj4gMTIsKm5wYWdlcyxwcGFnZSxQQ19JTkNSIHwgUENfVVNFUiB8IFBDX1dSSVRFQUJMRSkpCisgICAgICAgIHJldHVybiAweEZGRkZGRkZGOworICAgIHJldHVybiBsaW5lYXIgKyAoYmFzZSAmIDB4RkZGKTsKK30KKworLy8gUGFnZSB0YWJsZSBmbGFncworCisjZGVmaW5lIFBBR0VfRkxBR1NfUFJFU0VOVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFHRV9GTEFHU19XUklURUFCTEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUEFHRV9GTEFHU19VU0VSCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUEFHRV9GTEFHU19XUklURV9USFJPVUdICTB4MDAwMDAwMDgKKyNkZWZpbmUgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFCTB4MDAwMDAwMTAKKyNkZWZpbmUgUEFHRV9GTEFHU19BQ0NFU1NFRAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUEFHRV9GTEFHU19ESVJUWQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUEFHRV9GTEFHU180TUIJICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Jhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwcyBpbgorbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcHMgaW4KK2lzQ2FjaGVkICAgIC0gVHJ1ZSBpZiB0aGUgbWVtb3J5IHNob3VsZCBiZSBjYWNoZWQsIGZhbHNlIGlmIG5vdAorCitSRVRVUk5TOgorTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIG1hcHMgcGh5c2ljYWwgbWVtb3J5IHRvIGxpbmVhciBtZW1vcnksIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQKK3RvIGNyZWF0ZSBhIHNlbGVjdG9yIG9yIHVzZWQgZGlyZWN0bHkgZnJvbSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbXMuCitUaGlzIGlzIGJldHRlciB0aGFuIERQTUkgMHg4MDAsIHNpbmNlIGl0IGFsbG93cyB5b3UgdG8gbWFwcyBwaHlzaWNhbAorbWVtb3J5IGJlbG93IDFNYiwgd2hpY2ggZ2V0cyB0aGlzIG1lbW9yeSBvdXQgb2YgdGhlIHdheSBvZiB0aGUgV2luZG93cyBWREQncworc3RpY2t5IHBhd3MuCisKK05PVEU6ICAgSWYgdGhlIG1lbW9yeSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgY2FjaGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAgICAgICAgZGlyZWN0bHkgcmUtcHJvZ3JhbSB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGJpdCBpbiB0aGUKKyAgICAgICAgcGFnZSB0YWJsZXMuIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIG1lY2hhbmlzbSBpbiB0aGUgVk1NCisgICAgICAgIHRvIGNvbnRyb2wgdGhpcyBiaXQgdmlhIHRoZSByZWd1bGFyIGludGVyZmFjZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgbGltaXQsCisgICAgaWJvb2wgaXNDYWNoZWQpCit7CisgICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKKyAgICBpbnQgICAgIGksbnBhZ2VzOworICAgIHVsb25nICAgUERCLCpwUERCOworCisgICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkCisgICAgICogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gYmFzZSAmJiBtYXBzW2ldLmxlbmd0aCA9PSBsZW5ndGggJiYgbWFwc1tpXS5pc0NhY2hlZCA9PSBpc0NhY2hlZCkKKyAgICAgICAgICAgIHJldHVybiAodm9pZCopbWFwc1tpXS5saW5lYXI7CisgICAgICAgIH0KKyAgICBpZiAobnVtTWFwcGluZ3MgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBXZSBkaWQgbm90IGZpbmQgYW55IHByZXZpb3VzbHkgbWFwcGVkIG1lbW9yeSByZWdpb24sIHNvIG1hcHMgaXQgaW4uCisgICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB1c2UgTWFwUGh5c1RvTGluZWFyLCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFwcGVhcnMKKyAgICAgKiB0byBoYXZlIHByb2JsZW1zIG1hcHBpbmcgbWVtb3J5IGluIHRoZSAxTWIgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZS4KKyAgICAgKiBIZW5jZSB3ZSB1c2UgUGFnZVJlc2VydmUgYW5kIFBhZ2VDb21taXRQaHlzLgorICAgICAqLworICAgIGlmICgobGluZWFyID0gX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCwmbnBhZ2VzKSkgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKKyAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7CisgICAgbWFwc1tudW1NYXBwaW5nc10ubnBhZ2VzID0gbnBhZ2VzOworICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7CisgICAgbnVtTWFwcGluZ3MrKzsKKworICAgIC8qIEZpbmFsbHkgZGlzYWJsZSBjYWNoaW5nIHdoZXJlIG5lY2Vzc2FyeSAqLworICAgIGlmICghaXNDYWNoZWQgJiYgKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCkgeworICAgICAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKKyAgICAgICAgdWxvbmcgICBwYWdlVGFibGUsKnBQYWdlVGFibGU7CisgICAgICAgIHBQREIgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRiwmbnBhZ2VzKTsKKyAgICAgICAgaWYgKHBQREIpIHsKKyAgICAgICAgICAgIHN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKKyAgICAgICAgICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpICYgMHgzRkY7CisgICAgICAgICAgICBlbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7CisgICAgICAgICAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOworICAgICAgICAgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGJpdHMgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IC0gcmVxdWlyZWQgYXMgcGVyCisgICAgICAgICAgICAgICAgLy8gUGVudGl1bSA0IG1hbnVhbC4gVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIDRNQiBwYWdlIGVudHJpZXMKKyAgICAgICAgICAgICAgICBwUERCW2lQREJdID0gcFBEQltpUERCXSB8PSAoUEFHRV9GTEFHU19XUklURV9USFJPVUdIIHwgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwUERCW2lQREJdICYgUEFHRV9GTEFHU180TUIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggNEtCIHBhZ2VzIHRoZW4gd2UgbmVlZCB0byBpdGVyYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggZWFjaCBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7CisgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRiwmbnBhZ2VzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOworICAgICAgICAgICAgICAgICAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOworICAgICAgICAgICAgICAgICAgICBmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQYWdlVGFibGVbaVBhZ2VdIHw9IChQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0ggfCBQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUpOworICAgICAgICAgICAgICAgICAgICBQYWdlRnJlZSgodWxvbmcpcFBhZ2VUYWJsZSxQUl9TVEFUSUMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFnZUZyZWUoKHVsb25nKXBQREIsUFJfU1RBVElDKTsKKyAgICAgICAgICAgIFBNX2ZsdXNoVExCKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAorICAgIHZvaWQgKnB0ciwKKyAgICB1bG9uZyBsaW1pdCkKK3sKKyAgICAvKiBXZSBuZXZlciBmcmVlIHRoZSBtYXBwaW5ncyAqLworfQorCit2b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKK3sKKyAgICAvKiBXZSBuZXZlciBzbGVlcCBpbiBhIFZ4RCAqLworfQorCitpbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKK3sKKyAgICAvLyBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5CisgICAgLy8gICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLgorICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNGODsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgyRjg7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIDB4M0U4OworICAgICAgICBjYXNlIDM6IHJldHVybiAweDJFODsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKK3sKKyAgICAvLyBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5CisgICAgLy8gICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLgorICAgIHN3aXRjaCAocG9ydCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAweDNCQzsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMHgzNzg7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIDB4Mjc4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3Vsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKKyAgICB2b2lkICpwKQoreworICAgIERXT1JEICAgcHRlOworCisgICAgLy8gVG91Y2ggdGhlIG1lbW9yeSBiZWZvcmUgY2FsbGluZyBDb3B5UGFnZVRhYmxlLiBGb3Igc29tZSByZWFzb24KKyAgICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgb24gV2luZG93cyA5eCwgb3RoZXJ3aXNlIHRoZSBtZW1vcnkgbWF5IG5vdAorICAgIC8vIGJlIHBhZ2VkIGluIGNvcnJlY3RseS4gT2YgY291cnNlIGlmIHRoZSBwYXNzZWQgaW4gcG9pbnRlciBpcworICAgIC8vIGludmFsaWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBmYXVsdCwgYnV0IHdlIHNob3VsZG4ndCBiZSBwYXNzZWQgYm9ndXMKKyAgICAvLyBwb2ludGVycyBhbnl3YXkgOy0pCisgICAgcHRlID0gKigodWxvbmcqKXApOworCisgICAgLy8gUmV0dXJuIGFzc2VtYmxlZCBhZGRyZXNzIHZhbHVlIG9ubHkgaWYgVk1NIHNlcnZpY2Ugc3VjY2VlZHMKKyAgICBpZiAoQ29weVBhZ2VUYWJsZSgoKERXT1JEKXApID4+IDEyLCAxLCAoUFZPSUQqKSZwdGUsIDApKQorICAgICAgICByZXR1cm4gKHB0ZSAmIH4weEZGRikgfCAoKChEV09SRClwKSAmIDB4RkZGKTsKKworICAgIC8vIFJldHVybiBmYWlsdXJlIHRvIHRoZSBjYWxsZXIhCisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKworaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCisgICAgdm9pZCAqcCwKKyAgICB1bG9uZyBsZW5ndGgsCisgICAgdWxvbmcgKnBoeXNBZGRyZXNzKQoreworICAgIGludCAgICAgaTsKKyAgICB1bG9uZyAgIGxpbmVhciA9ICh1bG9uZylwICYgfjB4RkZGOworCisgICAgZm9yIChpID0gKGxlbmd0aCArIDB4RkZGKSA+PiAxMjsgaSA+IDA7IGktLSkgeworICAgICAgICBpZiAoKCpwaHlzQWRkcmVzcysrID0gUE1fZ2V0UGh5c2ljYWxBZGRyKCh2b2lkKilsaW5lYXIpKSA9PSAweEZGRkZGRkZGKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsaW5lYXIgKz0gNDA5NjsKKyAgICAgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBNQVBJIF9QTV9mcmVlTWVtb3J5TWFwcGluZ3Modm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykKKyAgICAgICAgUGFnZUZyZWUobWFwc1tpXS5saW5lYXIsUFJfU1RBVElDKTsKK30KKwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAorICAgIHVpbnQgcl9zZWcsCisgICAgdWludCByX29mZikKK3sKKyAgICByZXR1cm4gKHZvaWQqKU1LX1BIWVMocl9zZWcscl9vZmYpOworfQorCit2b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAorICAgIHVpbnQgc2l6ZSwKKyAgICB1aW50ICpyX3NlZywKKyAgICB1aW50ICpyX29mZikKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKKyAgICB2b2lkICptZW0pCit7Cit9CisKK3ZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgRFBNSV9yZWdzICpyZWdzKQoreworICAgIC8qIFVuc2VkIGluIFZ4RCdzICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTG9hZCB0aGUgVjg2IHJlZ2lzdGVycyBpbiB0aGUgY2xpZW50IHN0YXRlLCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgc3RhdGUKK2JlZm9yZSBsb2FkaW5nIHRoZSByZWdpc3RlcnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgTG9hZFY4NlJlZ2lzdGVycygKKyAgICBDTElFTlRfU1RSVUNUICpzYXZlUmVncywKKyAgICBSTVJFR1MgKmluLAorICAgIFJNU1JFR1MgKnNyZWdzKQoreworICAgIENMSUVOVF9TVFJVQ1QgICBuZXdSZWdzOworCisgICAgU2F2ZV9DbGllbnRfU3RhdGUoc2F2ZVJlZ3MpOworICAgIG5ld1JlZ3MgPSAqc2F2ZVJlZ3M7CisgICAgbmV3UmVncy5DUlMuQ2xpZW50X0VBWCA9IGluLT5lLmVheDsKKyAgICBuZXdSZWdzLkNSUy5DbGllbnRfRUJYID0gaW4tPmUuZWJ4OworICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FQ1ggPSBpbi0+ZS5lY3g7CisgICAgbmV3UmVncy5DUlMuQ2xpZW50X0VEWCA9IGluLT5lLmVkeDsKKyAgICBuZXdSZWdzLkNSUy5DbGllbnRfRVNJID0gaW4tPmUuZXNpOworICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FREkgPSBpbi0+ZS5lZGk7CisgICAgbmV3UmVncy5DUlMuQ2xpZW50X0VTID0gc3JlZ3MtPmVzOworICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9EUyA9IHNyZWdzLT5kczsKKyAgICBSZXN0b3JlX0NsaWVudF9TdGF0ZSgmbmV3UmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhZCB0aGUgVjg2IHJlZ2lzdGVycyBmcm9tIHRoZSBjbGllbnQgc3RhdGUgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFJlYWRWODZSZWdpc3RlcnMoCisgICAgQ0xJRU5UX1NUUlVDVCAqc2F2ZVJlZ3MsCisgICAgUk1SRUdTICpvdXQsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgQ0xJRU5UX1NUUlVDVCAgIG5ld1JlZ3M7CisKKyAgICBTYXZlX0NsaWVudF9TdGF0ZSgmbmV3UmVncyk7CisgICAgb3V0LT5lLmVheCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQVg7CisgICAgb3V0LT5lLmVieCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQlg7CisgICAgb3V0LT5lLmVjeCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQ1g7CisgICAgb3V0LT5lLmVkeCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FRFg7CisgICAgb3V0LT5lLmVzaSA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FU0k7CisgICAgb3V0LT5lLmVkaSA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FREk7CisgICAgc3JlZ3MtPmVzID0gbmV3UmVncy5DUlMuQ2xpZW50X0VTOworICAgIHNyZWdzLT5kcyA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9EUzsKKyAgICBSZXN0b3JlX0NsaWVudF9TdGF0ZShzYXZlUmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCBhIFY4NiByZWFsIG1vZGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcworbG9hZGVkIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGNhbGwgcmV0dXJucyB3aXRoIGEgZmFyIHJldC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKKyAgICB1aW50IHNlZywKKyAgICB1aW50IG9mZiwKKyAgICBSTVJFR1MgKnJlZ3MsCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgQ0xJRU5UX1NUUlVDVCBzYXZlUmVnczsKKworICAgIC8qIEJhaWwgaWYgd2UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MgKGllOiB0aGUgVnhEIHdhcyBkeW5hbWljYWxseQorICAgICAqIGxvYWRlZCwgYW5kIG5vdCBzdGF0aWNhbGx5IGxvYWRlZC4KKyAgICAgKi8KKyAgICBpZiAoIV9QTV9oYXZlQklPUykKKyAgICAgICAgcmV0dXJuOworCisgICAgX1RSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7CisgICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOworICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOworICAgIFNpbXVsYXRlX0Zhcl9DYWxsKHNlZywgb2ZmKTsKKyAgICBSZXN1bWVfRXhlYygpOworICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOworICAgIEVuZF9OZXN0X0V4ZWMoKTsKKyAgICBfVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0lzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcworbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9pbnQ4NigKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCkKK3sKKyAgICBSTVNSRUdTICAgICAgICAgc3JlZ3MgPSB7MH07CisgICAgQ0xJRU5UX1NUUlVDVCAgIHNhdmVSZWdzOworICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOworCisgICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5CisgICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgorICAgICAqLworICAgIGlmICghX1BNX2hhdmVCSU9TKSB7CisgICAgICAgICpvdXQgPSAqaW47CisgICAgICAgIHJldHVybiBvdXQtPnguYXg7CisgICAgICAgIH0KKworICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCisgICAgX1RSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NigpXG4iKTsKKyAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKKyAgICAgICAgb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gMDsKKyAgICAgICAgfQorICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKKyAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbiwmc3JlZ3MpOworICAgIEV4ZWNfSW50KGludG5vKTsKKyAgICBSZWFkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxvdXQsJnNyZWdzKTsKKyAgICBFbmRfTmVzdF9FeGVjKCk7CisKKyAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCisgICAgaWYgKGRpc2FibGVUU1JGbGFnKQorICAgICAgICAqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOworCisgICAgX1RSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2KClcbiIpOworICAgIHJldHVybiBvdXQtPnguYXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCitsb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7CisgICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7CisKKyAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKKyAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCisgICAgICovCisgICAgaWYgKCFfUE1faGF2ZUJJT1MpIHsKKyAgICAgICAgKm91dCA9ICppbjsKKyAgICAgICAgcmV0dXJuIG91dC0+eC5heDsKKyAgICAgICAgfQorCisgICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KKyAgICBfVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKKyAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKKyAgICAgICAgb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gMDsKKyAgICAgICAgfQorICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKKyAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbixzcmVncyk7CisgICAgRXhlY19JbnQoaW50bm8pOworICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCxzcmVncyk7CisgICAgRW5kX05lc3RfRXhlYygpOworCisgICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLworICAgIGlmIChkaXNhYmxlVFNSRmxhZykKKyAgICAgICAgKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKKworICAgIF9UUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NngoKVxuIik7CisgICAgcmV0dXJuIG91dC0+eC5heDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm5zIGF2YWlsYWJsZSBtZW1vcnkuIE5vdCBwb3NzaWJsZSB1bmRlciBXaW5kb3dzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAorICAgIHVsb25nICpwaHlzaWNhbCwKKyAgICB1bG9uZyAqdG90YWwpCit7CisgICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgTUVNSEFORExFICAgaE1lbTsKKyAgICBEV09SRCAgICAgICBuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKKyAgICBEV09SRCAgICAgICBmbGFncyA9IFBBR0VGSVhFRCB8IFBBR0VVU0VBTElHTiB8IChjb250aWd1b3VzID8gUEFHRUNPTlRJRyA6IDApOworICAgIERXT1JEICAgICAgIG1heFBoeXMgPSBiZWxvdzE2TSA/IDB4MDBGRkZGRkYgOiAweEZGRkZGRkZGOworICAgIHZvaWQgICAgICAgICpwOworCisgICAgLy8gVE9ETzogVGhpcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZCBpZiB0aGUgbWVtb3J5IG5lZWRzIHRvIGJlIGdsb2JhbGx5CisgICAgLy8gICAgICAgYWNjZXNzaWJsZS4gQ2hlY2sgaG93IHdlIGltcGxlbWVudGVkIFBNX21hbGxvY1NoYXJlZCgpIGFzIHdlCisgICAgLy8gICAgICAgbWF5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgaW4gaGVyZS4KKyAgICBQYWdlQWxsb2NhdGUoblBhZ2VzLFBHX1NZUywwLDAsMCxtYXhQaHlzLHBoeXNBZGRyLGZsYWdzLCZoTWVtLCZwKTsKKworICAgIC8vIFRPRE86IFdlIG1heSBuZWVkIHRvIG1vZGlmeSB0aGUgbWVtb3J5IGJsb2NrcyB0byBkaXNhYmxlIGNhY2hpbmcgdmlhCisgICAgLy8gICAgICAgdGhlIHBhZ2UgdGFibGVzIChQQ0R8UFdUKSBzaW5jZSBETUEgbWVtb3J5IGJsb2NrcyAqY2Fubm90KiBiZQorICAgIC8vICAgICAgIGNhY2hlZCEKKyAgICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAorICAgIHZvaWQgKnAsCisgICAgdWludCBzaXplLAorICAgIGlib29sIGNvbnRpZ3VvdXMpCit7CisgICAgaWYgKHApCisgICAgICAgIFBhZ2VGcmVlKCh1bG9uZylwLDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAorICAgIGlib29sIGxvY2tlZCkKK3sKKyAgICBNRU1IQU5ETEUgICBoTWVtOworICAgIHZvaWQgICAgICAgICpwOworCisgICAgLy8gVE9ETzogVGhpcyB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgaWYgdGhlIG1lbW9yeSBuZWVkcyB0byBiZSBnbG9iYWxseQorICAgIC8vICAgICAgIGFjY2Vzc2libGUuIENoZWNrIGhvdyB3ZSBpbXBsZW1lbnRlZCBQTV9tYWxsb2NTaGFyZWQoKSBhcyB3ZQorICAgIC8vICAgICAgIG1heSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyIGluIGhlcmUuCisgICAgUGFnZUFsbG9jYXRlKDEsUEdfU1lTLDAsMCwwLDAsMCxQQUdFRklYRUQsJmhNZW0sJnApOworICAgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKKyAgICB2b2lkICpwKQoreworICAgIGlmIChwKQorICAgICAgICBQYWdlRnJlZSgodWxvbmcpcCwwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitMb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXMoCisgICAgdm9pZCAqcCwKKyAgICB1aW50IGxlbiwKKyAgICBQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBEV09SRCBwZ051bSA9ICh1bG9uZylwID4+IDEyOworICAgIERXT1JEIG5QYWdlcyA9IChsZW4gKyAodWxvbmcpcCAtIChwZ051bSA8PCAxMikgKyAweEZGRikgPj4gMTI7CisgICAgcmV0dXJuIExpblBhZ2VMb2NrKHBnTnVtLG5QYWdlcywwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKAorICAgIHZvaWQgKnAsCisgICAgdWludCBsZW4sCisgICAgUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgRFdPUkQgcGdOdW0gPSAodWxvbmcpcCA+PiAxMjsKKyAgICBEV09SRCBuUGFnZXMgPSAobGVuICsgKHVsb25nKXAgLSAocGdOdW0gPDwgMTIpICsgMHhGRkYpID4+IDEyOworICAgIHJldHVybiBMaW5QYWdlVW5Mb2NrKHBnTnVtLG5QYWdlcywwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitMb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXMoCisgICAgdm9pZCAoKnApKCksCisgICAgdWludCBsZW4sCisgICAgUE1fbG9ja0hhbmRsZSAqbGgpCit7CisgICAgcmV0dXJuIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAorICAgIHZvaWQgKCpwKSgpLAorICAgIHVpbnQgbGVuLAorICAgIFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIHJldHVybiBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKKyAgICBpbnQgZnJlcXVlbmN5KQoreworICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7CisgICAgICAgIDgxOTIsCisgICAgICAgIDQwOTYsCisgICAgICAgIDIwNDgsCisgICAgICAgIDEwMjQsCisgICAgICAgIDUxMiwKKyAgICAgICAgMjU2LAorICAgICAgICAxMjgsCisgICAgICAgIDY0LAorICAgICAgICAzMiwKKyAgICAgICAgMTYsCisgICAgICAgIDgsCisgICAgICAgIDQsCisgICAgICAgIDIsCisgICAgICAgIC0xLAorICAgICAgICB9OworICAgIGludCBpOworCisgICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KKyAgICBfUE1fcmVhZENNT1MoMHgwQyk7CisgICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7CisgICAgICAgIC8qIERpc2FibGUgUlRDIHRpbW91dCAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGNvbnZlcnRbaV0gIT0gLTE7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbnZlcnRbaV0gPT0gZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLworICAgICAgICBfUE1fd3JpdGVDTU9TKDB4MEEsMHgyMCB8IChpKzMpKTsKKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBCLChfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSB8IDB4NDApOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBjYWxscyB0aGUgdXNlciByZWdpc3RlcmVkIEMgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQk9PTCBfX3N0ZGNhbGwgUlRDSW50X0hhbmRsZXIoCisgICAgVk1IQU5ETEUgaFZNLAorICAgIElSUUhBTkRMRSBoSVJRKQoreworICAgIHN0YXRpYyBjaGFyIGluc2lkZSA9IDA7CisKKyAgICAvKiBDbGVhciBwcmlvcml0eSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgcmUtZW5hYmxlIGludGVycnVwdHMgc28gd2UKKyAgICAgKiBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgorICAgICAqLworICAgIFZQSUNEX1BoeXNfRU9JKGhJUlEpOworCisgICAgLyogQ2xlYXIgcmVhbC10aW1lIGNsb2NrIHRpbWVvdXQgKi8KKyAgICBfUE1fcmVhZENNT1MoMHgwQyk7CisKKyAgICAvKiBOb3cgY2FsbCB0aGUgQyBiYXNlZCBpbnRlcnJ1cHQgaGFuZGxlciAoYnV0IGNoZWNrIGZvciBtdXR1YWwKKyAgICAgKiBleGNsdXNpb24gc2luY2Ugd2UgbWF5IHN0aWxsIGJlIHNlcnZpY2luZyBhbiBvbGQgaW50ZXJydXB0IHdoZW4gYQorICAgICAqIG5ldyBvbmUgY29tZXMgYWxvbmc7IGlmIHRoYXQgaGFwcGVucyB3ZSBpZ25vcmUgdGhlIG9sZCBvbmUpLgorICAgICAqLworICAgIGlmICghaW5zaWRlKSB7CisgICAgICAgIGluc2lkZSA9IDE7CisgICAgICAgIGVuYWJsZSgpOworICAgICAgICBfUE1fcnRjSGFuZGxlcigpOworICAgICAgICBpbnNpZGUgPSAwOworICAgICAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKKyAgICBQTV9pbnRIYW5kbGVyIGloLAorICAgIGludCBmcmVxdWVuY3kpCit7CisgICAgc3RydWN0IFZQSUNEX0lSUV9EZXNjcmlwdG9yIElSUWRlc2M7CisKKyAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCisgICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOworICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKKworICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCisgICAgQ0hFQ0soaWggIT0gTlVMTCk7CisgICAgX1BNX3J0Y0hhbmRsZXIgPSBpaDsKKyAgICBJUlFkZXNjLlZJRF9JUlFfTnVtYmVyICAgICAgPSAweDg7CisgICAgSVJRZGVzYy5WSURfT3B0aW9ucyAgICAgICAgID0gMDsKKyAgICBJUlFkZXNjLlZJRF9Id19JbnRfUHJvYyAgICAgPSAoRFdPUkQpVlBJQ0RfVGh1bmtfSFdJbnQoUlRDSW50X0hhbmRsZXIsICZSVENJbnRfVGh1bmspOworICAgIElSUWRlc2MuVklEX0VPSV9Qcm9jICAgICAgICA9IDA7CisgICAgSVJRZGVzYy5WSURfVmlydF9JbnRfUHJvYyAgID0gMDsKKyAgICBJUlFkZXNjLlZJRF9NYXNrX0NoYW5nZV9Qcm9jPSAwOworICAgIElSUWRlc2MuVklEX0lSRVRfUHJvYyAgICAgICA9IDA7CisgICAgSVJRZGVzYy5WSURfSVJFVF9UaW1lX091dCAgID0gNTAwOworICAgIGlmICgoUlRDSVJRSGFuZGxlID0gVlBJQ0RfVmlydHVhbGl6ZV9JUlEoJklSUWRlc2MpKSA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KKyAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7CisKKyAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDICovCisgICAgVlBJQ0RfUGh5c2ljYWxseV9Vbm1hc2soUlRDSVJRSGFuZGxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIGlmIChSVENJUlFIYW5kbGUpIHsKKyAgICAgICAgLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KKyAgICAgICAgX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7CisgICAgICAgIF9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOworCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKyAgICAgICAgVlBJQ0RfU2V0X0F1dG9fTWFza2luZyhSVENJUlFIYW5kbGUpOworICAgICAgICBWUElDRF9Gb3JjZV9EZWZhdWx0X0JlaGF2aW9yKFJUQ0lSUUhhbmRsZSk7CisgICAgICAgIFJUQ0lSUUhhbmRsZSA9IDA7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitPUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAorICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKK3sKKyAgICAodm9pZClzekRMTE5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgICh2b2lkKWhNb2R1bGU7CisgICAgKHZvaWQpc3pQcm9jTmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitPUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSkKK3sKKyAgICAodm9pZCloTW9kdWxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgc3RhcnQgYSBkaXJlY3RvcnkgZW51bWVyYXRpb24gc2VhcmNoCisgICAgLy8gICAgICAgZ2l2ZW4gdGhlIGZpbGVuYW1lICh3aXRoIHdpbGRjYXJkcykuIFRoZSBkYXRhIHNob3VsZCBiZQorICAgIC8vICAgICAgIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpZmluZERhdGE7CisgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAorICAgIHZvaWQgKmhhbmRsZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgbmV4dCBmaWxlIGluIGRpcmVjdG9yeSBlbnVtZXJhdGlvbgorICAgIC8vICAgICAgIHNlYXJjaCBnaXZlbiB0aGUgc2VhcmNoIGNyaXRlcmlhIGRlZmluZWQgaW4gdGhlIGNhbGwgdG8KKyAgICAvLyAgICAgICBQTV9maW5kRmlyc3RGaWxlLiBUaGUgZGF0YSBzaG91bGQgYmUgY29udmVydGVkIGFuZCByZXR1cm5lZAorICAgIC8vICAgICAgIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLgorICAgICh2b2lkKWhhbmRsZTsKKyAgICAodm9pZClmaW5kRGF0YTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAorICAgIHZvaWQgKmhhbmRsZSkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjbG9zZSB0aGUgZmluZCBwcm9jZXNzLiBUaGlzIG1heSBkbworICAgIC8vICAgICAgIG5vdGhpbmcgZm9yIHNvbWUgT1MnZXMuCisgICAgKHZvaWQpaGFuZGxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKK2Z1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCit0aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKK251bWJlcmluZyBpczoKKworICAgIDEgICAtIERyaXZlIEE6CisgICAgMiAgIC0gRHJpdmUgQjoKKyAgICAzICAgLSBEcml2ZSBDOgorICAgIGV0YworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKKyAgICBjaGFyIGRyaXZlKQoreworICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQKKyAgICAodm9pZClkcml2ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KK1VuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcworb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2dldGRjd2QoCisgICAgaW50IGRyaXZlLAorICAgIGNoYXIgKmRpciwKKyAgICBpbnQgbGVuKQoreworICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQKKyAgICAodm9pZClkcml2ZTsKKyAgICAodm9pZClkaXI7CisgICAgKHZvaWQpbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Jhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3NpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCit0eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCisKK1JFVFVSTlM6CitFcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KKworUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAorICAgIHVsb25nIGJhc2UsCisgICAgdWxvbmcgc2l6ZSwKKyAgICB1aW50IHR5cGUpCit7CisgICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgdWludCBhdHRyaWIpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClhdHRyaWI7CisgICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZUF0dHIgbm90IGltcGxlbWVudGVkIHlldCEiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ta2RpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcworICAgICh2b2lkKWZpbGVuYW1lOworICAgIFBNX2ZhdGFsRXJyb3IoIlBNX21rZGlyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9ybWRpcigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcworICAgICh2b2lkKWZpbGVuYW1lOworICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3JtZGlyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgaWJvb2wgZ21UaW1lLAorICAgIFBNX3RpbWUgKnRpbWUpCit7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMhCisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgKHZvaWQpZ21UaW1lOworICAgICh2b2lkKXRpbWU7CisgICAgUE1fZmF0YWxFcnJvcigiUE1fZ2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBpYm9vbCBnbVRpbWUsCisgICAgUE1fdGltZSAqdGltZSkKK3sKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyEKKyAgICAodm9pZClmaWxlbmFtZTsKKyAgICAodm9pZClnbVRpbWU7CisgICAgKHZvaWQpdGltZTsKKyAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOworICAgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFjZTFjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3ZmbGF0LmMKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqCisqIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicG1hcGkuaCIKKworaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3p0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGY0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvenRpbWVyLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1bG9uZyAgICBmcmVxdWVuY3kgPSAxMTkzMTgwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19aVGltZXJJbml0KCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPnN0YXJ0LmhpZ2gsJnRtLT5zdGFydC5sb3cpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIENQVV9sYXJnZUludGVnZXIgICAgbGFwLGNvdW50OworICAgIFZURF9HZXRfUmVhbF9UaW1lKCZsYXAuaGlnaCwmbGFwLmxvdyk7CisgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJmxhcCwmY291bnQpOworICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmY291bnQsZnJlcXVlbmN5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPmVuZC5oaWdoLCZ0bS0+ZW5kLmxvdykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyIHRtQ291bnQ7CisgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOworICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQoreworICAgIENQVV9sYXJnZUludGVnZXIgY291bnQ7CisgICAgVlREX0dldF9SZWFsX1RpbWUoJmNvdW50LmhpZ2gsJmNvdW50Lmxvdyk7CisgICAgcmV0dXJuIChjb3VudC5sb3cgKiAxMDAwLjAgLyBmcmVxdWVuY3kpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKK3doZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bworYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcworcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCit7IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvX3Btd2luMzIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvX3Btd2luMzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjQyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9fcG13aW4zMi5hc20KQEAgLTAsMCArMSw3OCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqCis7KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Cis7KgorOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyoKKzsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKzsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Cis7KgorOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKzsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCis7KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKzsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7KgorOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorOyoKKzsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCis7KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyoKKzsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsqCis7KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCis7KiBFbnZpcm9ubWVudDogV2luMzIKKzsqCis7KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljCis7KiAgICAgICAgICAgICAgdG8gV2luZG93cy4KKzsqCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIElERUFMCisKK2luY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcworCitoZWFkZXIgICAgICBfcG13aW4zMiAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCisKK2JlZ2RhdGFzZWcgIF9wbXdpbjMyCisKKyAgICAgICAgY2dsb2JhbCBfUE1faW9lbnRyeQorICAgICAgICBjZ2xvYmFsIF9QTV9nZHQKK19QTV9pb2VudHJ5ICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgT2Zmc2V0IHRvIGNhbGwgZ2F0ZQorX1BNX2dkdCAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBTZWxlY3RvciB0byBjYWxsIGdhdGUKKworZW5kZGF0YXNlZyAgX3Btd2luMzIKKworYmVnY29kZXNlZyAgX3Btd2luMzIgICAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBQTV9zZXRJT1BMKGludCBpb3BsKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ2hhbmdlIHRoZSBJT1BMIGxldmVsIGZvciB0aGUgMzItYml0IHRhc2suIFJldHVybnMgdGhlIHByZXZpb3VzIGxldmVsCis7IHNvIGl0IGNhbiBiZSByZXN0b3JlZCBmb3IgdGhlIHRhc2sgY29ycmVjdGx5LgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Nwcm9jc3RhcnQgIF9QTV9zZXRJT1BMVmlhQ2FsbEdhdGUKKworICAgICAgICBBUkcgICAgIGlvcGw6VUlOVAorCisgICAgICAgIGVudGVyX2MKKyAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSB0aGUgb2xkIEVGTEFHUyBmb3IgbGF0ZXIKKyAgICAgICAgbW92ICAgICBlY3gsW2lvcGxdICAgICAgICAgIDsgRUNYIDo9IElPUEwgbGV2ZWwKKyAgICAgICAgeG9yICAgICBlYngsZWJ4ICAgICAgICAgICAgIDsgQ2hhbmdlIElPUEwgbGV2ZWwgZnVuY3Rpb24gY29kZQoraWZkZWYgICBVU0VfTkFTTQorICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX2lvZW50cnldCitlbHNlCisgICAgICAgIGNhbGwgICAgW0ZXT1JEIF9QTV9pb2VudHJ5XQorZW5kaWYKKyAgICAgICAgcG9wICAgICBlYXgKKyAgICAgICAgYW5kICAgICBlYXgsMDAxMTAwMDAwMDAwMDAwMGIKKyAgICAgICAgc2hyICAgICBlYXgsMTIKKyAgICAgICAgbGVhdmVfYworICAgICAgICByZXQKKworY3Byb2NlbmQKKworZW5kY29kZXNlZyAgX3Btd2luMzIKKworICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3OGI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2NwdWluZm8uYwpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMgorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKKyogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlib29sIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCit7CisgICAgaW50ICAgICBvbGRQcmlvcml0eTsKKyAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisKKyAgICBvbGRQcmlvcml0eSA9IEdldFRocmVhZFByaW9yaXR5KGhUaHJlYWQpOworICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQorICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7CisgICAgcmV0dXJuIG9sZFByaW9yaXR5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Jlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoCisgICAgaW50IG9sZFByaW9yaXR5KQoreworICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKKworICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQorICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBvbGRQcmlvcml0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQoreworICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopZnJlcSkpIHsKKyAgICAgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOworICAgICAgICBmcmVxLT5sb3cgPSAxMDAwMDA7CisgICAgICAgIGZyZXEtPmhpZ2ggPSAwOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdCk7ICAgICAgICAgXAorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodCktPmxvdyA9IHRpbWVHZXRUaW1lKCkgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZGRyYXcuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2RkcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4OTQwMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2RkcmF3LmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMgorKgorKiBEZXNjcmlwdGlvbjogIFdpbjMyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQorKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgIndpbjMyL29zaGRyLmgiCisjaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQdWJsaWNseSBhY2Nlc3NpYmxlIHZhcmlhYmxlcyAqLworCitpbnQgICAgICAgICAgICAgICAgIF9QTV9kZXNrWCxfUE1fZGVza1k7LyogRGVza3RvcCBkaW1lbnRpb25zICAgICAgICAgICAqLworSFdORCAgICAgICAgICAgICAgICBfUE1faHduZENvbnNvbGU7ICAgIC8qIFdpbmRvdyBoYW5kbGUgZm9yIGNvbnNvbGUgICAgKi8KKyNpZmRlZiAgX19JTlRFTF9fCit1aW50ICAgICAgICAgICAgICAgIF9QTV9jd19kZWZhdWx0OyAgICAgLyogRGVmYXVsdCBGUFUgY29udHJvbCB3b3JkICAgICAqLworI2VuZGlmCisKKy8qIFByaXZhdGUgaW50ZXJuYWwgdmFyaWFibGVzICovCisKK3N0YXRpYyBISU5TVEFOQ0UgICAgaEluc3RBcHAgPSBOVUxMOy8qIEFwcGxpY2F0aW9uIGluc3RhbmNlIGhhbmRsZSAgICAgICovCitzdGF0aWMgSFdORCAgICAgICAgIGh3bmRVc2VyID0gTlVMTDsvKiBVc2VyIHdpbmRvdyBoYW5kbGUgICAgICAgICAgICAgICAqLworc3RhdGljIEhJTlNUQU5DRSAgICBoSW5zdEREID0gTlVMTDsgLyogSGFuZGxlIHRvIERpcmVjdERyYXcgRExMICAgICAgICAgKi8KK3N0YXRpYyBMUERJUkVDVERSQVcgbHBERCA9IE5VTEw7ICAgIC8qIERpcmVjdERyYXcgb2JqZWN0ICAgICAgICAgICAgICAgICovCitzdGF0aWMgTE9ORyAgICAgICAgIG9sZFduZFN0eWxlOyAgICAvKiBJbmZvIGFib3V0IG9sZCB1c2VyIHdpbmRvdyAgICAgICAqLworc3RhdGljIExPTkcgICAgICAgICBvbGRFeFduZFN0eWxlOyAgLyogSW5mbyBhYm91dCBvbGQgdXNlciB3aW5kb3cgICAgICAgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgb2xkV2luUG9zWDsgICAgIC8qIE9sZCB3aW5kb3cgcG9zaXRpb24gWCBjb29yZGluYXRlICovCitzdGF0aWMgaW50ICAgICAgICAgIG9sZFdpblBvc1k7ICAgICAvKiBPbGQgd2luZG93IHBpc2l0aW9uIFkgY29vcmRpbmF0ZSAqLworc3RhdGljIGludCAgICAgICAgICBvbGRXaW5TaXplWDsgICAgLyogT2xkIHdpbmRvdyBzaXplIFggICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgb2xkV2luU2l6ZVk7ICAgIC8qIE9sZCB3aW5kb3cgc2l6ZSBZICAgICAgICAgICAgICAgICovCitzdGF0aWMgV05EUFJPQyAgICAgIG9sZFdpblByb2MgPSBOVUxMOworc3RhdGljIFBNX3NhdmVTdGF0ZV9jYiBzdXNwZW5kQXBwID0gTlVMTDsKK3N0YXRpYyBpYm9vbCAgICAgICAgd2FpdEFjdGl2ZSA9IGZhbHNlOworc3RhdGljIGlib29sICAgICAgICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTsKK3N0YXRpYyBpYm9vbCAgICAgICAgYmFja0luR0RJID0gZmFsc2U7CisKKy8qIEludGVybmFsIHN0cmluZ3MgKi8KKworc3RhdGljIGNoYXIgKnN6V2luQ2xhc3NOYW1lICAgICA9ICJTY2lUZWNoRGlyZWN0RHJhd1dpbmRvdyI7CitzdGF0aWMgY2hhciAqc3pBdXRvUGxheUtleSAgICAgID0gIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxQb2xpY2llc1xcRXhwbG9yZXIiOworc3RhdGljIGNoYXIgKnN6QXV0b1BsYXlWYWx1ZSAgICA9ICJOb0RyaXZlVHlwZUF1dG9SdW4iOworCisvKiBEeW5hbGlua3MgdG8gRGlyZWN0RHJhdyBmdW5jdGlvbnMgKi8KKworc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcERpcmVjdERyYXdDcmVhdGUpKEdVSUQgRkFSICpscEdVSUQsIExQRElSRUNURFJBVyBGQVIgKmxwbHBERCwgSVVua25vd24gRkFSICpwVW5rT3V0ZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RlbXBvcmFyaWx5IGRpc2FibGVzIEF1dG9QbGF5IG9wZXJhdGlvbiB3aGlsZSB3ZSBhcmUgcnVubmluZyBpbiBmdWxsc2NyZWVuCitncmFwaGljcyBtb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBEaXNhYmxlQXV0b1BsYXkodm9pZCkKK3sKKyAgICBEV09SRCAgIGR3QXV0b1BsYXksZHdTaXplID0gc2l6ZW9mKGR3QXV0b1BsYXkpOworICAgIEhLRVkgICAgaEtleTsKKworICAgIGlmIChSZWdPcGVuS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsc3pBdXRvUGxheUtleSwwLEtFWV9FWEVDVVRFIHwgS0VZX1dSSVRFLCZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LHN6QXV0b1BsYXlWYWx1ZSxOVUxMLE5VTEwsKHZvaWQqKSZkd0F1dG9QbGF5LCZkd1NpemUpOworICAgICAgICBkd0F1dG9QbGF5IHw9IEFVVE9QTEFZX0RSSVZFX0NEUk9NOworICAgICAgICBSZWdTZXRWYWx1ZUV4KGhLZXksc3pBdXRvUGxheVZhbHVlLDAsUkVHX0RXT1JELCh2b2lkKikmZHdBdXRvUGxheSxkd1NpemUpOworICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlLWVuYWJsZXMgQXV0b1BsYXkgb3BlcmF0aW9uIHdoZW4gd2UgcmV0dXJuIHRvIHJlZ3VsYXIgR0RJIG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUmVzdG9yZUF1dG9QbGF5KHZvaWQpCit7CisgICAgRFdPUkQgICBkd0F1dG9QbGF5LGR3U2l6ZSA9IHNpemVvZihkd0F1dG9QbGF5KTsKKyAgICBIS0VZICAgIGhLZXk7CisKKyAgICBpZiAoUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLHN6QXV0b1BsYXlLZXksMCxLRVlfRVhFQ1VURSB8IEtFWV9XUklURSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBSZWdRdWVyeVZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsTlVMTCxOVUxMLCh2b2lkKikmZHdBdXRvUGxheSwmZHdTaXplKTsKKyAgICAgICAgZHdBdXRvUGxheSAmPSB+QVVUT1BMQVlfRFJJVkVfQ0RST007CisgICAgICAgIFJlZ1NldFZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsMCxSRUdfRFdPUkQsKHZvaWQqKSZkd0F1dG9QbGF5LGR3U2l6ZSk7CisgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3VzcGVuZHMgdGhlIGFwcGxpY2F0aW9uIGJ5IHN3aXRjaGluZyBiYWNrIHRvIHRoZSBHREkgZGVza3RvcCwgYWxsb3dpbmcKK25vcm1hbCBhcHBsaWNhdGlvbiBjb2RlIHRvIGJlIHByb2Nlc3NlZCwgYW5kIHRoZW4gd2FpdGluZyBmb3IgdGhlCithcHBsaWNhdGlvbiBhY3RpdmF0ZSBjb21tYW5kIHRvIGJyaW5nIHVzIGJhY2sgdG8gZnVsbHNjcmVlbiBtb2RlIHdpdGggb3VyCit3aW5kb3cgbWluaW1pc2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIExlYXZlRnVsbFNjcmVlbih2b2lkKQoreworICAgIGludCByZXRDb2RlID0gUE1fU1VTUEVORF9BUFA7CisKKyAgICBpZiAoYmFja0luR0RJKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHN1c3BlbmRBcHApCisgICAgICAgIHJldENvZGUgPSBzdXNwZW5kQXBwKFBNX0RFQUNUSVZBVEUpOworICAgIFJlc3RvcmVBdXRvUGxheSgpOworICAgIGJhY2tJbkdESSA9IHRydWU7CisKKyAgICAvKiBOb3cgcHJvY2VzcyBtZXNzYWdlcyBub3JtYWxseSB1bnRpbCB3ZSBhcmUgcmUtYWN0aXZhdGVkICovCisgICAgd2FpdEFjdGl2ZSA9IHRydWU7CisgICAgaWYgKHJldENvZGUgIT0gUE1fTk9fU1VTUEVORF9BUFApIHsKKyAgICAgICAgd2hpbGUgKHdhaXRBY3RpdmUpIHsKKyAgICAgICAgICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7CisgICAgICAgICAgICBTbGVlcCgyMDApOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVhY3RpdmF0ZSBhbGwgdGhlIHN1cmZhY2VzIGZvciBEaXJlY3REcmF3IGFuZCBzZXQgdGhlIHN5c3RlbSBiYWNrIHVwIGZvcgorZnVsbHNjcmVlbiByZW5kZXJpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUmVzdG9yZUZ1bGxTY3JlZW4odm9pZCkKK3sKKyAgICBzdGF0aWMgaWJvb2wgICAgZmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgLyogQ2xlYXIgdGhlIG1lc3NhZ2UgcXVldWUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHN1cmZhY2VzIHRvIGJlCisgICAgICAgICAqIHJlc3RvcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAvKiBDb250aW51ZSBsb29waW5nIHVudGlsIG91dCBhcHBsaWNhdGlvbiBoYXMgYmVlbiByZXN0b3JlZAorICAgICAgICAgICAgICogYW5kIHdlIGhhdmUgcmVzZXQgdGhlIGRpc3BsYXkgbW9kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgX0VWVF9wdW1wTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGlmIChHZXRBY3RpdmVXaW5kb3coKSA9PSBfUE1faHduZENvbnNvbGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZEFwcCkKKyAgICAgICAgICAgICAgICAgICAgc3VzcGVuZEFwcChQTV9SRUFDVElWQVRFKTsKKyAgICAgICAgICAgICAgICBEaXNhYmxlQXV0b1BsYXkoKTsKKyAgICAgICAgICAgICAgICBiYWNrSW5HREkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3YWl0QWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU2xlZXAoMjAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGFwcGxpY2F0aW9uIGJ5IHN3aXRjaGluZyBiYWNrIHRvIHRoZSBHREkgZGVza3RvcCwKK2FsbG93aW5nIG5vcm1hbCBhcHBsaWNhdGlvbiBjb2RlIHRvIGJlIHByb2Nlc3NlZCBhbmQgdGhlbiB3YWl0aW5nIGZvciB0aGUKK2FwcGxpY2F0aW9uIGFjdGl2YXRlIGNvbW1hbmQgdG8gYnJpbmcgdXMgYmFjayB0byBmdWxsc2NyZWVuIG1vZGUgd2l0aCBvdXIKK3dpbmRvdyBtaW5pbWlzZWQuCisKK1RoaXMgdmVyc2lvbiBvbmx5IGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgbm90IGNhcHR1cmVkIHRoZSBzY3JlZW4gc3dpdGNoIGluCitvdXIgYWN0aXZhdGUgbWVzc2FnZSBsb29wcyBhbmQgd2lsbCBvY2N1ciBpZiB0aGUgRGlyZWN0RHJhdyBkcml2ZXJzIGxvc2UgYQorc3VyZmFjZSBmb3Igc29tZSByZWFzb24gd2hpbGUgcmVuZGVyaW5nLiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLAorYnV0IGl0IGlzIGluY2x1ZGVkIGp1c3QgdG8gYmUgc3VyZSAoaXQgY2FuIGhhcHBlbiBvbiBXaW5OVC8yMDAwIGlmIHRoZSB1c2VyCitoaXRzIHRoZSBDdHJsLUFsdC1EZWwga2V5IGNvbWJpbmF0aW9uKS4gTm90ZSB0aGF0IHRoaXMgY29kZSB3aWxsIGFsd2F5cworc3BpbiBsb29wLCBhbmQgd2UgY2Fubm90IGRpc2FibGUgdGhlIHNwaW4gbG9vcGluZyBmcm9tIHRoaXMgdmVyc2lvbiAoaWU6CitpZiB0aGUgdXNlciBoaXRzIEN0cmwtQWx0LURlbCB1bmRlciBXaW5OVC8yMDAwIHRoZSBhcHBsaWNhdGlvbiBtYWluIGxvb3AKK3dpbGwgY2Vhc2UgdG8gYmUgZXhlY3V0ZWQgdW50aWwgdGhlIHVzZXIgc3dpdGNoZXMgYmFjayB0byB0aGUgYXBwbGljYXRpb24pLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZG9TdXNwZW5kQXBwKHZvaWQpCit7CisgICAgc3RhdGljICBpYm9vbCBmaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KKyAgICBpZiAoX1BNX2ltcG9ydHMuUE1fZG9TdXNwZW5kQXBwICE9IFBNX2RvU3VzcGVuZEFwcCkgeworICAgICAgICBfUE1faW1wb3J0cy5QTV9kb1N1c3BlbmRBcHAoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICBpZiAoZmlyc3RUaW1lKSB7CisgICAgICAgIGlmIChzdXNwZW5kQXBwKQorICAgICAgICAgICAgc3VzcGVuZEFwcChQTV9ERUFDVElWQVRFKTsKKyAgICAgICAgUmVzdG9yZUF1dG9QbGF5KCk7CisgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICBiYWNrSW5HREkgPSB0cnVlOworICAgICAgICB9CisgICAgUmVzdG9yZUZ1bGxTY3JlZW4oKTsKKyAgICBmaXJzdFRpbWUgPSB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01haW4gV2luZG93IHByb2MgZm9yIHRoZSBmdWxsIHNjcmVlbiBEaXJlY3REcmF3IFdpbmRvdyB0aGF0IHdlIGNyZWF0ZSB3aGlsZQorcnVubmluZyBpbiBmdWxsIHNjcmVlbiBtb2RlLiBIZXJlIHdlIGNhcHR1cmUgYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMKK2ZvciB0aGUgd2luZG93IGFuZCBwbHVnIHRoZW0gaW50byBvdXIgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIExPTkcgQ0FMTEJBQ0sgUE1fd2luUHJvYygKKyAgICBIV05EIGh3bmQsCisgICAgVUlOVCBtc2csCisgICAgV1BBUkFNIHdQYXJhbSwKKyAgICBMT05HIGxQYXJhbSkKK3sKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICBjYXNlIFdNX1NZU0NIQVI6CisgICAgICAgICAgICAvKiBTdG9wIEFsdC1TcGFjZSBmcm9tIHBhdXNpbmcgb3VyIGFwcGxpY2F0aW9uICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBXTV9LRVlET1dOOgorICAgICAgICBjYXNlIFdNX1NZU0tFWURPV046CisgICAgICAgICAgICBpZiAoSElXT1JEKGxQYXJhbSkgJiBLRl9SRVBFQVQpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnID09IFdNX1NZU0tFWURPV04pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCBmb3Iga2V5ZG93biBldmVudHMgKi8KKyAgICAgICAgY2FzZSBXTV9LRVlVUDoKKyAgICAgICAgY2FzZSBXTV9TWVNLRVlVUDoKKyAgICAgICAgICAgIGlmIChtc2cgPT0gV01fU1lTS0VZRE9XTiB8fCBtc2cgPT0gV01fU1lTS0VZVVApIHsKKyAgICAgICAgICAgICAgICBpZiAoKEhJV09SRChsUGFyYW0pICYgS0ZfQUxURE9XTikgJiYgd1BhcmFtID09IFZLX1JFVFVSTikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogV2UgaWdub3JlIHRoZSByZW1haW5kZXIgb2YgdGhlIHN5c3RlbSBrZXlzIHRvIHN0b3AgdGhlCisgICAgICAgICAgICAgICAgICogc3lzdGVtIG1lbnUgZnJvbSBiZWluZyBhY3RpdmF0ZWQgZnJvbSB0aGUga2V5Ym9hcmQgYW5kIHBhdXNpbmcKKyAgICAgICAgICAgICAgICAgKiBvdXIgYXBwIHdoaWxlIGZ1bGxzY3JlZW4gKGllOiBwcmVzc2luZyB0aGUgQWx0IGtleSkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fU1lTQ09NTUFORDoKKyAgICAgICAgICAgIHN3aXRjaCAod1BhcmFtICYgfjB4MEYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNDX1NDUkVFTlNBVkU6CisgICAgICAgICAgICAgICAgY2FzZSBTQ19NT05JVE9SUE9XRVI6CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBzY3JlZW5zYXZlciByZXF1ZXN0cyBpbiBmdWxsc2NyZWVuIG1vZGVzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX1NJWkU6CisgICAgICAgICAgICBpZiAod2FpdEFjdGl2ZSAmJiBiYWNrSW5HREkgJiYgKHdQYXJhbSAhPSBTSVpFX01JTklNSVpFRCkpIHsKKyAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgcmUtYWN0aXZhdGlvbiBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2UoaHduZCxXTV9ET19TVVNQRU5EX0FQUCxXTV9QTV9SRVNUT1JFX0ZVTExTQ1JFRU4sMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXdhaXRBY3RpdmUgJiYgaXNGdWxsU2NyZWVuICYmICFiYWNrSW5HREkgJiYgKHdQYXJhbSA9PSBTSVpFX01JTklNSVpFRCkpIHsKKyAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgZGUtYWN0aXZhdGlvbiBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2UoaHduZCxXTV9ET19TVVNQRU5EX0FQUCxXTV9QTV9MRUFWRV9GVUxMU0NSRUVOLDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX0RPX1NVU1BFTkRfQVBQOgorICAgICAgICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKwkJCQljYXNlIFdNX1BNX1JFU1RPUkVfRlVMTFNDUkVFTjoKKwkJCQkJUmVzdG9yZUZ1bGxTY3JlZW4oKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXTV9QTV9MRUFWRV9GVUxMU0NSRUVOOgorCQkJCQlMZWF2ZUZ1bGxTY3JlZW4oKTsKKwkJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICBpZiAob2xkV2luUHJvYykKKyAgICAgICAgcmV0dXJuIG9sZFdpblByb2MoaHduZCxtc2csd1BhcmFtLGxQYXJhbSk7CisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCxtc2csd1BhcmFtLGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraHduZCAgICAtIFVzZXIgd2luZG93IHRvIGNvbnZlcnQKK3dpZHRoICAgLSBXaW5kb3cgb2YgdGhlIGZ1bGxzY3JlZW4gd2luZG93CitoZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBmdWxsc2NyZWVuIHdpbmRvdworCitSRVRVUk5TOgorSGFuZGxlIHRvIGNvbnZlcnRlZCBmdWxsc2NyZWVuIFdpbmRvdy4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG9yaWdpbmFsIHVzZXIgd2luZG93IGhhbmRsZSBhbmQgbW9kaWZpZXMgdGhlIHNpemUsCitwb3NpdGlvbiBhbmQgYXR0cmlidXRlcyBmb3IgdGhlIHdpbmRvdyB0byBjb252ZXJ0IGl0IGludG8gYSBmdWxsc2NyZWVuCit3aW5kb3cgdGhhdCB3ZSBjYW4gdXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBQTV9IV05EIF9QTV9jb252ZXJ0VXNlcldpbmRvdygKKyAgICBIV05EIGh3bmQsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQpCit7CisgICAgUkVDVCAgICB3aW5kb3c7CisKKyAgICBHZXRXaW5kb3dSZWN0KGh3bmQsJndpbmRvdyk7CisgICAgb2xkV2luUG9zWCA9IHdpbmRvdy5sZWZ0OworICAgIG9sZFdpblBvc1kgPSB3aW5kb3cudG9wOworICAgIG9sZFdpblNpemVYID0gd2luZG93LnJpZ2h0IC0gd2luZG93LmxlZnQ7CisgICAgb2xkV2luU2l6ZVkgPSB3aW5kb3cuYm90dG9tIC0gd2luZG93LnRvcDsKKyAgICBvbGRXbmRTdHlsZSA9IFNldFdpbmRvd0xvbmcoaHduZCxHV0xfU1RZTEUsV1NfUE9QVVAgfCBXU19TWVNNRU5VKTsKKyAgICBvbGRFeFduZFN0eWxlID0gU2V0V2luZG93TG9uZyhod25kLEdXTF9FWFNUWUxFLFdTX0VYX0FQUFdJTkRPVyk7CisgICAgU2hvd1dpbmRvdyhod25kLFNXX1NIT1cpOworICAgIE1vdmVXaW5kb3coaHduZCwwLDAsd2lkdGgsaGVpZ2h0LFRSVUUpOworICAgIFNldFdpbmRvd1Bvcyhod25kLEhXTkRfVE9QTU9TVCwwLDAsMCwwLFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFKTsKKyAgICBvbGRXaW5Qcm9jID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhod25kLEdXTF9XTkRQUk9DLCAoTFBBUkFNKVBNX3dpblByb2MpOworICAgIHJldHVybiBod25kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2h3bmQgICAgLSBVc2VyIHdpbmRvdyB0byByZXN0b3JlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGVzIG9mIHRoZSB1c2VyIHdpbmRvdyBhbmQgcHV0J3MKK2l0IGJhY2sgaW50byBpdCdzIG9yaWdpbmFsIHN0YXRlIGJlZm9yZSBpdCB3YXMgY29udmVydGVkIHRvIGEgZnVsbHNjcmVlbgord2luZG93LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9QTV9yZXN0b3JlVXNlcldpbmRvdygKKyAgICBIV05EIGh3bmQpCit7CisgICAgU2V0V2luZG93TG9uZyhod25kLEdXTF9XTkRQUk9DLCAoTFBBUkFNKW9sZFdpblByb2MpOworICAgIFNldFdpbmRvd0xvbmcoaHduZCxHV0xfRVhTVFlMRSxvbGRFeFduZFN0eWxlKTsKKyAgICBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX1NUWUxFLG9sZFduZFN0eWxlKTsKKyAgICBTZXRXaW5kb3dQb3MoaHduZCxIV05EX05PVE9QTU9TVCwwLDAsMCwwLFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFKTsKKyAgICBTaG93V2luZG93KGh3bmQsU1dfU0hPVyk7CisgICAgTW92ZVdpbmRvdyhod25kLG9sZFdpblBvc1gsb2xkV2luUG9zWSxvbGRXaW5TaXplWCxvbGRXaW5TaXplWSxUUlVFKTsKKyAgICBvbGRXaW5Qcm9jID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitkZXZpY2UgIC0gSW5kZXggb2YgdGhlIGRldmljZSB0byBsb2FkIERpcmVjdERyYXcgZm9yICgwIGZvciBwcmltYXJ5KQorCitSRU1BUktTOgorQXR0ZW1wdHMgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgRGlyZWN0RHJhdyBETEwncyBhbmQgY3JlYXRlIHRoZSBEaXJlY3REcmF3CitvYmplY3RzIHRoYXQgd2UgbmVlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbG9hZERpcmVjdERyYXcoCisgICAgaW50IGRldmljZSkKK3sKKyAgICBIREMgICAgICAgICBoZGM7CisgICAgaW50ICAgICAgICAgYml0czsKKworICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCisgICAgaWYgKF9QTV9pbXBvcnRzLlBNX2xvYWREaXJlY3REcmF3ICE9IFBNX2xvYWREaXJlY3REcmF3KQorICAgICAgICByZXR1cm4gX1BNX2ltcG9ydHMuUE1fbG9hZERpcmVjdERyYXcoZGV2aWNlKTsKKworICAgIC8vIFRPRE86IEhhbmRsZSBtdWx0aS1tb25pdG9yISEKKyAgICBpZiAoZGV2aWNlICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogTG9hZCB0aGUgRGlyZWN0RHJhdyBETEwgaWYgbm90IHByZXNlbnRseSBsb2FkZWQgKi8KKyAgICBHRVRfREVGQVVMVF9DVygpOworICAgIGlmICghaEluc3RERCkgeworICAgICAgICBoZGMgPSBHZXREQyhOVUxMKTsKKyAgICAgICAgYml0cyA9IEdldERldmljZUNhcHMoaGRjLEJJVFNQSVhFTCk7CisgICAgICAgIFJlbGVhc2VEQyhOVUxMLGhkYyk7CisgICAgICAgIGlmIChiaXRzIDwgOCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoKGhJbnN0REQgPSBMb2FkTGlicmFyeSgiZGRyYXcuZGxsIikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcERpcmVjdERyYXdDcmVhdGUgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaEluc3RERCwiRGlyZWN0RHJhd0NyZWF0ZSIpOworICAgICAgICBpZiAoIXBEaXJlY3REcmF3Q3JlYXRlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgRGlyZWN0RHJhdyBvYmplY3QgKi8KKyAgICBpZiAoIWxwREQgJiYgcERpcmVjdERyYXdDcmVhdGUoTlVMTCwgJmxwREQsIE5VTEwpICE9IEREX09LKSB7CisgICAgICAgIGxwREQgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIFJFU0VUX0RFRkFVTFRfQ1coKTsKKyAgICByZXR1cm4gbHBERDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitkZXZpY2UgIC0gSW5kZXggb2YgdGhlIGRldmljZSB0byB1bmxvYWQgRGlyZWN0RHJhdyBmb3IgKDAgZm9yIHByaW1hcnkpCisKK1JFTUFSS1M6CitGcmVlcyBhbnkgRGlyZWN0RHJhdyBvYmplY3RzIGZvciB0aGUgZGV2aWNlLiBXZSBuZXZlciBhY3R1YWxseSBleHBsaWNpdGx5Cit1bmxvYWQgdGhlIGRkcmF3LmRsbCBsaWJyYXJ5LCBzaW5jZSB1bmxvYWRpbmcgYW5kIHJlbG9hZGluZyBpdCBpcwordW5uZWNlc3Nhcnkgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVubG9hZCBpdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleGl0cyBhbmQKK3RoYXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fdW5sb2FkRGlyZWN0RHJhdygKKyAgICBpbnQgZGV2aWNlKQoreworICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCisgICAgaWYgKF9QTV9pbXBvcnRzLlBNX3VubG9hZERpcmVjdERyYXcgIT0gUE1fdW5sb2FkRGlyZWN0RHJhdykgeworICAgICAgICBfUE1faW1wb3J0cy5QTV91bmxvYWREaXJlY3REcmF3KGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIGlmIChscEREKSB7CisgICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBERCk7CisgICAgICAgIGxwREQgPSBOVUxMOworICAgICAgICB9CisgICAgKHZvaWQpZGV2aWNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK09wZW4gYSBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbiwgY3JlYXRpbmcgdGhlIG1haW4gZXZlbnQgaGFuZGxpbmcKK3dpbmRvdyBpZiBuZWNlc3NhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKKyAgICBQTV9IV05EIGhXbmRVc2VyLAorICAgIGludCBkZXZpY2UsCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMsCisgICAgaW50IGJwcCwKKyAgICBpYm9vbCBmdWxsU2NyZWVuKQoreworICAgIFdORENMQVNTICAgICAgICBjbHM7CisgICAgc3RhdGljIGlib29sICAgIGNsYXNzUmVnaXN0ZXJlZCA9IGZhbHNlOworCisgICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KKyAgICBHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKTsKKyAgICBpZiAoX1BNX2ltcG9ydHMuUE1fb3BlbkNvbnNvbGUgIT0gUE1fb3BlbkNvbnNvbGUpIHsKKyAgICAgICAgaWYgKGZ1bGxTY3JlZW4pIHsKKyAgICAgICAgICAgIF9QTV9kZXNrWCA9IHhSZXM7CisgICAgICAgICAgICBfUE1fZGVza1kgPSB5UmVzOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gX1BNX2ltcG9ydHMuUE1fb3BlbkNvbnNvbGUoaFduZFVzZXIsZGV2aWNlLHhSZXMseVJlcyxicHAsZnVsbFNjcmVlbik7CisgICAgICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgZnVsbHNjcmVlbiB3aW5kb3cgaWYgbmVjZXNzYXJ5ICovCisgICAgaHduZFVzZXIgPSBoV25kVXNlcjsKKyAgICBpZiAoZnVsbFNjcmVlbikgeworICAgICAgICBpZiAoIWNsYXNzUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgLyogQ3JlYXRlIGEgV2luZG93IGNsYXNzIGZvciB0aGUgZnVsbHNjcmVlbiB3aW5kb3cgaW4gaGVyZSwgc2luY2UKKyAgICAgICAgICAgICAqIHdlIG5lZWQgdG8gcmVnaXN0ZXIgb25lIHRoYXQgd2lsbCBkbyBhbGwgb3VyIGV2ZW50IGhhbmRsaW5nIGZvcgorICAgICAgICAgICAgICogdXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGhJbnN0QXBwICAgICAgICAgICAgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgICAgICAgICBjbHMuaEN1cnNvciAgICAgICAgID0gTG9hZEN1cnNvcihOVUxMLElEQ19BUlJPVyk7CisgICAgICAgICAgICBjbHMuaEljb24gICAgICAgICAgID0gTG9hZEljb24oaEluc3RBcHAsTUFLRUlOVFJFU09VUkNFKDEpKTsKKyAgICAgICAgICAgIGNscy5scHN6TWVudU5hbWUgICAgPSBOVUxMOworICAgICAgICAgICAgY2xzLmxwc3pDbGFzc05hbWUgICA9IHN6V2luQ2xhc3NOYW1lOworICAgICAgICAgICAgY2xzLmhickJhY2tncm91bmQgICA9IEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKTsKKyAgICAgICAgICAgIGNscy5oSW5zdGFuY2UgICAgICAgPSBoSW5zdEFwcDsKKyAgICAgICAgICAgIGNscy5zdHlsZSAgICAgICAgICAgPSBDU19EQkxDTEtTOworICAgICAgICAgICAgY2xzLmxwZm5XbmRQcm9jICAgICA9IFBNX3dpblByb2M7CisgICAgICAgICAgICBjbHMuY2JXbmRFeHRyYSAgICAgID0gMDsKKyAgICAgICAgICAgIGNscy5jYkNsc0V4dHJhICAgICAgPSAwOworICAgICAgICAgICAgaWYgKCFSZWdpc3RlckNsYXNzKCZjbHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgY2xhc3NSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgX1BNX2Rlc2tYID0geFJlczsKKyAgICAgICAgX1BNX2Rlc2tZID0geVJlczsKKyAgICAgICAgaWYgKCFod25kVXNlcikgeworICAgICAgICAgICAgY2hhciB3aW5kb3dUaXRsZVs4MF07CisgICAgICAgICAgICBpZiAoTG9hZFN0cmluZyhoSW5zdEFwcCwxLHdpbmRvd1RpdGxlLHNpemVvZih3aW5kb3dUaXRsZSkpID09IDApCisgICAgICAgICAgICAgICAgc3RyY3B5KHdpbmRvd1RpdGxlLCJNR0wgRnVsbHNjcmVlbiBBcHBsaWNhdGlvbiIpOworICAgICAgICAgICAgX1BNX2h3bmRDb25zb2xlID0gQ3JlYXRlV2luZG93RXgoV1NfRVhfQVBQV0lORE9XLHN6V2luQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIHdpbmRvd1RpdGxlLFdTX1BPUFVQIHwgV1NfU1lTTUVOVSwwLDAseFJlcyx5UmVzLAorICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxoSW5zdEFwcCxOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfUE1faHduZENvbnNvbGUgPSBfUE1fY29udmVydFVzZXJXaW5kb3coaHduZFVzZXIseFJlcyx5UmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgU2hvd0N1cnNvcihmYWxzZSk7CisgICAgICAgIGlzRnVsbFNjcmVlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX1BNX2h3bmRDb25zb2xlID0gaHduZFVzZXI7CisgICAgICAgIGlzRnVsbFNjcmVlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgU2V0Rm9jdXMoX1BNX2h3bmRDb25zb2xlKTsKKyAgICBTZXRGb3JlZ3JvdW5kV2luZG93KF9QTV9od25kQ29uc29sZSk7CisgICAgRGlzYWJsZUF1dG9QbGF5KCk7CisgICAgKHZvaWQpYnBwOworICAgIHJldHVybiBfUE1faHduZENvbnNvbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRmluZCB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKK3sKKyAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLworICAgIGlmIChfUE1faW1wb3J0cy5QTV9nZXRDb25zb2xlU3RhdGVTaXplICE9IFBNX2dldENvbnNvbGVTdGF0ZVNpemUpCisgICAgICAgIHJldHVybiBfUE1faW1wb3J0cy5QTV9nZXRDb25zb2xlU3RhdGVTaXplKCk7CisKKyAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAorICAgIHZvaWQgKnN0YXRlQnVmLAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KKyAgICBpZiAoX1BNX2ltcG9ydHMuUE1fc2F2ZUNvbnNvbGVTdGF0ZSAhPSBQTV9zYXZlQ29uc29sZVN0YXRlKSB7CisgICAgICAgIF9QTV9pbXBvcnRzLlBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsaHduZENvbnNvbGUpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KKyAgICAodm9pZClzdGF0ZUJ1ZjsKKyAgICAodm9pZClod25kQ29uc29sZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCisgICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKK3sKKyAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLworICAgIGlmIChfUE1faW1wb3J0cy5QTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2sgIT0gUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKSB7CisgICAgICAgIF9QTV9pbXBvcnRzLlBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhzYXZlU3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBzdXNwZW5kQXBwID0gc2F2ZVN0YXRlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1Jlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAorICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KKyAgICBpZiAoX1BNX2ltcG9ydHMuUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSAhPSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKSB7CisgICAgICAgIF9QTV9pbXBvcnRzLlBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsaHduZENvbnNvbGUpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KKyAgICAodm9pZClzdGF0ZUJ1ZjsKKyAgICAodm9pZClod25kQ29uc29sZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDbG9zZSB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAorICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCit7CisgICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KKyAgICBpZiAoX1BNX2ltcG9ydHMuUE1fY2xvc2VDb25zb2xlICE9IFBNX2Nsb3NlQ29uc29sZSkgeworICAgICAgICBfUE1faW1wb3J0cy5QTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBTaG93Q3Vyc29yKHRydWUpOworICAgIFJlc3RvcmVBdXRvUGxheSgpOworICAgIGlmIChod25kVXNlcikKKyAgICAgICAgX1BNX3Jlc3RvcmVVc2VyV2luZG93KGh3bmRDb25zb2xlKTsKKyAgICBlbHNlCisgICAgICAgIERlc3Ryb3lXaW5kb3coaHduZENvbnNvbGUpOworICAgIGh3bmRVc2VyID0gTlVMTDsKKyAgICBfUE1faHduZENvbnNvbGUgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiB0aGUgRGlyZWN0RHJhdyB3aW5kb3cgaGFuZGxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX0hXTkQgUE1BUEkgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdyh2b2lkKQoreworICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCisgICAgaWYgKF9QTV9pbXBvcnRzLlBNX2dldERpcmVjdERyYXdXaW5kb3cgIT0gUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdykKKyAgICAgICAgcmV0dXJuIF9QTV9pbXBvcnRzLlBNX2dldERpcmVjdERyYXdXaW5kb3coKTsKKyAgICByZXR1cm4gX1BNX2h3bmRDb25zb2xlOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQzNzdkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZXZlbnQuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFdpbjMyCisqCisqIERlc2NyaXB0aW9uOiAgV2luMzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCisqICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1c2hvcnQgICBrZXlVcE1zZ1syNTZdID0gezB9OyAgICAvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCitzdGF0aWMgaW50ICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgV2luMzIgKi8KKyNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQorI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpICAodm9pZCkoZmxhZ3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAorCitSRU1BUktTOgorVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKK3RpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCitzdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwordGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgorZXZlbnRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKK3sgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBXaW4zMiBpbnRvIG91ciBldmVudCBxdWV1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCit7CisgICAgTVNHICAgICBtc2c7CisgICAgTVNHICAgICBjaGFyTXNnOworICAgIGV2ZW50X3QgZXZ0OworCisgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIERpcmVjdElucHV0ISBXZSBjYW4ndCBzdXBwb3J0IHJlbGF0aXZlIG1vdXNlCisgICAgLy8gICAgICAgbW92ZW1lbnQgbW90aW9uIGNvdW50ZXJzIHdpdGhvdXQgRGlyZWN0SW5wdXQgOy0oLgorICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLE5VTEwsMCwwLFBNX1JFTU9WRSkpIHsKKyAgICAgICAgbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7CisgICAgICAgIHN3aXRjaCAobXNnLm1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLIHwgRVZUX0RCTENMSUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047CisgICAgICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9MQlVUVE9OVVA6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOIHwgRVZUX0RCTENMSUNLOworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9NQlVUVE9OREJMQ0xLOgorICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTiB8IEVWVF9EQkxDTElDSzsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV01fTUJVVFRPTkRPV046CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXTV9NQlVUVE9OVVA6CisgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKKyAgICAgICAgICAgICAgICBpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfUkVQRUFUKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdNX0tFWVVQOgorICAgICAgICAgICAgY2FzZSBXTV9TWVNLRVlVUDoKKyAgICAgICAgICAgICAgICBldnQud2hhdCA9IEVWVF9LRVlVUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBDb252ZXJ0IG1vdXNlIGV2ZW50IG1vZGlmaWVyIGZsYWdzICovCisgICAgICAgIGlmIChldnQud2hhdCAmIEVWVF9NT1VTRUVWVCkgeworICAgICAgICAgICAgaWYgKF9QTV9kZXNrWCkgeworICAgICAgICAgICAgICAgIGV2dC53aGVyZV94ID0gKChsb25nKW1zZy5wdC54ICogcmFuZ2VYKSAvIF9QTV9kZXNrWDsKKyAgICAgICAgICAgICAgICBldnQud2hlcmVfeSA9ICgobG9uZyltc2cucHQueSAqIHJhbmdlWSkgLyBfUE1fZGVza1k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU2NyZWVuVG9DbGllbnQoX1BNX2h3bmRDb25zb2xlLCAmbXNnLnB0KTsKKyAgICAgICAgICAgICAgICBldnQud2hlcmVfeCA9IG1zZy5wdC54OworICAgICAgICAgICAgICAgIGV2dC53aGVyZV95ID0gbXNnLnB0Lnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2dC53aGF0ID09IEVWVF9NT1VTRU1PVkUpIHsKKyAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgRVZULm14ID0gZXZ0LndoZXJlX3g7CisgICAgICAgICAgICAgICAgRVZULm15ID0gZXZ0LndoZXJlX3k7CisgICAgICAgICAgICAgICAgaWYgKEVWVC5vbGRNb3ZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV94ID0gZXZ0LndoZXJlX3g7LyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKKy8vICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3ggKz0gbWlja2V5WDsgICAgLy8gVE9ETyEKKy8vICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3kgKz0gbWlja2V5WTsgICAgLy8gVE9ETyEKKyAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCisvLyAgICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gbWlja2V5WDsgICAgLy8gVE9ETyEKKy8vICAgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3kgPSBtaWNrZXlZOyAgICAvLyBUT0RPIQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEVWVC5vbGRNb3ZlID0gLTE7CisgICAgICAgICAgICBpZiAobXNnLndQYXJhbSAmIE1LX0xCVVRUT04pCisgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKKyAgICAgICAgICAgIGlmIChtc2cud1BhcmFtICYgTUtfUkJVVFRPTikKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEJVVDsKKyAgICAgICAgICAgIGlmIChtc2cud1BhcmFtICYgTUtfTUJVVFRPTikKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7CisgICAgICAgICAgICBpZiAobXNnLndQYXJhbSAmIE1LX1NISUZUKQorICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOworICAgICAgICAgICAgaWYgKG1zZy53UGFyYW0gJiBNS19DT05UUk9MKQorICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBDb252ZXJ0IGtleWJvYXJkIGNvZGVzICovCisgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisgICAgICAgIGlmIChldnQud2hhdCAmIEVWVF9LRVlFVlQpIHsKKyAgICAgICAgICAgIGludCBzY2FuQ29kZSA9IChtc2cubFBhcmFtID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKSB7CisgICAgICAgICAgICAgICAgLyogR2V0IG1lc3NhZ2UgZm9yIGtleXVwIGNvZGUgZnJvbSB0YWJsZSBvZiBjYWNoZWQgZG93biB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IGtleVVwTXNnW3NjYW5Db2RlXTsKKyAgICAgICAgICAgICAgICBrZXlVcE1zZ1tzY2FuQ29kZV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX0NIQVIsV01fQ0hBUixQTV9SRU1PVkUpKQorICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOworICAgICAgICAgICAgICAgIGlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX1NZU0NIQVIsV01fU1lTQ0hBUixQTV9SRU1PVkUpKQorICAgICAgICAgICAgICAgICAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOworICAgICAgICAgICAgICAgIGV2dC5tZXNzYWdlIHw9ICgobXNnLmxQYXJhbSA+PiA4KSAmIDB4RkYwMCk7CisgICAgICAgICAgICAgICAga2V5VXBNc2dbc2NhbkNvZGVdID0gKHVzaG9ydClldnQubWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVJFUEVBVCkKKyAgICAgICAgICAgICAgICBldnQubWVzc2FnZSB8PSAobXNnLmxQYXJhbSA8PCAxNik7CisgICAgICAgICAgICBpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfQUxURE9XTikKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKKyAgICAgICAgICAgIGlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDBVKQorICAgICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOworICAgICAgICAgICAgaWYgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwVSkKKyAgICAgICAgICAgICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7CisgICAgICAgICAgICBFVlQub2xkTW92ZSA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChldnQud2hhdCAhPSAwKSB7CisgICAgICAgICAgICAvKiBBZGQgdGltZSBzdGFtcCBhbmQgYWRkIHRoZSBldmVudCB0byB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIGV2dC53aGVuID0gbXNnLnRpbWU7CisgICAgICAgICAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKKyAgICAgICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQora2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCitjb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKK0N0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAorYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKK3RvIHRoZSByYXcgZm9ybWF0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX0VWVF9hYm9ydCgKKyAgICBpbnQgc2lnbmFsKQoreworICAgICh2b2lkKXNpZ25hbDsKKyAgICBFVlRfZXhpdCgpOworICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCisKK1JFTUFSS1M6CitJbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCit0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCit0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCisKK1dlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKK2V2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9pbml0KAorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOworICAgIGluaXRFdmVudFF1ZXVlKCk7CisgICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7CisKKyAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCisgICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOworICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKK3NwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKK21vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAorICAgIGludCB4UmVzLAorICAgIGludCB5UmVzKQoreworICAgIHJhbmdlWCA9IHhSZXM7CisgICAgcmFuZ2VZID0geVJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK01vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAorYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfc2V0TW91c2VQb3MoCisgICAgaW50ICp4LAorICAgIGludCAqeSkKK3sKKyAgICAvKiBTY2FsZSBjb29yZGluYXRlcyB1cCB0byBkZXNrdG9wIGNvb3JkaW5hdGVzIGZpcnN0ICovCisgICAgaW50IHNjYWxlZFggPSAoKnggKiBfUE1fZGVza1gpIC8gcmFuZ2VYOworICAgIGludCBzY2FsZWRZID0gKCp5ICogX1BNX2Rlc2tZKSAvIHJhbmdlWTsKKworICAgIC8qIFNjYWxlIGNvb3JkaW5hdGVzIGJhY2sgdG8gc2NyZWVuIGNvb3JkaW5hdGVzIGFnYWluICovCisgICAgKnggPSAoc2NhbGVkWCAqIHJhbmdlWCkgLyBfUE1fZGVza1g7CisgICAgKnkgPSAoc2NhbGVkWSAqIHJhbmdlWSkgLyBfUE1fZGVza1k7CisgICAgU2V0Q3Vyc29yUG9zKHNjYWxlZFgsc2NhbGVkWSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KK2NhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAorYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3Jlc3VtZSh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIFdpbjMyCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitTdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCitkZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX3N1c3BlbmQodm9pZCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGZvciBXaW4zMgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX2V4aXQodm9pZCkKK3sKKyAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLworICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQord2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKK2F0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAordGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCityZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KKworU0VFIEFMU086CitFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCBqb3lzdGljayBjb2RlIGJhc2VkIG9uIERpcmVjdFghCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1BvbGxzIHRoZSBqb3lzdGljayBmb3IgcG9zaXRpb24gYW5kIGJ1dHRvbiBpbmZvcm1hdGlvbi4KKworSEVBREVSOgorZXZlbnQuaAorCitSRU1BUktTOgorVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9sbCBhbmFsb2d1ZSBqb3lzdGlja3MgZm9yIGJ1dHRvbiBhbmQgcG9zaXRpb24KK2luZm9ybWF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWFpbiBsb29wIG9mIHRoZSB1c2VyCithcHBsaWNhdGlvbiwganVzdCBiZWZvcmUgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBldmVudHMgdmlhIEVWVF9nZXROZXh0LgorQWxsIGluZm9ybWF0aW9uIHBvbGxlZCBmcm9tIHRoZSBqb3lzdGljayB3aWxsIGJlIHBvc3RlZCB0byB0aGUgZXZlbnQKK3F1ZXVlIGZvciBsYXRlciByZXRyaWV2YWwuCisKK05vdGU6ICAgTW9zdCBhbmFsb2d1ZSBqb3lzdGlja3Mgd2lsbCBwcm92aWRlIHJlYWRpbmdzIHRoYXQgY2hhbmdlIGV2ZW4KKyAgICAgICAgdGhvdWdoIHRoZSBqb3lzdGljayBoYXMgbm90IG1vdmVkLiBIZW5jZSBpZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUKKyAgICAgICAgeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgorICAgICAgICBldmVudCBsb29wLgorCitTRUUgQUxTTzoKK0VWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LAorRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9wb2xsSm95c3RpY2sodm9pZCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgorCitIRUFERVI6CitldmVudC5oCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCit3aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCit0aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCitUbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Citwb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKK2Z1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQorY2FsaWJyYXRpb24gZmFjdG9ycy4KKworVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCitpbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKK3VwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKK3NhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgorCitTRUUgQUxTTzoKK0VWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitDYWxpYnJhdGVzIHRoZSBqb3lzdGljayBsb3dlciByaWdodCBwb3NpdGlvbgorCitIRUFERVI6CitldmVudC5oCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCit3aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCit0aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCitUbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSBsb3dlciByaWdodAorcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCitmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKK2NhbGlicmF0aW9uIGZhY3RvcnMuCisKK1VzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcworaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCit1cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCitzYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KKworU0VFIEFMU086CitFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX2pveVNldExvd2VyUmlnaHQodm9pZCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgY2VudGVyIHBvc2l0aW9uCisKK0hFQURFUjoKK2V2ZW50LmgKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKK3doaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKK3RoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KK1RvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGNlbnRlcgorcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCitmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKK2NhbGlicmF0aW9uIGZhY3RvcnMuCisKK1VzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcworaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCit1cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCitzYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KKworU0VFIEFMU086CitFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUQVBJIEVWVF9qb3lTZXRDZW50ZXIodm9pZCkKK3sKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvbnRzZXJ2Yy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvbnRzZXJ2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzI0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9udHNlcnZjLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggRGlzcGxheSBEb2N0b3IKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGlzIGEgcHJvcHJpZXRhcnkgdHJhZGUgc2VjcmV0IG9mICAgICB8CisqICB8U2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsIENoaWNvLCBDQSA5NTkyOCB8CisqICB8VVNBICh3d3cuc2NpdGVjaHNvZnQuY29tKS4gIEFOWSBVTkFVVEhPUklaRUQgUE9TU0VTU0lPTiwgVVNFLCAgICAgICB8CisqICB8VklFV0lORywgQ09QWUlORywgTU9ESUZJQ0FUSU9OIE9SIERJU1NFTUlOQVRJT04gT0YgVEhJUyBDT0RFIElTICAgICB8CisqICB8U1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVcuICBVbmxlc3MgeW91IGhhdmUgY3VycmVudCwgZXhwcmVzcyAgICAgICB8CisqICB8d3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gU2NpVGVjaCB0byBwb3NzZXNzIG9yIHVzZSB0aGlzIGNvZGUsIHlvdSB8CisqICB8bWF5IGJlIHN1YmplY3QgdG8gY2l2aWwgYW5kL29yIGNyaW1pbmFsIHBlbmFsdGllcy4gICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8SWYgeW91IHJlY2VpdmVkIHRoaXMgY29kZSBpbiBlcnJvciBvciB5b3Ugd291bGQgbGlrZSB0byByZXBvcnQgICAgICB8CisqICB8aW1wcm9wZXIgdXNlLCBwbGVhc2UgaW1tZWRpYXRlbHkgY29udGFjdCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIGF0ICB8CisqICB8NTMwLTg5NC04NDAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgV2luZG93cyBOVCwgV2luZG93cyAySyBvciBXaW5kb3dzIFhQLgorKgorKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIFNERCBhbmQgR0xEaXJlY3QKKyogICAgICAgICAgICAgICBkZXZpY2UgZHJpdmVyIGNvbXBvbmVudHMgdW5kZXIgV2luZG93cyBOVC8ySy9YUC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgIndpbjMyL29zaGRyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc3pEcml2ZXJOYW1lICAgIC0gQWN0dWFsIG5hbWUgb2YgdGhlIGRyaXZlciB0byBpbnN0YWxsIGluIHRoZSBzeXN0ZW0KK3N6U2VydmljZU5hbWUgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY3JlYXRlCitzekxvYWRHcm91cCAgICAgLSBMb2FkIGdyb3VwIGZvciB0aGUgZHJpdmVyIChOVUxMIGZvciBub3JtYWwgZHJpdmVycykKK2R3U2VydmljZVR5cGUgICAtIFNlcnZpY2UgdHlwZSB0byBjcmVhdGUKKworUkVUVVJOUzoKK1RydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZG9lcyBhbGwgdGhlIHdvcmsgdG8gaW5zdGFsbCB0aGUgZHJpdmVyIGludG8gdGhlIHN5c3RlbS4KK1RoZSBkcml2ZXIgaXMgbm90IGhvd2V2ZXIgYWN0aXZhdGVkOyBmb3IgdGhhdCB5b3UgbXVzdCB1c2UgdGhlIFN0YXJ0X1NkZEZpbHQKK2Z1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFBNQVBJIFBNX2luc3RhbGxTZXJ2aWNlKAorICAgIGNvbnN0IGNoYXIgKnN6RHJpdmVyTmFtZSwKKyAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lLAorICAgIGNvbnN0IGNoYXIgKnN6TG9hZEdyb3VwLAorICAgIHVsb25nIGR3U2VydmljZVR5cGUpCit7CisgICAgU0NfSEFORExFICAgc2NtSGFuZGxlOworICAgIFNDX0hBTkRMRSAgIGRyaXZlckhhbmRsZTsKKyAgICBjaGFyICAgICAgICBzekRyaXZlclBhdGhbTUFYX1BBVEhdOworICAgIEhLRVkgICAgICAgIGtleTsKKyAgICBjaGFyICAgICAgICBrZXlQYXRoW01BWF9QQVRIXTsKKyAgICB1bG9uZyAgICAgICBzdGF0dXM7CisKKyAgICAvLyBPYnRhaW4gYSBoYW5kbGUgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyIHJlcXVlc3RpbmcgYWxsIGFjY2VzcworICAgIGlmICgoc2NtSGFuZGxlID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7CisKKyAgICAvLyBGaW5kIHRoZSBwYXRoIHRvIHRoZSBkcml2ZXIgaW4gc3lzdGVtIGRpcmVjdG9yeQorICAgIEdldFN5c3RlbURpcmVjdG9yeShzekRyaXZlclBhdGgsIHNpemVvZihzekRyaXZlclBhdGgpKTsKKyAgICBzdHJjYXQoc3pEcml2ZXJQYXRoLCAiXFxkcml2ZXJzXFwiKTsKKyAgICBzdHJjYXQoc3pEcml2ZXJQYXRoLCBzekRyaXZlck5hbWUpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLgorICAgIGRyaXZlckhhbmRsZSA9IENyZWF0ZVNlcnZpY2Uoc2NtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pTZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6U2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0FMTF9BQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1NlcnZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9CT09UX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9FUlJPUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekRyaXZlclBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekxvYWRHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBkcml2ZXIgY291bGQgYWN0dWFsbHkgYmUgaW5zdGFsbGVkLgorICAgIGlmICghZHJpdmVySGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSBrZXkgZm9yIGRyaXZlciBzbyB0aGF0IGl0IGNhbiBiZSBhbHRlcmVkIGluIHRoZQorICAgIC8vIG5leHQgc3RlcC4KKyAgICBzdHJjcHkoa2V5UGF0aCwgIlNZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwiKTsKKyAgICBzdHJjYXQoa2V5UGF0aCwgc3pTZXJ2aWNlTmFtZSk7CisgICAgaWYgKChzdGF0dXMgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLGtleVBhdGgsMCxLRVlfQUxMX0FDQ0VTUywma2V5KSkgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAvLyBBIHByb2JsZW0gaGFzIG9jY3VyZWQuIERlbGV0ZSB0aGUgc2VydmljZSBzbyB0aGF0IGl0IGlzIG5vdCBpbnN0YWxsZWQuCisgICAgICAgIHN0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBEZWxldGVTZXJ2aWNlKGRyaXZlckhhbmRsZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgLy8gRGVsZXRlIHRoZSBJbWFnZVBhdGggdmFsdWUgaW4gdGhlIG5ld2x5IGNyZWF0ZWQga2V5IHNvIHRoYXQgdGhlCisgICAgLy8gc3lzdGVtIGxvb2tzIGZvciB0aGUgZHJpdmVyIGluIHRoZSBub3JtYWwgbG9jYXRpb24uCisgICAgaWYgKChzdGF0dXMgPSBSZWdEZWxldGVWYWx1ZShrZXksICJJbWFnZVBhdGgiKSkgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAvLyBBIHByb2JsZW0gaGFzIG9jY3VycmVkLiBEZWxldGUgdGhlIHNlcnZpY2Ugc28gdGhhdCBpdCBpcyBub3QKKyAgICAgICAgLy8gaW5zdGFsbGVkIGFuZCB3aWxsIG5vdCB0cnkgdG8gc3RhcnQuCisgICAgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgICAgIERlbGV0ZVNlcnZpY2UoZHJpdmVySGFuZGxlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAvLyBDbGVhbiB1cCBhbmQgZXhpdAorICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBzdGFydAorCitSRVRVUk5TOgorVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHRoZSBzcGVjaWZpZWQgc2VydmljZSBhbmQgbWFrZSBpdCBhY3RpdmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgUE1fc3RhcnRTZXJ2aWNlKAorICAgIGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpCit7CisgICAgU0NfSEFORExFICAgICAgIHNjbUhhbmRsZTsKKyAgICBTQ19IQU5ETEUgICAgICAgZHJpdmVySGFuZGxlOworICAgIFNFUlZJQ0VfU1RBVFVTCXNlcnZpY2VTdGF0dXM7CisgICAgdWxvbmcgICAgICAgICAgIHN0YXR1czsKKworICAgIC8vIE9idGFpbiBhIGhhbmRsZSB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIgcmVxdWVzdGluZyBhbGwgYWNjZXNzCisgICAgaWYgKChzY21IYW5kbGUgPSBPcGVuU0NNYW5hZ2VyKE5VTEwsIE5VTEwsIFNDX01BTkFHRVJfQUxMX0FDQ0VTUykpID09IE5VTEwpCisgICAgICAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKKworICAgIC8vIE9wZW4gdGhlIHNlcnZpY2Ugd2l0aCB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIuCisgICAgaWYgKChkcml2ZXJIYW5kbGUgPSBPcGVuU2VydmljZShzY21IYW5kbGUsc3pTZXJ2aWNlTmFtZSxTRVJWSUNFX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgLy8gU3RhcnQgdGhlIHNlcnZpY2UKKyAgICBpZiAoIVN0YXJ0U2VydmljZShkcml2ZXJIYW5kbGUsMCxOVUxMKSkgeworICAgICAgICBzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAvLyBRdWVyeSB0aGUgc2VydmljZSB0byBtYWtlIHN1cmUgaXQgaXMgdGhlcmUKKyAgICBpZiAoIVF1ZXJ5U2VydmljZVN0YXR1cyhkcml2ZXJIYW5kbGUsJnNlcnZpY2VTdGF0dXMpKSB7CQorICAgICAgICBzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBzdG9wCisKK1JFVFVSTlM6CitUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgYW5kIGRpc2FibGUgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgUE1fc3RvcFNlcnZpY2UoCisgICAgY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSkKK3sKKyAgICBTQ19IQU5ETEUgICAgICAgc2NtSGFuZGxlOworICAgIFNDX0hBTkRMRSAgICAgICBkcml2ZXJIYW5kbGU7CisgICAgU0VSVklDRV9TVEFUVVMJc2VydmljZVN0YXR1czsKKyAgICB1bG9uZyAgICAgICAgICAgc3RhdHVzOworCisgICAgLy8gT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MKKyAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOworCisgICAgLy8gT3BlbiB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4KKyAgICBpZiAoKGRyaXZlckhhbmRsZSA9IE9wZW5TZXJ2aWNlKHNjbUhhbmRsZSxzelNlcnZpY2VOYW1lLFNFUlZJQ0VfQUxMX0FDQ0VTUykpID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlIGZyb20gcnVubmluZworICAgIGlmICghQ29udHJvbFNlcnZpY2UoZHJpdmVySGFuZGxlLCBTRVJWSUNFX0NPTlRST0xfU1RPUCwgJnNlcnZpY2VTdGF0dXMpKSB7CisgICAgICAgIHN0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzelNlcnZpY2VOYW1lICAgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHJlbW92ZQorCitSRVRVUk5TOgorVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHNlcnZpY2UgY29tcGxldGVseSBmcm9tIHRoZSBzeXN0ZW0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgUE1fcmVtb3ZlU2VydmljZSgKKyAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKQoreworICAgIFNDX0hBTkRMRSAgIHNjbUhhbmRsZTsKKyAgICBTQ19IQU5ETEUgICBkcml2ZXJIYW5kbGU7CisgICAgdWxvbmcgICAgICAgc3RhdHVzOworCisgICAgLy8gT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MKKyAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOworCisgICAgLy8gT3BlbiB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4KKyAgICBpZiAoKGRyaXZlckhhbmRsZSA9IE9wZW5TZXJ2aWNlKHNjbUhhbmRsZSxzelNlcnZpY2VOYW1lLFNFUlZJQ0VfQUxMX0FDQ0VTUykpID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIHNlcnZpY2UKKyAgICBpZiAoIURlbGV0ZVNlcnZpY2UoZHJpdmVySGFuZGxlKSkgeworICAgICAgICBzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9vc2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOGM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9vc2hkci5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCisqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKKyoKKyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIFdpbjMyCisqCisqIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBTVFJJQ1QKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2RlZmluZSBOT05BTUVMRVNTVU5JT04KKyNpbmNsdWRlICJwbS9kZHJhdy5oIgorCisvKiBNYWNyb3MgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZGVmYXVsdCBjb250cm9sIHdvcmQuIFdpbmRvd3MgOXggaGFzCisgKiBzb21lIGJ1Z3MgaW4gaXQgc3VjaCB0aGF0IGNhbGxzIHRvIGxvYWQgYW55IERMTCdzIHdoaWNoIGxvYWQgMTYtYml0CisgKiBETEwncyBjYXVzZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCB3b3JkIHRvIGdldCB0cmFzaGVkLiBXZSBmaXgKKyAqIHRoaXMgYnkgc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIGNvbnRyb2wgd29yZCBhY3Jvc3MgcHJvYmxlbWF0aWMKKyAqIGNhbGxzLgorICovCisKKyNpZiBkZWZpbmVkKF9fSU5URUxfXykKKyNkZWZpbmUgR0VUX0RFRkFVTFRfQ1coKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9QTV9jd19kZWZhdWx0ID09IDApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX1BNX2N3X2RlZmF1bHQgPSBfY29udHJvbDg3KDAsMCk7ICAgXAorfQorI2RlZmluZSBSRVNFVF9ERUZBVUxUX0NXKCkgICAgICAgICAgICAgICAgICBcCisgICAgX2NvbnRyb2w4NyhfUE1fY3dfZGVmYXVsdCwweEZGRkZGRkZGKQorI2Vsc2UKKyNkZWZpbmUgR0VUX0RFRkFVTFRfQ1coKQorI2RlZmluZSBSRVNFVF9ERUZBVUxUX0NXKCkKKyNlbmRpZgorCisvKiBDdXN0b20gd2luZG93IG1lc3NhZ2VzICovCisKKyNkZWZpbmUJV01fRE9fU1VTUEVORF9BUFAJCQlXTV9VU0VSCisjZGVmaW5lCVdNX1BNX0xFQVZFX0ZVTExTQ1JFRU4JICAgIDAKKyNkZWZpbmUJV01fUE1fUkVTVE9SRV9GVUxMU0NSRUVOCTEKKworLyogTWFjcm8gZm9yIGRpc2FibGluZyBBdXRvUGxheSBvbiBhIHVzZSBzeXN0ZW0gKi8KKworI2RlZmluZSBBVVRPUExBWV9EUklWRV9DRFJPTSAgICAweDIwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19JTlRFTF9fCitleHRlcm4gdWludCAgICAgX1BNX2N3X2RlZmF1bHQ7ICAgICAgICAgLyogRGVmYXVsdCBGUFUgY29udHJvbCB3b3JkICAgICAqLworI2VuZGlmCitleHRlcm4gaW50ICAgICAgX1BNX2Rlc2tYLF9QTV9kZXNrWTsgICAgLyogRGVza3RvcCBkaW1lbnNpb25zICAgICAgICAgICAqLworZXh0ZXJuIEhXTkQgICAgIF9QTV9od25kQ29uc29sZTsgICAgICAgIC8qIFdpbmRvdyBoYW5kbGUgZm9yIGNvbnNvbGUgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKTsKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4ZGE0YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3BtLmMKQEAgLTAsMCArMSwxNDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMgorKgorKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAorKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQorKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKKyogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAorKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSAicG1hcGkuaCIKKyNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKKyNpbmNsdWRlICJwbV9oZWxwLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2lib29sICAgICAgICAgICBfUE1faGF2ZVdpbk5UOyAgICAgIC8qIFRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24gTlQgICAgICovCitzdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLworc3RhdGljIHZvaWQgICAgICpWRVNBQnVmX3B0ciA9IE5VTEw7LyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KK3N0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JzZWc7ICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCitzdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLworSEFORExFICAgICAgICAgIF9QTV9oRGV2aWNlID0gTlVMTDsgLyogSGFuZGxlIHRvIFdpbjMyIFZ4RCAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpYm9vbCAgICBpbml0ZWQgPSBmYWxzZTsgICAgIC8qIEZsYWdzIGlmIHdlIGFyZSBpbml0aWFsaXNlZCAgICAgICovCitzdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOworCitzdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleSAgID0gIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQ29tcHV0ZXJOYW1lIjsKK3N0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lS2V5TlQgPSAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcQ29tcHV0ZXJOYW1lXFxBY3RpdmVDb21wdXRlck5hbWUiOworc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWUgICAgICA9ICJDb21wdXRlck5hbWUiOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNYWNybyB0byBjaGVjayBmb3IgYSB2YWxpZCwgbG9hZGVkIHZlcnNpb24gb2YgUE1IRUxQLiBXZSBjaGVjayB0aGlzCisgKiBvbiBkZW1hbmQgd2hlbiB3ZSBuZWVkIHRoZXNlIHNlcnZpY2VzIHJhdGhlciB0aGFuIHdoZW4gUE1faW5pdCgpIGlzCisgKiBjYWxsZWQgYmVjYXVzZSBpZiB3ZSBhcmUgcnVubmluZyBvbiBEaXJlY3REcmF3IHdlIGRvbid0IG5lZWQgUE1IRUxQLlZYRC4KKyAqLworCisjZGVmaW5lIENIRUNLX0ZPUl9QTUhFTFAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfUE1faGF2ZVdpbk5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gUE1IRUxQLlNZUyBvciBTRERIRUxQLlNZUyEiKTsgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gUE1IRUxQLlZYRCBvciBTRERIRUxQLlZYRCEiKTsgXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLiBJZiB3ZQorY2Fubm90IGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCB3ZSBiYWlsIG91dCB3aXRoIGFuIGVycm9yCittZXNzYWdlLiBPdXIgV2luZG93cyA5eCBWeEQgaXMgZHluYW1pY2FsbHkgbG9hZGFibGUsIHNvIGl0IGNhbiBiZSBsb2FkZWQKK2FmdGVyIHRoZSBzeXN0ZW0gaGFzIHN0YXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCit7CisgICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisgICAgY2hhciAgICBjbnRQYXRoW1BNX01BWF9QQVRIXTsKKyAgICBjaGFyICAgICplbnY7CisKKyAgICAvKiBDcmVhdGUgYSBmaWxlIGhhbmRsZSBmb3IgdGhlIHN0YXRpYyBWeEQgaWYgcG9zc2libGUsIG90aGVyd2lzZQorICAgICAqIGR5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUCBoZWxwZXIgVnhELiBOb3RlIHRoYXQgaWYgYW4gb2xkIHZlcnNpb24KKyAgICAgKiBvZiBTREQgaXMgbG9hZGVkLCB3ZSB1c2UgdGhlIFBNSEVMUCBWeEQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBpZiAoIWluaXRlZCkgeworICAgICAgICAvKiBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgV2luZG93cyBOVCBvciBub3QgYW5kCisgICAgICAgICAqIHNldCB0aGUgZ2xvYmFsIE9TIHR5cGUgdmFyaWFibGUuCisgICAgICAgICAqLworICAgICAgICBfUE1faGF2ZVdpbk5UID0gZmFsc2U7CisgICAgICAgIGlmICgoR2V0VmVyc2lvbigpICYgMHg4MDAwMDAwMFVMKSA9PSAwKQorICAgICAgICAgICAgX1BNX2hhdmVXaW5OVCA9IHRydWU7CisgICAgICAgIF9fX2Rydl9vc190eXBlID0gKF9QTV9oYXZlV2luTlQpID8gX09TX1dJTk5UIDogX09TX1dJTjk1OworCisgICAgICAgIC8qIE5vdyB0cnkgdG8gY29ubmVjdCB0byBTRERIRUxQLlZYRCBvciBTRERIRUxQLlNZUyAqLworICAgICAgICBfUE1faERldmljZSA9IENyZWF0ZUZpbGUoU0RESEVMUF9NT0RVTEVfUEFUSCwgMCwwLDAsIENSRUFURV9ORVcsIEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UsIDApOworICAgICAgICBpZiAoX1BNX2hEZXZpY2UgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUVkVSMzIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkgfHwgb3V0QnVmWzBdIDwgUE1IRUxQX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICAvKiBPbGQgdmVyc2lvbiBvZiBTRERIRUxQIGxvYWRlZCwgc28gdXNlIFBNSEVMUCBpbnN0ZWFkICovCisgICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoX1BNX2hEZXZpY2UpOworICAgICAgICAgICAgICAgIF9QTV9oRGV2aWNlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50bHkgbG9hZGVkIFBNSEVMUCBkcml2ZXIuCisgICAgICAgICAgICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2Ugd2hlbiB3ZSBhcmUgcnVubmluZyB1bmRlciBXaW5kb3dzIE5ULzJLLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBfUE1faERldmljZSA9IENyZWF0ZUZpbGUoUE1IRUxQX01PRFVMRV9QQVRILCAwLDAsMCwgQ1JFQVRFX05FVywgRklMRV9GTEFHX0RFTEVURV9PTl9DTE9TRSwgMCk7CisgICAgICAgICAgICBpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgZHJpdmVyIHdhcyBub3Qgc3RhdGljbHkgbG9hZGVkLCBzbyB0cnkgY3JlYXRpbmcgYSBmaWxlIGhhbmRsZQorICAgICAgICAgICAgICAgICAqIHRvIGEgZHluYW1pYyB2ZXJzaW9uIG9mIHRoZSBWeEQgaWYgcG9zc2libGUuIE5vdGUgdGhhdCBvbiBXaW5OVC8ySyB3ZQorICAgICAgICAgICAgICAgICAqIGNhbm5vdCBzdXBwb3J0IGR5bmFtaWNhbGx5IGxvYWRpbmcgdGhlIGRyaXZlcnMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgX1BNX2hEZXZpY2UgPSBDcmVhdGVGaWxlKFBNSEVMUF9WWERfUEFUSCwgMCwwLDAsIENSRUFURV9ORVcsIEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgICAgICAvKiBDYWxsIHRoZSBkcml2ZXIgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlciAqLworICAgICAgICAgICAgaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRWRVIzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkgfHwgb3V0QnVmWzBdIDwgUE1IRUxQX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICBpZiAoX1BNX2hhdmVXaW5OVCkKKyAgICAgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiT2xkZXIgdmVyc2lvbiBvZiBQTUhFTFAuU1lTIGZvdW5kISIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiT2xkZXIgdmVyc2lvbiBvZiBQTUhFTFAuVlhEIGZvdW5kISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm93IHNldCB0aGUgY3VycmVudCBwYXRoIGluc2lkZSB0aGUgVnhEIHNvIGl0IGtub3dzIHdoYXQgdGhlCisgICAgICAgICAgICAgKiBjdXJyZW50IGRpcmVjdG9yeSBpcyBmb3IgbG9hZGluZyBOdWNsZXVzIGRyaXZlcnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGluQnVmWzBdID0gKHVsb25nKVBNX2dldEN1cnJlbnRQYXRoKGNudFBhdGgsc2l6ZW9mKGNudFBhdGgpKTsKKyAgICAgICAgICAgIGlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfU0VUQ05UUEFUSDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgICAgICAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gc2V0IFZ4RCBjdXJyZW50IHBhdGghIik7CisKKyAgICAgICAgICAgIC8qIE5vdyBwYXNzIGRvd24gdGhlIE5VQ0xFVVNfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZGV2aWNlCisgICAgICAgICAgICAgKiBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGlzIHZhbHVlIGlmIGl0IGlzIGZvdW5kLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZlswXSA9ICh1bG9uZyllbnY7CisgICAgICAgICAgICAgICAgaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9TRVROVUNMRVVTUEFUSDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIHNldCBWeEQgTnVjbGV1cyBwYXRoISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRW5hYmxlIElPUEwgZm9yIHJpbmctMyBjb2RlIGJ5IGRlZmF1bHQgaWYgZHJpdmVyIGlzIHByZXNlbnQgKi8KKyAgICAgICAgICAgIGlmIChfUE1faGF2ZVdpbk5UKQorICAgICAgICAgICAgICAgIFBNX3NldElPUEwoMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogSW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgKi8KKyAgICAgICAgaW5pdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1dlIGRvIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgV2luZG93cyA5eCwgYnV0IG5vdCB1bmRlciBXaW5kb3dzIE5ULgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9zZXRJT1BMKAorICAgIGludCBpb3BsKQoreworICAgIERXT1JEICAgICAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICAgICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgICAgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworICAgIHN0YXRpYyBpbnQgIGNudElPUEwgPSAwOworICAgIGludCAgICAgICAgIG9sZElPUEwgPSBjbnRJT1BMOworCisgICAgLyogRW5hYmxlIEkvTyBieSBhZGp1c3RpbmcgdGhlIEkvTyBwZXJtaXNzaW9ucyBtYXAgb24gV2luZG93cyBOVCAqLworICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7CisgICAgICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKKyAgICAgICAgaWYgKGlvcGwgPT0gMykKKyAgICAgICAgICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0VOQUJMRVJJTkczSU9QTCwgaW5CdWYsIHNpemVvZihpbkJ1Ziksb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRElTQUJMRVJJTkczSU9QTCwgaW5CdWYsIHNpemVvZihpbkJ1Ziksb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKTsKKyAgICAgICAgY250SU9QTCA9IGlvcGw7CisgICAgICAgIHJldHVybiBvbGRJT1BMOworICAgICAgICB9CisKKyAgICAvKiBXZSBhbHdheXMgaGF2ZSBJT1BMIG9uIFdpbmRvd3MgOXggKi8KKyAgICByZXR1cm4gMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitXZSBkbyBoYXZlIEJJT1MgYWNjZXNzIHVuZGVyIFdpbmRvd3MgOXgsIGJ1dCBub3QgdW5kZXIgV2luZG93cyBOVC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoreworICAgIGlmIChQTV9nZXRPU1R5cGUoKSA9PSBfT1NfV0lOTlQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfUE1faERldmljZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCit7CisgICAgaWYgKChHZXRWZXJzaW9uKCkgJiAweDgwMDAwMDAwVUwpID09IDApCisgICAgICAgIHJldHVybiBfX19kcnZfb3NfdHlwZSA9IF9PU19XSU5OVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfX19kcnZfb3NfdHlwZSA9IF9PU19XSU45NTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoreworICAgIHJldHVybiBQTV8zODY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAorICAgIGNoYXIgKnMpCit7CisgICAgdWludCBwb3MgPSBzdHJsZW4ocyk7CisgICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKKyAgICAgICAgc1twb3NdID0gJ1xcJzsKKyAgICAgICAgc1twb3MrMV0gPSAnXDAnOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAorICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKK3sKKyAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKKyAgICBjb25zdCBjaGFyICptc2cpCit7CisgICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQorICAgICAgICBmYXRhbEVycm9yQ2xlYW51cCgpOworICAgIE1lc3NhZ2VCb3goTlVMTCxtc2csIkZhdGFsIEVycm9yISIsIE1CX0lDT05FWENMQU1BVElPTik7CisgICAgZXhpdCgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCisgICAgdWludCAqbGVuLAorICAgIHVpbnQgKnJzZWcsCisgICAgdWludCAqcm9mZikKK3sKKyAgICBEV09SRCAgIG91dEJ1Zls0XTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgLyogV2UgcmVxdWlyZSB0aGUgaGVscGVyIFZ4RCB0byBiZSBsb2FkZWQgc3RhdGljbHkgaW4gb3JkZXIgdG8gc3VwcG9ydAorICAgICAqIHRoZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlci4gV2UgZG8gbm90IHN1cHBvcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZworICAgICAqIHJlYWwgbW9kZSBtZW1vcnkgYnVmZmVycyBmcm9tIFdpbjMyIHByb2dyYW1zICh3ZSBuZWVkIGEgMTYtYml0IERMTAorICAgICAqIGZvciB0aGlzLCBhbmQgV2luZG93cyA5eCBiZWNvbWVzIHZlcnkgdW5zdGFibGUgaWYgeW91IGZyZWUgdGhlCisgICAgICogbWVtb3J5IGJsb2NrcyBvdXQgb2Ygb3JkZXIpLgorICAgICAqLworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgaWYgKCFWRVNBQnVmX3B0cikgeworICAgICAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRWRVNBQlVGMzIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgeworICAgICAgICAgICAgaWYgKCFvdXRCdWZbMF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBWRVNBQnVmX3B0ciA9ICh2b2lkKilvdXRCdWZbMF07CisgICAgICAgICAgICBWRVNBQnVmX2xlbiA9IG91dEJ1ZlsxXTsKKyAgICAgICAgICAgIFZFU0FCdWZfcnNlZyA9IG91dEJ1ZlsyXTsKKyAgICAgICAgICAgIFZFU0FCdWZfcm9mZiA9IG91dEJ1ZlszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKKyAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKKyAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKKyAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKK3sKKyAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKK3sKKyAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCisgICAgcmV0dXJuIDB4RDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBPUyBjb25zb2xlIGN1cnNvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oCisgICAgaW50IHgsCisgICAgaW50IHkpCit7CisgICAgLyogTm90aGluZyB0byBkbyBmb3IgV2luZG93cyAqLworICAgICh2b2lkKXg7CisgICAgKHZvaWQpeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBXaW5kb3dzICovCisgICAgKHZvaWQpd2lkdGg7CisgICAgKHZvaWQpaGVpZ2h0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIgKHVzZWQgZm9yIHNvZnR3YXJlIHN0ZXJlbyBtb2RlcykuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoCisgICAgUE1faW50SGFuZGxlciBpaCwKKyAgICBpbnQgZnJlcXVlbmN5KQoreworICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgZnJvbSBXaW4zMiBwcm9ncmFtcy4gUmF0aGVyIHRoZSBWeEQgaGFuZGxlcworICAgICAqIHRoaXMgc3R1ZmYgaXQgd2lsbCB0YWtlIGNhcmUgb2YgaG9va2luZyB0aGUgc3RlcmVvIGZsaXAgZnVuY3Rpb25zIGF0CisgICAgICogdGhlIFZ4RCBsZXZlbC4KKyAgICAgKi8KKyAgICAodm9pZClpaDsKKyAgICAodm9pZClmcmVxdWVuY3k7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAorICAgIGludCBmcmVxdWVuY3kpCit7CisgICAgLyogTm90IHN1cHBvcnRlZCB1bmRlciBXaW4zMiAqLworICAgICh2b2lkKWZyZXF1ZW5jeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQoreworICAgIC8qIE5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luMzIgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKKyAgICBjaGFyICpwYXRoLAorICAgIGludCBtYXhMZW4pCit7CisgICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUXVlcnkgYSBzdHJpbmcgZnJvbSB0aGUgcmVnaXN0cnkgKGV4dGVuZGVkIHZlcnNpb24pLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpYm9vbCBSRUdfcXVlcnlTdHJpbmdFeCgKKyAgICBIS0VZIGhLZXksCisgICAgY29uc3QgY2hhciAqc3pWYWx1ZSwKKyAgICBjaGFyICp2YWx1ZSwKKyAgICB1bG9uZyBzaXplKQoreworICAgIERXT1JEICAgdHlwZTsKKworICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaEtleSwoUENIQVIpc3pWYWx1ZSwoUERXT1JEKU5VTEwsKFBEV09SRCkmdHlwZSwoTFBCWVRFKXZhbHVlLChQRFdPUkQpJnNpemUpID09IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitRdWVyeSBhIHN0cmluZyBmcm9tIHRoZSByZWdpc3RyeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nKAorICAgIGNvbnN0IGNoYXIgKnN6S2V5LAorICAgIGNvbnN0IGNoYXIgKnN6VmFsdWUsCisgICAgY2hhciAqdmFsdWUsCisgICAgRFdPUkQgc2l6ZSkKK3sKKyAgICBIS0VZICAgIGhLZXk7CisgICAgaWJvb2wgICBzdGF0dXMgPSBmYWxzZTsKKworICAgIG1lbXNldCh2YWx1ZSwwLHNpemVvZih2YWx1ZSkpOworICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSxzektleSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBzdGF0dXMgPSBSRUdfcXVlcnlTdHJpbmdFeChoS2V5LHN6VmFsdWUsdmFsdWUsc2l6ZSk7CisgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgICAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgR2V0U3lzdGVtRGlyZWN0b3J5KHBhdGgsc2l6ZW9mKHBhdGgpKTsKKyAgICByZXR1cm4gcGF0aFswXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHBhdGggdG8gdGhlIFZCRS9BRiBkcml2ZXIgZmlsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoreworICAgIHJldHVybiAiYzpcXCI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgY2hhciAgICAgICAgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVudjsKKyAgICBHZXRTeXN0ZW1EaXJlY3RvcnkocGF0aCxzaXplb2YocGF0aCkpOworICAgIHN0cmNhdChwYXRoLCJcXG51Y2xldXMiKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07CisgICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7CisgICAgUE1fYmFja3NsYXNoKHBhdGgpOworICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCit7CisgICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKKworICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleSxzek1hY2hpbmVOYW1lLG5hbWUsc2l6ZW9mKG5hbWUpKSkKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5TlQsc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCisgICAgICAgIHJldHVybiBuYW1lOworICAgIHJldHVybiAiVW5rbm93biI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoreworICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7CisgICAgICAgIC8qIE9uIFdpbmRvd3MgTlQgd2UgaGF2ZSB0byBtYXAgaXQgcGh5c2ljYWxseSBkaXJlY3RseSAqLworCSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLCAweDEwMDAsIHRydWUpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEZvciBXaW5kb3dzIDl4IHdlIGNhbiBhY2Nlc3MgdGhpcyBtZW1vcnkgZGlyZWN0bHkgKi8KKyAgICAgICAgcmV0dXJuICh2b2lkKikweDQwMDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoreworICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7CisgICAgICAgIC8qIE9uIFdpbmRvd3MgTlQgd2UgaGF2ZSB0byBtYXAgaXQgcGh5c2ljYWxseSBkaXJlY3RseSAqLworCSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsIDB4MEZGRkYsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBBbHdheXMgdXNlIHRoZSAweEEwMDAwIGxpbmVhciBhZGRyZXNzIHNvIHRoYXQgd2Ugd2lsbCB1c2UKKyAgICAgICAgICogd2hhdGV2ZXIgcGFnZSB0YWJsZSBtYXBwaW5ncyBhcmUgc2V0IHVwIGZvciB1cyAoaWU6IGZvciB2aXJ0dWFsCisgICAgICAgICAqIGJhbmsgc3dpdGNoaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuICh2b2lkKikweEEwMDAwOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxpbWl0LAorICAgIGlib29sIGlzQ2FjaGVkKQoreworICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpbkJ1ZlswXSA9IGJhc2U7CisgICAgaW5CdWZbMV0gPSBsaW1pdDsKKyAgICBpbkJ1ZlsyXSA9IGlzQ2FjaGVkOworICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfTUFQUEhZUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCisgICAgICAgIHJldHVybiAodm9pZCopb3V0QnVmWzBdOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCisgICAgdm9pZCAqcHRyLAorICAgIHVsb25nIGxpbWl0KQoreworICAgIC8qIFdlIG5ldmVyIGZyZWUgdGhlIG1hcHBpbmdzIHVuZGVyIFdpbjMyICh0aGUgVnhEIHRyYWNrcyB0aGVtIGFuZAorICAgICAqIHJlaXNzdWVzIHRoZSBzYW1lIG1hcHBpbmdzIHVudGlsIHRoZSBzeXN0ZW0gaXMgcmVib290ZWQpLgorICAgICAqLworICAgICh2b2lkKXB0cjsKKyAgICAodm9pZClsaW1pdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCisgICAgdm9pZCAqcCkKK3sKKyAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFBIWVNJQ0FMQUREUjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCisgICAgICAgIHJldHVybiBvdXRCdWZbMF07CisgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKKyAgICB2b2lkICpwLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCit7CisgICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGluQnVmWzBdID0gKHVsb25nKXA7CisgICAgaW5CdWZbMV0gPSAodWxvbmcpbGVuZ3RoOworICAgIGluQnVmWzJdID0gKHVsb25nKXBoeXNBZGRyZXNzOworICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUUEhZU0lDQUxBRERSUkFOR0UzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQorICAgICAgICByZXR1cm4gb3V0QnVmWzBdOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2xlZXAoCisgICAgdWxvbmcgbWlsbGlzZWNvbmRzKQoreworICAgIFNsZWVwKG1pbGxpc2Vjb25kcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIENPTSBwb3J0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQoreworICAgIC8vIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkKKyAgICAvLyAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuCisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0Y4OworICAgICAgICBjYXNlIDE6IHJldHVybiAweDJGODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgzRTg7CisgICAgICAgIGNhc2UgMzogcmV0dXJuIDB4MkU4OworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIExQVCBwb3J0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQoreworICAgIC8vIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkKKyAgICAvLyAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuCisgICAgc3dpdGNoIChwb3J0KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIDB4M0JDOworICAgICAgICBjYXNlIDE6IHJldHVybiAweDM3ODsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gMHgyNzg7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitBbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBXaW45eCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5CithcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0CisoaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50CitkYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZworMCBpbnRlcnJ1cHQgY29udGV4dC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAorICAgIGxvbmcgc2l6ZSkKK3sKKyAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGluQnVmWzBdID0gc2l6ZTsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX01BTExPQ1NIQVJFRDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCisgICAgICAgIHJldHVybiAodm9pZCopb3V0QnVmWzBdOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKKyAgICB2b2lkICpwdHIpCit7CisgICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworCisgICAgaW5CdWZbMF0gPSAodWxvbmcpcHRyOworICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKKyAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9GUkVFU0hBUkVEMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitNYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKK2FkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKK1BNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAorICAgIHZvaWQgKmJhc2UsCisgICAgdWxvbmcgbGltaXQpCit7CisgICAgKHZvaWQpYmFzZTsKKyAgICAodm9pZClsaW1pdDsKKyAgICByZXR1cm4gYmFzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitNYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAorICAgIHVpbnQgcl9zZWcsCisgICAgdWludCByX29mZikKK3sKKyAgICByZXR1cm4gKHZvaWQqKShNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKKyAgICB1aW50IHNpemUsCisgICAgdWludCAqcl9zZWcsCisgICAgdWludCAqcl9vZmYpCit7CisgICAgLyogV2UgZG8gbm90IHN1cHBvcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZyByZWFsIG1vZGUgbWVtb3J5IGJ1ZmZlcnMKKyAgICAgKiBmcm9tIFdpbjMyIHByb2dyYW1zICh3ZSBuZWVkIGEgMTYtYml0IERMTCBmb3IgdGhpcywgYW5kIFdpbmRvd3MKKyAgICAgKiA5eCBiZWNvbWVzIHZlcnkgdW5zdGFibGUgaWYgeW91IGZyZWUgdGhlIG1lbW9yeSBibG9ja3Mgb3V0IG9mIG9yZGVyKS4KKyAgICAgKi8KKyAgICAodm9pZClzaXplOworICAgICh2b2lkKXJfc2VnOworICAgICh2b2lkKXJfb2ZmOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCisgICAgdm9pZCAqbWVtKQoreworICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gV2luZG93cyAqLworICAgICh2b2lkKW1lbTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIERQTUlfaW50ODYoCisgICAgaW50IGludG5vLAorICAgIERQTUlfcmVncyAqcmVncykKK3sKKyAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpbkJ1ZlswXSA9IGludG5vOworICAgIGluQnVmWzFdID0gKHVsb25nKXJlZ3M7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0RQTUlJTlQ4NjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2KAorICAgIGludCBpbnRubywKKyAgICBSTVJFR1MgKmluLAorICAgIFJNUkVHUyAqb3V0KQoreworICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpbkJ1ZlswXSA9IGludG5vOworICAgIGluQnVmWzFdID0gKHVsb25nKWluOworICAgIGluQnVmWzJdID0gKHVsb25nKW91dDsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0lOVDg2MzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIG91dEJ1ZlswXTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBNQVBJIFBNX2ludDg2eCgKKyAgICBpbnQgaW50bm8sCisgICAgUk1SRUdTICppbiwKKyAgICBSTVJFR1MgKm91dCwKKyAgICBSTVNSRUdTICpzcmVncykKK3sKKyAgICBEV09SRCAgIGluQnVmWzRdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgaW5CdWZbMF0gPSBpbnRubzsKKyAgICBpbkJ1ZlsxXSA9ICh1bG9uZylpbjsKKyAgICBpbkJ1ZlsyXSA9ICh1bG9uZylvdXQ7CisgICAgaW5CdWZbM10gPSAodWxvbmcpc3JlZ3M7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9JTlQ4NlgzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQorICAgICAgICByZXR1cm4gb3V0QnVmWzBdOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAorICAgIHVpbnQgc2VnLAorICAgIHVpbnQgb2ZmLAorICAgIFJNUkVHUyAqaW4sCisgICAgUk1TUkVHUyAqc3JlZ3MpCit7CisgICAgRFdPUkQgICBpbkJ1Zls0XTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGlmICghaW5pdGVkKQorICAgICAgICBQTV9pbml0KCk7CisgICAgaW5CdWZbMF0gPSBzZWc7CisgICAgaW5CdWZbMV0gPSBvZmY7CisgICAgaW5CdWZbMl0gPSAodWxvbmcpaW47CisgICAgaW5CdWZbM10gPSAodWxvbmcpc3JlZ3M7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0NBTExSRUFMTU9ERTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitSZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAorICAgIHVsb25nICpwaHlzaWNhbCwKKyAgICB1bG9uZyAqdG90YWwpCit7CisgICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHVuZGVyIFdpbjMyIGF0IHRoZSBtb21lbnQgKi8KKyAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0FsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKKyAgICB1aW50IHNpemUsCisgICAgdWxvbmcgKnBoeXNBZGRyLAorICAgIGlib29sIGNvbnRpZ3VvdXMsCisgICAgaWJvb2wgYmVsb3cxNk0pCit7CisgICAgRFdPUkQgICBpbkJ1Zls0XTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGluQnVmWzBdID0gc2l6ZTsKKyAgICBpbkJ1ZlsxXSA9ICh1bG9uZylwaHlzQWRkcjsKKyAgICBpbkJ1ZlsyXSA9ICh1bG9uZyljb250aWd1b3VzOworICAgIGluQnVmWzNdID0gKHVsb25nKWJlbG93MTZNOworICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfQUxMT0NMT0NLRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQorICAgICAgICByZXR1cm4gKHZvaWQqKW91dEJ1ZlswXTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCisgICAgdm9pZCAqcCwKKyAgICB1aW50IHNpemUsCisgICAgaWJvb2wgY29udGlndW91cykKK3sKKyAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOworICAgIGluQnVmWzFdID0gc2l6ZTsKKyAgICBpbkJ1ZlsyXSA9IGNvbnRpZ3VvdXM7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZSRUVMT0NLRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgIE5VTEwsIDAsICZjb3VudCwgTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQWxsb2NhdGVzIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCisgICAgaWJvb2wgbG9ja2VkKQoreworICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaWYgKCFpbml0ZWQpCisgICAgICAgIFBNX2luaXQoKTsKKyAgICBpbkJ1ZlswXSA9IGxvY2tlZDsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0FMTE9DUEFHRTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCisgICAgICAgIHJldHVybiAodm9pZCopb3V0QnVmWzBdOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKKyAgICB2b2lkICpwKQoreworICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGluQnVmWzBdID0gKHVsb25nKXA7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZSRUVQQUdFMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICBOVUxMLCAwLCAmY291bnQsIE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKKyAgICBpbkJ1ZlsxXSA9IGxlbjsKKyAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0xPQ0tEQVRBUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQorICAgICAgICByZXR1cm4gb3V0QnVmWzBdOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGluQnVmWzBdID0gKHVsb25nKXA7CisgICAgaW5CdWZbMV0gPSBsZW47CisgICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9VTkxPQ0tEQVRBUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCisgICAgICAgICAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQorICAgICAgICByZXR1cm4gb3V0QnVmWzBdOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKK3sKKyAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCisgICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLworICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KKworICAgIGluQnVmWzBdID0gKHVsb25nKXA7CisgICAgaW5CdWZbMV0gPSBsZW47CisgICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9MT0NLQ09ERVBBR0VTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIG91dEJ1ZlswXTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitVbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQoreworICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KKyAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCisgICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLworCisgICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKKyAgICBpbkJ1ZlsxXSA9IGxlbjsKKyAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX1VOTE9DS0NPREVQQUdFUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKKyAgICAgICAgICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCisgICAgICAgIHJldHVybiBvdXRCdWZbMF07CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCisgICAgaW50IGJhbmspCit7CisgICAgUk1SRUdTICByZWdzOworICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKKyAgICByZWdzLnguYnggPSAweDAwMDA7CisgICAgcmVncy54LmR4ID0gYmFuazsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCisgICAgaW50IGJhbmspCit7CisgICAgUk1SRUdTICByZWdzOworICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKKyAgICByZWdzLnguYnggPSAweDAwMDA7CisgICAgcmVncy54LmR4ID0gYmFuazsKKyAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKKyAgICByZWdzLnguYXggPSAweDRGMDU7CisgICAgcmVncy54LmJ4ID0gMHgwMDAxOworICAgIHJlZ3MueC5keCA9IGJhbms7CisgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKKyAgICBpbnQgeCwKKyAgICBpbnQgeSwKKyAgICBpbnQgd2FpdFZSVCkKK3sKKyAgICBSTVJFR1MgIHJlZ3M7CisgICAgcmVncy54LmF4ID0gMHg0RjA3OworICAgIHJlZ3MueC5ieCA9IHdhaXRWUlQ7CisgICAgcmVncy54LmN4ID0geDsKKyAgICByZWdzLnguZHggPSB5OworICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0VuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBtZW1vcnkgcmVnaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKKyAgICB1bG9uZyBiYXNlLAorICAgIHVsb25nIGxlbmd0aCwKKyAgICB1aW50IHR5cGUpCit7CisgICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLworICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICBpZiAoIWluaXRlZCkKKyAgICAgICAgUE1faW5pdCgpOworICAgIGluQnVmWzBdID0gYmFzZTsKKyAgICBpbkJ1ZlsxXSA9IGxlbmd0aDsKKyAgICBpbkJ1ZlsyXSA9IHR5cGU7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9FTkFCTEVMRkJDT01CMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAorICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIG91dEJ1ZlswXTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorR2V0IHRoZSBwYWdlIGRpcmVjdG9yeSBiYXNlIHJlZ2lzdGVyIHZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgUE1BUEkgX1BNX2dldFBEQih2b2lkKQoreworICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KKyAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCisKKyAgICBDSEVDS19GT1JfUE1IRUxQKCk7CisgICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFBEQjMyLCBOVUxMLCAwLAorICAgICAgICAgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIG91dEJ1ZlswXTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGbHVzaCB0aGUgdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCit7CisgICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOworICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZMVVNIVExCMzIsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0V4ZWN1dGUgdGhlIFBPU1Qgb24gdGhlIHNlY29uZGFyeSBCSU9TIGZvciBhIGNvbnRyb2xsZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKKyAgICB1c2hvcnQgYXhWYWwsCisgICAgdWxvbmcgQklPU1BoeXNBZGRyLAorICAgIHZvaWQgKm1hcHBlZEJJT1MsCisgICAgdWxvbmcgQklPU0xlbikKK3sKKyAgICAvKiBUaGlzIGlzIG5ldmVyIGRvbmUgYnkgV2luMzIgcHJvZ3JhbXMsIGJ1dCByYXRoZXIgZG9uZSBieSB0aGUgVnhECisgICAgICogd2hlbiB0aGUgc3lzdGVtIGJvb3RzLgorICAgICAqLworICAgICh2b2lkKWF4VmFsOworICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKKyAgICAodm9pZCltYXBwZWRCSU9TOworICAgICh2b2lkKUJJT1NMZW47CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0xvYWQgYW4gT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcnkgb3IgRExMLiBJZiB0aGUgT1MgZG9lcyBub3Qgc3VwcG9ydAorc2hhcmVkIGxpYnJhcmllcywgc2ltcGx5IHJldHVybiBOVUxMLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKKyAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCit7CisgICAgcmV0dXJuIChQTV9NT0RVTEUpTG9hZExpYnJhcnkoc3pETExOYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitHZXQgdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBwcm9jZWR1cmUgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKKyAgICBQTV9NT0RVTEUgaE1vZHVsZSwKKyAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQoreworICAgIHJldHVybiAodm9pZCopR2V0UHJvY0FkZHJlc3MoKEhJTlNUQU5DRSloTW9kdWxlLHN6UHJvY05hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1VubG9hZCBhIHNoYXJlZCBsaWJyYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCisgICAgUE1fTU9EVUxFIGhNb2R1bGUpCit7CisgICAgRnJlZUxpYnJhcnkoKEhJTlNUQU5DRSloTW9kdWxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCisgICAgV0lOMzJfRklORF9EQVRBICpibGspCit7CisgICAgdWxvbmcgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOworCisgICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7CisgICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKKyAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKKyAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOworICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKKyAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfSElEREVOKQorICAgICAgICBmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOworICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9TWVNURU0pCisgICAgICAgIGZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07CisgICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+bkZpbGVTaXplTG93OworICAgIGZpbmREYXRhLT5zaXplSGkgPSBibGstPm5GaWxlU2l6ZUhpZ2g7CisgICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPmNGaWxlTmFtZSxQTV9NQVhfUEFUSCk7CisgICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgV0lOMzJfRklORF9EQVRBIGJsazsKKyAgICBIQU5ETEUgICAgICAgICAgaGZpbGU7CisKKyAgICBpZiAoKGhmaWxlID0gRmluZEZpcnN0RmlsZShmaWxlbmFtZSwmYmxrKSkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOworICAgICAgICByZXR1cm4gKHZvaWQqKWhmaWxlOworICAgICAgICB9CisgICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAorICAgIHZvaWQgKmhhbmRsZSwKKyAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCit7CisgICAgV0lOMzJfRklORF9EQVRBIGJsazsKKworICAgIGlmIChGaW5kTmV4dEZpbGUoKEhBTkRMRSloYW5kbGUsJmJsaykpIHsKKyAgICAgICAgY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIEZpbmRDbG9zZSgoSEFORExFKWhhbmRsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcworZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKK3RoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQorbnVtYmVyaW5nIGlzOgorCisgICAgMSAgIC0gRHJpdmUgQToKKyAgICAyICAgLSBEcml2ZSBCOgorICAgIDMgICAtIERyaXZlIEM6CisgICAgZXRjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAorICAgIGNoYXIgZHJpdmUpCit7CisgICAgY2hhciAgICBidWZbNV07CisgICAgaW50ICAgICB0eXBlOworCisgICAgc3ByaW50ZihidWYsIiVjOlxcIiwgZHJpdmUpOworICAgIHJldHVybiAoKHR5cGUgPSBHZXREcml2ZVR5cGUoYnVmKSkgIT0gMCAmJiB0eXBlICE9IDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCitVbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKK29mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9nZXRkY3dkKAorICAgIGludCBkcml2ZSwKKyAgICBjaGFyICpkaXIsCisgICAgaW50IGxlbikKK3sKKyAgICAvLyBOVCBzdG9yZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZvciBkcml2ZSBOIGluIHRoZSBtYWdpYyBlbnZpcm9ubWVudAorICAgIC8vIHZhcmlhYmxlID1OOiBzbyB3ZSBzaW1wbHkgbG9vayBmb3IgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICBjaGFyIGVudm5hbWVbNF07CisKKyAgICBlbnZuYW1lWzBdID0gJz0nOworICAgIGVudm5hbWVbMV0gPSBkcml2ZSAtIDEgKyAnQSc7CisgICAgZW52bmFtZVsyXSA9ICc6JzsKKyAgICBlbnZuYW1lWzNdID0gJ1wwJzsKKyAgICBpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZShlbnZuYW1lLGRpcixsZW4pID09IDApIHsKKyAgICAgICAgLy8gVGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIHRoZSBkcml2ZSBoYXMgbm90IGJlZW4gc2V0IHlldCwgc28KKyAgICAgICAgLy8gc2ltcGx5IHNldCBpdCB0byB0aGUgcm9vdC4KKyAgICAgICAgZGlyWzBdID0gZW52bmFtZVsxXTsKKyAgICAgICAgZGlyWzFdID0gJzonOworICAgICAgICBkaXJbMl0gPSAnXFwnOworICAgICAgICBkaXJbM10gPSAnXDAnOworICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKGVudm5hbWUsZGlyKTsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICB1aW50IGF0dHJpYikKK3sKKyAgICBEV09SRCBhdHRyID0gMDsKKworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQorICAgICAgICBhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKKyAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCisgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOworICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKKyAgICAgICAgYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07CisgICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRFdPUkQgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMoZmlsZW5hbWUpOworICAgIHVpbnQgICAgYXR0cmliID0gMDsKKworICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCisgICAgICAgIGF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOworICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfQVJDSElWRSkKKyAgICAgICAgYXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKKyAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0hJRERFTikKKyAgICAgICAgYXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOworICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfU1lTVEVNKQorICAgICAgICBhdHRyaWIgfD0gUE1fRklMRV9TWVNURU07CisgICAgcmV0dXJuIGF0dHJpYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fbWtkaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIENyZWF0ZURpcmVjdG9yeShmaWxlbmFtZSxOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaWJvb2wgUE1BUEkgUE1fcm1kaXIoCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIFJlbW92ZURpcmVjdG9yeShmaWxlbmFtZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBpYm9vbCBnbVRpbWUsCisgICAgUE1fdGltZSAqdGltZSkKK3sKKyAgICBIRklMRSAgICAgICBmOworICAgIE9GU1RSVUNUICAgIG9mOworICAgIEZJTEVUSU1FICAgIHV0Y1RpbWUsbG9jYWxUaW1lOworICAgIFNZU1RFTVRJTUUgIHN5c1RpbWU7CisgICAgaWJvb2wgICAgICAgc3RhdHVzID0gZmFsc2U7CisKKyAgICBvZi5jQnl0ZXMgPSBzaXplb2Yob2YpOworICAgIGlmICgoZiA9IE9wZW5GaWxlKGZpbGVuYW1lLCZvZixPRl9SRUFEKSkgPT0gSEZJTEVfRVJST1IpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUdldEZpbGVUaW1lKChIQU5ETEUpZixOVUxMLE5VTEwsJnV0Y1RpbWUpKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgaWYgKCFnbVRpbWUpIHsKKyAgICAgICAgaWYgKCFGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmdXRjVGltZSwmbG9jYWxUaW1lKSkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgbG9jYWxUaW1lID0gdXRjVGltZTsKKyAgICBpZiAoIUZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZsb2NhbFRpbWUsJnN5c1RpbWUpKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgdGltZS0+eWVhciA9IHN5c1RpbWUud1llYXI7CisgICAgdGltZS0+bW9uID0gc3lzVGltZS53TW9udGgtMTsKKyAgICB0aW1lLT5kYXkgPSBzeXNUaW1lLndZZWFyOworICAgIHRpbWUtPmhvdXIgPSBzeXNUaW1lLndIb3VyOworICAgIHRpbWUtPm1pbiA9IHN5c1RpbWUud01pbnV0ZTsKKyAgICB0aW1lLT5zZWMgPSBzeXNUaW1lLndTZWNvbmQ7CisgICAgc3RhdHVzID0gdHJ1ZTsKKworRXhpdDoKKyAgICBDbG9zZUhhbmRsZSgoSEFORExFKWYpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICBpYm9vbCBnbVRpbWUsCisgICAgUE1fdGltZSAqdGltZSkKK3sKKyAgICBIRklMRSAgICAgICBmOworICAgIE9GU1RSVUNUICAgIG9mOworICAgIEZJTEVUSU1FICAgIHV0Y1RpbWUsbG9jYWxUaW1lOworICAgIFNZU1RFTVRJTUUgIHN5c1RpbWU7CisgICAgaWJvb2wgICAgICAgc3RhdHVzID0gZmFsc2U7CisKKyAgICBvZi5jQnl0ZXMgPSBzaXplb2Yob2YpOworICAgIGlmICgoZiA9IE9wZW5GaWxlKGZpbGVuYW1lLCZvZixPRl9XUklURSkpID09IEhGSUxFX0VSUk9SKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3lzVGltZS53WWVhciA9IHRpbWUtPnllYXI7CisgICAgc3lzVGltZS53TW9udGggPSB0aW1lLT5tb24rMTsKKyAgICBzeXNUaW1lLndZZWFyID0gdGltZS0+ZGF5OworICAgIHN5c1RpbWUud0hvdXIgPSB0aW1lLT5ob3VyOworICAgIHN5c1RpbWUud01pbnV0ZSA9IHRpbWUtPm1pbjsKKyAgICBzeXNUaW1lLndTZWNvbmQgPSB0aW1lLT5zZWM7CisgICAgaWYgKCFTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3lzVGltZSwmbG9jYWxUaW1lKSkKKyAgICAgICAgZ290byBFeGl0OworICAgIGlmICghZ21UaW1lKSB7CisgICAgICAgIGlmICghTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmxvY2FsVGltZSwmdXRjVGltZSkpCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHV0Y1RpbWUgPSBsb2NhbFRpbWU7CisgICAgaWYgKCFTZXRGaWxlVGltZSgoSEFORExFKWYsTlVMTCxOVUxMLCZ1dGNUaW1lKSkKKyAgICAgICAgZ290byBFeGl0OworICAgIHN0YXR1cyA9IHRydWU7CisKK0V4aXQ6CisgICAgQ2xvc2VIYW5kbGUoKEhBTkRMRSlmKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvdmZsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ5MWNkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvdmZsYXQuYwpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwbWFwaS5oIgorCitpYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgKiBQTUFQSSBWRl9pbml0KAorICAgIHVsb25nIGJhc2VBZGRyLAorICAgIGludCBiYW5rU2l6ZSwKKyAgICBpbnQgY29kZUxlbiwKKyAgICB2b2lkICpiYW5rRnVuYykKK3sKKyAgICAodm9pZCliYXNlQWRkcjsKKyAgICAodm9pZCliYW5rU2l6ZTsKKyAgICAodm9pZCljb2RlTGVuOworICAgICh2b2lkKWJhbmtGdW5jOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvenRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OTI5YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3p0aW1lci5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBXaW4zMgorKgorKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50RnJlcTsKK3N0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7CitzdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX1pUaW1lckluaXQodm9pZCkKK3sKKyNpZmRlZiAgTk9fQVNTRU1CTEVSCisgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOworI2Vsc2UKKyAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQorICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5zdGFydCk7CisgICAgZWxzZQorICAgICAgICB0bS0+c3RhcnQubG93ID0gdGltZUdldFRpbWUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7CisKKyAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgeworICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtTGFwKTsKKyAgICAgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKKyAgICAgICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRtTGFwLmxvdyA9IHRpbWVHZXRUaW1lKCk7CisgICAgICAgIHJldHVybiAodG1MYXAubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPmVuZCk7CisgICAgZWxzZQorICAgICAgICB0bS0+ZW5kLmxvdyA9IHRpbWVHZXRUaW1lKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisgICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OworCisgICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKKyAgICAgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOworICAgICAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1JlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKK3sgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCit3aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KK2FjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKK3Bhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoreyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiOTM4MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9ldmVudC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBVbml4IC8gWDExCisqCisqIERlc2NyaXB0aW9uOiAgWDExIGV2ZW50IHF1ZXVlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTUdMLgorKiAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYm90aCBmb3Igd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gKERHQSkgbW9kZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLworc3RhdGljIGludCAgICAgICAgICByYW5nZVgscmFuZ2VZOyAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KKworc3RhdGljIERpc3BsYXkgICpfRVZUX2RweTsKK3N0YXRpYyBXaW5kb3cgICAgX0VWVF93aW47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGtleWNvZGU7CisgIGludCBzY2FuY29kZTsKK30geGtleW1hcDsKKworeGtleW1hcCB4a2V5bWFwc1tdID0geworICB7IDksIEtCX2VzY30sCisgIHsyNCwgS0JfUX0sCisgIHsyNSwgS0JfV30sCisgIHsyNiwgS0JfRX0sCisgIHsyNywgS0JfUn0sCisgIHsyOCwgS0JfVH0sCisgIHsyOSwgS0JfWX0sCisgIHszMCwgS0JfVX0sCisgIHszMSwgS0JfSX0sCisgIHszMiwgS0JfT30sCisgIHszMywgS0JfUH0sCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCisjZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKKyNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKKworUkVNQVJLUzoKK1RoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCit0aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQorc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KK3RoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KK2V2ZW50cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCit7CisgIHN0YXRpYyB1bnNpZ25lZCBzdGFydHRpbWUgPSAwOworICBzdHJ1Y3QgdGltZXZhbCB0OworICAKKyAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKKyAgaWYgKHN0YXJ0dGltZSA9PSAwKQorICAgIHN0YXJ0dGltZSA9IHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCk7CisgIHJldHVybiAoKHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCkpIC0gc3RhcnR0aW1lKTsKK30KKworc3RhdGljIGludCBnZXRTY2FuY29kZShpbnQga2V5Y29kZSkKK3sKKyAgcmV0dXJuIGtleWNvZGUtODsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lc3NhZ2UgcXVldWUgaW50byBvdXIgZXZlbnQgcXVldWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFgxMV9DT1JFCitzdGF0aWMgdm9pZCBfRVZUX3B1bXBYMTFNZXNzYWdlcyh2b2lkKQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCisjZW5kaWYKK3sKKyAgLy8gVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UKKyAgLy8gICAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0CisgIC8vICAgICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLgorICBldmVudF90IGV2dDsKKyAgWEV2ZW50ICBldjsKKyAgc3RhdGljIGludCBvbGRfbXggPSAwLCBvbGRfbXkgPSAwLCBidXRzID0gMCwgYzsKKyAgY2hhciBidWZbMl07CisgIAorICB3aGlsZSAoWFBlbmRpbmcoX0VWVF9kcHkpICYmIFhOZXh0RXZlbnQoX0VWVF9kcHksJmV2KSkgeworICAgIGV2dC53aGVuID0gX01HTF9nZXRUaWNrcygpOworCisgICAgc3dpdGNoKGV2LnR5cGUpeworICAgIGNhc2UgS2V5UHJlc3M6CisgICAgICBjID0gZ2V0U2NhbmNvZGUoZXYueGtleS5rZXljb2RlKTsKKyAgICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047CisgICAgICBldnQubWVzc2FnZSA9IGMgPDwgODsKKyAgICAgIFhMb29rdXBTdHJpbmcoJmV2LnhrZXksIGJ1ZiwgMiwgTlVMTCwgTlVMTCk7CisgICAgICBldnQubWVzc2FnZSB8PSBidWZbMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIEtleVJlbGVhc2U6CisgICAgICBjID0gZ2V0U2NhbmNvZGUoZXYueGtleS5rZXljb2RlKTsKKyAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOworICAgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXTsKKyAgICAgIGlmKGNvdW50IDwgRVZFTlRRU0laRSkKKyAgICAgICAgYWRkRXZlbnQoJmV2dCk7CisgICAgICBrZXlVcE1zZ1tjXSA9IDA7CisgICAgICByZXBlYXRLZXlbY10gPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25QcmVzczoKKyAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKKyAgICAgIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDEpeworICAgICAgICBidXRzIHw9IEVWVF9MRUZUQlVUOworICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisgICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAyKXsKKyAgICAgICAgYnV0cyB8PSBFVlRfTUlERExFQlVUOworICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKKyAgICAgIH1lbHNlIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDMpeworICAgICAgICBidXRzIHw9IEVWVF9SSUdIVEJVVDsKKyAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKKyAgICAgIH0KKyAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnMgfCBidXRzOworICAgICAgCisgICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRvblJlbGVhc2U6CisgICAgICBldnQud2hhdCA9IEVWVF9NT1VTRVVQOworICAgICAgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMSl7CisgICAgICAgIGJ1dHMgJj0gfkVWVF9MRUZUQlVUOworICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7CisgICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAyKXsKKyAgICAgICAgYnV0cyAmPSB+RVZUX01JRERMRUJVVDsKKyAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7CisgICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAzKXsKKyAgICAgICAgYnV0cyAmPSB+RVZUX1JJR0hUQlVUOworICAgICAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOworICAgICAgfQorICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVycyB8IGJ1dHM7CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTW90aW9uTm90aWZ5OgorICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOworICAgICAgZXZ0LndoZXJlX3ggPSBldi54bW90aW9uLng7CisgICAgICBldnQud2hlcmVfeSA9IGV2Lnhtb3Rpb24ueTsKKyAgICAgIGV2dC5yZWxhdGl2ZV94ID0gZXZ0LndoZXJlX3ggLSBvbGRfbXg7CisgICAgICBldnQucmVsYXRpdmVfeSA9IGV2dC53aGVyZV95IC0gb2xkX215OworICAgICAgb2xkX214ID0gZXZ0LndoZXJlX3g7CisgICAgICBvbGRfbXkgPSBldnQud2hlcmVfeTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKQorICAgICAgYWRkRXZlbnQoJmV2dCk7CisgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKK2tleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgorY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCitDdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKK2J1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCit0byB0aGUgcmF3IGZvcm1hdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9FVlRfYWJvcnQoKQoreworICAgIEVWVF9leGl0KCk7CisgICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKKworUkVNQVJLUzoKK0luaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKK3RvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKK3RoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KKworV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgorZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFgxMV9DT1JFCit2b2lkIEVWVEFQSSBFVlRfaW5pdFgxMSgKKyNlbHNlCit2b2lkIEVWVEFQSSBFVlRfaW5pdCgKKyNlbmRpZgorICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCit7CisgIGludCByZXN1bHQsIGksaixrOworICBYRGV2aWNlSW5mb1B0ciAgICBsaXN0LHNsaXN0OworCisgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCisgIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7CisgIGluaXRFdmVudFF1ZXVlKCk7CisgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOworICAKKworICAvKiBxdWVyeSBzZXJ2ZXIgZm9yIGlucHV0IGV4dGVuc2lvbnMgKi8KKyAgcmVzdWx0ID1YUXVlcnlFeHRlbnNpb24oX0VWVF9kcHksIlhJbnB1dEV4dGVuc2lvbiIsJmksJmosJmspOworICBpZighcmVzdWx0KSB7CisgICAgZnByaW50ZihzdGRlcnIsIllvdXIgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBYSW5wdXQgRXh0ZW5zaW9uc1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsIlgxMSBKb3lzdGljayBkaXNhYmxlZFxuIik7CisgIH0KKyAgbGlzdCA9IFhMaXN0SW5wdXREZXZpY2VzKF9FVlRfZHB5LCZyZXN1bHQpOworICBpZiAoIWxpc3QpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiTm8gZXh0ZW5kZWQgaW5wdXQgZGV2aWNlcyBmb3VuZCAhIVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIlgxMSBKb3lzdGljayBkaXNhYmxlZFxuIik7CisgIH0KKworCisgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KKyAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOworICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKKyAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTCitDaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQorc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcworbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCisgICAgaW50IHhSZXMsCisgICAgaW50IHlSZXMpCit7CisgICAgcmFuZ2VYID0geFJlczsKKyAgICByYW5nZVkgPSB5UmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0luaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCitjYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKK2FuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9yZXN1bWUodm9pZCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1N1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KK2RlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFVlRfc3VzcGVuZCh2b2lkKQoreworICAgIC8vIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUworRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRVZUX2V4aXQodm9pZCkKK3sKKyAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLworICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKworICAgIC8vIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBjbGVhbnVwIGluIGhlcmUKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1MKK1NldHMgdGhlIGN1cnJlbnQgWDExIGRpc3BsYXkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEVWVF9zZXRYMTFEaXNwbGF5KERpc3BsYXkgKmRweSwgV2luZG93IHdpbikKK3sKKyAgX0VWVF9kcHkgPSBkcHk7CisgIF9FVlRfd2luID0gd2luOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvb3NoZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ3NDUxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL29zaGRyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKKyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAorKgorKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQmVPUworKgorKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIFVTRV9PU19KT1lTVElDSworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWElucHV0Lmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3pfc2FtcGxlcy52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96X3NhbXBsZXMudnBqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmM4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96X3NhbXBsZXMudnBqCkBAIC0wLDAgKzEsNzQgQEAKK1tTY2lUZWNoXQ0KK2NvbXBpbGVyPXdjMTAtIA0KK3RhcmdldG9zPWQzMiANCitbQ09NUElMRVJdDQordmVyc2lvbj01LjBiDQorTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KK2FjdGl2ZWNvbmZpZz0sZ2V0Y2guZXhlDQorRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbg0KK0ZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuDQorRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgDQorRklMVEVSQVBQQ09NTUFORD1cbg0KK3Zjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQordmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQorY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCittYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSAlYg0KK3JlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSAtdSAlYg0KK2RlYnVnPWNvbmN1cnxjYXB0dXJlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpEZWJ1ZzomRGVidWcsd2RuICViDQorZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KK3VzZXIxPWhpZGV8bm9jaGFuZ2VkaXJ8OlVzZXIgMTpVc2VyIDEsDQordXNlcjI9aGlkZXxub2NoYW5nZWRpcnw6VXNlciAyOlVzZXIgMiwNCit1c2VydG9vbF9idWlsZF9hbGw9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZW5vbmV8OkJ1aWxkIEFsbDpCdWlsZCBBbGwsZG1ha2UgYWxsDQordXNlcnRvb2xfcmVidWlsZF9hbGw9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZW5vbmV8OlJlYnVpbGQgQWxsOlJlYnVpbGQgQWxsLGRtYWtlIC11IGFsbA0KK3VzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxzYXZlbm9uZXw6Q2xlYW4gRGlyZWN0b3J5OiZDbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCit3b3JraW5nZGlyPS4NCitpbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQorcmVmZmlsZT0NCitbRklMRVNdDQordGVzdHNcYWx0YnJrLmMNCit0ZXN0c1xhbHRjcml0LmMNCit0ZXN0c1xiaW9zcHRyLmMNCit0ZXN0c1xibG9jay5jDQordGVzdHNcYnJrLmMNCit0ZXN0c1xjYWxscmVhbC5jDQordGVzdHNcY2hlY2tzLmMNCit0ZXN0c1xjcHUuYw0KK3Rlc3RzXGNyaXRpY2FsLmMNCit0ZXN0c1xnZXRjaC5jDQordGVzdHNcaXN2ZXNhLmMNCit0ZXN0c1xrZXkuYw0KK3Rlc3RzXGtleTE1LmMNCit0ZXN0c1xtZW10ZXN0LmMNCit0ZXN0c1xtb3VzZS5jDQordGVzdHNccnRjLmMNCit0ZXN0c1xzaG93cGNpLmMNCit0ZXN0c1x0aWNrLmMNCit0ZXN0c1x0aW1lcmMuYw0KK3Rlc3RzXHRpbWVyY3BwLmNwcA0KK3Rlc3RzXHVzd2MuYw0KK3Rlc3RzXHZmdGVzdC5jDQordGVzdHNcdmlkZW8uYw0KK1tBU1NPQ0lBVElPTl0NCitbQ09ORklHVVJBVElPTlNdDQorY29uZmlnPSxhbHRicmsuZXhlDQorY29uZmlnPSxhbHRjcml0LmV4ZQ0KK2NvbmZpZz0sYmlvc3B0ci5leGUNCitjb25maWc9LGJsb2NrLmV4ZQ0KK2NvbmZpZz0sYnJrLmV4ZQ0KK2NvbmZpZz0sY2FsbHJlYWwuZXhlDQorY29uZmlnPSxjcHUuZXhlDQorY29uZmlnPSxjcml0aWNhbC5leGUNCitjb25maWc9LGdldGNoLmV4ZQ0KK2NvbmZpZz0saXN2ZXNhLmV4ZQ0KK2NvbmZpZz0sa2V5LmV4ZQ0KK2NvbmZpZz0sa2V5MTUuZXhlDQorY29uZmlnPSxtZW10ZXN0LmV4ZQ0KK2NvbmZpZz0sbW91c2UuZXhlDQorY29uZmlnPSxydGMuZXhlDQorY29uZmlnPSxzaG93cGNpLmV4ZQ0KK2NvbmZpZz0sdGljay5leGUNCitjb25maWc9LHRpbWVyYy5leGUNCitjb25maWc9LHRpbWVyY3BwLmV4ZQ0KK2NvbmZpZz0sdXN3Yy5leGUNCitjb25maWc9LHZmdGVzdC5leGUNCitjb25maWc9LHZpZGVvLmV4ZQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0venRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwODFlOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3p0aW1lci5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYworKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0CisqCisqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBvbiBlYWNoIE9TLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInp0aW1lci5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAib3NoZHIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIExaVGltZXJPYmplY3QgICAgTFpUaW1lcjsKK3N0YXRpYyB1bG9uZyAgICAgICAgICAgIHN0YXJ0LGZpbmlzaDsKKyNpZmRlZiAgX19JTlRFTF9fCitzdGF0aWMgbG9uZyAgICAgICAgICAgICBjcHVTcGVlZCA9IC0xOworc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDID0gZmFsc2U7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXh0ZXJuYWwgSW50ZWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLworI2lmZGVmICBfX0lOVEVMX18KKy8qIHtzZWNyZXR9ICovCit2b2lkICBfQVNNQVBJIF9DUFVfcmVhZFRpbWVTdGFtcChDUFVfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKKy8qIHtzZWNyZXR9ICovCit1bG9uZyBfQVNNQVBJIF9DUFVfZGlmZlRpbWU2NChDUFVfbGFyZ2VJbnRlZ2VyICp0MSxDUFVfbGFyZ2VJbnRlZ2VyICp0MixDUFVfbGFyZ2VJbnRlZ2VyICp0KTsKKy8qIHtzZWNyZXR9ICovCit1bG9uZyBfQVNNQVBJIF9DUFVfY2FsY01pY3JvU2VjKENQVV9sYXJnZUludGVnZXIgKmNvdW50LHVsb25nIGZyZXEpOworI2VuZGlmCisKKyNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCisjaW5jbHVkZSAic214L3p0aW1lci5jIgorI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKKyNpbmNsdWRlICJydHRhcmdldC96dGltZXIuYyIKKyNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKKyNpbmNsdWRlICJkb3MvenRpbWVyLmMiCisjZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKKyNpbmNsdWRlICJudGRydi96dGltZXIuYyIKKyNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQorI2luY2x1ZGUgInZ4ZC96dGltZXIuYyIKKyNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQorI2luY2x1ZGUgIndpbjMyL3p0aW1lci5jIgorI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQorI2luY2x1ZGUgInZkZC96dGltZXIuYyIKKyNlbGlmICAgZGVmaW5lZChfX09TMl9fKQorI2luY2x1ZGUgIm9zMi96dGltZXIuYyIKKyNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pCisjaW5jbHVkZSAibGludXgvenRpbWVyLmMiCisjZWxpZiAgIGRlZmluZWQoX19RTlhfXykKKyNpbmNsdWRlICJxbngvenRpbWVyLmMiCisjZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCisjaW5jbHVkZSAiYmVvcy96dGltZXIuYyIKKyNlbHNlCisjZXJyb3IgIFRpbWVyIGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitJbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnkgKGV4dGVuZGVkKQorCitQQVJBTUVURVJTOgorYWNjdXJhdGUgICAgLSBUcnVlIG9mIHRoZSBzcGVlZCBzaG91bGQgYmUgbWVhc3VyZWQgYWNjdXJhdGVseQorCitIRUFERVI6Cit6dGltZXIuaAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnksIGFuZCAvbXVzdC8gYmUgY2FsbGVkIGJlZm9yZQorYW55IG9mIHRoZSByZW1haW5pbmcgWmVuIFRpbWVyIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBjYWxsZWQuIFRoZSBhY2N1cmF0ZQorcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyBzaG91bGQgYmUKK3VzZWQgb3Igbm90LiBJZiBoaWdoIGFjY3VyYWN5IGlzIG5lZWRlZCwgbW9yZSB0aW1lIGlzIHNwZW50IHByb2ZpbGluZyB0aGUKK2FjdHVhbCBzcGVlZCBvZiB0aGUgQ1BVIHNvIHRoYXQgd2UgY2FuIG9idGFpbiBoaWdobHkgYWNjdXJhdGUgdGltaW5nCityZXN1bHRzLCBidXQgdGhlIHRpbWUgc3BlbnQgaW4gdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUgd2lsbCBiZQorc2lnbmlmaWNhbnRseSBsb25nZXIgKG9uIHRoZSBvcmRlciBvZiA1IHNlY29uZHMpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWkFQSSBaVGltZXJJbml0RXh0KAorICAgIGlib29sIGFjY3VyYXRlKQoreworICAgIGlmIChjcHVTcGVlZCA9PSAtMSkgeworICAgICAgICBfX1pUaW1lckluaXQoKTsKKyNpZmRlZiAgX19JTlRFTF9fCisgICAgICAgIGNwdVNwZWVkID0gQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IWihhY2N1cmF0ZSk7CisgICAgICAgIGhhdmVSRFRTQyA9IENQVV9oYXZlUkRUU0MoKSAmJiAoY3B1U3BlZWQgPiAwKTsKKyNlbmRpZgorICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK0luaXRpYWxpemVzIHRoZSBaZW4gVGltZXIgbGlicmFyeS4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFplbiBUaW1lciBsaWJyYXJ5LCBhbmQgL211c3QvIGJlIGNhbGxlZCBiZWZvcmUKK2FueSBvZiB0aGUgcmVtYWluaW5nIFplbiBUaW1lciBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWkFQSSBaVGltZXJJbml0KHZvaWQpCit7CisgICAgWlRpbWVySW5pdEV4dChmYWxzZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1N0YXJ0cyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgorCitIRUFERVI6Cit6dGltZXIuaAorCitQQVJBTUVURVJTOgordG0gIC0gVGltZXIgb2JqZWN0IHRvIHN0YXJ0IHRpbWluZyB3aXRoCisKK1JFTUFSS1M6CitTdGFydHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4gT25jZSB5b3UgaGF2ZSBzdGFydGVkIHRoZSB0aW1lciwKK3lvdSBjYW4gc3RvcCBpdCB3aXRoIExaVGltZXJPZmYgb3IgeW91IGNhbiBsYXRjaCB0aGUgY3VycmVudCBjb3VudCB3aXRoCitMWlRpbWVyTGFwLgorCitUaGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIHVzZXMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGhpZ2ggcHJlY2lzaW9uIHRpbWluZworbWVjaGFuaXNtcyB0byBvYnRhaW4gbWljcm9zZWNvbmQgYWNjdXJhdGUgdGltaW5ncyByZXN1bHRzIHdoZW5ldmVyIHBvc3NpYmxlLgorVGhlIGZvbGxvd2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyBhcmUgdXNlZCBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZworc3lzdGVtLCBydW50aW1lIGVudmlyb25tZW50IGFuZCBDUFUgb24gdGhlIHRhcmdldCBtYWNoaW5lLiBJZiB0aGUgdGFyZ2V0CitzeXN0ZW0gaGFzIGEgUGVudGl1bSBDUFUgaW5zdGFsbGVkIHdoaWNoIHN1cHBvcnRzIHRoZSBSZWFkIFRpbWUgU3RhbXAKK0NvdW50ZXIgaW5zdHJ1Y3Rpb24gKFJEVFNDKSwgdGhlIFplbiBUaW1lciBsaWJyYXJ5IHdpbGwgdXNlIHRoaXMgdG8KK29idGFpbiB0aGUgbWF4aW11bSB0aW1pbmcgcHJlY2lzaW9uIGF2YWlsYWJsZS4KKworVW5kZXIgMzItYml0IFdpbmRvd3MsIGlmIHRoZSBQZW50aXVtIFJEVFNDIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHdlCitmaXJzdCB0cnkgdG8gdXNlIHRoZSBXaW4zMiBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBBUEksIGFuZCBpZiB0aGF0IGlzIG5vdAorYXZhaWxhYmxlIHdlIGZhbGwgYmFjayBvbiB0aGUgdGltZUdldFRpbWUgQVBJIHdoaWNoIGlzIGFsd2F5cyBzdXBwb3J0ZWQuCisKK1VuZGVyIDMyLWJpdCBET1MsIGlmIHRoZSBQZW50aXVtIFJEVFNDIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHdlCit0aGVuIGRvIGFsbCB0aW1pbmcgdXNpbmcgdGhlIG9sZCBzdHlsZSA4MjUzIHRpbWVyIGNoaXAuIFRoZSA4MjUzIHRpbWVyCityb3V0aW5lcyBwcm92aWRlIGhpZ2hseSBhY2N1cmF0ZSB0aW1pbmdzIHJlc3VsdHMgaW4gcHVyZSBET1MgbW9kZSwgaG93ZXZlcgoraW4gYSBET1MgYm94IHVuZGVyIFdpbmRvd3Mgb3Igb3RoZXIgT3BlcmF0aW5nIFN5c3RlbXMgdGhlIHZpcnR1YWxpemF0aW9uCitvZiB0aGUgdGltZXIgY2FuIHByb2R1Y2UgaW5hY2N1cmF0ZSByZXN1bHRzLgorCitOb3RlOiBCZWNhdXNlIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgc3RvcmVzIHRoZSByZXN1bHRzIGluIGEgMzItYml0CisgICAgICB1bnNpZ25lZCBpbnRlZ2VyLCB5b3UgY2FuIG9ubHkgdGltZSBwZXJpb2RzIG9mIHVwIHRvIDJeMzIgbWljcm9zZWNvbmRzLAorICAgICAgb3IgYWJvdXQgMWhyIDIwbWlucy4gRm9yIHRpbWluZyBsb25nZXIgcGVyaW9kcyB1c2UgdGhlIFVsdHJhIExvbmcKKyAgICAgIFBlcmlvZCBaZW4gVGltZXIuCisKK1NFRSBBTFNPOgorTFpUaW1lck9mZiwgTFpUaW1lckxhcCwgTFpUaW1lckNvdW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBaQVBJIExaVGltZXJPbkV4dCgKKyAgICBMWlRpbWVyT2JqZWN0ICp0bSkKK3sKKyNpZmRlZiAgX19JTlRFTF9fCisgICAgaWYgKGhhdmVSRFRTQykgeworICAgICAgICBfQ1BVX3JlYWRUaW1lU3RhbXAoJnRtLT5zdGFydCk7CisgICAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgX19MWlRpbWVyT24odG0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCBrZWVwcyBpdAorcnVubmluZy4KKworSEVBREVSOgorenRpbWVyLmgKKworUEFSQU1FVEVSUzoKK3RtICAtIFRpbWVyIG9iamVjdCB0byBkbyBsYXAgdGltaW5nIHdpdGgKKworUkVUVVJOUzoKK0NvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgorCitSRU1BUktTOgorUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KK0xaVGltZXJPbiBpbiBtaWNyb3NlY29uZHMuIFRoZSB0aW1lIGNvbnRpbnVlcyB0byBydW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcworY2FsbGVkIHNvIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkuCisKK1NFRSBBTFNPOgorTFpUaW1lck9uLCBMWlRpbWVyT2ZmLCBMWlRpbWVyQ291bnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBaQVBJIExaVGltZXJMYXBFeHQoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisjaWZkZWYgIF9fSU5URUxfXworICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1MYXAsdG1Db3VudDsKKworICAgIGlmIChoYXZlUkRUU0MpIHsKKyAgICAgICAgX0NQVV9yZWFkVGltZVN0YW1wKCZ0bUxhcCk7CisgICAgICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bUxhcCwmdG1Db3VudCk7CisgICAgICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjcHVTcGVlZCk7CisgICAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIF9fTFpUaW1lckxhcCh0bSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1N0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1BBUkFNRVRFUlM6Cit0bSAgLSBUaW1lciBvYmplY3QgdG8gc3RvcCB0aW1pbmcgd2l0aAorCitSRU1BUktTOgorU3RvcHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZyBhbmQgbGF0Y2hlcyB0aGUgY291bnQuIE9uY2UgeW91CitoYXZlIHN0b3BwZWQgdGhlIHRpbWVyIHlvdSBjYW4gcmVhZCB0aGUgY291bnQgd2l0aCBMWlRpbWVyQ291bnQuIElmIHlvdSBuZWVkCitoaWdobHkgYWNjdXJhdGUgdGltaW5nLCB5b3Ugc2hvdWxkIHVzZSB0aGUgb24gYW5kIG9mZiBmdW5jdGlvbnMgcmF0aGVyIHRoYW4KK3RoZSBsYXAgZnVuY3Rpb24gc2luY2UgdGhlIGxhcCBmdW5jdGlvbiBkb2VzIG5vdCBzdWJ0cmFjdCB0aGUgb3ZlcmhlYWQgb2YKK3RoZSBmdW5jdGlvbiBjYWxscyBmcm9tIHRoZSB0aW1lZCBjb3VudC4KKworU0VFIEFMU086CitMWlRpbWVyT24sIExaVGltZXJMYXAsIExaVGltZXJDb3VudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWkFQSSBMWlRpbWVyT2ZmRXh0KAorICAgIExaVGltZXJPYmplY3QgKnRtKQoreworI2lmZGVmICBfX0lOVEVMX18KKyAgICBpZiAoaGF2ZVJEVFNDKSB7CisgICAgICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmdG0tPmVuZCk7CisgICAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgX19MWlRpbWVyT2ZmKHRtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lci4KKworSEVBREVSOgorenRpbWVyLmgKKworUEFSQU1FVEVSUzoKK3RtICAtIFRpbWVyIG9iamVjdCB0byBjb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgd2l0aC4KKworUkVUVVJOUzoKK0NvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgorCitSRU1BUktTOgorUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIGJldHdlZW4gY2FsbHMgdG8KK0xaVGltZXJPbiBhbmQgTFpUaW1lck9mZiBpbiBtaWNyb3NlY29uZHMuCisKK1NFRSBBTFNPOgorTFpUaW1lck9uLCBMWlRpbWVyT2ZmLCBMWlRpbWVyTGFwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgWkFQSSBMWlRpbWVyQ291bnRFeHQoCisgICAgTFpUaW1lck9iamVjdCAqdG0pCit7CisjaWZkZWYgIF9fSU5URUxfXworICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKKworICAgIGlmIChoYXZlUkRUU0MpIHsKKyAgICAgICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOworICAgICAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY3B1U3BlZWQpOworICAgICAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiBfX0xaVGltZXJDb3VudCh0bSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1N0YXJ0cyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgorCitIRUFERVI6Cit6dGltZXIuaAorCitSRU1BUktTOgorT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyT25FeHQgZnVuY3Rpb24gaW5zdGVhZAord2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWkFQSSBMWlRpbWVyT24odm9pZCkKK3sgTFpUaW1lck9uRXh0KCZMWlRpbWVyKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCBrZWVwcyBpdAorcnVubmluZy4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVUVVJOUzoKK0NvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgorCitSRU1BUktTOgorT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyTGFwRXh0IGZ1bmN0aW9uIGluc3RlYWQKK3doaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBaQVBJIExaVGltZXJMYXAodm9pZCkKK3sgcmV0dXJuIExaVGltZXJMYXBFeHQoJkxaVGltZXIpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1N0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFTUFSS1M6CitPYnNvbGV0ZSBmdW5jdGlvbi4gWW91IHNob3VsZCB1c2UgdGhlIExaVGltZXJPZmZFeHQgZnVuY3Rpb24gaW5zdGVhZAord2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWkFQSSBMWlRpbWVyT2ZmKHZvaWQpCit7IExaVGltZXJPZmZFeHQoJkxaVGltZXIpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFVFVSTlM6CitDb3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIG1pY3Jvc2Vjb25kcy4KKworUkVNQVJLUzoKK09ic29sZXRlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgTFpUaW1lckNvdW50RXh0IGZ1bmN0aW9uIGluc3RlYWQKK3doaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBaQVBJIExaVGltZXJDb3VudCh2b2lkKQoreyByZXR1cm4gTFpUaW1lckNvdW50RXh0KCZMWlRpbWVyKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitTdGFydHMgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVNQVJLUzoKK1N0YXJ0cyB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLiBPbmNlIHlvdSBoYXZlIHN0YXJ0ZWQgdGhlCit0aW1lciwgeW91IGNhbiBzdG9wIGl0IHdpdGggVUxaVGltZXJPZmYgb3IgeW91IGNhbiBsYXRjaCB0aGUgY3VycmVudCBjb3VudAord2l0aCBVTFpUaW1lckxhcC4KKworVGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciB1c2VzIHRoZSBhdmFpbGFibGUgb3BlcmF0aW5nIHN5c3RlbSBzZXJ2aWNlcwordG8gb2J0YWluIGFjY3VyYXRlIHRpbWluZ3MgcmVzdWx0cyB3aXRoIGFzIG11Y2ggcHJlY2lzaW9uIGFzIHRoZSBvcGVyYXRpbmcKK3N5c3RlbSBwcm92aWRlcywgYnV0IHdpdGggZW5vdWdoIGdyYW51bGFyaXR5IHRvIHRpbWUgbG9uZ2VyIHBlcmlvZHMgb2YKK3RpbWUgdGhhbiB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLiBOb3RlIHRoYXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVyCit0aWNrcyBpcyBub3QgY29uc3RhbnQgYmV0d2VlbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlCitVTFpUaW1lclJlc29sdXRpb24gZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIHNpbmdsZQordGljayBvZiB0aGUgdGltZXIsIGFuZCB1c2UgdGhpcyB0byBjb252ZXJ0IHRoZSB0aW1lciBjb3VudHMgdG8gc2Vjb25kcy4KKworVW5kZXIgMzItYml0IFdpbmRvd3MsIHdlIHVzZSB0aGUgdGltZUdldFRpbWUgZnVuY3Rpb24gd2hpY2ggcHJvdmlkZXMgYQorcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kICgwLjAwMSBvZiBhIHNlY29uZCkuIEdpdmVuIHRoYXQgdGhlIHRpbWVyCitjb3VudCBpcyByZXR1cm5lZCBhcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgdGhpcyB3ZSBjYW4gdGltZSBpbnRlcnZhbHMKK3RoYXQgYXJlIGEgbWF4aW11bSBvZiAyXjMyIG1pbGxpc2Vjb25kcyBpbiBsZW5ndGggKG9yIGFib3V0IDEsMjAwIGhvdXJzIG9yCis1MCBkYXlzISkuCisKK1VuZGVyIDMyLWJpdCBET1MsIHdlIHVzZSB0aGUgc3lzdGVtIHRpbWVyIHRpY2sgd2hpY2ggcnVucyBhdCAxOC4yIHRpbWVzIHBlcgorc2Vjb25kLiBHaXZlbiB0aGF0IHRoZSB0aW1lciBjb3VudCBpcyByZXR1cm5lZCBhcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwKK3RoaXMgd2UgY2FuIHRpbWUgaW50ZXJ2YWxzIHRoYXQgYXJlIGEgbWF4aW11bSBvZiAyXjMyICogKDEvMTguMikgaW4gbGVuZ3RoCisob3IgYWJvdXQgNjUsNTUwIGhvdXJzIG9yIDI3MzEgZGF5cyEpLgorCitTRUUgQUxTTzoKK1VMWlRpbWVyT2ZmLCBVTFpUaW1lckxhcCwgVUxaVGltZXJDb3VudCwgVUxaRWxhcHNlZFRpbWUsIFVMWlJlYWRUaW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBaQVBJIFVMWlRpbWVyT24odm9pZCkKK3sgc3RhcnQgPSBfX1VMWlJlYWRUaW1lKCk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFU0NSSVBUSU9OOgorUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBhbmQga2VlcHMgaXQKK3J1bm5pbmcuCisKK0hFQURFUjoKK3p0aW1lci5oCisKK1JFVFVSTlM6CitDb3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIHJlc29sdXRpb24gY291bnRzLgorCitSRU1BUktTOgorUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KK1VMWlRpbWVyT24gaW4gbWljcm9zZWNvbmRzLiBUaGUgdGltZSBjb250aW51ZXMgdG8gcnVuIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMKK2NhbGxlZCBzbyB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5LgorCitTRUUgQUxTTzoKK1VMWlRpbWVyT24sIFVMWlRpbWVyT2ZmLCBVTFpUaW1lckNvdW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgWkFQSSBVTFpUaW1lckxhcCh2b2lkKQoreyByZXR1cm4gKF9fVUxaUmVhZFRpbWUoKSAtIHN0YXJ0KTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitTdG9wcyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgorCitIRUFERVI6Cit6dGltZXIuaAorCitSRU1BUktTOgorU3RvcHMgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZyBhbmQgbGF0Y2hlcyB0aGUgY291bnQuIE9uY2UKK3lvdSBoYXZlIHN0b3BwZWQgdGhlIHRpbWVyIHlvdSBjYW4gcmVhZCB0aGUgY291bnQgd2l0aCBVTFpUaW1lckNvdW50LgorCitTRUUgQUxTTzoKK1VMWlRpbWVyT24sIFVMWlRpbWVyTGFwLCBVTFpUaW1lckNvdW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBaQVBJIFVMWlRpbWVyT2ZmKHZvaWQpCit7IGZpbmlzaCA9IF9fVUxaUmVhZFRpbWUoKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgorCitIRUFERVI6Cit6dGltZXIuaAorCitSRVRVUk5TOgorQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiByZXNvbHV0aW9uIGNvdW50cy4KKworUkVNQVJLUzoKK1JldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdGhhdCBoYXMgZWxhcHNlZCBiZXR3ZWVuIGNhbGxzIHRvCitVTFpUaW1lck9uIGFuZCBVTFpUaW1lck9mZiBpbiByZXNvbHV0aW9uIGNvdW50cy4KKworU0VFIEFMU086CitVTFpUaW1lck9uLCBVTFpUaW1lck9mZiwgVUxaVGltZXJMYXAsIFVMWlRpbWVyUmVzb2x1dGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFpBUEkgVUxaVGltZXJDb3VudCh2b2lkKQoreyByZXR1cm4gKGZpbmlzaCAtIHN0YXJ0KTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitSZWFkcyB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lci4KKworSEVBREVSOgorenRpbWVyLmgKKworUkVUVVJOUzoKK0N1cnJlbnQgdGltZXIgdmFsdWUgaW4gcmVzb2x1dGlvbiBjb3VudHMuCisKK1JFTUFSS1M6CitSZWFkcyB0aGUgY3VycmVudCBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYW5kIHJldHVybnMgaXSScyBjdXJyZW50Citjb3VudC4gWW91IGNhbiB1c2UgdGhlIFVMWkVsYXBzZWRUaW1lIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGVsYXBzZWQgdGltZQorYmV0d2VlbiB0d28gdGltZXIgY291bnQgcmVhZGluZ3MuCisKK1NFRSBBTFNPOgorVUxaRWxhcHNlZFRpbWUsIFVMWlRpbWVyUmVzb2x1dGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFpBUEkgVUxaUmVhZFRpbWUodm9pZCkKK3sgcmV0dXJuIF9fVUxaUmVhZFRpbWUoKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVTQ1JJUFRJT046CitDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgYmV0d2VlbiB0d28gdGltZXIgY291bnRzLgorCitIRUFERVI6Cit6dGltZXIuaAorCitQQVJBTUVURVJTOgorc3RhcnQgICAtIFN0YXJ0aW5nIHRpbWUgZm9yIGVsYXBzZWQgY291bnQKK2ZpbmlzaCAgLSBFbmRpbmcgdGltZSBmb3IgZWxhcHNlZCBjb3VudAorCitSRVRVUk5TOgorRWxhcHNlZCB0aW1lciBpbiByZXNvbHV0aW9uIGNvdW50cy4KKworUkVNQVJLUzoKK1JldHVybnMgdGhlIGVsYXBzZWQgdGltZSBmb3IgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBpbiB1bml0cyBvZiB0aGUKK3RpbWVycyByZXNvbHV0aW9uICgxLzE4dGggb2YgYSBzZWNvbmQgdW5kZXIgRE9TKS4gVGhpcyBmdW5jdGlvbiBjb3JyZWN0bHkKK2NvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGV2ZW4gaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgYmVlbiBjcm9zc2VkCitkdXJpbmcgdGhlIHRpbWluZyBwZXJpb2QuCisKK1NFRSBBTFNPOgorVUxaUmVhZFRpbWUsIFVMWlRpbWVyUmVzb2x1dGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIFpBUEkgVUxaRWxhcHNlZFRpbWUoCisgICAgdWxvbmcgc3RhcnQsCisgICAgdWxvbmcgZmluaXNoKQoreyByZXR1cm4gX19VTFpFbGFwc2VkVGltZShzdGFydCxmaW5pc2gpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERVNDUklQVElPTjoKK1JldHVybnMgdGhlIHJlc29sdXRpb24gb2YgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lci4KKworSEVBREVSOgorenRpbWVyLmgKKworUEFSQU1FVEVSUzoKK3Jlc29sdXRpb24gICAtIFBsYWNlIHRvIHN0b3JlIHRoZSB0aW1lciBpbiBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIGNvdW50LgorCitSRU1BUktTOgorUmV0dXJucyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFzIGEgMzItYml0CitpbnRlZ2VyIHZhbHVlIG1lYXN1cmVkIGluIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgY291bnQuCisKK1NFRSBBTFNPOgorVUxaUmVhZFRpbWUsIFVMWkVsYXBzZWRUaW1lLCBVTFpUaW1lckNvdW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBaQVBJIFVMWlRpbWVyUmVzb2x1dGlvbigKKwl1bG9uZyAqcmVzb2x1dGlvbikKK3sgKnJlc29sdXRpb24gPSBVTFpUSU1FUl9SRVNPTFVUSU9OOyB9CisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvQXNtTWFjcm9zLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL0FzbU1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjQyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL0FzbU1hY3Jvcy5oCkBAIC0wLDAgKzEsNDUwIEBACisvKiAkWENvbnNvcnRpdW06IEFzbU1hY3Jvcy5oIC9tYWluLzEzIDE5OTYvMTAvMjUgMTE6MzM6MTIga2FsZWIgJCAqLworLyoKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IERhdmlkIFdleGVsYmxhdCA8ZHdleEB4ZnJlZTg2Lm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiAKKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCAKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSAKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgCisgKiBEQVZJRCBXRVhFTEJMQVQgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIAorICogU09GVFdBUkUuCisgKiAKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERhdmlkIFdleGVsYmxhdCBzaGFsbCBub3QgYmUKKyAqIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworICogaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIERhdmlkIFdleGVsYmxhdC4KKyAqCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk5NworICogRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgY29waWVkIG9ubHkgaW4gCisgKiBhY2NvcmRhbmNlIHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFN1YmplY3QgdG8gdGhlc2UgCisgKiBjb25kaXRpb25zLCB5b3UgbWF5IGRvd25sb2FkLCBjb3B5LCBpbnN0YWxsLCB1c2UsIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSAKKyAqIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gTm8gdGl0bGUgb3Igb3duZXJzaGlwIGlzIAorICogdHJhbnNmZXJyZWQgaGVyZWJ5LgorICoKKyAqIDEpIEFueSBzb3VyY2UgY29kZSB1c2VkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBtdXN0IHJlcHJvZHVjZSBhbmQgcmV0YWluIAorICogICAgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZQorICogICAgZmlsZS4KKyAqCisgKiAyKSBObyByaWdodCBpcyBncmFudGVkIHRvIHVzZSBhbnkgdHJhZGUgbmFtZSwgdHJhZGVtYXJrLCBvciBsb2dvIG9mIERpZ2l0YWwgCisgKiAgICBFcXVpcG1lbnQgQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgbmFtZSAKKyAqICAgIG5vciBhbnkgdHJhZGVtYXJrIG9yIGxvZ28gb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCB0aGUgCisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisgKgorICogMykgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMtSVMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIAorICogICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bywgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHksIAorICogICAgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsIG9yIG5vbi1pbmZyaW5nZW1lbnQgYXJlIGRpc2NsYWltZWQuIEluIAorICogICAgbm8gZXZlbnQgc2hhbGwgRElHSVRBTCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIHdoYXRzb2V2ZXIsIGFuZCBpbiAKKyAqICAgIHBhcnRpY3VsYXIsIERJR0lUQUwgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3Igc3BlY2lhbCwgaW5kaXJlY3QsIAorICogICAgY29uc2VxdWVudGlhbCwgb3IgaW5jaWRlbnRhbCBkYW1hZ2VzIG9yIGRhbWFnZXMgZm9yIAorICogICAgbG9zdCBwcm9maXRzLCBsb3NzIG9mIHJldmVudWUgb3IgbG9zcyBvZiB1c2UsIHdoZXRoZXIgc3VjaCBkYW1hZ2VzIGFyaXNlIAorICogICAgaW4gY29udHJhY3QsIAorICogICAgbmVnbGlnZW5jZSwgdG9ydCwgdW5kZXIgc3RhdHV0ZSwgaW4gZXF1aXR5LCBhdCBsYXcgb3Igb3RoZXJ3aXNlLCBldmVuIGlmIAorICogICAgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuIAorICoKKyAqLworCisvKiAkWEZyZWU4NjogeGMvcHJvZ3JhbXMvWHNlcnZlci9ody94ZnJlZTg2L1N1cGVyUHJvYmUvQXNtTWFjcm9zLmgsdiAzLjE0IDE5OTkvMDkvMjUgMTQ6MzY6NTggZGF3ZXMgRXhwICQgKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjaWYgZGVmaW5lZChsaW51eCkgJiYgKGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSkKKyN1bmRlZiBpbmIKKyNkZWZpbmUgaW5iIF9pbmIKKyN1bmRlZiBpbncKKyNkZWZpbmUgaW53IF9pbncKKyN1bmRlZiBpbmwKKyNkZWZpbmUgaW5sIF9pbmwKKyN1bmRlZiBvdXRiCisjZGVmaW5lIG91dGIocCx2KSBfb3V0YigodiksKHApKQorI3VuZGVmIG91dHcKKyNkZWZpbmUgb3V0dyhwLHYpIF9vdXR3KCh2KSwocCkpCisjdW5kZWYgb3V0bAorI2RlZmluZSBvdXRsKHAsdikgX291dGwoKHYpLChwKSkKKyNlbHNlCisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisjaWZuZGVmIEFTSV9QTAorI2RlZmluZSBBU0lfUEwgMHg4OAorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK291dGIocG9ydCwgdmFsKQordW5zaWduZWQgbG9uZyBwb3J0OworY2hhciB2YWw7Cit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGJhICUwLCBbJTFdICUyIiA6IDogInIiICh2YWwpLCAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXR3KHBvcnQsIHZhbCkKK3Vuc2lnbmVkIGxvbmcgcG9ydDsKK2NoYXIgdmFsOworeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RoYSAlMCwgWyUxXSAlMiIgOiA6ICJyIiAodmFsKSwgInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0bChwb3J0LCB2YWwpCit1bnNpZ25lZCBsb25nIHBvcnQ7CitjaGFyIHZhbDsKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YSAlMCwgWyUxXSAlMiIgOiA6ICJyIiAodmFsKSwgInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50CitpbmIocG9ydCkKK3Vuc2lnbmVkIGxvbmcgcG9ydDsKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcmV0OworICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkdWJhIFslMV0gJTIsICUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOworICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50CitpbncocG9ydCkKK3Vuc2lnbmVkIGxvbmcgcG9ydDsKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcmV0OworICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkdWhhIFslMV0gJTIsICUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOworICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50CitpbmwocG9ydCkKK3Vuc2lnbmVkIGxvbmcgcG9ydDsKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcmV0OworICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkYSBbJTFdICUyLCAlMCIgOiAiPXIiIChyZXQpIDogInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKKyAgIHJldHVybiByZXQ7Cit9CisjZWxzZQorI2lmZGVmIF9fYXJtMzJfXwordW5zaWduZWQgaW50IElPUG9ydEJhc2U7ICAvKiBNZW1vcnkgbWFwcGVkIEkvTyBwb3J0IGFyZWEgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0Yihwb3J0LCB2YWwpCisgICAgIHNob3J0IHBvcnQ7CisgICAgIGNoYXIgdmFsOworeworICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybjsKKworICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSA9IHZhbDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0dyhwb3J0LCB2YWwpCisgICAgIHNob3J0IHBvcnQ7CisgICAgIHNob3J0IHZhbDsKK3sKKyAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm47CisKKyAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpID0gdmFsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRsKHBvcnQsIHZhbCkKKyAgICAgc2hvcnQgcG9ydDsKKyAgICAgaW50IHZhbDsKK3sKKyAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm47CisKKyAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkgPSB2YWw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAoraW5iKHBvcnQpCisgICAgIHNob3J0IHBvcnQ7Cit7CisgICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuKCh1bnNpZ25lZCBpbnQpLTEpOworCisgICAgcmV0dXJuKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAoraW53KHBvcnQpCisgICAgIHNob3J0IHBvcnQ7Cit7CisgICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuKCh1bnNpZ25lZCBpbnQpLTEpOworCisgICAgcmV0dXJuKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKK2lubChwb3J0KQorICAgICBzaG9ydCBwb3J0OworeworICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybigodW5zaWduZWQgaW50KS0xKTsKKworICAgIHJldHVybigqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkpOworfQorI2Vsc2UgLyogX19hcm0zMl9fICovCisjaWYgZGVmaW5lZChMeW54KSAmJiBkZWZpbmVkKF9fcG93ZXJwY19fKQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmlvQmFzZTsKKworc3RhdGljIHZvbGF0aWxlIHZvaWQKK2VpZWlvKCkKK3sKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7Cit9CisKK3N0YXRpYyB2b2lkCitvdXRiKHBvcnQsIHZhbHVlKQorc2hvcnQgcG9ydDsKK3Vuc2lnbmVkIGNoYXIgdmFsdWU7Cit7CisgICAgKih1Y2hhciAqKShpb0Jhc2UgKyBwb3J0KSA9IHZhbHVlOyBlaWVpbygpOworfQorCitzdGF0aWMgdm9pZAorb3V0dyhwb3J0LCB2YWx1ZSkKK3Nob3J0IHBvcnQ7Cit1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKK3sKKyAgICAqKHVuc2lnbmVkIHNob3J0ICopKGlvQmFzZSArIHBvcnQpID0gdmFsdWU7IGVpZWlvKCk7Cit9CisKK3N0YXRpYyB2b2lkCitvdXRsKHBvcnQsIHZhbHVlKQorc2hvcnQgcG9ydDsKK3Vuc2lnbmVkIGxvbmcgdmFsdWU7Cit7CisgICAgKih1bnNpZ25lZCBsb25nICopKGlvQmFzZSArIHBvcnQpID0gdmFsdWU7IGVpZWlvKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitpbmIocG9ydCkKK3Nob3J0IHBvcnQ7Cit7CisgICAgdW5zaWduZWQgY2hhciB2YWw7CisKKyAgICB2YWwgPSAqKCh1bnNpZ25lZCBjaGFyICopKGlvQmFzZSArIHBvcnQpKTsgZWllaW8oKTsKKyAgICByZXR1cm4odmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0CitpbncocG9ydCkKK3Nob3J0IHBvcnQ7Cit7CisgICAgdW5zaWduZWQgc2hvcnQgdmFsOworCisgICAgdmFsID0gKigodW5zaWduZWQgc2hvcnQgKikoaW9CYXNlICsgcG9ydCkpOyBlaWVpbygpOworICAgIHJldHVybih2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5sKHBvcnQpCitzaG9ydCBwb3J0OworeworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworCisgICAgdmFsID0gKigodW5zaWduZWQgbG9uZyAqKShpb0Jhc2UgKyBwb3J0KSk7IGVpZWlvKCk7CisgICAgcmV0dXJuKHZhbCk7Cit9CisKKyNlbHNlCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChfX2FscGhhX18pCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZXh0ZXJuIHZvaWQgb3V0Yih1X2ludDMyX3QgcG9ydCwgdV9pbnQ4X3QgdmFsKTsKK2V4dGVybiB2b2lkIG91dHcodV9pbnQzMl90IHBvcnQsIHVfaW50MTZfdCB2YWwpOworZXh0ZXJuIHZvaWQgb3V0bCh1X2ludDMyX3QgcG9ydCwgdV9pbnQzMl90IHZhbCk7CitleHRlcm4gdV9pbnQ4X3QgaW5iKHVfaW50MzJfdCBwb3J0KTsKK2V4dGVybiB1X2ludDE2X3QgaW53KHVfaW50MzJfdCBwb3J0KTsKK2V4dGVybiB1X2ludDMyX3QgaW5sKHVfaW50MzJfdCBwb3J0KTsKKworI2Vsc2UKKyNpZmRlZiBHQ0NVU0VTR0FTCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRiKHBvcnQsIHZhbCkKK3Nob3J0IHBvcnQ7CitjaGFyIHZhbDsKK3sKKyAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRiICUwLCUxIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXR3KHBvcnQsIHZhbCkKK3Nob3J0IHBvcnQ7CitzaG9ydCB2YWw7Cit7CisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0dyAlMCwlMSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0bChwb3J0LCB2YWwpCitzaG9ydCBwb3J0OwordW5zaWduZWQgaW50IHZhbDsKK3sKKyAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRsICUwLCUxIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKK2luYihwb3J0KQorc2hvcnQgcG9ydDsKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcmV0OworICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImluYiAlMSwlMCIgOgorICAgICAgICI9YSIgKHJldCkgOgorICAgICAgICJkIiAocG9ydCkpOworICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50CitpbncocG9ydCkKK3Nob3J0IHBvcnQ7Cit7CisgICB1bnNpZ25lZCBzaG9ydCByZXQ7CisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW53ICUxLCUwIiA6CisgICAgICAgIj1hIiAocmV0KSA6CisgICAgICAgImQiIChwb3J0KSk7CisgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKK2lubChwb3J0KQorc2hvcnQgcG9ydDsKK3sKKyAgIHVuc2lnbmVkIGludCByZXQ7CisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW5sICUxLCUwIiA6CisgICAgICAgIj1hIiAocmV0KSA6CisgICAgICAgImQiIChwb3J0KSk7CisgICByZXR1cm4gcmV0OworfQorCisjZWxzZSAvKiBHQ0NVU0VTR0FTICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK291dGIocG9ydCwgdmFsKQorICAgICBzaG9ydCBwb3J0OworICAgICBjaGFyIHZhbDsKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dCVCMCAoJTEpIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXR3KHBvcnQsIHZhbCkKKyAgICAgc2hvcnQgcG9ydDsKKyAgICAgc2hvcnQgdmFsOworeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0JVcwICglMSkiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK291dGwocG9ydCwgdmFsKQorICAgICBzaG9ydCBwb3J0OworICAgICB1bnNpZ25lZCBpbnQgdmFsOworeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0JUwwICglMSkiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAoraW5iKHBvcnQpCisgICAgIHNob3J0IHBvcnQ7Cit7CisgIHVuc2lnbmVkIGludCByZXQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVCMCAoJTEpIiA6CisgICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KSA6CisgICAgICAgICAgICAgICAgICAgImQiIChwb3J0KSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAoraW53KHBvcnQpCisgICAgIHNob3J0IHBvcnQ7Cit7CisgIHVuc2lnbmVkIGludCByZXQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVXMCAoJTEpIiA6CisgICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KSA6CisgICAgICAgICAgICAgICAgICAgImQiIChwb3J0KSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAoraW5sKHBvcnQpCisgICAgIHNob3J0IHBvcnQ7Cit7CisgIHVuc2lnbmVkIGludCByZXQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVMMCAoJTEpIiA6CisgICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KSA6CisgICAgICAgICAgICAgICAgICAgImQiIChwb3J0KSk7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBHQ0NVU0VTR0FTICovCisjZW5kaWYgLyogTHlueCAmJiBfX3Bvd2VycGNfXyAqLworI2VuZGlmIC8qIGFybTMyICovCisjZW5kaWYgLyogbGludXggJiYgX19zcGFyY19fICovCisjZW5kaWYgLyogbGludXggJiYgX19hbHBoYV9fICovCisjZW5kaWYgLyogX19GcmVlQlNEX18gJiYgX19hbHBoYV9fICovCisKKyNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fYXJtMzJfXykgfHwgKGRlZmluZWQoTHlueCkgJiYgZGVmaW5lZChfX3Bvd2VycGNfXykpCisKKyNkZWZpbmUgaW50cl9kaXNhYmxlKCkKKyNkZWZpbmUgaW50cl9lbmFibGUoKQorCisjZWxzZSAKKworc3RhdGljIF9faW5saW5lX18gdm9pZAoraW50cl9kaXNhYmxlKCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImNsaSIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitpbnRyX2VuYWJsZSgpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGkiKTsKK30KKworI2VuZGlmIC8qIGVsc2UgIWxpbnV4ICYmICFfX2FybTMyX18gKi8KKworI2Vsc2UgLyogX19HTlVDX18gKi8KKworI2lmIGRlZmluZWQoX01JTklYKSAmJiBkZWZpbmVkKF9BQ0spCisKKy8qIGluYiwgb3V0YiwgaW53IGFuZCBvdXR3IGFyZSBkZWZpbmVkIGluIHRoZSBsaWJyYXJ5ICovCisvKiAuLi4gYnV0IEkndmUgbm8gaWRlYSBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciBpbmwgJiBvdXRsICovCisKK3U4X3QgaW5iKFUxNl90KTsKK3ZvaWQgb3V0YihVMTZfdCwgVThfdCk7Cit1MTZfdCBpbncoVTE2X3QpOwordm9pZCBvdXR3KFUxNl90LCBVMTZfdCk7Cit1MzJfdCBpbmwoVTE2X3QpOwordm9pZCBvdXRsKFUxNl90LCBVMzJfdCk7CisKKyNlbHNlIC8qIG5vdCBfTUlOSVggYW5kIF9BQ0sgKi8KKworIyBpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiAoX19TVERDX18gPT0gMSkKKyMgIGlmbmRlZiBOQ1IKKyMgIGRlZmluZSBhc20gX19hc20KKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIFNWUjQKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaWZuZGVmIF9fVVNMQ19fCisjICAgZGVmaW5lIF9fVVNMQ19fCisjICBlbmRpZgorIyBlbmRpZgorI2lmbmRlZiBTQ08zMjUKKyMgaW5jbHVkZSA8c3lzL2lubGluZS5oPgorI2Vsc2UKKyMgaW5jbHVkZSAiLi4vY29tbW9uL3Njb2FzbS5oIgorI2VuZGlmCisjZGVmaW5lIGludHJfZGlzYWJsZSgpIGFzbSgiY2xpIikKKyNkZWZpbmUgaW50cl9lbmFibGUoKSAgYXNtKCJzdGkiKQorCisjZW5kaWYgLyogX01JTklYIGFuZCBfQUNLICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvUkVBRE1FIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3ZDBmYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvUkVBRE1FCkBAIC0wLDAgKzEsMzUgQEAKKworVGhpcyBpcyBhIHByZWxpbWluYXJ5IHZlcnNpb24gb2YgYSBWR0Egc29mdGJvb3RlciBmb3IgTElOVVguCisKK0l0IG1ha2VzIHVzZSBvZiB0aGUgb2YgdGhlIHZtODYoKSBjYWxsIGFuZCBpcyB0aGVyZWZvcmUgb25seQordXNhYmxlIG9uIGl4ODYgc3lzdGVtcy4gCitUaGVyZSBhcmUgcGxhbnMgdG8gcG9ydCB0aGlzIHByb2dyYW0gdG8gdXNlIGEgeDg2IGVtdWxhdG9yCitsaWtlIHg4NmVtdS4gQWxzbyBpdCBtYXkgYmUgcG9ydGVkIHRvIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorCitTbyBmYXIgaXQgaGFzIGJlZW4gdGVzdGVkIG9uIGEgc21hbGwgbnVtYmVyIG9mIGNhcmRzLiBJdCBtaWdodAord2VsbCBiZSB0aGF0IGl0IHdpbGwgZmFpbCBvbiB5b3VyIGNhcmQuIAorCitJZiB5b3UgbmVlZCB0byBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHByb2dyYW1zIHRvIGJlIGFibGUKK3RvIGJvb3QgeW91ciBjYXJkIHBsZWFzZSBsZXQgdGhlIGF1dGhvciBrbm93LgorCitTbyBmYXIgdGhlcmUgaXMgbm8gY29tbWFuZCBsaW5lIGludGVyZmFjZS4gQWxsIG9wdGlvbnMgbmVlZAordG8gYmUgaGFyZGNvZGVkLiBZb3UgY2FuIGRvIHRoaXMgYnkgZWRpdGluZyBkZWJ1Zy5oLiBZb3UgY2FuCit0dXJuIG9uIGEgYnVuY2ggb2YgZGVidWcgb3V0cHV0LiBPdGhlciBvcHRpb25zIGFsbG93IHlvdSB0bworYm9vdCB0aGUgcHJpbWFyeSBjYXJkIChDT05GSUdfQUNUSVZFX0RFVklDRSksIHNhdmUgdGhlIGJpb3MKK3RvIGEgZmlsZSAoU0FWRV9CSU9TKSwgYW5kIG1hcCB0aGUgb3JpZ2luYWwgc3lzdGVtIGJpb3MgCisoTUFQX1NZU19CSU9TKS4KKworVGhlIGF1dGhvciB3YW50cyB0byB0aGFuaworIEhhbnMgTGVybWVuICAgKGRvc2VtdSkKKyBhbmQKKyBLZW5kYWxsIEJlbm5ldHQgKHg4NmVtdSkKK2ZvciB0aGVpciBzdXBwb3J0LiAKKworUGFydHMgb2YgdGhlIGNvZGUgLSBlc3BlY2lhbGx5IGluIHY4Ni5jIGFuZCBpby5jIC0gYXJlIGJhc2VkIG9uIGNvZGUKK3Rha2VuIGZyb20gZG9zZW11LiBQYXJ0cyBvZiB0aGUgY29kZSBpbiBpbnQuYyBhcmUgYmFzZWQgb24gY29kZSB0YWtlbgorZnJvbSB4ODZlbXUKKworRWdiZXJ0IEVpY2guICA8RWdiZXJ0LkVpY2hAUGh5c2lrLlRVLURhcm1zdGFkdC5ERT4KKworCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvYXdrLnNjciBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvYXdrLnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJhODBkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9hd2suc2NyCkBAIC0wLDAgKzEsMTUgQEAKKy8uKlwoMHgzZGEuKi98fC8uKlwoMHgzYmEuKi8geyAKKyAgICAgICAgaWYgKHZfM2RhICE9IDEpIHByaW50ICJfdl9yZXRyYWNlXyI7CisgICAgICAgIHZfM2RhID0gMTsKKyAgICAgICAgbmV4dDsgICAgICAgIAorICAgICAgICB9CisvLipcKDB4NDIuKi98fC8uKlwoMHg0My4qLyB7CisgICAgICAgIGlmICh2XzR4ICE9IDEpIHByaW50ICJfdGltZXJfIjsKKyAgICAgICAgdl80eCA9IDE7CisgICAgICAgIG5leHQ7Cit9Cit7CisgICAgcHJpbnQ7CisgICAgdl8zZGEgPSAwOworICAgIHZfNHggPSAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jYmlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzNjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NiaW9zLmMKQEAgLTAsMCArMSw0MTUgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUEVSTSkKKyNpbmNsdWRlIDxzeXMvcGVybS5oPgorI2VuZGlmCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2ODZiaW9zLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAiQXNtTWFjcm9zLmgiCisKKyNkZWZpbmUgU0laRSAweDEwMDAwMAorI2RlZmluZSBWUkFNX1NUQVJUIDB4QTAwMDAKKyNkZWZpbmUgVlJBTV9TSVpFIDB4MUZGRkYKKyNkZWZpbmUgVl9CSU9TX1NJWkUgMHgxRkZGRgorI2RlZmluZSBCSU9TX1NUQVJUIDB4N0MwMCAgICAgICAgICAgIC8qIGRlZmF1bHQgQklPUyBlbnRyeSAqLworI2RlZmluZSBCSU9TX01FTSAweDYwMAorCitDQVJEOCBjb2RlW10gPSB7IDB4Y2QsIDB4MTAsIDB4ZjQgfTsKK3N0cnVjdCBjb25maWcgQ29uZmlnOworCitzdGF0aWMgaW50IG1hcCh2b2lkKTsKK3N0YXRpYyB2b2lkIHVubWFwKHZvaWQpOworc3RhdGljIHZvaWQgcnVuQklPUyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworc3RhdGljIGludCBtYXBfdnJhbSh2b2lkKTsKK3N0YXRpYyB2b2lkIHVubWFwX3ZyYW0odm9pZCk7CitzdGF0aWMgaW50IGNvcHlfdmJpb3MobWVtVHlwZSBiYXNlKTsKK3N0YXRpYyBpbnQgY29weV9zeXNfYmlvcyh2b2lkKTsKK3N0YXRpYyBDQVJEMzIgc2V0dXBfaW50X3ZlY3Qodm9pZCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfYmlvc192YXJzKHZvaWQpOworc3RhdGljIGludCBjaGtzdW0oQ0FSRDggKnN0YXJ0KTsKK3N0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworc3RhdGljIHZvaWQgcHJpbnRfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKTsKK3ZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK3ZvaWQgbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4ICpjb2RlKTsKKworc3RhdGljIGludCB2cmFtX21hcHBlZCA9IDA7CitzdGF0aWMgY2hhciogYmlvc192YXI7CisKKworaW50CittYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQoreworICAgIENBUkQzMiB2Ymlvc19iYXNlOworCisgICAgQ29uZmlnLlByaW50UG9ydCA9IFBSSU5UX1BPUlQ7CisgICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IElPX1NUQVRJU1RJQ1M7CisgICAgQ29uZmlnLlByaW50SXJxID0gUFJJTlRfSVJROworICAgIENvbmZpZy5QcmludFBjaSA9IFBSSU5UX1BDSTsKKyAgICBDb25maWcuU2hvd0FsbERldiA9IFNIT1dfQUxMX0RFVjsgICAgICAgIAorICAgIENvbmZpZy5QcmludElwID0gUFJJTlRfSVA7ICAgICAgICAgICAKKyAgICBDb25maWcuU2F2ZUJpb3MgPSBTQVZFX0JJT1M7ICAgICAgICAgIAorICAgIENvbmZpZy5UcmFjZSA9IFRSQUNFOyAgICAgICAgICAgICAKKyAgICBDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IENPTkZJR19BQ1RJVkVfT05MWTsgIAorICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsKKyAgICBDb25maWcuTWFwU3lzQmlvcyA9IE1BUF9TWVNfQklPUzsgICAgICAgIAorICAgIENvbmZpZy5SZXNvcnQgPSBSRVNPUlQ7ICAgICAgICAgICAgCisgICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007ICAgICAgICAgICAgCisgICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7ICAgICAgICAgCisgICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOworICAgIAorICAgIGlmICghbWFwKCkpCisgICAgZXhpdCgxKTsKKyAgICBpZiAoIWNvcHlfc3lzX2Jpb3MoKSkKKyAgICBleGl0KDEpOworICAgIGlmICghKHZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpKSkKKyAgICBleGl0KDEpOworICAgIGlmICghbWFwX3ZyYW0oKSkKKyAgICBleGl0KDEpOworICAgIGlmICghY29weV92Ymlvcyh2Ymlvc19iYXNlKSkKKyAgICBleGl0KDEpOworICAgIAorICAgIGlvcGwoMyk7CisgICAgc2V0dXBfaW8oKTsKKyAgICBydW5CSU9TKGFyZ2MsYXJndik7CisgICAgdXBkYXRlX2Jpb3NfdmFycygpOworICAgIHVubWFwX3ZyYW0oKTsKKyAgICBpb3BsKDApOworICAgIHVubWFwKCk7CisgICAgcHJpbnRmKCJkb25lICFcbiIpOworICAgIGV4aXQgKDEpOworfQorCitpbnQgIAorbWFwKHZvaWQpCit7CisgICAgdm9pZCogbWVtOworCisgICAgbWVtID0gbW1hcCgwLCAoc2l6ZV90KVNJWkUsCisgICAgICAgICAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKKyAgICAgICAgICAgICAgIC0xLCAwICk7IAorICAgIGlmIChtZW0gIT0gMCkgeworICAgICAgICBwZXJyb3IoImFub255bW91cyBtYXAiKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgbWVtc2V0KG1lbSwwLFNJWkUpOworCisgICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlKTsKKyAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50Citjb3B5X3N5c19iaW9zKHZvaWQpCit7CisjZGVmaW5lIFNZU19CSU9TIDB4RjAwMDAKKyAgICBpbnQgbWVtX2ZkOworCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgeworICAgICAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAKKyAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgU1lTX0JJT1MsU0VFS19TRVQpICE9IChvZmZfdCkgU1lTX0JJT1MpIAorICAgICAgICBnb3RvIEVycm9yOworICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKilTWVNfQklPUywgKHNpemVfdCkgMHhGRkZGKSAhPSAoc2l6ZV90KSAweEZGRkYpIAorICAgICAgICBnb3RvIEVycm9yOworCisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICByZXR1cm4gKDEpOworCitFcnJvcjoKKyAgICBwZXJyb3IoInN5c19iaW9zIik7CisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CittYXBfdnJhbSh2b2lkKQoreworICAgIGludCBtZW1fZmQ7CisKKyNpZmRlZiBfX2lhNjRfXworICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKSAKKyNlbHNlCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApIAorI2VuZGlmCisgICAgICB7CisgICAgICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZuZGVmIF9fYWxwaGFfXworICAgIGlmIChtbWFwKCh2b2lkICopIFZSQU1fU1RBUlQsIChzaXplX3QpIFZSQU1fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsCisgICAgICAgICAgICAgICAgICAgICBtZW1fZmQsIFZSQU1fU1RBUlQpID09ICh2b2lkICopIC0xKSAKKyNlbHNlCisgICAgICAgICBpZiAoIV9idXNfYmFzZSgpKSBzcGFyc2Vfc2hpZnQgPSA3OyAvKiBVaCwgb2gsIEpFTlNFTi4uLiAqLworICAgICAgICAgaWYgKCFfYnVzX2Jhc2Vfc3BhcnNlKCkpIHNwYXJzZV9zaGlmdCA9IDA7CisgICAgICAgICBpZiAoKHZyYW1fbWFwID0gbW1hcCgwLChzaXplX3QpIChWUkFNX1NJWkUgPDwgc3BhcnNlX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2ZkLCAoVlJBTV9TVEFSVCA8PCBzcGFyc2Vfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfYnVzX2Jhc2Vfc3BhcnNlKCkpKSA9PSAodm9pZCAqKSAtMSkKKyNlbmRpZgorICAgICAgeworICAgICAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSIpOworICAgICAgICAgICAgY2xvc2UobWVtX2ZkKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB2cmFtX21hcHBlZCA9IDE7CisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50Citjb3B5X3ZiaW9zKG1lbVR5cGUgdl9iYXNlKQoreworICAgIGludCBtZW1fZmQ7CisgICAgdW5zaWduZWQgY2hhciAqdG1wOworICAgIGludCBzaXplOworCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgeworICAgICAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSwgU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKSB7IAorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgbHNlZWtcbiIpOworICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgdG1wID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoMyk7CisgICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXRtcCwgKHNpemVfdCkgMykgIT0gKHNpemVfdCkgMykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSxTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpIAorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCp0bXAgIT0gMHg1NSB8fCAqKHRtcCsxKSAhPSAweEFBICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTm8gYmlvcyBmb3VuZCBhdDogMHglbHhcbiIsdl9iYXNlKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7CisjZW5kaWYKKyAgICBzaXplID0gKih0bXArMikgKiA1MTI7CisKKyAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdl9iYXNlLCAoc2l6ZV90KSBzaXplKSAhPSAoc2l6ZV90KSBzaXplKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBmcmVlKHRtcCk7CisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICBpZiAoIWNoa3N1bSgoQ0FSRDgqKXZfYmFzZSkpCisgICAgICAgIHJldHVybiAoMCk7CisKKyAgICByZXR1cm4gKDEpOworCitFcnJvcjoKKyAgICBwZXJyb3IoInZfYmlvcyIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3VubWFwKHZvaWQpCit7CisgICAgbXVubWFwKDAsU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkCit1bm1hcF92cmFtKHZvaWQpCit7CisgICAgaWYgKCF2cmFtX21hcHBlZCkgcmV0dXJuOworICAgIAorICAgIG11bm1hcCgodm9pZCopVlJBTV9TVEFSVCxWUkFNX1NJWkUpOworICAgIHZyYW1fbWFwcGVkID0gMDsKK30KKworc3RhdGljIHZvaWQKK3J1bkJJT1MoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgICBpODZiaW9zUmVncyBiUmVnczsKKyNpZmRlZiBWODZCSU9TX0RFQlVHCisgICAgcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKKyNlbmRpZgorICAgIHNldHVwX2Jpb3NfcmVncygmYlJlZ3MsIGFyZ2MsIGFyZ3YpOworICAgIGRvX3g4NihCSU9TX1NUQVJULCZiUmVncyk7CisgICAgcHJpbnRfcmVncygmYlJlZ3MpOworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBwcmludGYoImRvbmVcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBDQVJEMzIKK3NldHVwX2ludF92ZWN0KHZvaWQpCit7CisgICAgaW50IG1lbV9mZDsKKyAgICBDQVJEMzIgdmJhc2U7CisgICAgdm9pZCAqbWFwOworICAgIAorICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKKyAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7CisgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIAorICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCisgICAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorICAgICAgICAgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7CisgICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKKyAgICBjbG9zZShtZW1fZmQpOworICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICBtZW1jcHkoMCxtYXAsQklPU19NRU0pOworICAgIG11bm1hcChtYXAsMHgyMDAwKTsKKyAgICAvKgorICAgICAqIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBiaW9zIHZhcmlhYmxlcyB0byB3cml0ZSBiYWNrIHRoZQorICAgICAqIG1vZGlmaWVkIHZhbHVlcworICAgICAqLworICAgIGJpb3NfdmFyID0gKGNoYXIgKiltYWxsb2MoQklPU19NRU0pOworICAgIG1lbWNweShiaW9zX3ZhciwwLEJJT1NfTUVNKTsKKyAgICAKKyAgICB2YmFzZSA9ICgqKChDQVJEMTYqKSgweDEwIDw8IDIpICsgMSkpIDw8IDQ7CisgICAgZnByaW50ZihzdGRlcnIsInZiYXNlOiAweCV4XG4iLHZiYXNlKTsKKyAgICByZXR1cm4gdmJhc2U7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfYmlvc192YXJzKHZvaWQpCit7CisgICAgaW50IG1lbV9mZDsKKyAgICB2b2lkICptYXA7CisgICAgbWVtVHlwZSBpOworICAgIAorI2lmZGVmIF9faWE2NF9fCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApIAorI2Vsc2UKKyAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkgCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgIAorICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCisgICAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorICAgICAgICAgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7CisgICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKKyAgICBjbG9zZShtZW1fZmQpOworICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQklPU19NRU07IGkrKykgeworICAgIGlmIChiaW9zX3ZhcltpXSAhPSAqKENBUkQ4KilpKSAKKyAgICAgICAgKigoQ0FSRDgqKW1hcCArIGkpID0gKihDQVJEOCopaTsKKyAgICB9CisKKyAgICBtdW5tYXAobWFwLDB4MjAwMCk7CisgICAgY2xvc2UobWVtX2ZkKTsKK30KKworCitzdGF0aWMgdm9pZAorc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgYzsKKworICAgIHJlZ3MtPmF4ID0gMDsKKyAgICByZWdzLT5ieCA9IDA7CisgICAgcmVncy0+Y3ggPSAwOworICAgIHJlZ3MtPmR4ID0gMDsKKyAgICByZWdzLT5lcyA9IDA7CisgICAgcmVncy0+ZGkgPSAwOworICAgIG9wdGVyciA9IDA7CisgICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsYXJndiwiYTpiOmM6ZDplOmk6IikpICE9IEVPRikgeworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJ2EnOgorICAgICAgICByZWdzLT5heCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6CisgICAgICAgIHJlZ3MtPmJ4ID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgICAgcmVncy0+Y3ggPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgICAgICByZWdzLT5keCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZSc6CisgICAgICAgIHJlZ3MtPmVzID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgICAgcmVncy0+ZGkgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIGludAorY2hrc3VtKENBUkQ4ICpzdGFydCkKK3sKKyAgQ0FSRDE2IHNpemU7CisgIENBUkQ4IHZhbCA9IDA7CisgIGludCBpOworCisgIHNpemUgPSAqKHN0YXJ0KzIpICogNTEyOyAgCisgIGZvciAoaSA9IDA7IGk8c2l6ZTsgaSsrKQorICAgIHZhbCArPSAqKHN0YXJ0ICsgaSk7CisgICAgCisgIGlmICghdmFsKQorICAgIHJldHVybiAxOworCisgICAgZnByaW50ZihzdGRlcnIsIkJJT1MgY2tzdW0gd3JvbmchXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCit7CisgICAgcHJpbnRmKCJheD0leCBieD0leCBjeD0leCBkeD0leCBlcz0leCBkaT0leFxuIiwoQ0FSRDE2KXJlZ3MtPmF4LAorICAgICAgIChDQVJEMTYpcmVncy0+YngsKENBUkQxNilyZWdzLT5jeCwoQ0FSRDE2KXJlZ3MtPmR4LAorICAgICAgIChDQVJEMTYpcmVncy0+ZXMsKENBUkQxNilyZWdzLT5kaSk7Cit9CisKK3ZvaWQKK2xvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCBjb2RlW10pCit7CisgICAgaW50IGk7CisgICAgQ0FSRDggdmFsOworICAgIAorICAgIGZvciAoIGk9MDs7aSsrKSB7CisgICAgICAgIHZhbCA9IGNvZGVbaV07CisgICAgICAgICpwdHIrKyA9IHZhbDsKKyAgICAgICAgaWYgKHZhbCA9PSAweGY0KSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIAorZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICBpbnQgaSxqOworICAgIGNoYXIgKmMgPSAoY2hhciAqKXN0YXJ0OworCisgICAgZm9yIChqID0gMDsgaiA8IChzaXplID4+IDQpOyBqKyspIHsKKyAgICAgICAgcHJpbnRmICgiXG4weCVseDogICIsKHVuc2lnbmVkIGxvbmcpYyk7CisgICAgICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykgCisgICAgICAgICAgICBwcmludGYoIiV4ICIsKHVuc2lnbmVkIGNoYXIpICgqKGMrKykpKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb21tYW5kLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ2OGRhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb21tYW5kLmMKQEAgLTAsMCArMSw0MSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNkZWZpbmUgUFJPTVBUICI+IgorCisKK3ZvaWQKK2dldGxpbmUoY2hhciAqYnVmLGludCAqbnVtLGludCBtYXhfbnVtKQoreworICAgIHN0YXRpYyBpbnQgbGluZV9sZW4gPSAwOworICAgIHN0YXRpYyBjaGFyICpsaW5lID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqbGluZV9wb2ludGVyID0gTlVMTDsKKyAgICBzdGF0aWMgaW50IGxlbiA9IDA7CisgICAgaW50IHRtcF9sZW47CisgICAgY2hhciAqYnVmZjsKKyAgICAKKyAgICBpZiAobGVuIDw9IDApIHsKKyAgICBidWZmID0gcmVhZGxpbmUoUFJPTVBUKTsKKyAgICBhZGRfaGlzdG9yeShidWZmKTsKKyAgICAKKyAgICBpZiAoKHRtcF9sZW4gPSBzdHJsZW4oYnVmZikpID4gbGluZV9sZW4pIHsKKyAgICAgICAgZnJlZShsaW5lKTsKKyAgICAgICAgbGluZSA9IG1hbGxvYyh0bXBfbGVuKTsKKyAgICAgICAgbGluZV9sZW4gPSB0bXBfbGVuOworICAgIH0KKyAgICBzcHJpbnRmKGxpbmUsIiVzXG4iLGJ1ZmYpOworICAgIGZyZWUoYnVmZik7CisgICAgbGluZV9wb2ludGVyID0gbGluZTsKKyAgICBsZW4gPSBzdHJsZW4obGluZSk7CisgICAgfQorICAgIAorICAgICpudW0gPSBtYXhfbnVtID4gbGVuPyBsZW4gOiBtYXhfbnVtOyAKKyAgICBzdHJuY3B5KGJ1ZixsaW5lX3BvaW50ZXIsKm51bSk7IAorICAgIGxpbmVfcG9pbnRlciA9IGxpbmVfcG9pbnRlciArICpudW07CisgICAgbGVuID0gbGVuIC0gKm51bTsKK30KKworCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29uc29sZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4MDUxNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29uc29sZS5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCisgKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy92dC5oPgorI2luY2x1ZGUgPHN5cy9rZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY4NmJpb3MuaCIKKworY29uc29sZQorb3Blbl9jb25zb2xlKHZvaWQpCit7CisgICAgaW50IGZkOworICAgIGludCBWVG5vOworICAgIGNoYXIgVlRuYW1lWzExXTsKKyAgICBjb25zb2xlIENvbiA9IHstMSwtMX07CisgICAgc3RydWN0IHZ0X3N0YXQgdnRzOworICAgIAorICAgIGlmIChOT19DT05TT0xFKQorICAgICAgICAgICAgcmV0dXJuIENvbjsKKyAgICAKKyAgICBpZiAoKGZkID0gb3BlbigiL2Rldi90dHkwIixPX1dST05MWSwwKSkgPCAwKQorICAgICAgICByZXR1cm4gQ29uOworCisgICAgaWYgKChpb2N0bChmZCwgVlRfT1BFTlFSWSwgJlZUbm8pIDwgMCkgfHwgKFZUbm8gPT0gLTEpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJjYW5ub3QgZ2V0IGEgdnRcbiIpOyAgICAKKyAgICAgICAgcmV0dXJuIENvbjsKKyAgICB9CisgICAgCisgICAgY2xvc2UoZmQpOworICAgIHNwcmludGYoVlRuYW1lLCIvZGV2L3R0eSVpIixWVG5vKTsKKyAgICAKKyAgICBpZiAoKGZkID0gb3BlbihWVG5hbWUsIE9fUkRXUnxPX05ERUxBWSwgMCkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiY2Fubm90IG9wZW4gY29uc29sZVxuIik7CisgICAgICAgIHJldHVybiBDb247CisgICAgfQorICAgIAorICAgIGlmIChpb2N0bChmZCwgVlRfR0VUU1RBVEUsICZ2dHMpID09IDApIAorICAgICAgICBDb24udnQgPSB2dHMudl9hY3RpdmU7CisKKyAgICBpZiAoaW9jdGwoZmQsIFZUX0FDVElWQVRFLCBWVG5vKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJjYW5ub3QgYWN0aXZhdGUgY29uc29sZVxuIik7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIENvbjsKKyAgICB9CisgICAgaWYgKGlvY3RsKGZkLCBWVF9XQUlUQUNUSVZFLCBWVG5vKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJ3YWl0IGZvciBhY3RpdmUgY29uc29sZSBmYWlsZWRcbiIpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBDb247CisgICAgfQorI2lmIDAKKyAgICBpZiAoaW9jdGwoZmQsIEtEU0VUTU9ERSwgS0RfR1JBUEhJQ1MpIDwgMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBDb247CisgICAgfQorI2VuZGlmCisgICAgQ29uLmZkID0gZmQ7CisgICAgcmV0dXJuIENvbjsKK30KKwordm9pZAorY2xvc2VfY29uc29sZShjb25zb2xlIENvbikKK3sKKyAgICBpZiAoQ29uLmZkID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgCisjaWYgMAorICAgIGlvY3RsKENvbi5mZCwgS0RTRVRNT0RFLCBLRF9URVhUKTsKKyNlbmRpZgorICAgIGlmIChDb24udnQgPj0wKQorICAgICAgICBpb2N0bChDb24uZmQsIFZUX0FDVElWQVRFLCBDb24udnQpOworICAgIAorICAgIGNsb3NlKENvbi5mZCk7Cit9CisKKworICAgIAorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9kZWJ1Zy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGIxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2RlYnVnLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8vI2RlZmluZSBWODZCSU9TX0RFQlVHCisKKy8qCisgKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiBuZWVkZWQKKyAqIHNob3VsZCBiZSBjb21tYW5kIGxpbmUgb3B0aW9ucworICovCisKKyNkZWZpbmUgUFJJTlRfUE9SVCAwCisjZGVmaW5lIElPX1NUQVRJU1RJQ1MgMAorI2RlZmluZSBQUklOVF9JUlEgMAorI2RlZmluZSBQUklOVF9QQ0kgMQorI2RlZmluZSBQUklOVF9JUCAwICAgIC8qIHByaW50IElQIGFkZHJlc3Mgd2l0aCBQSU8gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVFJBQ0UgMCAgICAgICAvKiB0dXJuIG9uIGRlYnVnZ2VyIGluIHg4NmVtdSAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWlyZXMgeDg2ZW11IGNvbXBpbGVkIHdpdGggLURERUJVRyAqLworCisvKgorICogdGhlc2Ugc2hvdWxkIG5vdCBiZSBoZXJlLgorICogU2hvdWxkIGJlIGNvbnZlcnRlZCB0byBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqLworI2RlZmluZSBDT05GSUdfQUNUSVZFX09OTFkgMAorI2RlZmluZSBDT05GSUdfQUNUSVZFX0RFVklDRSAxCisjZGVmaW5lIFNBVkVfQklPUyAwCisjZGVmaW5lIE1BUF9TWVNfQklPUyAxCisjZGVmaW5lIFJFU09SVCAxCisjZGVmaW5lIEZJWF9ST00gMAorI2RlZmluZSBOT19DT05TT0xFIDAKKyNkZWZpbmUgU0hPV19BTExfREVWIDAKKyNkZWZpbmUgVkVSQk9TRSAwCisKKy8vI2RlZmluZSBWX0JJT1MgMHhlMDAwMAorLy8jZGVmaW5lIFZfQklPUyAweGU0MDAwCisKKworCisKKyNpZiAoUFJJTlRfSU8gPT0gMSkgJiYgKFBSSU5UX1BPUlQgPT0gMCkKKyMgZGVmaW5lIFBSSU5UX0lPIDAKKyNlbmRpZgorI2lmIChJT19TVEFUSVNUSUNTID09IDEpICYmIChQUklOVF9QT1JUID09IDApCisjIGRlZmluZSBJT19TVEFUSVNUSUNTIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oYXBweV9jYXJkcyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGFwcHlfY2FyZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZDQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGFwcHlfY2FyZHMKQEAgLTAsMCArMSw3NiBAQAorV2hhdCBJIGhhZCB0byBkbyB0byBtYWtlIGNhcmRzIGhhcHB5OgorCisxLiBUc2VuZyBFVDQwMDAgVzMyUAorVGhpcyBjYXJkIHdhbnRzIHRvIGNhbGwgdGhlIG9yaWdpbmFsIHN5c3RlbSBCSU9TIHZpZGVvIHJvdXRpbmVzLgorSXQgc2V0cyB0aGUgaW50IDB4NDIgdmVjdG9yIHRvIEYwMDA6RjA2NSwgdGhlIGVudHJ5IHBvaW50IHRvIHRoZQorc3lzdGVtIGJpb3MgdmlkZW8gcm91dGluZXMuIAorQ0FWRTogZG9uJ3QgY2F0Y2ggaW50IDB4NDIgYW5kIHVzZSB0aGUgdmJpb3MgaW50IDB4MTAgcm91dGluZXMuIAorQXQgZWFybHkgc3RhZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRoZXkgY2FsbCBpbnQgMHg0Mi4gVGhpcyAKK2NhdXNlcyBhbiBpbmZpbml0ZSBsb29wLgorCisyLiBBVGkgTWFjaDY0IFJhZ2UgSUljIEFHUAorVGhpcyBjYXJkIGRvZXMgc2ltaWxhciB0aGluZ3MgbGlrZSB0aGUgVHNlbmcgRVQ0MDAwIFczMlAuCitIb3dldmVyIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgcHJvYmxlbSB3aXRoIHRoZSBpbmluaXRlIGxvb3AuCisKKzMuIEVsc2EgVmljdG9yeSBJSS1BMTYgQUdQIEJhbnNoZWUKK1RoaXMgY2FyZCBpcyB2ZXJ5IGNsZXZlcjogSXQga25vd3MgaXQgaXMgYW4gQUdQIGNhcmQuIFRoZXJlZm9yZQoraXQga25vd3MgaXQgaXMgYmVoaW5kIGEgUENJLVBDSSBicmlkZ2UuIEl0IGFsc28ga25vd3MgdGhhdCBub29uZQorZWxzZSBpcyBiZWhpbmQgdGhpcyBicmlkZ2UuIFRoZXJlZm9yZSBpdCBzdGFydCByZXByb2dyYW1taW5nIHRoZQorYnJpZGdlISBGb3IgdGhpcyBpdCBhc3N1bWVzIHRoZSBBR1AgYnJpZGdlIGlzIG9uIGJ1cyAxLgorCis0LiBFbHNhIEdsb3JpYSBTeW5lcmd5IDggVmlWbyBBR1AgUE0yCitUaGlzIGNhcmQgbGlrZXMgdG8gc2VlIGEgY29tcGxldGUgaW50ZXJydXB0IHZlY3RvciB0YWJsZS4gSWYKK3dlIGZpbGwgdGhpcyB0YWJsZSB3aXRoIDAgdGhlIFZCSU9TIGRldGVjdHMgdGhpcyBhbmQgcXVpdHMgCitpbml0aWFsaXphdGlvbi4KKworNS4gRGltb25kIFZpcGVyIDMzMCBBR1AgTlZJRElBIFJpdmEgMTI4LgorVGhpcyBjYXJkIGhhcyBhIHNpbWlsYXIgcHJvYmxlbSBsaWtlIHRoZSBFbHNhIEdsb3JpYS4gSXQgd2FudHMKK3RvIHJlYWQgdGhlIHN5c3RlbSBCSU9TIGRhdGUgYXQgMHhmZmZmZC4KKworNi4gTWF0cm94IE15c3RpcXVlIFBDSSAKK1RoaXMgY2FyZCByZWFkcyB0aGUgSU8gcG9ydCAweDYyLiBJZiBpdCBkb2Vzbid0IGxpa2Ugd2hhdCBpdCBzZWVzCitpdCBsb29wcyBmb3JldmVyLiBUbyBrZWVwIHRoZSBjYXJkIGhhcHB5IHB1dCAweGZjIGludG8gMHhmZmZmZS4KK1RoaXMgbG9jYXRpb24gaG9sZHMgdGhlIHN5c3RlbSBtb2RlbCBpZC4gMHhmYyBtZWFucyBJQk0tQVQuCisgT25lIGNhbiBtYWtlIGFuIGludGVyZXN0aW5nIG9ic2VydmF0aW9uOiB0aGlzIGNhcmQgbGlrZXMgdG8ga25vdyAKK3dpdGggd2hvbSBpdCBoYXMgdG8gc2hhcmUgdGhlIHN5c3RlbS4gVGhlcmVmb3JlIGl0IGFjY2Vzc2VzIFBDSSAKK2NvbmZpZyBzcGFjZSBvZiBhbGwgdGhlIG90aGVyIGNhcmRzLiBJdCBkb2VzIHRoaXMgYnlwYXNzaW5nIHRoZSAKK1BDSSBCSU9TIGJ5IHJlYWRpbmcgdGhlIFBDSSBhY2Nlc3MgcG9ydHMgZGlyZWN0bHkuCisKKzcuIE1hdHJveCBHMTAwIEFHUAorVGhpcyBjYXJkIGhhcyB0aGUgc2FtZSBwcm9ibGVtIGFzIHRoZSBNeXN0aXF1ZS4gCisKK0FwcGVyYW50bHkgdGhpcyB3b3JrcyBub3cuIEhvd2V2ZXIgbm90IGFsbCBjb21iaW5hdGlvbnMgb2YgY2FyZHMgYXJlCitjaGVja2VkLCB5ZXQuCisKK0Z1cnRoZXIgbm90ZXM6Cit0aGUgSU8gcmVnaXN0ZXIgMHg0Mi0weDQzIGFzIHdlbGwgYXMgMHg2MS0weDYzIGFyZSBvZiBzcGVjaWFsIGludGVyZXN0Citmb3IgbWFueSBncmFwaGljIGNhcmRzLiBUaGV5IHNob3VsZCBiZSBlbXVsYXRlZC4KK1RoZSBzbyBjYWxsZWQgIkluZHVzdHJ5IFN0YW5kYXJkIEJJT1MgRW50cnkgUG9pbnRzIiB0byBpbnQgMHg0MiAoMHhGRjA2NSkKK2FuZCB0byBpbnQgMHgxYSAoMHhGRkU2RSkgc2hvdWxkIGJlIGZpbGxlZCB3aXRoIHVzZWZ1bCBjb2RlLiBUaGlzIGNvZGUKK25lZWRzIHRvIHJldHVybiBhcyBpZiBpdCB3YXMgY2FsbGVkIGFzIGludC4KK1RoZSBzdWJ2ZW5kb3IgSUQgUENJIHJlZ2lzdGVycyBtaWdodCBjYXVzZSBwcm9ibGVtcy4gT24gc29tZSBjaGlwc2V0cwordGhleSBhcmUgcHJvZ3JhbW1lZCBpbiBhIG5vbi1vYml2b3VzIG5vbi1QQ0kgY29uZm9ybWFudCB3YXkuCitWX0Jpb3NlcyBhcmUgc2VlbiB0byBtb2RpZnkgdGhlIGZvbGxvd2luZyBpbnQ6CisweDEwIChkZWZhdWx0IHZpZGVvKSwgMHgxZihmb250IHRhYmxlKSwgMHg0Mihjb3B5IG9mIGRlZmF1bHQgdmlkZW8pLCAKKzB4NDMgKD8/KSwgMHg2ZCAoY29weSBvZiBkZWZhdWx0IHZpZGVvIC0gc2FtZSBhcyAweDEwPykKKworVE9ETzoKK0ludCAweDZkIG5lZWRzIHRvIGJlIGRvbmUuCitBbGwgaW50ZXJydXB0cyB3aGVyZSB0aGVyZSBpcyBubyBkZWZhdWx0IGluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50CitzaG91bGQgcG9pbnQgdG8gYW4gdW51c2VkIGxvY2F0aW9uIGluIHRoZSAweEYwMDAgc2VnbWFudCAocG9zc2libHkgCisweEYwMDAwKS4gVGhpcyB3YXkgdGhleSBjb3VsZCBiZSB0cmFwcGVkLiBBIHRyYXAgaGFuZGxlciBmb3IKK2EuIGludCAweDQyIGFuZCBpbnQgMHgxYSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KK1RoZSBkZWZhdWx0ICJpbmR1c3RyeSBlbnRyeSBwb2ludCIgZm9yIHZpZGVvIGFuZCBQQ0kgKDB4RkZFNkUpIHNob3VsZAorYWxzbyBiZSBpbXBsZW1lbnRlZC4gKGFueSBvdGhlcnM/KSBUaGV5IHNob3VsZCBlaXRoZXIgYmUgcm91dGVkIHRvCitpbnQgMHg0MigweDZkPykgKHZpZGVvKSBhbmQgMHgxQSAoUENJKSBvciBzb21lIG90aGVyIGludGVycnVwdHMgdG8KK3RyYXAgdGhlbS4gTWFwcGluZyBvZiBzeXN0ZW0gYmlvcyBtaWdodCBub3QgYmUgYSBnb29kIGlkZWEuIE1heWJlCit0aGUgc3lzdGVtIGJpb3MgYXJlYSBzaG91bGQganVzdCBiZSBmaWxsZWQgd2l0aCAiaGx0IiB0byB0cmFwIGFueQorYWNjZXNzIHRoZXJlLgorSGFuZGxpbmcgb2YgdGltZXIgSU8gcmVnaXN0ZXJzIDB4NDIsIDB4NDMgYW5kIElPIHJlZ2lzdGVycyAweDYxLCAweDYyLgorCitGaW5kIGRvY3VtZW50YXRpb246CistIG9uIGludGVycnVwdCB2ZWN0b3IgdGFibGUKKy0gb24gaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnRzIHRvIHRoZSBzeXN0ZW0gYmlvcworLSBvbiBJTyByZWdpc3RlcnMgMHg2MSBhbmQgMHg2MgorCisKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGV4ZHVtcCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGV4ZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM1OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oZXhkdW1wCkBAIC0wLDAgKzEsMyBAQAorIiUwNi42X2F4ICAiICAxNi8xICIlMDJ4ICIgCisiICAiIDE2LzEgIiVfcCIgCisiXG4iCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2ludC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGIxN2IxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pbnQuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidjg2Ymlvcy5oIgorI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgorI2luY2x1ZGUgInBjaS5oIgorCitzdGF0aWMgaW50IGludDFBX2hhbmRsZXIoc3RydWN0IHJlZ3M4NiAqcmVncyk7CitzdGF0aWMgaW50IGludDQyX2hhbmRsZXIoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncyk7CisKK2ludAoraW50X2hhbmRsZXIoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncykKK3sKKyAgICBzd2l0Y2ggKG51bSkgeworICAgIGNhc2UgMHgxMDoKKyAgICBjYXNlIDB4NDI6CisgICAgICAgIHJldHVybiAoaW50NDJfaGFuZGxlcihudW0scmVncykpOworICAgIGNhc2UgMHgxQToKKyAgICAgICAgcmV0dXJuIChpbnQxQV9oYW5kbGVyKHJlZ3MpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ludDQyX2hhbmRsZXIoaW50IG51bSxzdHJ1Y3QgcmVnczg2ICpyZWdzKQoreworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBDQVJEMzIgdmFsOworCisgICAgaV9wcmludGYoImludCAweCV4OiBheDoweCVseCBieDoweCVseCBjeDoweCVseCBkeDoweCVseFxuIixudW0sCisgICAgICAgICAgIHJlZ3MtPmVheCxyZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4KTsKKyAgICAKKyAgICAvKgorICAgICAqIHZpZGVvIGJpb3MgaGFzIG1vZGlmaWVkIHRoZXNlIC0KKyAgICAgKiBsZWF2ZSBpdCB0byB0aGUgdmlkZW8gYmlvcyB0byBkbyB0aGlzCisgICAgICovCisKKyAgICB2YWwgPSBnZXRJbnRWZWN0KG51bSk7CisgICAgaWYgKHZhbCAhPSAweEYwMDBGMDY1KSAKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIGlmICgocmVncy0+ZWJ4ICYgMHhmZikgPT0gMHgzMikgeworICAgICAgICBzd2l0Y2ggKHJlZ3MtPmVheCAmIDB4RkZGRikgeworICAgICAgICBjYXNlIDB4MTIwMDoKKyAgICAgICAgICAgIGlfcHJpbnRmKCJlbmFibGluZyB2aWRlb1xuIik7CisgICAgICAgICAgICBjID0gaW5iKDB4M2NjKTsKKyAgICAgICAgICAgIGMgfD0gMHgwMjsKKyAgICAgICAgICAgIG91dGIoMHgzYzIsYyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSAweDEyMDE6CisgICAgICAgICAgICBpX3ByaW50ZigiZGlzYWJsaW5nIHZpZGVvXG4iKTsKKyAgICAgICAgICAgIGMgPSBpbmIoMHgzY2MpOworICAgICAgICAgICAgYyAmPSB+MHgwMjsKKyAgICAgICAgICAgIG91dGIoMHgzYzIsYyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobnVtID09IDB4NDIpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1VDQ0VTU0ZVTCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgICAgICAweDg2CisjZGVmaW5lIEJBRF9SRUdJU1RFUl9OVU1CRVIgICAgIDB4ODcKKworc3RhdGljIGludAoraW50MUFfaGFuZGxlcihzdHJ1Y3QgcmVnczg2ICpyZWdzKQoreworICAgIENBUkQzMiBTbG90OworICAgIFBjaVN0cnVjdFB0ciBwUGNpOworCisgICAgaWYgKCEgQ3VycmVudFBjaSkgcmV0dXJuIDA7IC8qIG9vcHMgKi8KKworICAgIGlfcHJpbnRmKCJpbnQgMHgxYTogYXg9MHglbHggYng9MHglbHggY3g9MHglbHggZHg9MHglbHggZGk9MHglbHgiCisgICAgICAgICAiIHNpPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWJ4LHJlZ3MtPmVjeCxyZWdzLT5lZHgsCisgICAgICAgICByZWdzLT5lZGkscmVncy0+ZXNpKTsKKyAgICBzd2l0Y2ggKHJlZ3MtPmVheCAmIDB4RkZGRikgeworICAgIGNhc2UgMHhiMTAxOgorICAgICAgICByZWdzLT5lYXggICY9IDB4RkYwMDsgICAvKiBubyBjb25maWcgc3BhY2Uvc3BlY2lhbCBjeWNsZSBzdXBwb3J0ICovCisgICAgICAgIHJlZ3MtPmVkeCA9IDB4MjA0OTQzNTA7IC8qICIgSUNQIiAqLworICAgICAgICByZWdzLT5lYnggID0gMHgwMjEwOyAgICAvKiBWZXJzaW9uIDIuMTAgKi8KKyAgICAgICAgcmVncy0+ZWN4ICAmPSAweEZGMDA7CisgICAgICAgIHJlZ3MtPmVjeCB8PSAocGNpTWF4QnVzICYgMHhGRik7ICAgLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCisgICAgICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCisgICAgICAgIGlfcHJpbnRmKCJheD0weCVseCBkeD0weCVseCBieD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKKyAgICAgICAgICAgICAgICAgcmVncy0+ZWF4LHJlZ3MtPmVkeCxyZWdzLT5lYngscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgMHhiMTAyOgorICAgICAgICBpZiAoKChyZWdzLT5lZHggJiAweEZGRkYpID09IEN1cnJlbnRQY2ktPlZlbmRvcklEKSAmJgorICAgICAgICAgICAgKChyZWdzLT5lY3ggJiAweEZGRkYpID09IEN1cnJlbnRQY2ktPkRldmljZUlEKSAmJgorICAgICAgICAgICAgKHJlZ3MtPmVzaSA9PSAwKSkgeworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCisgICAgICAgICAgICByZWdzLT5lYnggPSBwY2lTbG90QlgoQ3VycmVudFBjaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ29uZmlnLlNob3dBbGxEZXYgJiYKKyAgICAgICAgICAgICAocFBjaSA9IGZpbmRQY2lEZXZpY2UocmVncy0+ZWR4LHJlZ3MtPmVjeCxyZWdzLT5lc2kpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgICAgIHJlZ3MtPmVieCA9IHBjaVNsb3RCWChwUGNpKTsKKyAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChERVZJQ0VfTk9UX0ZPVU5EIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgfQorICAgICAgICBpX3ByaW50ZigiYXg9MHglbHggYng9MHglbHggZmxhZ3M9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgIHJlZ3MtPmVheCxyZWdzLT5lYngscmVncy0+ZWZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAweGIxMDM6CisgICAgICAgIGlmICgoKHJlZ3MtPmVjeCAmIDB4RkYpID09IEN1cnJlbnRQY2ktPkludGVyZmFjZSkgJiYKKyAgICAgICAgICAgICgoKHJlZ3MtPmVjeCAmIDB4RkYwMCkgPj4gOCkgPT0gQ3VycmVudFBjaS0+U3ViQ2xhc3MpICYmCisgICAgICAgICAgICAoKChyZWdzLT5lY3ggJiAweEZGRkYwMDAwKSA+PiAxNikgPT0gQ3VycmVudFBjaS0+QmFzZUNsYXNzKSAmJiAKKyAgICAgICAgICAgICgocmVncy0+ZXNpICYgMHhmZikgPT0gMCkpIHsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lYnggPSBwY2lTbG90QlgoQ3VycmVudFBjaSk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKENvbmZpZy5TaG93QWxsRGV2CisgICAgICAgICAgICAgJiYgKHBQY2kgPSBmaW5kUGNpQ2xhc3MocmVncy0+ZWN4ICYgMHhGRiwgKHJlZ3MtPmVjeCAmIDB4ZmYwMCkgPj4gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocmVncy0+ZWN4ICYgMHhmZmZmMDAwMCkgPj4gMTYsIHJlZ3MtPmVzaSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lYnggPSBwY2lTbG90QlgocFBjaSk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoREVWSUNFX05PVF9GT1VORCA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCisgICAgICAgIH0KKyAgICAgICAgaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDB4YjEwODoKKyAgICAgICAgaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOworICAgICAgICBpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7CisgICAgICAgICAgICByZWdzLT5lY3ggJj0gMHhGRkZGRkYwMDsKKyAgICAgICAgICAgIHJlZ3MtPmVjeCB8PSBQY2lSZWFkOChyZWdzLT5lZGksU2xvdCk7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLworICAgICAgICB9CisgICAgICAgIGlfcHJpbnRmKCJheD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKKyAgICAgICAgICAgICAgICAgcmVncy0+ZWF4LHJlZ3MtPmVjeCxyZWdzLT5lZmxhZ3MpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDB4YjEwOToKKyAgICAgICAgaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOworICAgICAgICBpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7CisgICAgICAgICAgICByZWdzLT5lY3ggJj0gMHhGRkZGMDAwMDsKKyAgICAgICAgICAgIHJlZ3MtPmVjeCB8PSBQY2lSZWFkMTYocmVncy0+ZWRpLFNsb3QpOworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgfQorICAgICAgICBpX3ByaW50ZigiYXg9MHglbHggY3g9MHglbHggZmxhZ3M9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgIHJlZ3MtPmVheCxyZWdzLT5lY3gscmVncy0+ZWZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAweGIxMGE6CisgICAgICAgIGlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKKyAgICAgICAgaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgeworICAgICAgICAgICAgcmVncy0+ZWN4ICY9IDA7CisgICAgICAgICAgICByZWdzLT5lY3ggfD0gUGNpUmVhZDMyKHJlZ3MtPmVkaSxTbG90KTsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCisgICAgICAgIH0KKyAgICAgICAgaV9wcmludGYoImF4PTB4JWx4IGN4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAorICAgICAgICAgICAgICAgICByZWdzLT5lYXgscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgMHhiMTBiOgorICAgICAgICBpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7CisgICAgICAgIGlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKKyAgICAgICAgICAgIFBjaVdyaXRlOChyZWdzLT5lZGksKENBUkQ4KXJlZ3MtPmVjeCxTbG90KTsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCisgICAgICAgIH0KKyAgICAgICAgaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAweGIxMGM6CisgICAgICAgIGlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKKyAgICAgICAgaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgeworICAgICAgICAgICAgUGNpV3JpdGUxNihyZWdzLT5lZGksKENBUkQxNilyZWdzLT5lY3gsU2xvdCk7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7CisgICAgICAgICAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLworICAgICAgICB9CisgICAgICAgIGlfcHJpbnRmKCJheD0weCVseCBmbGFncz0weCVseFxuIiwgcmVncy0+ZWF4LHJlZ3MtPmVmbGFncyk7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgMHhiMTBkOgorICAgICAgICBpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7CisgICAgICAgIGlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKKyAgICAgICAgICAgIFBjaVdyaXRlMzIocmVncy0+ZWRpLChDQVJEMzIpcmVncy0+ZWN4LFNsb3QpOworICAgICAgICAgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKKyAgICAgICAgICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOworICAgICAgICAgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KKyAgICAgICAgfQorICAgICAgICBpX3ByaW50ZigiYXg9MHglbHggZmxhZ3M9MHglbHhcbiIsIHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOworICAgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2lvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5ZTI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW8uYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCisjaW5jbHVkZSA8c3lzL2lvLmg+CisjZW5kaWYKKyNpbmNsdWRlICJBc21NYWNyb3MuaCIKKyNpbmNsdWRlICJ2ODZiaW9zLmgiCisjaW5jbHVkZSAicGNpLmgiCisKK2ludCByX2luYiA9IDAsIHJfaW53ID0gMCwgcl9pbmwgPSAwLCByX291dGIgPSAwLCByX291dHcgPSAwLCByX291dGwgPSAwOworaW50IGluX2IgPSAwLCBpbl93ID0gMCwgaW5fbCA9IDAsIG91dF9iID0gMCwgb3V0X3cgPSAwLCBvdXRfbCA9IDA7CisKKworaW50Citwb3J0X3JlcF9pbmIoQ0FSRDE2IHBvcnQsIENBUkQ4ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCit7CisgICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKKyAgICBDQVJEOCAqZHN0ID0gYmFzZTsKKyAgICAKKyAgICBwX3ByaW50ZigiIHJlcF9pbnNiKCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAorICAgICAgICAgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOworICAgIGlmIChDb25maWcuUHJpbnRJcCkKKyAgICAgICAgcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKKyAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOworCisgICAgcl9pbmIrKzsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAqZHN0ID0gaW5iKHBvcnQpOworICAgICAgICBkc3QgKz0gaW5jOworICAgIH0KKyAgICByZXR1cm4gKGRzdC1iYXNlKTsKK30KKworaW50Citwb3J0X3JlcF9pbncoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQoreworICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7CisgICAgQ0FSRDE2ICpkc3QgPSBiYXNlOworICAgIAorICAgIHBfcHJpbnRmKCIgcmVwX2luc3coJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCisgICAgICAgICAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOworICAgIGVsc2UgcF9wcmludGYoIlxuIik7CisKKyAgICByX2ludysrOworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgICpkc3QgPSBpbncocG9ydCk7CisgICAgICAgIGRzdCArPSBpbmM7CisgICAgfQorICAgIHJldHVybiAoZHN0LWJhc2UpOworfQorCitpbnQKK3BvcnRfcmVwX2lubChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCit7CisgICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKKyAgICBDQVJEMzIgKmRzdCA9IGJhc2U7CisgICAgCisgICAgcF9wcmludGYoIiByZXBfaW5zbCglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKKyAgICAgICAgICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKKyAgICBpZiAoQ29uZmlnLlByaW50SXApCisgICAgICAgIHBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7CisgICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKKworICAgIHJfaW5sKys7CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgKmRzdCA9IGlubChwb3J0KTsKKyAgICAgICAgZHN0ICs9IGluYzsKKyAgICB9CisgICAgcmV0dXJuIChkc3QtYmFzZSk7Cit9CisKK2ludAorcG9ydF9yZXBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKK3sKKyAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOworICAgIENBUkQ4ICpkc3QgPSBiYXNlOworICAgIAorICAgIHBfcHJpbnRmKCIgcmVwX291dGIoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCisgICAgICAgICAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOworICAgIGVsc2UgcF9wcmludGYoIlxuIik7CisKKyAgICByX291dGIrKzsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBvdXRiKHBvcnQsKmRzdCk7CisgICAgICAgIGRzdCArPSBpbmM7CisgICAgfQorICAgIHJldHVybiAoZHN0LWJhc2UpOworfQorCitpbnQKK3BvcnRfcmVwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQoreworICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7CisgICAgQ0FSRDE2ICpkc3QgPSBiYXNlOworICAgIAorICAgIHBfcHJpbnRmKCIgcmVwX291dHcoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCisgICAgICAgICAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOworICAgIGVsc2UgcF9wcmludGYoIlxuIik7CisKKyAgICByX291dHcrKzsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBvdXR3KHBvcnQsKmRzdCk7CisgICAgICAgIGRzdCArPSBpbmM7CisgICAgfQorICAgIHJldHVybiAoZHN0LWJhc2UpOworfQorCitpbnQKK3BvcnRfcmVwX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQoreworICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7CisgICAgQ0FSRDMyICpkc3QgPSBiYXNlOworICAgIAorICAgIHBfcHJpbnRmKCIgcmVwX291dGwoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCisgICAgICAgICAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOworICAgIGVsc2UgcF9wcmludGYoIlxuIik7CisKKyAgICByX291dGwrKzsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBvdXRsKHBvcnQsKmRzdCk7CisgICAgICAgIGRzdCArPSBpbmM7CisgICAgfQorICAgIHJldHVybiAoZHN0LWJhc2UpOworfQorCitDQVJEOAorcF9pbmIoQ0FSRDE2IHBvcnQpCit7CisgICAgQ0FSRDggdmFsID0gMDsKKyAgICBpbl9iKys7CisgICAgdmFsID0gaW5iKHBvcnQpOworICAgIHBfcHJpbnRmKCIgaW5iKCUjeCkgPSAlMi4yeCIscG9ydCx2YWwpOworICAgIGlmIChDb25maWcuUHJpbnRJcCkKKyAgICAgICAgcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKKyAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHZhbDsKK30KKworQ0FSRDE2CitwX2ludyhDQVJEMTYgcG9ydCkKK3sKKyAgICBDQVJEMTYgdmFsID0gMDsKKyAgICBpbl93Kys7CisgICAgdmFsID0gaW53KHBvcnQpOworICAgIHBfcHJpbnRmKCIgaW53KCUjeCkgPSAlNC40eCIscG9ydCx2YWwpOworICAgIGlmIChDb25maWcuUHJpbnRJcCkKKyAgICAgICAgcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKKyAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHZhbDsKK30KKworQ0FSRDMyCitwX2lubChDQVJEMTYgcG9ydCkKK3sKKyAgICBDQVJEMzIgdmFsID0gMDsKKyAgICBpbl9sKys7CisjaWZkZWYgTkVFRF9QQ0lfSU8KKyAgICBpZiAoY2ZnMWluKHBvcnQsJnZhbCkpCisgICAgICAgIHJldHVybiB2YWw7CisgICAgZWxzZQorI2VuZGlmCisgICAgdmFsID0gaW5sKHBvcnQpOworICAgIHBfcHJpbnRmKCIgaW5sKCUjeCkgPSAlOC44eCIscG9ydCx2YWwpOworICAgIGlmIChDb25maWcuUHJpbnRJcCkKKyAgICAgICAgcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKKyAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHZhbDsKK30KKwordm9pZAorcF9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCB2YWwpCit7CisgICAgb3V0X2IrKzsKKyAgICBwX3ByaW50ZigiIG91dGIoJSN4LCAlMi4yeCkiLHBvcnQsdmFsKTsKKyAgICBpZiAoQ29uZmlnLlByaW50SXApCisgICAgICAgIHBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7CisgICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKKworICAgIG91dGIocG9ydCx2YWwpOworfQorCit2b2lkCitwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiB2YWwpCit7CisgICAgb3V0X3crKzsKKyAgICBwX3ByaW50ZigiIG91dHcoJSN4LCAlNC40eCkiLHBvcnQsdmFsKTsKKyAgICBpZiAoQ29uZmlnLlByaW50SXApCisgICAgICAgIHBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7CisgICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKKworICAgIG91dHcocG9ydCx2YWwpOworfQorCit2b2lkCitwX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiB2YWwpCit7CisgICAgb3V0X2wrKzsKKyAgICBwX3ByaW50ZigiIG91dGwoJSN4LCAlOC44eCkiLHBvcnQsdmFsKTsKKyAgICBpZiAoQ29uZmlnLlByaW50SXApCisgICAgICAgIHBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7CisgICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKKworI2lmZGVmIE5FRURfUENJX0lPCisgICAgaWYgKGNmZzFvdXQocG9ydCx2YWwpKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKyAgICBvdXRsKHBvcnQsdmFsKTsKK30KKwordm9pZAoraW9fc3RhdGlzdGljcyh2b2lkKQoreworICAgIHBfcHJpbnRmKCJyZXA6IGluYjogJWksIGludzogJWksIGlubDogJWksIG91dGI6ICVpLCBvdXR3OiAlaSwgb3V0bDogJWlcbiIsCisgICAgICAgICByX2luYixyX2ludyxyX2lubCxyX291dGIscl9vdXR3LHJfb3V0bCk7CisgICAgcF9wcmludGYoImluYjogJWksIGludzogJWksIGlubDogJWksIG91dGI6ICVpLCBvdXR3OiAlaSwgb3V0bDogJWlcbiIsCisgICAgICAgICBpbl9iLGluX3csaW5fbCxvdXRfYixvdXRfdyxvdXRfbCk7Cit9CisKK3ZvaWQKK2NsZWFyX3N0YXQodm9pZCkKK3sKKyAgICByX2luYiA9IHJfaW53ID0gcl9pbmwgPSByX291dGIgPSByX291dHcgPSByX291dGwgPSAwOworICAgIGluX2IgPSBpbl93ID0gaW5fbCA9IG91dF9iID0gb3V0X3cgPSBvdXRfbCA9IDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2xleC5sIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9sZXgubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTMzOTFjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9sZXgubApAQCAtMCwwICsxLDc5IEBACisleworI2luY2x1ZGUgInBhcnNlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworIHZvaWQgZ2V0bGluZShjaGFyICpidWYsaW50ICpudW0saW50IG1heF9udW0pOworICAgIAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSB7XAorICAgICAgZ2V0bGluZShidWYsJnJlc3VsdCxtYXhfc2l6ZSk7XAorICAgICAgfQorCisgdm9pZAorIHl5ZXJyb3IgKGNoYXIgKnMpICAKKyB7CisgICAgIHByaW50ZiAoIiVzXG4iLCBzKTsKKyB9CisKKyV9CisKK0RJR0lUIFswLTlhLWZBLUZdCisKKyUlCisKKyIweCI/e0RJR0lUfSsgeyB5eWx2YWwgPSBzdHJ0b2woeXl0ZXh0LE5VTEwsMCk7IHJldHVybiBUT0tfTlVNOyB9CisiYXgiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfQVg7IH0KKyJieCIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19CWDsgfQorImN4IiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0NYOyB9CisiZHgiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfRFg7IH0KKyJkaSIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19TSTsgfQorInNpIiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0RJOyB9CisiZHMiICAgICAgICAgIHsgcmV0dXJuIFRPS19TRUdfRFM7IH0KKyJlcyIgICAgICAgICAgeyByZXR1cm4gVE9LX1NFR19FUzsgfQorIjoiICAgICAgICAgICB7IHJldHVybiBUT0tfU0VQO30KKyIkIntESUdJVH17MSwyfSB7IHl5bHZhbCA9IHN0cnRvbCh5eXRleHQrMSxOVUxMLDApOyByZXR1cm4gVE9LX1ZBUjsgfQorIiRtZW0iICAgICAgICB7IHJldHVybiBUT0tfVkFSX01FTTsgfQorWyBcdF0rCisiIyIuKltcbl0gICB7IHJldHVybiBUT0tfRU5EOyB9CisiYm9vdCIgICAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX0JPT1Q7IH0KKyJkbyIgICAgICAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfRVhFQzsgfQorIlwiIi4qIlwiIiAgICB7IHl5bHZhbCA9ICh1bnNpZ25lZCBsb25nKSB5eXRleHQ7IHJldHVybiBUT0tfU1RSSU5HOyB9CisiYnl0ZSIgICAgICAgIHsgcmV0dXJuIFRPS19CWVRFOyB9Cisid29yZCIgICAgICAgIHsgcmV0dXJuIFRPS19XT1JEOyB9CisibG9uZyIgICAgICAgIHsgcmV0dXJuIFRPS19MT05HOyB9Cisic2V0bWVtIiAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX01FTVNFVDsgfQorImR1bXBtZW0iICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9NRU1EVU1QOyB9CisicXVpdCIgICAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX1FVSVQ7IH0KKyJcbiIgICAgICAgICAgeyByZXR1cm4gVE9LX0VORDsgfQorInNlbGVjdCIgICAgICB7IHJldHVybiBUT0tfU0VMRUNUOyB9CisiaXNhIiAgICAgICAgIHsgcmV0dXJuIFRPS19JU0E7IH0KKyJwY2kiICAgICAgICAgeyByZXR1cm4gVE9LX1BDSTsgfQorInBwb3J0IiAgICAgICB7IHJldHVybiBUT0tfUFJJTlRfUE9SVDsgfQorImlvc3RhdCIgICAgICB7IHJldHVybiBUT0tfSU9TVEFUOyB9CisicGlycSIgICAgICAgIHsgcmV0dXJuIFRPS19QUklOVF9JUlE7IH0KKyJwcGNpIiAgICAgICAgeyByZXR1cm4gVE9LX1BQQ0k7IH0KKyJwaXAiICAgICAgICAgeyByZXR1cm4gVE9LX1BJUDsgfQorInRyYWNlIiAgICAgICB7IHJldHVybiBUT0tfVFJBQ0U7IH0KKyJvbiIgICAgICAgICAgeyByZXR1cm4gVE9LX09OOyB9Cisib2ZmIiAgICAgICAgIHsgcmV0dXJuIFRPS19PRkY7IH0KKyJ2ZXJib3NlIiAgICAgeyByZXR1cm4gVE9LX1ZFUkJPU0U7IH0KKyJsb2ciICAgICAgICAgeyByZXR1cm4gVE9LX0xPRzsgfQorInByaW50IiAgICAgICB7IHJldHVybiBUT0tfU1RET1VUOyB9CisiY2xzdGF0IiAgICAgIHsgcmV0dXJuIFRPS19DTFNUQVQ7IH0KKyJobHQiICAgICAgICAgeyByZXR1cm4gVE9LX0hMVDsgfQorImRlbCIgICAgICAgICB7IHJldHVybiBUT0tfREVMOyB9CisiaW9wZXJtIiAgICAgIHsgcmV0dXJuIFRPS19JT1BFUk07IH0KKyJscGNpIiAgICAgICAgeyByZXR1cm4gVE9LX0RVTVBfUENJOyB9CisiYm9vdGJpb3MiICAgIHsgcmV0dXJuIFRPS19CT09UX0JJT1M7IH0KKyI/IiAgICAgICAgICAgeyByZXR1cm4gJz8nOyB9CisuICAgICAgICAgICAgIHsgcmV0dXJuIFRPS19FUlJPUjsgfQorICAgIAorJSUKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWluLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNkMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWluLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKKyAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjZGVmaW5lIERFTEVURQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQorI2luY2x1ZGUgPHN5cy9pby5oPgorI2VsaWYgZGVmaW5lZChIQVZFX1NZU19QRVJNKQorI2luY2x1ZGUgPHN5cy9wZXJtLmg+CisjZW5kaWYKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY4NmJpb3MuaCIKKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJBc21NYWNyb3MuaCIKKworI2RlZmluZSBTSVpFIDB4MTAwMDAwCisjZGVmaW5lIFZSQU1fU1RBUlQgMHhBMDAwMAorI2RlZmluZSBWUkFNX1NJWkUgMHgxRkZGRgorI2RlZmluZSBWX0JJT1NfU0laRSAweDFGRkZGCisjZGVmaW5lIEJJT1NfU1RBUlQgMHg3QzAwICAgICAgICAgICAgLyogZGVmYXVsdCBCSU9TIGVudHJ5ICovCisKKy8vQ0FSRDggY29kZVtdID0geyAweGI4ICwgMHhmMCAsIDB4ZjAsIDB4ZjQgfTsKKyNkZWZpbmUgVkJfWCh4KSAoVl9CSU9TID4+IHgpICYgMHhGRgorQ0FSRDggY29kZVtdID0geyAweDlhLCAweDAzLCAweDAwLCAweDAwLCBWQl9YKDEyKSwgMHhmNCB9OworLy9DQVJEOCBjb2RlW10gPSB7IDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGI4LCAweDAzLCAweDAwLAorLy8weGNkLCAweDEwLCAweGY0IH07CisvL0NBUkQ4IGNvZGVbXSA9IHsgIDB4YjggLCAweGYwICwgMHhmMCAsMHhmNCB9OworCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQpOworc3RhdGljIGludCBtYXAodm9pZCk7CitzdGF0aWMgdm9pZCB1bm1hcCh2b2lkKTsKK3N0YXRpYyB2b2lkIGJvb3RCSU9TKENBUkQxNiBheCk7CitzdGF0aWMgaW50IG1hcF92cmFtKHZvaWQpOworc3RhdGljIHZvaWQgdW5tYXBfdnJhbSh2b2lkKTsKK3N0YXRpYyBpbnQgY29weV92Ymlvcyh2b2lkKTsKK3N0YXRpYyBpbnQgY29weV9zeXNfYmlvcyh2b2lkKTsKK3N0YXRpYyB2b2lkIHNhdmVfYmlvc190b19maWxlKHZvaWQpOworc3RhdGljIGludCBzZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKTsKK3N0YXRpYyB2b2lkIHNldHVwX2ludF92ZWN0KHZvaWQpOworc3RhdGljIGludCBjaGtzdW0oQ0FSRDggKnN0YXJ0KTsKK3N0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpOworCit2b2lkIGxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCAqY29kZSk7Cit2b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgaW50IHZyYW1fbWFwcGVkID0gMDsKK3N0YXRpYyBDQVJEOCBzYXZlX21zcjsKK3N0YXRpYyBDQVJEOCBzYXZlX3BvczEwMjsKK3N0YXRpYyBDQVJEOCBzYXZlX3ZzZTsKK3N0YXRpYyBDQVJEOCBzYXZlXzQ2ZTg7Citjb25zb2xlIENvbnNvbGU7CitzdHJ1Y3QgY29uZmlnIENvbmZpZzsKKworCitpbnQKK21haW4odm9pZCkKK3sKKyAgICBpbnQgQWN0aXZlX2lzX1BjaSA9IDA7CisjaWZkZWYgREVMRVRFCisgICAgQ29uZmlnLlByaW50UG9ydCA9IFBSSU5UX1BPUlQ7CisgICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IElPX1NUQVRJU1RJQ1M7CisgICAgQ29uZmlnLlByaW50SXJxID0gUFJJTlRfSVJROworICAgIENvbmZpZy5QcmludFBjaSA9IFBSSU5UX1BDSTsKKyAgICBDb25maWcuU2hvd0FsbERldiA9IFNIT1dfQUxMX0RFVjsgICAgICAgIAorICAgIENvbmZpZy5QcmludElwID0gUFJJTlRfSVA7ICAgICAgICAgICAKKyAgICBDb25maWcuU2F2ZUJpb3MgPSBTQVZFX0JJT1M7ICAgICAgICAgIAorICAgIENvbmZpZy5UcmFjZSA9IFRSQUNFOyAgICAgICAgICAgICAKKyAgICBDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IENPTkZJR19BQ1RJVkVfT05MWTsgIAorICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsKKyAgICBDb25maWcuTWFwU3lzQmlvcyA9IE1BUF9TWVNfQklPUzsgICAgICAgIAorICAgIENvbmZpZy5SZXNvcnQgPSBSRVNPUlQ7ICAgICAgICAgICAgCisgICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007ICAgICAgICAgICAgCisgICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7ICAgICAgICAgCisgICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOworCisgICAgaWYgKCFtYXAoKSkKKyAgICAgICAgZXhpdCgxKTsKKyAgICAKKyAgICBpZiAoIXNldHVwX3N5c3RlbV9iaW9zKCkpCisgICAgICAgIGV4aXQoMSk7CisgICAgCisgICAgaW9wbCgzKTsKKyAgICBzZXR1cF9pbygpOworICAgIAorICAgIHNjYW5fcGNpKCk7CisgICAgaWYgKCFDdXJyZW50UGNpICYmICFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlICYmICFDb25maWcuQ29uZmlnQWN0aXZlT25seSkKKyAgICAgICAgZXhpdCAoMSk7CisjZW5kaWYKKyAgICBDb25zb2xlID0gb3Blbl9jb25zb2xlKCk7CisKKyAgICBpZiAoQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpIHsKKyAgICAgICAgQ0FSRDE2IGF4OworICAgICAgICBpbnQgYWN0aXZlUGNpID0gMDsKKyAgICAgICAgaW50IGVycm9yID0gMDsKKyAgICAgICAgCisgICAgICAgIHdoaWxlIChDdXJyZW50UGNpKSB7CisgICAgICAgICAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlUGNpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtYXBQY2lSb20oTlVMTCkgJiYgY2hrc3VtKChDQVJEOCopVl9CSU9TKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGF4ID0gKChDQVJEMTYpKEN1cnJlbnRQY2ktPmJ1cykgPDwgOCkKKyAgICAgICAgICAgIHwgKEN1cnJlbnRQY2ktPmRldiA8PCAzKSB8IChDdXJyZW50UGNpLT5mdW5jICYgMHg3KTsKKyAgICAgICAgUF9wcmludGYoImF4OiAweCV4XG4iLGF4KTsKKyAgICAgICAgc2V0dXBfaW50X3ZlY3QoKTsKKyAgICAgICAgaWYgKCFlcnJvciAmJiAoYWN0aXZlUGNpIHx8IGNvcHlfdmJpb3MoKSkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKKyAgICAgICAgICAgIGlmICAobWFwX3ZyYW0oKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIElTQVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdEJJT1MoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5tYXBfdnJhbSgpOworICAgICAgICBzbGVlcCgxKTsgICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZGlzYWJsZSBwcmltYXJ5IGNhcmQgKi8KKyAgICAgICAgc2F2ZV9tc3IgPSBpbmIoMHgzQ0MpOworICAgICAgICBzYXZlX3ZzZSA9IGluYigweDNDMyk7CisgICAgICAgIHNhdmVfNDZlOCA9IGluYigweDQ2ZTgpOworICAgICAgICBzYXZlX3BvczEwMiA9IGluYigweDEwMik7CisgICAgICAgIAorICAgICAgICBzaWduYWwoMixzaWdfaGFuZGxlcik7CisgICAgICAgIHNpZ25hbCgxMSxzaWdfaGFuZGxlcik7CisgICAgICAgIAorICAgICAgICBvdXRiKDB4M0MyLH4oQ0FSRDgpMHgwMyAmIHNhdmVfbXNyKTsKKyAgICAgICAgb3V0YigweDNDMyx+KENBUkQ4KTB4MDEgJiBzYXZlX3ZzZSk7CisgICAgICAgIG91dGIoMHg0NmU4LCB+KENBUkQ4KTB4MDggJiBzYXZlXzQ2ZTgpOworICAgICAgICBvdXRiKDB4MTAyLCB+KENBUkQ4KTB4MDEgJiBzYXZlX3BvczEwMik7CisgICAgICAgIAorICAgICAgICBwY2lWaWRlb0Rpc2FibGUoKTsKKyAgICAgICAgCisgICAgICAgIHdoaWxlIChDdXJyZW50UGNpKSB7CisgICAgICAgICAgICBDQVJEMTYgYXg7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVfaXNfUGNpID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgRW5hYmxlQ3VycmVudCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOworICAgICAgICAgICAgICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOworICAgICAgICAgICAgICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKKyAgICAgICAgICAgICAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGNsZWFyIGludGVycnVwdCB2ZWN0b3JzICovCisgICAgICAgICAgICBzZXR1cF9pbnRfdmVjdCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBheCA9ICgoQ0FSRDE2KShDdXJyZW50UGNpLT5idXMpIDw8IDgpCisgICAgICAgICAgICAgICAgfCAoQ3VycmVudFBjaS0+ZGV2IDw8IDMpIHwgKEN1cnJlbnRQY2ktPmZ1bmMgJiAweDcpOworICAgICAgICAgICAgUF9wcmludGYoImF4OiAweCV4XG4iLGF4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCEoKG1hcFBjaVJvbShOVUxMKSAmJiBjaGtzdW0oKENBUkQ4KilWX0JJT1MpKQorICAgICAgICAgICAgICAgICAgfHwgKEN1cnJlbnRQY2ktPmFjdGl2ZSAmJiBjb3B5X3ZiaW9zKCkpKSkgeworICAgICAgICAgICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXBfdnJhbSgpKSB7CisgICAgICAgICAgICAgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOworICAgICAgICAgICAgcHJpbnRmKCJpbml0aWFsaXppbmcgUENJIGJ1czogJWkgZGV2OiAlaSBmdW5jOiAlaVxuIixDdXJyZW50UGNpLT5idXMsCisgICAgICAgICAgICAgICAgICAgQ3VycmVudFBjaS0+ZGV2LEN1cnJlbnRQY2ktPmZ1bmMpOworICAgICAgICAgICAgYm9vdEJJT1MoYXgpOworICAgICAgICAgICAgdW5tYXBfdnJhbSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogV2UgaGF2ZSBhbiBJU0EgZGV2aWNlIC0gY29uZmlndXJlIGlmIHJlcXVlc3RlZCAqLworICAgICAgICBpZiAoIUFjdGl2ZV9pc19QY2kgJiYgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSkgeworICAgICAgICAgICAgcGNpVmlkZW9EaXNhYmxlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKKyAgICAgICAgICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOworICAgICAgICAgICAgb3V0YigweDNDMywgc2F2ZV92c2UpOworICAgICAgICAgICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOworCisgICAgICAgICAgICBzZXR1cF9pbnRfdmVjdCgpOworICAgICAgICAgICAgaWYgKGNvcHlfdmJpb3MoKSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7CisgICAgICAgICAgICAgICAgaWYgIChtYXBfdnJhbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIElTQVxuIik7CisgICAgICAgICAgICAgICAgICAgIGJvb3RCSU9TKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICB1bm1hcF92cmFtKCk7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcGNpVmlkZW9SZXN0b3JlKCk7CisKKyAgICAgICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOworICAgICAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKKyAgICAgICAgb3V0YigweDNDMywgc2F2ZV92c2UpOworICAgICAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7CisgICAgfQorICAgIAorICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7CisjaWZkZWYgREVMRVRFCisgICAgaW9wbCgwKTsKKyAgICB1bm1hcCgpOworCisgICAgcHJpbnRmKCJkb25lICFcbiIpOworI2VuZGlmCisgICAgaWYgKENvbmZpZy5Jb1N0YXRpc3RpY3MpCisgICAgICAgIGlvX3N0YXRpc3RpY3MoKTsKKyNpZmRlZiBERUxFVEUKKyAgICBleGl0KDApOworI2VuZGlmCit9CisKK2ludCAgCittYXAodm9pZCkKK3sKKyAgICB2b2lkKiBtZW07CisKKyAgICBtZW0gPSBtbWFwKDAsIChzaXplX3QpU0laRSwKKyAgICAgICAgICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAorICAgICAgICAgICAgICAgLTEsIDAgKTsgCisgICAgaWYgKG1lbSAhPSAwKSB7CisgICAgICAgIHBlcnJvcigiYW5vbnltb3VzIG1hcCIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICBtZW1zZXQobWVtLDAsU0laRSk7CisKKyAgICBsb2FkQ29kZVRvTWVtKCh1bnNpZ25lZCBjaGFyICopIEJJT1NfU1RBUlQsIGNvZGUpOworICAgIHJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCit1bm1hcCh2b2lkKQoreworICAgIG11bm1hcCgwLFNJWkUpOworfQorCitzdGF0aWMgdm9pZAorYm9vdEJJT1MoQ0FSRDE2IGF4KQoreworICAgIGk4NmJpb3NSZWdzIGJSZWdzOworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOworI2VuZGlmCisgICAgc2V0dXBfYmlvc19yZWdzKCZiUmVncywgYXgpOworICAgIGRvX3g4NihCSU9TX1NUQVJULCZiUmVncyk7CisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIHByaW50ZigiZG9uZVxuIik7CisjZW5kaWYKK30KKworc3RhdGljIGludAorbWFwX3ZyYW0odm9pZCkKK3sKKyAgICBpbnQgbWVtX2ZkOworCisjaWZkZWYgX19pYTY0X18KKyAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkgCisjZWxzZQorICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKSAKKyNlbmRpZgorICAgICAgeworICAgICAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmbmRlZiBfX2FscGhhX18KKyAgICBpZiAobW1hcCgodm9pZCAqKSBWUkFNX1NUQVJULCAoc2l6ZV90KSBWUkFNX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAgbWVtX2ZkLCBWUkFNX1NUQVJUKSA9PSAodm9pZCAqKSAtMSkgCisjZWxzZQorICAgICAgICAgaWYgKCFfYnVzX2Jhc2UoKSkgc3BhcnNlX3NoaWZ0ID0gNzsgLyogVWgsIG9oLCBKRU5TRU4uLi4gKi8KKyAgICAgICAgIGlmICghX2J1c19iYXNlX3NwYXJzZSgpKSBzcGFyc2Vfc2hpZnQgPSAwOworICAgICAgICAgaWYgKCh2cmFtX21hcCA9IG1tYXAoMCwoc2l6ZV90KSAoVlJBTV9TSVpFIDw8IHNwYXJzZV9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9mZCwgKFZSQU1fU1RBUlQgPDwgc3BhcnNlX3NoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgX2J1c19iYXNlX3NwYXJzZSgpKSkgPT0gKHZvaWQgKikgLTEpCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKKyAgICAgICAgICAgIGNsb3NlKG1lbV9mZCk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgdnJhbV9tYXBwZWQgPSAxOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK3VubWFwX3ZyYW0odm9pZCkKK3sKKyAgICBpZiAoIXZyYW1fbWFwcGVkKSByZXR1cm47CisgICAgCisgICAgbXVubWFwKCh2b2lkKilWUkFNX1NUQVJULFZSQU1fU0laRSk7CisgICAgdnJhbV9tYXBwZWQgPSAwOworfQorCitzdGF0aWMgaW50Citjb3B5X3ZiaW9zKHZvaWQpCit7CisgICAgaW50IG1lbV9mZDsKKyAgICB1bnNpZ25lZCBjaGFyICp0bXA7CisgICAgaW50IHNpemU7CisKKyAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7CisgICAgICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgVl9CSU9TLCBTRUVLX1NFVCkgIT0gKG9mZl90KSBWX0JJT1MpIHsgCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCBsc2Vla1xuIik7CisgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB0bXAgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYygzKTsKKyAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdG1wLCAoc2l6ZV90KSAzKSAhPSAoc2l6ZV90KSAzKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgVl9CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFZfQklPUykgCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoKnRtcCAhPSAweDU1IHx8ICoodG1wKzEpICE9IDB4QUEgKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7CisjZW5kaWYKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIk5vIGJpb3MgZm91bmQgYXQ6IDB4JXhcbiIsVl9CSU9TKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgc2l6ZSA9ICoodG1wKzIpICogNTEyOworCisgICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKVZfQklPUywgKHNpemVfdCkgc2l6ZSkgIT0gKHNpemVfdCkgc2l6ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgZnJlZSh0bXApOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgaWYgKCFjaGtzdW0oKENBUkQ4KVZfQklPUykpCisgICAgICAgIHJldHVybiAoMCk7CisKKyAgICByZXR1cm4gKDEpOworCitFcnJvcjoKKyAgICBwZXJyb3IoInZfYmlvcyIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorY29weV9zeXNfYmlvcyh2b2lkKQoreworI2RlZmluZSBTWVNfQklPUyAweEYwMDAwCisgICAgaW50IG1lbV9mZDsKKworICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKKyAgICAgICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgCisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFNZU19CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFNZU19CSU9TKSAKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopU1lTX0JJT1MsIChzaXplX3QpIDB4RkZGRikgIT0gKHNpemVfdCkgMHhGRkZGKSAKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgxKTsKKworRXJyb3I6CisgICAgcGVycm9yKCJzeXNfYmlvcyIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgwKTsKK30KKwordm9pZAorbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4IGNvZGVbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBDQVJEOCB2YWw7CisgICAgCisgICAgZm9yICggaT0wOztpKyspIHsKKyAgICAgICAgdmFsID0gY29kZVtpXTsKKyAgICAgICAgKnB0cisrID0gdmFsOworICAgICAgICBpZiAodmFsID09IDB4ZjQpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisgICAgICAgIAordm9pZCAKK2RwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgaW50IGksajsKKyAgICBjaGFyICpjID0gKGNoYXIgKilzdGFydDsKKworICAgIGZvciAoaiA9IDA7IGogPCAoc2l6ZSA+PiA0KTsgaisrKSB7CisgICAgY2hhciAqZCA9IGM7CisgICAgcHJpbnRmKCJcbjB4JWx4OiAgIiwodW5zaWduZWQgbG9uZyljKTsKKyAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspIAorICAgICAgICBwcmludGYoIiUyLjJ4ICIsKHVuc2lnbmVkIGNoYXIpICgqKGMrKykpKTsKKyAgICBjID0gZDsKKyAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYyIsKCgoKENBUkQ4KSgqYykpID4gMzIpICYmICgoKENBUkQ4KSgqYykpIDwgMTI4KSkgPworICAgICAgICAgICAodW5zaWduZWQgY2hhcikgKCooYykpOiAnLicpOworICAgICAgICBjKys7CisgICAgfQorICAgIH0KKyAgICBwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgbnVtID0gMDsKKyAgICBpbnQgc2l6ZSwgY291bnQ7CisgICAgY2hhciBmaWxlX25hbWVbMjU2XTsKKyAgICBpbnQgZmQ7CisgICAgCisgICAgc3ByaW50ZihmaWxlX25hbWUsImJpb3NfJWkuZmlsIixudW0pOworICAgIGlmICgoZmQgPSAgb3BlbihmaWxlX25hbWUsT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywwMDY0NCkpID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgc2l6ZSA9ICgqKHVuc2lnbmVkIGNoYXIqKShWX0JJT1MgKyAyKSkgKiA1MTI7CisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIGRwcmludChWX0JJT1MsMjApOworI2VuZGlmCisgICAgaWYgKChjb3VudCA9IHdyaXRlKGZkLCh2b2lkICopKFZfQklPUyksc2l6ZSkpICE9IHNpemUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCJvbmx5IHNhdmVkICVpIG9mICVpIGJ5dGVzXG4iLHNpemUsY291bnQpOworICAgIG51bSsrOworfQorCitzdGF0aWMgdm9pZAorc2lnX2hhbmRsZXIoaW50IHVudXNlZCkKK3sKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKworICAgIC8qIHB1dCBzeXN0ZW0gYmFjayBpbiBhIHNhdmUgc3RhdGUgKi8KKyAgICB1bm1hcF92cmFtKCk7CisgICAgcGNpVmlkZW9SZXN0b3JlKCk7CisgICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOworICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOworICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKKyAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7CisKKyAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOworICAgIGlvcGwoMCk7CisgICAgdW5tYXAoKTsKKworICAgIGV4aXQoMSk7Cit9CisKKy8qCisgKiBGb3IgaW5pdGlhbGl6YXRpb24gd2UganVzdCBwYXNzIGF4IHRvIHRoZSBCSU9TLgorICogUENJIEJJT1NlcyBuZWVkIHRoaXMuIEFsbCBvdGhlciByZWdpc3RlciBhcmUgc2V0IDAuCisgKi8KK3N0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpCit7CisgICAgcmVncy0+YXggPSBheDsKKyAgICByZWdzLT5ieCA9IDA7CisgICAgcmVncy0+Y3ggPSAwOworICAgIHJlZ3MtPmR4ID0gMDsKKyAgICByZWdzLT5lcyA9IDA7CisgICAgcmVncy0+ZGkgPSAwOworfQorCisvKgorICogaGVyZSB3ZSBhcmUgcmVhbGx5IHBhcmFub2lkIGFib3V0IGZha2luZyBhICJyZWFsIgorICogQklPUy4gTW9zdCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBwdWxsZWQgZnJvbQorICogZG9zZW0uCisgKi8KK3N0YXRpYyB2b2lkCitzZXR1cF9pbnRfdmVjdCh2b2lkKQoreworICAgIGNvbnN0IENBUkQxNiBjcyA9IDB4MDAwMDsKKyAgICBjb25zdCBDQVJEMTYgaXAgPSAweDA7CisgICAgaW50IGk7CisgICAgCisgICAgLyogbGV0IHRoZSBpbnQgdmVjdHMgcG9pbnQgdG8gdGhlIFNZU19CSU9TIHNlZyAqLworICAgIGZvciAoaT0wOyBpPDB4ODA7IGkrKykgeworICAgICAgICAoKENBUkQxNiopMClbaTw8MV0gPSBpcDsKKyAgICAgICAgKChDQVJEMTYqKTApWyhpPDwxKSsxXSA9IGNzOworICAgIH0KKyAgICAvKiB2aWRlbyBpbnRlcnJ1cHRzIGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4NDI8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDQyPDwxXSA9IDB4ZjA2NTsKKyAgICAoKENBUkQxNiopMClbKDB4MTA8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDEwPDwxXSA9IDB4ZjA2NTsKKyAgICAvKiB2aWRlbyBwYXJhbSB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWQpICovCisgICAgKChDQVJEMTYqKTApWygweDFkPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxZDw8MV0gPSAweGYwQTQ7CisgICAgLyogZm9udCB0YWJsZXMgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFGKSAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxZjw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MWY8PDFdID0gMHhmYTZlOworCisgICAgLyogaW50IDExIGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4MTE8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MTE8PDFdID0gMHhmODRkOworICAgIC8qIGludCAxMiBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDEyPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxMjw8MV0gPSAweGY4NDE7CisgICAgLyogaW50IDE1IGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4MTU8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDE1PDwxXSA9IDB4Zjg1OTsKKyAgICAvKiBpbnQgMUEgZGVmYXVsdCBsb2NhdGlvbiAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxYTw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MWE8PDFdID0gMHhmZjZlOworICAgIC8qIGludCAwNSBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDA1PDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgwNTw8MV0gPSAweGZmNTQ7CisgICAgLyogaW50IDA4IGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4ODw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4ODw8MV0gPSAweGZlYTU7CisgICAgLyogaW50IDEzIGRlZmF1bHQgbG9jYXRpb24gKGZkZCkgKi8KKyAgICAoKENBUkQxNiopMClbKDB4MTM8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDEzPDwxXSA9IDB4ZWM1OTsKKyAgICAvKiBpbnQgMEUgZGVmYXVsdCBsb2NhdGlvbiAqLworICAgICgoQ0FSRDE2KikwKVsoMHhlPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHhlPDwxXSA9IDB4ZWY1NzsKKyAgICAvKiBpbnQgMTcgZGVmYXVsdCBsb2NhdGlvbiAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxNzw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MTc8PDFdID0gMHhlZmQyOworICAgIC8qIGZkZCB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWUpICovCisgICAgKChDQVJEMTYqKTApWygweDFlPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxZTw8MV0gPSAweGVmYzc7Cit9CisKK3N0YXRpYyBpbnQKK3NldHVwX3N5c3RlbV9iaW9zKHZvaWQpCit7CisgICAgY2hhciAqZGF0ZSA9ICIwNi8wMS85OSI7CisgICAgY2hhciAqZWlzYV9pZGVudCA9ICJQQ0kvSVNBIjsKKyAgICAKKyNpZiBNQVBfU1lTX0JJT1MKKyAgICBpZiAoIWNvcHlfc3lzX2Jpb3MoKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CisjZW5kaWYKKy8vICAgIG1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweGZmZjcpOworICAgIAorICAgIC8qCisgICAgICogd2UgdHJhcCB0aGUgImluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50cyIgdG8gdGhlIEJJT1MKKyAgICAgKiBhbmQgYWxsIG90aGVyIGxvY2F0aW9ucyBieSBmaWxsaW5nIHRoZW0gd2l0aCAiaGx0IgorICAgICAqIFRPRE86IGltcGxlbWVudCBobHQtaGFuZGxlciBmb3IgdGhlc2UKKyAgICAgKi8KKyAgICBtZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHgxMDAwMCk7CisKKyAgICAvKgorICAgICAqIFRPRE86IHdlIHNob3VsZCBjb3B5IHRoZSBmZGQgdGFibGUgKDB4ZmVjNTktMHhmZWM1YikKKyAgICAgKiB0aGUgdmlkZW8gcGFyYW1ldGVyIHRhYmxlICgweGYwYWMtMHhmMGZiKQorICAgICAqIGFuZCB0aGUgZm9udCB0YWJsZXMgKDB4ZmE2ZS0weGZlNmQpCisgICAgICogZnJvbSB0aGUgb3JpZ2luYWwgYmlvcyBoZXJlCisgICAgICovCisgICAgCisgICAgLyogc2V0IGJpb3MgZGF0ZSAqLworICAgIHN0cmNweSgoY2hhciAqKTB4RkZGRjUsZGF0ZSk7CisgICAgLyogc2V0IHVwIGVpc2EgaWRlbnQgc3RyaW5nICovCisgICAgc3RyY3B5KChjaGFyICopMHhGRkZEOSxlaXNhX2lkZW50KTsKKyAgICAvKiB3cml0ZSBzeXN0ZW0gbW9kZWwgaWQgZm9yIElCTS1BVCAqLworICAgICgoY2hhciAqKTApWzB4RkZGRkVdID0gMHhmYzsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGtzdW0oQ0FSRDggKnN0YXJ0KQoreworICBDQVJEMTYgc2l6ZTsKKyAgQ0FSRDggdmFsID0gMDsKKyAgaW50IGk7CisKKyAgc2l6ZSA9ICooc3RhcnQrMikgKiA1MTI7ICAKKyAgZm9yIChpID0gMDsgaTxzaXplOyBpKyspCisgICAgdmFsICs9ICooc3RhcnQgKyBpKTsKKyAgICAKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuIDE7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiQklPUyBja3N1bSB3cm9uZyFcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFrZWZpbGUubGludXggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21ha2VmaWxlLmxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZmUzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21ha2VmaWxlLmxpbnV4CkBAIC0wLDAgKzEsNTkgQEAKK0NGTEFHUz0tZyAtSS91c3IvaW5jbHVkZSAtSS4uLy4uL2luY2x1ZGUvIC1PMCAtV2FsbAorQ0M9Z2NjCisKKy55LmM6CisgICAgYmlzb24gLWQgLW8gJEAgJDwKKy5sLmM6CisgICAgZmxleCAtbyRAICQ8IAorCitTUkNTID0gbWFpbi5jIGlvLmMgeDg2ZW11LmMgaW50LmMgcGNpLmMKK09CSlMgPSBtYWluLm8gaW8ubyB4ODZlbXUubyBpbnQubyBwY2kubworCithbGwgOiB2Ymlvcy52bTg2IHY4NmJpb3Mudm04NiBjYmlvcy52bTg2IGNiaW9zLng4NmVtdSB2Ymlvcy54ODZlbXUgdjg2Ymlvcy54ODZlbXUgCisjYWxsIDogIGNiaW9zLng4NmVtdSB2Ymlvcy54ODZlbXUgdjg2Ymlvcy54ODZlbXUgCisKK3BhcnNlci5jIDogcGFyc2VyLnkKK2xleC5jIDogbGV4LmwKK2NiaW9zLm8gOiBjYmlvcy5jIHY4NmJpb3MuaCBkZWJ1Zy5oCittYWluLm8gOiBtYWluLmMgdjg2Ymlvcy5oIHBjaS5oIGRlYnVnLmgKK2lvLm8gOiB2ODZiaW9zLmggQXNtTWFjcm9zLmggZGVidWcuaAorbWVtLm8gOiBtZW0uYyBkZWJ1Zy5oIHY4NmJpb3MuaAoraW50Lm8gOiBpbnQuYyB2ODZiaW9zLmggZGVidWcuaAorcGNpLm8gOiBwY2kuYyBwY2kuaCBkZWJ1Zy5oCitjb25zb2xlLm8gOiBjb25zb2xlLmMgdjg2Ymlvcy5oIGRlYnVnLmgKK3Y4Ni5vIDogdjg2LmMgZGVidWcuaAorcGFyc2VyLm8gOiBwYXJzZXIuYworbGV4Lm8gOiBsZXguYwordjg2Ymlvcy5vOiB2ODZiaW9zLmMgdjg2Ymlvcy5oIHBjaS5oIGRlYnVnLmgKK2xvZ2dpbmcubzogbG9nZ2luZy5jIHY4NmJpb3MuaAoreDg2ZW11Lm8gOiB4ODZlbXUuYyB2ODZiaW9zLmggZGVidWcuaAorICAgICQoQ0MpIC1jIC1EWDg2RU1VICQoQ0ZMQUdTKSAkKi5jCisKK3ZiaW9zLng4NmVtdSA6IG1haW4ubyB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8KKyAgICBnY2MgLVdsLC1kZWZzeW0gLVdsLHByaW50az1scHJpbnRmIC1vIHZiaW9zLng4NmVtdSBtYWluLm8gXAorICAgIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIG1lbS5vIGxvZ2dpbmcubyBcCisgICAgLUwuLi94ODZlbXUgLWx4ODZlbXVkIC1sYyAKK3ZiaW9zLnZtODYgOiBtYWluLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vCisgICAgZ2NjIC1vIHZiaW9zLnZtODYgbWFpbi5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIFwKKyAgICBsb2dnaW5nLm8gLWxjIAorY2Jpb3MueDg2ZW11IDogY2Jpb3MubyB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8KKyAgICBnY2MgLVdsLC1kZWZzeW0gLVdsLHByaW50az1scHJpbnRmIC1vIGNiaW9zLng4NmVtdSBjYmlvcy5vIFwKKyAgICB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8gXAorICAgIC1MLi4veDg2ZW11IC1seDg2ZW11ZCAtbGMgCitjYmlvcy52bTg2IDogY2Jpb3MubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8KKyAgICBnY2MgLW8gY2Jpb3Mudm04NiBjYmlvcy5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIFwKKyAgICBsb2dnaW5nLm8gLWxjIAordjg2Ymlvcy52bTg2OiBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubworICAgICBnY2MgLW8gdjg2Ymlvcy52bTg2IGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8gdjg2Lm8gaW8ubyBcCisgICAgIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8gLUwvdXNyL2xpYi9jdXJzZXMgLWxmbCBcCisgICAgIC1scmVhZGxpbmUgLWxjIC1sbmN1cnNlcyAvdXNyL2xpYi9saWJjLmEKK3Y4NmJpb3MueDg2ZW11OiBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubworICAgIGdjYyAtV2wsLWRlZnN5bSAtV2wscHJpbnRrPWxwcmludGYgLW8gdjg2Ymlvcy54ODZlbXUgXAorICAgIGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8geDg2ZW11Lm8gaW8ubyBcCisgICAgaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubyAtTC91c3IvbGliL2N1cnNlcyAtbGZsIFwKKyAgICAtbHJlYWRsaW5lIC1sYyAtbG5jdXJzZXMgIC91c3IvbGliL2xpYmMuYSAtTC4uL3g4NmVtdSAtbHg4NmVtdWQKKworY2xlYW46CisgICAgcm0gLWYgKi5vIHZiaW9zLng4NmVtdSB2Ymlvcy52bTg2IGNiaW9zLng4NmVtdSBjYmlvcy52bTg2IHBhcnNlci5jIFwKKyAgICBsZXguYyBwYXJzZXIuaCB2ODZiaW9zLng4NmVtdSB2ODZiaW9zLnZtODYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tZW0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYzU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWVtLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKKyAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2ODZiaW9zLmgiCisjaW5jbHVkZSAieDg2ZW11LmgiCisKKyNpZmRlZiBfX2FscGhhX18KKwordm9pZCogdnJhbV9tYXAgPSAwOworaW50IHNwYXJzZV9zaGlmdCA9IDU7CisKKyNkZWZpbmUgbWVtX2JhcnJpZXIoKSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1iIiAgOiA6IDogIm1lbW9yeSIpCisKKyNkZWZpbmUgdnVpcCAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKgorCitDQVJEOAorbWVtX3JiKENBUkQzMiBhZGRyKQoreworICB1bnNpZ25lZCBsb25nIHJlc3VsdCwgc2hpZnQ7CisjaWYgMQorICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgeworICAgIGFkZHIgLT0gMHhBMDAwMDsKKyAgICBzaGlmdCA9IChhZGRyICYgMHgzKSAqIDg7CisgICAgcmVzdWx0ID0gKih2dWlwKSAoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXAgKyAoYWRkciA8PCBzcGFyc2Vfc2hpZnQpKTsKKyAgICByZXN1bHQgPj49IHNoaWZ0OworICAgIHJldHVybiAweGZmVUwgJiByZXN1bHQ7CisgIH0gZWxzZSAKKyNlbmRpZgorICAgIHJldHVybiByZGIoYWRkcik7Cit9CisKK0NBUkQxNgorbWVtX3J3KENBUkQzMiBhZGRyKQoreworICB1bnNpZ25lZCBsb25nIHJlc3VsdCwgc2hpZnQ7CisjaWYgMSAgCisgIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7CisgICAgYWRkciAtPSAweEEwMDAwOworICAgIHNoaWZ0ID0gKGFkZHIgJiAweDIpICogODsKKyAgICByZXN1bHQgPSAqKHZ1aXApKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwKyhhZGRyPDxzcGFyc2Vfc2hpZnQpCisgICAgICAgICAgICAgKygxPDwoc3BhcnNlX3NoaWZ0LTIpKSk7CisgICAgcmVzdWx0ID4+PSBzaGlmdDsKKyAgICByZXR1cm4gMHhmZmZmVUwgJiByZXN1bHQ7CisgIH0gZWxzZSAKKyNlbmRpZgorICAgIHJldHVybiByZHcoYWRkcik7Cit9CisKK0NBUkQzMgorbWVtX3JsKENBUkQzMiBhZGRyKQoreworICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKKyNpZiAxICAKKyAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKKyAgICBhZGRyIC09IDB4QTAwMDA7CisgICAgcmVzdWx0ID0gKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KSsoMzw8KHNwYXJzZV9zaGlmdC0yKSkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0gZWxzZSAKKyNlbmRpZgorICAgIHJldHVybiByZGwoYWRkcik7Cit9CisKK3ZvaWQKK21lbV93YihDQVJEMzIgYWRkciwgQ0FSRDggdmFsKQoreworICAgIHVuc2lnbmVkIGludCBiID0gdmFsICYgMHhmZlU7CisjaWYgMSAgCisgIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7CisgICAgYWRkciAtPSAweEEwMDAwOworICAgICoodnVpcCkgKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwICsgKGFkZHIgPDwgc3BhcnNlX3NoaWZ0KSkgPSBiICogMHgwMTAxMDEwMTsKKyAgICBtZW1fYmFycmllcigpOworICB9IGVsc2UgCisjZW5kaWYKKyAgICB3cmIoYWRkcix2YWwpOworfQorCit2b2lkCittZW1fd3coQ0FSRDMyIGFkZHIsIENBUkQxNiB2YWwpCit7CisgIHVuc2lnbmVkIGludCB3ID0gdmFsICYgMHhmZmZmVTsKKyNpZiAxICAKKyAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKKyAgICBhZGRyIC09IDB4QTAwMDA7CisgICAgKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KQorICAgICAgICArKDE8PChzcGFyc2Vfc2hpZnQtMikpKSA9IHcgKiAweDAwMDEwMDAxOworICAgIG1lbV9iYXJyaWVyKCk7CisgIH0gZWxzZSAKKyNlbmRpZgorICAgIHdydyhhZGRyLHZhbCk7Cit9CisKK3ZvaWQKK21lbV93bChDQVJEMzIgYWRkciwgQ0FSRDMyIHZhbCkKK3sKKyNpZiAxICAKKyAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKKyAgICBhZGRyIC09IDB4QTAwMDA7CisgICAgKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KQorICAgICAgICArKDM8PChzcGFyc2Vfc2hpZnQtMikpKSA9IHZhbDsKKyAgICBtZW1fYmFycmllcigpOworICB9IGVsc2UgCisjZW5kaWYKKyAgICB3cmwoYWRkcix2YWwpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wYXJzZXIueSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGFyc2VyLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjNDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGFyc2VyLnkKQEAgLTAsMCArMSw0OTggQEAKKyV7CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidjg2Ymlvcy5oIgorI2luY2x1ZGUgInBjaS5oIgorICAgIAorI2RlZmluZSBZWVNUWVBFIHVuc2lnbmVkIGxvbmcKKyAgICAKKyNkZWZpbmUgTUFYX1ZBUiAweDIwCisKKyAgICBDQVJEMzIgdmFyW01BWF9WQVJdOworICAgIENBUkQzMiB2YXJfbWVtOworCisKK2k4NmJpb3NSZWdzIHJlZ3MgPSB7IDAwIH07CisKK2VudW0gbWVtX3R5cGUgeyBCWVRFLCBXT1JELCBMT05HLCBTVFJJTkcgfTsKK3VuaW9uIG1lbV92YWwgeworICAgQ0FSRDMyIGludGVnZXI7CisgICBjaGFyICpwdHI7Cit9IHJlYzsKKworc3RydWN0IG1lbSB7CisgICAgZW51bSBtZW1fdHlwZSB0eXBlOworICAgICAgICB1bmlvbiBtZW1fdmFsIHZhbDsKKyAgICBzdHJ1Y3QgbWVtICpuZXh0OworfTsgCisKKyAKK3N0cnVjdCBkZXZpY2UgRGV2aWNlID0ge0ZBTFNFLE5PTkUsezB9fTsKKworZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyICpzKTsKK2V4dGVybiBpbnQgeXlsZXgoIHZvaWQgICk7CisgCitzdGF0aWMgdm9pZCBib290KHZvaWQpOworc3RhdGljIHZvaWQgZHVtcF9tZW0oQ0FSRDMyIGFkZHIsIGludCBsZW4pOworc3RhdGljIHZvaWQgZXhlY19pbnQoaW50IG51bSk7CitzdGF0aWMgdm9pZCAqYWRkX3RvX2xpc3QoZW51bSBtZW1fdHlwZSB0eXBlLCB1bmlvbiBtZW1fdmFsICpyZWMsIHZvaWQgKm5leHQpOworc3RhdGljIHZvaWQgZG9fbGlzdChzdHJ1Y3QgbWVtICpsaXN0LCBtZW1UeXBlIGFkZHIpOworc3RhdGljIGNoYXIgKiBub3JtYWxpemVfc3RyaW5nKGNoYXIgKnB0cik7CislfQorCisldG9rZW4gVE9LX05VTQorJXRva2VuIFRPS19SRUdfQVgKKyV0b2tlbiBUT0tfUkVHX0JYCisldG9rZW4gVE9LX1JFR19DWAorJXRva2VuIFRPS19SRUdfRFgKKyV0b2tlbiBUT0tfUkVHX0RJCisldG9rZW4gVE9LX1JFR19TSQorJXRva2VuIFRPS19TRUdfRFMKKyV0b2tlbiBUT0tfU0VHX0VTCisldG9rZW4gVE9LX1NFUAorJXRva2VuIFRPS19WQVIKKyV0b2tlbiBUT0tfVkFSX01FTQorJXRva2VuIFRPS19DT01NQU5EX0JPT1QKKyV0b2tlbiBUT0tfQ09NTUFORF9FWEVDCisldG9rZW4gVE9LX1NFTEVDVAorJXRva2VuIFRPS19TVFJJTkcKKyV0b2tlbiBUT0tfTU9ESUZJRVJfQllURQorJXRva2VuIFRPS19NT0RJRklFUl9XT1JECisldG9rZW4gVE9LX01PRElGSUVSX0xPTkcKKyV0b2tlbiBUT0tfTU9ESUZJRVJfTUVNU0VUCisldG9rZW4gVE9LX0NPTU1BTkRfTUVNU0VUCisldG9rZW4gVE9LX0NPTU1BTkRfTUVNRFVNUAorJXRva2VuIFRPS19DT01NQU5EX1FVSVQKKyV0b2tlbiBUT0tfRVJST1IKKyV0b2tlbiBUT0tfRU5ECisldG9rZW4gVE9LX0lTQQorJXRva2VuIFRPS19QQ0kKKyV0b2tlbiBUT0tfQllURQorJXRva2VuIFRPS19XT1JECisldG9rZW4gVE9LX0xPTkcKKyV0b2tlbiBUT0tfUFJJTlRfUE9SVAorJXRva2VuIFRPS19JT1NUQVQKKyV0b2tlbiBUT0tfUFJJTlRfSVJRCisldG9rZW4gVE9LX1BQQ0kKKyV0b2tlbiBUT0tfUElQCisldG9rZW4gVE9LX1RSQUNFCisldG9rZW4gVE9LX09OCisldG9rZW4gVE9LX09GRgorJXRva2VuIFRPS19WRVJCT1NFCisldG9rZW4gVE9LX0xPRworJXRva2VuIFRPS19MT0dPRkYKKyV0b2tlbiBUT0tfQ0xTVEFUCisldG9rZW4gVE9LX1NURE9VVAorJXRva2VuIFRPS19ITFQKKyV0b2tlbiBUT0tfREVMCisldG9rZW4gVE9LX0lPUEVSTQorJXRva2VuIFRPS19EVU1QX1BDSQorJXRva2VuIFRPS19CT09UX0JJT1MKKyUlCitpbnB1dDogICAgICAgIHwgaW5wdXQgbGluZSAgCitsaW5lOiAgICAgICAgICBlbmQgfCAgY29tX3JlZyB8IGNvbV92YXIgfCBjb21fc2VsZWN0CisgICAgICAgICAgICAgIHwgY29tX2Jvb3QgfCBjb21fbWVtc2V0IHwgY29tX21lbWR1bXAgIHwgY29tX3F1aXQgCisgICAgICAgICAgICAgIHwgY29tX2V4ZWMgfCBobHAgfCBjb25maWcgfCB2ZXJib3NlIHwgbG9nZ2luZyB8IHByaW50IHwgY2xzdGF0IAorICAgICAgICAgICAgICB8IGNvbV9obHQgfCBpb3Blcm0gfCBsaXN0X3BjaSB8IGJvb3RfYmlvcyAKKyAgICAgICAgICAgICAgfCBlcnJvciBlbmQgIHsgcHJpbnRmKCJ1bmtub3duIGNvbW1hbmRcbiIpOyB9Cis7CitlbmQ6ICAgICAgICAgICBUT0tfRU5ECis7Citjb21fcmVnOiAgICAgICAgcmVnX29mZiB2YWwgZW5kIHsgKihDQVJEMTYqKSQxID0gJDIgJiAweGZmZmY7IH0KKyAgICAgICAgICAgICAgfCByZWdfc2VnIFRPS19TRVAgcmVnX29mZiB2YWwgZW5kIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKENBUkQxNiopJDEgPSAoJDQgJiAweGYwMDAwKSA+PiA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihDQVJEMTYqKSQzID0gKCQ0ICYgMHgwZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB8ICByZWdfb2ZmICc/JyBlbmQgeyBwcmludGYoIjB4JXhcbiIsKihDQVJEMTYqKSQxKTt9CisgICAgICAgICAgICAgIHwgIHJlZ19zZWcgVE9LX1NFUCByZWdfb2ZmICc/JyBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiMHgleDoweCV4XG4iLCooQ0FSRDE2KikkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihDQVJEMTYqKSQzKTsgfQorOworcmVnaXN0ZXJfcmVhZDogIHJlZ19zZWcgVE9LX1NFUCByZWdfb2ZmIHsgJCQgPSAoKCgqKENBUkQxNiopJDEpIDw8IDQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCooQ0FSRDE2KikkMykgJiAweGZmZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHwgcmVnX29mZiAgICAgICAgICB7ICQkID0gKCgqKENBUkQxNiopJDEpICYgMHhmZmZmKTsgfQorOworcmVnX29mZjogICAgICAgIFRPS19SRUdfQVggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuYXgpOyB9CisgICAgICAgICAgICAgIHwgVE9LX1JFR19CWCAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5ieCk7IH0KKyAgICAgICAgICAgICAgfCBUT0tfUkVHX0NYICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmN4KTsgfQorICAgICAgICAgICAgICB8IFRPS19SRUdfRFggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZHgpOyB9CisgICAgICAgICAgICAgIHwgVE9LX1JFR19ESSAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5kaSk7IH0KKyAgICAgICAgICAgICAgfCBUT0tfUkVHX1NJICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLnNpKTsgfQorOworcmVnX3NlZzogICAgICAgIFRPS19TRUdfRFMgIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZHMpOyB9CisgICAgICAgICAgICAgIHwgVE9LX1NFR19FUyAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5lcyk7IH0KKzsKK2NvbV92YXI6ICAgICAgICBUT0tfVkFSX01FTSAnPycgZW5kIHsgcHJpbnRmKCJ2YXIgbWVtOiAweCV4XG4iLHZhcl9tZW0pOyB9CisgICAgICAgICAgfCBUT0tfVkFSICc/JyBlbmQgeyBpZiAoJDEgPCBNQVhfVkFSKQorICAgICAgICAgIHByaW50ZigidmFyWyVpXTogMHgleFxuIiwoaW50KSQxLHZhclskMV0pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoInZhciBpbmRleCAlaSBvdXQgb2YgcmFuZ2VcbiIsKGludCkkMSk7IH0KKyAgICAgICAgICB8IFRPS19WQVJfTUVNIHZhbCBlbmQgeyB2YXJfbWVtID0gJDI7IH0gICAgCisgICAgICAgICAgICAgIHwgVE9LX1ZBUiB2YWwgZW5kICAgIHsgaWYgKCQxIDw9IE1BWF9WQVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJbJDFdID0gJDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigidmFyIGluZGV4ICVpIG91dCBvZiByYW5nZVxuIiwoaW50KSQxKTsgfQorICAgICAgICAgICAgICB8IFRPS19WQVIgZXJyb3IgIGVuZCB7IHByaW50ZigiJGkgdmFsXG4iKTsgfQorICAgICAgICAgICAgICB8IFRPS19WQVJfTUVNIGVycm9yICBlbmQgeyBwcmludGYoIiRpIHZhbFxuIik7IH0KKzsKK2NvbV9ib290OiAgICAgICBUT0tfQ09NTUFORF9CT09UICBlbmQgeyBib290KCk7IH0KKyAgICAgICAgICAgICAgICBUT0tfQ09NTUFORF9CT09UIGVycm9yIGVuZCB7IGJvb3QoKTsgfQorOworY29tX3NlbGVjdDogICAgIFRPS19TRUxFQ1QgVE9LX0lTQSBlbmQgeyBEZXZpY2UuYm9vdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS50eXBlID0gSVNBOworICAgICAgICAgICAgICAgICAgICAgQ3VycmVudFBjaSA9IE5VTEw7IH0gICAKKyAgICAgICAgICAgICAgfCBUT0tfU0VMRUNUIFRPS19QQ0kgdmFsIFRPS19TRVAgdmFsIFRPS19TRVAgdmFsIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEZXZpY2UuYm9vdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLnR5cGUgPSBQQ0k7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5idXMgPSAkMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuZGV2ID0gJDU7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5mdW5jID0gJDc7IH0KKyAgICAgICAgICAgICAgfCBUT0tfU0VMRUNUICc/JyBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzd2l0Y2ggKERldmljZS50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0E6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImlzYVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBDSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwY2k6ICV4OiV4OiV4XG4iLERldmljZS5sb2MucGNpLmJ1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmZ1bmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm8gZGV2aWNlIHNlbGVjdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB8IFRPS19TRUxFQ1QgZXJyb3IgZW5kIHsgcHJpbnRmKCJzZWxlY3QgPyB8IGlzYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IHBjaTpidXM6ZGV2OmZ1bmNcbiIpOyB9Cis7Citjb21fcXVpdDogICAgICAgVE9LX0NPTU1BTkRfUVVJVCBlbmQgeyByZXR1cm4gMDsgfQorICAgICAgICAgICAgICB8IFRPS19DT01NQU5EX1FVSVQgZXJyb3IgZW5kIHsgbG9nb2ZmKCk7IHJldHVybiAwOyB9Cis7Citjb21fZXhlYzogICAgICAgVE9LX0NPTU1BTkRfRVhFQyBlbmQgeyBleGVjX2ludCgweDEwKTsgfQorICAgICAgICAgIHwgVE9LX0NPTU1BTkRfRVhFQyB2YWwgZW5kIHsgZXhlY19pbnQoJDIpOyB9CisgICAgICAgICAgfCBUT0tfQ09NTUFORF9FWEVDIGVycm9yIGVuZCB7IGV4ZWNfaW50KDB4MTApOyB9Cis7Citjb21fbWVtZHVtcDogICAgVE9LX0NPTU1BTkRfTUVNRFVNUCB2YWwgdmFsIGVuZCB7IGR1bXBfbWVtKCQyLCQzKTsgfQorICAgICAgICAgICAgICB8IFRPS19DT01NQU5EX01FTURVTVAgIGVycm9yICBlbmQgeyBwcmludGYoIm1lbWR1bXAgc3RhcnQgbGVuXG4iKTsgfQorCisgICAgCis7Citjb21fbWVtc2V0OiAgICAgVE9LX0NPTU1BTkRfTUVNU0VUIHZhbCBsaXN0IGVuZCB7IGRvX2xpc3QoKHN0cnVjdCBtZW0qKSQzLCQyKTt9CisgICAgICAgICAgICAgIHwgVE9LX0NPTU1BTkRfTUVNU0VUIGVycm9yIGVuZCB7IHByaW50Zigic2V0bWVtIGFkZHIgW2J5dGUgdmFsXSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3dvcmQgdmFsXSBbbG9uZyB2YWxdICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbXCJzdHJpbmdcIl1cbiIpOyB9Cis7CitsaXN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAwOyB9IAorICAgICAgICAgICAgICB8IFRPS19CWVRFIHZhbCBsaXN0IHsgcmVjLmludGVnZXIgPSAkMjsKKyAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKWFkZF90b19saXN0KEJZVEUsJnJlYywodm9pZCopJDMpOyB9CisgICAgICAgICAgICAgIHwgVE9LX1dPUkQgdmFsIGxpc3QgeyByZWMuaW50ZWdlciA9ICQyOyAKKyAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKSBhZGRfdG9fbGlzdChXT1JELCZyZWMsKHZvaWQqKSQzKTsgfQorICAgICAgICAgICAgICB8IFRPS19MT05HIHZhbCBsaXN0IHsgcmVjLmludGVnZXIgPSAkMjsgCisgICAgICAgICAgJCQgPSAodW5zaWduZWQgbG9uZykgYWRkX3RvX2xpc3QoTE9ORywmcmVjLCh2b2lkKikkMyk7IH0KKyAgICAgICAgICAgICAgfCBUT0tfU1RSSU5HIGxpc3QgeyByZWMucHRyID0gKHZvaWQqKSQxOyAKKyAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKSBhZGRfdG9fbGlzdChTVFJJTkcsJnJlYywodm9pZCopJDIpOyB9Cis7Cit2YWw6ICAgICAgICAgICAgVE9LX1ZBUiAgeyAgaWYgKCQxID4gTUFYX1ZBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInZhcmlhYmxlIGluZGV4IG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkPTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCA9IHZhclskMV07IH0gCisgICAgICAgICAgICAgIHwgVE9LX05VTSAgeyAgJCQgPSAkMTsgfQorICAgICAgICAgICAgICB8IHJlZ2lzdGVyX3JlYWQKKzsgCitib29sOiAgICAgICAgICAgVE9LX09OICAgeyAgJCQgPSAxOyB9CisgICAgICAgICAgICAgIHwgVE9LX09GRiAgeyAgJCQgPSAwOyB9Cis7Citjb25maWc6ICAgICAgICAgVE9LX1BSSU5UX1BPUlQgYm9vbCBlbmQgeyBDb25maWcuUHJpbnRQb3J0ID0gJDI7IH0gCisgICAgICAgICAgICAgIHwgVE9LX1BSSU5UX1BPUlQgJz8nIGVuZCAgeyBwcmludGYoInByaW50IHBvcnQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludFBvcnQ/Im9uIjoib2ZmIik7IH0KKyAgICAgICAgICB8IFRPS19QUklOVF9QT1JUIGVycm9yIGVuZCB7IHByaW50ZigicHBvcnQgb24gfCBvZmYgfCA/XG4iKSB9IAorICAgICAgICAgICAgICB8IFRPS19QUklOVF9JUlEgYm9vbCBlbmQgIHsgQ29uZmlnLlByaW50SXJxID0gJDI7IH0gCisgICAgICAgICAgICAgIHwgVE9LX1BSSU5UX0lSUSAnPycgZW5kICAgeyBwcmludGYoInByaW50IGlycSAlc1xuIiwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlByaW50SXJxPyJvbiI6Im9mZiIpOyB9IAorICAgICAgICAgIHwgVE9LX1BSSU5UX0lSUSBlcnJvciBlbmQgeyBwcmludGYoInBpcnEgb24gfCBvZmYgfCA/XG4iKSB9IAorICAgICAgICAgICAgICB8IFRPS19QUENJIGJvb2wgZW5kICAgICAgIHsgQ29uZmlnLlByaW50UGNpID0gJDI7IH0gCisgICAgICAgICAgICAgIHwgVE9LX1BQQ0kgJz8nIGVuZCAgICAgICAgeyBwcmludGYoInByaW50IFBDSSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludFBjaT8ib24iOiJvZmYiKTsgfSAKKyAgICAgICAgICB8IFRPS19QUENJIGVycm9yIGVuZCAgICAgIHsgcHJpbnRmKCJwcGNpIG9uIHwgb2ZmIHwgP1xuIikgfSAKKyAgICAgICAgICAgICAgfCBUT0tfUElQIGJvb2wgZW5kICAgICAgICB7IENvbmZpZy5QcmludElwID0gJDI7IH0gCisgICAgICAgICAgICAgIHwgVE9LX1BJUCAnPycgZW5kICAgICAgICAgeyBwcmludGYoInByaW50aXAgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludElwPyJvbiI6Im9mZiIpOyB9IAorICAgICAgICAgIHwgVE9LX1BJUCBlcnJvciBlbmQgICAgICAgeyBwcmludGYoInBpcCBvbiB8IG9mZiB8ID9cbiIpIH0gCisgICAgICAgICAgICAgIHwgVE9LX0lPU1RBVCBib29sIGVuZCAgICAgeyBDb25maWcuSW9TdGF0aXN0aWNzID0gJDI7IH0gCisgICAgICAgICAgICAgIHwgVE9LX0lPU1RBVCAnPycgZW5kICAgICAgeyBwcmludGYoImlvIHN0YXRpc3RpY3MgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5Jb1N0YXRpc3RpY3M/Im9uIjoib2ZmIik7IH0gCisgICAgICAgICAgfCBUT0tfSU9TVEFUIGVycm9yIGVuZCAgICB7IHByaW50ZigiaW9zdGF0IG9uIHwgb2ZmIHwgP1xuIikgfSAKKyAgICAgICAgICAgICAgfCBUT0tfVFJBQ0UgYm9vbCBlbmQgICAgICB7IENvbmZpZy5UcmFjZSA9ICQyOyB9IAorICAgICAgICAgICAgICB8IFRPS19UUkFDRSAnPycgZW5kICAgICAgIHsgcHJpbnRmKCJ0cmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlRyYWNlID8ib24iOiJvZmYiKTsgfSAKKyAgICAgICAgICB8IFRPS19UUkFDRSBlcnJvciBlbmQgeyBwcmludGYoInRyYWNlIG9uIHwgb2ZmIHwgP1xuIikgfSAKKzsKK3ZlcmJvc2U6ICAgICAgICBUT0tfVkVSQk9TRSB2YWwgZW5kICAgICB7IENvbmZpZy5WZXJib3NlID0gJDI7IH0KKyAgICAgICAgICB8IFRPS19WRVJCT1NFICc/JyBlbmQgICAgIHsgcHJpbnRmKCJ2ZXJib3NlOiAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuVmVyYm9zZSk7IH0KKyAgICAgICAgICB8IFRPS19WRVJCT1NFIGVycm9yIGVuZCAgIHsgcHJpbnRmKCJ2ZXJib3NlIHZhbCB8ID9cbiIpOyB9Cis7Citsb2dnaW5nOiAgICAgICAgVE9LX0xPRyBUT0tfU1RSSU5HIGVuZCAgeyBsb2dvbihub3JtYWxpemVfc3RyaW5nKChjaGFyKikkMikpOyB9CisgICAgICAgICAgfCBUT0tfTE9HICc/JyBlbmQgICAgICAgICB7IGlmIChsb2dnaW5nKSBwcmludGYoImxvZ2ZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCJubyBsb2dnaW5nXG4/Iik7IH0KKyAgICAgICAgICB8IFRPS19MT0cgVE9LX09GRiBlbmQgICAgICAgICAgeyBsb2dvZmYoKTsgfQorICAgICAgICAgIHwgVE9LX0xPRyBlcnJvciBlbmQgICAgICAgeyBwcmludGYoImxvZyBcIjxmaWxlbmFtZT5cIiB8ID8gfCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZlxuIik7IH0KKzsKK2Nsc3RhdDogICAgICAgICBUT0tfQ0xTVEFUIGVuZCAgICAgICAgICB7IGNsZWFyX3N0YXQoKTsgfQorICAgICAgICAgIHwgVE9LX0NMU1RBVCBlcnJvciBlbmQgICAgeyBwcmludGYoImNsc3RhdFxuIik7IH0gCis7CitwcmludDogICAgICAgICAgVE9LX1NURE9VVCBib29sIGVuZCAgICAgeyBub3N0ZG91dCA9ICEkMjsgfQorICAgICAgICAgICAgICAgICAgfCBUT0tfU1RET1VUICc/JyBlbmQgICAgICB7IHByaW50ZigicHJpbnQgJXNcbiIsbm9zdGRvdXQgPworICAgICAgICAgICAgICAgICAgICAgICAgIm5vIjoieWVzIik7IH0KKyAgICAgICAgICB8IFRPS19TVERPVVQgZXJyb3IgZW5kICAgIHsgcHJpbnRmKCJwcmludCBvbiB8IG9mZlxuIik7IH0KKzsKK2NvbV9obHQ6ICAgICAgICAgICAgVE9LX0hMVCB2YWwgZW5kICAgICAgICAgeyBhZGRfaGx0KCQyKTsgfSAgICAKKyAgICAgICAgICB8IFRPS19ITFQgVE9LX0RFTCB2YWwgZW5kIHsgZGVsX2hsdCgkMyk7IH0KKyAgICAgICAgICB8IFRPS19ITFQgVE9LX0RFTCBlbmQgICAgIHsgZGVsX2hsdCgyMSk7IH0KKyAgICAgICAgICAgICAgfCBUT0tfSExUICc/JyBlbmQgICAgICAgICB7IGxpc3RfaGx0KCk7IH0KKyAgICAgICAgICB8IFRPS19ITFQgZXJyb3IgZW5kICAgICAgIHsgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGx0IHZhbCB8IGRlbCBbdmFsXSB8ID9cbiIpOyB9Cis7Citpb3Blcm06ICAgICAgICAgVE9LX0lPUEVSTSB2YWwgdmFsIHZhbCBlbmQgeyBpbnQgaSxtYXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gJDIgKyAkMyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPiBJT1BFUk1fQklUUykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IElPUEVSTV9CSVRTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gJDI7aSA8PSBtYXg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wZXJtX2xpc3RbaV0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkND4wID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfCBUT0tfSU9QRVJNICc/JyBlbmQgeyBpbnQgaSxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDw9IElPUEVSTV9CSVRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlvcGVybV9saXN0W2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPD0gSU9QRVJNX0JJVFM7IGkrKykgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlvcGVybV9saXN0W2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpb3Blcm0gb24gaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICIweCV4KzB4JXhcbiIsIHN0YXJ0LGktc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfCBUT0tfSU9QRVJNIGVycm9yIGVuZCB7IHByaW50ZigiaW9wZXJtIHN0YXJ0IGxlbiB2YWxcbiIpOyB9Cis7CitsaXN0X3BjaTogICAgICBUT0tfRFVNUF9QQ0kgZW5kICAgICAgIHsgbGlzdF9wY2koKTsgfQorICAgICAgICAgICAgIHwgVE9LX0RVTVBfUENJIGVycm9yIGVuZCB7IGxpc3RfcGNpKCk7IH0KKzsKK2Jvb3RfYmlvczogICAgIFRPS19CT09UX0JJT1MgJz8nIGVuZCB7IGlmICghQm9vdEJpb3MpIHByaW50ZigiTm8gQm9vdCBCSU9TXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBwcmludGYoIkJvb3RCSU9TIGZyb206ICVpOiVpOiVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdEJpb3MtPmJ1cywgQm9vdEJpb3MtPmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RCaW9zLT5mdW5jKTsgfQorICAgICAgICAgICAgIHwgVE9LX0JPT1RfQklPUyBlcnJvciBlbmQgeyBwcmludGYgKCJib290YmlvcyBidXM6ZGV2Om51bVxuIik7IH0KKzsKK2hscDogICAgICAgICAnPycgIHsgcHJpbnRmKCJDb21tYW5kIGxpc3Q6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgc2VsZWN0IGlzYSB8IHBjaSBidXM6ZGV2OmZ1bmNcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgYm9vdFxuIik7CisgICAgICAgICAgICBwcmludGYoIiBzZWc6cmVnIHZhbCB8IHJlZyB2YWwgXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICR4IHZhbCB8ICRtZW0gdmFsXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIHNldG1lbSBhZGRyIGxpc3Q7IGFkZHIgOj0gdmFsXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIGR1bXBtZW0gYWRkciBsZW47IGFkZHIsbGVuIDo9IHZhbFxuIik7CisgICAgICAgICAgICBwcmludGYoIiBkbyBbdmFsXVxuIik7CisgICAgICAgICAgICBwcmludGYoIiBxdWl0XG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiID9cbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgc2VnIDo9IGRzIHwgZXM7IgorICAgICAgICAgICAgICAgIiByZWcgOj0gYXggfCBieCB8IGN4IHwgZHggfCBzaSBcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgdmFsIDo9IHZhciB8IDxoZXgtbnVtYmVyPiB8IHNlZzpyZWcgfCBzZWdcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgdmFyIDo9ICR4IHwgJG1lbTsgeCA6PSAwLi4yMFxuIik7CisgICAgICAgICAgICBwcmludGYoIiBsaXN0IDo9IGJ5dGUgdmFsIHwgd29yZCB2YWwgfCBsb25nIHZhbCAiCisgICAgICAgICAgICAgICAifCBcInN0cmluZ1wiXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBwcG9ydCBvbiB8IG9mZiB8ID9cbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiIHBwY2kgb24gfCBvZmYgfCA/XG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBwaXJxIG9uIHwgb2ZmIHwgP1xuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgcGlwIG9uIHwgb2ZmIHwgP1xuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgdHJhY2Ugb24gfCBvZmYgfCA/XG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBpb3N0YXQgb24gfCBvZmYgfCA/XG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIHZlcmJvc2UgdmFsXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIGxvZyBcIjxmaWxlbmFtZT5cIiB8IG9mZiB8ID9cbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgcHJpbnQgb24gfCBvZmZcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgaGx0IHZhbCB8IGRlbCBbdmFsXSB8ID9cbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgY2xzdGF0XG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIGxwY2lcbiIpOworICAgICAgICAgICAgcHJpbnRmICgiYm9vdGJpb3MgP1xuIik7Cit9Cis7CisKKyUlCisKK3N0YXRpYyB2b2lkCitkdW1wX21lbShDQVJEMzIgYWRkciwgaW50IGxlbikKK3sKKyAgICBkcHJpbnQoYWRkcixsZW4pOworfQorCitzdGF0aWMgdm9pZAorZXhlY19pbnQoaW50IG51bSkKK3sKKyAgICBpZiAobnVtID09IDB4MTApIHsgIC8qIHZpZGVvIGludGVycnVwdCAqLworICAgIGlmIChEZXZpY2UudHlwZSA9PSBOT05FKSB7CisgICAgICAgIEN1cnJlbnRQY2kgPSBQY2lMaXN0OworICAgICAgICB3aGlsZSAoQ3VycmVudFBjaSkgeworICAgICAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmICghQ3VycmVudFBjaSkKKyAgICAgICAgRGV2aWNlLnR5cGUgPSBJU0E7CisgICAgICAgIGVsc2UgeworICAgICAgICBEZXZpY2UudHlwZSA9IFBDSTsKKyAgICAgICAgRGV2aWNlLmxvYy5wY2kuZGV2ID0gQ3VycmVudFBjaS0+ZGV2OworICAgICAgICBEZXZpY2UubG9jLnBjaS5idXMgPSBDdXJyZW50UGNpLT5idXM7CisgICAgICAgIERldmljZS5sb2MucGNpLmZ1bmMgPSBDdXJyZW50UGNpLT5mdW5jOworICAgICAgICB9CisgICAgfQorICAgICAgICBpZiAoRGV2aWNlLnR5cGUgIT0gSVNBKSB7CisgICAgICAgaWYgKCFEZXZpY2UuYm9vdGVkKSB7CisgICAgICAgICAgICAgIGlmICghQ3VycmVudFBjaSB8fCAoRGV2aWNlLnR5cGUgPT0gUENJCisgICAgICAgICAgICAgICAmJiAoIUN1cnJlbnRQY2ktPmFjdGl2ZQorICAgICAgICAgICAgICAgICAgICYmIChEZXZpY2UubG9jLnBjaS5kZXYgIT0gQ3VycmVudFBjaS0+ZGV2CisgICAgICAgICAgICAgICAgIHx8IERldmljZS5sb2MucGNpLmJ1cyAhPSBDdXJyZW50UGNpLT5idXMKKyAgICAgICAgICAgICAgICAgfHwgRGV2aWNlLmxvYy5wY2kuZnVuYyAhPSBDdXJyZW50UGNpLT5mdW5jKSkpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJib290IHRoZSBkZXZpY2UgZmlzdFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgQ3VycmVudFBjaSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICBEZXZpY2UuYm9vdGVkID0gRkFMU0U7IC8qIHdlIG5lZWQgdGhpcyBmb3Igc2FuaXR5ISAqLworICAgIH0KKyAgICAKKyAgICBydW5JTlQobnVtLCZyZWdzKTsKK30KKworc3RhdGljIHZvaWQKK2Jvb3Qodm9pZCkKK3sKKyAgICBpZiAoRGV2aWNlLnR5cGUgPT0gTk9ORSkgeworICAgIHByaW50Zigic2VsZWN0IGEgZGV2aWNlIGZpc3RcbiIpOworICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgY2FsbF9ib290KCZEZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCAqCithZGRfdG9fbGlzdChlbnVtIG1lbV90eXBlIHR5cGUsIHVuaW9uIG1lbV92YWwgKnJlYywgdm9pZCAqbmV4dCkKK3sKKyAgICBzdHJ1Y3QgbWVtICptZW1fcmVjID0gKHN0cnVjdCBtZW0gKikgbWFsbG9jKHNpemVvZihtZW1fcmVjKSk7CisKKyAgICBtZW1fcmVjLT50eXBlID0gdHlwZTsKKyAgICBtZW1fcmVjLT5uZXh0ID0gbmV4dDsKKyAgICAKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBXT1JEOgorICAgIGNhc2UgTE9ORzoKKyAgICBtZW1fcmVjLT52YWwuaW50ZWdlciA9IHJlYy0+aW50ZWdlcjsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFNUUklORzoKKyAgICBtZW1fcmVjLT52YWwucHRyID0gbm9ybWFsaXplX3N0cmluZyhyZWMtPnB0cik7CisgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBtZW1fcmVjOworfQorCitzdGF0aWMgaW50Cit2YWxpZFJhbmdlKGludCBhZGRyLGludCBsZW4pCit7CisgICAgaW50IGVuZCA9IGFkZHIgKyBsZW47CisKKyAgICBpZiAoYWRkciA8IDB4MTAwMCB8fCBlbmQgPiAweGMwMDAwKQorICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZG9fbGlzdChzdHJ1Y3QgbWVtICpsaXN0LCBtZW1UeXBlIGFkZHIpCit7CisgICBzdHJ1Y3QgbWVtICpwcmV2OworICAgaW50IGxlbjsKKyAgIAorICAgd2hpbGUgKGxpc3QpIHsKKyAgICBzd2l0Y2ggKGxpc3QtPnR5cGUpIHsKKyAgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLDEpKSBnb3RvIGVycm9yOworICAgICAgICAgKihDQVJEOCopYWRkciA9IGxpc3QtPnZhbC5pbnRlZ2VyOworICAgICAgICAgYWRkciA9KyAxOworICAgICAgICAgICAgIGJyZWFrOyAgICAgCisgICAgICAgICBjYXNlIFdPUkQ6CisgICAgICAgICBpZiAoIXZhbGlkUmFuZ2UoYWRkciwyKSkgZ290byBlcnJvcjsKKyAgICAgICAgICooQ0FSRDE2KilhZGRyID0gbGlzdC0+dmFsLmludGVnZXI7CisgICAgICAgICBhZGRyID0rIDI7CisgICAgICAgICAgICAgYnJlYWs7ICAgICAKKyAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLDQpKSBnb3RvIGVycm9yOworICAgICAgICAgKihDQVJEMzIqKWFkZHIgPSBsaXN0LT52YWwuaW50ZWdlcjsKKyAgICAgICAgIGFkZHIgPSsgNDsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgbGVuID0gc3RybGVuKChjaGFyKilsaXN0LT52YWwucHRyKTsKKyAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLGxlbikpIGdvdG8gZXJyb3I7CisgICAgICAgICBtZW1jcHkoKENBUkQ4KilhZGRyLCh2b2lkKilsaXN0LT52YWwucHRyLGxlbik7CisgICAgICAgICBhZGRyID0rIGxlbjsKKyAgICAgICAgICAgICBmcmVlKGxpc3QtPnZhbC5wdHIpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgIH0gICAgIAorICAgICAgIHByZXYgPSBsaXN0OworICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgIGZyZWUocHJldik7CisgICAgICAgY29udGludWU7CisgICBlcnJvcjoKKyAgICAgICBwcmludGYoImFkZHJlc3Mgb3V0IG9mIHJhbmdlXG4iKTsKKyAgICAgICB3aGlsZSAobGlzdCkgeworICAgICAgIHByZXYgPSBsaXN0OworICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgIGZyZWUocHJldik7CisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgfQorfQorCitzdGF0aWMgY2hhciAqCitub3JtYWxpemVfc3RyaW5nKGNoYXIgKnB0cikKK3sKKyAgICBpbnQgaSA9IDAsIGogPSAwLCBjID0gMCwgZXNjPSAwOworICAgIGludCBzaXplOworICAgIGNoYXIgKm1lbV9wdHI7CisgICAgCisgICAgc2l6ZSA9IHN0cmxlbihwdHIpOworICAgIG1lbV9wdHIgPSBtYWxsb2Moc2l6ZSk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc3dpdGNoICgqKHB0ciArIGkpKSB7CisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIGlmIChlc2MpIHsKKyAgICAgICAgICAgICAgICAqKG1lbV9wdHIgKyBqKyspID0gKihwdHIgKyBpKTsKKyAgICAgICAgICAgICAgICBlc2MgPSAwOworICAgICAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgICAgIGVzYyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgaWYgKGVzYykgeworICAgICAgICAgICAgICAgICoobWVtX3B0ciArIGorKykgPSAqKHB0ciArIGkpOworICAgICAgICAgICAgICAgIGVzYyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqKG1lbV9wdHIgKyBqKyspID0gKihwdHIgKyBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjID4gMSkgeworICAgICAgICAgICAgKihtZW1fcHRyICsgaikgPSAnXDAnOyAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBtZW1fcHRyOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4YzYxZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmMKQEAgLTAsMCArMSw5MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKKyAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCisjaW5jbHVkZSA8c3lzL2lvLmg+CisjZW5kaWYKKyNpbmNsdWRlICJBc21NYWNyb3MuaCIKKworI2luY2x1ZGUgInBjaS5oIgorCisvKgorICogSSdtIHJhdGhlciBzaW1wbGUgbWluZGVuZCAtIHRoZXJlZm9yZSBJIGRvIGEgcG9vciBtYW4ncworICogcGNpIHNjYW4gd2l0aG91dCBhbGwgdGhlIGZhbmN5IHN0dWZmIHRoYXQgaXMgZG9uZSBpbgorICogc2NhbnBjaS4gSG93ZXZlciB0aGF0J3MgYWxsIHdlIG5lZWQuCisgKi8KKworUGNpU3RydWN0UHRyIFBjaVN0cnVjdCA9IE5VTEw7CitQY2lCdXNQdHIgUGNpQnVzZXMgPSBOVUxMOworUGNpU3RydWN0UHRyIEN1cnJlbnRQY2kgPSBOVUxMOworUGNpU3RydWN0UHRyIFBjaUxpc3QgPSBOVUxMOworUGNpU3RydWN0UHRyIEJvb3RCaW9zID0gTlVMTDsKK2ludCBwY2lNYXhCdXMgPSAwOworCitzdGF0aWMgQ0FSRDMyIFBjaUNmZzFBZGRyOworCitzdGF0aWMgdm9pZCByZWFkQ29uZmlnU3BhY2VDZmcxKENBUkQzMiBidXMsIENBUkQzMiBkZXYsIENBUkQzMiBmdW5jLAorICAgICAgICAgICAgICAgIENBUkQzMiAqcmVnKTsKK3N0YXRpYyBpbnQgY2hlY2tTbG90Q2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYyk7CitzdGF0aWMgaW50IGNoZWNrU2xvdENmZzIoQ0FSRDMyIGJ1cywgaW50IGRldik7CitzdGF0aWMgdm9pZCByZWFkQ29uZmlnU3BhY2VDZmcyKENBUkQzMiBidXMsIGludCBkZXYsIENBUkQzMiAqcmVnKTsKK3N0YXRpYyBDQVJEOCBpbnRlcnByZXRDb25maWdTcGFjZShDQVJEMzIgKnJlZywgaW50IGJ1c2lkeCwKKyAgICAgICAgICAgICAgICAgIENBUkQ4IGRldiwgQ0FSRDggZnVuYyk7CitzdGF0aWMgQ0FSRDMyIGZpbmRCSU9TTWFwKFBjaVN0cnVjdFB0ciBwY2lQLCBDQVJEMzIgKmJpb3NTaXplKTsKK3N0YXRpYyB2b2lkIHJlc3RvcmVNZW0oUGNpU3RydWN0UHRyIHBjaVApOworCisKKyNpZmRlZiBfX2FscGhhX18KKyNkZWZpbmUgUENJX0JVU19GUk9NX1RBRyh0YWcpICAoKCh0YWcpICYgMHgwMGZmMDAwMCkgPj4gMTYpCisjZGVmaW5lIFBDSV9ERk5fRlJPTV9UQUcodGFnKSAoKCh0YWcpICYgMHgwMDAwZmYwMCkgPj4gOCkKKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworQ0FSRDMyCitheHBQY2lDZmdSZWFkKENBUkQzMiB0YWcpCit7CisgICAgaW50IGJ1cywgZGZuOworICAgIENBUkQzMiB2YWwgPSAweGZmZmZmZmZmOworICAgIAorICAgIGJ1cyA9IFBDSV9CVVNfRlJPTV9UQUcodGFnKTsKKyAgICBkZm4gPSBQQ0lfREZOX0ZST01fVEFHKHRhZyk7CisgICAgCisgICAgc3lzY2FsbChfX05SX3BjaWNvbmZpZ19yZWFkLCBidXMsIGRmbiwgdGFnICYgMHhmZiwgNCwgJnZhbCk7CisgICAgcmV0dXJuKHZhbCk7Cit9CisKK3ZvaWQKK2F4cFBjaUNmZ1dyaXRlKENBUkQzMiB0YWcsIENBUkQzMiB2YWwpCit7CisgICAgaW50IGJ1cywgZGZuOworICAgIAorICAgIGJ1cyA9IFBDSV9CVVNfRlJPTV9UQUcodGFnKTsKKyAgICBkZm4gPSBQQ0lfREZOX0ZST01fVEFHKHRhZyk7CisgICAgCisgICAgc3lzY2FsbChfX05SX3BjaWNvbmZpZ193cml0ZSwgYnVzLCBkZm4sIHRhZyAmIDB4ZmYsIDQsICZ2YWwpOworfQorCitzdGF0aWMgQ0FSRDMyICgqcmVhZFBjaSkoQ0FSRDMyIHJlZykgPSBheHBQY2lDZmdSZWFkOworc3RhdGljIHZvaWQgKCp3cml0ZVBjaSkoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCkgPSBheHBQY2lDZmdXcml0ZTsKKyNlbHNlCitzdGF0aWMgQ0FSRDMyIHJlYWRQY2lDZmcxKENBUkQzMiByZWcpOworc3RhdGljIHZvaWQgd3JpdGVQY2lDZmcxKENBUkQzMiByZWcsIENBUkQzMiB2YWwpOworc3RhdGljIENBUkQzMiByZWFkUGNpQ2ZnMihDQVJEMzIgcmVnKTsKK3N0YXRpYyB2b2lkIHdyaXRlUGNpQ2ZnMihDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKTsKKworc3RhdGljIENBUkQzMiAoKnJlYWRQY2kpKENBUkQzMiByZWcpID0gcmVhZFBjaUNmZzE7CitzdGF0aWMgdm9pZCAoKndyaXRlUGNpKShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKSA9IHdyaXRlUGNpQ2ZnMTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQorI2RlZmluZSBQQ0lfRU4gMHgwMDAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgUENJX0VOIDB4ODAwMDAwMDAKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgbnVtYnVzOworc3RhdGljIGludCBob3N0YnJpZGdlcyA9IDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY2lNaW5NZW1SZWcgPSB+MDsKKworCisKK3ZvaWQKK3NjYW5fcGNpKHZvaWQpCit7CisgICAgdW5zaWduZWQgc2hvcnQgY29uZmlndHlwZTsKKyAgICAKKyAgICBDQVJEMzIgcmVnWzY0XTsKKyAgICBpbnQgYnVzaWR4OworICAgIENBUkQ4IGNhcmRudW07CisgICAgQ0FSRDggZnVuYzsKKyAgICBpbnQgaWR4OworICAgIAorICAgIGludCBpOworICAgIFBjaVN0cnVjdFB0ciBwY2kxOworICAgIFBjaUJ1c1B0ciBwY2lfYjEscGNpX2IyOworICAgIAorI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykKKyAgICBjb25maWd0eXBlID0gMTsKKyNlbHNlCisgICAgQ0FSRDggdG1wMSwgdG1wMjsKKyAgICBDQVJEMzIgdG1wMzJfMSwgdG1wMzJfMjsKKyAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKKyAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgMHgwMCk7CisgICAgdG1wMSA9IGluYihQQ0lfTU9ERTJfRU5BQkxFX1JFRyk7CisgICAgdG1wMiA9IGluYihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcpOworICAgIGlmICgodG1wMSA9PSAweDAwKSAmJiAodG1wMiA9PSAweDAwKSkgeworICAgICAgICBjb25maWd0eXBlID0gMjsKKyAgICAgICAgcmVhZFBjaSA9IHJlYWRQY2lDZmcyOworICAgICAgICB3cml0ZVBjaSA9IHdyaXRlUGNpQ2ZnMjsKKyAgICAgICAgUF9wcmludGYoIlBDSSBzYXlzIGNvbmZpZ3VyYXRpb24gdHlwZSAyXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXAzMl8xID0gaW5sKFBDSV9NT0RFMV9BRERSRVNTX1JFRyk7CisgICAgICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCBQQ0lfRU4pOworICAgICAgICB0bXAzMl8yID0gaW5sKFBDSV9NT0RFMV9BRERSRVNTX1JFRyk7CisgICAgICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCB0bXAzMl8xKTsKKyAgICAgICAgaWYgKHRtcDMyXzIgPT0gUENJX0VOKSB7CisgICAgICAgICAgICBjb25maWd0eXBlID0gMTsKKyAgICAgICAgICAgIFBfcHJpbnRmKCJQQ0kgc2F5cyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQX3ByaW50ZigiTm8gUENJICFcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgCisgICAgaWYgKGNvbmZpZ3R5cGUgPT0gMSkgeworICAgICAgICBQX3ByaW50ZigiUENJIHByb2JpbmcgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOworICAgICAgICBidXNpZHggPSAwOworICAgICAgICBudW1idXMgPSAxOworICAgICAgICBpZHggPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBQX3ByaW50ZigiXG5Qcm9iaW5nIGZvciBkZXZpY2VzIG9uIFBDSSBidXMgJWQ6XG4iLCBidXNpZHgpOworICAgICAgICAgICAgZm9yIChjYXJkbnVtID0gMDsgY2FyZG51bSA8IE1BWF9ERVZfUEVSX1ZFTkRPUl9DRkcxOyBjYXJkbnVtKyspIHsKKyAgICAgICAgICAgICAgICBmdW5jID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIC8qIGxvb3Agb3ZlciB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucywgaWYgcHJlc2VudCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2xvdENmZzEoYnVzaWR4LGNhcmRudW0sZnVuYykpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgcmVhZENvbmZpZ1NwYWNlQ2ZnMShidXNpZHgsY2FyZG51bSxmdW5jLHJlZyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGludGVycHJldENvbmZpZ1NwYWNlKHJlZyxidXNpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkbnVtLGZ1bmMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHgrKyA+IE1BWF9QQ0lfREVWSUNFUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGZ1bmMgPCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKytidXNpZHggPCBQQ0lfTUFYQlVTKTsKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19pYTY0X18pCisgICAgICAgIC8qIGRvbid0IHVzZSBvdXRsKCkgIDstKSAqLworI2Vsc2UKKyAgICAgICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIDApOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNsb3Q7CisgICAgCisgICAgICAgIFBfcHJpbnRmKCJQQ0kgcHJvYmluZyBjb25maWd1cmF0aW9uIHR5cGUgMlxuIik7CisgICAgICAgIGJ1c2lkeCA9IDA7CisgICAgICAgIG51bWJ1cyA9IDE7CisgICAgICAgIGlkeCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoc2xvdD0weGMwOyBzbG90PDB4ZDA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghY2hlY2tTbG90Q2ZnMihidXNpZHgsc2xvdCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJlYWRDb25maWdTcGFjZUNmZzIoYnVzaWR4LHNsb3QscmVnKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaW50ZXJwcmV0Q29uZmlnU3BhY2UocmVnLGJ1c2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LDApOworICAgICAgICAgICAgICAgIGlmIChpZHgrKyA+IE1BWF9QQ0lfREVWSUNFUykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gIHdoaWxlICgrK2J1c2lkeCA8IFBDSV9NQVhCVVMpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwY2lNYXhCdXMgPSBudW1idXMgLSAxOworICAgIFBfcHJpbnRmKCJOdW1iZXIgb2YgYnVzZXMgaW4gc3lzdGVtOiAlaVxuIixwY2lNYXhCdXMgKyAxKTsKKyAgICBQX3ByaW50ZigiTWluIFBDSSBtZW0gYWRkcmVzczogMHglbHhcbiIscGNpTWluTWVtUmVnKTsKKyAgICAKKyAgICAvKiBsaW5rIGJ1c2VzICovCisgICAgcGNpX2IxID0gUGNpQnVzZXM7CisgICAgd2hpbGUgKHBjaV9iMSkgeworICAgICAgICBwY2lfYjIgPSBQY2lCdXNlczsKKyAgICAgICAgcGNpX2IxLT5wQnVzID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBjaV9iMikgeworICAgICAgICAgICAgaWYgKHBjaV9iMS0+cHJpbWFyeSA9PSBwY2lfYjItPnNlY29uZGFyeSkKKyAgICAgICAgICAgICAgICBwY2lfYjEtPnBCdXMgPSBwY2lfYjI7CisgICAgICAgICAgICBwY2lfYjIgPSBwY2lfYjItPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcGNpX2IxID0gcGNpX2IxLT5uZXh0OworICAgIH0KKyAgICBwY2kxID0gUGNpU3RydWN0OworICAgIHdoaWxlIChwY2kxKSB7CisgICAgICAgIHBjaV9iMiA9IFBjaUJ1c2VzOworICAgICAgICBwY2kxLT5wQnVzID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBjaV9iMikgeworICAgICAgICAgICAgaWYgKHBjaTEtPmJ1cyA9PSBwY2lfYjItPnNlY29uZGFyeSkKKyAgICAgICAgICAgICAgICBwY2kxLT5wQnVzID0gcGNpX2IyOworICAgICAgICAgICAgcGNpX2IyID0gcGNpX2IyLT5uZXh0OworICAgICAgICB9CisgICAgICAgIHBjaTEgPSBwY2kxLT5uZXh0OworICAgIH0KKyAgICBpZiAoUkVTT1JUKSB7CisgICAgICAgIFBjaVN0cnVjdFB0ciB0bXAgPSBQY2lTdHJ1Y3QsIHRtcDE7CisgICAgICAgIFBjaVN0cnVjdCA9IE5VTEw7CisgICAgICAgIHdoaWxlICh0bXApIHsKKyAgICAgICAgICAgIHRtcDEgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICB0bXAtPm5leHQgPSBQY2lTdHJ1Y3Q7CisgICAgICAgICAgICBQY2lTdHJ1Y3QgPSB0bXA7CisgICAgICAgICAgICB0bXAgPSB0bXAxOworICAgICAgICB9CisgICAgfQorICAgIFBjaUxpc3QgPSBDdXJyZW50UGNpID0gUGNpU3RydWN0OworfQorCisjaWZuZGVmIF9fYWxwaGFfXworc3RhdGljIENBUkQzMgorcmVhZFBjaUNmZzEoQ0FSRDMyIHJlZykKK3sKKyAgICBDQVJEMzIgdmFsOworICAgIAorICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCByZWcpOworICAgIHZhbCA9IGlubChQQ0lfTU9ERTFfREFUQV9SRUcpOworICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCAwKTsKKyAgICBQX3ByaW50ZigicmVhZGluZzogMHgleCBmcm9tIDB4JXhcbiIsdmFsLHJlZyk7CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlUGNpQ2ZnMShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKQoreworICAgIFBfcHJpbnRmKCJ3cml0aW5nOiAweCV4IHRvIDB4JXhcbiIsdmFsLHJlZyk7CisgICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIHJlZyk7CisgICAgb3V0bChQQ0lfTU9ERTFfREFUQV9SRUcsdmFsKTsKKyAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgMCk7Cit9CisKK3N0YXRpYyBDQVJEMzIKK3JlYWRQY2lDZmcyKENBUkQzMiByZWcpCit7CisgICAgQ0FSRDMyIHZhbDsKKyAgICBDQVJEOCBidXMgPSAocmVnID4+IDE2KSAmIDB4ZmY7CisgICAgQ0FSRDggZGV2ID0gKHJlZyA+PiAxMSkgJiAweDFmOworICAgIENBUkQ4IG51bSA9IHJlZyAmIDB4ZmY7CisgICAgCisgICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7CisgICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7CisgICAgdmFsID0gaW5sKChkZXYgPDwgOCkgKyBudW0pOworICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOworICAgIFBfcHJpbnRmKCJyZWFkaW5nOiAweCV4IGZyb20gMHgleFxuIix2YWwscmVnKTsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVQY2lDZmcyKENBUkQzMiByZWcsIENBUkQzMiB2YWwpCit7CisgICAgQ0FSRDggYnVzID0gKHJlZyA+PiAxNikgJiAweGZmOworICAgIENBUkQ4IGRldiA9IChyZWcgPj4gMTEpICYgMHgxZjsKKyAgICBDQVJEOCBudW0gPSByZWcgJiAweGZmOworCisgICAgUF9wcmludGYoIndyaXRpbmc6IDB4JXggdG8gMHgleFxuIix2YWwscmVnKTsKKyAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweEYxKTsKKyAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgYnVzKTsKKyAgICBvdXRsKChkZXYgPDwgOCkgKyBudW0sdmFsKTsKKyAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKK30KKyNlbmRpZgorCit2b2lkCitwY2lWaWRlb0Rpc2FibGUodm9pZCkKK3sKKyAgICAvKiBkaXNhYmxlIFZHQSByb3V0aW5nIG9uIGJyaWRnZXMgKi8KKyAgICBQY2lCdXNQdHIgcGJwID0gUGNpQnVzZXM7CisgICAgUGNpU3RydWN0UHRyIHBjcCA9IFBjaVN0cnVjdDsKKyAgICAKKyAgICB3aGlsZSAocGJwKSB7CisgICAgICAgIHdyaXRlUGNpKHBicC0+U2xvdC5sIHwgMHgzYywgcGJwLT5iY3RsICYgfihDQVJEMzIpKDg8PDE2KSk7CisgICAgICAgIHBicCA9IHBicC0+bmV4dDsKKyAgICB9CisgICAgLyogZGlzYWJsZSBkaXNwbGF5IGRldmljZXMgKi8KKyAgICB3aGlsZSAocGNwKSB7CisgICAgICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QgJiB+KENBUkQzMikzKTsKKyAgICAgICAgd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDMwLCBwY3AtPlJvbUJhc2UgJiB+KENBUkQzMikxKTsKKyAgICAgICAgcGNwID0gcGNwLT5uZXh0OworICAgIH0KK30KKwordm9pZAorcGNpVmlkZW9SZXN0b3JlKHZvaWQpCit7CisgICAgLyogZGlzYWJsZSBWR0Egcm91dGluZyBvbiBicmlkZ2VzICovCisgICAgUGNpQnVzUHRyIHBicCA9IFBjaUJ1c2VzOworICAgIFBjaVN0cnVjdFB0ciBwY3AgPSBQY2lTdHJ1Y3Q7CisgICAgCisgICAgd2hpbGUgKHBicCkgeworICAgICAgICB3cml0ZVBjaShwYnAtPlNsb3QubCB8IDB4M2MsIHBicC0+YmN0bCk7CisgICAgICAgIHBicCA9IHBicC0+bmV4dDsKKyAgICB9CisgICAgLyogZGlzYWJsZSBkaXNwbGF5IGRldmljZXMgKi8KKyAgICB3aGlsZSAocGNwKSB7CisgICAgICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QpOworICAgICAgICB3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MzAsIHBjcC0+Um9tQmFzZSk7CisgICAgICAgIHBjcCA9IHBjcC0+bmV4dDsKKyAgICB9Cit9CisKK3ZvaWQKK0VuYWJsZUN1cnJlbnQoKQoreworICAgIFBjaUJ1c1B0ciBwYnA7CisgICAgUGNpU3RydWN0UHRyIHBjcCA9IEN1cnJlbnRQY2k7CisgICAgCisgICAgcGNpVmlkZW9EaXNhYmxlKCk7CisgICAgCisgICAgcGJwID0gcGNwLT5wQnVzOworICAgIHdoaWxlIChwYnApIHsgLyogZW5hYmxlIGJyaWRnZXMgKi8KKyAgICAgICAgd3JpdGVQY2kocGJwLT5TbG90LmwgfCAweDNjLCBwYnAtPmJjdGwgfCAoQ0FSRDMyKSg4PDwxNikpOworICAgICAgICBwYnAgPSBwYnAtPnBCdXM7CisgICAgfQorICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QgfCAoQ0FSRDMyKTMpOworICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgzMCwgcGNwLT5Sb21CYXNlIHwgKENBUkQzMikxKTsKK30KKworQ0FSRDgKK1BjaVJlYWQ4KGludCBvZmZzZXQsIENBUkQzMiBTbG90KQoreworICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MzsKKyAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOworICAgIHJldHVybiAoKHJlYWRQY2koU2xvdCB8IG9mZnNldCkgPj4gKHNoaWZ0IDw8IDMpKSAmIDB4ZmYpOworfQorCitDQVJEMTYKK1BjaVJlYWQxNihpbnQgb2Zmc2V0LCBDQVJEMzIgU2xvdCkKK3sKKyAgICBpbnQgc2hpZnQgPSBvZmZzZXQgJiAweDI7CisgICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKKyAgICByZXR1cm4gKChyZWFkUGNpKFNsb3QgfCBvZmZzZXQpID4+IChzaGlmdCA8PCAzKSkgJiAweGZmZmYpOworfQorCitDQVJEMzIKK1BjaVJlYWQzMihpbnQgb2Zmc2V0LCBDQVJEMzIgU2xvdCkKK3sKKyAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOworICAgIHJldHVybiAocmVhZFBjaShTbG90IHwgb2Zmc2V0KSk7Cit9CisKK3ZvaWQKK1BjaVdyaXRlOChpbnQgb2Zmc2V0LCBDQVJEOCBieXRlLCBDQVJEMzIgU2xvdCkKK3sKKyAgICBDQVJEMzIgdmFsOworICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MzsKKyAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOworICAgIHZhbCA9IHJlYWRQY2koU2xvdCB8IG9mZnNldCk7CisgICAgdmFsICY9IH4oQ0FSRDMyKSgweGZmIDw8IChzaGlmdCA8PCAzKSk7CisgICAgdmFsIHw9IGJ5dGUgPDwgKHNoaWZ0IDw8IDMpOworICAgIHdyaXRlUGNpKFNsb3QgfCBvZmZzZXQsIHZhbCk7Cit9CisKK3ZvaWQKK1BjaVdyaXRlMTYoaW50IG9mZnNldCwgQ0FSRDE2IHdvcmQsIENBUkQzMiBTbG90KQoreworICAgIENBUkQzMiB2YWw7CisgICAgaW50IHNoaWZ0ID0gb2Zmc2V0ICYgMHgyOworICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7CisgICAgdmFsID0gcmVhZFBjaShTbG90IHwgb2Zmc2V0KTsKKyAgICB2YWwgJj0gfihDQVJEMzIpKDB4ZmZmZiA8PCAoc2hpZnQgPDwgMykpOworICAgIHZhbCB8PSB3b3JkIDw8IChzaGlmdCA8PCAzKTsKKyAgICB3cml0ZVBjaShTbG90IHwgb2Zmc2V0LCB2YWwpOworfQorCit2b2lkCitQY2lXcml0ZTMyKGludCBvZmZzZXQsIENBUkQzMiBsZywgQ0FSRDMyIFNsb3QpCit7CisgICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKKyAgICB3cml0ZVBjaShTbG90IHwgb2Zmc2V0LCBsZyk7Cit9CisKK2ludAorbWFwUGNpUm9tKFBjaVN0cnVjdFB0ciBwY2lQKQoreworICAgIHVuc2lnbmVkIGxvbmcgUm9tQmFzZSA9IDA7CisgICAgaW50IG1lbV9mZDsKKyAgICB1bnNpZ25lZCBjaGFyICptZW0sICpwdHI7CisgICAgdW5zaWduZWQgY2hhciAqc2NyYXRjaCA9IE5VTEw7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgQ0FSRDMyIGJpb3NTaXplID0gMHgxMDAwMDAwOworICAgIENBUkQzMiBlbmFibGVQY2k7CisKKyAgICBpZiAoIXBjaVApCisgICAgICBwY2lQID0gQ3VycmVudFBjaTsKKworICAgIGlmIChGSVhfUk9NKSB7CisgICAgICAgIFJvbUJhc2UgPSBmaW5kQklPU01hcChwY2lQLCAmYmlvc1NpemUpOworICAgICAgICBpZiAoIVJvbUJhc2UpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVtYXAgQklPUyBvZiAlaTolaTolaSAiCisgICAgICAgICAgICAgICAgICAgICItIHRyeWluZyBwcmVzZXQgYWRkcmVzc1xuIixwY2lQLT5idXMscGNpUC0+ZGV2LAorICAgICAgICAgICAgICAgICAgICBwY2lQLT5mdW5jKTsKKyAgICAgICAgICAgIFJvbUJhc2UgPSBwY2lQLT5Sb21CYXNlICYgfihDQVJEMzIpMHhGRjsKKyAgICAgICAgfQorICAgIH0gIGVsc2UgeworICAgICAgICBSb21CYXNlID0gcGNpUC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTB4RkY7CisgICAgICAgIGlmICh+Um9tQmFzZSArIDEgPCBiaW9zU2l6ZSB8fCAhUm9tQmFzZSkKKyAgICAgICAgICAgIFJvbUJhc2UgPSBmaW5kQklPU01hcChwY2lQLCAmYmlvc1NpemUpOworICAgIH0KKworICAgIFBfcHJpbnRmKCJSb21CYXNlOiAweCVseFxuIixSb21CYXNlKTsKKyAgICAKKyAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7CisgICAgICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKKyAgICAgICAgcmVzdG9yZU1lbShwY2lQKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBQY2lXcml0ZTMyKDB4MzAsUm9tQmFzZSB8IDEscGNpUC0+U2xvdC5sKTsKKworI2lmZGVmIF9fYWxwaGFfXworICAgIG1lbSA9IHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgwLCBiaW9zU2l6ZSwgUFJPVF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBtZW1fZmQsIFJvbUJhc2UgfCBfYnVzX2Jhc2UoKSk7CisjZWxzZQorICAgIG1lbSA9IHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgwLCBiaW9zU2l6ZSwgUFJPVF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBtZW1fZmQsIFJvbUJhc2UpOworI2VuZGlmCisgICAgaWYgKHBjaVAgIT0gQ3VycmVudFBjaSkgeworICAgICAgZW5hYmxlUGNpID0gUGNpUmVhZDMyKDB4NCxwY2lQLT5TbG90LmwpOworICAgICAgUGNpV3JpdGUzMigweDQsZW5hYmxlUGNpIHwgMHgyLHBjaVAtPlNsb3QubCk7CisgICAgfQorCisjaWZkZWYgUFJJTlRfUENJCisgICAgZHByaW50KCh1bnNpZ25lZCBsb25nKXB0ciwweDMwKTsKKyNlbmRpZgorICAgIHdoaWxlICggKnB0ciA9PSAweDU1ICYmICoocHRyKzEpID09IDB4QUEpIHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZGF0YV9vZmYgPSAqKHB0cisweDE4KSB8ICgqKHB0cisweDE5KTw8IDgpOworICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhID0gcHRyICsgZGF0YV9vZmY7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCpkYXRhIT0nUCcgfHwgKihkYXRhKzEpIT0nQycgfHwgKihkYXRhKzIpIT0nSScgfHwgKihkYXRhKzMpIT0nUicpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHR5cGUgPSAqKGRhdGEgKyAweDE0KTsKKyAgICAgICAgUF9wcmludGYoImRhdGEgc2VnbWVudCBpbiBCSU9TOiAweCV4LCB0eXBlOiAweCV4ICIsZGF0YV9vZmYsdHlwZSk7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZSAhPSAwKSAgeyAvKiBub3QgUEMtQVQgaW1hZ2U6IGZpbmQgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbWFnZV9sZW5ndGg7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGljYXRvciA9ICooZGF0YSArIDB4MTUpOworICAgICAgICAgICAgaWYgKGluZGljYXRvciAmIDB4ODApIC8qIGxhc3QgaW1hZ2UgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGltYWdlX2xlbmd0aCA9ICgqKGRhdGEgKyAweDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCooZGF0YSArIDB4MTEpIDw8IDgpKSA8PCA5OworICAgICAgICAgICAgUF9wcmludGYoImRhdGEgaW1hZ2UgbGVuZ3RoOiAweCV4LCBpbmQ6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBpbWFnZV9sZW5ndGgsaW5kaWNhdG9yKTsKKyAgICAgICAgICAgIHB0ciA9IHB0ciArIGltYWdlX2xlbmd0aDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIE9LLCB3ZSBoYXZlIGEgUEMgSW1hZ2UgKi8KKyAgICAgICAgbGVuZ3RoID0gKCoocHRyICsgMikgPDwgOSk7CisgICAgICAgIFBfcHJpbnRmKCJCSU9TIGxlbmd0aDogMHgleFxuIixsZW5ndGgpOworICAgICAgICBzY3JhdGNoID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgLyogZG9uJ3QgdXNlIG1lbWNweSgpIGhlcmU6IFJlYWRpbmcgZnJvbSBidXMhICovCisgICAgICAgIGZvciAoaT0wO2k8bGVuZ3RoO2krKykKKyAgICAgICAgICAgICooc2NyYXRjaCArIGkpPSoocHRyICsgaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwY2lQICE9IEN1cnJlbnRQY2kpCisgICAgICBQY2lXcml0ZTMyKDB4NCxlbmFibGVQY2kscGNpUC0+U2xvdC5sKTsKKworICAgIC8qIHVubWFwL2Nsb3NlL2Rpc2FibGUgUENJIGJpb3MgbWVtICovCisgICAgbXVubWFwKG1lbSwgYmlvc1NpemUpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgLyogZGlzYWJsZSBhbmQgcmVzdG9yZSBtYXBwaW5nICovCisgICAgd3JpdGVQY2kocGNpUC0+U2xvdC5sIHwgMHgzMCwgcGNpUC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTEpOworCisgICAgaWYgKHNjcmF0Y2ggJiYgbGVuZ3RoKSB7CisgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKVZfQklPUywgc2NyYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZnJlZShzY3JhdGNoKTsKKyAgICB9CisgICAgCisgICAgcmVzdG9yZU1lbShwY2lQKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitDQVJEMzIKK2ZpbmRQY2koQ0FSRDE2IHNsb3RCWCkKK3sKKyAgICBDQVJEMzIgc2xvdCA9IHNsb3RCWCA8PCA4OworCisgICAgaWYgKHNsb3QgPT0gKEN1cnJlbnRQY2ktPlNsb3QubCAmIH5QQ0lfRU4pKQorICAgICAgICByZXR1cm4gKEN1cnJlbnRQY2ktPlNsb3QubCB8IFBDSV9FTik7CisgICAgZWxzZSB7CisjaWYgIVNIT1dfQUxMX0RFVgorICAgICAgICBQY2lCdXNQdHIgcEJ1cyA9IEN1cnJlbnRQY2ktPnBCdXM7CisgICAgICAgIHdoaWxlIChwQnVzKSB7CisgICAgICAgICAgLy8gICAgICBmcHJpbnRmKHN0ZGVyciwic2xvdDogMHgleCAgYnJpZGdlOiAweCV4XG4iLHNsb3QsIHBCdXMtPlNsb3QubCk7CisgICAgICAgICAgICBpZiAoc2xvdCA9PSAocEJ1cy0+U2xvdC5sICYgflBDSV9FTikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBCdXMtPlNsb3QubCB8IFBDSV9FTjsKKyAgICAgICAgICAgIHBCdXMgPSBwQnVzLT5uZXh0OworICAgICAgICB9CisjZWxzZQorICAgICAgICBQY2lTdHJ1Y3RQdHIgcFBjaSA9IFBjaVN0cnVjdDsKKyAgICAgICAgd2hpbGUgKHBQY2kpIHsKKyAgICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCJzbG90OiAweCV4ICBicmlkZ2U6IDB4JXhcbiIsc2xvdCwgcFBjaS0+U2xvdC5sKTsKKyAgICAgICAgICAgIGlmIChzbG90ID09IChwUGNpLT5TbG90LmwgJiB+UENJX0VOKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcFBjaS0+U2xvdC5sIHwgUENJX0VOOworICAgICAgICAgICAgcFBjaSA9IHBQY2ktPm5leHQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQ0FSRDE2CitwY2lTbG90QlgoUGNpU3RydWN0UHRyIHBQY2kpCit7CisgICAgcmV0dXJuIChDQVJEMTYpKChwUGNpLT5TbG90LmwgPj4gOCkgJiAweEZGRkYpOworfQorCitQY2lTdHJ1Y3RQdHIKK2ZpbmRQY2lEZXZpY2UoQ0FSRDE2IHZlbmRvcklELCBDQVJEMTYgZGV2aWNlSUQsIGNoYXIgbikKK3sKKyAgICBQY2lTdHJ1Y3RQdHIgcFBjaSA9IEN1cnJlbnRQY2k7CisgICAgbisrOworCisgICAgd2hpbGUgKHBQY2kpICB7CisgICAgICAgIGlmICgocFBjaS0+VmVuZG9ySUQgPT0gdmVuZG9ySUQpICYmIChwUGNpLT5EZXZpY2VJRCA9PSBkZXZpY2VJRCkpIHsKKyAgICAgICAgaWYgKCEoLS1uKSkgYnJlYWs7CisgICAgICAgIH0KKyAgICBwUGNpID0gcFBjaS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHBQY2k7Cit9CisKK1BjaVN0cnVjdFB0cgorZmluZFBjaUNsYXNzKENBUkQ4IGludGYsIENBUkQ4IHN1YkNsYXNzLCBDQVJEMTYgY2xhc3MsIGNoYXIgbikKK3sKKyAgICBQY2lTdHJ1Y3RQdHIgcFBjaSA9IEN1cnJlbnRQY2k7CisgICAgbisrOworCisgICAgd2hpbGUgKHBQY2kpICB7CisgICAgICAgIGlmICgocFBjaS0+SW50ZXJmYWNlID09IGludGYpICYmIChwUGNpLT5TdWJDbGFzcyA9PSBzdWJDbGFzcykKKyAgICAgICAgICYmIChwUGNpLT5CYXNlQ2xhc3MgPT0gY2xhc3MpKSB7CisgICAgICAgIGlmICghKC0tbikpIGJyZWFrOworICAgICAgICB9CisgICAgcFBjaSA9IHBQY2ktPm5leHQ7CisgICAgfQorICAgIHJldHVybiBwUGNpOworfQorCitzdGF0aWMgdm9pZAorcmVhZENvbmZpZ1NwYWNlQ2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYywgQ0FSRDMyICpyZWcpCit7CisgICAgQ0FSRDMyICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IChidXM8PDE2KSB8CisgICAgICAoZGV2PDwxMSkgfCAoZnVuYzw8OCk7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpPDY0O2krPTQpIHsKKyNpZmRlZiBfX2FscGhhX18KKyAgICAgICAgcmVnW2ldID0gYXhwUGNpQ2ZnUmVhZChjb25maWdfY21kIHwgaSk7CisjZWxzZQorICAgICAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgY29uZmlnX2NtZCB8IGkpOworICAgICAgICByZWdbaV0gPSBpbmwoUENJX01PREUxX0RBVEFfUkVHKTsKKyNlbmRpZgorCisjaWZkZWYgVjg2QklPU19ERUJVRworICAgICAgICBQX3ByaW50ZigiMHglbHhcbiIscmVnW2ldKTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGludAorY2hlY2tTbG90Q2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYykKK3sKKyAgICBDQVJEMzIgICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IChidXM8PDE2KSB8CisgICAgICAoZGV2PDwxMSkgfCAoZnVuYzw8OCk7CisgICAgQ0FSRDMyIHJlZzsKKyNpZmRlZiBfX2FscGhhX18KKyAgICAgICAgcmVnID0gYXhwUGNpQ2ZnUmVhZChjb25maWdfY21kKTsKKyNlbHNlCisgICAgICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCBjb25maWdfY21kKTsKKyAgICAgICAgcmVnID0gaW5sKFBDSV9NT0RFMV9EQVRBX1JFRyk7CisjZW5kaWYKKyAgICBpZiAocmVnICE9IDB4RkZGRkZGRkYpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrU2xvdENmZzIoQ0FSRDMyIGJ1cywgaW50IGRldikKK3sKKyAgICBDQVJEMzIgdmFsOworCisgICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7CisgICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7CisgICAgdmFsID0gaW5sKGRldiA8PCA4KTsKKyAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgMHgwMCk7CisgICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7CisgICAgaWYgKHZhbCA9PSAweEZGRkZGRkZGKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAodmFsID09IDB4RjBGMEYwRjApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcmVhZENvbmZpZ1NwYWNlQ2ZnMihDQVJEMzIgYnVzLCBpbnQgZGV2LCBDQVJEMzIgKnJlZykKK3sKKyAgICBpbnQgaTsKKworICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4RjEpOworICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCBidXMpOworICAgIGZvciAoaSA9IDA7IGk8NjQ7aSs9NCkgeworICAgICAgICByZWdbaV0gPSBpbmwoKGRldiA8PCA4KSArIGkpOworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICAgICAgUF9wcmludGYoIjB4JWx4XG4iLHJlZ1tpXSk7CisjZW5kaWYKKyAgICB9CisgICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Cit9CisKK3N0YXRpYyBDQVJEOAoraW50ZXJwcmV0Q29uZmlnU3BhY2UoQ0FSRDMyICpyZWcsIGludCBidXNpZHgsIENBUkQ4IGRldiwgQ0FSRDggZnVuYykKK3sKKyAgICBDQVJEMzIgY29uZmlnX2NtZDsKKyAgICBDQVJEMTYgdmVuZG9yLCBkZXZpY2U7CisgICAgQ0FSRDggYmFzZWNsYXNzLCBzdWJjbGFzczsKKyAgICBDQVJEOCBwcmltYXJ5LCBzZWNvbmRhcnk7CisgICAgQ0FSRDggaGVhZGVyLCBpbnRlcmZhY2U7CisgICAgaW50IGk7CisgICAgCisgICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IGJ1c2lkeDw8MTYgfAorICAgICAgICAoZGV2PDwxMSkgfCAoZnVuYzw8OCk7CisKKyAgICBmb3IgKGkgPSAweDEwOyBpIDwgMHgyODsgaSs9NCkgeworICAgICAgICBpZiAoSVNfTUVNMzIocmVnW2ldKSkKKyAgICAgICAgICAgIGlmICgocmVnW2ldICYgMHhGRkZGRkZGMCkgPCBwY2lNaW5NZW1SZWcpCisgICAgICAgICAgICAgICAgcGNpTWluTWVtUmVnID0gKHJlZ1tpXSAmIDB4RkZGRkZGRjApOworI2lmZGVmIF9fYWxwaGFfXworICAgICAgICBpZiAoSVNfTUVNNjQocmVnW2ldKSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlZ1tpXSB8IAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykocmVnW2krNF0pIDw8IDMyOworICAgICAgICAgICAgaWYgKChhZGRyICYgfjB4ZkwpIDwgcGNpTWluTWVtUmVnKQorICAgICAgICAgICAgICAgIHBjaU1pbk1lbVJlZyA9IChhZGRyICYgfjB4ZkwpOworICAgICAgICAgICAgaSs9NDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHZlbmRvciA9IHJlZ1swXSAmIDB4RkZGRjsKKyAgICBkZXZpY2UgPSByZWdbMF0gPj4gMTY7CisgICAgUF9wcmludGYoImJ1czogJWkgY2FyZDogJWkgZnVuYyAlaSByZWcwOiAweCV4ICIsIGJ1c2lkeCxkZXYsZnVuYyxyZWdbMF0pOworICAgIGJhc2VjbGFzcyA9IHJlZ1s4XSA+PiAyNDsKKyAgICBzdWJjbGFzcyA9IChyZWdbOF0gPj4gMTYpICYgMHhGRjsKKyAgICBpbnRlcmZhY2UgPSAocmVnWzhdID4+IDgpICYgMHhGRjsKKworICAgIGhlYWRlciA9IChyZWdbMHgwY10gPj4gMTYpICYgMHhmZjsKKyAgICBQX3ByaW50ZigiYmMgMHgleCwgc3ViIDB4JXgsIGlmIDB4JXgsIGhkciAweCV4XG4iLAorICAgICAgICAgICAgIGJhc2VjbGFzcyxzdWJjbGFzcyxpbnRlcmZhY2UsaGVhZGVyKTsKKyAgICBpZiAoQlJJREdFX0NMQVNTKGJhc2VjbGFzcykpIHsKKyAgICAgICAgaWYgKEJSSURHRV9QQ0lfQ0xBU1Moc3ViY2xhc3MpKSB7CisgICAgICAgICAgICBQY2lCdXNQdHIgcGJwID0gbWFsbG9jKHNpemVvZihQY2lCdXNSZWMpKTsKKyAgICAgICAgICAgIFBfcHJpbnRmKCJQY2ktUGNpIEJyaWRnZSBmb3VuZDsgIik7CisgICAgICAgICAgICBwcmltYXJ5ID0gcmVnWzB4MThdICYgMHhGRjsKKyAgICAgICAgICAgIHNlY29uZGFyeSA9IChyZWdbMHgxOF0gPj4gOCkgJiAweEZGOworICAgICAgICAgICAgUF9wcmludGYoInByaW1hcnk6IDB4JXggc2Vjb25kYXJ5OiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSxzZWNvbmRhcnkpOworICAgICAgICAgICAgcGJwLT5iY3RsID0gcmVnWzB4M2NdOworICAgICAgICAgICAgcGJwLT5wcmltYXJ5ID0gcHJpbWFyeTsKKyAgICAgICAgICAgIHBicC0+c2Vjb25kYXJ5ID0gc2Vjb25kYXJ5OworICAgICAgICAgICAgcGJwLT5TbG90LmwgPSBjb25maWdfY21kOworICAgICAgICAgICAgcGJwLT5uZXh0ID0gUGNpQnVzZXM7CisgICAgICAgICAgICBQY2lCdXNlcyA9IHBicDsKKyAgICAgICAgICAgIG51bWJ1cysrOworICAgICAgICB9IGVsc2UgaWYgKEJSSURHRV9IT1NUX0NMQVNTKHN1YmNsYXNzKQorICAgICAgICAgICAgICAgICAgICYmIChob3N0YnJpZGdlcysrID4gMSkpIHsKKyAgICAgICAgICAgIG51bWJ1cysrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChWSURFT19DTEFTUyhiYXNlY2xhc3Msc3ViY2xhc3MpKSB7CisgICAgICAgIFBjaVN0cnVjdFB0ciBwY3AgPSBtYWxsb2Moc2l6ZW9mKFBjaVN0cnVjdFJlYykpOworICAgICAgICBQX3ByaW50ZigiRGlzcGxheSBhZGFwdGVyIGZvdW5kXG4iKTsKKyAgICAgICAgcGNwLT5Sb21CYXNlID0gcmVnWzB4MzBdOworICAgICAgICBwY3AtPmNtZF9zdCA9IHJlZ1s0XTsKKyAgICAgICAgcGNwLT5hY3RpdmUgPSAocmVnWzRdICYgMHgwMykgPT0gMyA/IDEgOiAwOworICAgICAgICBwY3AtPlZlbmRvcklEID0gdmVuZG9yOworICAgICAgICBwY3AtPkRldmljZUlEID0gZGV2aWNlOworICAgICAgICBwY3AtPkludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICAgICAgcGNwLT5CYXNlQ2xhc3MgPSBiYXNlY2xhc3M7CisgICAgICAgIHBjcC0+U3ViQ2xhc3MgPSBzdWJjbGFzczsKKyAgICAgICAgcGNwLT5TbG90LmwgPSBjb25maWdfY21kOworICAgICAgICBwY3AtPmJ1cyA9IGJ1c2lkeDsKKyAgICAgICAgcGNwLT5kZXYgPSBkZXY7CisgICAgICAgIHBjcC0+ZnVuYyA9IGZ1bmM7CisgICAgICAgIHBjcC0+bmV4dCA9IFBjaVN0cnVjdDsKKyAgICAgICAgUGNpU3RydWN0ID0gcGNwOworICAgIH0KKyAgICBpZiAoKGZ1bmMgPT0gMCkKKyAgICAgICAgJiYgKChoZWFkZXIgJiBQQ0lfTVVMVElGVU5DX0RFVikgPT0gMCkpCisgICAgICAgIGZ1bmMgPSA4OworICAgIGVsc2UKKyAgICAgICAgZnVuYysrOworICAgIHJldHVybiBmdW5jOworfQorCitzdGF0aWMgQ0FSRDMyIHJlbWFwTUVNX3ZhbDsKK3N0YXRpYyBpbnQgcmVtYXBNRU1fbnVtOworCitzdGF0aWMgaW50IC8qIG1hcCBpdCBvbiBzb21lIG90aGVyIHZpZGVvIGRldmljZSAqLworcmVtYXBNZW0oUGNpU3RydWN0UHRyIHBjaVAsIGludCBudW0sIENBUkQzMiBzaXplKQoreworICAgIFBjaVN0cnVjdFB0ciBwY2lQdHIgPSBQY2lTdHJ1Y3Q7CisgICAgaW50IGk7CisgICAgQ0FSRDMyIG9yZzsKKyAgICBDQVJEMzIgdmFsOworICAgIENBUkQzMiBzaXplX247CisgICAgCisgICAgb3JnID0gUGNpUmVhZDMyKG51bSArIDB4MTAscGNpUC0+U2xvdC5sKTsKKyAgICAKKyAgICB3aGlsZSAocGNpUHRyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaT1pKzQpIHsKKworICAgICAgICAgICAgdmFsID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKKyAgICAgICAgICAgIC8qIGRvbid0IG1hcCBpdCBvbiBpdHNlbGYgKi8KKyAgICAgICAgICAgIGlmICgob3JnICYgMHhmZmZmZmZmMCkgPT0gKHZhbCAmIDB4ZmZmZmZmZjApKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHZhbCAmJiAhKHZhbCAmIDEpKQorICAgICAgICAgICAgICAgIFBjaVdyaXRlMzIoaSArIDB4MTAsMHhmZmZmZmZmZixwY2lQdHItPlNsb3QubCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzaXplX24gPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOworICAgICAgICAgICAgUGNpV3JpdGUzMihpICsgMHgxMCx2YWwscGNpUHRyLT5TbG90LmwpOworICAgICAgICAgICAgc2l6ZV9uID0gfihDQVJEMzIpKHNpemVfbiAgJiAweGZmZmZmZmYwKSArIDE7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNpemVfbiA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgUGNpV3JpdGUzMihudW0gKyAweDEwLHZhbCxwY2lQLT5TbG90LmwpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKKyAgICB9CisgICAgLyogbGFzdCByZXNvcnQ6IHRyeSB0byBnbyBiZWxvdyBsb3dlc3QgUENJIG1lbSBhZGRyZXNzICovCisgICAgdmFsID0gKChwY2lNaW5NZW1SZWcgJiB+KENBUkQzMikoc2l6ZSAtIDEpKSAtIHNpemUpOworICAgIGlmICh2YWwgPiAweDdmZmZmZmZmKSB7CisgICAgICAgIFBjaVdyaXRlMzIobnVtICsgMHgxMCx2YWwsIHBjaVAtPlNsb3QubCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVzdG9yZU1lbShQY2lTdHJ1Y3RQdHIgcGNpUCkKK3sKKyAgICBpZiAocmVtYXBNRU1fdmFsID09IDApIHJldHVybjsKKyAgICBQY2lXcml0ZTMyKHJlbWFwTUVNX251bSArIDB4MTAscmVtYXBNRU1fdmFsLHBjaVAtPlNsb3QubCk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgQ0FSRDMyCitmaW5kQklPU01hcChQY2lTdHJ1Y3RQdHIgcGNpUCwgQ0FSRDMyICpiaW9zU2l6ZSkKK3sKKyAgICBQY2lTdHJ1Y3RQdHIgcGNpUHRyID0gUGNpU3RydWN0OworICAgIGludCBpOworICAgIENBUkQzMiB2YWw7CisgICAgQ0FSRDMyIHNpemU7CisgICAgCisgICAgUGNpV3JpdGUzMigweDMwLDB4ZmZmZmZmZmYscGNpUC0+U2xvdC5sKTsKKyAgICAqYmlvc1NpemUgPSBQY2lSZWFkMzIoMHgzMCxwY2lQLT5TbG90LmwpOworICAgIFBfcHJpbnRmKCJiaW9zIHNpemU6IDB4JXhcbiIsKmJpb3NTaXplKTsKKyAgICBQY2lXcml0ZTMyKDB4MzAscGNpUC0+Um9tQmFzZSxwY2lQLT5TbG90LmwpOworICAgICpiaW9zU2l6ZSA9IH4oKmJpb3NTaXplICYgMHhGRkZGRkYwMCkgKyAxOworICAgIFBfcHJpbnRmKCJiaW9zIHNpemUgbWFza2VkOiAweCV4XG4iLCpiaW9zU2l6ZSk7CisgICAgaWYgKCpiaW9zU2l6ZSA+ICgxMDI0ICogMTAyNCAqIDE2KSkgeworICAgICAgKmJpb3NTaXplID0gMTAyNCAqIDEwMjQgKiAxNjsKKyAgICAgIFBfcHJpbnRmKCJmaXhpbmcgYnJva2VuIEJJT1Mgc2l6ZTogMHgleFxuIiwqYmlvc1NpemUpOworICAgIH0KKyAgICB3aGlsZSAocGNpUHRyKSB7CisgICAgICAgIGlmIChwY2lQdHItPmJ1cyAhPSBwY2lQLT5idXMpIHsKKyAgICAgICAgICAgIHBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaT1pKzQpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFsID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKKyAgICAgICAgICAgIGlmICghKHZhbCAmIDEpKQorICAgIAorICAgICAgICAgICAgUGNpV3JpdGUzMihpICsgMHgxMCwweGZmZmZmZmZmLHBjaVB0ci0+U2xvdC5sKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHNpemUgPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOworICAgICAgICAgICAgUGNpV3JpdGUzMihpICsgMHgxMCx2YWwscGNpUHRyLT5TbG90LmwpOworICAgICAgICAgICAgc2l6ZSA9IH4oQ0FSRDMyKShzaXplICYgMHhGRkZGRkZGMCkgKyAxOworI2lmZGVmIFY4Nl9CSU9TX0RFQlVHCisgICAgICAgICAgICBQX3ByaW50Zigic2l6ZTogMHgleFxuIixzaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHNpemUgPj0gKmJpb3NTaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKHBjaVAgPT0gcGNpUHRyKSB7IC8qIGlmIHNhbWUgZGV2aWNlIHJlbWFwIHJhbSovCisgICAgICAgICAgICAgICAgICAgIGlmICghKHJlbWFwTWVtKHBjaVAsaSxzaXplKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYXBNRU1fdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICByZW1hcE1FTV9udW0gPSBpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlbWFwTUVNX3ZhbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB2YWwgJiAweEZGRkZGRjAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKKyAgICB9CisgICAgcmVtYXBNRU1fdmFsID0gMDsKKyAgICAvKiB2ZXJ5IGxhc3QgcmVzb3J0ICovCisgICAgaWYgKHBjaVAtPmJ1cyA9PSAwICYmIChwY2lNaW5NZW1SZWcgPiAqYmlvc1NpemUpKSAKKyAgICAgIHJldHVybiAocGNpTWluTWVtUmVnIC0gc2l6ZSkgJiB+KHNpemUgLSAxKTsKKyAgICAgIAorICAgIHJldHVybiAwOworfQorCitpbnQKK2NmZzFvdXQoQ0FSRDE2IGFkZHIsIENBUkQzMiB2YWwpCit7CisgIGlmIChhZGRyID09IDB4Q0Y4KSB7CisgICAgUGNpQ2ZnMUFkZHIgPSB2YWw7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoYWRkciA9PSAweENGQykgeworICAgIHdyaXRlUGNpKFBjaUNmZzFBZGRyLCB2YWwpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgCitjZmcxaW4oQ0FSRDE2IGFkZHIsIENBUkQzMiAqdmFsKQoreworICBpZiAoYWRkciA9PSAweENGOCkgeworICAgICp2YWwgPSBQY2lDZmcxQWRkcjsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmIChhZGRyID09IDB4Q0ZDKSB7CisgICAgKnZhbCA9IHJlYWRQY2koUGNpQ2ZnMUFkZHIpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkCitsaXN0X3BjaSh2b2lkKQoreworICAgIFBjaVN0cnVjdFB0ciBwY2kgPSBQY2lMaXN0OworCisgICAgd2hpbGUgKHBjaSkgeworICAgIHByaW50ZigiWzB4JXg6MHgleDoweCV4XSB2ZW5kb3I6IDB4JTQuNHggZGV2OiAweCU0LjR4IGNsYXNzOiAweCU0LjR4IgorICAgICAgICAgICAiIHN1YmNsYXNzOiAweCU0LjR4XG4iLHBjaS0+YnVzLHBjaS0+ZGV2LHBjaS0+ZnVuYywKKyAgICAgICAgICAgcGNpLT5WZW5kb3JJRCxwY2ktPkRldmljZUlELHBjaS0+QmFzZUNsYXNzLHBjaS0+U3ViQ2xhc3MpOworICAgIHBjaSA9IHBjaS0+bmV4dDsKKyAgICB9Cit9CisKK1BjaVN0cnVjdFB0cgorZmluZFBjaUJ5SURzKGludCBidXMsIGludCBkZXYsIGludCBmdW5jKQoreworICBQY2lTdHJ1Y3RQdHIgcGNpUCA9IFBjaUxpc3Q7CisgIAorICB3aGlsZSAocGNpUCkgeworICAgIGlmIChwY2lQLT5idXMgPT0gYnVzICYmIHBjaVAtPmRldiA9PSBkZXYgJiYgcGNpUC0+ZnVuYyA9PSBmdW5jKQorICAgICAgcmV0dXJuIHBjaVA7CisgICAgcGNpUCA9IHBjaVAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI3MzYzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJ2ODZiaW9zLmgiCisKKyNpZm5kZWYgVjg2X1BDSV9ICisjZGVmaW5lIFY4Nl9QQ0lfSAorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgemVybzoyOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgcmVnOjY7CisgICAgICAgIHVuc2lnbmVkIGludCAgICBmdW5jOjM7CisgICAgICAgIHVuc2lnbmVkIGludCAgICBkZXY6NTsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIGJ1czo4OworICAgICAgICB1bnNpZ25lZCBpbnQgICAgcmVzZXJ2ZWQ6NzsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIGVuYWJsZToxOworICAgIH0gcGNpOworICAgIENBUkQzMiBsOworfSBQY2lTbG90OworCit0eXBlZGVmIHN0cnVjdCBwY2lCdXNSZWMgeworICAgIENBUkQ4IHByaW1hcnk7CisgICAgQ0FSRDggc2Vjb25kYXJ5OworICAgIENBUkQzMiBiY3RsOworICAgIFBjaVNsb3QgU2xvdDsKKyAgICBzdHJ1Y3QgcGNpQnVzUmVjICpuZXh0OworICAgIHN0cnVjdCBwY2lCdXNSZWMgKnBCdXM7Cit9IFBjaUJ1c1JlYywgKlBjaUJ1c1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgcGNpU3RydWN0UmVjIHsKKyAgICBDQVJEMTYgVmVuZG9ySUQ7CisgICAgQ0FSRDE2IERldmljZUlEOworICAgIENBUkQ4IEludGVyZmFjZTsKKyAgICBDQVJEOCBCYXNlQ2xhc3M7CisgICAgQ0FSRDggU3ViQ2xhc3M7CisgICAgQ0FSRDMyIFJvbUJhc2U7CisgICAgQ0FSRDMyIGJ1czsKKyAgICBDQVJEOCBkZXY7CisgICAgQ0FSRDggZnVuYzsKKyAgICBDQVJEMzIgY21kX3N0OworICAgIGludCBhY3RpdmU7CisgICAgUGNpU2xvdCBTbG90OworICAgIHN0cnVjdCBwY2lTdHJ1Y3RSZWMgKm5leHQ7CisgICAgUGNpQnVzUHRyIHBCdXM7Cit9IFBjaVN0cnVjdFJlYyAsICpQY2lTdHJ1Y3RQdHI7CisKKworZXh0ZXJuIFBjaVN0cnVjdFB0ciBDdXJyZW50UGNpOworZXh0ZXJuIFBjaVN0cnVjdFB0ciBQY2lMaXN0OworZXh0ZXJuIFBjaVN0cnVjdFB0ciBCb290QmlvczsKK2V4dGVybiBpbnQgcGNpTWF4QnVzOworCitleHRlcm4gQ0FSRDMyIGZpbmRQY2koQ0FSRDE2IHNsb3RCWCk7CitleHRlcm4gQ0FSRDE2IHBjaVNsb3RCWChQY2lTdHJ1Y3RQdHIpOworUGNpU3RydWN0UHRyIGZpbmRQY2lEZXZpY2UoQ0FSRDE2IHZlbmRvcklELCBDQVJEMTYgZGV2aWNlSUQsIGNoYXIgbik7CitQY2lTdHJ1Y3RQdHIgZmluZFBjaUNsYXNzKENBUkQ4IGludGYsIENBUkQ4IHN1YkNsYXNzLCBDQVJEMTYgY2xhc3MsIGNoYXIgbik7CisKK2V4dGVybiBDQVJEOCBQY2lSZWFkOChpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7CitleHRlcm4gQ0FSRDE2IFBjaVJlYWQxNihpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7CitleHRlcm4gQ0FSRDMyIFBjaVJlYWQzMihpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7CisKK2V4dGVybiB2b2lkIFBjaVdyaXRlOChpbnQgb2Zmc2V0LENBUkQ4IGJ5dGUsIENBUkQzMiBzbG90KTsKK2V4dGVybiB2b2lkIFBjaVdyaXRlMTYoaW50IG9mZnNldCxDQVJEMTYgd29yZCwgQ0FSRDMyIHNsb3QpOworZXh0ZXJuIHZvaWQgUGNpV3JpdGUzMihpbnQgb2Zmc2V0LENBUkQzMiBsZywgQ0FSRDMyIHNsb3QpOworCitleHRlcm4gdm9pZCBzY2FuX3BjaSh2b2lkKTsKK2V4dGVybiB2b2lkIHBjaVZpZGVvRGlzYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIHBjaVZpZGVvUmVzdG9yZSh2b2lkKTsKK2V4dGVybiB2b2lkIEVuYWJsZUN1cnJlbnQodm9pZCk7CitleHRlcm4gaW50IG1hcFBjaVJvbShQY2lTdHJ1Y3RQdHIgcGNpUCk7CitleHRlcm4gaW50IGNmZzFvdXQoQ0FSRDE2IGFkZHIsIENBUkQzMiB2YWwpOworZXh0ZXJuIGludCBjZmcxaW4oQ0FSRDE2IGFkZHIsIENBUkQzMiAqdmFsKTsKK2V4dGVybiB2b2lkIGxpc3RfcGNpKHZvaWQpOworZXh0ZXJuIFBjaVN0cnVjdFB0ciBmaW5kUGNpQnlJRHMoaW50IGJ1cywgaW50IGRldiwgaW50IGZ1bmMpOworCisjZGVmaW5lIFBDSV9NT0RFMl9FTkFCTEVfUkVHICAweENGOAorI2RlZmluZSBQQ0lfTU9ERTJfRk9SV0FSRF9SRUcgIDB4Q0ZBCisjZGVmaW5lIFBDSV9NT0RFMV9BRERSRVNTX1JFRyAgMHhDRjgKKyNkZWZpbmUgUENJX01PREUxX0RBVEFfUkVHICAweENGQworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKKyNkZWZpbmUgUENJX0VOIDB4MDAwMDAwMDAKKyNlbHNlCisjZGVmaW5lIFBDSV9FTiAweDgwMDAwMDAwCisjZW5kaWYKKyNkZWZpbmUgTUFYX0RFVl9QRVJfVkVORE9SX0NGRzEgIDMyCisjZGVmaW5lIEJSSURHRV9DTEFTUyh4KSAoeCA9PSAweDA2KQorI2RlZmluZSBCUklER0VfUENJX0NMQVNTKHgpICh4ID09IDB4MDQpCisjZGVmaW5lIEJSSURHRV9IT1NUX0NMQVNTKHgpICh4ID09IDB4MDApCisjZGVmaW5lIFBDSV9DTEFTU19QUkVISVNUT1JJQyAweDAwCisjZGVmaW5lIFBDSV9TVUJDTEFTU19QUkVISVNUT1JJQ19WR0EgMHgwMQorI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWSAweDAzCisjZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX1ZHQSAweDAwCisjZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX1hHQSAweDAxCisjZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX01JU0MgMHg4MAorI2RlZmluZSBWSURFT19DTEFTUyhiLHMpIFwKKyAgICAoKChiKSA9PSBQQ0lfQ0xBU1NfUFJFSElTVE9SSUMgJiYgKHMpID09IFBDSV9TVUJDTEFTU19QUkVISVNUT1JJQ19WR0EpIHx8IFwKKyAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfVkdBKSB8fFwKKyAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfWEdBKSB8fFwKKyAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfTUlTQykpCisjZGVmaW5lIFBDSV9NVUxUSUZVTkNfREVWICAweDgwCisjZGVmaW5lIE1BWF9QQ0lfREVWSUNFUyAgIDY0CisjZGVmaW5lIFBDSV9NQVhCVVMgMTYKKyNkZWZpbmUgUENJX0lTX01FTSAweDAwMDAwMDAxCisjZGVmaW5lIE1BWF9QQ0lfUk9NX1NJWkUgKDEwMjQgKiAxMDI0ICogMTYpCisKKyNkZWZpbmUgSVNfTUVNMzIoeCkgKCh4ICYgMHg3KSA9PSAwICYmIHggIT0gMCkKKyNkZWZpbmUgSVNfTUVNNjQoeCkgKCh4ICYgMHg3KSA9PSAweDQpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzBhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4Ni5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCisgKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDxzeXMvdm04Ni5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSAidjg2Ymlvcy5oIgorI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgorCitzdHJ1Y3Qgdm04Nl9zdHJ1Y3Qgdm04NnM7CisKK3N0YXRpYyBpbnQgdm04Nl9HUF9mYXVsdCh2b2lkKTsKK3N0YXRpYyBpbnQgdm04Nl9kb19pbnQoaW50IG51bSk7CitzdGF0aWMgdm9pZCBkdW1wX2NvZGUodm9pZCk7CitzdGF0aWMgdm9pZCBkdW1wX3JlZ2lzdGVycyh2b2lkKTsKK3N0YXRpYyB2b2lkIHN0YWNrX3RyYWNlKHZvaWQpOworc3RhdGljIGludCB2bTg2X3JlcChzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKnB0cik7CisKKyNkZWZpbmUgQ1BVX1JFRyh4KSAodm04NnMucmVncy4jI3gpCisjZGVmaW5lIENQVV9SRUdfTFcocmVnKSAgICAgICgqKChDQVJEMTYgKikmQ1BVX1JFRyhyZWcpKSkKKyNkZWZpbmUgQ1BVX1JFR19IVyhyZWcpICAgICAgKCooKENBUkQxNiAqKSZDUFVfUkVHKHJlZykgKyAxKSkKKyNkZWZpbmUgQ1BVX1JFR19MQihyZWcpICAgICAgKCooQ0FSRDggKikmQ1BVX1JFRyhlIyNyZWcpKQorI2RlZmluZSBTRUdfQURSKHR5cGUsIHNlZywgcmVnKSAgdHlwZSgoQ1BVX1JFR19MVyhzZWcpIDw8IDQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDUFVfUkVHX0xXKGUjI3JlZykpCisjZGVmaW5lIERGICgxIDw8IDEwKQorCitzdHJ1Y3QgcGlvIFA7CisKKwordm9pZAorc2V0dXBfaW8odm9pZCkgCit7CisgICAgaWYgKCFDb25maWcuUHJpbnRQb3J0ICYmICFDb25maWcuSW9TdGF0aXN0aWNzKSB7CisgICAgUC5pbmIgPSAoQ0FSRDgoKikoQ0FSRDE2KSlpbmI7CisgICAgUC5pbncgPSAoQ0FSRDE2KCopKENBUkQxNikpaW53OworICAgIFAuaW5sID0gKENBUkQzMigqKShDQVJEMTYpKWlubDsKKyAgICBQLm91dGIgPSAodm9pZCgqKShDQVJEMTYsQ0FSRDgpKW91dGI7CisgICAgUC5vdXR3ID0gKHZvaWQoKikoQ0FSRDE2LENBUkQxNikpb3V0dzsKKyAgICBQLm91dGwgPSAodm9pZCgqKShDQVJEMTYsQ0FSRDMyKSlvdXRsOworICAgIH0gZWxzZSB7CisgICAgUC5pbmIgPSBwX2luYjsKKyAgICBQLmludyA9IHBfaW53OworICAgIFAuaW5sID0gcF9pbmw7CisgICAgUC5vdXRiID0gcF9vdXRiOworICAgIFAub3V0dyA9IHBfb3V0dzsKKyAgICBQLm91dGwgPSBwX291dGw7CisgICAgfQorfQorCisgICAgCitzdGF0aWMgdm9pZAorc2V0dXBfdm04Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCit7CisgICAgQ0FSRDMyIGVpcDsKKyAgICBDQVJEMTYgY3M7CisgICAgCisgICAgdm04NnMuZmxhZ3MgPSBWTTg2X1NDUkVFTl9CSVRNQVA7CisgICAgdm04NnMuZmxhZ3MgPSAwOworICAgIHZtODZzLnNjcmVlbl9iaXRtYXAgPSAwOworICAgIHZtODZzLmNwdV90eXBlID0gQ1BVXzU4NjsKKyAgICBtZW1zZXQoJnZtODZzLmludF9yZXZlY3RvcmVkLCAweGZmLHNpemVvZih2bTg2cy5pbnRfcmV2ZWN0b3JlZCkpIDsKKyAgICBtZW1zZXQoJnZtODZzLmludDIxX3JldmVjdG9yZWQsIDB4ZmYsc2l6ZW9mKHZtODZzLmludDIxX3JldmVjdG9yZWQpKSA7CisKKyAgICBlaXAgPSBiaW9zX3N0YXJ0ICYgMHhGRkZGOworICAgIGNzID0gKGJpb3Nfc3RhcnQgJiAweEZGMDAwMCkgPj4gNDsKKyAgICAKKyAgICBDUFVfUkVHKGVheCkgPSByZWdzLT5heDsKKyAgICBDUFVfUkVHKGVieCkgPSByZWdzLT5ieDsKKyAgICBDUFVfUkVHKGVjeCkgPSByZWdzLT5jeDsKKyAgICBDUFVfUkVHKGVkeCkgPSByZWdzLT5keDsKKyAgICBDUFVfUkVHKGVzaSkgPSAwOworICAgIENQVV9SRUcoZWRpKSA9IHJlZ3MtPmRpOworICAgIENQVV9SRUcoZWJwKSA9IDA7CisgICAgQ1BVX1JFRyhlaXApID0gZWlwOworICAgIENQVV9SRUcoY3MpID0gY3M7ICAgICAgICAgICAgICAgCisgICAgQ1BVX1JFRyhlc3ApID0gMHgxMDA7CisgICAgQ1BVX1JFRyhzcykgPSAweDMwOyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBjIGJpb3Mgc3RhY2sgKi8KKyAgICBDUFVfUkVHKGVzKSA9IHJlZ3MtPmVzOworICAgIENQVV9SRUcoZHMpID0gMHg0MDsgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCBwYyBkcyAqLworICAgIENQVV9SRUcoZnMpID0gMDsKKyAgICBDUFVfUkVHKGdzKSA9IDA7CisgICAgQ1BVX1JFRyhlZmxhZ3MpIHw9IChWSUZfTUFTSyB8IFZJUF9NQVNLKTsKK30KKwordm9pZAorY29sbGVjdF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKK3sKKyAgICByZWdzLT5heCA9IENQVV9SRUcoZWF4KTsKKyAgICByZWdzLT5ieCA9IENQVV9SRUcoZWJ4KTsKKyAgICByZWdzLT5jeCA9IENQVV9SRUcoZWN4KTsKKyAgICByZWdzLT5keCA9IENQVV9SRUcoZWR4KTsKKyAgICByZWdzLT5lcyA9IENQVV9SRUcoZXMpOworICAgIHJlZ3MtPmRzID0gQ1BVX1JFRyhkcyk7CisgICAgcmVncy0+ZGkgPSBDUFVfUkVHKGVkaSk7CisgICAgcmVncy0+c2kgPSBDUFVfUkVHKGVzaSk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3ZtODYodm9pZCkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIAorI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBkdW1wX3JlZ2lzdGVycygpOworI2VuZGlmCisvLyAgICByZXR2YWwgPSBTWVNfdm04Nm9sZCgmdm04NnMpOworLy8gICAgcmV0dmFsID0gc3lzY2FsbChTWVNfdm04Nm9sZCwmdm04NnMpOworCisgICAgcmV0dmFsID0gdm04Nl9yZXAoJnZtODZzKTsKKyAgICAKKyAgICBzd2l0Y2ggKFZNODZfVFlQRShyZXR2YWwpKSB7CisgICAgY2FzZSBWTTg2X1VOS05PV046CisgICAgICAgIGlmICghdm04Nl9HUF9mYXVsdCgpKSByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWTTg2X1NUSToKKyAgICAgICAgZnByaW50ZihzdGRlcnIsInZtODZfc3RpIDotKChcbiIpOworICAgICAgICBzdGFja190cmFjZSgpOworICAgICAgICBkdW1wX2NvZGUoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBWTTg2X0lOVHg6CisgICAgICAgIGlmICghdm04Nl9kb19pbnQoVk04Nl9BUkcocmV0dmFsKSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblVua25vd24gdm04Nl9pbnQ6ICVYXG5cbiIsVk04Nl9BUkcocmV0dmFsKSk7CisgICAgICAgICAgICBkdW1wX3JlZ2lzdGVycygpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogSSdtIG5vdCBzdXJlIHlldCB3aGF0IHRvIGRvIGlmIHdlIGNhbiBoYW5kbGUgaW50cyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZNODZfU0lHTkFMOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwicmVjZWl2ZWQgc2lnbmFsXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsInVua25vd24gdHlwZSgweCV4KT0weCV4XG4iLAorICAgICAgICAgICAgICAgIFZNODZfQVJHKHJldHZhbCksVk04Nl9UWVBFKHJldHZhbCkpOworICAgICAgICBkdW1wX3JlZ2lzdGVycygpOworICAgICAgICBkdW1wX2NvZGUoKTsKKyAgICAgICAgc3RhY2tfdHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgam1wX2J1ZiB4ODZfZXNjOworc3RhdGljIHZvaWQKK3ZtZXhpdChpbnQgdW51c2VkKQoreworICAgIGxvbmdqbXAoeDg2X2VzYywxKTsKK30KKwordm9pZAorZG9feDg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCwgaTg2Ymlvc1JlZ3NQdHIgcmVncykKK3sKKyAgICBzdGF0aWMgdm9pZCAoKm9yZ19oYW5kbGVyKShpbnQpOworICAgIAorICAgIHNldHVwX3ZtODYoYmlvc19zdGFydCwgcmVncyk7CisgICAgaWYgKHNldGptcCh4ODZfZXNjKSA9PSAwKSB7CisgICAgICAgIG9yZ19oYW5kbGVyID0gc2lnbmFsKDIsdm1leGl0KTsKKyAgICAgICAgd2hpbGUoZG9fdm04NigpKSB7fTsKKyAgICAgICAgc2lnbmFsKDIsb3JnX2hhbmRsZXIpOworICAgICAgICBjb2xsZWN0X2Jpb3NfcmVncyhyZWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaWduYWwoMixvcmdfaGFuZGxlcik7CisgICAgICAgIHByaW50ZigiaW50ZXJydXB0ZWQgYXQgMHgleFxuIiwoKENBUkQxNilDUFVfUkVHKGNzKSkgPDwgNAorICAgICAgICAgICB8IChDQVJEMTYpQ1BVX1JFRyhlaXApKTsKKyAgICB9Cit9CisKKy8qIGdldCB0aGUgbGluZWFyIGFkZHJlc3MgKi8KKyNkZWZpbmUgTElOX1BSRUZfU0kgICgocHJlZl9zZWcgPDwgNCkgKyBDUFVfUkVHX0xXKGVzaSkpCisKKyNkZWZpbmUgTFdFQ1ggICAgICAgKHByZWZpeDY2IF4gcHJlZml4NjcgPyBDUFVfUkVHKGVjeCkgOiBDUFVfUkVHX0xXKGVjeCkpCisKK3N0YXRpYyBpbnQKK3ZtODZfR1BfZmF1bHQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpjc3AsICpsaW5hOworICAgIENBUkQzMiBvcmdfZWlwOworICAgIGludCBwcmVmX3NlZzsKKyAgICBpbnQgZG9uZSxpc19yZXAscHJlZml4NjYscHJlZml4Njc7CisKKworICAgIGNzcCA9IGxpbmEgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBjcywgaXApOworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBwcmludGYoImV4Y2VwdGlvbjogXG4iKTsKKyAgICBkdW1wX2NvZGUoKTsKKyNlbmRpZgorCisgICAgaXNfcmVwID0gMDsKKyAgICBwcmVmaXg2NiA9IHByZWZpeDY3ID0gMDsKKyAgICBwcmVmX3NlZyA9IC0xOworCisgICAgLyogZWF0IHVwIHByZWZpeGVzICovCisgICAgZG9uZSA9IDA7CisgICAgZG8geworICAgICAgICBzd2l0Y2ggKCooY3NwKyspKSB7CisgICAgICAgIGNhc2UgMHg2NjogICAgICAvKiBvcGVyYW5kIHByZWZpeCAqLyAgcHJlZml4NjY9MTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2NzogICAgICAvKiBhZGRyZXNzIHByZWZpeCAqLyAgcHJlZml4Njc9MTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyZTogICAgICAvKiBDUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhjcyk7IGJyZWFrOworICAgICAgICBjYXNlIDB4M2U6ICAgICAgLyogRFMgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZHMpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDI2OiAgICAgIC8qIEVTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGVzKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzNjogICAgICAvKiBTUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhzcyk7IGJyZWFrOworICAgICAgICBjYXNlIDB4NjU6ICAgICAgLyogR1MgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZ3MpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDY0OiAgICAgIC8qIEZTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGZzKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmMjogICAgICAvKiByZXBueiAqLworICAgICAgICBjYXNlIDB4ZjM6ICAgICAgLyogcmVwICovICAgICAgICAgICAgIGlzX3JlcD0xOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogZG9uZT0xOworICAgICAgICB9CisgICAgfSB3aGlsZSAoIWRvbmUpOworICAgIGNzcC0tOyAgIC8qIG9vcHMgb25lIHRvbyBtYW55ICovCisgICAgb3JnX2VpcCA9IENQVV9SRUcoZWlwKTsKKyAgICBDUFVfUkVHX0xXKGVpcCkgKz0gKGNzcCAtIGxpbmEpOworCisgICAgc3dpdGNoICgqY3NwKSB7CisKKyAgICBjYXNlIDB4NmM6ICAgICAgICAgICAgICAgICAgICAvKiBpbnNiICovCisgICAgICAgIC8qIE5PVEU6IEVTIGNhbid0IGJlIG92ZXJ3cml0dGVuOyBwcmVmaXhlcyA2Niw2NyBzaG91bGQgdXNlIGVzaSxlZGksZWN4CisgICAgICAgICAqIGJ1dCBpcyBhbnlvbmUgdXNpbmcgZXh0ZW5kZWQgcmVncyBpbiByZWFsIG1vZGU/ICovCisgICAgICAgIC8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIERJIHdyYXBwaW5nISAqLworICAgICAgICBDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW5iKENQVV9SRUdfTFcoZWR4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHX0FEUigoQ0FSRDggKiksZXMsZGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7CisgICAgICAgIGlmIChpc19yZXApIExXRUNYID0gMDsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApKys7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDZkOiAgICAgICAgICAgICAgICAgIC8qIChyZXApIGluc3cgLyBpbnNkICovCisgICAgICAgIC8qIE5PVEU6IEVTIGNhbid0IGJlIG92ZXJ3cml0dGVuICovCisgICAgICAgIC8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9ESSB3cmFwcGluZyEgKi8KKyAgICAgICAgaWYgKHByZWZpeDY2KSB7CisgICAgICAgICAgICBDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW5sKENQVV9SRUdfTFcoZWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHX0FEUigoQ0FSRDMyICopLGVzLGRpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW53KENQVV9SRUdfTFcoZWR4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR19BRFIoKENBUkQxNiAqKSxlcyxkaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc19yZXApIExXRUNYID0gMDsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApKys7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDZlOiAgICAgICAgICAgICAgICAgIC8qIChyZXApIG91dHNiICovCisgICAgICAgIGlmIChwcmVmX3NlZyA8IDApIHByZWZfc2VnID0gQ1BVX1JFR19MVyhkcyk7CisgICAgICAgIC8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9TSSB3cmFwcGluZyEgKi8KKyAgICAgICAgQ1BVX1JFR19MVyhlc2kpICs9IHBvcnRfcmVwX291dGIoQ1BVX1JFR19MVyhlZHgpLChDQVJEOCopTElOX1BSRUZfU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOworICAgICAgICBpZiAoaXNfcmVwKSBMV0VDWCA9IDA7CisgICAgICAgIENQVV9SRUdfTFcoZWlwKSsrOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHg2ZjogICAgICAgICAgICAgICAgICAvKiAocmVwKSBvdXRzdyAvIG91dHNkICovCisgICAgICAgIGlmIChwcmVmX3NlZyA8IDApIHByZWZfc2VnID0gQ1BVX1JFR19MVyhkcyk7CisgICAgICAgIC8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9TSSB3cmFwcGluZyEgKi8KKyAgICAgICAgaWYgKHByZWZpeDY2KSB7CisgICAgICAgICAgICBDUFVfUkVHX0xXKGVzaSkgKz0gcG9ydF9yZXBfb3V0bChDUFVfUkVHX0xXKGVkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0FSRDMyICopTElOX1BSRUZfU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDUFVfUkVHX0xXKGVzaSkgKz0gcG9ydF9yZXBfb3V0dyhDUFVfUkVHX0xXKGVkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0FSRDE2ICopTElOX1BSRUZfU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7CisgICAgICAgIH0gCisgICAgICAgIGlmIChpc19yZXApIExXRUNYID0gMDsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApKys7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweGU1OiAgICAgICAgICAgICAgICAgIC8qIGludyB4eCwgaW5sIHh4ICovCisgICAgICAgIGlmIChwcmVmaXg2NikgQ1BVX1JFRyhlYXgpID0gUC5pbmwoKGludCkgY3NwWzFdKTsKKyAgICAgICAgZWxzZSBDUFVfUkVHX0xXKGVheCkgPSBQLmludygoaW50KSBjc3BbMV0pOyAgCisgICAgICAgIENQVV9SRUdfTFcoZWlwKSArPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZTQ6ICAgICAgICAgICAgICAgICAgLyogaW5iIHh4ICovCisgICAgICAgIENQVV9SRUdfTFcoZWF4KSAmPSB+KENBUkQzMikweGZmOworICAgICAgICBDUFVfUkVHX0xCKGF4KSB8PSBQLmluYigoaW50KSBjc3BbMV0pOworICAgICAgICBDUFVfUkVHX0xXKGVpcCkgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGVkOiAgICAgICAgICAgICAgICAgIC8qIGludyBkeCwgaW5sIGR4ICovCisgICAgICAgIGlmIChwcmVmaXg2NikgQ1BVX1JFRyhlYXgpID0gUC5pbmwoQ1BVX1JFR19MVyhlZHgpKTsgCisgICAgICAgIGVsc2UgQ1BVX1JFR19MVyhlYXgpID0gUC5pbncoQ1BVX1JFR19MVyhlZHgpKTsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhlYzogICAgICAgICAgICAgICAgICAvKiBpbmIgZHggKi8KKyAgICAgICAgQ1BVX1JFR19MVyhlYXgpICY9IH4oQ0FSRDMyKTB4ZmY7CisgICAgICAgIENQVV9SRUdfTEIoYXgpIHw9IFAuaW5iKENQVV9SRUdfTFcoZWR4KSk7CisgICAgICAgIENQVV9SRUdfTFcoZWlwKSArPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHhlNzogICAgICAgICAgICAgICAgICAvKiBvdXR3IHh4ICovCisgICAgICAgIGlmIChwcmVmaXg2NikgUC5vdXRsKChpbnQpY3NwWzFdLCBDUFVfUkVHKGVheCkpOworICAgICAgICBlbHNlIFAub3V0dygoaW50KWNzcFsxXSwgQ1BVX1JFR19MVyhlYXgpKTsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhlNjogICAgICAgICAgICAgICAgICAvKiBvdXRiIHh4ICovCisgICAgICAgIFAub3V0YigoaW50KSBjc3BbMV0sIENQVV9SRUdfTEIoYXgpKTsKKyAgICAgICAgQ1BVX1JFR19MVyhlaXApICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhlZjogICAgICAgICAgICAgICAgICAvKiBvdXR3IGR4ICovCisgICAgICAgIGlmIChwcmVmaXg2NikgUC5vdXRsKENQVV9SRUdfTFcoZWR4KSwgQ1BVX1JFRyhlYXgpKTsKKyAgICAgICAgZWxzZSBQLm91dHcoQ1BVX1JFR19MVyhlZHgpLCBDUFVfUkVHX0xXKGVheCkpOworICAgICAgICBDUFVfUkVHX0xXKGVpcCkgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGVlOiAgICAgICAgICAgICAgICAgIC8qIG91dGIgZHggKi8KKyAgICAgICAgUC5vdXRiKENQVV9SRUdfTFcoZWR4KSwgQ1BVX1JFR19MQihheCkpOworICAgICAgICBDUFVfUkVHX0xXKGVpcCkgKz0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ZjQ6CisjaWZkZWYgVjg2QklPU19ERUJVRworICAgICAgICBwcmludGYoImhsdCBhdCAlcFxuIiwgbGluYSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIDB4MGY6IAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ1BVIDB4MGYgVHJhcCBhdCBlaXA9MHglbHhcbiIsQ1BVX1JFRyhlaXApKTsKKyAgICAgICAgZ290byBvcDBmZXJyOyAKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ZjA6ICAgICAgICAgICAgICAgICAgLyogbG9jayAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJ1bmtub3duIHJlYXNvbiBmb3IgZXhjZXB0aW9uXG4iKTsKKyAgICAgICAgZHVtcF9yZWdpc3RlcnMoKTsKKyAgICAgICAgc3RhY2tfdHJhY2UoKTsKKyAgICBvcDBmZXJyOgorICAgICAgICBkdW1wX2NvZGUoKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImNhbm5vdCBjb250aW51ZVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc3dpdGNoKCkgKi8KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAordm04Nl9kb19pbnQoaW50IG51bSkKK3sKKyAgICBpbnQgdmFsOworICAgIHN0cnVjdCByZWdzODYgcmVnczsKKworICAgIGlfcHJpbnRmKCJpbnQgMHgleCByZWNlaXZlZDogYXg6MHglbHgiLG51bSxDUFVfUkVHKGVheCkpOworICAgIGlmIChDb25maWcuUHJpbnRJcCkKKyAgICAgICAgaV9wcmludGYoIiBhdDogMHgleFxuIixnZXRJUCgpKTsKKyAgICBlbHNlCisgICAgICAgIGlfcHJpbnRmKCJcbiIpOworCisgICAgLyogdHJ5IHRvIHJ1biBiaW9zIGludGVycnVwdCAqLworICAgIAorICAgIC8qIGlmIG5vdCBpbnN0YWxsZWQgZmFsbCBiYWNrICovCisjZGVmaW5lIENPUFkoeCkgcmVncy4jI3ggPSBDUFVfUkVHKHgpCisjZGVmaW5lIENPUFlfUih4KSBDUFVfUkVHKHgpID0gcmVncy4jI3gKKyAgICAKKyAgICBDT1BZKGVheCk7CisgICAgQ09QWShlYngpOworICAgIENPUFkoZWN4KTsKKyAgICBDT1BZKGVkeCk7CisgICAgQ09QWShlc2kpOworICAgIENPUFkoZWRpKTsKKyAgICBDT1BZKGVicCk7CisgICAgQ09QWShlaXApOworICAgIENPUFkoZXNwKTsKKyAgICBDT1BZKGNzKTsKKyAgICBDT1BZKHNzKTsKKyAgICBDT1BZKGRzKTsKKyAgICBDT1BZKGVzKTsKKyAgICBDT1BZKGZzKTsKKyAgICBDT1BZKGdzKTsKKyAgICBDT1BZKGVmbGFncyk7CisKKyAgICBpZiAoISh2YWwgPSBpbnRfaGFuZGxlcihudW0sJnJlZ3MpKSkKKyAgICAgICAgaWYgKCEodmFsID0gcnVuX2Jpb3NfaW50KG51bSwmcmVncykpKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgCisgICAgQ09QWV9SKGVheCk7CisgICAgQ09QWV9SKGVieCk7CisgICAgQ09QWV9SKGVjeCk7CisgICAgQ09QWV9SKGVkeCk7CisgICAgQ09QWV9SKGVzaSk7CisgICAgQ09QWV9SKGVkaSk7CisgICAgQ09QWV9SKGVicCk7CisgICAgQ09QWV9SKGVpcCk7CisgICAgQ09QWV9SKGVzcCk7CisgICAgQ09QWV9SKGNzKTsKKyAgICBDT1BZX1Ioc3MpOworICAgIENPUFlfUihkcyk7CisgICAgQ09QWV9SKGVzKTsKKyAgICBDT1BZX1IoZnMpOworICAgIENPUFlfUihncyk7CisgICAgQ09QWV9SKGVmbGFncyk7CisKKyAgICByZXR1cm4gdmFsOworI3VuZGVmIENPUFkKKyN1bmRlZiBDT1BZX1IKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY29kZSh2b2lkKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKmxpbmEgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBjcywgaXApOworCisgICAgZnByaW50ZihzdGRlcnIsImNvZGUgYXQgMHglOC44eDogIiwoQ0FSRDMyKWxpbmEpOworICAgIGZvciAoaT0wOyBpPDB4MTA7IGkrKykgCisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlMi4yeCAiLCoobGluYSArIGkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4gICAgICAgICAgICAgICAgICAgICIpOworICAgIGZvciAoOyBpPDB4MjA7IGkrKykgCisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlMi4yeCAiLCoobGluYSArIGkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKK30KKworI2RlZmluZSBQUklOVCh4KSBmcHJpbnRmKHN0ZGVyciwjeCI6JTQuNHggIixDUFVfUkVHX0xXKHgpKQorI2RlZmluZSBQUklOVF9GTEFHUyh4KSBmcHJpbnRmKHN0ZGVyciwjeCI6JTguOHggIixDUFVfUkVHX0xXKHgpKQorc3RhdGljIHZvaWQKK2R1bXBfcmVnaXN0ZXJzKHZvaWQpCit7CisgICAgUFJJTlQoZWlwKTsKKyAgICBQUklOVChlYXgpOworICAgIFBSSU5UKGVieCk7CisgICAgUFJJTlQoZWN4KTsKKyAgICBQUklOVChlZHgpOworICAgIFBSSU5UKGVzaSk7CisgICAgUFJJTlQoZWRpKTsKKyAgICBQUklOVChlYnApOworICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICAgIFBSSU5UKGVzcCk7CisgICAgUFJJTlQoY3MpOworICAgIFBSSU5UKHNzKTsKKyAgICBQUklOVChlcyk7CisgICAgUFJJTlQoZHMpOworICAgIFBSSU5UKGZzKTsKKyAgICBQUklOVChncyk7CisgICAgUFJJTlRfRkxBR1MoZWZsYWdzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3N0YWNrX3RyYWNlKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqc3RhY2sgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBzcywgc3ApOyAgICAKKworICAgIGZwcmludGYoc3RkZXJyLCJzdGFjayBhdCAweCU4LjhseDpcbiIsKHVuc2lnbmVkIGxvbmcpc3RhY2spOworICAgIGZvciAoaT0wOyBpIDwgMHgxMDsgaSsrKSAKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiUyLjJ4ICIsKihzdGFjayArIGkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICAKK30KKworc3RhdGljIGludAordm04Nl9yZXAoc3RydWN0IHZtODZfc3RydWN0ICpwdHIpIAoreworCisgICAgaW50IF9fcmVzOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIDoiPWEiIChfX3Jlcyk6ImEiICgoaW50KTExMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImIiICgoc3RydWN0IHZtODZfc3RydWN0ICopcHRyKSk7CisKKyAgICAgICAgICAgIGlmICgoX19yZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGVycm5vID0gLV9fcmVzOworICAgICAgICAgICAgICAgIF9fcmVzPS0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBlcnJubyA9IDA7CisgICAgICAgICAgICByZXR1cm4gX19yZXM7Cit9CisKKyNkZWZpbmUgcHVzaHcoYmFzZSwgcHRyLCB2YWwpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCBcCisgICAgICAgICJkZWN3ICV3MFxuXHQiIFwKKyAgICAgICAgIm1vdmIgJWgyLCglMSwlMClcblx0IiBcCisgICAgICAgICJkZWN3ICV3MFxuXHQiIFwKKyAgICAgICAgIm1vdmIgJWIyLCglMSwlMCkiIFwKKyAgICAgICAgOiAiPXIiIChwdHIpIFwKKyAgICAgICAgOiAiciIgKGJhc2UpLCAicSIgKHZhbCksICIwIiAocHRyKSkKKworaW50CitydW5fYmlvc19pbnQoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncykKK3sKKyAgICBDQVJEMTYgKnNzcDsKKyAgICBDQVJEMzIgc3A7CisgICAgQ0FSRDMyIGVmbGFnczsKKworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CisjZW5kaWYKKyAgICAvKiBjaGVjayBpZiBiaW9zIHZlY3RvciBpcyBpbml0aWFsaXplZCAqLworICAgIGlmICgoKENBUkQxNiopMClbKG51bTw8MSkrMV0gPT0gMHgwMDAwKSB7IC8qIFNZU19CSU9TX1NFRyA/Ki8KKyNpZmRlZiBWODZCSU9TX0RFQlVHCisgICAgICAgIGlfcHJpbnRmKCJjYXJkIEJJT1Mgbm90IGxvYWRlZFxuIik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICBpZiAoZmlyc3R0aW1lKSB7CisgICAgICAgIGRwcmludCgwLDB4M0QwKTsKKyAgICAgICAgZmlyc3R0aW1lID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBpX3ByaW50ZigiY2FsbGluZyBjYXJkIEJJT1MgYXQ6ICIpOworICAgIHNzcCA9IChDQVJEMTYqKShDUFVfUkVHKHNzKTw8NCk7CisgICAgc3AgPSAoQ0FSRDMyKSBDUFVfUkVHX0xXKGVzcCk7CisKKyAgICBlZmxhZ3MgPSByZWdzLT5lZmxhZ3M7CisgICAgZWZsYWdzID0gKChlZmxhZ3MgJiBWSUZfTUFTSykgIT0gMCkKKyAgICAgICAgPyAoZWZsYWdzIHwgSUZfTUFTSykgOiAoZWZsYWdzICYgfihDQVJEMzIpIElGX01BU0spOworICAgIHB1c2h3KHNzcCwgc3AsIGVmbGFncyk7CisgICAgcHVzaHcoc3NwLCBzcCwgcmVncy0+Y3MpOworICAgIHB1c2h3KHNzcCwgc3AsIChDQVJEMTYpcmVncy0+ZWlwKTsKKyAgICByZWdzLT5lc3AgLT0gNjsKKyAgICByZWdzLT5jcyA9ICgoQ0FSRDE2ICopIDApWyhudW0gPDwgMSkgKyAxXTsKKyAgICByZWdzLT5laXAgPSAocmVncy0+ZWlwICYgMHhGRkZGMDAwMCkgfCAoKENBUkQxNiAqKSAwKVtudW0gPDwgMV07CisgICAgaV9wcmludGYoIjB4JXg6JWx4XG4iLHJlZ3MtPmNzLHJlZ3MtPmVpcCk7CisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIGR1bXBfY29kZSgpOworI2VuZGlmCisgICAgcmVncy0+ZWZsYWdzID0gcmVncy0+ZWZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICYgfihWSUZfTUFTSyB8IFRGX01BU0sgfCBJRl9NQVNLIHwgTlRfTUFTSyk7CisgICAgcmV0dXJuIDE7Cit9CisKK0NBUkQzMgorZ2V0SW50VmVjdChpbnQgbnVtKQoreworICAgIHJldHVybiAoKENBUkQzMiopMClbbnVtXTsKK30KKworQ0FSRDMyCitnZXRJUCh2b2lkKQoreworICAgIHJldHVybiAoQ1BVX1JFRyhjcykgPDwgNCkgKyBDUFVfUkVHKGVpcCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhM2ZiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNkZWZpbmUgREVMRVRFCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCisjaW5jbHVkZSA8c3lzL2lvLmg+CisjZWxpZiBkZWZpbmVkKEhBVkVfU1lTX1BFUk0pCisjaW5jbHVkZSA8c3lzL3Blcm0uaD4KKyNlbmRpZgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjg2Ymlvcy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgorCisjZGVmaW5lIFNJWkUgMHgxMDAwMDAKKyNkZWZpbmUgVlJBTV9TVEFSVCAweEEwMDAwCisjZGVmaW5lIFZSQU1fU0laRSAweDFGRkZGCisjZGVmaW5lIFZfQklPU19TSVpFIDB4MUZGRkYKKyNkZWZpbmUgQklPU19TVEFSVCAweDdDMDAgICAgICAgICAgICAvKiBkZWZhdWx0IEJJT1MgZW50cnkgKi8KKyNkZWZpbmUgQklPU19NRU0gMHg2MDAKKworLy9DQVJEOCBjb2RlW10gPSB7IDB4YjggLCAweGYwICwgMHhmMCwgMHhmNCB9OworI2RlZmluZSBWQl9YKHgpIChWX0JJT1MgPj4geCkgJiAweEZGCitDQVJEOCBjb2RlW10gPSB7IDYsIDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGY0IH07CisvL0NBUkQ4IGNvZGVbXSA9IHsgMHg5YSwgMHgwMywgMHgwMCwgMHgwMCwgVkJfWCgxMiksIDB4YjgsIDB4MDMsIDB4MDAsCisvLzB4Y2QsIDB4MTAsIDB4ZjQgfTsKKy8vQ0FSRDggY29kZVtdID0geyAgMHhiOCAsIDB4ZjAgLCAweGYwICwweGY0IH07CisKK2ludCBpb3Blcm1fbGlzdFtJT1BFUk1fQklUU10gPSB7MCx9OworCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQpOworc3RhdGljIGludCBtYXAodm9pZCk7CitzdGF0aWMgdm9pZCB1bm1hcCh2b2lkKTsKK3N0YXRpYyB2b2lkIGJvb3RCSU9TKENBUkQxNiBheCk7CitzdGF0aWMgaW50IG1hcF92cmFtKHZvaWQpOworc3RhdGljIHZvaWQgdW5tYXBfdnJhbSh2b2lkKTsKK3N0YXRpYyBpbnQgY29weV92YmlvcyhtZW1UeXBlIHZfYmFzZSk7CitzdGF0aWMgaW50IGNvcHlfc3lzX2Jpb3Modm9pZCk7CitzdGF0aWMgdm9pZCBzYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKTsKK3N0YXRpYyBpbnQgc2V0dXBfc3lzdGVtX2Jpb3Modm9pZCk7CitzdGF0aWMgQ0FSRDMyIHNldHVwX2ludF92ZWN0KHZvaWQpOworI2lmZGVmIF9faWEzMl9fCitzdGF0aWMgQ0FSRDMyIHNldHVwX3ByaW1hcnlfaW50X3ZlY3Qodm9pZCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgY2hrc3VtKENBUkQ4ICpzdGFydCk7CitzdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgQ0FSRDMyIGF4KTsKK3N0YXRpYyB2b2lkIHByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncyk7CitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNldF9obHQoQm9vbCBzZXQpOworc3RhdGljIHZvaWQgc2V0X2lvcGVybSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgeXlwYXJzZSgpOworCit2b2lkIGxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCAqY29kZSk7Cit2b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgaW50IHZyYW1fbWFwcGVkID0gMDsKK3N0YXRpYyBjaGFyKiBiaW9zX3ZhciA9IE5VTEw7CitzdGF0aWMgQ0FSRDggc2F2ZV9tc3I7CitzdGF0aWMgQ0FSRDggc2F2ZV9wb3MxMDI7CitzdGF0aWMgQ0FSRDggc2F2ZV92c2U7CitzdGF0aWMgQ0FSRDggc2F2ZV80NmU4Oworc3RhdGljIGhhbHRwb2ludHMgaGx0cFsyMF0gPSB7IHswLCAwfSwgfTsKKworY29uc29sZSBDb25zb2xlID0gey0xLC0xfTsKK3N0cnVjdCBjb25maWcgQ29uZmlnOworCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKK3sKKyAgICBpbnQgYzsKKyAgICAKKyAgICBDb25maWcuUHJpbnRQb3J0ID0gUFJJTlRfUE9SVDsKKyAgICBDb25maWcuSW9TdGF0aXN0aWNzID0gSU9fU1RBVElTVElDUzsKKyAgICBDb25maWcuUHJpbnRJcnEgPSBQUklOVF9JUlE7CisgICAgQ29uZmlnLlByaW50UGNpID0gUFJJTlRfUENJOworICAgIENvbmZpZy5TaG93QWxsRGV2ID0gU0hPV19BTExfREVWOyAgICAgICAgCisgICAgQ29uZmlnLlByaW50SXAgPSBQUklOVF9JUDsgICAgICAgICAgIAorICAgIENvbmZpZy5TYXZlQmlvcyA9IFNBVkVfQklPUzsgICAgICAgICAgCisgICAgQ29uZmlnLlRyYWNlID0gVFJBQ0U7ICAgICAgICAgICAgIAorICAgIENvbmZpZy5Db25maWdBY3RpdmVPbmx5ID0gQ09ORklHX0FDVElWRV9PTkxZOyAgLyogYm9vdCAqLworICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsgLyogYm9vdCAqLworICAgIENvbmZpZy5NYXBTeXNCaW9zID0gTUFQX1NZU19CSU9TOyAgICAgICAgCisgICAgQ29uZmlnLlJlc29ydCA9IFJFU09SVDsgIC8qIGJvb3QgKi8gICAgICAgICAgCisgICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007ICAgICAgICAgICAgCisgICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7CisgICAgQ29uZmlnLkJvb3RPbmx5ID0gRkFMU0U7CisgICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOworICAgIAorICAgIG9wdGVyciA9IDA7ICAgIAorICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLGFyZ3YsInBzaWNhUFN0QWRicmZudjo/IikpICE9IEVPRikgeworICAgIHN3aXRjaChjKSB7CisgICAgY2FzZSAncCc6CisgICAgICAgIENvbmZpZy5QcmludFBvcnQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgICBDb25maWcuUHJpbnRJcnEgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgICAgQ29uZmlnLlByaW50UGNpID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYSc6CisgICAgICAgIENvbmZpZy5TaG93QWxsRGV2ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnUCc6CisgICAgICAgIENvbmZpZy5QcmludElwID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICAgIENvbmZpZy5TYXZlQmlvcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgICBDb25maWcuVHJhY2UgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdBJzoKKyAgICAgICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgICBDb25maWcuTWFwU3lzQmlvcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgorICAgICAgICBDb25maWcuUmVzb3J0ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAgIENvbmZpZy5GaXhSb20gPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICduJzoKKyAgICAgICAgQ29uZmlnLk5vQ29uc29sZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3YnOgorICAgICAgICBDb25maWcuVmVyYm9zZSA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPyc6CisgICAgICAgIHByaW50X3VzYWdlKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgaWYgKCFtYXAoKSkKKyAgICBleGl0KDEpOworICAgIAorICAgIGlmICghc2V0dXBfc3lzdGVtX2Jpb3MoKSkKKyAgICBleGl0KDEpOworICAgIAorICAgIGlvcGwoMyk7CisKKyAgICBzY2FuX3BjaSgpOworCisgICAgc2F2ZV9tc3IgPSBpbmIoMHgzQ0MpOworICAgIHNhdmVfdnNlID0gaW5iKDB4M0MzKTsKKyAgICBzYXZlXzQ2ZTggPSBpbmIoMHg0NmU4KTsKKyAgICBzYXZlX3BvczEwMiA9IGluYigweDEwMik7CisKKyAgICBpZiAoQ29uZmlnLkJvb3RPbmx5KSB7CisgICAgCisgICAgaWYgKCFDdXJyZW50UGNpICYmICFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlCisgICAgICAgICYmICFDb25maWcuQ29uZmlnQWN0aXZlT25seSkgeworICAgICAgICBpb3BsKDApOworICAgICAgICB1bm1hcCgpOworICAgICAgICBleGl0ICgxKTsKKyAgICB9CisgICAgY2FsbF9ib290KE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgdXNpbmdfaGlzdG9yeSgpOworICAgIHl5cGFyc2UoKTsKKyAgICB9CisgICAgCisgICAgdW5tYXAoKTsKKworICAgIHBjaVZpZGVvUmVzdG9yZSgpOworICAgIAorICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKKyAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKKyAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7CisgICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOworCisgICAgaW9wbCgwKTsKKworICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7CisKKyAgICBleGl0KDApOworfQorCisKK3ZvaWQKK2NhbGxfYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgICAgaW50IEFjdGl2ZV9pc19QY2kgPSAwOworICAgIENBUkQzMiB2Ymlvc19iYXNlOworICAgIAorICAgIEN1cnJlbnRQY2kgPSBQY2lMaXN0OworICAgIENvbnNvbGUgPSBvcGVuX2NvbnNvbGUoKTsKKyAgICAKKyAgICBzZXRfaW9wZXJtKCk7CisKKyAgICAKKyAgICBzaWduYWwoMixzaWdfaGFuZGxlcik7CisgICAgc2lnbmFsKDExLHNpZ19oYW5kbGVyKTsKKyAgICAKKyAgICAvKiBkaXNhYmxlIHByaW1hcnkgY2FyZCAqLworICAgIHBjaVZpZGVvUmVzdG9yZSgpOyAvKiByZXNldCBQQ0kgc3RhdGUgdG8gc2VlIHByaW1hcnkgY2FyZCAqLworICAgIG91dGIoMHgzQzIsfihDQVJEOCkweDAzICYgc2F2ZV9tc3IpOworICAgIG91dGIoMHgzQzMsfihDQVJEOCkweDAxICYgc2F2ZV92c2UpOworICAgIG91dGIoMHg0NmU4LCB+KENBUkQ4KTB4MDggJiBzYXZlXzQ2ZTgpOworICAgIG91dGIoMHgxMDIsIH4oQ0FSRDgpMHgwMSAmIHNhdmVfcG9zMTAyKTsKKyAgICAKKyAgICBwY2lWaWRlb0Rpc2FibGUoKTsKKyAgICAKKyAgICB3aGlsZSAoQ3VycmVudFBjaSkgeworICAgIENBUkQxNiBheDsKKyAgICAKKyAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7CisgICAgICAgIEFjdGl2ZV9pc19QY2kgPSAxOworICAgICAgICBpZiAoIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgJiYgIWRldikgeworICAgICAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKKyAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENvbmZpZy5Db25maWdBY3RpdmVPbmx5ICYmICFkZXYpIHsKKyAgICAgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZGV2ICYmICgoZGV2LT50eXBlICE9IFBDSSkKKyAgICAgICAgICAgIHx8IChkZXYtPnR5cGUgPT0gUENJCisgICAgICAgICAgICAmJiAoZGV2LT5sb2MucGNpLmRldiAhPSBDdXJyZW50UGNpLT5kZXYKKyAgICAgICAgICAgICAgICB8fCBkZXYtPmxvYy5wY2kuYnVzICE9IEN1cnJlbnRQY2ktPmJ1cworICAgICAgICAgICAgICAgIHx8IGRldi0+bG9jLnBjaS5mdW5jICE9IEN1cnJlbnRQY2ktPmZ1bmMpKSkpIHsKKyAgICAgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBFbmFibGVDdXJyZW50KCk7CisgICAgCisgICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgeworICAgICAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7CisgICAgICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOworICAgICAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7CisgICAgICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKKyAgICB9CisgICAgCisgICAgLyogY2xlYXIgaW50ZXJydXB0IHZlY3RvcnMgKi8KKyNpZmRlZiBfX2lhMzJfXworICAgIHZiaW9zX2Jhc2UgPSBDdXJyZW50UGNpLT5hY3RpdmUgPyBzZXR1cF9wcmltYXJ5X2ludF92ZWN0KCkKKyAgICAgICAgOiBzZXR1cF9pbnRfdmVjdCgpOworI2Vsc2UKKyAgICB2Ymlvc19iYXNlID0gc2V0dXBfaW50X3ZlY3QoKTsKKyNlbmRpZgorICAgIGF4ID0gKChDQVJEMTYpKEN1cnJlbnRQY2ktPmJ1cykgPDwgOCkKKyAgICAgICAgfCAoQ3VycmVudFBjaS0+ZGV2IDw8IDMpIHwgKEN1cnJlbnRQY2ktPmZ1bmMgJiAweDcpOworICAgIGlmIChDb25maWcuVmVyYm9zZSA+IDEpIFBfcHJpbnRmKCJheDogMHgleFxuIixheCk7CisgICAgCisgICAgQm9vdEJpb3MgPSBmaW5kUGNpQnlJRHMoQ3VycmVudFBjaS0+YnVzLEN1cnJlbnRQY2ktPmRldiwKKyAgICAgICAgICAgICAgICAgICBDdXJyZW50UGNpLT5mdW5jKTsKKyAgICBpZiAoISgobWFwUGNpUm9tKEJvb3RCaW9zKSAmJiBjaGtzdW0oKENBUkQ4KilWX0JJT1MpKQorICAgICAgICAgIHx8IChDdXJyZW50UGNpLT5hY3RpdmUgJiYgY29weV92Ymlvcyh2Ymlvc19iYXNlKSkpKSB7CisgICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFtYXBfdnJhbSgpKSB7CisgICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKKyAgICBwcmludGYoImluaXRpYWxpemluZyBQQ0kgYnVzOiAlaSBkZXY6ICVpIGZ1bmM6ICVpXG4iLEN1cnJlbnRQY2ktPmJ1cywKKyAgICAgICAgICAgQ3VycmVudFBjaS0+ZGV2LEN1cnJlbnRQY2ktPmZ1bmMpOworICAgIGJvb3RCSU9TKGF4KTsKKyAgICB1bm1hcF92cmFtKCk7CisKKyAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKQorICAgICAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOworCisgICAgaWYgKGRldikgcmV0dXJuOworICAgIAorICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OworICAgIH0KKyAgICAKKyAgICAvKiBXZSBoYXZlIGFuIElTQSBkZXZpY2UgLSBjb25maWd1cmUgaWYgcmVxdWVzdGVkICovCisgICAgaWYgKCFBY3RpdmVfaXNfUGNpIC8qIG5vIGlzYSBjYXJkIGluIHN5c3RlbSEgKi8KKyAgICAmJiAoKCFkZXYgJiYgKENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgfHwgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpKQorICAgICAgICB8fCAoZGV2ICYmIGRldi0+dHlwZSA9PSBJU0EpKSkgeworCisgICAgcGNpVmlkZW9EaXNhYmxlKCk7CisKKyAgICBpZiAoIWRldiB8fCBkZXYtPnR5cGUgPT0gSVNBKSB7CisgICAgICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKKyAgICAgICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7CisgICAgICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKKyAgICAgICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOworICAgICAgICAKKyNpZmRlZiBfX2lhMzJfXworICAgICAgICB2Ymlvc19iYXNlID0gc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCgpOworI2Vsc2UKKyAgICAgICAgdmJpb3NfYmFzZSA9IHNldHVwX2ludF92ZWN0KCk7CisjZW5kaWYKKyAgICAgICAgaWYgKGNvcHlfdmJpb3ModmJpb3NfYmFzZSkpIHsKKyAgICAgICAgCisgICAgICAgIGlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7CisgICAgICAgIGlmICAobWFwX3ZyYW0oKSkgeworICAgICAgICAgICAgcHJpbnRmKCJpbml0aWFsaXppbmcgSVNBIGJ1c1xuIik7CisgICAgICAgICAgICBib290QklPUygwKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgICAgIHVubWFwX3ZyYW0oKTsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7CisgICAgfQorICAgIH0KKyAgICAKKyAgICAKK30KKworaW50ICAKK21hcCh2b2lkKQoreworICAgIHZvaWQqIG1lbTsKKyAgICBtZW0gPSBtbWFwKDAsIChzaXplX3QpU0laRSwKKyAgICAgICAgICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAorICAgICAgICAgICAgICAgLTEsIDAgKTsgCisgICAgaWYgKG1lbSAhPSAwKSB7CisgICAgICAgIHBlcnJvcigiYW5vbnltb3VzIG1hcCIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICBtZW1zZXQobWVtLDAsU0laRSk7CisKKyAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAordW5tYXAodm9pZCkKK3sKKyAgICBtdW5tYXAoMCxTSVpFKTsKK30KKworc3RhdGljIHZvaWQKK2Jvb3RCSU9TKENBUkQxNiBheCkKK3sKKyAgICBpODZiaW9zUmVncyBiUmVnczsKKyNpZmRlZiBWODZCSU9TX0RFQlVHCisgICAgcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKKyNlbmRpZgorICAgIHNldHVwX2lvKCk7CisgICAgc2V0dXBfYmlvc19yZWdzKCZiUmVncywgYXgpOworICAgIGxvYWRDb2RlVG9NZW0oKHVuc2lnbmVkIGNoYXIgKikgQklPU19TVEFSVCwgY29kZSk7CisgICAgZG9feDg2KEJJT1NfU1RBUlQsJmJSZWdzKTsKKyNpZmRlZiBWODZCSU9TX0RFQlVHCisgICAgcHJpbnRmKCJkb25lXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CittYXBfdnJhbSh2b2lkKQoreworICAgIGludCBtZW1fZmQ7CisKKyNpZmRlZiBfX2lhNjRfXworICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKSAKKyNlbHNlCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApIAorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZmRlZiBfX2FscGhhX18KKyAgICAgICBpZiAoIV9idXNfYmFzZSgpKSBzcGFyc2Vfc2hpZnQgPSA3OyAvKiBVaCwgb2gsIEpFTlNFTi4uLiAqLworICAgICAgICAgaWYgKCFfYnVzX2Jhc2Vfc3BhcnNlKCkpIHNwYXJzZV9zaGlmdCA9IDA7CisgICAgICAgICBpZiAoKHZyYW1fbWFwID0gbW1hcCgwLChzaXplX3QpIChWUkFNX1NJWkUgPDwgc3BhcnNlX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2ZkLCAoVlJBTV9TVEFSVCA8PCBzcGFyc2Vfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfYnVzX2Jhc2Vfc3BhcnNlKCkpKSA9PSAodm9pZCAqKSAtMSkKKyNlbHNlCisgICAgICBpZiAobW1hcCgodm9pZCAqKSBWUkFNX1NUQVJULCAoc2l6ZV90KSBWUkFNX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fZmQsIFZSQU1fU1RBUlQpID09ICh2b2lkICopIC0xKSAKKyNlbmRpZgorICAgICAgeworICAgICAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSAoMSkiKTsKKyAgICAgICAgICAgIGNsb3NlKG1lbV9mZCk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgdnJhbV9tYXBwZWQgPSAxOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK3VubWFwX3ZyYW0odm9pZCkKK3sKKyAgICBpZiAoIXZyYW1fbWFwcGVkKSByZXR1cm47CisgICAgCisgICAgbXVubWFwKCh2b2lkKilWUkFNX1NUQVJULFZSQU1fU0laRSk7CisgICAgdnJhbV9tYXBwZWQgPSAwOworfQorCitzdGF0aWMgaW50Citjb3B5X3ZiaW9zKG1lbVR5cGUgdl9iYXNlKQoreworICAgIGludCBtZW1fZmQ7CisgICAgdW5zaWduZWQgY2hhciAqdG1wOworICAgIGludCBzaXplOworCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgeworICAgICAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSwgU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKSB7IAorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgbHNlZWtcbiIpOworICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgdG1wID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoMyk7CisgICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXRtcCwgKHNpemVfdCkgMykgIT0gKHNpemVfdCkgMykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSxTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpIAorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCp0bXAgIT0gMHg1NSB8fCAqKHRtcCsxKSAhPSAweEFBICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTm8gYmlvcyBmb3VuZCBhdDogMHglbHhcbiIsdl9iYXNlKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7CisjZW5kaWYKKyAgICBzaXplID0gKih0bXArMikgKiA1MTI7CisKKyAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdl9iYXNlLCAoc2l6ZV90KSBzaXplKSAhPSAoc2l6ZV90KSBzaXplKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBmcmVlKHRtcCk7CisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICBpZiAoIWNoa3N1bSgoQ0FSRDgqKXZfYmFzZSkpCisgICAgICAgIHJldHVybiAoMCk7CisKKyAgICByZXR1cm4gKDEpOworCitFcnJvcjoKKyAgICBwZXJyb3IoInZfYmlvcyIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorY29weV9zeXNfYmlvcyh2b2lkKQoreworI2RlZmluZSBTWVNfQklPUyAweEYwMDAwCisgICAgaW50IG1lbV9mZDsKKworICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKKyAgICAgICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgCisgICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFNZU19CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFNZU19CSU9TKSAKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopU1lTX0JJT1MsIChzaXplX3QpIDB4RkZGRikgIT0gKHNpemVfdCkgMHhGRkZGKSAKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgxKTsKKworRXJyb3I6CisgICAgcGVycm9yKCJzeXNfYmlvcyIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuICgwKTsKK30KKwordm9pZAorbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4IGNvZGVbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBDQVJEOCB2YWw7CisgICAgaW50IHNpemUgPSBjb2RlWzBdOworICAgIAorICAgIGZvciAoIGk9MTtpPD1zaXplO2krKykgeworICAgICAgICB2YWwgPSBjb2RlW2ldOworICAgICAgICAqcHRyKysgPSB2YWw7CisgICAgfQorICAgIHJldHVybjsKK30KKyAgICAgICAgCit2b2lkIAorZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICBpbnQgaSxqOworICAgIGNoYXIgKmMgPSAoY2hhciAqKXN0YXJ0OworCisgICAgZm9yIChqID0gMDsgaiA8IChzaXplID4+IDQpOyBqKyspIHsKKyAgICBjaGFyICpkID0gYzsKKyAgICBwcmludGYoIlxuMHglbHg6ICAiLCh1bnNpZ25lZCBsb25nKWMpOworICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykgCisgICAgICAgIHByaW50ZigiJTIuMnggIiwodW5zaWduZWQgY2hhcikgKCooYysrKSkpOworICAgIGMgPSBkOworICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykgeworICAgICAgICBwcmludGYoIiVjIiwoKCgoQ0FSRDgpKCpjKSkgPiAzMikgJiYgKCgoQ0FSRDgpKCpjKSkgPCAxMjgpKSA/CisgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSAoKihjKSk6ICcuJyk7CisgICAgICAgIGMrKzsKKyAgICB9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NhdmVfYmlvc190b19maWxlKHZvaWQpCit7CisgICAgc3RhdGljIGludCBudW0gPSAwOworICAgIGludCBzaXplLCBjb3VudDsKKyAgICBjaGFyIGZpbGVfbmFtZVsyNTZdOworICAgIGludCBmZDsKKyAgICAKKyAgICBzcHJpbnRmKGZpbGVfbmFtZSwiYmlvc18laS5maWwiLG51bSk7CisgICAgaWYgKChmZCA9ICBvcGVuKGZpbGVfbmFtZSxPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLDAwNjQ0KSkgPT0gLTEpCisgICAgICAgIHJldHVybjsKKyAgICBzaXplID0gKCoodW5zaWduZWQgY2hhciopKFZfQklPUyArIDIpKSAqIDUxMjsKKyNpZmRlZiBWODZCSU9TX0RFQlVHCisgICAgZHByaW50KFZfQklPUywyMCk7CisjZW5kaWYKKyAgICBpZiAoKGNvdW50ID0gd3JpdGUoZmQsKHZvaWQgKikoVl9CSU9TKSxzaXplKSkgIT0gc2l6ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIm9ubHkgc2F2ZWQgJWkgb2YgJWkgYnl0ZXNcbiIsc2l6ZSxjb3VudCk7CisgICAgbnVtKys7Cit9CisKK3N0YXRpYyB2b2lkCitzaWdfaGFuZGxlcihpbnQgdW51c2VkKQoreworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgLyogcHV0IHN5c3RlbSBiYWNrIGluIGEgc2F2ZSBzdGF0ZSAqLworICAgIHVubWFwX3ZyYW0oKTsKKyAgICBwY2lWaWRlb1Jlc3RvcmUoKTsKKyAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7CisgICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7CisgICAgb3V0YigweDNDMywgc2F2ZV92c2UpOworICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKKworICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7CisgICAgaW9wbCgwKTsKKyAgICB1bm1hcCgpOworCisgICAgZXhpdCgxKTsKK30KKworLyoKKyAqIEZvciBpbml0aWFsaXphdGlvbiB3ZSBqdXN0IHBhc3MgYXggdG8gdGhlIEJJT1MuCisgKiBQQ0kgQklPU2VzIG5lZWQgdGhpcy4gQWxsIG90aGVyIHJlZ2lzdGVyIGFyZSBzZXQgMC4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIENBUkQzMiBheCkKK3sKKyAgICByZWdzLT5heCA9IGF4OworICAgIHJlZ3MtPmJ4ID0gMDsKKyAgICByZWdzLT5jeCA9IDA7CisgICAgcmVncy0+ZHggPSAwOworICAgIHJlZ3MtPmVzID0gMDsKKyAgICByZWdzLT5kcyA9IDB4NDA7ICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgcGMgZHMgKi8KKyAgICByZWdzLT5zaSA9IDA7CisgICAgcmVncy0+ZGkgPSAwOworfQorCisvKgorICogaGVyZSB3ZSBhcmUgcmVhbGx5IHBhcmFub2lkIGFib3V0IGZha2luZyBhICJyZWFsIgorICogQklPUy4gTW9zdCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBwdWxsZWQgZnJvbQorICogZG9zZW0uCisgKi8KKworI2lmZGVmIF9faWEzMl9fCitzdGF0aWMgQ0FSRDMyCitzZXR1cF9wcmltYXJ5X2ludF92ZWN0KHZvaWQpCit7CisgICAgaW50IG1lbV9mZDsKKyAgICBDQVJEMzIgdmJhc2U7CisgICAgdm9pZCAqbWFwOworCisgICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApIAorICAgICAgICAgICAgeworICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKKyAgICByZXR1cm4gKDApOworICAgIH0KKyAgCisgICAgaWYgKChtYXAgPSBtbWFwKCh2b2lkICopIDAsIChzaXplX3QpIDB4MjAwMCwKKyAgICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCisgICAgICAgICBtZW1fZmQsIDApKSA9PSAodm9pZCAqKS0xKSAgIHsKKyAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSAoMikiKTsKKyAgICBjbG9zZShtZW1fZmQpOworICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgY2xvc2UobWVtX2ZkKTsKKyAgICBtZW1jcHkoMCxtYXAsQklPU19NRU0pOworICAgIG11bm1hcChtYXAsMHgyMDAwKTsKKyAgICAvKgorICAgICAqIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBiaW9zIHZhcmlhYmxlcyB0byB3cml0ZSBiYWNrIHRoZQorICAgICAqIG1vZGlmaWVkIHZhbHVlcworICAgICAqLworICAgIGlmICghYmlvc192YXIpCisgICAgYmlvc192YXIgPSAoY2hhciAqKW1hbGxvYyhCSU9TX01FTSk7CisgICAgbWVtY3B5KGJpb3NfdmFyLDAsQklPU19NRU0pOworICAgIAorICAgIHZiYXNlID0gKCooKENBUkQxNiopKDB4MTAgPDwgMikgKyAxKSkgPDwgNDsKKyAgICBpZiAoQ29uZmlnLlZlcmJvc2UgPiAwKSBwcmludGYoInZiYXNlOiAweCV4XG4iLHZiYXNlKTsKKyAgICByZXR1cm4gdmJhc2U7Cit9CisjZW5kaWYKKworc3RhdGljIENBUkQzMgorc2V0dXBfaW50X3ZlY3Qodm9pZCkKK3sKKyAgICBjb25zdCBDQVJEMTYgY3MgPSAweDA7CisgICAgY29uc3QgQ0FSRDE2IGlwID0gMHgwOworICAgIGludCBpOworICAgIAorICAgIC8qIGxldCB0aGUgaW50IHZlY3RzIHBvaW50IHRvIHRoZSBTWVNfQklPUyBzZWcgKi8KKyAgICBmb3IgKGk9MDsgaTwweDgwOyBpKyspIHsKKyAgICAgICAgKChDQVJEMTYqKTApW2k8PDFdID0gaXA7CisgICAgICAgICgoQ0FSRDE2KikwKVsoaTw8MSkrMV0gPSBjczsKKyAgICB9CisgICAgLyogdmlkZW8gaW50ZXJydXB0cyBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDQyPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHg0Mjw8MV0gPSAweGYwNjU7CisgICAgKChDQVJEMTYqKTApWygweDEwPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxMDw8MV0gPSAweGYwNjU7CisgICAgLyogdmlkZW8gcGFyYW0gdGFibGUgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFkKSAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxZDw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MWQ8PDFdID0gMHhmMEE0OworICAgIC8qIGZvbnQgdGFibGVzIGRlZmF1bHQgbG9jYXRpb24gKGludCAxRikgKi8KKyAgICAoKENBUkQxNiopMClbKDB4MWY8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDFmPDwxXSA9IDB4ZmE2ZTsKKworICAgIC8qIGludCAxMSBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDExPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxMTw8MV0gPSAweGY4NGQ7CisgICAgLyogaW50IDEyIGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4MTI8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDEyPDwxXSA9IDB4Zjg0MTsKKyAgICAvKiBpbnQgMTUgZGVmYXVsdCBsb2NhdGlvbiAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxNTw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MTU8PDFdID0gMHhmODU5OworICAgIC8qIGludCAxQSBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDFhPDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxYTw8MV0gPSAweGZmNmU7CisgICAgLyogaW50IDA1IGRlZmF1bHQgbG9jYXRpb24gKi8KKyAgICAoKENBUkQxNiopMClbKDB4MDU8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDA1PDwxXSA9IDB4ZmY1NDsKKyAgICAvKiBpbnQgMDggZGVmYXVsdCBsb2NhdGlvbiAqLworICAgICgoQ0FSRDE2KikwKVsoMHg4PDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHg4PDwxXSA9IDB4ZmVhNTsKKyAgICAvKiBpbnQgMTMgZGVmYXVsdCBsb2NhdGlvbiAoZmRkKSAqLworICAgICgoQ0FSRDE2KikwKVsoMHgxMzw8MSkrMV0gPSAweGYwMDA7CisgICAgKChDQVJEMTYqKTApWzB4MTM8PDFdID0gMHhlYzU5OworICAgIC8qIGludCAwRSBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweGU8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweGU8PDFdID0gMHhlZjU3OworICAgIC8qIGludCAxNyBkZWZhdWx0IGxvY2F0aW9uICovCisgICAgKChDQVJEMTYqKTApWygweDE3PDwxKSsxXSA9IDB4ZjAwMDsKKyAgICAoKENBUkQxNiopMClbMHgxNzw8MV0gPSAweGVmZDI7CisgICAgLyogZmRkIHRhYmxlIGRlZmF1bHQgbG9jYXRpb24gKGludCAxZSkgKi8KKyAgICAoKENBUkQxNiopMClbKDB4MWU8PDEpKzFdID0gMHhmMDAwOworICAgICgoQ0FSRDE2KikwKVsweDFlPDwxXSA9IDB4ZWZjNzsKKyAgICByZXR1cm4gVl9CSU9TOworfQorCitzdGF0aWMgaW50CitzZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKQoreworICAgIGNoYXIgKmRhdGUgPSAiMDYvMDEvOTkiOworICAgIGNoYXIgKmVpc2FfaWRlbnQgPSAiUENJL0lTQSI7CisgICAgCisgICAgaWYgKENvbmZpZy5NYXBTeXNCaW9zKSB7CisKKyAgICAgICAgaWYgKCFjb3B5X3N5c19iaW9zKCkpIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKKworICAgIH0gZWxzZSB7CisKKy8vICAgIG1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweGZmZjcpOworICAgIAorICAgICAgICAvKgorICAgICAgICAgKiB3ZSB0cmFwIHRoZSAiaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnRzIiB0byB0aGUgQklPUworICAgICAgICAgKiBhbmQgYWxsIG90aGVyIGxvY2F0aW9ucyBieSBmaWxsaW5nIHRoZW0gd2l0aCAiaGx0IgorICAgICAgICAgKiBUT0RPOiBpbXBsZW1lbnQgaGx0LWhhbmRsZXIgZm9yIHRoZXNlCisgICAgICAgICAqLworICAgICAgICBtZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHgxMDAwMCk7CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBUT0RPOiB3ZSBzaG91bGQgY29weSB0aGUgZmRkIHRhYmxlICgweGZlYzU5LTB4ZmVjNWIpCisgICAgICAgICAqIHRoZSB2aWRlbyBwYXJhbWV0ZXIgdGFibGUgKDB4ZjBhYy0weGYwZmIpCisgICAgICAgICAqIGFuZCB0aGUgZm9udCB0YWJsZXMgKDB4ZmE2ZS0weGZlNmQpCisgICAgICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIGJpb3MgaGVyZQorICAgICAgICAgKi8KKyAgICAKKyAgICAgICAgLyogc2V0IGJpb3MgZGF0ZSAqLworICAgICAgICBzdHJjcHkoKGNoYXIgKikweEZGRkY1LGRhdGUpOworICAgICAgICAvKiBzZXQgdXAgZWlzYSBpZGVudCBzdHJpbmcgKi8KKyAgICAgICAgc3RyY3B5KChjaGFyICopMHhGRkZEOSxlaXNhX2lkZW50KTsKKyAgICAgICAgLyogd3JpdGUgc3lzdGVtIG1vZGVsIGlkIGZvciBJQk0tQVQgKi8KKyAgICAgICAgKChjaGFyICopMClbMHhGRkZGRV0gPSAweGZjOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9iaW9zX3ZhcnModm9pZCkKK3sKKyAgICBpbnQgbWVtX2ZkOworICAgIHZvaWQgKm1hcDsKKyAgICBtZW1UeXBlIGk7CisgICAgCisjaWZkZWYgX19pYTY0X18KKyAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkgCisjZWxzZQorICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKSAKKyNlbmRpZgorICAgICAgICAgICAgeworICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKKyAgICByZXR1cm47CisgICAgfQorICAKKyAgICBpZiAoKG1hcCA9IG1tYXAoKHZvaWQgKikgMCwgKHNpemVfdCkgMHgyMDAwLAorICAgICAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKyAgICAgICAgIG1lbV9mZCwgMCkpID09ICh2b2lkICopLTEpICAgeworICAgIHBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtICgzKSIpOworICAgIGNsb3NlKG1lbV9mZCk7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBCSU9TX01FTTsgaSsrKSB7CisgICAgaWYgKGJpb3NfdmFyW2ldICE9ICooQ0FSRDgqKWkpIAorICAgICAgICAqKChDQVJEOCopbWFwICsgaSkgPSAqKENBUkQ4KilpOworICAgIH0KKworICAgIG11bm1hcChtYXAsMHgyMDAwKTsKKyAgICBjbG9zZShtZW1fZmQpOworfQorCitzdGF0aWMgaW50CitjaGtzdW0oQ0FSRDggKnN0YXJ0KQoreworICBDQVJEMTYgc2l6ZTsKKyAgQ0FSRDggdmFsID0gMDsKKyAgaW50IGk7CisKKyAgc2l6ZSA9ICooc3RhcnQrMikgKiA1MTI7ICAKKyAgZm9yIChpID0gMDsgaTxzaXplOyBpKyspCisgICAgdmFsICs9ICooc3RhcnQgKyBpKTsKKyAgICAKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuIDE7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiQklPUyBja3N1bSB3cm9uZyFcbiIpOworICByZXR1cm4gMDsKK30KKwordm9pZAorcnVuSU5UKGludCBudW0sIGk4NmJpb3NSZWdzUHRyIFJlZ3MpCit7CisgICAgQm9vbCBpc1ZpZGVvID0gRkFMU0U7CisgICAgQ0FSRDggY29kZV9pbnRbXSA9IHsgMywgMHhjZCwgMHgwMCwgMHhmNCB9OworCisgICAgY29kZV9pbnRbMl0gPSAoQ0FSRDgpIG51bTsKKyAgICAKKyAgICBpZiAobnVtID09IDB4MTApCisgICAgaXNWaWRlbyA9IFRSVUU7CisgICAgCisgICAgaWYgKCFzZXR1cF9zeXN0ZW1fYmlvcygpKQorICAgIHJldHVybjsKKworICAgIGlmICgoaXNWaWRlbyAmJiAoIUN1cnJlbnRQY2kgfHwgQ3VycmVudFBjaS0+YWN0aXZlKSkgfHwgIWlzVmlkZW8pIHsKKyAgICBDQVJEMzIgdmJpb3NfYmFzZTsKKworI2lmZGVmIF9faWEzMl9fCisgICAgaWYgKCEodmJpb3NfYmFzZSA9IHNldHVwX3ByaW1hcnlfaW50X3ZlY3QoKSkpCisjZWxzZQorICAgIGlmICghKHZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpKSkKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgaWYgKCFjb3B5X3ZiaW9zKHZiaW9zX2Jhc2UpKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmICghbWFwX3ZyYW0oKSkKKyAgICByZXR1cm47CisgICAgCisjaWZkZWYgVjg2QklPU19ERUJVRworICAgICAgICBwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOworI2VuZGlmCisgICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlX2ludCk7CisgICAgc2V0dXBfaW8oKTsKKyAgICBwcmludF9yZWdzKFJlZ3MpOworICAgIHNldF9pb3Blcm0oKTsKKyAgICBzZXRfaGx0KFRSVUUpOworICAgIGRvX3g4NihCSU9TX1NUQVJULFJlZ3MpOworICAgIHNldF9obHQoRkFMU0UpOworICAgIHByaW50X3JlZ3MoUmVncyk7CisgICAgCisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIHByaW50ZigiZG9uZVxuIik7CisjZW5kaWYKKworICAgIGlmICgoaXNWaWRlbyAmJiAoIUN1cnJlbnRQY2kgfHwgQ3VycmVudFBjaS0+YWN0aXZlKSkgfHwgIWlzVmlkZW8pIAorICAgIHVwZGF0ZV9iaW9zX3ZhcnMoKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKK3sKKyAgICBwcmludGYoImF4PSV4IGJ4PSV4IGN4PSV4IGR4PSV4IGRzPSV4IGVzPSV4IGRpPSV4IHNpPSV4XG4iLAorICAgICAgIChDQVJEMTYpcmVncy0+YXgsKENBUkQxNilyZWdzLT5ieCwoQ0FSRDE2KXJlZ3MtPmN4LChDQVJEMTYpcmVncy0+ZHgsCisgICAgICAgKENBUkQxNilyZWdzLT5kcywoQ0FSRDE2KXJlZ3MtPmVzLChDQVJEMTYpcmVncy0+ZGksCisgICAgICAgKENBUkQxNilyZWdzLT5zaSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF91c2FnZSh2b2lkKQoreworfQorCit2b2lkCithZGRfaGx0KHVuc2lnbmVkIGxvbmcgdmFsKQoreworICAgIGludCBpOworCisgICAgaWYgKHZhbCA8IEJJT1NfTUVNIHx8ICh2YWwgPiBWUkFNX1NUQVJUICYmIHZhbCA8IChWUkFNX1NUQVJUICsgVlJBTV9TSVpFKSkKKyAgICB8fCB2YWwgPj0gU0laRSkgeworICAgIHByaW50ZigiYWRkcmVzcyBvdXQgb2YgcmFuZ2VcbiIpOworICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZm9yIChpPTA7IGk8MjA7IGkrKykgeworICAgIGlmIChobHRwW2ldLmFkZHJlc3MgPT0gMCkgeworICAgICAgICBobHRwW2ldLmFkZHJlc3MgPSAodm9pZCopdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGlmIChpID09IDIwKSBwcmludGYoIm5vIG1vcmUgaGx0cG9pbnRzIGF2YWlsYWJsZVxuIik7Cit9CisKK3ZvaWQKK2RlbF9obHQoaW50IHZhbCkKK3sKKyAgICBpZiAodmFsID09IDIxKSB7IC8qIGRlbGV0ZSBhbGwgKi8KKyAgICBpbnQgaTsKKyAgICBwcmludGYoImNsZWFyaW5nIGFsbCBobHRwb2ludHNcbiIpOworICAgIGZvciAoaT0wOyBpIDwyMDsgaSsrKQorICAgICAgICBobHRwW2ldLmFkZHJlc3MgPSBOVUxMOworICAgIH0gZWxzZSBpZiAodmFsID49IDAgJiYgIHZhbCA8MjApCisgICAgaGx0cFt2YWxdLmFkZHJlc3MgPSBOVUxMOworICAgIGVsc2UgcHJpbnRmKCJobHRwb2ludCAlaSBvdXQgb2YgcmFuZ2U6IHZhbGlkIHJhbmdlIDAtMTlcbiIsdmFsKTsKK30KKwordm9pZAorbGlzdF9obHQoKQoreworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPDIwOyBpKyspIAorICAgIGlmIChobHRwW2ldLmFkZHJlc3MpCisgICAgICAgIHByaW50ZigiaGx0cG9pbnRbJWldOiAweCVseFxuIixpLCh1bnNpZ25lZCBsb25nKWhsdHBbaV0uYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfaGx0KEJvb2wgc2V0KQoreworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPDIwOyBpKyspIAorICAgIGlmIChobHRwW2ldLmFkZHJlc3MpIHsKKyAgICAgICAgaWYgKHNldCkgeworICAgICAgICBobHRwW2ldLm9yZ3ZhbCA9ICooQ0FSRDgqKWhsdHBbaV0uYWRkcmVzczsKKyAgICAgICAgKihDQVJEOCopaGx0cFtpXS5hZGRyZXNzID0gMHhmNDsKKyAgICAgICAgfSBlbHNlIAorICAgICAgICAqKENBUkQ4KilobHRwW2ldLmFkZHJlc3MgPSBobHRwW2ldLm9yZ3ZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfaW9wZXJtKHZvaWQpCit7CisgICAgaW50IGksIHN0YXJ0OworCisgICAgaW9wZXJtKDAsSU9QRVJNX0JJVFMsMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU9QRVJNX0JJVFM7aSsrKQorICAgIGlmIChpb3Blcm1fbGlzdFtpXSkgeworICAgICAgICBzdGFydCA9IGk7CisgICAgICAgIGZvciAoO2kgPCBJT1BFUk1fQklUUzsgaSsrKSB7CisgICAgICAgIGlmICghaW9wZXJtX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIGlvcGVybShzdGFydCxpIC0gc3RhcnQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkMGY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCisgKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBWODZfQklPU19ICisjZGVmaW5lIFY4Nl9CSU9TX0gKKworI2lmIGRlZmluZWQgKF9faTM4Nl9fKSB8fCBkZWZpbmVkIChfX2k0ODZfXykgfHwgZGVmaW5lZCAoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKSB8fCBkZWZpbmVkIChfX2s2X18pCisjIGlmbmRlZiBfX2lhMzJfXworIyAgZGVmaW5lIF9faWEzMl9fCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgcF9wcmludGYoZixhLi4uKSBkbyB7aWYgKENvbmZpZy5QcmludFBvcnQpIGxwcmludGYoZiwjI2EpO30gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKDApCisjZGVmaW5lIGlfcHJpbnRmKGYsYS4uLikgZG8gIHtpZiAoQ29uZmlnLlByaW50SXJxKSBscHJpbnRmKGYsIyNhKTt9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoMCkKKyNkZWZpbmUgUF9wcmludGYoZixhLi4uKSBkbyB7aWYgKENvbmZpZy5QcmludFBjaSkgbHByaW50ZihmLCMjYSk7fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKDApCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDQVJEODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgQ0FSRDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgQ0FSRDMyOworI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbWVtVHlwZTsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCBtZW1UeXBlOworI2VuZGlmCisKK3R5cGVkZWYgaW50IEJvb2w7CisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFIDEKKworc3RydWN0IGNvbmZpZyB7CisgICAgQm9vbCBQcmludFBvcnQ7CisgICAgQm9vbCBJb1N0YXRpc3RpY3M7CisgICAgQm9vbCBQcmludElycTsKKyAgICBCb29sIFByaW50UGNpOworICAgIEJvb2wgU2hvd0FsbERldjsKKyAgICBCb29sIFByaW50SXA7CisgICAgQm9vbCBTYXZlQmlvczsKKyAgICBCb29sIFRyYWNlOworICAgIEJvb2wgQ29uZmlnQWN0aXZlT25seTsKKyAgICBCb29sIENvbmZpZ0FjdGl2ZURldmljZTsKKyAgICBCb29sIE1hcFN5c0Jpb3M7CisgICAgQm9vbCBSZXNvcnQ7CisgICAgQm9vbCBGaXhSb207CisgICAgQm9vbCBOb0NvbnNvbGU7ICAgICAgICAgCisgICAgQm9vbCBCb290T25seTsKKyAgICBpbnQgIFZlcmJvc2U7Cit9OworCitzdHJ1Y3QgcGlvIHsKKyAgICBDQVJEOCAoKmluYikoQ0FSRDE2KTsKKyAgICBDQVJEMTYgKCppbncpKENBUkQxNik7CisgICAgQ0FSRDMyICgqaW5sKShDQVJEMTYpOworICAgIHZvaWQgKCpvdXRiKShDQVJEMTYsQ0FSRDgpOworICAgIHZvaWQgKCpvdXR3KShDQVJEMTYsQ0FSRDE2KTsKKyAgICB2b2lkICgqb3V0bCkoQ0FSRDE2LENBUkQzMik7Cit9OworCitzdHJ1Y3QgcmVnczg2IHsKKyAgICAgICAgbG9uZyBlYng7CisgICAgICAgIGxvbmcgZWN4OworICAgICAgICBsb25nIGVkeDsKKyAgICAgICAgbG9uZyBlc2k7CisgICAgICAgIGxvbmcgZWRpOworICAgICAgICBsb25nIGVicDsKKyAgICAgICAgbG9uZyBlYXg7CisgICAgICAgIGxvbmcgZWlwOworICAgICAgICBsb25nIGVzcDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY3M7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNzOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBlczsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZHM7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZzOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBnczsKKyAgICBsb25nIGVmbGFnczsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMzIgYXg7CisgICAgQ0FSRDMyIGJ4OworICAgIENBUkQzMiBjeDsKKyAgICBDQVJEMzIgZHg7CisgICAgQ0FSRDMyIGNzOworICAgIENBUkQzMiBlczsKKyAgICBDQVJEMzIgZHM7CisgICAgQ0FSRDMyIHNpOworICAgIENBUkQzMiBkaTsKK30gaTg2Ymlvc1JlZ3MsICppODZiaW9zUmVnc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBmZDsKKyAgICBpbnQgdnQ7Cit9IGNvbnNvbGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiBhZGRyZXNzOworICAgIENBUkQ4IG9yZ3ZhbDsKK30gaGFsdHBvaW50czsKKworZW51bSBkZXZfdHlwZSB7ICBOT05FLCBJU0EsIFBDSSB9Oworc3RydWN0IGRldmljZSB7CisgICAgQm9vbCBib290ZWQ7CisgICAgZW51bSBkZXZfdHlwZSB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgIGludCBub25lOworICAgICAgc3RydWN0IHBjaSB7CisgICAgICAgIGludCBidXM7CisgICAgICAgIGludCBkZXY7CisgICAgICAgIGludCBmdW5jOworICAgICAgfSBwY2k7CisgICAgfSBsb2M7Cit9OworCitleHRlcm4gc3RydWN0IGRldmljZSBEZXZpY2U7CisKKyNpZmRlZiBfX2FscGhhX18KK3Vuc2lnbmVkIGxvbmcgX2J1c19iYXNlKHZvaWQpOworZXh0ZXJuIHZvaWQqIHZyYW1fbWFwOworZXh0ZXJuIGludCBzcGFyc2Vfc2hpZnQ7CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBwaW8gUDsKK2V4dGVybiBzdHJ1Y3QgY29uZmlnIENvbmZpZzsKKyNkZWZpbmUgSU9QRVJNX0JJVFMgMTAyNAorZXh0ZXJuIGludCBpb3Blcm1fbGlzdFtJT1BFUk1fQklUU107CisKK2V4dGVybiB2b2lkIHNldHVwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgZG9feDg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCxpODZiaW9zUmVnc1B0ciByZWdzKTsKK2V4dGVybiBpbnQgcnVuX2Jpb3NfaW50KGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpOworZXh0ZXJuIENBUkQzMiBnZXRJbnRWZWN0KGludCBudW0pOworQ0FSRDMyIGdldElQKHZvaWQpOworCitleHRlcm4gdm9pZCBjYWxsX2Jvb3Qoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHJ1bklOVChpbnQgbnVtLGk4NmJpb3NSZWdzUHRyIFJlZ3MpOworZXh0ZXJuIHZvaWQgYWRkX2hsdCh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHZvaWQgZGVsX2hsdChpbnQgYWRkcik7CitleHRlcm4gdm9pZCBsaXN0X2hsdCgpOworCitleHRlcm4gaW50IHBvcnRfcmVwX2luYihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7CitleHRlcm4gaW50IHBvcnRfcmVwX2ludyhDQVJEMTYgcG9ydCwgQ0FSRDE2ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOworZXh0ZXJuIGludCBwb3J0X3JlcF9pbmwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKK2V4dGVybiBpbnQgcG9ydF9yZXBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7CitleHRlcm4gaW50IHBvcnRfcmVwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKK2V4dGVybiBpbnQgcG9ydF9yZXBfb3V0bChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOworZXh0ZXJuIENBUkQ4IHBfaW5iKENBUkQxNiBwb3J0KTsKK2V4dGVybiBDQVJEMTYgcF9pbncoQ0FSRDE2IHBvcnQpOworZXh0ZXJuIENBUkQzMiBwX2lubChDQVJEMTYgcG9ydCk7CitleHRlcm4gdm9pZCBwX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4IHZhbCk7CitleHRlcm4gdm9pZCBwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiB2YWwpOworZXh0ZXJuIHZvaWQgcF9vdXRsKENBUkQxNiBwb3J0LCBDQVJEMzIgdmFsKTsKKyNpZmRlZiBfX2FscGhhX18KK2V4dGVybiBDQVJEOCBhX2luYihDQVJEMTYgcG9ydCk7CitleHRlcm4gQ0FSRDE2IGFfaW53KENBUkQxNiBwb3J0KTsKK2V4dGVybiB2b2lkIGFfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggdmFsKTsKK2V4dGVybiB2b2lkIGFfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2IHZhbCk7CisjZW5kaWYKKyNpZmRlZiBfX2FscGhhX18KK0NBUkQ4IG1lbV9yYihDQVJEMzIgYWRkcik7CitDQVJEMTYgbWVtX3J3KENBUkQzMiBhZGRyKTsKK0NBUkQzMiBtZW1fcmwoQ0FSRDMyIGFkZHIpOwordm9pZCBtZW1fd2IoQ0FSRDMyIGFkZHIsIENBUkQ4IHZhbCk7Cit2b2lkIG1lbV93dyhDQVJEMzIgYWRkciwgQ0FSRDE2IHZhbCk7Cit2b2lkIG1lbV93bChDQVJEMzIgYWRkciwgQ0FSRDMyIHZhbCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIGlvX3N0YXRpc3RpY3Modm9pZCk7CitleHRlcm4gdm9pZCBjbGVhcl9zdGF0KHZvaWQpOworZXh0ZXJuIGludCBpbnRfaGFuZGxlcihpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKTsKKworZXh0ZXJuIGNvbnNvbGUgb3Blbl9jb25zb2xlKHZvaWQpOworZXh0ZXJuIHZvaWQgY2xvc2VfY29uc29sZShjb25zb2xlKTsKKworZXh0ZXJuIHZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2V4dGVybiBCb29sIGxvZ2dpbmc7CitleHRlcm4gQm9vbCBub3N0ZG91dDsKK2V4dGVybiBjaGFyKiBsb2dmaWxlOworZXh0ZXJuIHZvaWQgbG9nb24odm9pZCogcHRyKTsKK2V4dGVybiB2b2lkIGxvZ29mZigpOworZXh0ZXJuIHZvaWQgbHByaW50Zihjb25zdCBjaGFyICpmLCAuLi4pOworCisjZGVmaW5lIE1FTV9GSUxFICIvZGV2L21lbSIKKyNkZWZpbmUgREVGQVVMVF9WX0JJT1MgMHhjMDAwMAorI2lmbmRlZiBWX0JJT1MKKyNkZWZpbmUgVl9CSU9TIERFRkFVTFRfVl9CSU9TCisjZW5kaWYKKworI2lmZGVmIF9fYWxwaGFfXworI2RlZmluZSBORUVEX1BDSV9JTworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3dvcmtpbmdfY2FyZHMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3dvcmtpbmdfY2FyZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1M2YyNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvd29ya2luZ19jYXJkcwpAQCAtMCwwICsxLDcgQEAKK0RhdmlkIE1vbnJvOiAgICAgICAgICAgICAgICAgICAgVHJpZGVudCBUR1VJIDk0NDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlyZ2UvVlggKERpYW1vbmQgU3RlYWx0aCAzRCAzNDAwKSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaXZhIFROVCAoRGlhbW9uZCBWaXBlciBWNTUwKSAgIG5vIHZiaW9zPworSmFybm8gUGFhbmFuZW4gPGpwYWFuYUBzMi5vcmc+OiBHdWlsbGVtb3QgTWF4aWdhbWVyIFhlbnRvciAzMiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5WSURJQSBUTlQyIFVsdHJhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBHcmFwaGljcyBCbGFzdGVyIEV4eHRyZW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGVybWVkaWEgMikgCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3g4NmVtdS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy94ODZlbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M3MmRmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy94ODZlbXUuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIElGX01BU0sgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVklGX01BU0sgICAgMHgwMDA4MDAwMCAgLyogdmlydHVhbCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBWSVBfTUFTSyAgICAweDAwMTAwMDAwICAvKiB2aXJ0dWFsIGludGVycnVwdCBwZW5kaW5nICovCisKKyNpbmNsdWRlIDwvdXNyL2luY2x1ZGUvdW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisvLyNpbmNsdWRlIDxzeXNjYWxsLWxpc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIF9fYWxwaGFfXworI2luY2x1ZGUgPHN5cy9pby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSAiQXNtTWFjcm9zLmgiCisjaW5jbHVkZSAidjg2Ymlvcy5oIgorIyBkZWZpbmUgREVCVUcKKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIE0gICAgICAgICAgICBfWDg2RU1VX2VudgorI2RlZmluZSBDUFVfUkVHKHJlZykgTS54ODYuUl8jI3JlZworCitzdHJ1Y3QgcGlvIFA7CisKK3ZvaWQKK3NldHVwX2lvKHZvaWQpIAoreworICAgIGlmICghQ29uZmlnLlByaW50UG9ydCAmJiAhQ29uZmlnLklvU3RhdGlzdGljcykgeworICAgIAorI2lmIGRlZmluZWQgKF9faTM4Nl9fKQorICAgIFAuaW5iID0gKHU4KCopKHUxNikpaW5iOworICAgIFAuaW53ID0gKHUxNigqKSh1MTYpKWludzsKKyAgICBQLm91dGIgPSAodm9pZCgqKSh1MTYsdTgpKW91dGI7CisgICAgUC5vdXR3ID0gKHZvaWQoKikodTE2LHUxNikpb3V0dzsKKyNlbHNlCisgICAgUC5pbmIgPSBwX2luYjsKKyAgICBQLmludyA9IHBfaW53OworICAgIFAub3V0YiA9IHBfb3V0YjsKKyAgICBQLm91dHcgPSBwX291dHc7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX2kzODZfXykgJiYgISBkZWZpbmVkKE5FRURfUENJX0lPKQorICAgIFAuaW5sID0gKHUzMigqKSh1MTYpKWlubDsKKyAgICBQLm91dGwgPSAodm9pZCgqKSh1MTYsdTMyKSlvdXRsOworI2Vsc2UKKyAgICBQLmlubCA9IHBfaW5sOworICAgIFAub3V0bCA9IHBfb3V0bDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgUC5pbmIgPSBwX2luYjsKKyAgICBQLmludyA9IHBfaW53OworICAgIFAuaW5sID0gcF9pbmw7CisgICAgUC5vdXRiID0gcF9vdXRiOworICAgIFAub3V0dyA9IHBfb3V0dzsKKyAgICBQLm91dGwgPSBwX291dGw7CisgICAgfQorfQorCit2b2lkCit4ODZlbXVfZG9faW50KGludCBudW0pCit7CisgICAgc3RydWN0IHJlZ3M4NiByZWdzOworICAgICAgICAKKyAgICBpX3ByaW50ZigiaW50IDB4JXggcmVjZWl2ZWQ6IGF4OjB4JXgiLG51bSxDUFVfUkVHKEFYKSk7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBpX3ByaW50ZigiIGF0OiAweCV4XG4iLGdldElQKCkpOworICAgIGVsc2UKKyAgICAgICAgaV9wcmludGYoIlxuIik7CisgICAgCisgICAgLyogdHJ5IHRvIHJ1biBiaW9zIGludGVycnVwdCAqLworICAgIAorICAgIC8qIGlmIG5vdCBpbnN0YWxsZWQgZmFsbCBiYWNrICovCisjZGVmaW5lIENPUFkoeCx5KSByZWdzLnkgPSBNLng4Ni54CisjZGVmaW5lIENPUFlfUih4LHkpIE0ueDg2LnggPSByZWdzLnkKKyAgICAKKyAgICBDT1BZKFJfRUFYLGVheCk7CisgICAgQ09QWShSX0VCWCxlYngpOworICAgIENPUFkoUl9FQ1gsZWN4KTsKKyAgICBDT1BZKFJfRURYLGVkeCk7CisgICAgQ09QWShSX0VTSSxlc2kpOworICAgIENPUFkoUl9FREksZWRpKTsKKyAgICBDT1BZKFJfRUJQLGVicCk7CisgICAgQ09QWShSX0VJUCxlaXApOworICAgIENPUFkoUl9FU1AsZXNwKTsKKyAgICBDT1BZKFJfQ1MsY3MpOworICAgIENPUFkoUl9TUyxzcyk7CisgICAgQ09QWShSX0RTLGRzKTsKKyAgICBDT1BZKFJfRVMsZXMpOworICAgIENPUFkoUl9GUyxmcyk7CisgICAgQ09QWShSX0dTLGdzKTsKKyAgICBDT1BZKFJfRUZMRyxlZmxhZ3MpOworCisgICAgaWYgKCEoaW50X2hhbmRsZXIobnVtLCZyZWdzKSkpIHsKKyAgICAgICAgaWYgKCFydW5fYmlvc19pbnQobnVtLCZyZWdzKSkKKyAgICAgICAgICAgIGdvdG8gdW5rbm93bl9pbnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgQ09QWV9SKFJfRUFYLGVheCk7CisgICAgQ09QWV9SKFJfRUJYLGVieCk7CisgICAgQ09QWV9SKFJfRUNYLGVjeCk7CisgICAgQ09QWV9SKFJfRURYLGVkeCk7CisgICAgQ09QWV9SKFJfRVNJLGVzaSk7CisgICAgQ09QWV9SKFJfRURJLGVkaSk7CisgICAgQ09QWV9SKFJfRUJQLGVicCk7CisgICAgQ09QWV9SKFJfRUlQLGVpcCk7CisgICAgQ09QWV9SKFJfRVNQLGVzcCk7CisgICAgQ09QWV9SKFJfQ1MsY3MpOworICAgIENPUFlfUihSX1NTLHNzKTsKKyAgICBDT1BZX1IoUl9EUyxkcyk7CisgICAgQ09QWV9SKFJfRVMsZXMpOworICAgIENPUFlfUihSX0ZTLGZzKTsKKyAgICBDT1BZX1IoUl9HUyxncyk7CisgICAgQ09QWV9SKFJfRUZMRyxlZmxhZ3MpOworICAgIHJldHVybjsKKworIHVua25vd25faW50OgorICAgIGZwcmludGYoc3RkZXJyLCJcblVua25vd24gdm04Nl9pbnQ6ICVYXG5cbiIsbnVtKTsKKyAgICBYODZFTVVfaGFsdF9zeXMoKTsKKyAgICByZXR1cm47CisgICAgCisjdW5kZWYgQ09QWQorI3VuZGVmIENPUFlfUgorfQorCit2b2lkCitzZXR1cF94ODZlbXUodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LCBpODZiaW9zUmVnc1B0ciByZWdzKQoreworICAgIGludCBpOworICAgIENBUkQzMiBlaXA7CisgICAgQ0FSRDE2IGNzOworICAgIFg4NkVNVV9pbnRyRnVuY3MgaW50RnVuY3NbMjU2XTsKKworICAgIFg4NkVNVV9waW9GdW5jcyBwaW9GdW5jcyA9IHsKKyAgICAgICAgKHU4KCopKHUxNikpUC5pbmIsCisgICAgICAgICh1MTYoKikodTE2KSlQLmludywKKyAgICAgICAgKHUzMigqKSh1MTYpKVAuaW5sLAorICAgICAgICAodm9pZCgqKSh1MTYsdTgpKVAub3V0YiwKKyAgICAgICAgKHZvaWQoKikodTE2LHUxNikpUC5vdXR3LAorICAgICAgICAodm9pZCgqKSh1MTYsdTMyKSlQLm91dGwKKyAgICB9OworI2lmZGVmIF9fYWxwaGFfXworICAgIFg4NkVNVV9tZW1GdW5jcyBtZW1GdW5jcyA9IHsKKyAgICAgICh1OCgqKSh1MzIpKW1lbV9yYiwKKyAgICAgICh1MTYoKikodTMyKSltZW1fcncsCisgICAgICAodTMyKCopKHUzMikpbWVtX3JsLAorICAgICAgKHZvaWQoKikodTMyLHU4KSltZW1fd2IsCisgICAgICAodm9pZCgqKSh1MzIsdTE2KSltZW1fd3csCisgICAgICAodm9pZCgqKSh1MzIsdTMyKSltZW1fd2wKKyAgICB9OworI2VuZGlmCisgICAgTS5tZW1fYmFzZSA9IDA7CisgICAgTS5tZW1fc2l6ZSA9IDEwMjQqMTAyNCArIDEwMjQ7CisgICAgLy8gIE0ueDg2LmRlYnVnID0gREVCVUdfRElTQVNTRU1CTEVfRiB8IERFQlVHX1RSQUNFX0YgfCBERUJVR19ERUNPREVfRjsKKyAgICAvLyAgTS54ODYuZGVidWcgfD0gREVCVUdfREVDT0RFX0YgfCAgREVCVUdfVFJBQ0VfRjsKKy8qCisgKiBGb3Igc2luZ2xlIHN0ZXAgdHJhY2luZyBjb21waWxlIHg4NmVtdSB3aXRoIG9wdGlvbiAtRERFQlVHCisgKi8KKyAgICBNLng4Ni5kZWJ1ZyA9IDA7CisgICAgaWYgKENvbmZpZy5QcmludElwKQorICAgICAgICBNLng4Ni5kZWJ1ZyA9IERFQlVHX1NBVkVfQ1NfSVA7CisKKyAgICBpZiAoQ29uZmlnLlRyYWNlKQorICAgICAgICBYODZFTVVfdHJhY2Vfb24oKTsKKworICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZwaW9GdW5jcyk7CisjaWZkZWYgX19hbHBoYV9fCisgICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoJm1lbUZ1bmNzKTsKKyNlbmRpZgorICAgIGZvciAoaT0wO2k8MjU2O2krKykKKyAgICAgICAgaW50RnVuY3NbaV0gPSB4ODZlbXVfZG9faW50OworICAgIFg4NkVNVV9zZXR1cEludHJGdW5jcyhpbnRGdW5jcyk7CisKKyAgICBlaXAgPSBiaW9zX3N0YXJ0ICYgMHhGRkZGOworICAgIGNzID0gKGJpb3Nfc3RhcnQgJiAweEZGMDAwMCkgPj4gNDsKKyAgICAKKyAgICBDUFVfUkVHKEVBWCkgPSByZWdzLT5heDsKKyAgICBDUFVfUkVHKEVCWCkgPSByZWdzLT5ieDsKKyAgICBDUFVfUkVHKEVDWCkgPSByZWdzLT5jeDsKKyAgICBDUFVfUkVHKEVEWCkgPSByZWdzLT5keDsKKyAgICBDUFVfUkVHKEVTSSkgPSByZWdzLT5zaTsKKyAgICBDUFVfUkVHKEVESSkgPSByZWdzLT5kaTsKKyAgICBDUFVfUkVHKEVCUCkgPSAwOworICAgIENQVV9SRUcoRUlQKSA9IGVpcDsKKyAgICBDUFVfUkVHKENTKSA9IGNzOyAgICAgICAgICAgICAgIAorICAgIENQVV9SRUcoU1ApID0gMHgxMDA7CisgICAgQ1BVX1JFRyhTUykgPSAweDMwOyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBjIGJpb3Mgc3RhY2sgKi8KKyAgICBDUFVfUkVHKEVTKSA9IHJlZ3MtPmVzOworICAgIENQVV9SRUcoRFMpID0gcmVncy0+ZHM7CisgICAgQ1BVX1JFRyhGUykgPSAwOworICAgIENQVV9SRUcoR1MpID0gMDsKKyAgICBDUFVfUkVHKEVGTEcpIHw9IChWSUZfTUFTSyB8IFZJUF9NQVNLIHwgSUZfTUFTSyB8IDB4Mik7Cit9CisKK3ZvaWQKK2NvbGxlY3RfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCit7CisgICAgcmVncy0+YXggPSBDUFVfUkVHKEVBWCk7CisgICAgcmVncy0+YnggPSBDUFVfUkVHKEVCWCk7CisgICAgcmVncy0+Y3ggPSBDUFVfUkVHKEVDWCk7CisgICAgcmVncy0+ZHggPSBDUFVfUkVHKEVEWCk7CisgICAgcmVncy0+ZXMgPSBDUFVfUkVHKEVTKTsKKyAgICByZWdzLT5kcyA9IENQVV9SRUcoRFMpOworICAgIHJlZ3MtPmRpID0gQ1BVX1JFRyhFREkpOworICAgIHJlZ3MtPnNpID0gQ1BVX1JFRyhFU0kpOworfQorCitzdGF0aWMgdm9pZAorZG9feDg2ZW11KHZvaWQpCit7CisgICAgWDg2RU1VX2V4ZWMoKTsKK30KKworc3RhdGljIGptcF9idWYgeDg2X2VzYzsKK3N0YXRpYyB2b2lkCit2bWV4aXQoaW50IHVudXNlZCkKK3sKKyAgICBsb25nam1wKHg4Nl9lc2MsMSk7Cit9CisKK3ZvaWQKK2RvX3g4Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCit7CisgICAgc3RhdGljIHZvaWQgKCpvcmdfaGFuZGxlcikoaW50KTsKKworICAgIHNldHVwX3g4NmVtdShiaW9zX3N0YXJ0LHJlZ3MpOworICAgIGlmIChzZXRqbXAoeDg2X2VzYykgPT0gMCkgeworICAgICAgICBvcmdfaGFuZGxlciA9IHNpZ25hbCgyLHZtZXhpdCk7CisgICAgICAgIGRvX3g4NmVtdSgpOworICAgICAgICBzaWduYWwoMixvcmdfaGFuZGxlcik7CisgICAgICAgIGNvbGxlY3RfYmlvc19yZWdzKHJlZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpZ25hbCgyLG9yZ19oYW5kbGVyKTsKKyAgICAgICAgcHJpbnRmKCJpbnRlcnJ1cHRlZCBhdCAweCV4XG4iLCgoQ0FSRDE2KUNQVV9SRUcoQ1MpKSA8PCA0CisgICAgICAgICAgICAgICB8IChDQVJEMTYpQ1BVX1JFRyhFSVApKTsKKyAgICB9Cit9CisKK2ludAorcnVuX2Jpb3NfaW50KGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpCit7CisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIHN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKKyNlbmRpZgorICAgIC8qIGNoZWNrIGlmIGJpb3MgdmVjdG9yIGlzIGluaXRpYWxpemVkICovCisgICAgaWYgKCgoQ0FSRDE2KikwKVsobnVtPDwxKSsxXSA9PSAweDAwMDApIHsgLyogU1lTX0JJT1NfU0VHID8qLworI2lmZGVmIFY4NkJJT1NfREVCVUcKKyAgICAgICAgaV9wcmludGYoImNhcmQgQklPUyBub3QgbG9hZGVkXG4iKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisjaWZkZWYgVjg2QklPU19ERUJVRworICAgIGlmIChmaXJzdHRpbWUpIHsKKyAgICAgICAgZHByaW50KDAsMHgzRDApOworICAgICAgICBmaXJzdHRpbWUgPSAwOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIGlfcHJpbnRmKCJjYWxsaW5nIGNhcmQgQklPUyBhdDogIik7CisgICAgaV9wcmludGYoIjB4JXg6JXhcbiIsKChDQVJEMTYgKikgMClbKG51bSA8PCAxKSArIDFdLAorICAgICAgICAgICAgIChDQVJEMzIpKChDQVJEMTYgKikgMClbbnVtIDw8IDFdKTsKKyAgICBYODZFTVVfcHJlcGFyZUZvckludChudW0pOworICAgIAorICAgIHJldHVybiAxOworfQorCitDQVJEMzIKK2dldEludFZlY3QoaW50IG51bSkKK3sKKyAgcmV0dXJuICgoQ0FSRDMyKikwKVtudW1dOworfQorI2lmIDAKK3ZvaWQKK3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3B0cjsKKyAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7CisgICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIGFyZ3B0cik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgdmFfZW5kKGFyZ3B0cik7Cit9CisjZW5kaWYKKworQ0FSRDMyCitnZXRJUCh2b2lkKQoreworICAgIHJldHVybiAoTS54ODYuc2F2ZWRfY3MgPDwgNCkgKyBNLng4Ni5zYXZlZF9pcDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9MSUNFTlNFIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZGU0YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9MSUNFTlNFCkBAIC0wLDAgKzEsMTcgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaWNlbnNlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgeDg2ZW11IGxpYnJhcnkgaXMgdW5kZXIgYSBCU0Qgc3R5bGUgbGljZW5zZSwgY29tYXB0aWJsZQord2l0aCB0aGUgWEZyZWU4NiBhbmQgWCBsaWNlbnNlcyB1c2VkIGJ5IFhGcmVlODYuIFRoZQorb3JpZ2luYWwgeDg2ZW11IGxpYnJhcmllcyB3ZXJlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UuIER1ZSB0byBsaWNlbnNlIGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gdGhlIEdQTAorYW5kIHRoZSBYRnJlZTg2IGxpY2Vuc2UsIHRoZSBvcmlnaW5hbCBhdXRob3JzIG9mIHRoZSBjb2RlCitkZWNpZGVkIHRvIGFsbG93IGEgbGljZW5zZSBjaGFuZ2UuIElmIHlvdSBoYXZlIHN1Ym1pdHRlZAorY29kZSB0byB0aGUgb3JpZ2luYWwgeDg2ZW11IHByb2plY3QsIGFuZCB5b3UgZG9uJ3QgYWdyZWUKK3dpdGggdGhlIGxpY2Vuc2UgY2hhbmdlLCBwbGVhc2UgY29udGFjdCB1cyBhbmQgbGV0IHlvdQora25vdy4gWW91ciBjb2RlIHdpbGwgYmUgcmVtb3ZlZCB0byBjb21wbHkgd2l0aCB5b3VyIHdpc2hlcy4KKworSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhYm91dCB0aGlzLCBwbGVhc2Ugc2VuZCBlbWFpbCB0bworeDg2ZW11QGxpbnV4bGFicy5jb20gb3IgS2VuZGFsbEJAc2NpdGVjaHNvZnQuY29tIGZvcgorY2xhcmlmaWNhdGlvbi4KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlYnVnLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTAwMDhjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlYnVnLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJCUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGhhbmRsZSBkZWJ1Z2dpbmcgb2YgdGhlCisqCQkJCWVtdWxhdG9yLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworCitzdGF0aWMgdm9pZCAgICAgcHJpbnRfZW5jb2RlZF9ieXRlcyAodTE2IHMsIHUxNiBvKTsKK3N0YXRpYyB2b2lkICAgICBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICh2b2lkKTsKK3N0YXRpYyBpbnQgICAgICBwYXJzZV9saW5lIChjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pOworICAKKy8qIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIGRlYnVnJ3Mgb3V0cHV0LiAqLwordm9pZCBYODZFTVVfdHJhY2VfcmVncyAodm9pZCkKK3sKKwlpZiAoREVCVUdfVFJBQ0UoKSkgeworCQl4ODZlbXVfZHVtcF9yZWdzKCk7CisgICAgfQorCWlmIChERUJVR19ERUNPREUoKSAmJiAhIERFQlVHX0RFQ09ERV9OT1BSSU5UKCkpIHsKKwkJcHJpbnRrKCIlMDR4OiUwNHggIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCQlwcmludF9lbmNvZGVkX2J5dGVzKCBNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCQlwcmludF9kZWNvZGVkX2luc3RydWN0aW9uKCk7CisgICAgfQorfQorCit2b2lkIFg4NkVNVV90cmFjZV94cmVncyAodm9pZCkKK3sKKwlpZiAoREVCVUdfVFJBQ0UoKSkgeworCQl4ODZlbXVfZHVtcF94cmVncygpOworICAgIH0KK30KKwordm9pZCB4ODZlbXVfanVzdF9kaXNhc3NlbWJsZSAodm9pZCkKK3sKKyAgICAvKgorICAgICAqIFRoaXMgcm91dGluZSBjYWxsZWQgaWYgdGhlIGZsYWcgREVCVUdfRElTQVNTRU1CTEUgaXMgc2V0IGtpbmQKKyAgICAgKiBvZiBhIGhhY2shCisgICAgICovCisJcHJpbnRrKCIlMDR4OiUwNHggIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCXByaW50X2VuY29kZWRfYnl0ZXMoIE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7CisJcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbigpOworfQorCitzdGF0aWMgdm9pZCBkaXNhc3NlbWJsZV9mb3J3YXJkICh1MTYgc2VnLCB1MTYgb2ZmLCBpbnQgbikKK3sKKwlYODZFTVVfc3lzRW52IHRyZWdzOworCWludCBpOworCXU4IG9wMTsKKyAgICAvKgorICAgICAqIGhhY2ssIGhhY2ssIGhhY2suICBXaGF0IHdlIGRvIGlzIHVzZSB0aGUgZXhhY3QgbWFjaGluZXJ5IHNldCB1cAorICAgICAqIGZvciBleGVjdXRpb24sIGV4Y2VwdCB0aGF0IG5vdyB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHN0YXRlCisgICAgICogZmxhZyBhc3NvY2lhdGVkIHdpdGggdGhlICJleGVjdXRpb24iLCBhbmQgd2UgYXJlIHVzaW5nIGEgY29weQorICAgICAqIG9mIHRoZSByZWdpc3RlciBzdHJ1Y3QuICBBbGwgdGhlIG1ham9yIG9wY29kZXMsIG9uY2UgZnVsbHkKKyAgICAgKiBkZWNvZGVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzOiBUUkFDRV9SRUdTKHIsbSk7CisgICAgICogU0lOR0xFX1NURVAocixtKTsgd2hpY2ggZGlzYXBwZWFyIGlmIERFQlVHIGlzIG5vdCBkZWZpbmVkIHRvCisgICAgICogdGhlIHByZXByb2Nlc3Nvci4gIFRoZSBUUkFDRV9SRUdTIG1hY3JvIGV4cGFuZHMgdG86CisgICAgICoKKyAgICAgKiBpZiAoZGVidWcmREVCVUdfRElTQVNTRU1CTEUpIAorICAgICAqICAgICB7anVzdF9kaXNhc3NlbWJsZSgpOyBnb3RvIEVuZE9mSW5zdHJ1Y3Rpb247fQorICAgICAqICAgICBpZiAoZGVidWcmREVCVUdfVFJBQ0UpIHRyYWNlX3JlZ3MocixtKTsKKyAgICAgKgorICAgICAqIC4uLi4uLiAgYW5kIGF0IHRoZSBsYXN0IGxpbmUgb2YgdGhlIHJvdXRpbmUuIAorICAgICAqCisgICAgICogRW5kT2ZJbnN0cnVjdGlvbjogZW5kX2luc3RyKCk7CisgICAgICoKKyAgICAgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgVFJBQ0VfUkVHIGlzIGV4cGFuZGVkLCBOTyBtb2RpZmljYXRpb25zCisgICAgICogYXJlIGRvbmUgdG8gYW55IHJlZ2lzdGVyIEVYQ0VQVCB0aGUgSVAgcmVnaXN0ZXIsIGZvciBmZXRjaCBhbmQKKyAgICAgKiBkZWNvZGluZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgd2FzIGRvbmUgZm9yIGFuIGVudGlyZWx5IGRpZmZlcmVudCByZWFzb24sIGJ1dCBtYWtlcyBhCisgICAgICogbmljZSB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdG8gaGVscCBkZWJ1ZyBjb2Rlcy4KKyAgICAgKi8KKwl0cmVncyA9IE07CisgICAgdHJlZ3MueDg2LlJfSVAgPSBvZmY7CisgICAgdHJlZ3MueDg2LlJfQ1MgPSBzZWc7CisgICAgCisgICAgLyogcmVzZXQgdGhlIGRlY29kaW5nIGJ1ZmZlcnMgKi8KKyAgICB0cmVncy54ODYuZW5jX3N0cl9wb3MgPSAwOworICAgIHRyZWdzLng4Ni5lbmNfcG9zID0gMDsKKyAgICAKKyAgICAvKiB0dXJuIG9uIHRoZSAiZGlzYXNzZW1ibGUgb25seSwgbm8gZXhlY3V0ZSIgZmxhZyAqLworICAgIHRyZWdzLng4Ni5kZWJ1ZyB8PSBERUJVR19ESVNBU1NFTUJMRV9GOworIAorICAgIC8qIERVTVAgTkVYVCBuIGluc3RydWN0aW9ucyB0byBzY3JlZW4gaW4gc3RyYWlnaHRfbGluZSBmYXNoaW9uICovCisgICAgLyoKKyAgICAgKiBUaGlzIGxvb2tzIGxpa2UgdGhlIHJlZ3VsYXIgaW5zdHJ1Y3Rpb24gZmV0Y2ggc3RyZWFtLCBleGNlcHQKKyAgICAgKiB0aGF0IHdoZW4gdGhpcyBvY2N1cnMsIGVhY2ggZmV0Y2hlZCBvcGNvZGUsIHVwb24gc2VlaW5nIHRoZQorICAgICAqIERFQlVHX0RJU0FTU0VNQkxFIGZsYWcgc2V0LCBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZworICAgICAqIHRoZSBpbnN0cnVjdGlvbi4gIFhYWCAtLS0gQ0hFQ0sgVEhBVCBNRU0gSVMgTk9UIEFGRkVDVEVEISEhCisgICAgICogTm90ZSB0aGUgdXNlIG9mIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlLi4uCisgICAgICovCisgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CisJCW9wMSA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUzw8NCkgKyAoTS54ODYuUl9JUCsrKSk7CisJCSh4ODZlbXVfb3B0YWJbb3AxXSkob3AxKTsKKyAgICB9CisgICAgLyogZW5kIG1ham9yIGhhY2sgbW9kZS4gKi8KK30KKwordm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzICh2b2lkKQoreworICAgIC8qIE5VTEwgYXMgb2Ygbm93ICovCit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcyAodm9pZCkKK3sKK30KKwordm9pZCB4ODZlbXVfY2hlY2tfbWVtX2FjY2VzcyAodTMyIGR1bW15KQoreworCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLworfQorCit2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyAodWludCBkdW1teTEsIHVpbnQgZHVtbXkyKQoreworCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLworfQorCit2b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbiAoaW50IHgpCit7CisJTS54ODYuZW5jX3BvcyArPSB4OworfQorCit2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmIChjaGFyICp4KQoreworCXNwcmludGYoTS54ODYuZGVjb2RlZF9idWYrTS54ODYuZW5jX3N0cl9wb3MsIiVzIix4KTsKKwlNLng4Ni5lbmNfc3RyX3BvcyArPSBzdHJsZW4oeCk7Cit9CisKK3ZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYyIChjaGFyICp4LCBpbnQgeSkKK3sKKwljaGFyIHRlbXBbMTAwXTsKKwlzcHJpbnRmKHRlbXAseCx5KTsKKwlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmK00ueDg2LmVuY19zdHJfcG9zLCIlcyIsdGVtcCk7CisJTS54ODYuZW5jX3N0cl9wb3MgKz0gc3RybGVuKHRlbXApOworfQorCit2b2lkIHg4NmVtdV9lbmRfaW5zdHIgKHZvaWQpCit7CisJTS54ODYuZW5jX3N0cl9wb3MgPSAwOworCU0ueDg2LmVuY19wb3MgPSAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9lbmNvZGVkX2J5dGVzICh1MTYgcywgdTE2IG8pCit7CisgICAgaW50IGk7CisgICAgY2hhciBidWYxWzY0XTsKKwlmb3IgKGk9MDsgaTwgTS54ODYuZW5jX3BvczsgaSsrKSB7CisJCXNwcmludGYoYnVmMSsyKmksIiUwMngiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHMsbytpKSk7CisgICAgfQorCXByaW50aygiJS0yMHMiLGJ1ZjEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICh2b2lkKQoreworCXByaW50aygiJXMiLCBNLng4Ni5kZWNvZGVkX2J1Zik7Cit9CisKK3ZvaWQgeDg2ZW11X3ByaW50X2ludF92ZWN0ICh1MTYgaXYpCit7CisJdTE2IHNlZyxvZmY7CisKKwlpZiAoaXYgPiAyNTYpIHJldHVybjsKKwlzZWcgICA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCxpdio0KTsKKwlvZmYgICA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCxpdio0KzIpOworCXByaW50aygiJTA0eDolMDR4ICIsIHNlZywgb2ZmKTsKK30KKwordm9pZCBYODZFTVVfZHVtcF9tZW1vcnkgKHUxNiBzZWcsIHUxNiBvZmYsIHUzMiBhbXQpCit7CisgICAgdTMyIHN0YXJ0ID0gb2ZmICYgMHhmZmZmZmZmMDsKKyAgICB1MzIgZW5kICA9IChvZmYrMTYpICYgMHhmZmZmZmZmMDsKKyAgICB1MzIgaTsKKyAgICB1MzIgY3VycmVudDsKKyAgICAKKyAgICBjdXJyZW50ID0gc3RhcnQ7CisgICAgd2hpbGUgKGVuZCA8PSBvZmYgKyBhbXQpIHsKKwlwcmludGsoIiUwNHg6JTA0eCAiLCBzZWcsIHN0YXJ0KTsKKwlmb3IgKGk9c3RhcnQ7IGk8IG9mZjsgaSsrKQorCSAgICBwcmludGsoIiAgICIpOworCWZvciAoICAgICAgIDsgaTwgZW5kOyBpKyspCisJICAgIHByaW50aygiJTAyeCAiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHNlZyxpKSk7CisJcHJpbnRrKCJcbiIpOworCXN0YXJ0ID0gZW5kOworCWVuZCA9IHN0YXJ0ICsgMTY7CisgICAgfQorfQorCit2b2lkIHg4NmVtdV9zaW5nbGVfc3RlcCAodm9pZCkKK3sKKyAgICBjaGFyIHNbMTAyNF07CisgICAgaW50IHBzWzEwXTsKKyAgICBpbnQgbnRvazsKKyAgICBpbnQgY21kOworICAgIGludCBkb25lOworCQlpbnQgc2VnbWVudDsKKyAgICBpbnQgb2Zmc2V0OworICAgIHN0YXRpYyBpbnQgYnJlYWtwb2ludDsKKyAgICBzdGF0aWMgaW50IG5vRGVjb2RlID0gMTsKKyAgICAKKyAgICBjaGFyICpwOworCisgICAgaWYgKERFQlVHX0JSRUFLKCkpIHsKKwlpZiAoTS54ODYuc2F2ZWRfaXAgIT0gYnJlYWtwb2ludCkgeworCSAgICByZXR1cm47CisJfSBlbHNlIHsKKwkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7CisJICAgIE0ueDg2LmRlYnVnIHw9IERFQlVHX1RSQUNFX0Y7CisJICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19CUkVBS19GOworCSAgICBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICgpOworCSAgICBYODZFTVVfdHJhY2VfcmVncygpOworCX0KKyAgICB9CisgICAgCisgICAgZG9uZT0wOworICAgIG9mZnNldCA9IE0ueDg2LnNhdmVkX2lwOworICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICBwcmludGsoIi0iKTsKKyAgICAgICAgLy9wID0gZmdldHMocywgMTAyMywgc3RkaW4pOworCWNvbnNfZ2V0cyhzKTsKKyAgICAgICAgY21kID0gcGFyc2VfbGluZShzLCBwcywgJm50b2spOworICAgICAgICBzd2l0Y2goY21kKSB7CisJY2FzZSAndSc6CisJICAgIGRpc2Fzc2VtYmxlX2ZvcndhcmQoTS54ODYuc2F2ZWRfY3MsKHUxNilvZmZzZXQsMTApOworICAgICAgICAgICAgYnJlYWs7CisJY2FzZSAnZCc6ICAKKwkgICAgaWYgKG50b2sgPT0gMikgeworCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7CisJCW9mZnNldCA9IHBzWzFdOworCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwodTE2KW9mZnNldCwxNik7CisJCW9mZnNldCArPSAxNjsKKwkgICAgfSBlbHNlIGlmIChudG9rID09IDMpIHsKKwkJc2VnbWVudCA9IHBzWzFdOworCQlvZmZzZXQgPSBwc1syXTsKKwkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsKHUxNilvZmZzZXQsMTYpOworCQlvZmZzZXQgKz0gMTY7CisJICAgIH0gZWxzZSB7CisJCXNlZ21lbnQgPSBNLng4Ni5zYXZlZF9jczsKKwkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsKHUxNilvZmZzZXQsMTYpOworCQlvZmZzZXQgKz0gMTY7CisJICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgJ2MnOgorCSAgICBNLng4Ni5kZWJ1ZyBePSBERUJVR19UUkFDRUNBTExfRjsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgICBNLng4Ni5kZWJ1ZyBePSBERUJVR19TVkNfRiB8IERFQlVHX1NZU19GIHwgREVCVUdfU1lTSU5UX0Y7CisgICAgICAgICAgICBicmVhazsKKwljYXNlICdyJzoKKwkgICAgWDg2RU1VX3RyYWNlX3JlZ3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgJ3gnOgorCSAgICBYODZFTVVfdHJhY2VfeHJlZ3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgJ2cnOgorICAgICAgICAgICAgaWYgKG50b2sgPT0gMikgeworICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQgPSBwc1sxXTsKKwkJcHJpbnRrKCJicmVha3BvaW50IHNldCB0byAweCVYXG4iLCBicmVha3BvaW50KTsKKwkJaWYgKG5vRGVjb2RlKSB7CisJCSAgICBNLng4Ni5kZWJ1ZyB8PSBERUJVR19ERUNPREVfTk9QUklOVF9GOworCQl9IGVsc2UgeworCQkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7CisJCX0KKwkJTS54ODYuZGVidWcgJj0gfkRFQlVHX1RSQUNFX0Y7CisJCU0ueDg2LmRlYnVnIHw9IERFQlVHX0JSRUFLX0Y7CisJCWRvbmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJY2FzZSAncSc6CisJICAgIE0ueDg2LmRlYnVnIHw9IERFQlVHX0VYSVQ7CisJICAgIHJldHVybjsKKwljYXNlICdQJzoKKwkgICAgbm9EZWNvZGUgPSAobm9EZWNvZGUpPzA6MTsKKwkgICAgcHJpbnRrKCJUb2dnbGVkIGRlY29kaW5nIHRvICVzXG4iLChub0RlY29kZSk/IkZBTFNFIjoiVFJVRSIpOworCSAgICBicmVhazsKKwljYXNlICd0JzoKKwljYXNlIDA6CisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgCisgICAgfQorfQorCitpbnQgWDg2RU1VX3RyYWNlX29uKHZvaWQpCit7CisJcmV0dXJuIE0ueDg2LmRlYnVnIHw9IERFQlVHX1NURVBfRiB8IERFQlVHX0RFQ09ERV9GIHwgREVCVUdfVFJBQ0VfRjsKK30KKworaW50IFg4NkVNVV90cmFjZV9vZmYodm9pZCkKK3sKKwlyZXR1cm4gTS54ODYuZGVidWcgJj0gfihERUJVR19TVEVQX0YgfCBERUJVR19ERUNPREVfRiB8IERFQlVHX1RSQUNFX0YpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2xpbmUgKGNoYXIgKnMsIGludCAqcHMsIGludCAqbikKK3sKKyAgICBpbnQgY21kOworCisgICAgKm4gPSAwOworICAgIHdoaWxlKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSBzKys7CisgICAgcHNbKm5dID0gKnM7CisgICAgc3dpdGNoICgqcykgeworICAgICAgY2FzZSAnXG4nOgorICAgICAgICAqbiArPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNtZCA9ICpzOworICAgICAgICAqbiArPSAxOworICAgIH0KKworCXdoaWxlICgxKSB7CisJCXdoaWxlICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nKSAgcysrOworCQkKKwkJaWYgKCpzID09ICdcbicpCisJCQlyZXR1cm4gY21kOworCQkKKwkJd2hpbGUoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpIHMrKzsKKwkJCisJCXBzWypuXT1hdG9pKHMpOworCQkvL3NzY2FuZihzLCIleCIsJnBzWypuXSk7CisJCSpuICs9IDE7CisJfQorfQorCisjZW5kaWYgLyogREVCVUcgKi8KKwordm9pZCB4ODZlbXVfZHVtcF9zdGFjayh2b2lkKQoreworICAgIGludCBpOworICAgIHByaW50aygiU3RhY2s6ICIpOworICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykKKyAgICB7CisJdTggeCA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9TUywgTS54ODYuUl9TUCArIGkpOworCXByaW50aygiJTAyeCAiLCAoaW50KXgpOworICAgIH0KKyAgICBwcmludGsoIlxuIik7Cit9CisKK3ZvaWQgeDg2ZW11X2R1bXBfcmVncyAodm9pZCkKK3sKKwlwcmludGsoIlx0QVg9JTA0eCAgIiwgTS54ODYuUl9BWCApOworCXByaW50aygiQlg9JTA0eCAgIiwgTS54ODYuUl9CWCApOworCXByaW50aygiQ1g9JTA0eCAgIiwgTS54ODYuUl9DWCApOworCXByaW50aygiRFg9JTA0eCAgIiwgTS54ODYuUl9EWCApOworCXByaW50aygiU1A9JTA0eCAgIiwgTS54ODYuUl9TUCApOworCXByaW50aygiQlA9JTA0eCAgIiwgTS54ODYuUl9CUCApOworCXByaW50aygiU0k9JTA0eCAgIiwgTS54ODYuUl9TSSApOworCXByaW50aygiREk9JTA0eFxuIiwgTS54ODYuUl9ESSApOworCXByaW50aygiXHREUz0lMDR4ICAiLCBNLng4Ni5SX0RTICk7CisJcHJpbnRrKCJFUz0lMDR4ICAiLCBNLng4Ni5SX0VTICk7CisJcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTICk7CisJcHJpbnRrKCJDUz0lMDR4ICAiLCBNLng4Ni5SX0NTICk7CisJcHJpbnRrKCJJUD0lMDR4ICAgIiwgTS54ODYuUl9JUCApOworCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkgICAgcHJpbnRrKCJPViAiKTsgICAgIC8qIENIRUNLRUQuLi4gKi8KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOViAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgIHByaW50aygiRE4gIik7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiVVAgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfSUYpKSAgICBwcmludGsoIkVJICIpOworCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkRJICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX1NGKSkgICAgcHJpbnRrKCJORyAiKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpICAgIHByaW50aygiWlIgIik7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTlogIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfQUYpKSAgICBwcmludGsoIkFDICIpOworCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5BICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX1BGKSkgICAgcHJpbnRrKCJQRSAiKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTyAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpICAgIHByaW50aygiQ1kgIik7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkMgIik7CisJcHJpbnRrKCJcbiIpOworCS8veDg2ZW11X2R1bXBfc3RhY2soKTsKK30KKwordm9pZCB4ODZlbXVfZHVtcF94cmVncyAodm9pZCkKK3sKKwlwcmludGsoIlx0RUFYPSUwOHggICIsIE0ueDg2LlJfRUFYICk7CisJcHJpbnRrKCJFQlg9JTA4eCAgIiwgTS54ODYuUl9FQlggKTsKKwlwcmludGsoIkVDWD0lMDh4ICAiLCBNLng4Ni5SX0VDWCApOworCXByaW50aygiRURYPSUwOHggIFxuIiwgTS54ODYuUl9FRFggKTsKKwlwcmludGsoIlx0RVNQPSUwOHggICIsIE0ueDg2LlJfRVNQICk7CisJcHJpbnRrKCJFQlA9JTA4eCAgIiwgTS54ODYuUl9FQlAgKTsKKwlwcmludGsoIkVTST0lMDh4ICAiLCBNLng4Ni5SX0VTSSApOworCXByaW50aygiRURJPSUwOHhcbiIsIE0ueDg2LlJfRURJICk7CisJcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMgKTsKKwlwcmludGsoIkVTPSUwNHggICIsIE0ueDg2LlJfRVMgKTsKKwlwcmludGsoIlNTPSUwNHggICIsIE0ueDg2LlJfU1MgKTsKKwlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MgKTsKKwlwcmludGsoIkVJUD0lMDh4XG5cdCIsIE0ueDg2LlJfRUlQICk7CisJaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSAgICBwcmludGsoIk9WICIpOyAgICAgLyogQ0hFQ0tFRC4uLiAqLworCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5WICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgcHJpbnRrKCJETiAiKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJVUCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9JRikpICAgIHByaW50aygiRUkgIik7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiREkgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfU0YpKSAgICBwcmludGsoIk5HICIpOworCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBMICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX1pGKSkgICAgcHJpbnRrKCJaUiAiKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOWiAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9BRikpICAgIHByaW50aygiQUMgIik7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkEgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfUEYpKSAgICBwcmludGsoIlBFICIpOworCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBPICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgICAgcHJpbnRrKCJDWSAiKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOQyAiKTsKKwlwcmludGsoIlxuIik7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVjb2RlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyMDRlNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWNvZGUuYwpAQCAtMCwwICsxLDk3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8KKyoJCQkJaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgYW5kIGFjY2Vzc2VzcyBvZiBpbW1lZGlhdGUgZGF0YSB2aWEgSVAuICBldGMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIGFueSBwZW5kaW5nIGFzeWNocm9ub3VzIGludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgeDg2ZW11X2ludHJfaGFuZGxlKHZvaWQpCit7CisJdTgJaW50bm87CisKKwlpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpIHsKKwkJaW50bm8gPSBNLng4Ni5pbnRubzsKKwkJaWYgKF9YODZFTVVfaW50clRhYltpbnRub10pIHsKKwkJCSgqX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkoaW50bm8pOworCQl9IGVsc2UgeworCQkJcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworCQkJQ0xFQVJfRkxBRyhGX0lGKTsKKwkJCUNMRUFSX0ZMQUcoRl9URik7CisJCQlwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJCQlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCArIDIpOworCQkJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCQkJTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRubyAqIDQpOworCQkJTS54ODYuaW50ciA9IDA7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50cm51bSAtIEludGVycnVwdCBudW1iZXIgdG8gcmFpc2UKKworUkVNQVJLUzoKK1JhaXNlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIGJlIGhhbmRsZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gb2YgdGhlCituZXh0IGluc3RydWN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11X2ludHJfcmFpc2UoCisJdTggaW50cm51bSkKK3sKKwlNLng4Ni5pbnRubyA9IGludHJudW07CisJTS54ODYuaW50ciB8PSBJTlRSX1NZTkNIOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01haW4gZXhlY3V0aW9uIGxvb3AgZm9yIHRoZSBlbXVsYXRvci4gV2UgcmV0dXJuIGZyb20gaGVyZSB3aGVuIHRoZSBzeXN0ZW0KK2hhbHRzLCB3aGljaCBpcyBub3JtYWxseSBjYXVzZWQgYnkgYSBzdGFjayBmYXVsdCB3aGVuIHdlIHJldHVybiBmcm9tIHRoZQorb3JpZ2luYWwgcmVhbCBtb2RlIGNhbGwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfZXhlYyh2b2lkKQoreworICAgIHU4IG9wMTsKKworICAgIE0ueDg2LmludHIgPSAwOworICAgIERCKHg4NmVtdV9lbmRfaW5zdHIoKTspCisJCisgICAgZm9yICg7OykgeworCURCKGlmIChDSEVDS19JUF9GRVRDSCgpKSB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQorCS8qIElmIGRlYnVnZ2luZywgc2F2ZSB0aGUgSVAgYW5kIENTIHZhbHVlcy4gKi8KKwlTQVZFX0lQX0NTKE0ueDg2LlJfQ1MsIE0ueDg2LlJfSVApOworCUlOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworCWlmIChNLng4Ni5pbnRyKSB7CisJICAgIGlmIChNLng4Ni5pbnRyICYgSU5UUl9IQUxURUQpIHsKKwkJREIoCXByaW50aygiaGFsdGVkXG4iKTsgWDg2RU1VX3RyYWNlX3JlZ3MoKTspCisJCSAgICByZXR1cm47CisJICAgIH0KKwkgICAgaWYgKCgoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpICYmIChNLng4Ni5pbnRubyA9PSAwIHx8IE0ueDg2LmludG5vID09IDIpKSB8fAorCQkhQUNDRVNTX0ZMQUcoRl9JRikpIHsKKwkJeDg2ZW11X2ludHJfaGFuZGxlKCk7CisJICAgIH0KKwl9CisJb3AxID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworCSgqeDg2ZW11X29wdGFiW29wMV0pKG9wMSk7CisJaWYgKE0ueDg2LmRlYnVnICYgREVCVUdfRVhJVCkgeworCSAgICBNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfRVhJVDsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFsdHMgdGhlIHN5c3RlbSBieSBzZXR0aW5nIHRoZSBoYWx0ZWQgc3lzdGVtIGZsYWcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfaGFsdF9zeXModm9pZCkKK3sKKwlNLng4Ni5pbnRyIHw9IElOVFJfSEFMVEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21vZAkJLSBNb2QgdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKK3JlZ2gJLSBSZWcgaCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQorcmVnbAktIFJlZyBsIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCisKK1JFTUFSS1M6CitSYWlzZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0byBiZSBoYW5kbGVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIG9mIHRoZQorbmV4dCBpbnN0cnVjdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZmV0Y2hfZGVjb2RlX21vZHJtKAorCWludCAqbW9kLAorCWludCAqcmVnaCwKKwlpbnQgKnJlZ2wpCit7CisJaW50IGZldGNoZWQ7CisKK0RCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKKwkgIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisJZmV0Y2hlZCA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKwlJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKwkqbW9kICA9IChmZXRjaGVkID4+IDYpICYgMHgwMzsKKwkqcmVnaCA9IChmZXRjaGVkID4+IDMpICYgMHgwNzsKKyAgICAqcmVnbCA9IChmZXRjaGVkID4+IDApICYgMHgwNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitJbW1lZGlhdGUgYnl0ZSB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAorbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmRiKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBmZXRjaF9ieXRlX2ltbSh2b2lkKQoreworCXU4IGZldGNoZWQ7CisKK0RCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKKwkJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKwlmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworCUlOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworCXJldHVybiBmZXRjaGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSB3b3JkIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBmZXRjaF93b3JkX2ltbSh2b2lkKQoreworCXUxNglmZXRjaGVkOworCitEQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisJZmV0Y2hlZCA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKSk7CisJTS54ODYuUl9JUCArPSAyOworCUlOQ19ERUNPREVEX0lOU1RfTEVOKDIpOworCXJldHVybiBmZXRjaGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSBsb25lIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBmZXRjaF9sb25nX2ltbSh2b2lkKQoreworCXUzMiBmZXRjaGVkOworCitEQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJICB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQorCWZldGNoZWQgPSAoKnN5c19yZGwpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCkpOworCU0ueDg2LlJfSVAgKz0gNDsKKwlJTkNfREVDT0RFRF9JTlNUX0xFTig0KTsKKwlyZXR1cm4gZmV0Y2hlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitWYWx1ZSBvZiB0aGUgZGVmYXVsdCBkYXRhIHNlZ21lbnQKKworUkVNQVJLUzoKK0lubGluZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50IGZvciB0aGUgY3VycmVudAoraW5zdHJ1Y3Rpb24uCisKK09uIHRoZSB4ODYgcHJvY2Vzc29yLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIG5vdCBhbHdheXMgRFMgaWYgdGhlcmUgaXMKK25vIHNlZ21lbnQgb3ZlcnJpZGUuIEFkZHJlc3MgbW9kZXMgc3VjaCBhcyAtM1tCUF0gb3IgMTBbQlArU0ldIGFsbCByZWZlciB0bworYWRkcmVzc2VzIHJlbGF0aXZlIHRvIFNTIChpZTogb24gdGhlIHN0YWNrKS4gU28sIGF0IHRoZSBtaW5pbXVtLCBhbGwKK2RlY29kaW5ncyBvZiBhZGRyZXNzaW5nIG1vZGVzIHdvdWxkIGhhdmUgdG8gc2V0L2NsZWFyIGEgYml0IGRlc2NyaWJpbmcKK3doZXRoZXIgdGhlIGFjY2VzcyBpcyByZWxhdGl2ZSB0byBEUyBvciBTUy4gIFRoYXQgaXMgdGhlIGZ1bmN0aW9uIG9mIHRoZQorY3B1LXN0YXRlLXZhcmlibGUgTS54ODYubW9kZS4gVGhlcmUgYXJlIHNldmVyYWwgcG90ZW50aWFsIHN0YXRlczoKKworCXJlcGUgcHJlZml4IHNlZW4gIChoYW5kbGVkIGVsc2V3aGVyZSkKKwlyZXBuZSBwcmVmaXggc2VlbiAgKGRpdHRvKQorCisJY3Mgc2VnbWVudCBvdmVycmlkZQorCWRzIHNlZ21lbnQgb3ZlcnJpZGUKKwllcyBzZWdtZW50IG92ZXJyaWRlCisJZnMgc2VnbWVudCBvdmVycmlkZQorCWdzIHNlZ21lbnQgb3ZlcnJpZGUKKwlzcyBzZWdtZW50IG92ZXJyaWRlCisKKwlkcy9zcyBzZWxlY3QgKGluIGFic2Vuc2Ugb2Ygb3ZlcnJpZGUpCisKK0VhY2ggb2YgdGhlIGFib3ZlIDcgaXRlbXMgYXJlIGhhbmRsZWQgd2l0aCBhIGJpdCBpbiB0aGUgbW9kZSBmaWVsZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitfSU5MSU5FIHUzMiBnZXRfZGF0YV9zZWdtZW50KHZvaWQpCit7CisjZGVmaW5lCUdFVF9TRUdNRU5UKHNlZ21lbnQpCisJc3dpdGNoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9TRUdNQVNLKSB7CisJICBjYXNlIDA6CQkJCQkvKiBkZWZhdWx0IGNhc2U6IHVzZSBkcyByZWdpc3RlciAqLworCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9EUzoKKwkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRFMgfCBTWVNNT0RFX1NFR19EU19TUzoKKwkJcmV0dXJuICBNLng4Ni5SX0RTOworCSAgY2FzZSBTWVNNT0RFX1NFR19EU19TUzoJLyogbm9uLW92ZXJyaWRkZW4sIHVzZSBzcyByZWdpc3RlciAqLworCQlyZXR1cm4gIE0ueDg2LlJfU1M7CisJICBjYXNlIFNZU01PREVfU0VHT1ZSX0NTOgorCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCQlyZXR1cm4gIE0ueDg2LlJfQ1M7CisJICBjYXNlIFNZU01PREVfU0VHT1ZSX0VTOgorCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9FUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCQlyZXR1cm4gIE0ueDg2LlJfRVM7CisJICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTOgorCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9GUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCQlyZXR1cm4gIE0ueDg2LlJfRlM7CisJICBjYXNlIFNZU01PREVfU0VHT1ZSX0dTOgorCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCQlyZXR1cm4gIE0ueDg2LlJfR1M7CisJICBjYXNlIFNZU01PREVfU0VHT1ZSX1NTOgorCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9TUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCQlyZXR1cm4gIE0ueDg2LlJfU1M7CisJICBkZWZhdWx0OgorI2lmZGVmCURFQlVHCisJCXByaW50aygiZXJyb3I6IHNob3VsZCBub3QgaGFwcGVuOiAgbXVsdGlwbGUgb3ZlcnJpZGVzLlxuIik7CisjZW5kaWYKKwkJSEFMVF9TWVMoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlKAorCXVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisJaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKKyNlbmRpZgorCXJldHVybiAoKnN5c19yZGIpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorV29yZCB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGZldGNoX2RhdGFfd29yZCgKKwl1aW50IG9mZnNldCkKK3sKKyNpZmRlZiBERUJVRworCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKwlyZXR1cm4gKCpzeXNfcmR3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KKworUkVUVVJOUzoKK0xvbmcgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBmZXRjaF9kYXRhX2xvbmcoCisJdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisJcmV0dXJuICgqc3lzX3JkbCkoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudAktIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlX2FicygKKwl1aW50IHNlZ21lbnQsCisJdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKwlyZXR1cm4gKCpzeXNfcmRiKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50CS0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZmV0Y2hfZGF0YV93b3JkX2FicygKKwl1aW50IHNlZ21lbnQsCisJdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKwlyZXR1cm4gKCpzeXNfcmR3KSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50CS0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZmV0Y2hfZGF0YV9sb25nX2FicygKKwl1aW50IHNlZ21lbnQsCisJdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKwlyZXR1cm4gKCpzeXNfcmRsKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCQktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKK3RoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV9ieXRlKAorCXVpbnQgb2Zmc2V0LAorCXU4IHZhbCkKK3sKKyNpZmRlZiBERUJVRworCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKwkoKnN5c193cmIpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAkJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfd29yZCgKKwl1aW50IG9mZnNldCwKKwl1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisJaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKKyNlbmRpZgorCSgqc3lzX3dydykoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCQktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKK3RoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV9sb25nKAorCXVpbnQgb2Zmc2V0LAorCXUzMiB2YWwpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisJKCpzeXNfd3JsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQJLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfYnl0ZV9hYnMoCisJdWludCBzZWdtZW50LAorCXVpbnQgb2Zmc2V0LAorCXU4IHZhbCkKK3sKKyNpZmRlZiBERUJVRworCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorCSgqc3lzX3dyYikoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50CS0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCQktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX3dvcmRfYWJzKAorCXVpbnQgc2VnbWVudCwKKwl1aW50IG9mZnNldCwKKwl1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisJaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOworI2VuZGlmCisJKCpzeXNfd3J3KSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQJLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGxvbmcgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfbG9uZ19hYnMoCisJdWludCBzZWdtZW50LAorCXVpbnQgb2Zmc2V0LAorCXUzMiB2YWwpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKwkoKnN5c193cmwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnCS0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3IgYnl0ZSBvcGVyYW5kcy4gQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTgqIGRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKAorCWludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwkJREVDT0RFX1BSSU5URigiQUwiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0FMOworCSAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJDTCIpOworCQlyZXR1cm4gJk0ueDg2LlJfQ0w7CisJICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIkRMIik7CisJCXJldHVybiAmTS54ODYuUl9ETDsKKwkgIGNhc2UgMzoKKwkJREVDT0RFX1BSSU5URigiQkwiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0JMOworCSAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJBSCIpOworCQlyZXR1cm4gJk0ueDg2LlJfQUg7CisJICBjYXNlIDU6CisJCURFQ09ERV9QUklOVEYoIkNIIik7CisJCXJldHVybiAmTS54ODYuUl9DSDsKKwkgIGNhc2UgNjoKKwkJREVDT0RFX1BSSU5URigiREgiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0RIOworCSAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJCSCIpOworCQlyZXR1cm4gJk0ueDg2LlJfQkg7CisJfQorCUhBTFRfU1lTKCk7CisJcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLiAgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2KiBkZWNvZGVfcm1fd29yZF9yZWdpc3RlcigKKwlpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJICBjYXNlIDA6CisJCURFQ09ERV9QUklOVEYoIkFYIik7CisJCXJldHVybiAmTS54ODYuUl9BWDsKKwkgIGNhc2UgMToKKwkJREVDT0RFX1BSSU5URigiQ1giKTsKKwkJcmV0dXJuICZNLng4Ni5SX0NYOworCSAgY2FzZSAyOgorCQlERUNPREVfUFJJTlRGKCJEWCIpOworCQlyZXR1cm4gJk0ueDg2LlJfRFg7CisJICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIkJYIik7CisJCXJldHVybiAmTS54ODYuUl9CWDsKKwkgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiU1AiKTsKKwkJcmV0dXJuICZNLng4Ni5SX1NQOworCSAgY2FzZSA1OgorCQlERUNPREVfUFJJTlRGKCJCUCIpOworCQlyZXR1cm4gJk0ueDg2LlJfQlA7CisJICBjYXNlIDY6CisJCURFQ09ERV9QUklOVEYoIlNJIik7CisJCXJldHVybiAmTS54ODYuUl9TSTsKKwkgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiREkiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0RJOworCX0KKwlIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1RSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciBkd29yZCBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiogZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIoCisJaW50IHJlZykKK3sKKyAgICBzd2l0Y2ggKHJlZykgeworICAgICAgY2FzZSAwOgorCQlERUNPREVfUFJJTlRGKCJFQVgiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0VBWDsKKwkgIGNhc2UgMToKKwkJREVDT0RFX1BSSU5URigiRUNYIik7CisJCXJldHVybiAmTS54ODYuUl9FQ1g7CisJICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIkVEWCIpOworCQlyZXR1cm4gJk0ueDg2LlJfRURYOworCSAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJFQlgiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0VCWDsKKwkgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiRVNQIik7CisJCXJldHVybiAmTS54ODYuUl9FU1A7CisJICBjYXNlIDU6CisJCURFQ09ERV9QUklOVEYoIkVCUCIpOworCQlyZXR1cm4gJk0ueDg2LlJfRUJQOworCSAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJFU0kiKTsKKwkJcmV0dXJuICZNLng4Ni5SX0VTSTsKKwkgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiRURJIik7CisJCXJldHVybiAmTS54ODYuUl9FREk7CisJfQorCUhBTFRfU1lTKCk7CisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JlZwktIFJlZ2lzdGVyIHRvIGRlY29kZQorCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKworUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQorbW9kcm0gYnl0ZSwgZm9yIHdvcmQgb3BlcmFuZHMsIG1vZGlmaWVkIGZyb20gYWJvdmUgZm9yIHRoZSB3ZWlyZG8KK3NwZWNpYWwgY2FzZSBvZiBzZWdyZWcgb3BlcmFuZHMuICBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYqIGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIoCisJaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCSAgY2FzZSAwOgorCQlERUNPREVfUFJJTlRGKCJFUyIpOworCQlyZXR1cm4gJk0ueDg2LlJfRVM7CisJICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIkNTIik7CisJCXJldHVybiAmTS54ODYuUl9DUzsKKwkgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiU1MiKTsKKwkJcmV0dXJuICZNLng4Ni5SX1NTOworCSAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJEUyIpOworCQlyZXR1cm4gJk0ueDg2LlJfRFM7CisJICBjYXNlIDQ6CisJICBjYXNlIDU6CisJICBjYXNlIDY6CisJICBjYXNlIDc6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgU0VHUkVHIik7CisJCWJyZWFrOworCX0KKwlIQUxUX1NZUygpOworCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcm0JLSBSTSB2YWx1ZSB0byBkZWNvZGUKKworUkVUVVJOUzoKK09mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDAgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKK2RlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKworTk9URTogCVRoZSBjb2RlIHdoaWNoIHNwZWNpZmllcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IChkcyB2cyBzcykKKwkJYmVsb3cgaW4gdGhlIGNhc2Ugb2YgW0JQKy4uXS4gIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBhdCB0aGUKKwkJcG9pbnQgdGhhdCB0aGlzIHN1YnJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8KKwkJU1lTTU9ERV9TRUdfRFNfU1Mgd2lsbCBiZSB6ZXJvLiAgQWZ0ZXIgZXZlcnkgaW5zdHJ1Y3Rpb24KKwkJZXhjZXB0IHRoZSBzZWdtZW50IG92ZXJyaWRlIGluc3RydWN0aW9ucywgdGhpcyBiaXQgKGFzIHdlbGwKKwkJYXMgYW55IGJpdHMgaW5kaWNhdGluZyBzZWdtZW50IG92ZXJyaWRlcykgd2lsbCBiZSBjbGVhci4gIFNvCisJCWlmIGEgU1MgYWNjZXNzIGlzIG5lZWRlZCwgc2V0IHRoaXMgYml0LiAgT3RoZXJ3aXNlLCBEUyBhY2Nlc3MKKwkJb2NjdXJzICh1bmxlc3MgYW55IG9mIHRoZSBzZWdtZW50IG92ZXJyaWRlIGJpdHMgYXJlIHNldCkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgZGVjb2RlX3JtMDBfYWRkcmVzcygKKwlpbnQgcm0pCit7CisJdW5zaWduZWQgb2Zmc2V0OworCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKQorCXsKKwkgICAgc3dpdGNoIChybSkgeworCSAgICBjYXNlIDA6CisJCURFQ09ERV9QUklOVEYoIltFQVhdIik7CisJCXJldHVybiBNLng4Ni5SX0VBWDsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJbRUNYXSIpOworCQlyZXR1cm4gTS54ODYuUl9FQ1g7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiW0VEWF0iKTsKKy8vCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCQlyZXR1cm4gTS54ODYuUl9FRFg7CisJICAgIGNhc2UgMzoKKwkJREVDT0RFX1BSSU5URigiW0VCWF0iKTsKKy8vCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCQlyZXR1cm4gTS54ODYuUl9FQlg7CisJICAgIGNhc2UgNDoKKwkJcHJpbnRrKCJVbnN1cHBvcnRlZCBTSUIgZW5jb2RpbmdcbiIpOworCQlIQUxUX1NZUygpOworCQlyZXR1cm4gMDsKKwkgICAgY2FzZSA1OgorCQlvZmZzZXQgPSBmZXRjaF9sb25nX2ltbSgpOworCQlERUNPREVfUFJJTlRGMigiWyUwOHhdIiwgb2Zmc2V0KTsKKwkJcmV0dXJuIG9mZnNldDsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJbRVNJXSIpOworCQlyZXR1cm4gTS54ODYuUl9FU0k7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiW0VESV0iKTsKKwkJcmV0dXJuIE0ueDg2LlJfRURJOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIHN3aXRjaCAocm0pIHsKKwkgICAgY2FzZSAwOgorCQlERUNPREVfUFJJTlRGKCJbQlgrU0ldIik7CisJCXJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9TSTsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJbQlgrREldIik7CisJCXJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9ESTsKKwkgICAgY2FzZSAyOgorCQlERUNPREVfUFJJTlRGKCJbQlArU0ldIik7CisJCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJCXJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9TSTsKKwkgICAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJbQlArREldIik7CisJCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJCXJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9ESTsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJbU0ldIik7CisJCXJldHVybiBNLng4Ni5SX1NJOworCSAgICBjYXNlIDU6CisJCURFQ09ERV9QUklOVEYoIltESV0iKTsKKwkJcmV0dXJuIE0ueDg2LlJfREk7CisJICAgIGNhc2UgNjoKKwkJb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkJREVDT0RFX1BSSU5URjIoIlslMDR4XSIsIG9mZnNldCk7CisJCXJldHVybiBvZmZzZXQ7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiW0JYXSIpOworCQlyZXR1cm4gTS54ODYuUl9CWDsKKwkgICAgfQorCX0KKwlIQUxUX1NZUygpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JtCS0gUk0gdmFsdWUgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTAxIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCitkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgZGVjb2RlX3JtMDFfYWRkcmVzcygKKwlpbnQgcm0pCit7CisgICAgaW50IGRpc3BsYWNlbWVudCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikKKyAgICB7CisJc3dpdGNoIChybSkKKwl7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYfSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQ1hdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUNYICsgZGlzcGxhY2VtZW50OworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VEWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FRFggKyBkaXNwbGFjZW1lbnQ7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKKwljYXNlIDQ6CisJICAgIHByaW50aygiVW5zdXBwb3J0ZWQgU0lCIGFkZHJlc3NpbmcgbW9kZVxuIik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIHJldHVybiAwOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRVNJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VTSSArIGRpc3BsYWNlbWVudDsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzd2l0Y2ggKHJtKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50OworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudDsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gTS54ODYuUl9CUCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQ7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50OworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50OworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50OworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiBNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50OworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0JYICsgZGlzcGxhY2VtZW50OworCX0KKwlIQUxUX1NZUygpOworICAgIH0KKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogU0hPVUxEIE5PVCBIQVBQRU4gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitybQktIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKKworUkVNQVJLUzoKK1JldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0xMCBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQorZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9ybTEwX2FkZHJlc3MoCisJaW50IHJtKQoreworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikKKyAgICB7CisJaW50IGRpc3BsYWNlbWVudCA9IChzMzIpZmV0Y2hfbG9uZ19pbW0oKTsKKwlzd2l0Y2ggKHJtKQorCXsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQVh9IiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUFYICsgZGlzcGxhY2VtZW50OworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VEWCArIGRpc3BsYWNlbWVudDsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJYICsgZGlzcGxhY2VtZW50OworCWNhc2UgNDoKKwkgICAgcHJpbnRrKCJVbnN1cHBvcnRlZCBTSUIgYWRkcmVzc2luZyBtb2RlXG4iKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgcmV0dXJuIDA7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRVNJICsgZGlzcGxhY2VtZW50OworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FREkgKyBkaXNwbGFjZW1lbnQ7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWludCBkaXNwbGFjZW1lbnQgPSAoczE2KWZldGNoX3dvcmRfaW1tKCk7IAorCXN3aXRjaCAocm0pIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCX0KKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gMDsKKyAgICAvKk5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9mcHUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9mcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFlYTQyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2ZwdS5jCkBAIC0wLDAgKzEsOTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nIGFuZAorKiAgICAgICAgICAgICAgIGVtdWxhdGlvbiBvZiB0aGUgRlBVIGluc3RydWN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBvcGNvZGU9MHhkOCAqLwordm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q4KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkVTQyBEOFxuIik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOworfQorCisjaWZkZWYgREVCVUcKKworc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZDlfdGFiW10gPSB7CisgICAgIkZMRFx0RFdPUkQgUFRSICIsICJFU0NfRDlcdCIsICJGU1RcdERXT1JEIFBUUiAiLCAiRlNUUFx0RFdPUkQgUFRSICIsCisgICAgIkZMREVOVlx0IiwgIkZMRENXXHQiLCAiRlNURU5WXHQiLCAiRlNUQ1dcdCIsCisKKyAgICAiRkxEXHREV09SRCBQVFIgIiwgIkVTQ19EOVx0IiwgIkZTVFx0RFdPUkQgUFRSICIsICJGU1RQXHREV09SRCBQVFIgIiwKKyAgICAiRkxERU5WXHQiLCAiRkxEQ1dcdCIsICJGU1RFTlZcdCIsICJGU1RDV1x0IiwKKworICAgICJGTERcdERXT1JEIFBUUiAiLCAiRVNDX0Q5XHQiLCAiRlNUXHREV09SRCBQVFIgIiwgIkZTVFBcdERXT1JEIFBUUiAiLAorICAgICJGTERFTlZcdCIsICJGTERDV1x0IiwgIkZTVEVOVlx0IiwgIkZTVENXXHQiLAorfTsKKworc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZDlfdGFiMVtdID0geworICAgICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsCisgICAgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwKKworICAgICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLAorICAgICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLAorCisgICAgIkZOT1AiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsICJFU0NfRDkiLAorICAgICJFU0NfRDkiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsICJFU0NfRDkiLAorCisgICAgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsCisgICAgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsCisKKyAgICAiRkNIUyIsICJGQUJTIiwgIkVTQ19EOSIsICJFU0NfRDkiLAorICAgICJGVFNUIiwgIkZYQU0iLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCisKKyAgICAiRkxEMSIsICJGTERMMlQiLCAiRkxETDJFIiwgIkZMRFBJIiwKKyAgICAiRkxETEcyIiwgIkZMRExOMiIsICJGTERaIiwgIkVTQ19EOSIsCisKKyAgICAiRjJYTTEiLCAiRllMMlgiLCAiRlBUQU4iLCAiRlBBVEFOIiwKKyAgICAiRlhUUkFDVCIsICJFU0NfRDkiLCAiRkRFQ1NUUCIsICJGSU5DU1RQIiwKKworICAgICJGUFJFTSIsICJGWUwyWFAxIiwgIkZTUVJUIiwgIkVTQ19EOSIsCisgICAgIkZSTkRJTlQiLCAiRlNDQUxFIiwgIkVTQ19EOSIsICJFU0NfRDkiLAorfTsKKworI2VuZGlmIC8qIERFQlVHICovCisKKy8qIG9wY29kZT0weGQ5ICovCit2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDkodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKwl1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggc3RrZWxlbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZDlfdGFiLCBtb2QsIHJoLCBybCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URih4ODZlbXVfZnB1X29wX2Q5X3RhYjFbKHJoIDw8IDMpICsgcmxdKTsKKyAgICB9CisjZW5kaWYKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCQlzdGtlbGVtID0gKHU4KXJsOworCQlpZiAocmggPCA0KSB7CisJCQkJREVDT0RFX1BSSU5URjIoIlNUKCVkKVxuIiwgc3RrZWxlbSk7CisJCX0gZWxzZSB7CisJCQkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJfQorICAgICAgICBicmVhazsKKyAgICB9CisjaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCisgICAgLyogZXhlY3V0ZSAqLworICAgIHN3aXRjaCAobW9kKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZmxkKFg4NkVNVV9GUFVfU1RLVE9QLCBzdGtlbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9meGNoKFg4NkVNVV9GUFVfU1RLVE9QLCBzdGtlbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHN3aXRjaCAocmwpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9ub3AoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnN0cChYODZFTVVfRlBVX1NUS1RPUCwgc3RrZWxlbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzd2l0Y2ggKHJsKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZjaHMoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mYWJzKFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnRzdChYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2Z4YW0oWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiAyLDMsNiw3ICovCisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHN3aXRjaCAocmwpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mbGQxKFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mbGRsMnQoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZsZGwyZShYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZmxkcGkoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZsZGxnMihYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZmxkbG4yKFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mbGR6KFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiA3ICovCisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHN3aXRjaCAocmwpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mMnhtMShYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnlsMngoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZwdGFuKFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mcGF0YW4oWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2Z4dHJhY3QoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZGVjc3RwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfaW5jc3RwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHN3aXRjaCAocmwpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mcHJlbShYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnlsMnhwMShYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnNxcnQoWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnJuZGludChYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnNjYWxlKFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmxkKFg4NkVNVV9GUFVfRkxPQVQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X01fZnN0KFg4NkVNVV9GUFVfRkxPQVQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZzdHAoWDg2RU1VX0ZQVV9GTE9BVCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmxkZW52KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmxkY3coWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mc3RlbnYoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mc3RjdyhYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFg4NkVNVV9GUFVfUFJFU0VOVCAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKK30KKworI2lmZGVmIERFQlVHCisKK2NoYXIgKng4NmVtdV9mcHVfb3BfZGFfdGFiW10gPSB7CisgICAgIkZJQUREXHREV09SRCBQVFIgIiwgIkZJTVVMXHREV09SRCBQVFIgIiwgIkZJQ09NXHREV09SRCBQVFIgIiwKKyAgICAiRklDT01QXHREV09SRCBQVFIgIiwKKyAgICAiRklTVUJcdERXT1JEIFBUUiAiLCAiRklTVUJSXHREV09SRCBQVFIgIiwgIkZJRElWXHREV09SRCBQVFIgIiwKKyAgICAiRklESVZSXHREV09SRCBQVFIgIiwKKworICAgICJGSUFERFx0RFdPUkQgUFRSICIsICJGSU1VTFx0RFdPUkQgUFRSICIsICJGSUNPTVx0RFdPUkQgUFRSICIsCisgICAgIkZJQ09NUFx0RFdPUkQgUFRSICIsCisgICAgIkZJU1VCXHREV09SRCBQVFIgIiwgIkZJU1VCUlx0RFdPUkQgUFRSICIsICJGSURJVlx0RFdPUkQgUFRSICIsCisgICAgIkZJRElWUlx0RFdPUkQgUFRSICIsCisgICAgCisgICAgIkZJQUREXHREV09SRCBQVFIgIiwgIkZJTVVMXHREV09SRCBQVFIgIiwgIkZJQ09NXHREV09SRCBQVFIgIiwKKyAgICAiRklDT01QXHREV09SRCBQVFIgIiwKKyAgICAiRklTVUJcdERXT1JEIFBUUiAiLCAiRklTVUJSXHREV09SRCBQVFIgIiwgIkZJRElWXHREV09SRCBQVFIgIiwKKyAgICAiRklESVZSXHREV09SRCBQVFIgIiwKKworICAgICJFU0NfREEgIiwgIkVTQ19EQSAiLCAiRVNDX0RBICIsICJFU0NfREEgIiwKKyAgICAiRVNDX0RBICAgICAiLCAiRVNDX0RBICIsICJFU0NfREEgICAiLCAiRVNDX0RBICIsCit9OworCisjZW5kaWYgLyogREVCVUcgKi8KKworLyogb3Bjb2RlPTB4ZGEgKi8KK3ZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworCXVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzdGtlbGVtOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kYV90YWIsIG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwkJc3RrZWxlbSA9ICh1OClybDsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpLFNUXG4iLCBzdGtlbGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAorICAgIHN3aXRjaCAobW9kKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01faWFkZChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9pbXVsKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ljb20oWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01faWNvbXAoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01faXN1YihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9pc3VicihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9pZGl2KFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2lkaXZyKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Cit9CisKKyNpZmRlZiBERUJVRworCitjaGFyICp4ODZlbXVfZnB1X29wX2RiX3RhYltdID0geworICAgICJGSUxEXHREV09SRCBQVFIgIiwgIkVTQ19EQlx0MTkiLCAiRklTVFx0RFdPUkQgUFRSICIsICJGSVNUUFx0RFdPUkQgUFRSICIsCisgICAgIkVTQ19EQlx0MUMiLCAiRkxEXHRUQllURSBQVFIgIiwgIkVTQ19EQlx0MUUiLCAiRlNUUFx0VEJZVEUgUFRSICIsCisKKyAgICAiRklMRFx0RFdPUkQgUFRSICIsICJFU0NfREJcdDE5IiwgIkZJU1RcdERXT1JEIFBUUiAiLCAiRklTVFBcdERXT1JEIFBUUiAiLAorICAgICJFU0NfREJcdDFDIiwgIkZMRFx0VEJZVEUgUFRSICIsICJFU0NfREJcdDFFIiwgIkZTVFBcdFRCWVRFIFBUUiAiLAorCisgICAgIkZJTERcdERXT1JEIFBUUiAiLCAiRVNDX0RCXHQxOSIsICJGSVNUXHREV09SRCBQVFIgIiwgIkZJU1RQXHREV09SRCBQVFIgIiwKKyAgICAiRVNDX0RCXHQxQyIsICJGTERcdFRCWVRFIFBUUiAiLCAiRVNDX0RCXHQxRSIsICJGU1RQXHRUQllURSBQVFIgIiwKK307CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBvcGNvZGU9MHhkYiAqLwordm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RiKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisJdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kYl90YWIsIG1vZCwgcmgsIHJsKTsKKyAgICB9IGVsc2UgaWYgKHJoID09IDQpIHsgICAgICAgLyogPT09IDExIDEwIDAgbm5uICovCisgICAgICAgIHN3aXRjaCAocmwpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJGRU5JXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkZESVNJXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkZDTEVYXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkZJTklUXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIkVTQ19EQiAlMHhcbiIsIChtb2QgPDwgNikgKyAocmggPDwgMykgKyAocmwpKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBicmVhazsKKyAgICB9CisjaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCisgICAgLyogZXhlY3V0ZSAqLworICAgIHN3aXRjaCAobW9kKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzd2l0Y2ggKHJsKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZmVuaSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZkaXNpKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZmNsZXgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9maW5pdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZpbGQoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9maXN0KFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2Zpc3RwKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmxkKFg4NkVNVV9GUFVfTERCTCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mc3RwKFg4NkVNVV9GUFVfTERCTCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKK30KKworI2lmZGVmIERFQlVHCitjaGFyICp4ODZlbXVfZnB1X29wX2RjX3RhYltdID0geworICAgICJGQUREXHRRV09SRCBQVFIgIiwgIkZNVUxcdFFXT1JEIFBUUiAiLCAiRkNPTVx0UVdPUkQgUFRSICIsCisgICAgIkZDT01QXHRRV09SRCBQVFIgIiwKKyAgICAiRlNVQlx0UVdPUkQgUFRSICIsICJGU1VCUlx0UVdPUkQgUFRSICIsICJGRElWXHRRV09SRCBQVFIgIiwKKyAgICAiRkRJVlJcdFFXT1JEIFBUUiAiLAorCisgICAgIkZBRERcdFFXT1JEIFBUUiAiLCAiRk1VTFx0UVdPUkQgUFRSICIsICJGQ09NXHRRV09SRCBQVFIgIiwKKyAgICAiRkNPTVBcdFFXT1JEIFBUUiAiLAorICAgICJGU1VCXHRRV09SRCBQVFIgIiwgIkZTVUJSXHRRV09SRCBQVFIgIiwgIkZESVZcdFFXT1JEIFBUUiAiLAorICAgICJGRElWUlx0UVdPUkQgUFRSICIsCisKKyAgICAiRkFERFx0UVdPUkQgUFRSICIsICJGTVVMXHRRV09SRCBQVFIgIiwgIkZDT01cdFFXT1JEIFBUUiAiLAorICAgICJGQ09NUFx0UVdPUkQgUFRSICIsCisgICAgIkZTVUJcdFFXT1JEIFBUUiAiLCAiRlNVQlJcdFFXT1JEIFBUUiAiLCAiRkRJVlx0UVdPUkQgUFRSICIsCisgICAgIkZESVZSXHRRV09SRCBQVFIgIiwKKworICAgICJGQUREXHQiLCAiRk1VTFx0IiwgIkZDT01cdCIsICJGQ09NUFx0IiwKKyAgICAiRlNVQlJcdCIsICJGU1VCXHQiLCAiRkRJVlJcdCIsICJGRElWXHQiLAorfTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBvcGNvZGU9MHhkYyAqLwordm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisJdWludCBkZXN0b2Zmc2V0OworICAgIHU4IHN0a2VsZW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RjX3RhYiwgbW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJCXN0a2VsZW0gPSAodTgpcmw7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKKyAgICAvKiBleGVjdXRlICovCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mYWRkKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mbXVsKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mY29tKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mY29tcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnN1YnIoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZzdWIoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZkaXZyKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mZGl2KHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mYWRkKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mbXVsKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mY29tKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mY29tcChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZnN1YihYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZnN1YnIoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZkaXYoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZkaXZyKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOworfQorCisjaWZkZWYgREVCVUcKKworc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZGRfdGFiW10gPSB7CisgICAgIkZMRFx0UVdPUkQgUFRSICIsICJFU0NfRERcdDI5LCIsICJGU1RcdFFXT1JEIFBUUiAiLCAiRlNUUFx0UVdPUkQgUFRSICIsCisgICAgIkZSU1RPUlx0IiwgIkVTQ19ERFx0MkQsIiwgIkZTQVZFXHQiLCAiRlNUU1dcdCIsCisKKyAgICAiRkxEXHRRV09SRCBQVFIgIiwgIkVTQ19ERFx0MjksIiwgIkZTVFx0UVdPUkQgUFRSICIsICJGU1RQXHRRV09SRCBQVFIgIiwKKyAgICAiRlJTVE9SXHQiLCAiRVNDX0REXHQyRCwiLCAiRlNBVkVcdCIsICJGU1RTV1x0IiwKKworICAgICJGTERcdFFXT1JEIFBUUiAiLCAiRVNDX0REXHQyOSwiLCAiRlNUXHRRV09SRCBQVFIgIiwgIkZTVFBcdFFXT1JEIFBUUiAiLAorICAgICJGUlNUT1JcdCIsICJFU0NfRERcdDJELCIsICJGU0FWRVx0IiwgIkZTVFNXXHQiLAorCisgICAgIkZGUkVFXHQiLCAiRlhDSFx0IiwgIkZTVFx0IiwgIkZTVFBcdCIsCisgICAgIkVTQ19ERFx0MkMsIiwgIkVTQ19ERFx0MkQsIiwgIkVTQ19ERFx0MkUsIiwgIkVTQ19ERFx0MkYsIiwKK307CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBvcGNvZGU9MHhkZCAqLwordm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisJdWludCBkZXN0b2Zmc2V0OworICAgIHU4IHN0a2VsZW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RkX3RhYiwgbW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJCXN0a2VsZW0gPSAodTgpcmw7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZmcmVlKHN0a2VsZW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2Z4Y2goc3RrZWxlbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZnN0KHN0a2VsZW0pOyAgLyogcmVnaXN0ZXIgdmVyc2lvbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZzdHAoc3RrZWxlbSk7IC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mbGQoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZnN0KFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mc3RwKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9mcnN0b3IoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZzYXZlKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZnN0c3coWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOworfQorCisjaWZkZWYgREVCVUcKKworc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZGVfdGFiW10gPQoreworICAgICJGSUFERFx0V09SRCBQVFIgIiwgIkZJTVVMXHRXT1JEIFBUUiAiLCAiRklDT01cdFdPUkQgUFRSICIsCisgICAgIkZJQ09NUFx0V09SRCBQVFIgIiwKKyAgICAiRklTVUJcdFdPUkQgUFRSICIsICJGSVNVQlJcdFdPUkQgUFRSICIsICJGSURJVlx0V09SRCBQVFIgIiwKKyAgICAiRklESVZSXHRXT1JEIFBUUiAiLAorCisgICAgIkZJQUREXHRXT1JEIFBUUiAiLCAiRklNVUxcdFdPUkQgUFRSICIsICJGSUNPTVx0V09SRCBQVFIgIiwKKyAgICAiRklDT01QXHRXT1JEIFBUUiAiLAorICAgICJGSVNVQlx0V09SRCBQVFIgIiwgIkZJU1VCUlx0V09SRCBQVFIgIiwgIkZJRElWXHRXT1JEIFBUUiAiLAorICAgICJGSURJVlJcdFdPUkQgUFRSICIsCisKKyAgICAiRklBRERcdFdPUkQgUFRSICIsICJGSU1VTFx0V09SRCBQVFIgIiwgIkZJQ09NXHRXT1JEIFBUUiAiLAorICAgICJGSUNPTVBcdFdPUkQgUFRSICIsCisgICAgIkZJU1VCXHRXT1JEIFBUUiAiLCAiRklTVUJSXHRXT1JEIFBUUiAiLCAiRklESVZcdFdPUkQgUFRSICIsCisgICAgIkZJRElWUlx0V09SRCBQVFIgIiwKKworICAgICJGQUREUFx0IiwgIkZNVUxQXHQiLCAiRkNPTVBcdCIsICJGQ09NUFBcdCIsCisgICAgIkZTVUJSUFx0IiwgIkZTVUJQXHQiLCAiRkRJVlJQXHQiLCAiRkRJVlBcdCIsCit9OworCisjZW5kaWYgLyogREVCVUcgKi8KKworLyogb3Bjb2RlPTB4ZGUgKi8KK3ZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworCXVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzdGtlbGVtOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kZV90YWIsIG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCQlzdGtlbGVtID0gKHU4KXJsOworICAgICAgICBERUNPREVfUFJJTlRGMigiXHRTVCglZCksU1RcbiIsIHN0a2VsZW0pOworICAgICAgICBicmVhazsKKyAgICB9CisjaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mYWRkcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB4ODZlbXVfZnB1X1JfZm11bHAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2Zjb21wKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChzdGtlbGVtID09IDEpCisgICAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mY29tcHAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mc3VicnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZzdWJwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mZGl2cnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZkaXZwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9maWFkZChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZpbXVsKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmljb20oWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9maWNvbXAoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9maXN1YihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2Zpc3VicihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2ZpZGl2KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmlkaXZyKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKK30KKworI2lmZGVmIERFQlVHCisKK3N0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2RmX3RhYltdID0geworICAgIC8qIG1vZCA9PSAwMCAqLworICAgICJGSUxEXHRXT1JEIFBUUiAiLCAiRVNDX0RGXHQzOVxuIiwgIkZJU1RcdFdPUkQgUFRSICIsICJGSVNUUFx0V09SRCBQVFIgIiwKKyAgICAiRkJMRFx0VEJZVEUgUFRSICIsICJGSUxEXHRRV09SRCBQVFIgIiwgIkZCU1RQXHRUQllURSBQVFIgIiwKKyAgICAiRklTVFBcdFFXT1JEIFBUUiAiLAorCisgICAgLyogbW9kID09IDAxICovCisgICAgIkZJTERcdFdPUkQgUFRSICIsICJFU0NfREZcdDM5ICIsICJGSVNUXHRXT1JEIFBUUiAiLCAiRklTVFBcdFdPUkQgUFRSICIsCisgICAgIkZCTERcdFRCWVRFIFBUUiAiLCAiRklMRFx0UVdPUkQgUFRSICIsICJGQlNUUFx0VEJZVEUgUFRSICIsCisgICAgIkZJU1RQXHRRV09SRCBQVFIgIiwKKworICAgIC8qIG1vZCA9PSAxMCAqLworICAgICJGSUxEXHRXT1JEIFBUUiAiLCAiRVNDX0RGXHQzOSAiLCAiRklTVFx0V09SRCBQVFIgIiwgIkZJU1RQXHRXT1JEIFBUUiAiLAorICAgICJGQkxEXHRUQllURSBQVFIgIiwgIkZJTERcdFFXT1JEIFBUUiAiLCAiRkJTVFBcdFRCWVRFIFBUUiAiLAorICAgICJGSVNUUFx0UVdPUkQgUFRSICIsCisKKyAgICAvKiBtb2QgPT0gMTEgKi8KKyAgICAiRkZSRUVcdCIsICJGWENIXHQiLCAiRlNUXHQiLCAiRlNUUFx0IiwKKyAgICAiRVNDX0RGXHQzQywiLCAiRVNDX0RGXHQzRCwiLCAiRVNDX0RGXHQzRSwiLCAiRVNDX0RGXHQzRiwiCit9OworCisjZW5kaWYgLyogREVCVUcgKi8KKworLyogb3Bjb2RlPTB4ZGYgKi8KK3ZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworCXVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzdGtlbGVtOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kZl90YWIsIG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCQlzdGtlbGVtID0gKHU4KXJsOworICAgICAgICBERUNPREVfUFJJTlRGMigiXHRTVCglZClcbiIsIHN0a2VsZW0pOworICAgICAgICBicmVhazsKKyAgICB9CisjaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mZnJlZShzdGtlbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9meGNoKHN0a2VsZW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9SX2ZzdChzdGtlbGVtKTsgIC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfUl9mc3RwKHN0a2VsZW0pOyAvKiByZWdpc3RlciB2ZXJzaW9uICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmlsZChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmlzdChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2Zpc3RwKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmJsZChYODZFTVVfRlBVX0JTRCwgZGVzdG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB4ODZlbXVfZnB1X01fZmlsZChYODZFTVVfRlBVX0xPTkcsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeDg2ZW11X2ZwdV9NX2Zic3RwKFg4NkVNVV9GUFVfQlNELCBkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHg4NmVtdV9mcHVfTV9maXN0cChYODZFTVVfRlBVX0xPTkcsIGRlc3RvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMmU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZQpAQCAtMCwwICsxLDYzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisjCisjICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisjICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisjICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisjICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisjICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisjICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LiBSZXF1aXJlcworIyAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFNvZnR3YXJlIG1ha2VmaWxlIGRlZmluaXRpb25zIHBhY2thZ2UgdG8gYmUKKyMgICAgICAgICAgICAgICBpbnN0YWxsZWQsIHdoaWNoIHVzZXMgdGhlIERNQUtFIG1ha2UgcHJvZ3JhbS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5JTVBPUlQgLklHTk9SRTogREVCVUcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIHRoZSBsaXN0cyBvZiBvYmplY3QgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09CSkVDVFMJCQk9IHN5cyRPIGRlY29kZSRPIG9wcyRPIG9wczIkTyBwcmltX29wcyRPIGZwdSRPIGRlYnVnJE8KK0NGTEFHUyAgICAgIAkrPSAtRFNDSVRFQ0gKKy5JRiAkKERFQlVHKQorQ0ZMQUdTCQkJKz0gLURERUJVRworLkVORElGCitMSUJDTEVBTiAgCQk9ICouZGxsICoubGliICouYQorTElCRklMRSAJCT0gJChMUCl4ODZlbXUkTAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYW1wbGUgdGVzdCBwcm9ncmFtcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYWxsOiAkKExJQkZJTEUpCisKK3ZhbGlkYXRlJEU6IHZhbGlkYXRlJE8gJChMSUJGSUxFKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworREVQRU5EX09CSiAgICAgID0gIHZhbGlkYXRlJE8gJChPQkpFQ1RTKQorCisuSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvY29tbW9uLm1rIgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmNyb3NzIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmNyb3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGZkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUuY3Jvc3MKQEAgLTAsMCArMSw3OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorIworIyAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisjICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisjICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisjICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisjICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBEZXNjcmlwdG9uOiAgIExpbnV4IHNwZWNpZmljIG1ha2VmaWxlIGZvciB0aGUgeDg2ZW11IGxpYnJhcnkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitUQVJHRVRMSUIgPSBsaWJ4ODZlbXUuYQorVEFSR0VUREVCVUdMSUIgPWxpYng4NmVtdWQuYQorCitPQkpTPVwKK2RlY29kZS5vIFwKK2ZwdS5vIFwKK29wcy5vIFwKK29wczIubyBcCitwcmltX29wcy5vIFwKK3N5cy5vCisKK0RFQlVHT0JKUz1kZWJ1Zy5kIFwKKyAgICAgICAgICBkZWNvZGUuZCBcCisJICBmcHUuZCBcCisJICBvcHMuZCBcCisJICBvcHMyLmQgXAorCSAgcHJpbV9vcHMuZCBcCisJICBzeXMuZAorCisuU1VGRklYRVM6IC5kCisKK2FsbDogJChUQVJHRVRMSUIpICQoVEFSR0VUREVCVUdMSUIpCisKKyQoVEFSR0VUTElCKTogJChPQkpTKQorCXBwYy1lbGYzMi1hciBydiAkKFRBUkdFVExJQikgJChPQkpTKQorCiskKFRBUkdFVERFQlVHTElCKTogJChERUJVR09CSlMpCisJcHBjLWVsZjMyLWFyIHJ2ICQoVEFSR0VUREVCVUdMSUIpICQoREVCVUdPQkpTKQorCitJTkNTICAgPSAtSS4gLUl4ODZlbXUgLUkuLi8uLi9pbmNsdWRlCitDRkxBR1MgPSAtRF9fRFJJVkVSX18gLURGT1JDRV9QT1NUIC1EX0NFWFBPUlQ9IC1ETk9fTE9OR19MT05HIC1EcHJpbnRrPXByaW50ZiAtZnNpZ25lZC1jaGFyICAtZm9taXQtZnJhbWUtcG9pbnRlciAtbXJlbG9jYXRhYmxlIC1mZml4ZWQtcjE0IC1tZWFiaSAtbXJlbG9jYXRhYmxlIC1mZml4ZWQtcjE0IC1tZWFiaQorQ0RFQlVHRkxBR1MgPSAtRERFQlVHCisKKy5jLm86CisJcHBjLWVsZjMyLWdjYyAtZyAtTzIgLVdhbGwgLWMgJChDRkxBR1MpICQoSU5DUykgJCouYworCisuYy5kOgorCXBwYy1lbGYzMi1nY2MgLWcgLU8yIC1XYWxsIC1jIC1vJCouZCAkKENGTEFHUykgJChDREVCVUdGTEFHUykgJChJTkNTKSAkKi5jCisKKy5jcHAubzoKKwlwcGMtZWxmMzItZ2NjIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmNwcAorCitjbGVhbjoKKwlybSAtZiAqLmEgKi5vICouZAorCit2YWxpZGF0ZToJdmFsaWRhdGUubyBsaWJ4ODZlbXUuYQorCXBwYy1lbGYzMi1nY2MgLW8gdmFsaWRhdGUgdmFsaWRhdGUubyAtbHg4NmVtdSAtTC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5saW51eCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5saW51eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRiODhkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmxpbnV4CkBAIC0wLDAgKzEsODEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyMKKyMgICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorIworIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorIyAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorIyAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorIyAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisjICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisjICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisjICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworIyAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyMgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisjCisjICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyMgIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyMgIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisjICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisjICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyMgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyMgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRGVzY3JpcHRvbjogICBMaW51eCBzcGVjaWZpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVEFSR0VUTElCID0gbGlieDg2ZW11LmEKK1RBUkdFVERFQlVHTElCID1saWJ4ODZlbXVkLmEKKworT0JKUz1cCitkZWNvZGUubyBcCitmcHUubyBcCitvcHMubyBcCitvcHMyLm8gXAorcHJpbV9vcHMubyBcCitwcmVncy5vIFwKK3N5cy5vCisKK0RFQlVHT0JKUz1kZWJ1Zy5kIFwKKyAgICAgICAgICBkZWNvZGUuZCBcCisJICBmcHUuZCBcCisJICBvcHMuZCBcCisJICBvcHMyLmQgXAorCSAgcHJpbV9vcHMuZCBcCisJICBwcmVncy5kIFwKKwkgIHN5cy5kCisKKy5TVUZGSVhFUzogLmQKKworYWxsOiAkKFRBUkdFVExJQikgJChUQVJHRVRERUJVR0xJQikKKworJChUQVJHRVRMSUIpOiAkKE9CSlMpCisJYXIgcnYgJChUQVJHRVRMSUIpICQoT0JKUykKKworJChUQVJHRVRERUJVR0xJQik6ICQoREVCVUdPQkpTKQorCWFyIHJ2ICQoVEFSR0VUREVCVUdMSUIpICQoREVCVUdPQkpTKQorCitJTkNTICAgPSAtSS4gLUl4ODZlbXUgLUkuLi8uLi9pbmNsdWRlCitDRkxBR1MgPSAtRF9fRFJJVkVSX18gLURGT1JDRV9QT1NUIC1EX0NFWFBPUlQ9IC1ETk9fTE9OR19MT05HCitDREVCVUdGTEFHUyA9IC1EREVCVUcKKworLmMubzoKKwlnY2MgLWcgLU8gLVdhbGwgLWMgJChDRkxBR1MpICQoSU5DUykgJCouYworCisuYy5kOgorCWdjYyAtZyAtTyAtV2FsbCAtYyAtbyQqLmQgJChDRkxBR1MpICQoQ0RFQlVHRkxBR1MpICQoSU5DUykgJCouYworCisuY3BwLm86CisJZ2NjIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmNwcAorCitjbGVhbjoKKwlybSAtZiAqLmEgKi5vICouZAorCit2YWxpZGF0ZToJdmFsaWRhdGUubyBsaWJ4ODZlbXUuYQorCWdjYyAtbyB2YWxpZGF0ZSB2YWxpZGF0ZS5vIC1seDg2ZW11IC1MLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzk3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzLmMKQEAgLTAsMCArMSwxMTcwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgdG8gaW1wbGVtZW50IHRoZSBkZWNvZGluZworKiAgICAgICAgICAgICAgIGFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KKyoKKyogVGhlcmUgYXJlIGFwcHJveGltYXRlbHkgMjUwIHN1YnJvdXRpbmVzIGluIGhlcmUsIHdoaWNoIGNvcnJlc3BvbmQKKyogdG8gdGhlIDI1NiBieXRlLSJvcGNvZGVzIiBmb3VuZCBvbiB0aGUgODA4Ni4gIFRoZSB0YWJsZSB3aGljaAorKiBkaXNwYXRjaGVzIHRoaXMgaXMgZm91bmQgaW4gdGhlIGZpbGVzIG9wdGFiLltjaF0uCisqCisqIEVhY2ggb3Bjb2RlIHByb2MgaGFzIGEgY29tbWVudCBwcmVjZWVkaW5nIGl0IHdoaWNoIGdpdmVzIGl0J3MgdGFibGUKKyogYWRkcmVzcy4gIFNldmVyYWwgb3Bjb2RlcyBhcmUgbWlzc2luZyAodW5kZWZpbmVkKSBpbiB0aGUgdGFibGUuCisqCisqIEVhY2ggcHJvYyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgZGVjb2RpbmcgKERFQ09ERV9QUklOVEYgYW5kCisqIERFQ09ERV9QUklOVEYyKSwgZGVidWdnaW5nIChUUkFDRV9SRUdTLCBTSU5HTEVfU1RFUCksIGFuZCBtaXNjCisqIGZ1bmN0aW9ucyAoU1RBUlRfT0ZfSU5TVFIsIEVORF9PRl9JTlNUUikuCisqCisqIE1hbnkgb2YgdGhlIHByb2NlZHVyZXMgYXJlICpWRVJZKiBzaW1pbGFyIGluIGNvZGluZy4gIFRoaXMgaGFzCisqIGFsbG93ZWQgZm9yIGEgdmVyeSBsYXJnZSBhbW91bnQgb2YgY29kZSB0byBiZSBnZW5lcmF0ZWQgaW4gYSBmYWlybHkKKyogc2hvcnQgYW1vdW50IG9mIHRpbWUgKGkuZS4gY3V0LCBwYXN0ZSwgYW5kIG1vZGlmeSkuICBUaGUgcmVzdWx0IGlzCisqIHRoYXQgbXVjaCBvZiB0aGUgY29kZSBiZWxvdyBjb3VsZCBoYXZlIGJlZW4gZm9sZGVkIGludG8gc3Vicm91dGluZXMKKyogZm9yIGEgbGFyZ2UgcmVkdWN0aW9uIGluIHNpemUgb2YgdGhpcyBmaWxlLiAgVGhlIGRvd25zaWRlIHdvdWxkIGJlCisqIHRoYXQgdGhlcmUgd291bGQgYmUgYSBwZW5hbHR5IGluIGV4ZWN1dGlvbiBzcGVlZC4gIFRoZSBmaWxlIGNvdWxkCisqIGFsc28gaGF2ZSBiZWVuICpNVUNIKiBsYXJnZXIgYnkgaW5saW5pbmcgY2VydGFpbiBmdW5jdGlvbnMgd2hpY2gKKyogd2VyZSBjYWxsZWQuICBUaGlzIGNvdWxkIGhhdmUgcmVzdWx0ZWQgZXZlbiBmYXN0ZXIgZXhlY3V0aW9uLiAgVGhlCisqIHByaW1lIGRpcmVjdGl2ZSBJIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW5saW5lIHRoZSBjb2RlIG9yIHRvCisqIG1vZHVsYXJpemUgaXQsIHdhcyBiYXNpY2FsbHk6IDEpIG5vIHVubmVjZXNzYXJ5IHN1YnJvdXRpbmUgY2FsbHMsCisqIDIpIG5vIHJvdXRpbmVzIG1vcmUgdGhhbiBhYm91dCAyMDAgbGluZXMgaW4gc2l6ZSwgYW5kIDMpIG1vZHVsYXJpemUKKyogYW55IGNvZGUgdGhhdCBJIG1pZ2h0IG5vdCBnZXQgcmlnaHQgdGhlIGZpcnN0IHRpbWUuICBUaGUgZmV0Y2hfKgorKiBzdWJyb3V0aW5lcyBmYWxsIGludG8gdGhlIGxhdHRlciBjYXRlZ29yeS4gIFRoZSBUaGUgZGVjb2RlXyogZmFsbAorKiBpbnRvIHRoZSBzZWNvbmQgY2F0ZWdvcnkuICBUaGUgY29kaW5nIG9mIHRoZSAic3dpdGNoKG1vZCl7IC4uLi4gfSIKKyogaW4gbWFueSBvZiB0aGUgc3Vicm91dGluZXMgYmVsb3cgZmFsbHMgaW50byB0aGUgZmlyc3QgY2F0ZWdvcnkuCisqIEVzcGVjaWFsbHksIHRoZSBjb2Rpbmcgb2Yge2FkZCxhbmQsb3Isc3ViLC4uLn1fe2J5dGUsd29yZH0KKyogc3Vicm91dGluZXMgYXJlIGFuIGVzcGVjaWFsbHkgZ2xhcmluZyBjYXNlIG9mIHRoZSB0aGlyZCBndWlkZWxpbmUuCisqIFNpbmNlIHNvIG11Y2ggb2YgdGhlIGNvZGUgaXMgY2xvbmVkIGZyb20gb3RoZXIgbW9kdWxlcyAoY29tcGFyZQorKiBvcGNvZGUgIzAwIHRvIG9wY29kZSAjMDEpLCBtYWtpbmcgdGhlIGJhc2ljIG9wZXJhdGlvbnMgc3Vicm91dGluZQorKiBjYWxscyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudDsgb3RoZXJ3aXNlIG1pc3Rha2VzIGluIGNvZGluZyBhbgorKiAiYWRkIiB3b3VsZCByZXByZXNlbnQgYSBuaWdodG1hcmUgaW4gbWFpbnRlbmFuY2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCisKK1JFTUFSS1M6CitIYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2lsbGVnYWxfb3AoCisgICAgdTggb3AxKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBYODYgT1BDT0RFXG4iKTsKKyAgICBUUkFDRV9SRUdTKCk7CisgICAgcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlggSUxMRUdBTCBYODYgT1BDT0RFIVxuIiwKKyAgICAgICAgTS54ODYuUl9DUywgTS54ODYuUl9JUC0xLG9wMSk7CisgICAgSEFMVF9TWVMoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDAwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hZGRfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHU4IGRlc3R2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWRkX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhZGRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhZGRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFkZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFkZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYWRkX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYWRkX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWRkX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDAzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hZGRfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FkZF9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBRERcdEFMLCIpOworICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGFkZF9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FkZF93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFERFx0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFERFx0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IGFkZF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSBhZGRfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDA2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEVTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX0VTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9FUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29yX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gb3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSBvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDA5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29yX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3Jfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29yX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9SXHRBTCwiKTsKKyAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBvcl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29yX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiT1JcdEVBWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJPUlx0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IG9yX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9BWCA9IG9yX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRDU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYuIEVzY2FwZSBmb3IgdHdvLWJ5dGUgb3Bjb2RlICgyODYgb3IgYmV0dGVyKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdHdvX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IG9wMiA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKyAgICAoKng4NmVtdV9vcHRhYjJbb3AyXSkob3AyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDEwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hZGNfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWRjX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhZGNfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhZGNfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFkY19sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFkY193b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYWRjX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYWRjX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWRjX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hZGNfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FkY19ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBRENcdEFMLCIpOworICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGFkY19ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FkY193b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IGFkY19sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSBhZGNfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX1NTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0U1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9TUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NiYl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDE5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zYmJfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNiYl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNiYl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2JiX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2JiX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzYmJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzYmJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDFhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zYmJfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NiYl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2JiX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNCQlx0QUwsIik7CisgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gc2JiX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2JiX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiU0JCXHRFQVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiU0JCXHRBWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUFYID0gc2JiX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9BWCA9IHNiYl93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RFNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRFMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDFmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHREU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0RTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYW5kX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IGFuZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gYW5kX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSBhbmRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYW5kX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhbmRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBhbmRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFuZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGFuZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYW5kX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gYW5kX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYW5kX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDIzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hbmRfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FuZF9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBTkRcdEFMLCIpOworICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGFuZF9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MjUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FuZF93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFORFx0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkFORFx0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IGFuZF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSBhbmRfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDI2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRVM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRVM7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDI3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kYWEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFBXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBkYWFfYnl0ZShNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3ViX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MjkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N1Yl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc3ViX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc3ViX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzdWJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzdWJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHN1Yl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHN1Yl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N1Yl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1OCBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3ViX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDJjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdWJfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1VCXHRBTCwiKTsKKyAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBzdWJfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDJkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdWJfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJTVUJcdEVBWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJTVUJcdEFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQVggPSBzdWJfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FYID0gc3ViX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0NTOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Rhcyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJEQVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGRhc19ieXRlKE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDMwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF94b3JfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeG9yX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSB4b3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSB4b3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHhvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHhvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0geG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0geG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeG9yX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDMzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF94b3Jfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MzQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hvcl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYT1JcdEFMLCIpOworICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IHhvcl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MzUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hvcl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhPUlx0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhPUlx0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IHhvcl9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSB4b3Jfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDM2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1M6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfU1M7CisgICAgLyogbm8gREVDT0RFX0NMRUFSX1NFR09WUiAhICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBQVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FYID0gYWFhX3dvcmQoTS54ODYuUl9BWCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MzgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NtcF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdTggZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBjbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBjbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBjbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBjbXBfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY21wX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBjbXBfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBjbXBfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgY21wX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGNtcF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGNtcF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBjbXBfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBjbXBfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGNtcF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBjbXBfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgY21wX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY21wX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNNUFx0QUwsIik7CisgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBjbXBfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJDTVBcdEVBWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJDTVBcdEFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgY21wX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0RTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkRTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0RTOworICAgIC8qIE5PIERFQ09ERV9DTEVBUl9TRUdPVlIhICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWFzKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FYID0gYWFzX3dvcmQoTS54ODYuUl9BWCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NDAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luY19BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5DXHRFQVhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0QVhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IGluY19sb25nKE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FYID0gaW5jX3dvcmQoTS54ODYuUl9BWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDQxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbmNfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0RUNYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdENYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQ1ggPSBpbmNfbG9uZyhNLng4Ni5SX0VDWCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9DWCA9IGluY193b3JkKE0ueDg2LlJfQ1gpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0MgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5jX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdEVEWFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5DXHREWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRURYID0gaW5jX2xvbmcoTS54ODYuUl9FRFgpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfRFggPSBpbmNfd29yZChNLng4Ni5SX0RYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NDMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luY19CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5DXHRFQlhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0QlhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VCWCA9IGluY19sb25nKE0ueDg2LlJfRUJYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0JYID0gaW5jX3dvcmQoTS54ODYuUl9CWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDQ0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbmNfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0RVNQXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdFNQXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FU1AgPSBpbmNfbG9uZyhNLng4Ni5SX0VTUCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9TUCA9IGluY193b3JkKE0ueDg2LlJfU1ApOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0NQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5jX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdEVCUFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5DXHRCUFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUJQID0gaW5jX2xvbmcoTS54ODYuUl9FQlApOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQlAgPSBpbmNfd29yZChNLng4Ni5SX0JQKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NDYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luY19TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5DXHRFU0lcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0U0lcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VTSSA9IGluY19sb25nKE0ueDg2LlJfRVNJKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX1NJID0gaW5jX3dvcmQoTS54ODYuUl9TSSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDQ3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbmNfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0RURJXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdERJXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FREkgPSBpbmNfbG9uZyhNLng4Ni5SX0VESSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9ESSA9IGluY193b3JkKE0ueDg2LlJfREkpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGVjX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdEVBWFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRBWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUFYID0gZGVjX2xvbmcoTS54ODYuUl9FQVgpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSBkZWNfd29yZChNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NDkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2RlY19DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRFQ1hcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Q1hcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VDWCA9IGRlY19sb25nKE0ueDg2LlJfRUNYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0NYID0gZGVjX3dvcmQoTS54ODYuUl9DWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDRhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kZWNfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0RURYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdERYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FRFggPSBkZWNfbG9uZyhNLng4Ni5SX0VEWCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9EWCA9IGRlY193b3JkKE0ueDg2LlJfRFgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGVjX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdEVCWFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRCWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUJYID0gZGVjX2xvbmcoTS54ODYuUl9FQlgpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQlggPSBkZWNfd29yZChNLng4Ni5SX0JYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NGMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2RlY19TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRFU1BcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0U1BcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VTUCA9IGRlY19sb25nKE0ueDg2LlJfRVNQKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX1NQID0gZGVjX3dvcmQoTS54ODYuUl9TUCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDRkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kZWNfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0RUJQXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdEJQXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQlAgPSBkZWNfbG9uZyhNLng4Ni5SX0VCUCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9CUCA9IGRlY193b3JkKE0ueDg2LlJfQlApOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGVjX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdEVTSVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRTSVxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRVNJID0gZGVjX2xvbmcoTS54ODYuUl9FU0kpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfU0kgPSBkZWNfd29yZChNLng4Ni5SX1NJKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NGYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2RlY19ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHRFRElcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0RElcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VESSA9IGRlY19sb25nKE0ueDg2LlJfRURJKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0RJID0gZGVjX3dvcmQoTS54ODYuUl9ESSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDUwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFQVhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEFYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9BWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDUxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFQ1hcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdENYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRUNYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9DWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDUyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFRFhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdERYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRURYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9EWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDUzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFQlhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEJYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRUJYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9CWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFU1BcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNQXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkvKiBBbHdheXMgcHVzaCAoRSlTUCwgc2luY2Ugd2UgYXJlIGVtdWxhdGluZyBhbiBpMzg2IGFuZCBhYm92ZQorCSAqIHByb2Nlc3Nvci4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgc29tZSBCSU9TJ2VzIHVzZSB0aGlzIHRvIGNoZWNrCisJICogd2hhdCB0eXBlIG9mIHByb2Nlc3NvciBpcyBpbiB0aGUgc3lzdGVtLgorCSAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQlwdXNoX2xvbmcoTS54ODYuUl9FU1ApOworCX0gZWxzZSB7CisJCXB1c2hfd29yZCgodTE2KShNLng4Ni5SX1NQKSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFQlBcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEJQXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRUJQKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9CUCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFU0lcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNJXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRVNJKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9TSSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFRElcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdERJXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKE0ueDg2LlJfRURJKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9ESSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RUFYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdEFYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQVggPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQVggPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg1OQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdEVDWFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QXHRDWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUNYID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QXHRFRFhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RFhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VEWCA9IHBvcF9sb25nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9EWCA9IHBvcF93b3JkKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDViCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RUJYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdEJYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQlggPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQlggPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg1YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdEVTUFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QXHRTUFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRVNQID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX1NQID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QXHRFQlBcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUFx0QlBcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VCUCA9IHBvcF9sb25nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9CUCA9IHBvcF93b3JkKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RVNJXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdFNJXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FU0kgPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg1ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BcdEVESVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QXHRESVxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0RJID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIQURcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBVU0hBXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgdTMyIG9sZF9zcCA9IE0ueDg2LlJfRVNQOworCisgICAgICAgIHB1c2hfbG9uZyhNLng4Ni5SX0VBWCk7CisgICAgICAgIHB1c2hfbG9uZyhNLng4Ni5SX0VDWCk7CisgICAgICAgIHB1c2hfbG9uZyhNLng4Ni5SX0VEWCk7CisgICAgICAgIHB1c2hfbG9uZyhNLng4Ni5SX0VCWCk7CisgICAgICAgIHB1c2hfbG9uZyhvbGRfc3ApOworICAgICAgICBwdXNoX2xvbmcoTS54ODYuUl9FQlApOworICAgICAgICBwdXNoX2xvbmcoTS54ODYuUl9FU0kpOworICAgICAgICBwdXNoX2xvbmcoTS54ODYuUl9FREkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHUxNiBvbGRfc3AgPSBNLng4Ni5SX1NQOworCisgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0FYKTsKKyAgICAgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1gpOworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9EWCk7CisgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0JYKTsKKyAgICAgICAgcHVzaF93b3JkKG9sZF9zcCk7CisgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0JQKTsKKyAgICAgICAgcHVzaF93b3JkKE0ueDg2LlJfU0kpOworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9ESSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDYxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BBRFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUE9QQVxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKKyAgICAgICAgTS54ODYuUl9FU0kgPSBwb3BfbG9uZygpOworICAgICAgICBNLng4Ni5SX0VCUCA9IHBvcF9sb25nKCk7CisgICAgICAgIE0ueDg2LlJfRVNQICs9IDQ7ICAgICAgICAgICAgICAvKiBza2lwIEVTUCAqLworICAgICAgICBNLng4Ni5SX0VCWCA9IHBvcF9sb25nKCk7CisgICAgICAgIE0ueDg2LlJfRURYID0gcG9wX2xvbmcoKTsKKyAgICAgICAgTS54ODYuUl9FQ1ggPSBwb3BfbG9uZygpOworICAgICAgICBNLng4Ni5SX0VBWCA9IHBvcF9sb25nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9ESSA9IHBvcF93b3JkKCk7CisgICAgICAgIE0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOworICAgICAgICBNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKKyAgICAgICAgTS54ODYuUl9TUCArPSAyOyAgICAgICAgICAgICAgIC8qIHNraXAgU1AgKi8KKyAgICAgICAgTS54ODYuUl9CWCA9IHBvcF93b3JkKCk7CisgICAgICAgIE0ueDg2LlJfRFggPSBwb3Bfd29yZCgpOworICAgICAgICBNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKKyAgICAgICAgTS54ODYuUl9BWCA9IHBvcF93b3JkKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLypvcGNvZGUgMHg2MiAgIElMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLworLypvcGNvZGUgMHg2MyAgIElMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9GUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJGUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9GUzsKKyAgICAvKgorICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAorICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgorICAgICAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJHUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9HUzsKKyAgICAvKgorICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAorICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgorICAgICAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjYgLSBwcmVmaXggZm9yIDMyLWJpdCByZWdpc3RlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHJlZml4X2RhdGEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFUQTpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9EQVRBOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjcgLSBwcmVmaXggZm9yIDMyLWJpdCBhZGRyZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wcmVmaXhfYWRkcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBRERSOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX0FERFI7CisgICAgLyogbm90ZSBubyBERUNPREVfQ0xFQVJfU0VHT1ZSIGhlcmUuICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF93b3JkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIlBVU0hcdCV4XG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIHB1c2hfbG9uZyhpbW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1c2hfd29yZCgodTE2KWltbSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbXVsX3dvcmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXNfbG8scmVzX2hpOworICAgICAgICAgICAgczMyIGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKKyAgICAgICAgICAgIGlmIChyZXNfaGkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXM7CisgICAgICAgICAgICBzMTYgaW1tOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXNfbG8scmVzX2hpOworICAgICAgICAgICAgczMyIGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKKyAgICAgICAgICAgIGlmIChyZXNfaGkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXM7CisgICAgICAgICAgICBzMTYgaW1tOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXNfbG8scmVzX2hpOworICAgICAgICAgICAgczMyIGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKKyAgICAgICAgICAgIGlmIChyZXNfaGkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXM7CisgICAgICAgICAgICBzMTYgaW1tOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKyAgICAgICAgICAgIHUzMiByZXNfbG8scmVzX2hpOworICAgICAgICAgICAgczMyIGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKKyAgICAgICAgICAgIGlmIChyZXNfaGkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisgICAgICAgICAgICB1MzIgcmVzOworICAgICAgICAgICAgczE2IGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICByZXMgPSAoczE2KSpzcmNyZWcgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGltbSA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCJQVVNIXHQlZFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChpbW0pOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbXVsX2J5dGVfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgczggIGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7CisgICAgICAgICAgICBpZiAocmVzX2hpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisgICAgICAgICAgICB1MzIgcmVzOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXNfbG8scmVzX2hpOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOworICAgICAgICAgICAgaWYgKHJlc19oaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlczsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07CisgICAgICAgICAgICBpZiAocmVzID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisgICAgICAgICAgICB1MzIgcmVzX2xvLHJlc19oaTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKKyAgICAgICAgICAgIGlmIChyZXNfaGkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiByZXM7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOworICAgICAgICAgICAgaWYgKHJlcyA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKnNyY3JlZywoczMyKWltbSk7CisgICAgICAgICAgICBpZiAocmVzX2hpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworICAgICAgICAgICAgdTMyIHJlczsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisgICAgICAgICAgICByZXMgPSAoczE2KSpzcmNyZWcgKiAoczE2KWltbTsKKyAgICAgICAgICAgIGlmIChyZXMgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBTRVRfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOU0JcbiIpOworICAgIGlucygxKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSU5TRFxuIik7CisgICAgICAgIGlucyg0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTlNXXG4iKTsKKyAgICAgICAgaW5zKDIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUU0JcbiIpOworICAgIG91dHMoMSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0c193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJPVVRTRFxuIik7CisgICAgICAgIG91dHMoNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiT1VUU1dcbiIpOworICAgICAgICBvdXRzKDIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDcwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKT1x0Iik7CisgICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9PRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NzEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OTyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGlzIG5vdCBzZXQgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpOT1x0Iik7CisgICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoIUFDQ0VTU19GTEFHKEZfT0YpKQorICAgICAgICBNLng4Ni5SX0lQID0gdGFyZ2V0OworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDcyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfQih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgc2V0LiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSkJcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorICAgICAgICBNLng4Ni5SX0lQID0gdGFyZ2V0OworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDczCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IG9mZnNldDsKKyAgICB1MTYgdGFyZ2V0OworCisgICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBjYXJyeSBmbGFnIGlzIGNsZWFyLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk5CXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmICghQUNDRVNTX0ZMQUcoRl9DRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NzQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9aKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgemVybyBmbGFnIGlzIHNldC4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpaXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3NQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05aKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgemVybyBmbGFnIGlzIGNsZWFyLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk5aXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmICghQUNDRVNTX0ZMQUcoRl9aRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NzYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9CRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgc2V0IG9yIGlmIHRoZSB6ZXJvCisgICAgICAgZmxhZyBpcyBzZXQuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKQkVcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKQorICAgICAgICBNLng4Ni5SX0lQID0gdGFyZ2V0OworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDc3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkJFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgY2FycnkgZmxhZyBpcyBjbGVhciBhbmQgaWYgdGhlIHplcm8KKyAgICAgICBmbGFnIGlzIGNsZWFyICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTkJFXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmICghKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKSkKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IG9mZnNldDsKKyAgICB1MTYgdGFyZ2V0OworCisgICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgaXMgc2V0ICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKU1x0Iik7CisgICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9TRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NzkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBpcyBjbGVhciAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk5TXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmICghQUNDRVNTX0ZMQUcoRl9TRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4N2EKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9QKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgcGFyaXR5IGZsYWcgaXMgc2V0IChldmVuIHBhcml0eSkgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpQXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX1BGKSkKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05QKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgcGFyaXR5IGZsYWcgaXMgY2xlYXIgKG9kZCBwYXJpdHkpICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTlBcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKCFBQ0NFU1NfRkxBRyhGX1BGKSkKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IG9mZnNldDsKKyAgICB1MTYgdGFyZ2V0OworICAgIGludCBzZiwgb2Y7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBub3QgZXF1YWwgdG8gb3ZlcmZsb3cgZmxhZy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpMXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKKyAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7CisgICAgaWYgKHNmIF4gb2YpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4N2QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisgICAgaW50IHNmLCBvZjsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIG5vdCBlcXVhbCB0byBvdmVyZmxvdyBmbGFnLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk5MXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKKyAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7CisgICAgLyogbm90ZTogaW52ZXJzZSBvZiBhYm92ZSwgYnV0IHVzaW5nID09IGluc3RlYWQgb2YgeG9yLiAqLworICAgIGlmIChzZiA9PSBvZikKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0xFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKyAgICBpbnQgc2YsIG9mOworCisgICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgbm90IGVxdWFsIHRvIG92ZXJmbG93IGZsYWcKKyAgICAgICBvciB0aGUgemVybyBmbGFnIGlzIHNldCAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSkxFXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKKyAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7CisgICAgaWYgKChzZiBeIG9mKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSkKKyAgICAgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg3ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05MRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggb2Zmc2V0OworICAgIHUxNiB0YXJnZXQ7CisgICAgaW50IHNmLCBvZjsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIGVxdWFsIHRvIG92ZXJmbG93IGZsYWcuCisgICAgICAgYW5kIHRoZSB6ZXJvIGZsYWcgaXMgY2xlYXIgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpOTEVcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgc2YgPSBBQ0NFU1NfRkxBRyhGX1NGKSAhPSAwOworICAgIG9mID0gQUNDRVNTX0ZMQUcoRl9PRikgIT0gMDsKKyAgICBpZiAoKHNmID09IG9mKSAmJiAhQUNDRVNTX0ZMQUcoRl9aRikpCisgICAgICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCitzdGF0aWMgdTggKCpvcGM4MF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSA9Cit7CisgICAgYWRkX2J5dGUsICAgICAgICAgICAvKiAwMCAqLworICAgIG9yX2J5dGUsICAgICAgICAgICAgLyogMDEgKi8KKyAgICBhZGNfYnl0ZSwgICAgICAgICAgIC8qIDAyICovCisgICAgc2JiX2J5dGUsICAgICAgICAgICAvKiAwMyAqLworICAgIGFuZF9ieXRlLCAgICAgICAgICAgLyogMDQgKi8KKyAgICBzdWJfYnl0ZSwgICAgICAgICAgIC8qIDA1ICovCisgICAgeG9yX2J5dGUsICAgICAgICAgICAvKiAwNiAqLworICAgIGNtcF9ieXRlLCAgICAgICAgICAgLyogMDcgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4MAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggaW1tOworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworICAgICAgICAvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorICAgICAgICAgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworICAgICAgICAgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUgCisgICAgICAgICAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGM4MF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKyAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCitzdGF0aWMgdTE2ICgqb3BjODFfd29yZF9vcGVyYXRpb25bXSkodTE2IGQsIHUxNiBzKSA9Cit7CisgICAgYWRkX3dvcmQsICAgICAgICAgICAvKjAwICovCisgICAgb3Jfd29yZCwgICAgICAgICAgICAvKjAxICovCisgICAgYWRjX3dvcmQsICAgICAgICAgICAvKjAyICovCisgICAgc2JiX3dvcmQsICAgICAgICAgICAvKjAzICovCisgICAgYW5kX3dvcmQsICAgICAgICAgICAvKjA0ICovCisgICAgc3ViX3dvcmQsICAgICAgICAgICAvKjA1ICovCisgICAgeG9yX3dvcmQsICAgICAgICAgICAvKjA2ICovCisgICAgY21wX3dvcmQsICAgICAgICAgICAvKjA3ICovCit9OworCitzdGF0aWMgdTMyICgqb3BjODFfbG9uZ19vcGVyYXRpb25bXSkodTMyIGQsIHUzMiBzKSA9Cit7CisgICAgYWRkX2xvbmcsICAgICAgICAgICAvKjAwICovCisgICAgb3JfbG9uZywgICAgICAgICAgICAvKjAxICovCisgICAgYWRjX2xvbmcsICAgICAgICAgICAvKjAyICovCisgICAgc2JiX2xvbmcsICAgICAgICAgICAvKjAzICovCisgICAgYW5kX2xvbmcsICAgICAgICAgICAvKjA0ICovCisgICAgc3ViX2xvbmcsICAgICAgICAgICAvKjA1ICovCisgICAgeG9yX2xvbmcsICAgICAgICAgICAvKjA2ICovCisgICAgY21wX2xvbmcsICAgICAgICAgICAvKjA3ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgxX3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQorICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAorICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKyAgICAgICAgLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKyAgICAgICAgICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKyAgICAgICAgICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlIAorICAgICAgICAgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyoKKyAgICAgKiBLbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nIAorICAgICAqIG1vZGUuCisgICAgICovCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4MV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisgICAgICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsLGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjODFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsLGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbCxpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisgICAgICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbCxpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjODFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgZGVzdHZhbCxpbW07CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworICAgICAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICAgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgICpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCitzdGF0aWMgdTggKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltdKSh1OCBzLCB1OCBkKSA9Cit7CisgICAgYWRkX2J5dGUsICAgICAgICAgICAvKjAwICovCisgICAgb3JfYnl0ZSwgICAgICAgICAgICAvKjAxICovLypZWVkgVU5VU0VEID8/Pz8gKi8KKyAgICBhZGNfYnl0ZSwgICAgICAgICAgIC8qMDIgKi8KKyAgICBzYmJfYnl0ZSwgICAgICAgICAgIC8qMDMgKi8KKyAgICBhbmRfYnl0ZSwgICAgICAgICAgIC8qMDQgKi8vKllZWSBVTlVTRUQgPz8/PyAqLworICAgIHN1Yl9ieXRlLCAgICAgICAgICAgLyowNSAqLworICAgIHhvcl9ieXRlLCAgICAgICAgICAgLyowNiAqLy8qWVlZIFVOVVNFRCA/Pz8/ICovCisgICAgY21wX2J5dGUsICAgICAgICAgICAvKjA3ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKyAgICB1OCBkZXN0dmFsOworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQorICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAorICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gU2ltaWxhciB0byBvcGNvZGUgODEsIGV4Y2VwdCB0aGF0CisgICAgICogdGhlIGltbWVkaWF0ZSBieXRlIGlzIHNpZ24gZXh0ZW5kZWQgdG8gYSB3b3JkIGxlbmd0aC4KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKyAgICAgICAgLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKyAgICAgICAgICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKyAgICAgICAgICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlIAorICAgICAgICAgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworc3RhdGljIHUxNiAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBzLCB1MTYgZCkgPQoreworICAgIGFkZF93b3JkLCAgICAgICAgICAgLyowMCAqLworICAgIG9yX3dvcmQsICAgICAgICAgICAgLyowMSAqLy8qWVlZIFVOVVNFRCA/Pz8/ICovCisgICAgYWRjX3dvcmQsICAgICAgICAgICAvKjAyICovCisgICAgc2JiX3dvcmQsICAgICAgICAgICAvKjAzICovCisgICAgYW5kX3dvcmQsICAgICAgICAgICAvKjA0ICovLypZWVkgVU5VU0VEID8/Pz8gKi8KKyAgICBzdWJfd29yZCwgICAgICAgICAgIC8qMDUgKi8KKyAgICB4b3Jfd29yZCwgICAgICAgICAgIC8qMDYgKi8vKllZWSBVTlVTRUQgPz8/PyAqLworICAgIGNtcF93b3JkLCAgICAgICAgICAgLyowNyAqLworfTsKKworc3RhdGljIHUzMiAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW10pKHUzMiBzLCB1MzIgZCkgPQoreworICAgIGFkZF9sb25nLCAgICAgICAgICAgLyowMCAqLworICAgIG9yX2xvbmcsICAgICAgICAgICAgLyowMSAqLy8qWVlZIFVOVVNFRCA/Pz8/ICovCisgICAgYWRjX2xvbmcsICAgICAgICAgICAvKjAyICovCisgICAgc2JiX2xvbmcsICAgICAgICAgICAvKjAzICovCisgICAgYW5kX2xvbmcsICAgICAgICAgICAvKjA0ICovLypZWVkgVU5VU0VEID8/Pz8gKi8KKyAgICBzdWJfbG9uZywgICAgICAgICAgIC8qMDUgKi8KKyAgICB4b3JfbG9uZywgICAgICAgICAgIC8qMDYgKi8vKllZWSBVTlVTRUQgPz8/PyAqLworICAgIGNtcF9sb25nLCAgICAgICAgICAgLyowNyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDgzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGM4M193b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mIHRoZSBvcGNvZGUKKyAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAorICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisgICAgICAgIC8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisgICAgICAgICAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisgICAgICAgICAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZSAKKyAgICAgICAgICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsLGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjODNfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsLGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4M193b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbCxpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisgICAgICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbCxpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworICAgICAgICAgICAgaWYgKHJoICE9IDcpCisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisgICAgICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIGRlc3R2YWwsaW1tOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKyAgICAgICAgICAgIGlmIChyaCAhPSA3KQorICAgICAgICAgICAgICAgICpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsLGltbTsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisgICAgICAgICAgICBpZiAocmggIT0gNykKKyAgICAgICAgICAgICAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIHRlc3RfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICB0ZXN0X2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3Rlc3Rfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRlc3RfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRlc3Rfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRlc3RfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAqc3JjcmVnID0gZGVzdHZhbDsKKyAgICAgICAgZGVzdHZhbCA9IHRtcDsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIHRtcCA9ICpzcmNyZWc7CisgICAgICAgICpzcmNyZWcgPSBkZXN0dmFsOworICAgICAgICBkZXN0dmFsID0gdG1wOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgdG1wID0gKnNyY3JlZzsKKyAgICAgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisgICAgICAgIGRlc3R2YWwgPSB0bXA7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAqc3JjcmVnID0gKmRlc3RyZWc7CisgICAgICAgICpkZXN0cmVnID0gdG1wOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworICAgICAgICAgICAgdTMyIGRlc3R2YWwsdG1wOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisgICAgICAgICAgICBkZXN0dmFsID0gdG1wOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisgICAgICAgICAgICB1MTYgZGVzdHZhbCx0bXA7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRtcCA9ICpzcmNyZWc7CisgICAgICAgICAgICAqc3JjcmVnID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGRlc3R2YWwgPSB0bXA7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworICAgICAgICAgICAgdTMyIGRlc3R2YWwsdG1wOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisgICAgICAgICAgICBkZXN0dmFsID0gdG1wOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisgICAgICAgICAgICB1MTYgZGVzdHZhbCx0bXA7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRtcCA9ICpzcmNyZWc7CisgICAgICAgICAgICAqc3JjcmVnID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGRlc3R2YWwgPSB0bXA7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworICAgICAgICAgICAgdTMyIGRlc3R2YWwsdG1wOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisgICAgICAgICAgICBkZXN0dmFsID0gdG1wOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisgICAgICAgICAgICB1MTYgZGVzdHZhbCx0bXA7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRtcCA9ICpzcmNyZWc7CisgICAgICAgICAgICAqc3JjcmVnID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGRlc3R2YWwgPSB0bXA7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisgICAgICAgICAgICB1MzIgdG1wOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICB0bXAgPSAqc3JjcmVnOworICAgICAgICAgICAgKnNyY3JlZyA9ICpkZXN0cmVnOworICAgICAgICAgICAgKmRlc3RyZWcgPSB0bXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKyAgICAgICAgICAgIHUxNiB0bXA7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHRtcCA9ICpzcmNyZWc7CisgICAgICAgICAgICAqc3JjcmVnID0gKmRlc3RyZWc7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgKnNyY3JlZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgKnNyY3JlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgKnNyY3JlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsICpzcmNyZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fU1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHUxNiBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICpzcmNyZWc7CisgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAqc3JjcmVnOworICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKnNyY3JlZzsKKyAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xlYV93b3JkX1JfTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHUxNiAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworLyoKKyAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIGFkZHJlc3Mgc2l6ZSBwcmVmaXghCisgKgorICogbGVhICBlYXgsW2VheCtlYngqMl0gPz8KKyAqLworICAgIAorICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEVBXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqc3JjcmVnID0gKHUxNilkZXN0b2Zmc2V0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpzcmNyZWcgPSAodTE2KWRlc3RvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIC8qIHVuZGVmaW5lZC4gIERvIG5vdGhpbmcuICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfU1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTE2IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qCisgICAgICogQ2xlYW4gdXAsIGFuZCByZXNldCBhbGwgdGhlIFJfeFNQIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0CisgICAgICogbG9jYXRpb25zLiAgVGhpcyBpcyBhYm91dCAzeCB0b28gbXVjaCBvdmVyaGVhZCAoZG9pbmcgYWxsIHRoZQorICAgICAqIHNlZ3JlZyBwdHJzIHdoZW4gb25seSBvbmUgaXMgbmVlZGVkLCBidXQgdGhpcyBpbnN0cnVjdGlvbgorICAgICAqICpjYW5ub3QqIGJlIHRoYXQgY29tbW9uLCBhbmQgdGhpcyBpc24ndCB0b28gbXVjaCB3b3JrIGFueXdheS4KKyAgICAgKi8KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKHJoICE9IDApIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIDhGXG4iKTsKKyAgICAgICAgSEFMVF9TWVMoKTsKKyAgICB9CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gcG9wX2xvbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBwb3Bfd29yZCgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5MAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfbm9wKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk5PUFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5MQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVDWFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0QVgsQ1hcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICB0bXAgPSBNLng4Ni5SX0VBWDsKKyAgICAgICAgTS54ODYuUl9FQVggPSBNLng4Ni5SX0VDWDsKKyAgICAgICAgTS54ODYuUl9FQ1ggPSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gTS54ODYuUl9BWDsKKyAgICAgICAgTS54ODYuUl9BWCA9IE0ueDg2LlJfQ1g7CisgICAgICAgIE0ueDg2LlJfQ1ggPSAodTE2KXRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHRtcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFRFhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdEFYLERYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgdG1wID0gTS54ODYuUl9FQVg7CisgICAgICAgIE0ueDg2LlJfRUFYID0gTS54ODYuUl9FRFg7CisgICAgICAgIE0ueDg2LlJfRURYID0gdG1wOworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IE0ueDg2LlJfQVg7CisgICAgICAgIE0ueDg2LlJfQVggPSBNLng4Ni5SX0RYOworICAgICAgICBNLng4Ni5SX0RYID0gKHUxNil0bXA7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDkzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB0bXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRUJYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxCWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIHRtcCA9IE0ueDg2LlJfRUFYOworICAgICAgICBNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRUJYOworICAgICAgICBNLng4Ni5SX0VCWCA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBNLng4Ni5SX0FYOworICAgICAgICBNLng4Ni5SX0FYID0gTS54ODYuUl9CWDsKKyAgICAgICAgTS54ODYuUl9CWCA9ICh1MTYpdG1wOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5NAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVTUFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0QVgsU1BcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICB0bXAgPSBNLng4Ni5SX0VBWDsKKyAgICAgICAgTS54ODYuUl9FQVggPSBNLng4Ni5SX0VTUDsKKyAgICAgICAgTS54ODYuUl9FU1AgPSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gTS54ODYuUl9BWDsKKyAgICAgICAgTS54ODYuUl9BWCA9IE0ueDg2LlJfU1A7CisgICAgICAgIE0ueDg2LlJfU1AgPSAodTE2KXRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHRtcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFQlBcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdEFYLEJQXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgdG1wID0gTS54ODYuUl9FQVg7CisgICAgICAgIE0ueDg2LlJfRUFYID0gTS54ODYuUl9FQlA7CisgICAgICAgIE0ueDg2LlJfRUJQID0gdG1wOworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IE0ueDg2LlJfQVg7CisgICAgICAgIE0ueDg2LlJfQVggPSBNLng4Ni5SX0JQOworICAgICAgICBNLng4Ni5SX0JQID0gKHUxNil0bXA7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDk2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB0bXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRVNJXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxTSVxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIHRtcCA9IE0ueDg2LlJfRUFYOworICAgICAgICBNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRVNJOworICAgICAgICBNLng4Ni5SX0VTSSA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBNLng4Ni5SX0FYOworICAgICAgICBNLng4Ni5SX0FYID0gTS54ODYuUl9TSTsKKyAgICAgICAgTS54ODYuUl9TSSA9ICh1MTYpdG1wOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVESVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiWENIR1x0QVgsRElcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICB0bXAgPSBNLng4Ni5SX0VBWDsKKyAgICAgICAgTS54ODYuUl9FQVggPSBNLng4Ni5SX0VESTsKKyAgICAgICAgTS54ODYuUl9FREkgPSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gTS54ODYuUl9BWDsKKyAgICAgICAgTS54ODYuUl9BWCA9IE0ueDg2LlJfREk7CisgICAgICAgIE0ueDg2LlJfREkgPSAodTE2KXRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Nidyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiQ1dERVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiQ0JXXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKKyAgICAgICAgICAgIE0ueDg2LlJfRUFYIHw9IDB4ZmZmZjAwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNLng4Ni5SX0VBWCAmPSAweDAwMDBmZmZmOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE0ueDg2LlJfQUwgJiAweDgwKSB7CisgICAgICAgICAgICBNLng4Ni5SX0FIID0gMHhmZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE0ueDg2LlJfQUggPSAweDA7CisgICAgICAgIH0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2N3ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiQ0RRXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJDV0RcbiIpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGKCJDV0RcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIGlmIChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgIE0ueDg2LlJfRURYID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE0ueDg2LlJfRURYID0gMHgwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKKyAgICAgICAgICAgIE0ueDg2LlJfRFggPSAweGZmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNLng4Ni5SX0RYID0gMHgwOworICAgICAgICB9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jYWxsX2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBmYXJzZWcsIGZhcm9mZjsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJZmFyb2ZmID0gZmV0Y2hfd29yZF9pbW0oKTsKKwlmYXJzZWcgPSBmZXRjaF93b3JkX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGZhcnNlZyk7CisJREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGZhcm9mZik7CisJQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIGZhcnNlZywgZmFyb2ZmLCAiRkFSICIpOworCisgICAgLyogWFhYCisgICAgICogCisgICAgICogSG9va2VkIGludGVycnVwdCB2ZWN0b3JzIGNhbGxpbmcgaW50byBvdXIgIkJJT1MiIHdpbGwgY2F1c2UKKyAgICAgKiBwcm9ibGVtcyB1bmxlc3MgYWxsIGludGVyc2VnbWVudCBzdHVmZiBpcyBjaGVja2VkIGZvciBCSU9TCisgICAgICogYWNjZXNzLiAgQ2hlY2sgbmVlZGVkIGhlcmUuICBGb3IgbW9tZW50LCBsZXQgaXQgYWxvbmUuCisgICAgICovCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgTS54ODYuUl9DUyA9IGZhcnNlZzsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgTS54ODYuUl9JUCA9IGZhcm9mZjsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfd2FpdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJXQUlUIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAvKiBOQURBLiAgKi8KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaGZfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIGZsYWdzOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiUFVTSEZEXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIRlxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisKKyAgICAvKiBjbGVhciBvdXQgKmFsbCogYml0cyBub3QgcmVwcmVzZW50aW5nIGZsYWdzLCBhbmQgdHVybiBvbiByZWFsIGJpdHMgKi8KKyAgICBmbGFncyA9IChNLng4Ni5SX0VGTEcgJiBGX01TSykgfCBGX0FMV0FZU19PTjsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgcHVzaF9sb25nKGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoKHUxNilmbGFncyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlBPUEZEXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJQT1BGXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FRkxHID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0ZMRyA9IHBvcF93b3JkKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDllCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zYWhmKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNBSEZcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgLyogY2xlYXIgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIGZsYWcgcmVnaXN0ZXIgKi8KKyAgICBNLng4Ni5SX0ZMRyAmPSAweGZmZmZmZjAwOworICAgIC8qIG9yIGluIHRoZSBBSCByZWdpc3RlciBpbnRvIHRoZSBmbGFncyByZWdpc3RlciAqLworICAgIE0ueDg2LlJfRkxHIHw9IE0ueDg2LlJfQUg7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xhaGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEFIRlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwlNLng4Ni5SX0FIID0gKHU4KShNLng4Ni5SX0ZMRyAmIDB4ZmYpOworICAgIC8qdW5kb2N1bWVudGVkIFRDKysgYmVoYXZpb3I/Pz8gTm9wZS4gIEl0J3MgZG9jdW1lbnRlZCwgYnV0CisgICAgICAgeW91IGhhdmUgdG9vIGxvb2sgcmVhbCBoYXJkIHRvIG5vdGljZSBpdC4gKi8KKyAgICBNLng4Ni5SX0FIIHw9IDB4MjsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X0FMX01fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEFMLCIpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIlslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUob2Zmc2V0KTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X0FYX01fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGMigiTU9WXHRFQVgsWyUwNHhdXG4iLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCJNT1ZcdEFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQVggPSBmZXRjaF9kYXRhX2xvbmcob2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FYID0gZmV0Y2hfZGF0YV93b3JkKG9mZnNldCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfTV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdLEFMXG4iLCBvZmZzZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgc3RvcmVfZGF0YV9ieXRlKG9mZnNldCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9NX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEVBWFxuIiwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGMigiTU9WXHRbJTA0eF0sQVhcbiIsIG9mZnNldCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhvZmZzZXQsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdG9yZV9kYXRhX3dvcmQob2Zmc2V0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggIHZhbDsKKyAgICB1MzIgY291bnQ7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WU1x0QllURVxuIik7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKyAgICAgICAgaW5jID0gLTE7CisgICAgZWxzZQorICAgICAgICBpbmMgPSAxOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKyAgICAgICAgLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgY291bnQgPSBNLng4Ni5SX0NYOworICAgICAgICBNLng4Ni5SX0NYID0gMDsKKyAgICAgICAgTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfQorICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIHZhbCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCB2YWwpOworICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICAgICAgTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB2YWw7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZTXHREV09SRFxuIik7CisgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgICAvKiBkb3duICovCisgICAgICAgICAgICBpbmMgPSAtNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZTXHRXT1JEXG4iKTsKKyAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgICAgIC8qIGRvd24gKi8KKyAgICAgICAgICAgIGluYyA9IC0yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisgICAgICAgIC8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIGNvdW50ID0gTS54ODYuUl9DWDsKKyAgICAgICAgTS54ODYuUl9DWCA9IDA7CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHZhbCA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgKHUxNil2YWwpOworICAgICAgICB9CisgICAgICAgIE0ueDg2LlJfU0kgKz0gaW5jOworICAgICAgICBNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NtcHNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggdmFsMSwgdmFsMjsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTVBTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgIGluYyA9IC0xOworICAgIGVsc2UKKyAgICAgICAgaW5jID0gMTsKKworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworICAgICAgICAvKiBSRVBFICAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworICAgICAgICAgICAgdmFsMSA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgICAgICAgICAgY21wX2J5dGUodmFsMSwgdmFsMik7CisgICAgICAgICAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICAgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKKyAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgeworICAgICAgICAvKiBSRVBORSAgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIHdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKyAgICAgICAgICAgIHZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisgICAgICAgICAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgIGNtcF9ieXRlKHZhbDEsIHZhbDIpOworICAgICAgICAgICAgTS54ODYuUl9DWCAtPSAxOworICAgICAgICAgICAgTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgICAgICBNLng4Ni5SX0RJICs9IGluYzsKKyAgICAgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLworICAgICAgICB9CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisgICAgICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICBjbXBfYnl0ZSh2YWwxLCB2YWwyKTsKKyAgICAgICAgTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY21wc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgdmFsMSx2YWwyOworICAgIGludCBpbmM7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJDTVBTXHREV09SRFxuIik7CisgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgICAgICBpbmMgPSAtNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJDTVBTXHRXT1JEXG4iKTsKKyAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKyAgICAgICAgICAgIGluYyA9IC0yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworICAgICAgICAvKiBSRVBFICAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgICAgICB2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgICAgICBjbXBfbG9uZyh2YWwxLCB2YWwyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgICAgICB2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgICAgICBjbXBfd29yZCgodTE2KXZhbDEsICh1MTYpdmFsMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICAgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKKyAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgeworICAgICAgICAvKiBSRVBORSAgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIHdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisgICAgICAgICAgICAgICAgY21wX2xvbmcodmFsMSwgdmFsMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbDEgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisgICAgICAgICAgICAgICAgY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTS54ODYuUl9DWCAtPSAxOworICAgICAgICAgICAgTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgICAgICBNLng4Ni5SX0RJICs9IGluYzsKKyAgICAgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLworICAgICAgICB9CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKKyAgICAgICAgICAgIHZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgY21wX2xvbmcodmFsMSwgdmFsMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworICAgICAgICAgICAgdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisgICAgICAgICAgICBjbXBfd29yZCgodTE2KXZhbDEsICh1MTYpdmFsMik7CisgICAgICAgIH0KKyAgICAgICAgTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEFMLCIpOworICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwl0ZXN0X2J5dGUoTS54ODYuUl9BTCwgKHU4KWltbSk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3Rlc3RfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiVEVTVFx0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgdGVzdF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3Rfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdG9zX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbmM7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNUT1NcdEJZVEVcbiIpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgIGluYyA9IC0xOworICAgIGVsc2UKKyAgICAgICAgaW5jID0gMTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKyAgICAgICAgLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FMKTsKKyAgICAgICAgICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICAgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICB9CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3Rvc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworICAgIHUzMiBjb3VudDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlNUT1NcdERXT1JEXG4iKTsKKyAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKyAgICAgICAgICAgIGluYyA9IC00OworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmMgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlNUT1NcdFdPUkRcbiIpOworICAgICAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworICAgICAgICAgICAgaW5jID0gLTI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluYyA9IDI7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKyAgICAgICAgLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgY291bnQgPSBNLng4Ni5SX0NYOworICAgICAgICBNLng4Ni5SX0NYID0gMDsKKyAgICAgICAgTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfQorICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0VBWCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQVgpOworICAgICAgICB9CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9kc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT0RTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgIGluYyA9IC0xOworICAgIGVsc2UKKyAgICAgICAgaW5jID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisgICAgICAgIC8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIHdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKyAgICAgICAgICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisgICAgICAgICAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICAgICAgfQorICAgICAgICBNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOworICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvZHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJMT0RTXHREV09SRFxuIik7CisgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgICAgICBpbmMgPSAtNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJMT0RTXHRXT1JEXG4iKTsKKyAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKyAgICAgICAgICAgIGluYyA9IC0yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisgICAgICAgIC8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIGNvdW50ID0gTS54ODYuUl9DWDsKKyAgICAgICAgTS54ODYuUl9DWCA9IDA7CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIE0ueDg2LlJfRUFYID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKyAgICAgICAgfQorICAgICAgICBNLng4Ni5SX1NJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NjYXNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggdmFsMjsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTQ0FTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgIGluYyA9IC0xOworICAgIGVsc2UKKyAgICAgICAgaW5jID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpIHsKKyAgICAgICAgLyogUkVQRSAgKi8KKyAgICAgICAgLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisgICAgICAgIHdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKyAgICAgICAgICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisgICAgICAgICAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgICAgICAgICBNLng4Ni5SX0RJICs9IGluYzsKKyAgICAgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7CisgICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKKyAgICAgICAgLyogUkVQTkUgICovCisgICAgICAgIC8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworICAgICAgICB3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisgICAgICAgICAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOworICAgICAgICAgICAgTS54ODYuUl9DWCAtPSAxOworICAgICAgICAgICAgTS54ODYuUl9ESSArPSBpbmM7CisgICAgICAgICAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KKyAgICAgICAgfQorICAgICAgICBNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Nhc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworICAgIHUzMiB2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJTQ0FTXHREV09SRFxuIik7CisgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisgICAgICAgICAgICBpbmMgPSAtNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJTQ0FTXHRXT1JEXG4iKTsKKyAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKyAgICAgICAgICAgIGluYyA9IC0yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworICAgICAgICAvKiBSRVBFICAqLworICAgICAgICAvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKyAgICAgICAgd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgICAgICBjbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKyAgICAgICAgICAgICAgICBjbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgICAgICAgICBNLng4Ni5SX0RJICs9IGluYzsKKyAgICAgICAgICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7CisgICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKKyAgICAgICAgLyogUkVQTkUgICovCisgICAgICAgIC8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworICAgICAgICB3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgICAgIGNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgICAgIGNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICAgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICAgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCisgICAgICAgIH0KKyAgICAgICAgTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworICAgICAgICAgICAgY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOworICAgICAgICB9CisgICAgICAgIE0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhiMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUwsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGIxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9DTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHRDTCwiKTsKKyAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ0wgPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YjIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9ieXRlX0RMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggaW1tOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdERMLCIpOworICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9ETCA9IGltbTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhiMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQkxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QkwsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0JMID0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGI0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9BSF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHRBSCwiKTsKKyAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUggPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YjUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9ieXRlX0NIX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggaW1tOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdENILCIpOworICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9DSCA9IGltbTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhiNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfREhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0REgsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0RIID0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGI3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9CSF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHRCSCwiKTsKKyAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQkggPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0RUFYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QVgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FYID0gKHUxNilzcmN2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGI5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9DWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEVDWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdENYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FQ1ggPSBzcmN2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9DWCA9ICh1MTYpc3JjdmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhiYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfRFhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiTU9WXHRFRFgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiTU9WXHREWCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRURYID0gc3JjdmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfRFggPSAodTE2KXNyY3ZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YmIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX0JYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0RUJYLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QlgsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VCWCA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0JYID0gKHUxNilzcmN2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGJjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TUF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEVTUCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdFNQLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FU1AgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9TUCA9ICh1MTYpc3JjdmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhiZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfQlBfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiTU9WXHRFQlAsIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiTU9WXHRCUCwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUJQID0gc3JjdmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE0ueDg2LlJfQlAgPSAodTE2KXNyY3ZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1NJX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0RVNJLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk1PVlx0U0ksIik7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VTSSA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX1NJID0gKHUxNilzcmN2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGJmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9ESV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEVESSwiKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJNT1ZcdERJLCIpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgTS54ODYuUl9FREkgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9ESSA9ICh1MTYpc3JjdmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIHVzZWQgYnkgb3Bjb2RlcyBjMCwgZDAsIGFuZCBkMi4gKi8KK3N0YXRpYyB1OCgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bXSkodTggZCwgdTggcykgPQoreworICAgIHJvbF9ieXRlLAorICAgIHJvcl9ieXRlLAorICAgIHJjbF9ieXRlLAorICAgIHJjcl9ieXRlLAorICAgIHNobF9ieXRlLAorICAgIHNocl9ieXRlLAorICAgIHNobF9ieXRlLCAgICAgICAgICAgLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX2J5dGUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggYW10OworCisgICAgLyoKKyAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKKyAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAorICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKyAgICAgICAgLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKyAgICAgICAgICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKyAgICAgICAgICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlIAorICAgICAgICAgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworICAgICAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIHVzZWQgYnkgb3Bjb2RlcyBjMSwgZDEsIGFuZCBkMy4gKi8KK3N0YXRpYyB1MTYoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBzLCB1OCBkKSA9Cit7CisgICAgcm9sX3dvcmQsCisgICAgcm9yX3dvcmQsCisgICAgcmNsX3dvcmQsCisgICAgcmNyX3dvcmQsCisgICAgc2hsX3dvcmQsCisgICAgc2hyX3dvcmQsCisgICAgc2hsX3dvcmQsICAgICAgICAgICAvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KKyAgICBzYXJfd29yZCwKK307CisKKy8qIHVzZWQgYnkgb3Bjb2RlcyBjMSwgZDEsIGFuZCBkMy4gKi8KK3N0YXRpYyB1MzIgKCpvcGNEMV9sb25nX29wZXJhdGlvbltdKSh1MzIgcywgdTggZCkgPQoreworICAgIHJvbF9sb25nLAorICAgIHJvcl9sb25nLAorICAgIHJjbF9sb25nLAorICAgIHJjcl9sb25nLAorICAgIHNobF9sb25nLAorICAgIHNocl9sb25nLAorICAgIHNobF9sb25nLCAgICAgICAgICAgLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX2xvbmcsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGFtdDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisgICAgICAgIC8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisgICAgICAgICAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisgICAgICAgICAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZSAKKyAgICAgICAgICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVUXHQiKTsKKyAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwlSRVRVUk5fVFJBQ0UoIlJFVCIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9TUCArPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9uZWFyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVFxuIik7CisJUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZXNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEVTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIC8qIFVOREVGSU5FRCEgKi8KKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xkc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRFNcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogVU5ERUZJTkVEISAqLworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChyaCAhPSAwKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSBjNlxuIik7CisgICAgICAgIEhBTFRfU1lTKCk7CisgICAgfQorICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICBERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGltbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBpbW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IGltbTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAocmggIT0gMCkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgOEZcbiIpOworICAgICAgICBIQUxUX1NZUygpOworICAgIH0KKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgaW1tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGltbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBpbW07CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBpbW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgaW1tKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGltbTsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgaW1tOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJCXUzMiAqZGVzdHJlZzsKKwkJCXUzMiBpbW07CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGltbTsKKyAgICAgICAgfSBlbHNlIHsKKwkJCXUxNiAqZGVzdHJlZzsKKwkJCXUxNiBpbW07CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGltbTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2VudGVyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgbG9jYWwsZnJhbWVfcG9pbnRlcjsKKyAgICB1OCAgbmVzdGluZzsKKyAgICBpbnQgaTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgbG9jYWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIG5lc3RpbmcgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCJFTlRFUiAleFxuIiwgbG9jYWwpOworICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIG5lc3RpbmcpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQlApOworICAgIGZyYW1lX3BvaW50ZXIgPSBNLng4Ni5SX1NQOworICAgIGlmIChuZXN0aW5nID4gMCkgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbmVzdGluZzsgaSsrKSB7CisgICAgICAgICAgICBNLng4Ni5SX0JQIC09IDI7CisgICAgICAgICAgICBwdXNoX3dvcmQoZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX1NTLCBNLng4Ni5SX0JQKSk7CisgICAgICAgICAgICB9CisgICAgICAgIHB1c2hfd29yZChmcmFtZV9wb2ludGVyKTsKKyAgICAgICAgfQorICAgIE0ueDg2LlJfQlAgPSBmcmFtZV9wb2ludGVyOworICAgIE0ueDg2LlJfU1AgPSAodTE2KShNLng4Ni5SX1NQIC0gbG9jYWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZWF2ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRUFWRVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX1NQID0gTS54ODYuUl9CUDsKKyAgICBNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcmV0X2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVEZcdCIpOworICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCVJFVFVSTl9UUkFDRSgiUkVURiIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9TUCArPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9mYXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVURlxuIik7CisJUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW50Myh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRtcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5UIDNcbiIpOworICAgIHRtcCA9ICh1MTYpIG1lbV9hY2Nlc3Nfd29yZCgzICogNCArIDIpOworICAgIC8qIGFjY2VzcyB0aGUgc2VnbWVudCByZWdpc3RlciAqLworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJaWYgKF9YODZFTVVfaW50clRhYlszXSkgeworCQkoKl9YODZFTVVfaW50clRhYlszXSkoMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworICAgICAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgICAgICBDTEVBUl9GTEFHKEZfVEYpOworICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQgKyAyKTsKKyAgICAgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgICAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKDMgKiA0KTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ludF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0bXA7CisgICAgdTggaW50bnVtOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlRcdCIpOworICAgIGludG51bSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbnRudW0pOworICAgIHRtcCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwlpZiAoX1g4NkVNVV9pbnRyVGFiW2ludG51bV0pIHsKKwkJKCpfWDg2RU1VX2ludHJUYWJbaW50bnVtXSkoaW50bnVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisgICAgICAgIENMRUFSX0ZMQUcoRl9JRik7CisgICAgICAgIENMRUFSX0ZMQUcoRl9URik7CisgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKyAgICAgICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7CisgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKKyAgICAgICAgTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0KTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ludG8odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0bXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOVE9cbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSB7CisgICAgICAgIHRtcCA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOworCQlpZiAoX1g4NkVNVV9pbnRyVGFiWzRdKSB7CisJCQkoKl9YODZFTVVfaW50clRhYls0XSkoNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisgICAgICAgICAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX1RGKTsKKyAgICAgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKyAgICAgICAgICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQgKyAyKTsKKyAgICAgICAgICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKKyAgICAgICAgICAgIE0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQpOworICAgICAgICB9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pcmV0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklSRVRcbiIpOworCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworICAgICAgICAvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorICAgICAgICAgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworICAgICAgICAgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKyAgICAgICAgICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7CisgICAgICAgICpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNEMV93b3JkX1JNXzEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworICAgICAgICAvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorICAgICAgICAgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworICAgICAgICAgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKyAgICAgICAgICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQl1MzIgZGVzdHZhbDsKKwkJCXUzMiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgICAgIH0gZWxzZSB7CisJCQl1MTYgZGVzdHZhbDsKKwkJCXUxNiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNEMl9ieXRlX1JNX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggYW10OworCisgICAgLyoKKyAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKKyAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAorICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKyAgICAgICAgLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKyAgICAgICAgICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKyAgICAgICAgICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlIAorICAgICAgICAgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBhbXQgPSBNLng4Ni5SX0NMOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworICAgICAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworICAgICAgICAvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorICAgICAgICAgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworICAgICAgICAgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUgCisgICAgICAgICAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGFtdCA9IE0ueDg2LlJfQ0w7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWFtKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBhOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBQU1cbiIpOworICAgIGEgPSBmZXRjaF9ieXRlX2ltbSgpOyAgICAgIC8qIHRoaXMgaXMgYSBzdHVwaWQgZW5jb2RpbmcuICovCisgICAgaWYgKGEgIT0gMTApIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiRVJST1IgREVDT0RJTkcgQUFNXG4iKTsKKyAgICAgICAgVFJBQ0VfUkVHUygpOworICAgICAgICBIQUxUX1NZUygpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIC8qIG5vdGUgdGhlIHR5cGUgY2hhbmdlIGhlcmUgLS0tIHJldHVybmluZyBBTCBhbmQgQUggaW4gQVguICovCisgICAgTS54ODYuUl9BWCA9IGFhbV93b3JkKE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQ1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hYWQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGE7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBRFxuIik7CisgICAgYSA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FYID0gYWFkX3dvcmQoTS54ODYuUl9BWCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKiBvcGNvZGUgMHhkNiBJTExFR0FMIE9QQ09ERSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hsYXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBhZGRyOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYTEFUXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCWFkZHIgPSAodTE2KShNLng4Ni5SX0JYICsgKHU4KU0ueDg2LlJfQUwpOworICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoYWRkcik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKiBpbnN0dWN0aW9ucyAgRDggLi4gREYgYXJlIGluIGk4N19vcHMuYyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvb3BuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT09QTkVcdCIpOworICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICBpZiAoTS54ODYuUl9DWCAhPSAwICYmICFBQ0NFU1NfRkxBRyhGX1pGKSkgICAgICAvKiBDWCAhPSAwIGFuZCAhWkYgKi8KKyAgICAgICAgTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb29wZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT09QRVx0Iik7CisgICAgaXAgPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgaXAgKz0gKHMxNikgTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9DWCAtPSAxOworICAgIGlmIChNLng4Ni5SX0NYICE9IDAgJiYgQUNDRVNTX0ZMQUcoRl9aRikpICAgICAgIC8qIENYICE9IDAgYW5kIFpGICovCisgICAgICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9vcCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT09QXHQiKTsKKyAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCkKKyAgICAgICAgTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qY3h6KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdGFyZ2V0OworICAgIHM4ICBvZmZzZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKQ1haXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYuUl9DWCA9PSAwKQorICAgICAgICBNLng4Ni5SX0lQID0gdGFyZ2V0OworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGU0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5cdCIpOworCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4LEFMXG4iLCBwb3J0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKHBvcnQpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGU1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5cdCIpOworCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCJFQVgsJXhcbiIsIHBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCJBWCwleFxuIiwgcG9ydCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIE0ueDg2LlJfRUFYID0gKCpzeXNfaW5sKShwb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBNLng4Ni5SX0FYID0gKCpzeXNfaW53KShwb3J0KTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleCxBTFxuIiwgcG9ydCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAoKnN5c19vdXRiKShwb3J0LCBNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJPVVRcdCIpOworCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIleCxFQVhcbiIsIHBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYyKCIleCxBWFxuIiwgcG9ydCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICgqc3lzX291dGwpKHBvcnQsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworICAgICAgICAoKnN5c19vdXR3KShwb3J0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NhbGxfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJaXAgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOworCWlwICs9IChzMTYpIE0ueDg2LlJfSVA7ICAgIC8qIENIRUNLIFNJR04gKi8KKwlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworCUNBTExfVFJBQ0UoTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCBNLng4Ni5SX0NTLCBpcCwgIiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIGlwID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOworICAgIGlwICs9IChzMTYpTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9ICh1MTYpaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGNzLCBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk1QXHRGQVIgIik7CisgICAgaXAgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIGNzID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eDoiLCBjcyk7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBNLng4Ni5SX0NTID0gY3M7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0YXJnZXQ7CisgICAgczggb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5cdEFMLERYXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKE0ueDg2LlJfRFgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTlx0RUFYLERYXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNPREVfUFJJTlRGKCJJTlx0QVgsRFhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICBNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkoTS54ODYuUl9EWCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTS54ODYuUl9BWCA9ICgqc3lzX2ludykoTS54ODYuUl9EWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRfYnl0ZV9EWF9BTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJPVVRcdERYLEFMXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICgqc3lzX291dGIpKE0ueDg2LlJfRFgsIE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGVmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRfd29yZF9EWF9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgREVDT0RFX1BSSU5URigiT1VUXHREWCxFQVhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQ09ERV9QUklOVEYoIk9VVFx0RFgsQVhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAoKnN5c19vdXRsKShNLng4Ni5SX0RYLCBNLng4Ni5SX0VBWCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKCpzeXNfb3V0dykoTS54ODYuUl9EWCwgTS54ODYuUl9BWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb2NrKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPQ0s6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLypvcGNvZGUgMHhmMSBJTExFR0FMIE9QRVJBVElPTiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JlcG5lKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFUE5FXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfUkVQTkU7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JlcGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVQRVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUEU7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2hhbHQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSEFMVFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBIQUxUX1NZUygpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbWModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGNvbXBsZW1lbnQgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTUNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgVE9HR0xFX0ZMQUcoRl9DRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbCwgc3JjdmFsOworCisgICAgLyogbG9uZywgZHJhd24gb3V0IGNvZGUgZm9sbG93cy4gIERvdWJsZSBzd2l0Y2ggZm9yIGEgdG90YWwKKyAgICAgICBvZiAzMiBjYXNlcy4gICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMCAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjZcbiIpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIG11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAwICovCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMSAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDEgUkg9MDEgT1A9RjZcbiIpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIG11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAxICovCisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMCAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MTAgUkg9MDEgT1A9RjZcbiIpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIG11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7CisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTEwICovCisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMSAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgdGVzdF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKyAgICAgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTk9UXHQiKTsKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gbm90X2J5dGUoKmRlc3RyZWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0Iik7CisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IG5lZ19ieXRlKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJNVUxcdCIpOworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgbXVsX2J5dGUoKmRlc3RyZWcpOyAgICAgIC8qISEhICAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9ieXRlKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJESVZcdCIpOworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGl2X2J5dGUoKmRlc3RyZWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklESVZcdCIpOworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaWRpdl9ieXRlKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTExICovCisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGN193b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgLyogbG9uZywgZHJhd24gb3V0IGNvZGUgZm9sbG93cy4gIERvdWJsZSBzd2l0Y2ggZm9yIGEgdG90YWwKKyAgICAgICBvZiAzMiBjYXNlcy4gICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMCAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbCxzcmN2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsLHNyY3ZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIHRlc3Rfd29yZChkZXN0dmFsLCBzcmN2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKKyAgICAgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJOT1RcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJOT1RcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gbm90X3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTkVHXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTkVHXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IG5lZ193b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk1VTFx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBtdWxfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJNVUxcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBtdWxfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgaW11bF9sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklNVUxcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpbXVsX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJESVZcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGl2X2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRElWXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGl2X3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGlkaXZfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgaWRpdl93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MDAgKi8KKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTAxICovCisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgIC8qIHRlc3Qgd29yZCBpbW0gKi8KKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsLHNyY3ZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgc3JjdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWwsc3JjdmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiVEVTVFx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDEgUkg9MDEgT1A9RjZcbiIpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5PVFx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gbm90X2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5PVFx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBub3Rfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJORUdcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IG5lZ19sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJORUdcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gbmVnX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTVVMXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIG11bF9sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk1VTFx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIG11bF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSU1VTFx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpbXVsX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSU1VTFx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGltdWxfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkaXZfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJESVZcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkaXZfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklESVZcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgaWRpdl9sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklESVZcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpZGl2X3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0wMSAqLworICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MTAgKi8KKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICBjYXNlIDA6ICAgICAgICAgLyogdGVzdCB3b3JkIGltbSAqLworICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWwsc3JjdmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiVEVTVFx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIHRlc3RfbG9uZyhkZXN0dmFsLCBzcmN2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbCxzcmN2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJURVNUXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgc3JjdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0xMCBSSD0wMSBPUD1GNlxuIik7CisgICAgICAgICAgICBIQUxUX1NZUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTk9UXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBub3RfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTk9UXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gbmVnX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk5FR1x0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJNVUxcdERXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgbXVsX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTVVMXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgbXVsX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTVVMXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGltdWxfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTVVMXHRXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgaW11bF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiRElWXHREV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRpdl9sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRpdl93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSURJVlx0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpZGl2X2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSURJVlx0V09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGlkaXZfd29yZChkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTEwICovCisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMSAqLworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgdGVzdF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgdGVzdF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKyAgICAgICAgICAgIEhBTFRfU1lTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyICpkZXN0cmVnOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTk9UXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICAqZGVzdHJlZyA9IG5vdF9sb25nKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworCisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiTk9UXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICAqZGVzdHJlZyA9IG5vdF93b3JkKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJORUdcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgICpkZXN0cmVnID0gbmVnX2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJORUdcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgICpkZXN0cmVnID0gbmVnX3dvcmQoKmRlc3RyZWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIk1VTFx0Iik7CisgICAgICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgbXVsX2xvbmcoKmRlc3RyZWcpOyAgICAgIC8qISEhICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJNVUxcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIG11bF93b3JkKCpkZXN0cmVnKTsgICAgICAvKiEhISAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpbXVsX2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpbXVsX3dvcmQoKmRlc3RyZWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRJVlx0Iik7CisgICAgICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGl2X2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJESVZcdCIpOworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIGRpdl93b3JkKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpZGl2X2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJRElWXHQiKTsKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBpZGl2X3dvcmQoKmRlc3RyZWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MTEgKi8KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBzZXQgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsaSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNMSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdGkodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGVuYWJsZSAgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNUSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0lGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2xkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ0xEXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIENMRUFSX0ZMQUcoRl9ERik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNURFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0RGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHU4IGRlc3R2YWw7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4ICpkZXN0cmVnOworCisgICAgLyogWWV0IGFub3RoZXIgc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworICAgICAgICAvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorICAgICAgICAgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworICAgICAgICAgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUgCisgICAgICAgICAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiREVDXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDU6CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIklMTEVHQUwgT1AgTUFKT1IgT1AgMHhGRSBNSU5PUiBPUCAleCBcbiIsIG1vZCk7CisgICAgICAgICAgICBIQUxUX1NZUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICBjYXNlIDA6ICAgICAgICAgLyogaW5jIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGRlYyB3b3JkIHB0ciAuLi4gKi8KKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGluY19ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGluY19ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IGluY19ieXRlKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBkZWNfYnl0ZSgqZGVzdHJlZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1aW50IGRlc3RvZmZzZXQgPSAwOworCXUxNiAqZGVzdHJlZzsKKwl1MTYgZGVzdHZhbCxkZXN0dmFsMjsKKworICAgIC8qIFlldCBhbm90aGVyIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbi4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKyAgICAgICAgLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKyAgICAgICAgICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKyAgICAgICAgICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisgICAgICAgICAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIklOQ1x0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTkNcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0RFdPUkQgUFRSICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJERUNcdFdPUkQgUFRSICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIkNBTExcdCAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJDQUxMXHRGQVIgIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ESU5HIE9GIE9QQ09ERSBGRlx0Iik7CisgICAgICAgICAgICBIQUxUX1NZUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiBpbmMgd29yZCBwdHIgLi4uICovCisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gaW5jX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogICAgICAgICAvKiBkZWMgd29yZCBwdHIgLi4uICovCisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgICAgICAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworICAgICAgICAgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIHB1c2hfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgcHVzaF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGluY193b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgICAgICAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworICAgICAgICAgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIHB1c2hfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgcHVzaF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGluY193b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKworICAgICAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgICAgICAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworICAgICAgICAgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiBkZXN0dmFsOworCisgICAgICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgIHB1c2hfbG9uZyhkZXN0dmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisKKyAgICAgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgcHVzaF93b3JkKGRlc3R2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKworICAgICAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgICAgICpkZXN0cmVnID0gaW5jX2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICAqZGVzdHJlZyA9IGluY193b3JkKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICAqZGVzdHJlZyA9IGRlY19sb25nKCpkZXN0cmVnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworCisgICAgICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAgICAgKmRlc3RyZWcgPSBkZWNfd29yZCgqZGVzdHJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAgICAgICAgIC8qIGNhbGwgd29yZCBwdHIgLi4uICovCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgICAgICAgICBNLng4Ni5SX0lQID0gKmRlc3RyZWc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiT1BFUkFUSU9OIFVOREVGSU5FRCAwWEZGIFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBqbXAgIC4uLiAqLworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgTS54ODYuUl9JUCA9ICh1MTYpICgqZGVzdHJlZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiT1BFUkFUSU9OIFVOREVGSU5FRCAwWEZGIFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgSEFMVF9TWVMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBwdXNoX2xvbmcoKmRlc3RyZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisKKyAgICAgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICAgICBwdXNoX3dvcmQoKmRlc3RyZWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2luZ2xlIGJ5dGUgb3BlcmF0aW9uIGNvZGUgdGFibGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICgqeDg2ZW11X29wdGFiWzI1Nl0pKHU4KSA9Cit7CisvKiAgMHgwMCAqLyB4ODZlbXVPcF9hZGRfYnl0ZV9STV9SLAorLyogIDB4MDEgKi8geDg2ZW11T3BfYWRkX3dvcmRfUk1fUiwKKy8qICAweDAyICovIHg4NmVtdU9wX2FkZF9ieXRlX1JfUk0sCisvKiAgMHgwMyAqLyB4ODZlbXVPcF9hZGRfd29yZF9SX1JNLAorLyogIDB4MDQgKi8geDg2ZW11T3BfYWRkX2J5dGVfQUxfSU1NLAorLyogIDB4MDUgKi8geDg2ZW11T3BfYWRkX3dvcmRfQVhfSU1NLAorLyogIDB4MDYgKi8geDg2ZW11T3BfcHVzaF9FUywKKy8qICAweDA3ICovIHg4NmVtdU9wX3BvcF9FUywKKworLyogIDB4MDggKi8geDg2ZW11T3Bfb3JfYnl0ZV9STV9SLAorLyogIDB4MDkgKi8geDg2ZW11T3Bfb3Jfd29yZF9STV9SLAorLyogIDB4MGEgKi8geDg2ZW11T3Bfb3JfYnl0ZV9SX1JNLAorLyogIDB4MGIgKi8geDg2ZW11T3Bfb3Jfd29yZF9SX1JNLAorLyogIDB4MGMgKi8geDg2ZW11T3Bfb3JfYnl0ZV9BTF9JTU0sCisvKiAgMHgwZCAqLyB4ODZlbXVPcF9vcl93b3JkX0FYX0lNTSwKKy8qICAweDBlICovIHg4NmVtdU9wX3B1c2hfQ1MsCisvKiAgMHgwZiAqLyB4ODZlbXVPcF90d29fYnl0ZSwKKworLyogIDB4MTAgKi8geDg2ZW11T3BfYWRjX2J5dGVfUk1fUiwKKy8qICAweDExICovIHg4NmVtdU9wX2FkY193b3JkX1JNX1IsCisvKiAgMHgxMiAqLyB4ODZlbXVPcF9hZGNfYnl0ZV9SX1JNLAorLyogIDB4MTMgKi8geDg2ZW11T3BfYWRjX3dvcmRfUl9STSwKKy8qICAweDE0ICovIHg4NmVtdU9wX2FkY19ieXRlX0FMX0lNTSwKKy8qICAweDE1ICovIHg4NmVtdU9wX2FkY193b3JkX0FYX0lNTSwKKy8qICAweDE2ICovIHg4NmVtdU9wX3B1c2hfU1MsCisvKiAgMHgxNyAqLyB4ODZlbXVPcF9wb3BfU1MsCisKKy8qICAweDE4ICovIHg4NmVtdU9wX3NiYl9ieXRlX1JNX1IsCisvKiAgMHgxOSAqLyB4ODZlbXVPcF9zYmJfd29yZF9STV9SLAorLyogIDB4MWEgKi8geDg2ZW11T3Bfc2JiX2J5dGVfUl9STSwKKy8qICAweDFiICovIHg4NmVtdU9wX3NiYl93b3JkX1JfUk0sCisvKiAgMHgxYyAqLyB4ODZlbXVPcF9zYmJfYnl0ZV9BTF9JTU0sCisvKiAgMHgxZCAqLyB4ODZlbXVPcF9zYmJfd29yZF9BWF9JTU0sCisvKiAgMHgxZSAqLyB4ODZlbXVPcF9wdXNoX0RTLAorLyogIDB4MWYgKi8geDg2ZW11T3BfcG9wX0RTLAorCisvKiAgMHgyMCAqLyB4ODZlbXVPcF9hbmRfYnl0ZV9STV9SLAorLyogIDB4MjEgKi8geDg2ZW11T3BfYW5kX3dvcmRfUk1fUiwKKy8qICAweDIyICovIHg4NmVtdU9wX2FuZF9ieXRlX1JfUk0sCisvKiAgMHgyMyAqLyB4ODZlbXVPcF9hbmRfd29yZF9SX1JNLAorLyogIDB4MjQgKi8geDg2ZW11T3BfYW5kX2J5dGVfQUxfSU1NLAorLyogIDB4MjUgKi8geDg2ZW11T3BfYW5kX3dvcmRfQVhfSU1NLAorLyogIDB4MjYgKi8geDg2ZW11T3Bfc2Vnb3ZyX0VTLAorLyogIDB4MjcgKi8geDg2ZW11T3BfZGFhLAorCisvKiAgMHgyOCAqLyB4ODZlbXVPcF9zdWJfYnl0ZV9STV9SLAorLyogIDB4MjkgKi8geDg2ZW11T3Bfc3ViX3dvcmRfUk1fUiwKKy8qICAweDJhICovIHg4NmVtdU9wX3N1Yl9ieXRlX1JfUk0sCisvKiAgMHgyYiAqLyB4ODZlbXVPcF9zdWJfd29yZF9SX1JNLAorLyogIDB4MmMgKi8geDg2ZW11T3Bfc3ViX2J5dGVfQUxfSU1NLAorLyogIDB4MmQgKi8geDg2ZW11T3Bfc3ViX3dvcmRfQVhfSU1NLAorLyogIDB4MmUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0NTLAorLyogIDB4MmYgKi8geDg2ZW11T3BfZGFzLAorCisvKiAgMHgzMCAqLyB4ODZlbXVPcF94b3JfYnl0ZV9STV9SLAorLyogIDB4MzEgKi8geDg2ZW11T3BfeG9yX3dvcmRfUk1fUiwKKy8qICAweDMyICovIHg4NmVtdU9wX3hvcl9ieXRlX1JfUk0sCisvKiAgMHgzMyAqLyB4ODZlbXVPcF94b3Jfd29yZF9SX1JNLAorLyogIDB4MzQgKi8geDg2ZW11T3BfeG9yX2J5dGVfQUxfSU1NLAorLyogIDB4MzUgKi8geDg2ZW11T3BfeG9yX3dvcmRfQVhfSU1NLAorLyogIDB4MzYgKi8geDg2ZW11T3Bfc2Vnb3ZyX1NTLAorLyogIDB4MzcgKi8geDg2ZW11T3BfYWFhLAorCisvKiAgMHgzOCAqLyB4ODZlbXVPcF9jbXBfYnl0ZV9STV9SLAorLyogIDB4MzkgKi8geDg2ZW11T3BfY21wX3dvcmRfUk1fUiwKKy8qICAweDNhICovIHg4NmVtdU9wX2NtcF9ieXRlX1JfUk0sCisvKiAgMHgzYiAqLyB4ODZlbXVPcF9jbXBfd29yZF9SX1JNLAorLyogIDB4M2MgKi8geDg2ZW11T3BfY21wX2J5dGVfQUxfSU1NLAorLyogIDB4M2QgKi8geDg2ZW11T3BfY21wX3dvcmRfQVhfSU1NLAorLyogIDB4M2UgKi8geDg2ZW11T3Bfc2Vnb3ZyX0RTLAorLyogIDB4M2YgKi8geDg2ZW11T3BfYWFzLAorCisvKiAgMHg0MCAqLyB4ODZlbXVPcF9pbmNfQVgsCisvKiAgMHg0MSAqLyB4ODZlbXVPcF9pbmNfQ1gsCisvKiAgMHg0MiAqLyB4ODZlbXVPcF9pbmNfRFgsCisvKiAgMHg0MyAqLyB4ODZlbXVPcF9pbmNfQlgsCisvKiAgMHg0NCAqLyB4ODZlbXVPcF9pbmNfU1AsCisvKiAgMHg0NSAqLyB4ODZlbXVPcF9pbmNfQlAsCisvKiAgMHg0NiAqLyB4ODZlbXVPcF9pbmNfU0ksCisvKiAgMHg0NyAqLyB4ODZlbXVPcF9pbmNfREksCisKKy8qICAweDQ4ICovIHg4NmVtdU9wX2RlY19BWCwKKy8qICAweDQ5ICovIHg4NmVtdU9wX2RlY19DWCwKKy8qICAweDRhICovIHg4NmVtdU9wX2RlY19EWCwKKy8qICAweDRiICovIHg4NmVtdU9wX2RlY19CWCwKKy8qICAweDRjICovIHg4NmVtdU9wX2RlY19TUCwKKy8qICAweDRkICovIHg4NmVtdU9wX2RlY19CUCwKKy8qICAweDRlICovIHg4NmVtdU9wX2RlY19TSSwKKy8qICAweDRmICovIHg4NmVtdU9wX2RlY19ESSwKKworLyogIDB4NTAgKi8geDg2ZW11T3BfcHVzaF9BWCwKKy8qICAweDUxICovIHg4NmVtdU9wX3B1c2hfQ1gsCisvKiAgMHg1MiAqLyB4ODZlbXVPcF9wdXNoX0RYLAorLyogIDB4NTMgKi8geDg2ZW11T3BfcHVzaF9CWCwKKy8qICAweDU0ICovIHg4NmVtdU9wX3B1c2hfU1AsCisvKiAgMHg1NSAqLyB4ODZlbXVPcF9wdXNoX0JQLAorLyogIDB4NTYgKi8geDg2ZW11T3BfcHVzaF9TSSwKKy8qICAweDU3ICovIHg4NmVtdU9wX3B1c2hfREksCisKKy8qICAweDU4ICovIHg4NmVtdU9wX3BvcF9BWCwKKy8qICAweDU5ICovIHg4NmVtdU9wX3BvcF9DWCwKKy8qICAweDVhICovIHg4NmVtdU9wX3BvcF9EWCwKKy8qICAweDViICovIHg4NmVtdU9wX3BvcF9CWCwKKy8qICAweDVjICovIHg4NmVtdU9wX3BvcF9TUCwKKy8qICAweDVkICovIHg4NmVtdU9wX3BvcF9CUCwKKy8qICAweDVlICovIHg4NmVtdU9wX3BvcF9TSSwKKy8qICAweDVmICovIHg4NmVtdU9wX3BvcF9ESSwKKworLyogIDB4NjAgKi8geDg2ZW11T3BfcHVzaF9hbGwsCisvKiAgMHg2MSAqLyB4ODZlbXVPcF9wb3BfYWxsLAorLyogIDB4NjIgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBib3VuZCAqLworLyogIDB4NjMgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBhcnBsICovCisvKiAgMHg2NCAqLyB4ODZlbXVPcF9zZWdvdnJfRlMsCisvKiAgMHg2NSAqLyB4ODZlbXVPcF9zZWdvdnJfR1MsCisvKiAgMHg2NiAqLyB4ODZlbXVPcF9wcmVmaXhfZGF0YSwKKy8qICAweDY3ICovIHg4NmVtdU9wX3ByZWZpeF9hZGRyLAorCisvKiAgMHg2OCAqLyB4ODZlbXVPcF9wdXNoX3dvcmRfSU1NLAorLyogIDB4NjkgKi8geDg2ZW11T3BfaW11bF93b3JkX0lNTSwKKy8qICAweDZhICovIHg4NmVtdU9wX3B1c2hfYnl0ZV9JTU0sCisvKiAgMHg2YiAqLyB4ODZlbXVPcF9pbXVsX2J5dGVfSU1NLAorLyogIDB4NmMgKi8geDg2ZW11T3BfaW5zX2J5dGUsCisvKiAgMHg2ZCAqLyB4ODZlbXVPcF9pbnNfd29yZCwKKy8qICAweDZlICovIHg4NmVtdU9wX291dHNfYnl0ZSwKKy8qICAweDZmICovIHg4NmVtdU9wX291dHNfd29yZCwKKworLyogIDB4NzAgKi8geDg2ZW11T3BfanVtcF9uZWFyX08sCisvKiAgMHg3MSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTk8sCisvKiAgMHg3MiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfQiwKKy8qICAweDczICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OQiwKKy8qICAweDc0ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9aLAorLyogIDB4NzUgKi8geDg2ZW11T3BfanVtcF9uZWFyX05aLAorLyogIDB4NzYgKi8geDg2ZW11T3BfanVtcF9uZWFyX0JFLAorLyogIDB4NzcgKi8geDg2ZW11T3BfanVtcF9uZWFyX05CRSwKKworLyogIDB4NzggKi8geDg2ZW11T3BfanVtcF9uZWFyX1MsCisvKiAgMHg3OSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTlMsCisvKiAgMHg3YSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfUCwKKy8qICAweDdiICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OUCwKKy8qICAweDdjICovIHg4NmVtdU9wX2p1bXBfbmVhcl9MLAorLyogIDB4N2QgKi8geDg2ZW11T3BfanVtcF9uZWFyX05MLAorLyogIDB4N2UgKi8geDg2ZW11T3BfanVtcF9uZWFyX0xFLAorLyogIDB4N2YgKi8geDg2ZW11T3BfanVtcF9uZWFyX05MRSwKKworLyogIDB4ODAgKi8geDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0sCisvKiAgMHg4MSAqLyB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSwKKy8qICAweDgyICovIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NLAorLyogIDB4ODMgKi8geDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0sCisvKiAgMHg4NCAqLyB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUiwKKy8qICAweDg1ICovIHg4NmVtdU9wX3Rlc3Rfd29yZF9STV9SLAorLyogIDB4ODYgKi8geDg2ZW11T3BfeGNoZ19ieXRlX1JNX1IsCisvKiAgMHg4NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfUk1fUiwKKworLyogIDB4ODggKi8geDg2ZW11T3BfbW92X2J5dGVfUk1fUiwKKy8qICAweDg5ICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1IsCisvKiAgMHg4YSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9SX1JNLAorLyogIDB4OGIgKi8geDg2ZW11T3BfbW92X3dvcmRfUl9STSwKKy8qICAweDhjICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSLAorLyogIDB4OGQgKi8geDg2ZW11T3BfbGVhX3dvcmRfUl9NLAorLyogIDB4OGUgKi8geDg2ZW11T3BfbW92X3dvcmRfU1JfUk0sCisvKiAgMHg4ZiAqLyB4ODZlbXVPcF9wb3BfUk0sCisKKy8qICAweDkwICovIHg4NmVtdU9wX25vcCwKKy8qICAweDkxICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9DWCwKKy8qICAweDkyICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9EWCwKKy8qICAweDkzICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CWCwKKy8qICAweDk0ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TUCwKKy8qICAweDk1ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CUCwKKy8qICAweDk2ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TSSwKKy8qICAweDk3ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9ESSwKKworLyogIDB4OTggKi8geDg2ZW11T3BfY2J3LAorLyogIDB4OTkgKi8geDg2ZW11T3BfY3dkLAorLyogIDB4OWEgKi8geDg2ZW11T3BfY2FsbF9mYXJfSU1NLAorLyogIDB4OWIgKi8geDg2ZW11T3Bfd2FpdCwKKy8qICAweDljICovIHg4NmVtdU9wX3B1c2hmX3dvcmQsCisvKiAgMHg5ZCAqLyB4ODZlbXVPcF9wb3BmX3dvcmQsCisvKiAgMHg5ZSAqLyB4ODZlbXVPcF9zYWhmLAorLyogIDB4OWYgKi8geDg2ZW11T3BfbGFoZiwKKworLyogIDB4YTAgKi8geDg2ZW11T3BfbW92X0FMX01fSU1NLAorLyogIDB4YTEgKi8geDg2ZW11T3BfbW92X0FYX01fSU1NLAorLyogIDB4YTIgKi8geDg2ZW11T3BfbW92X01fQUxfSU1NLAorLyogIDB4YTMgKi8geDg2ZW11T3BfbW92X01fQVhfSU1NLAorLyogIDB4YTQgKi8geDg2ZW11T3BfbW92c19ieXRlLAorLyogIDB4YTUgKi8geDg2ZW11T3BfbW92c193b3JkLAorLyogIDB4YTYgKi8geDg2ZW11T3BfY21wc19ieXRlLAorLyogIDB4YTcgKi8geDg2ZW11T3BfY21wc193b3JkLAorLyogIDB4YTggKi8geDg2ZW11T3BfdGVzdF9BTF9JTU0sCisvKiAgMHhhOSAqLyB4ODZlbXVPcF90ZXN0X0FYX0lNTSwKKy8qICAweGFhICovIHg4NmVtdU9wX3N0b3NfYnl0ZSwKKy8qICAweGFiICovIHg4NmVtdU9wX3N0b3Nfd29yZCwKKy8qICAweGFjICovIHg4NmVtdU9wX2xvZHNfYnl0ZSwKKy8qICAweGFkICovIHg4NmVtdU9wX2xvZHNfd29yZCwKKy8qICAweGFjICovIHg4NmVtdU9wX3NjYXNfYnl0ZSwKKy8qICAweGFkICovIHg4NmVtdU9wX3NjYXNfd29yZCwKKworCisvKiAgMHhiMCAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9BTF9JTU0sCisvKiAgMHhiMSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9DTF9JTU0sCisvKiAgMHhiMiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9ETF9JTU0sCisvKiAgMHhiMyAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9CTF9JTU0sCisvKiAgMHhiNCAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9BSF9JTU0sCisvKiAgMHhiNSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9DSF9JTU0sCisvKiAgMHhiNiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9ESF9JTU0sCisvKiAgMHhiNyAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9CSF9JTU0sCisKKy8qICAweGI4ICovIHg4NmVtdU9wX21vdl93b3JkX0FYX0lNTSwKKy8qICAweGI5ICovIHg4NmVtdU9wX21vdl93b3JkX0NYX0lNTSwKKy8qICAweGJhICovIHg4NmVtdU9wX21vdl93b3JkX0RYX0lNTSwKKy8qICAweGJiICovIHg4NmVtdU9wX21vdl93b3JkX0JYX0lNTSwKKy8qICAweGJjICovIHg4NmVtdU9wX21vdl93b3JkX1NQX0lNTSwKKy8qICAweGJkICovIHg4NmVtdU9wX21vdl93b3JkX0JQX0lNTSwKKy8qICAweGJlICovIHg4NmVtdU9wX21vdl93b3JkX1NJX0lNTSwKKy8qICAweGJmICovIHg4NmVtdU9wX21vdl93b3JkX0RJX0lNTSwKKworLyogIDB4YzAgKi8geDg2ZW11T3Bfb3BjQzBfYnl0ZV9STV9NRU0sCisvKiAgMHhjMSAqLyB4ODZlbXVPcF9vcGNDMV93b3JkX1JNX01FTSwKKy8qICAweGMyICovIHg4NmVtdU9wX3JldF9uZWFyX0lNTSwKKy8qICAweGMzICovIHg4NmVtdU9wX3JldF9uZWFyLAorLyogIDB4YzQgKi8geDg2ZW11T3BfbGVzX1JfSU1NLAorLyogIDB4YzUgKi8geDg2ZW11T3BfbGRzX1JfSU1NLAorLyogIDB4YzYgKi8geDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NLAorLyogIDB4YzcgKi8geDg2ZW11T3BfbW92X3dvcmRfUk1fSU1NLAorLyogIDB4YzggKi8geDg2ZW11T3BfZW50ZXIsCisvKiAgMHhjOSAqLyB4ODZlbXVPcF9sZWF2ZSwKKy8qICAweGNhICovIHg4NmVtdU9wX3JldF9mYXJfSU1NLAorLyogIDB4Y2IgKi8geDg2ZW11T3BfcmV0X2ZhciwKKy8qICAweGNjICovIHg4NmVtdU9wX2ludDMsCisvKiAgMHhjZCAqLyB4ODZlbXVPcF9pbnRfSU1NLAorLyogIDB4Y2UgKi8geDg2ZW11T3BfaW50bywKKy8qICAweGNmICovIHg4NmVtdU9wX2lyZXQsCisKKy8qICAweGQwICovIHg4NmVtdU9wX29wY0QwX2J5dGVfUk1fMSwKKy8qICAweGQxICovIHg4NmVtdU9wX29wY0QxX3dvcmRfUk1fMSwKKy8qICAweGQyICovIHg4NmVtdU9wX29wY0QyX2J5dGVfUk1fQ0wsCisvKiAgMHhkMyAqLyB4ODZlbXVPcF9vcGNEM193b3JkX1JNX0NMLAorLyogIDB4ZDQgKi8geDg2ZW11T3BfYWFtLAorLyogIDB4ZDUgKi8geDg2ZW11T3BfYWFkLAorLyogIDB4ZDYgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBVbmRvY3VtZW50ZWQgU0VUQUxDIGluc3RydWN0aW9uICovCisvKiAgMHhkNyAqLyB4ODZlbXVPcF94bGF0LAorLyogIDB4ZDggKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOCwKKy8qICAweGQ5ICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDksCisvKiAgMHhkYSAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhLAorLyogIDB4ZGIgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYiwKKy8qICAweGRjICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGMsCisvKiAgMHhkZCAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkLAorLyogIDB4ZGUgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSwKKy8qICAweGRmICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGYsCisKKy8qICAweGUwICovIHg4NmVtdU9wX2xvb3BuZSwKKy8qICAweGUxICovIHg4NmVtdU9wX2xvb3BlLAorLyogIDB4ZTIgKi8geDg2ZW11T3BfbG9vcCwKKy8qICAweGUzICovIHg4NmVtdU9wX2pjeHosCisvKiAgMHhlNCAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0lNTSwKKy8qICAweGU1ICovIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NLAorLyogIDB4ZTYgKi8geDg2ZW11T3Bfb3V0X2J5dGVfSU1NX0FMLAorLyogIDB4ZTcgKi8geDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYLAorCisvKiAgMHhlOCAqLyB4ODZlbXVPcF9jYWxsX25lYXJfSU1NLAorLyogIDB4ZTkgKi8geDg2ZW11T3BfanVtcF9uZWFyX0lNTSwKKy8qICAweGVhICovIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSwKKy8qICAweGViICovIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0sCisvKiAgMHhlYyAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0RYLAorLyogIDB4ZWQgKi8geDg2ZW11T3BfaW5fd29yZF9BWF9EWCwKKy8qICAweGVlICovIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMLAorLyogIDB4ZWYgKi8geDg2ZW11T3Bfb3V0X3dvcmRfRFhfQVgsCisKKy8qICAweGYwICovIHg4NmVtdU9wX2xvY2ssCisvKiAgMHhmMSAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLAorLyogIDB4ZjIgKi8geDg2ZW11T3BfcmVwbmUsCisvKiAgMHhmMyAqLyB4ODZlbXVPcF9yZXBlLAorLyogIDB4ZjQgKi8geDg2ZW11T3BfaGFsdCwKKy8qICAweGY1ICovIHg4NmVtdU9wX2NtYywKKy8qICAweGY2ICovIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0sCisvKiAgMHhmNyAqLyB4ODZlbXVPcF9vcGNGN193b3JkX1JNLAorCisvKiAgMHhmOCAqLyB4ODZlbXVPcF9jbGMsCisvKiAgMHhmOSAqLyB4ODZlbXVPcF9zdGMsCisvKiAgMHhmYSAqLyB4ODZlbXVPcF9jbGksCisvKiAgMHhmYiAqLyB4ODZlbXVPcF9zdGksCisvKiAgMHhmYyAqLyB4ODZlbXVPcF9jbGQsCisvKiAgMHhmZCAqLyB4ODZlbXVPcF9zdGQsCisvKiAgMHhmZSAqLyB4ODZlbXVPcF9vcGNGRV9ieXRlX1JNLAorLyogIDB4ZmYgKi8geDg2ZW11T3Bfb3BjRkZfd29yZF9STSwKK307CisKK3ZvaWQgdGFibGVzX3JlbG9jYXRlKHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgIHsKKwlvcGM4MF9ieXRlX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7CisJb3BjODFfd29yZF9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OworCW9wYzgxX2xvbmdfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKKworCW9wYzgyX2J5dGVfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKKwlvcGM4M193b3JkX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7CisJb3BjODNfbG9uZ19vcGVyYXRpb25baV0gLT0gb2Zmc2V0OworCisJb3BjRDBfYnl0ZV9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OworCW9wY0QxX3dvcmRfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKKwlvcGNEMV9sb25nX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wczIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMyLmMKQEAgLTAsMCArMSwyODAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nCisqICAgICAgICAgICAgICAgYW5kIGVtdWxhdGlvbiBvZiBhbGwgdGhlIHg4NiBleHRlbmRlZCB0d28tYnl0ZSBwcm9jZXNzb3IKKyogICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCisKK1JFTUFSS1M6CitIYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbGxlZ2FsX29wKAorCXU4IG9wMikKK3sKKwlTVEFSVF9PRl9JTlNUUigpOworCURFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7CisJVFJBQ0VfUkVHUygpOworCXByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSFcbiIsCisJCU0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMixvcDIpOworICAgIEhBTFRfU1lTKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKyNkZWZpbmUgeG9ybChhLGIpICAgKChhKSAmJiAhKGIpKSB8fCAoIShhKSAmJiAoYikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweDgwLTB4OEYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sb25nX2p1bXAodTggb3AyKQoreworICAgIHMzMiB0YXJnZXQ7CisgICAgY2hhciAqbmFtZSA9IDA7CisgICAgaW50IGNvbmQgPSAwOworCisgICAgLyogY29uZGl0aW9uYWwganVtcCB0byB3b3JkIG9mZnNldC4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIHN3aXRjaCAob3AyKSB7CisgICAgICBjYXNlIDB4ODA6CisgICAgICAgIG5hbWUgPSAiSk9cdCI7CisgICAgICAgIGNvbmQgPSAgQUNDRVNTX0ZMQUcoRl9PRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDgxOgorICAgICAgICBuYW1lID0gIkpOT1x0IjsKKyAgICAgICAgY29uZCA9ICFBQ0NFU1NfRkxBRyhGX09GKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4ODI6CisgICAgICAgIG5hbWUgPSAiSkJcdCI7CisgICAgICAgIGNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4ODM6CisgICAgICAgIG5hbWUgPSAiSk5CXHQiOworICAgICAgICBjb25kID0gIUFDQ0VTU19GTEFHKEZfQ0YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4NDoKKyAgICAgICAgbmFtZSA9ICJKWlx0IjsKKyAgICAgICAgY29uZCA9IEFDQ0VTU19GTEFHKEZfWkYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4NToKKyAgICAgICAgbmFtZSA9ICJKTlpcdCI7CisgICAgICAgIGNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9aRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDg2OgorICAgICAgICBuYW1lID0gIkpCRVx0IjsKKyAgICAgICAgY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4NzoKKyAgICAgICAgbmFtZSA9ICJKTkJFXHQiOworICAgICAgICBjb25kID0gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDg4OgorICAgICAgICBuYW1lID0gIkpTXHQiOworICAgICAgICBjb25kID0gQUNDRVNTX0ZMQUcoRl9TRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDg5OgorICAgICAgICBuYW1lID0gIkpOU1x0IjsKKyAgICAgICAgY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1NGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OGE6CisgICAgICAgIG5hbWUgPSAiSlBcdCI7CisgICAgICAgIGNvbmQgPSBBQ0NFU1NfRkxBRyhGX1BGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OGI6CisgICAgICAgIG5hbWUgPSAiSk5QXHQiOworICAgICAgICBjb25kID0gIUFDQ0VTU19GTEFHKEZfUEYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4YzoKKyAgICAgICAgbmFtZSA9ICJKTFx0IjsKKyAgICAgICAgY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OGQ6CisgICAgICAgIG5hbWUgPSAiSk5MXHQiOworICAgICAgICBjb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4ZToKKyAgICAgICAgbmFtZSA9ICJKTEVcdCI7CisgICAgICAgIGNvbmQgPSAoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8CisgICAgICAgICAgICAgICAgQUNDRVNTX0ZMQUcoRl9aRikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg4ZjoKKyAgICAgICAgbmFtZSA9ICJKTkxFXHQiOworICAgICAgICBjb25kID0gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKyAgICAgICAgICAgICAgICAgQUNDRVNTX0ZMQUcoRl9aRikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URihuYW1lKTsKKyAgICB0YXJnZXQgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOworICAgIHRhcmdldCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKGNvbmQpCisgICAgICAgIE0ueDg2LlJfSVAgPSAodTE2KXRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweDkwLTB4OUYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zZXRfYnl0ZSh1OCBvcDIpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCAgKmRlc3RyZWc7CisgICAgY2hhciAqbmFtZSA9IDA7CisgICAgaW50IGNvbmQgPSAwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBzd2l0Y2ggKG9wMikgeworICAgICAgY2FzZSAweDkwOgorICAgICAgICBuYW1lID0gIlNFVE9cdCI7CisgICAgICAgIGNvbmQgPSAgQUNDRVNTX0ZMQUcoRl9PRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDkxOgorICAgICAgICBuYW1lID0gIlNFVE5PXHQiOworICAgICAgICBjb25kID0gIUFDQ0VTU19GTEFHKEZfT0YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5MjoKKyAgICAgICAgbmFtZSA9ICJTRVRCXHQiOworICAgICAgICBjb25kID0gQUNDRVNTX0ZMQUcoRl9DRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDkzOgorICAgICAgICBuYW1lID0gIlNFVE5CXHQiOworICAgICAgICBjb25kID0gIUFDQ0VTU19GTEFHKEZfQ0YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5NDoKKyAgICAgICAgbmFtZSA9ICJTRVRaXHQiOworICAgICAgICBjb25kID0gQUNDRVNTX0ZMQUcoRl9aRik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDk1OgorICAgICAgICBuYW1lID0gIlNFVE5aXHQiOworICAgICAgICBjb25kID0gIUFDQ0VTU19GTEFHKEZfWkYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5NjoKKyAgICAgICAgbmFtZSA9ICJTRVRCRVx0IjsKKyAgICAgICAgY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5NzoKKyAgICAgICAgbmFtZSA9ICJTRVROQkVcdCI7CisgICAgICAgIGNvbmQgPSAhKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OTg6CisgICAgICAgIG5hbWUgPSAiU0VUU1x0IjsKKyAgICAgICAgY29uZCA9IEFDQ0VTU19GTEFHKEZfU0YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5OToKKyAgICAgICAgbmFtZSA9ICJTRVROU1x0IjsKKyAgICAgICAgY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1NGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OWE6CisgICAgICAgIG5hbWUgPSAiU0VUUFx0IjsKKyAgICAgICAgY29uZCA9IEFDQ0VTU19GTEFHKEZfUEYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg5YjoKKyAgICAgICAgbmFtZSA9ICJTRVROUFx0IjsKKyAgICAgICAgY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1BGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OWM6CisgICAgICAgIG5hbWUgPSAiU0VUTFx0IjsKKyAgICAgICAgY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OWQ6CisgICAgICAgIG5hbWUgPSAiU0VUTkxcdCI7CisgICAgICAgIGNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDllOgorICAgICAgICBuYW1lID0gIlNFVExFXHQiOworICAgICAgICBjb25kID0gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAorICAgICAgICAgICAgICAgIEFDQ0VTU19GTEFHKEZfWkYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4OWY6CisgICAgICAgIG5hbWUgPSAiU0VUTkxFXHQiOworICAgICAgICBjb25kID0gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKyAgICAgICAgICAgICAgICAgQUNDRVNTX0ZMQUcoRl9aRikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URihuYW1lKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBjb25kID8gMHgwMSA6IDB4MDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgY29uZCA/IDB4MDEgOiAweDAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gY29uZCA/IDB4MDEgOiAweDAwOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3B1c2hfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RlNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRlMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wb3BfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRGU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0ZTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIGludCBiaXQsZGlzcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlRcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hsZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisJdTggc2hpZnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNobGRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3NobGRfQ0wodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2hsZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfcHVzaF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRHU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9HUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3BvcF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdEdTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfR1MgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9idHNfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIGludCBiaXQsZGlzcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlRTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAobW9kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworICAgICAgICAgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworICAgICAgICAgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKwkJCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworCQkJREVDT0RFX1BSSU5URigiLCIpOworCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJCQlUUkFDRV9BTkRfU1RFUCgpOworCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisJCQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQkJdTMyICpzcmNyZWcsKnNoaWZ0cmVnOworCQkJdTMyIG1hc2s7CisKKwkJCXNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJCQltYXNrID0gKDB4MSA8PCBiaXQpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJCQkqc3JjcmVnIHw9IG1hc2s7CisJCX0gZWxzZSB7CisJCQl1MTYgKnNyY3JlZywqc2hpZnRyZWc7CisJCQl1MTYgbWFzazsKKworCQkJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQkJREVDT0RFX1BSSU5URigiLCIpOworCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJCQlUUkFDRV9BTkRfU1RFUCgpOworCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisgICAgICAgICAgICAqc3JjcmVnIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaHJkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKwl1OCBzaGlmdDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IGRlc3R2YWw7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIGRlc3R2YWw7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBkZXN0dmFsOworICAgICAgICAgICAgdTMyICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgZGVzdHZhbDsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNocmRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hyZF9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgZGVzdHZhbDsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworICAgICAgICAgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBkZXN0dmFsOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisgICAgICAgICAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzaHJkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNocmRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbXVsX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOworICAgICAgICAgICAgaWYgKHJlc19oaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlczsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOworICAgICAgICAgICAgaWYgKHJlcyA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOworICAgICAgICAgICAgaWYgKHJlc19oaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlczsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOworICAgICAgICAgICAgaWYgKHJlcyA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOworICAgICAgICAgICAgaWYgKHJlc19oaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworICAgICAgICAgICAgdTMyIHJlczsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOworICAgICAgICAgICAgaWYgKHJlcyA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworICAgICAgICAgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKSpzcmNyZWcpOworICAgICAgICAgICAgaWYgKHJlc19oaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgU0VUX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgICAgICAgICAgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKyAgICAgICAgICAgIHUzMiByZXM7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNikqc3JjcmVnOworICAgICAgICAgICAgaWYgKHJlcyA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIFNFVF9GTEFHKEZfT0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgICAgICAgICAgICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGIyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbHNzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKwlpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxTU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICAvKiBVTkRFRklORUQhICovCisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9idHJfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisJaW50IG1vZCwgcmwsIHJoOworCXVpbnQgc3Jjb2Zmc2V0OworCWludCBiaXQsZGlzcDsKKworCVNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQlRSXHQiKTsKKwlGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworCXN3aXRjaCAobW9kKSB7CisJY2FzZSAwOgorCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJCXUzMiBzcmN2YWwsbWFzazsKKwkJCXUzMiAqc2hpZnRyZWc7CisKKwkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworCQkJREVDT0RFX1BSSU5URigiLCIpOworCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJCQlUUkFDRV9BTkRfU1RFUCgpOworCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7CisJCX0gZWxzZSB7CisJCQl1MTYgc3JjdmFsLG1hc2s7CisJCQl1MTYgKnNoaWZ0cmVnOworCisJCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJCXUzMiBzcmN2YWwsbWFzazsKKwkJCXUzMiAqc2hpZnRyZWc7CisKKwkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworCQkJREVDT0RFX1BSSU5URigiLCIpOworCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJCQlUUkFDRV9BTkRfU1RFUCgpOworCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7CisJCX0gZWxzZSB7CisJCQl1MTYgc3JjdmFsLG1hc2s7CisJCQl1MTYgKnNoaWZ0cmVnOworCisJCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJCXUzMiBzcmN2YWwsbWFzazsKKwkJCXUzMiAqc2hpZnRyZWc7CisKKwkJCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworCQkJREVDT0RFX1BSSU5URigiLCIpOworCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJCQlUUkFDRV9BTkRfU1RFUCgpOworCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7CisJCX0gZWxzZSB7CisJCQl1MTYgc3JjdmFsLG1hc2s7CisJCQl1MTYgKnNoaWZ0cmVnOworCisJCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQkJdTMyICpzcmNyZWcsKnNoaWZ0cmVnOworCQkJdTMyIG1hc2s7CisKKwkJCXNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJCQltYXNrID0gKDB4MSA8PCBiaXQpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJCQkqc3JjcmVnICY9IH5tYXNrOworCQl9IGVsc2UgeworCQkJdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCQkJdTE2IG1hc2s7CisKKwkJCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCQkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCQkJKnNyY3JlZyAmPSB+bWFzazsKKwkJfQorCQlicmVhazsKKwl9CisJREVDT0RFX0NMRUFSX1NFR09WUigpOworCUVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2xmc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisJaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRlNcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogVU5ERUZJTkVEISAqLworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbGdzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKwlpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxHU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIE0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICAvKiBVTkRFRklORUQhICovCisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9tb3Z6eF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WWlhcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyICpkZXN0cmVnOworICAgICAgICAgICAgdTMyIHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTE2IHNyY3ZhbDsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgKmRlc3RyZWc7CisgICAgICAgICAgICB1MTYgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUzMiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1OCAgKnNyY3JlZzsKKworICAgICAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpkZXN0cmVnOworICAgICAgICAgICAgdTggICpzcmNyZWc7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnp4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUzMiAqZGVzdHJlZzsKKyAgICB1MzIgc3JjdmFsOworICAgIHUxNiAqc3JjcmVnOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0WF9JKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgaW50IGJpdDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKHJoKSB7CisgICAgY2FzZSAzOgorICAgICAgICBERUNPREVfUFJJTlRGKCJCVFx0Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgREVDT0RFX1BSSU5URigiQlRTXHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBERUNPREVfUFJJTlRGKCJCVFJcdCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIERFQ09ERV9QUklOVEYoIkJUQ1x0Iik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7CisgICAgICAgIFRSQUNFX1JFR1MoKTsKKyAgICAgICAgcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlglMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSBFWFRFTlNJT04hXG4iLAorICAgICAgICAgICAgICAgIE0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMyxvcDIsIChtb2Q8PDYpfChyaDw8Myl8cmwpOworICAgICAgICBIQUxUX1NZUygpOworICAgIH0KKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgc3JjdmFsLCBtYXNrOworICAgICAgICAgICAgdTggc2hpZnQ7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworICAgICAgICAgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisgICAgICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWwsIG1hc2s7CisgICAgICAgICAgICB1OCBzaGlmdDsKKworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gc2hpZnQgJiAweEY7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBzcmN2YWwsIG1hc2s7CisgICAgICAgICAgICB1OCBzaGlmdDsKKworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gc2hpZnQgJiAweDFGOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisgICAgICAgICAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IHNyY3ZhbCwgbWFzazsKKyAgICAgICAgICAgIHU4IHNoaWZ0OworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBiaXQgPSBzaGlmdCAmIDB4RjsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworICAgICAgICAgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisgICAgICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIHNyY3ZhbCwgbWFzazsKKyAgICAgICAgICAgIHU4IHNoaWZ0OworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBiaXQgPSBzaGlmdCAmIDB4MUY7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3dpdGNoIChyaCkgeworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgc3JjdmFsLCBtYXNrOworICAgICAgICAgICAgdTggc2hpZnQ7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9IHNoaWZ0ICYgMHhGOworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisgICAgICAgICAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqc3JjcmVnOworICAgICAgICAgICAgdTMyIG1hc2s7CisgICAgICAgICAgICB1OCBzaGlmdDsKKworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmgpIHsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAqc3JjcmVnIHw9IG1hc2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgKnNyY3JlZyAmPSB+bWFzazsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAqc3JjcmVnIF49IG1hc2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2ICpzcmNyZWc7CisgICAgICAgICAgICB1MTYgbWFzazsKKyAgICAgICAgICAgIHU4IHNoaWZ0OworCisgICAgICAgICAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gc2hpZnQgJiAweEY7CisgICAgICAgICAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisgICAgICAgICAgICBzd2l0Y2ggKHJoKSB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgKnNyY3JlZyB8PSBtYXNrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICpzcmNyZWcgJj0gfm1hc2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgKnNyY3JlZyBePSBtYXNrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0Y19SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgaW50IGJpdCxkaXNwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCVENcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworICAgICAgICAgICAgdTMyIHNyY3ZhbCxtYXNrOworICAgICAgICAgICAgdTMyICpzaGlmdHJlZzsKKworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworICAgICAgICAgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworICAgICAgICAgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKyAgICAgICAgICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisgICAgICAgICAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCBeIG1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdTE2IHNyY3ZhbCxtYXNrOworICAgICAgICAgICAgdTE2ICpzaGlmdHJlZzsKKworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisgICAgICAgICAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7CisJCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUzMiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworICAgICAgICAgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiBzcmN2YWwsbWFzazsKKyAgICAgICAgICAgIHUxNiAqc2hpZnRyZWc7CisKKyAgICAgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworICAgICAgICAgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisgICAgICAgICAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsIF4gbWFzaykpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgc3JjdmFsLG1hc2s7CisgICAgICAgICAgICB1MzIgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisgICAgICAgICAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7CisgICAgICAgICAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworICAgICAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIF4gbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1MTYgc3JjdmFsLG1hc2s7CisgICAgICAgICAgICB1MTYgKnNoaWZ0cmVnOworCisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKyAgICAgICAgICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworICAgICAgICAgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCBeIG1hc2spKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQl1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisgICAgICAgICAgICB1MzIgbWFzazsKKworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKyAgICAgICAgICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkJCSpzcmNyZWcgXj0gbWFzazsKKwkJfSBlbHNlIHsKKwkJCXUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkJCXUxNiBtYXNrOworCisJCQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJCQlERUNPREVfUFJJTlRGKCIsIik7CisJCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkJCVRSQUNFX0FORF9TVEVQKCk7CisJCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisgICAgICAgICAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKyAgICAgICAgICAgICpzcmNyZWcgXj0gbWFzazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2JzZih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCU0ZcbiIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoKG1vZCkgeworICAgIGNhc2UgMDoKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKwlicmVhazsKKyAgICBjYXNlIDE6CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisJYnJlYWs7CisgICAgY2FzZSAyOgorCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorCWJyZWFrOworICAgIGNhc2UgMzoJCQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQorCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKwlicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2Jzcih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCU0ZcbiIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoKG1vZCkgeworICAgIGNhc2UgMDoKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMzE7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAxNTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKwlicmVhazsKKyAgICBjYXNlIDE6CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisJYnJlYWs7CisgICAgY2FzZSAyOgorCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorCWJyZWFrOworICAgIGNhc2UgMzoJCQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKwlicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisgICAgICAgICAgICB1MzIgKmRlc3RyZWc7CisgICAgICAgICAgICB1MzIgc3JjdmFsOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7CisgICAgICAgICAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHUxNiBzcmN2YWw7CisKKyAgICAgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7CisgICAgICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIHUzMiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHU4ICAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IChzMzIpKChzOCkqc3JjcmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHUxNiAqZGVzdHJlZzsKKyAgICAgICAgICAgIHU4ICAqc3JjcmVnOworCisgICAgICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICAgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworICAgICAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICAgICAqZGVzdHJlZyA9IChzMTYpKChzOCkqc3JjcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUzMiAqZGVzdHJlZzsKKyAgICB1MzIgc3JjdmFsOworICAgIHUxNiAqc3JjcmVnOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiLCIpOworICAgICAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKKyAgICAgICAgc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisgICAgICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgICAgICpkZXN0cmVnID0gc3JjdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisgICAgICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICAgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7CisgICAgICAgIHNyY3ZhbCA9IChzMzIpKChzMTYpZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCkpOworICAgICAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgICAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOworICAgICAgICBzcmN2YWwgPSAoczMyKSgoczE2KWZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworICAgICAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworICAgICAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKyAgICAgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICAgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAgICAgKmRlc3RyZWcgPSAoczMyKSgoczE2KSpzcmNyZWcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEb3VibGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKCp4ODZlbXVfb3B0YWIyWzI1Nl0pKHU4KSA9Cit7CisvKiAgMHgwMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIEdyb3VwIEYgKHJpbmcgMCBQTSkgICAgICAqLworLyogIDB4MDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBHcm91cCBHIChyaW5nIDAgUE0pICAgICAgKi8KKy8qICAweDAyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbGFyIChyaW5nIDAgUE0pICAgICAgICAgICovCisvKiAgMHgwMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxzbCAocmluZyAwIFBNKSAgICAgICAgICAqLworLyogIDB4MDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxvYWRhbGwgKHVuZG9jdW1lbnRlZCkgICAqLworLyogIDB4MDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBjbHRzIChyaW5nIDAgUE0pICAgICAgICAgKi8KKy8qICAweDA3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbG9hZGFsbCAodW5kb2N1bWVudGVkKSAgICovCisvKiAgMHgwOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGludmQgKHJpbmcgMCBQTSkgICAgICAgICAqLworLyogIDB4MDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiB3YmludmQgKHJpbmcgMCBQTSkgICAgICAgKi8KKy8qICAweDBhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4MTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDEyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDIwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLGNyZWcgKHJpbmcgMCBQTSkgKi8KKy8qICAweDIxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLGRyZWcgKHJpbmcgMCBQTSkgKi8KKy8qICAweDIyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IGNyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KKy8qICAweDIzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IGRyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KKy8qICAweDI0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLHRyZWcgKHJpbmcgMCBQTSkgKi8KKy8qICAweDI1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgdHJlZyxyZWczMiAocmluZyAwIFBNKSAqLworLyogIDB4MjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDI5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHgzMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDMxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4NDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDUwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDUzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg2MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDYxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4NzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDcyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDgwICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4MSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODIgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDgzICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4NCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODUgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg2ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4NyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODggKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg5ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4YSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGIgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhjICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4ZCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGUgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhmICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisKKy8qICAweDkwICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDkxICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDkyICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDkzICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk0ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk1ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk2ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk3ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk4ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDk5ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDlhICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDliICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDljICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDlkICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDllICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKy8qICAweDlmICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKKworLyogIDB4YTAgKi8geDg2ZW11T3AyX3B1c2hfRlMsCisvKiAgMHhhMSAqLyB4ODZlbXVPcDJfcG9wX0ZTLAorLyogIDB4YTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhMyAqLyB4ODZlbXVPcDJfYnRfUiwKKy8qICAweGE0ICovIHg4NmVtdU9wMl9zaGxkX0lNTSwKKy8qICAweGE1ICovIHg4NmVtdU9wMl9zaGxkX0NMLAorLyogIDB4YTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGE4ICovIHg4NmVtdU9wMl9wdXNoX0dTLAorLyogIDB4YTkgKi8geDg2ZW11T3AyX3BvcF9HUywKKy8qICAweGFhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YWIgKi8geDg2ZW11T3AyX2J0X1IsCisvKiAgMHhhYyAqLyB4ODZlbXVPcDJfc2hyZF9JTU0sCisvKiAgMHhhZCAqLyB4ODZlbXVPcDJfc2hyZF9DTCwKKy8qICAweGFlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YWYgKi8geDg2ZW11T3AyX2ltdWxfUl9STSwKKworLyogIDB4YjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBjbXB4Y2hnICovCisvKiAgMHhiMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGNtcHhjaGcgKi8KKy8qICAweGIyICovIHg4NmVtdU9wMl9sc3NfUl9JTU0sCisvKiAgMHhiMyAqLyB4ODZlbXVPcDJfYnRyX1IsCisvKiAgMHhiNCAqLyB4ODZlbXVPcDJfbGZzX1JfSU1NLAorLyogIDB4YjUgKi8geDg2ZW11T3AyX2xnc19SX0lNTSwKKy8qICAweGI2ICovIHg4NmVtdU9wMl9tb3Z6eF9ieXRlX1JfUk0sCisvKiAgMHhiNyAqLyB4ODZlbXVPcDJfbW92enhfd29yZF9SX1JNLAorLyogIDB4YjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhiOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGJhICovIHg4NmVtdU9wMl9idFhfSSwKKy8qICAweGJiICovIHg4NmVtdU9wMl9idGNfUiwKKy8qICAweGJjICovIHg4NmVtdU9wMl9ic2YsCisvKiAgMHhiZCAqLyB4ODZlbXVPcDJfYnNyLAorLyogIDB4YmUgKi8geDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSwKKy8qICAweGJmICovIHg4NmVtdU9wMl9tb3ZzeF93b3JkX1JfUk0sCisKKy8qICAweGMwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogeGFkZCAqLworLyogIDB4YzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiB4YWRkICovCisvKiAgMHhjMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGMzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisvKiAgMHhjZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCisKKy8qICAweGQwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHhlMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGUxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4ZjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGYyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCit9OwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ByaW1fb3BzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvcHJpbV9vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRmZmRlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ByaW1fb3BzLmMKQEAgLTAsMCArMSwyOTE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBpbXBsZW1lbnQgdGhlIHByaW1pdGl2ZQorKgkJCQltYWNoaW5lIG9wZXJhdGlvbnMgdXNlZCBieSB0aGUgZW11bGF0aW9uIGNvZGUgaW4gb3BzLmMKKyoKKyogQ2FycnkgQ2hhaW4gQ2FsY3VsYXRpb24KKyoKKyogVGhpcyByZXByZXNlbnRzIGEgc29tZXdoYXQgZXhwZW5zaXZlIGNhbGN1bGF0aW9uIHdoaWNoIGlzCisqIGFwcGFyZW50bHkgcmVxdWlyZWQgdG8gZW11bGF0ZSB0aGUgc2V0dGluZyBvZiB0aGUgT0YgYW5kIEFGIGZsYWcuCisqIFRoZSBsYXR0ZXIgaXMgbm90IHNvIGltcG9ydGFudCwgYnV0IHRoZSBmb3JtZXIgaXMuICBUaGUgb3ZlcmZsb3cKKyogZmxhZyBpcyB0aGUgWE9SIG9mIHRoZSB0b3AgdHdvIGJpdHMgb2YgdGhlIGNhcnJ5IGNoYWluIGZvciBhbgorKiBhZGRpdGlvbiAoc2ltaWxhciBmb3Igc3VidHJhY3Rpb24pLiAgU2luY2Ugd2UgZG8gbm90IHdhbnQgdG8KKyogc2ltdWxhdGUgdGhlIGFkZGl0aW9uIGluIGEgYml0d2lzZSBtYW5uZXIsIHdlIHRyeSB0byBjYWxjdWxhdGUgdGhlCisqIGNhcnJ5IGNoYWluIGdpdmVuIHRoZSB0d28gb3BlcmFuZHMgYW5kIHRoZSByZXN1bHQuCisqCisqIFNvLCBnaXZlbiB0aGUgZm9sbG93aW5nIHRhYmxlLCB3aGljaCByZXByZXNlbnRzIHRoZSBhZGRpdGlvbiBvZiB0d28KKyogYml0cywgd2UgY2FuIGRlcml2ZSBhIGZvcm11bGEgZm9yIHRoZSBjYXJyeSBjaGFpbi4KKyoKKyogYSAgIGIgICBjaW4gICByICAgICBjb3V0CisqIDAgICAwICAgMCAgICAgMCAgICAgMAorKiAwICAgMCAgIDEgICAgIDEgICAgIDAKKyogMCAgIDEgICAwICAgICAxICAgICAwCisqIDAgICAxICAgMSAgICAgMCAgICAgMQorKiAxICAgMCAgIDAgICAgIDEgICAgIDAKKyogMSAgIDAgICAxICAgICAwICAgICAxCisqIDEgICAxICAgMCAgICAgMCAgICAgMQorKiAxICAgMSAgIDEgICAgIDEgICAgIDEKKyoKKyogQ29uc3RydWN0aW9uIG9mIHRhYmxlIGZvciBjb3V0OgorKgorKiBhYgorKiByICBcICAwMCAgIDAxICAgMTEgIDEwCisqIHwtLS0tLS0tLS0tLS0tLS0tLS0KKyogMCAgfCAgIDAgICAgMSAgICAxICAgMQorKiAxICB8ICAgMCAgICAwICAgIDEgICAwCisqCisqIEJ5IGluc3BlY3Rpb24sIG9uZSBnZXRzOiAgY2MgPSBhYiArICByJyhhICsgYikKKyoKKyogVGhhdCByZXByZXNlbnRzIGFsb3Qgb2Ygb3BlcmF0aW9ucywgYnV0IE5PIENIT0lDRS4uLi4KKyoKKyogQm9ycm93IENoYWluIENhbGN1bGF0aW9uLgorKgorKiBUaGUgZm9sbG93aW5nIHRhYmxlIHJlcHJlc2VudHMgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBiaXRzLCBmcm9tCisqIHdoaWNoIHdlIGNhbiBkZXJpdmUgYSBmb3JtdWxhIGZvciB0aGUgYm9ycm93IGNoYWluLgorKgorKiBhICAgYiAgIGJpbiAgIHIgICAgIGJvdXQKKyogMCAgIDAgICAwICAgICAwICAgICAwCisqIDAgICAwICAgMSAgICAgMSAgICAgMQorKiAwICAgMSAgIDAgICAgIDEgICAgIDEKKyogMCAgIDEgICAxICAgICAwICAgICAxCisqIDEgICAwICAgMCAgICAgMSAgICAgMAorKiAxICAgMCAgIDEgICAgIDAgICAgIDAKKyogMSAgIDEgICAwICAgICAwICAgICAwCisqIDEgICAxICAgMSAgICAgMSAgICAgMQorKgorKiBDb25zdHJ1Y3Rpb24gb2YgdGFibGUgZm9yIGNvdXQ6CisqCisqIGFiCisqIHIgIFwgIDAwICAgMDEgICAxMSAgMTAKKyogfC0tLS0tLS0tLS0tLS0tLS0tLQorKiAwICB8ICAgMCAgICAxICAgIDAgICAwCisqIDEgIHwgICAxICAgIDEgICAgMSAgIDAKKyoKKyogQnkgaW5zcGVjdGlvbiwgb25lIGdldHM6ICBiYyA9IGEnYiArICByKGEnICsgYikKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJUFJJTV9PUFNfTk9fUkVERUZJTkVfQVNNCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZglfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCisKK3N0YXRpYyB1MzIgeDg2ZW11X3Bhcml0eV90YWJbOF0gPQoreworCTB4OTY2OTY5OTYsCisJMHg2OTk2OTY2OSwKKwkweDY5OTY5NjY5LAorCTB4OTY2OTY5OTYsCisJMHg2OTk2OTY2OSwKKwkweDk2Njk2OTk2LAorCTB4OTY2OTY5OTYsCisJMHg2OTk2OTY2OSwKK307CisKKyNlbmRpZgorCisjZGVmaW5lIFBBUklUWSh4KSAgICgoKHg4NmVtdV9wYXJpdHlfdGFiWyh4KSAvIDMyXSA+PiAoKHgpICUgMzIpKSAmIDEpID09IDApCisjZGVmaW5lIFhPUjIoeCkgCSgoKHgpIF4gKCh4KT4+MSkpICYgMHgxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWFhX3dvcmQodTE2IGQpCit7CisJdTE2CXJlczsKKwlpZiAoKGQgJiAweGYpID4gMHg5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7CisJCWQgKz0gMHg2OworCQlkICs9IDB4MTAwOworCQlTRVRfRkxBRyhGX0FGKTsKKwkJU0VUX0ZMQUcoRl9DRik7CisJfSBlbHNlIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX0FGKTsKKwl9CisJcmVzID0gKHUxNikoZCAmIDB4RkYwRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhYXNfd29yZCh1MTYgZCkKK3sKKwl1MTYJcmVzOworCWlmICgoZCAmIDB4ZikgPiAweDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKKwkJZCAtPSAweDY7CisJCWQgLT0gMHgxMDA7CisJCVNFVF9GTEFHKEZfQUYpOworCQlTRVRfRkxBRyhGX0NGKTsKKwl9IGVsc2UgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfQUYpOworCX0KKwlyZXMgPSAodTE2KShkICYgMHhGRjBGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhZF93b3JkKHUxNiBkKQoreworCXUxNiBsOworCXU4IGhiLCBsYjsKKworCWhiID0gKHU4KSgoZCA+PiA4KSAmIDB4ZmYpOworCWxiID0gKHU4KSgoZCAmIDB4ZmYpKTsKKwlsID0gKHUxNikoKGxiICsgMTAgKiBoYikgJiAweEZGKTsKKworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX0FGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgJiAweDgwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhsID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShsICYgMHhmZiksIEZfUEYpOworCXJldHVybiBsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFBTSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhYW1fd29yZCh1OCBkKQoreworICAgIHUxNiBoLCBsOworCisJaCA9ICh1MTYpKGQgLyAxMCk7CisJbCA9ICh1MTYpKGQgJSAxMCk7CisJbCB8PSAodTE2KShoIDw8IDgpOworCisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcobCAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKGwgJiAweGZmKSwgRl9QRik7CisgICAgcmV0dXJuIGw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggYWRjX2J5dGUodTggZCwgdTggcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBjYzsKKworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKKwkJcmVzID0gMSArIGQgKyBzOworCWVsc2UKKwkJcmVzID0gZCArIHM7CisKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMCwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCisJY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gNiksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWRjX3dvcmQodTE2IGQsIHUxNiBzKQoreworCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisJcmVnaXN0ZXIgdTMyIGNjOworCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCQlyZXMgPSAxICsgZCArIHM7CisJZWxzZQorCQlyZXMgPSBkICsgczsKKworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwMDAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KKwljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAxNCksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFkY19sb25nKHUzMiBkLCB1MzIgcykKK3sKKwlyZWdpc3RlciB1MzIgbG87CS8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBoaTsKKwlyZWdpc3RlciB1MzIgcmVzOworCXJlZ2lzdGVyIHUzMiBjYzsKKworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeworCQlsbyA9IDEgKyAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7CisJCXJlcyA9IDEgKyBkICsgczsKKwkJfQorCWVsc2UgeworCQlsbyA9IChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKKwkJcmVzID0gZCArIHM7CisJCX0KKwloaSA9IChsbyA+PiAxNikgKyAoZCA+PiAxNikgKyAocyA+PiAxNik7CisKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLworCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggYWRkX2J5dGUodTggZCwgdTggcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBjYzsKKworCXJlcyA9IGQgKyBzOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KKwljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiA2KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOworCXJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhZGRfd29yZCh1MTYgZCwgdTE2IHMpCit7CisJcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKwlyZWdpc3RlciB1MzIgY2M7CisKKwlyZXMgPSBkICsgczsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCisJY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMTQpLCBGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7CisJcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBhZGRfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisJcmVnaXN0ZXIgdTMyIGxvOwkvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKwlyZWdpc3RlciB1MzIgaGk7CisJcmVnaXN0ZXIgdTMyIHJlczsKKwlyZWdpc3RlciB1MzIgY2M7CisKKwlsbyA9IChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKKwlyZXMgPSBkICsgczsKKwloaSA9IChsbyA+PiAxNikgKyAoZCA+PiAxNikgKyAocyA+PiAxNik7CisKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLworICAgIGNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBhbmRfYnl0ZSh1OCBkLCB1OCBzKQoreworCXJlZ2lzdGVyIHU4IHJlczsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKwlyZXMgPSBkICYgczsKKworCS8qIHNldCB0aGUgZmxhZ3MgICovCisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMpLCBGX1BGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhbmRfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgcmVnaXN0ZXIgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgJiBzOworCisgICAgLyogc2V0IHRoZSBmbGFncyAgKi8KKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX0FGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFuZF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisJcmVzID0gZCAmIHM7CisKKwkvKiBzZXQgdGhlIGZsYWdzICAqLworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggY21wX2J5dGUodTggZCwgdTggcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBiYzsKKworCXJlcyA9IGQgLSBzOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBjbXBfd29yZCh1MTYgZCwgdTE2IHMpCit7CisJcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKwlyZWdpc3RlciB1MzIgYmM7CisKKwlyZXMgPSBkIC0gczsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjbXBfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisJcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKwlyZWdpc3RlciB1MzIgYmM7CisKKwlyZXMgPSBkIC0gczsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisJYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGRhYV9ieXRlKHU4IGQpCit7CisJdTMyIHJlcyA9IGQ7CisJaWYgKChkICYgMHhmKSA+IDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKKwkJcmVzICs9IDY7CisJCVNFVF9GTEFHKEZfQUYpOworCX0KKwlpZiAocmVzID4gMHg5RiB8fCBBQ0NFU1NfRkxBRyhGX0NGKSkgeworCQlyZXMgKz0gMHg2MDsKKwkJU0VUX0ZMQUcoRl9DRik7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweEZGKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCXJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERBUyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGRhc19ieXRlKHU4IGQpCit7CisJaWYgKChkICYgMHhmKSA+IDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKKwkJZCAtPSA2OworCQlTRVRfRkxBRyhGX0FGKTsKKwl9CisJaWYgKGQgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJCWQgLT0gMHg2MDsKKwkJU0VUX0ZMQUcoRl9DRik7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGQgJiAweDgwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhkID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShkICYgMHhmZiksIEZfUEYpOworCXJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGRlY19ieXRlKHU4IGQpCit7CisgICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICByZWdpc3RlciB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gMTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisJLyogYmFzZWQgb24gc3ViX2J5dGUsIHVzZXMgcz09MS4gICovCisJYmMgPSAocmVzICYgKH5kIHwgMSkpIHwgKH5kICYgMSk7CisJLyogY2FycnkgZmxhZyB1bmNoYW5nZWQgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisJcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGRlY193b3JkKHUxNiBkKQoreworICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgcmVnaXN0ZXIgdTMyIGJjOworCisgICAgcmVzID0gZCAtIDE7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKyAgICAvKiBiYXNlZCBvbiB0aGUgc3ViX2J5dGUgcm91dGluZSwgd2l0aCBzPT0xICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgMSkpIHwgKH5kICYgMSk7CisgICAgLyogY2FycnkgZmxhZyB1bmNoYW5nZWQgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZGVjX2xvbmcodTMyIGQpCit7CisgICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICByZWdpc3RlciB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gMTsKKworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKwliYyA9IChyZXMgJiAofmQgfCAxKSkgfCAofmQgJiAxKTsKKwkvKiBjYXJyeSBmbGFnIHVuY2hhbmdlZCAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBpbmNfYnl0ZSh1OCBkKQoreworCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisJcmVnaXN0ZXIgdTMyIGNjOworCisJcmVzID0gZCArIDE7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCisJY2MgPSAoKDEgJiBkKSB8ICh+cmVzKSkgJiAoMSB8IGQpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gNiksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgaW5jX3dvcmQodTE2IGQpCit7CisJcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKwlyZWdpc3RlciB1MzIgY2M7CisKKwlyZXMgPSBkICsgMTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCisJY2MgPSAoMSAmIGQpIHwgKCh+cmVzKSAmICgxIHwgZCkpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMTQpLCBGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7CisJcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBpbmNfbG9uZyh1MzIgZCkKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBjYzsKKworCXJlcyA9IGQgKyAxOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLworCWNjID0gKDEgJiBkKSB8ICgofnJlcykgJiAoMSB8IGQpKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisJcmVnaXN0ZXIgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworCXJlcyA9IGQgfCBzOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBvcl93b3JkKHUxNiBkLCB1MTYgcykKK3sKKwlyZWdpc3RlciB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisJcmVzID0gZCB8IHM7CisJLyogc2V0IHRoZSBjYXJyeSBmbGFnIHRvIGJlIGJpdCA4ICovCisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG9yX2xvbmcodTMyIGQsIHUzMiBzKQoreworCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKwlyZXMgPSBkIHwgczsKKworCS8qIHNldCB0aGUgY2FycnkgZmxhZyB0byBiZSBiaXQgOCAqLworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBuZWdfYnl0ZSh1OCBzKQoreworICAgIHJlZ2lzdGVyIHU4IHJlczsKKyAgICByZWdpc3RlciB1OCBiYzsKKworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7CisJcmVzID0gKHU4KS1zOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7CisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCisJICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOworCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAorCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQorCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KKwliYyA9IHJlcyB8IHM7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgbmVnX3dvcmQodTE2IHMpCit7CisJcmVnaXN0ZXIgdTE2IHJlczsKKwlyZWdpc3RlciB1MTYgYmM7CisKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzICE9IDAsIEZfQ0YpOworCXJlcyA9ICh1MTYpLXM7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCisJICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOworCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAorCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQorCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KKwliYyA9IHJlcyB8IHM7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG5lZ19sb25nKHUzMiBzKQoreworCXJlZ2lzdGVyIHUzMiByZXM7CisJcmVnaXN0ZXIgdTMyIGJjOworCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKKwlyZXMgPSAodTMyKS1zOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCisJICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOworCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAorCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQorCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KKwliYyA9IHJlcyB8IHM7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG5vdF9ieXRlKHU4IHMpCit7CisJcmV0dXJuIH5zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBub3Rfd29yZCh1MTYgcykKK3sKKwlyZXR1cm4gfnM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG5vdF9sb25nKHUzMiBzKQoreworCXJldHVybiB+czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCByY2xfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7CisKKyAgICAvKiBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4gKi8KKwkvKiBoYXZlCisKKyAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMCAKKworICAgICAgIHdhbnQgdG8gcm90YXRlIHRocm91Z2ggdGhlIGNhcnJ5IGJ5ICJzIiBiaXRzLiAgV2UgY291bGQgCisgICAgICAgbG9vcCwgYnV0IHRoYXQncyBpbmVmZmljaWVudC4gIFNvIHRoZSB3aWR0aCBpcyA5LAorICAgICAgIGFuZCB3ZSBzcGxpdCBpbnRvIHRocmVlIHBhcnRzOgorCisgICAgICAgVGhlIG5ldyBjYXJyeSBmbGFnICAgKHdhcyBCX24pCisgICAgICAgdGhlIHN0dWZmIGluIEJfbi0xIC4uIEJfMAorICAgICAgIHRoZSBzdHVmZiBpbiBCXzcgLi4gQl9uKzEKKworICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAorICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcworICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTVNCLiAgVGhlIGxvdyBwYXJ0IGlzIAorICAgICAgIHRoZW4gc2hpZnRlZCB1cCBjbnQgYml0cywgYW5kIHRoZSBoaWdoIHBhcnQgaXMgb3InZAorICAgICAgIGluLiAgVXNpbmcgQ0FQUyBmb3IgbmV3IHZhbHVlcywgYW5kIGxvd2VyY2FzZSBmb3IgdGhlIAorICAgICAgIG9yaWdpbmFsIHZhbHVlcywgdGhpcyBjYW4gYmUgZXhwcmVzc2VkIGFzOgorCisgICAgICAgSUYgbiA+IDAgCisgICAgICAgMSkgQ0YgPC0gIGJfKDgtbikKKyAgICAgICAyKSBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfMAorICAgICAgIDMpIEJfKG4tMSkgPC0gY2YKKyAgICAgICA0KSBCXyhuLTIpIC4uIEJfMCA8LSAgYl83IC4uIGJfKDgtKG4tMSkpCisJICovCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSA5KSAhPSAwKSB7CisgICAgICAgIC8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLworICAgICAgICAvKiBDRiA8LSAgYl8oOC1uKSAgICAgICAgICAgICAqLworICAgICAgICBjZiA9IChkID4+ICg4IC0gY250KSkgJiAweDE7CisKKyAgICAgICAgLyogZ2V0IHRoZSBsb3cgc3R1ZmYgd2hpY2ggcm90YXRlZCAKKyAgICAgICAgICAgaW50byB0aGUgcmFuZ2UgQl83IC4uIEJfY250ICovCisgICAgICAgIC8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8wICAqLworICAgICAgICAvKiBub3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgc2lkZSBkb25lIGJ5IHRoZSBtYXNrICovCisJCXJlcyA9IChkIDw8IGNudCkgJiAweGZmOworCisgICAgICAgIC8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZCAKKyAgICAgICAgICAgaW50byB0aGUgcG9zaXRpb25zIEJfY250LTIgLi4gQl8wICovCisgICAgICAgIC8qIEJfKG4tMikgLi4gQl8wIDwtICBiXzcgLi4gYl8oOC0obi0xKSkgKi8KKyAgICAgICAgLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLiAKKyAgICAgICAgICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4gCisgICAgICAgICAqLworICAgICAgICBtYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisgICAgICAgIHJlcyB8PSAoZCA+PiAoOSAtIGNudCkpICYgbWFzazsKKworICAgICAgICAvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4gICovCisJCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgICAgIC8qICBCXyhuLTEpIDwtIGNmICovCisgICAgICAgICAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworICAgICAgICAvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogY250PT0xLCB0aGVuIGl0IGlzIHRoZSAKKyAgICAgICAgICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCisgICAgICAgIC8qIHBhcmVudGhlc2l6ZWQgdGhpcyBleHByZXNzaW9uIHNpbmNlIGl0IGFwcGVhcnMgdG8KKyAgICAgICAgICAgYmUgY2F1c2luZyBPRiB0byBiZSBtaXNzZXQgKi8KKyAgICAgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkJCQkJIEZfT0YpOworCisgICAgfQorCXJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiByY2xfd29yZCh1MTYgZCwgdTggcykKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2ssIGNmOworCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgeworCQljZiA9IChkID4+ICgxNiAtIGNudCkpICYgMHgxOworCQlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmOworCQltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJCXJlcyB8PSAoZCA+PiAoMTcgLSBjbnQpKSAmIG1hc2s7CisJCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeworCQkJcmVzIHw9IDEgPDwgKGNudCAtIDEpOworCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDE0KSAmIDB4MikpLAorCQkJCQkJCSBGX09GKTsKKwl9CisJcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByY2xfbG9uZyh1MzIgZCwgdTggcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzLCBjbnQsIG1hc2ssIGNmOworCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgeworCQljZiA9IChkID4+ICgzMiAtIGNudCkpICYgMHgxOworCQlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmZmZmZjsKKwkJbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOworCQlyZXMgfD0gKGQgPj4gKDMzIC0gY250KSkgJiBtYXNrOworCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCisJCQlyZXMgfD0gMSA8PCAoY250IC0gMSk7CisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMzApICYgMHgyKSksCisJCQkJCQkJIEZfT0YpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJjcl9ieXRlKHU4IGQsIHU4IHMpCit7CisJdTMyCXJlcywgY250OworCXUzMgltYXNrLCBjZiwgb2NmID0gMDsKKworCS8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCisgICAgLyogCisgICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCisgICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4gIAorCisgICAgICAgaGF2ZSAKKworICAgICAgIENGICBCXzcgQl82IEJfNSBCXzQgQl8zIEJfMiBCXzEgQl8wIAorCisgICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOSwgYW5kIGdpdmVuIHRoaXMsCisgICAgICAgZm9yIGEgcm90YXRpb24gb2YgbiBiaXRzIChtb2QgOSkgdGhlIG5ldyBjYXJyeSBmbGFnIGlzCisgICAgICAgdGhlbiBsb2NhdGVkIG4gYml0cyBmcm9tIHRoZSBMU0IuICBUaGUgbG93IHBhcnQgaXMgCisgICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCisgICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUgCisgICAgICAgb3JpZ2luYWwgdmFsdWVzLCB0aGlzIGNhbiBiZSBleHByZXNzZWQgYXM6CisKKyAgICAgICBJRiBuID4gMCAKKyAgICAgICAxKSBDRiA8LSAgYl8obi0xKQorICAgICAgIDIpIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl8obikKKyAgICAgICAzKSBCXyg4LW4pIDwtIGNmCisgICAgICAgNCkgQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkKKwkgKi8KKwlyZXMgPSBkOworCWlmICgoY250ID0gcyAlIDkpICE9IDApIHsKKyAgICAgICAgLyogZXh0cmFjdCB0aGUgbmV3IENBUlJZIEZMQUcuICovCisgICAgICAgIC8qIENGIDwtICBiXyhuLTEpICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoY250ID09IDEpIHsKKyAgICAgICAgICAgIGNmID0gZCAmIDB4MTsKKyAgICAgICAgICAgIC8qIG5vdGUgaGFja2VyeSBoZXJlLiAgQWNjZXNzX2ZsYWcoLi4pIGV2YWx1YXRlcyB0byBlaXRoZXIKKyAgICAgICAgICAgICAgIDAgaWYgZmxhZyBub3Qgc2V0CisgICAgICAgICAgICAgICBub24temVybyBpZiBmbGFnIGlzIHNldC4KKyAgICAgICAgICAgICAgIGRvaW5nIGFjY2Vzc19mbGFnKC4uKSAhPSAwIGNhc3RzIHRoYXQgaW50byBlaXRoZXIgCisJCQkgICAwLi4xIGluIGFueSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmxhZ3MgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgIChpLmUuIHBhY2tlZCBiaXQgYXJyYXkgb3IgdW5wYWNrZWQuKQorICAgICAgICAgICAgICovCisJCQlvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKKworICAgICAgICAvKiBCXyg4LShuKzEpKSAuLiBCXygwKSAgPC0gIGJfKDcpIC4uIGJfbiAgKi8KKyAgICAgICAgLyogbm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZG9uZSBieSB0aGUgbWFzaworICAgICAgICAgICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGRvbmUgYnkgc2hpZnRpbmcgdGhlIAorICAgICAgICAgICBvYmplY3QgdG8gdGhlIHJpZ2h0LiAgVGhlIHJlc3VsdCBtdXN0IGJlIG1hc2tlZCwKKyAgICAgICAgICAgaW4gY2FzZSB0aGUgb2JqZWN0IGNhbWUgaW4gYW5kIHdhcyB0cmVhdGVkIAorICAgICAgICAgICBhcyBhIG5lZ2F0aXZlIG51bWJlci4gIE5lZWRlZD8/PyAqLworCisgICAgICAgIG1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKyAgICAgICAgcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisKKyAgICAgICAgLyogbm93IHRoZSBoaWdoIHN0dWZmIHdoaWNoIHJvdGF0ZWQgYXJvdW5kIAorICAgICAgICAgICBpbnRvIHRoZSBwb3NpdGlvbnMgQl9jbnQtMiAuLiBCXzAgKi8KKyAgICAgICAgLyogQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkgKi8KKyAgICAgICAgLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLiAKKyAgICAgICAgICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4gCisgICAgICAgICAqLworICAgICAgICByZXMgfD0gKGQgPDwgKDkgLSBjbnQpKTsKKworICAgICAgICAvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4gICovCisJCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgICAgIC8qICBCXyg4LW4pIDwtIGNmICovCisgICAgICAgICAgICByZXMgfD0gMSA8PCAoOCAtIGNudCk7CisgICAgICAgIH0KKyAgICAgICAgLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworICAgICAgICAvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogY250PT0xLCB0aGVuIGl0IGlzIHRoZSAKKyAgICAgICAgICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCisgICAgICAgIC8qIHBhcmVudGhlc2l6ZWQuLi4gKi8KKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiA2KSAmIDB4MikpLAorCQkJCQkJCQkgRl9PRik7CisJCX0KKwl9CisJcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJjcl93b3JkKHUxNiBkLCB1OCBzKQoreworCXUzMiByZXMsIGNudDsKKwl1MzIJbWFzaywgY2YsIG9jZiA9IDA7CisKKwkvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLworCXJlcyA9IGQ7CisJaWYgKChjbnQgPSBzICUgMTcpICE9IDApIHsKKwkJaWYgKGNudCA9PSAxKSB7CisJCQljZiA9IGQgJiAweDE7CisJCQlvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOworCQl9IGVsc2UKKwkJCWNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKKwkJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKKwkJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJCXJlcyB8PSAoZCA8PCAoMTcgLSBjbnQpKTsKKwkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJCQlyZXMgfD0gMSA8PCAoMTYgLSBjbnQpOworCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiAxNCkgJiAweDIpKSwKKwkJCQkJCQkJIEZfT0YpOworCQl9CisJfQorCXJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBSQ1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgcmNyX2xvbmcodTMyIGQsIHU4IHMpCit7CisJdTMyIHJlcywgY250OworCXUzMiBtYXNrLCBjZiwgb2NmID0gMDsKKworCS8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgeworCQlpZiAoY250ID09IDEpIHsKKwkJCWNmID0gZCAmIDB4MTsKKwkJCW9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7CisJCX0gZWxzZQorCQkJY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOworCQltYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOworCQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwkJaWYgKGNudCAhPSAxKQorCQkJcmVzIHw9IChkIDw8ICgzMyAtIGNudCkpOworCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCisJCQlyZXMgfD0gMSA8PCAoMzIgLSBjbnQpOworCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiAzMCkgJiAweDIpKSwKKwkJCQkJCQkJIEZfT0YpOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcm9sX2J5dGUodTggZCwgdTggcykKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7CisKKyAgICAvKiByb3RhdGUgbGVmdCAqLworICAgIC8qIAorICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgorICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuICAKKworICAgICAgIGhhdmUgCisKKyAgICAgICBDRiAgQl83IC4uLiBCXzAgCisKKyAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA4LgorICAgICAgIE11Y2ggc2ltcGxlciB0aGFuIHRoZSAicmNsIiBvciAicmNyIiBvcGVyYXRpb25zLgorCisgICAgICAgSUYgbiA+IDAgCisgICAgICAgMSkgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKQorICAgICAgIDIpIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikKKwkgKi8KKyAgICByZXMgPSBkOworCWlmICgoY250ID0gcyAlIDgpICE9IDApIHsKKwkJLyogQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKSAqLworCQlyZXMgPSAoZCA8PCBjbnQpOworCisJCS8qIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikgKi8KKwkJbWFzayA9ICgxIDw8IGNudCkgLSAxOworCQlyZXMgfD0gKGQgPj4gKDggLSBjbnQpKSAmIG1hc2s7CisKKwkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwkJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIHM9PTEsIHRoZW4gaXQgaXMgdGhlCisJCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCQkJCQkgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkJCQkJIEZfT0YpOworCX0gaWYgKHMgIT0gMCkgeworCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCX0KKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgcm9sX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgeworCQlyZXMgPSAoZCA8PCBjbnQpOworCQltYXNrID0gKDEgPDwgY250KSAtIDE7CisJCXJlcyB8PSAoZCA+PiAoMTYgLSBjbnQpKSAmIG1hc2s7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgorCQkJCQkJCSBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMTQpICYgMHgyKSksCisJCQkJCQkJIEZfT0YpOworCX0gaWYgKHMgIT0gMCkgeworCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCX0KKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJvbF9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHJlZ2lzdGVyIHUzMiByZXMsIGNudCwgbWFzazsKKworCXJlcyA9IGQ7CisJaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKKwkJcmVzID0gKGQgPDwgY250KTsKKwkJbWFzayA9ICgxIDw8IGNudCkgLSAxOworCQlyZXMgfD0gKGQgPj4gKDMyIC0gY250KSkgJiBtYXNrOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCQkJCQkgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDMwKSAmIDB4MikpLAorCQkJCQkJCSBGX09GKTsKKwl9IGlmIChzICE9IDApIHsKKwkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCByb3JfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKKworICAgIC8qIHJvdGF0ZSByaWdodCAqLworICAgIC8qIAorICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgorICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuICAKKworICAgICAgIGhhdmUgCisKKyAgICAgICBCXzcgLi4uIEJfMCAKKworICAgICAgIFRoZSByb3RhdGUgaXMgZG9uZSBtb2QgOC4KKworICAgICAgIElGIG4gPiAwIAorICAgICAgIDEpIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl8obikKKyAgICAgICAyKSBCXyg3KSAuLiBCXyg4LW4pIDwtICBiXyhuLTEpIC4uIGJfKDApCisJICovCisJcmVzID0gZDsKKwlpZiAoKGNudCA9IHMgJSA4KSAhPSAwKSB7ICAgICAgICAgICAvKiBub3QgYSB0eXBvLCBkbyBuYWRhIGlmIGNudD09MCAqLworICAgICAgICAvKiBCXyg3KSAuLiBCXyg4LW4pIDwtICBiXyhuLTEpIC4uIGJfKDApICovCisgICAgICAgIHJlcyA9IChkIDw8ICg4IC0gY250KSk7CisKKyAgICAgICAgLyogQl8oOC0obisxKSkgLi4gQl8oMCkgIDwtICBiXyg3KSAuLiBiXyhuKSAqLworICAgICAgICBtYXNrID0gKDEgPDwgKDggLSBjbnQpKSAtIDE7CisgICAgICAgIHJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCisgICAgICAgIC8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyIAorICAgICAgICAgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKwkJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIHM9PTEsIHRoZW4gaXQgaXMgdGhlCisgICAgICAgICAgIHhvciBvZiB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4gIEJsZWNjay4gKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDYpLCBGX09GKTsKKwl9IGVsc2UgaWYgKHMgIT0gMCkgeworCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKwl9CisJcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJvcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKKworCXJlcyA9IGQ7CisJaWYgKChjbnQgPSBzICUgMTYpICE9IDApIHsKKwkJcmVzID0gKGQgPDwgKDE2IC0gY250KSk7CisJCW1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7CisJCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfQ0YpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKKwl9IGVsc2UgaWYgKHMgIT0gMCkgeworCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfQ0YpOworCX0KKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJvcl9sb25nKHUzMiBkLCB1OCBzKQoreworCXJlZ2lzdGVyIHUzMiByZXMsIGNudCwgbWFzazsKKworCXJlcyA9IGQ7CisJaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKKwkJcmVzID0gKGQgPDwgKDMyIC0gY250KSk7CisJCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7CisJCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDMwKSwgRl9PRik7CisJfSBlbHNlIGlmIChzICE9IDApIHsKKwkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9DRik7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc2hsX2J5dGUodTggZCwgdTggcykKK3sKKwl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisJaWYgKHMgPCA4KSB7CisJCWNudCA9IHMgJSA4OworCisJCS8qIGxhc3QgYml0IHNoaWZ0ZWQgb3V0IGdvZXMgaW50byBjYXJyeSBmbGFnICovCisJCWlmIChjbnQgPiAwKSB7CisJCQlyZXMgPSBkIDw8IGNudDsKKwkJCWNmID0gZCAmICgxIDw8ICg4IC0gY250KSk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTgpIGQ7CisJCX0KKworCQlpZiAoY250ID09IDEpIHsKKwkJCS8qIE5lZWRzIHNpbXBsaWZpY2F0aW9uLiAqLworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoCisJCQkJCQkJCQkoKChyZXMgJiAweDgwKSA9PSAweDgwKSBeCisJCQkJCQkJCQkgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwKKwkJCS8qIHdhcyAoTS54ODYuUl9GTEcmRl9DRik9PUZfQ0YpKSwgKi8KKwkJCQkJCQkJCUZfT0YpOworCQl9IGVsc2UgeworCQkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IDA7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAsIEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCQlDTEVBUl9GTEFHKEZfU0YpOworCQlTRVRfRkxBRyhGX1BGKTsKKwkJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorCXJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaGxfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisJaWYgKHMgPCAxNikgeworCQljbnQgPSBzICUgMTY7CisJCWlmIChjbnQgPiAwKSB7CisJCQlyZXMgPSBkIDw8IGNudDsKKwkJCWNmID0gZCAmICgxIDw8ICgxNiAtIGNudCkpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MTYpIGQ7CisJCX0KKworCQlpZiAoY250ID09IDEpIHsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKAorCQkJCQkJCQkJKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KKwkJCQkJCQkJCSAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAorCQkJCQkJCQkJRl9PRik7CisgICAgICAgIH0gZWxzZSB7CisJCQlDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKwkJcmVzID0gMDsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJQ0xFQVJfRkxBRyhGX1NGKTsKKwkJU0VUX0ZMQUcoRl9QRik7CisJCVNFVF9GTEFHKEZfWkYpOworCX0KKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNobF9sb25nKHUzMiBkLCB1OCBzKQoreworCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKwlpZiAocyA8IDMyKSB7CisJCWNudCA9IHMgJSAzMjsKKwkJaWYgKGNudCA+IDApIHsKKwkJCXJlcyA9IGQgPDwgY250OworCQkJY2YgPSBkICYgKDEgPDwgKDMyIC0gY250KSk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBkOworCQl9CisJCWlmIChjbnQgPT0gMSkgeworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgXgorCQkJCQkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOworCQl9IGVsc2UgeworCQkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IDA7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAwMDAwMDAsIEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCQlDTEVBUl9GTEFHKEZfU0YpOworCQlTRVRfRkxBRyhGX1BGKTsKKwkJU0VUX0ZMQUcoRl9aRik7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc2hyX2J5dGUodTggZCwgdTggcykKK3sKKwl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisJaWYgKHMgPCA4KSB7CisJCWNudCA9IHMgJSA4OworCQlpZiAoY250ID4gMCkgeworCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkJCXJlcyA9IGQgPj4gY250OworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCQl9IGVsc2UgeworCQkJcmVzID0gKHU4KSBkOworCQl9CisKKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiA2KSwgRl9PRik7CisJCX0gZWxzZSB7CisJCQlDTEVBUl9GTEFHKEZfT0YpOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gMDsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPj4gKHMtMSkpICYgMHgxLCBGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJQ0xFQVJfRkxBRyhGX1NGKTsKKwkJU0VUX0ZMQUcoRl9QRik7CisJCVNFVF9GTEFHKEZfWkYpOworCX0KKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2hyX3dvcmQodTE2IGQsIHU4IHMpCit7CisJdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworCWlmIChzIDwgMTYpIHsKKwkJY250ID0gcyAlIDE2OworCQlpZiAoY250ID4gMCkgeworCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkJCXJlcyA9IGQgPj4gY250OworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IGQ7CisJCX0KKworCQlpZiAoY250ID09IDEpIHsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisgICAgICAgIH0gZWxzZSB7CisJCQlDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICB9CisJfSBlbHNlIHsKKwkJcmVzID0gMDsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJU0VUX0ZMQUcoRl9aRik7CisJCUNMRUFSX0ZMQUcoRl9TRik7CisJCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorCXJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hyX2xvbmcodTMyIGQsIHU4IHMpCit7CisJdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworCWlmIChzIDwgMzIpIHsKKwkJY250ID0gcyAlIDMyOworCQlpZiAoY250ID4gMCkgeworCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkJCXJlcyA9IGQgPj4gY250OworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY250ID09IDEpIHsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDMwKSwgRl9PRik7CisgICAgICAgIH0gZWxzZSB7CisJCQlDTEVBUl9GTEFHKEZfT0YpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gMDsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkJU0VUX0ZMQUcoRl9aRik7CisJCUNMRUFSX0ZMQUcoRl9TRik7CisJCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc2FyX2J5dGUodTggZCwgdTggcykKK3sKKwl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmLCBtYXNrLCBzZjsKKworCXJlcyA9IGQ7CisJc2YgPSBkICYgMHg4MDsKKyAgICBjbnQgPSBzICUgODsKKwlpZiAoY250ID4gMCAmJiBjbnQgPCA4KSB7CisJCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJaWYgKHNmKSB7CisJCQlyZXMgfD0gfm1hc2s7CisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKKyAgICB9IGVsc2UgaWYgKGNudCA+PSA4KSB7CisgICAgICAgIGlmIChzZikgeworICAgICAgICAgICAgcmVzID0gMHhmZjsKKwkJCVNFVF9GTEFHKEZfQ0YpOworCQkJQ0xFQVJfRkxBRyhGX1pGKTsKKwkJCVNFVF9GTEFHKEZfU0YpOworCQkJU0VUX0ZMQUcoRl9QRik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAwOworCQkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJCVNFVF9GTEFHKEZfWkYpOworCQkJQ0xFQVJfRkxBRyhGX1NGKTsKKwkJCUNMRUFSX0ZMQUcoRl9QRik7CisJCX0KKwl9CisJcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNhcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwOworICAgIGNudCA9IHMgJSAxNjsKKwlyZXMgPSBkOworCWlmIChjbnQgPiAwICYmIGNudCA8IDE2KSB7CisgICAgICAgIG1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7CisgICAgICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisgICAgICAgIHJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisgICAgICAgIGlmIChzZikgeworICAgICAgICAgICAgcmVzIHw9IH5tYXNrOworICAgICAgICB9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworICAgIH0gZWxzZSBpZiAoY250ID49IDE2KSB7CisgICAgICAgIGlmIChzZikgeworICAgICAgICAgICAgcmVzID0gMHhmZmZmOworCQkJU0VUX0ZMQUcoRl9DRik7CisJCQlDTEVBUl9GTEFHKEZfWkYpOworCQkJU0VUX0ZMQUcoRl9TRik7CisJCQlTRVRfRkxBRyhGX1BGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IDA7CisJCQlDTEVBUl9GTEFHKEZfQ0YpOworCQkJU0VUX0ZMQUcoRl9aRik7CisJCQlDTEVBUl9GTEFHKEZfU0YpOworCQkJQ0xFQVJfRkxBRyhGX1BGKTsKKyAgICAgICAgfQorICAgIH0KKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNhcl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwMDAwMDsKKyAgICBjbnQgPSBzICUgMzI7CisJcmVzID0gZDsKKwlpZiAoY250ID4gMCAmJiBjbnQgPCAzMikgeworICAgICAgICBtYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOworCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworICAgICAgICByZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworICAgICAgICBpZiAoc2YpIHsKKyAgICAgICAgICAgIHJlcyB8PSB+bWFzazsKKyAgICAgICAgfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworICAgIH0gZWxzZSBpZiAoY250ID49IDMyKSB7CisgICAgICAgIGlmIChzZikgeworICAgICAgICAgICAgcmVzID0gMHhmZmZmZmZmZjsKKwkJCVNFVF9GTEFHKEZfQ0YpOworCQkJQ0xFQVJfRkxBRyhGX1pGKTsKKwkJCVNFVF9GTEFHKEZfU0YpOworCQkJU0VUX0ZMQUcoRl9QRik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAwOworCQkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJCVNFVF9GTEFHKEZfWkYpOworCQkJQ0xFQVJfRkxBRyhGX1NGKTsKKwkJCUNMRUFSX0ZMQUcoRl9QRik7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQoreworCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKwlpZiAocyA8IDE2KSB7CisJCWNudCA9IHMgJSAxNjsKKwkJaWYgKGNudCA+IDApIHsKKwkJCXJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMTYtY250KSk7CisJCQljZiA9IGQgJiAoMSA8PCAoMTYgLSBjbnQpKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBkOworCQl9CisJCWlmIChjbnQgPT0gMSkgeworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KKwkJCQkJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwkJfSBlbHNlIHsKKwkJCUNMRUFSX0ZMQUcoRl9PRik7CisJCX0KKwl9IGVsc2UgeworCQlyZXMgPSAwOworCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAsIEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCQlDTEVBUl9GTEFHKEZfU0YpOworCQlTRVRfRkxBRyhGX1BGKTsKKwkJU0VUX0ZMQUcoRl9aRik7CisJfQorCXJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreworCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKwlpZiAocyA8IDMyKSB7CisJCWNudCA9IHMgJSAzMjsKKwkJaWYgKGNudCA+IDApIHsKKwkJCXJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMzItY250KSk7CisJCQljZiA9IGQgJiAoMSA8PCAoMzIgLSBjbnQpKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IGQ7CisJCX0KKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCisJCQkJCQkJCSAgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwgRl9PRik7CisJCX0gZWxzZSB7CisJCQlDTEVBUl9GTEFHKEZfT0YpOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gMDsKKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJCUNMRUFSX0ZMQUcoRl9TRik7CisJCVNFVF9GTEFHKEZfUEYpOworCQlTRVRfRkxBRyhGX1pGKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFJEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNocmRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQoreworCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKwlpZiAocyA8IDE2KSB7CisJCWNudCA9IHMgJSAxNjsKKwkJaWYgKGNudCA+IDApIHsKKwkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJCQlyZXMgPSAoZCA+PiBjbnQpIHwgKGZpbGwgPDwgKDE2IC0gY250KSk7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCQl9IGVsc2UgeworCQkJcmVzID0gZDsKKwkJfQorCisJCWlmIChjbnQgPT0gMSkgeworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKKyAgICAgICAgfSBlbHNlIHsKKwkJCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgICAgIH0KKwl9IGVsc2UgeworCQlyZXMgPSAwOworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCQlTRVRfRkxBRyhGX1pGKTsKKwkJQ0xFQVJfRkxBRyhGX1NGKTsKKwkJQ0xFQVJfRkxBRyhGX1BGKTsKKyAgICB9CisJcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hyZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCit7CisJdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworCWlmIChzIDwgMzIpIHsKKwkJY250ID0gcyAlIDMyOworCQlpZiAoY250ID4gMCkgeworCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkJCXJlcyA9IChkID4+IGNudCkgfCAoZmlsbCA8PCAoMzIgLSBjbnQpKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IGQ7CisJCX0KKwkJaWYgKGNudCA9PSAxKSB7CisJCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOworICAgICAgICB9IGVsc2UgeworCQkJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICAgICAgfQorCX0gZWxzZSB7CisJCXJlcyA9IDA7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJCVNFVF9GTEFHKEZfWkYpOworCQlDTEVBUl9GTEFHKEZfU0YpOworCQlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNiYl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICByZWdpc3RlciB1MzIgYmM7CisKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJCXJlcyA9IGQgLSBzIC0gMTsKKwllbHNlCisJCXJlcyA9IGQgLSBzOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKwliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2JiX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgcmVnaXN0ZXIgdTMyIGJjOworCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorICAgICAgICByZXMgPSBkIC0gcyAtIDE7CisgICAgZWxzZQorICAgICAgICByZXMgPSBkIC0gczsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2JiX2xvbmcodTMyIGQsIHUzMiBzKQoreworCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisJcmVnaXN0ZXIgdTMyIGJjOworCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorICAgICAgICByZXMgPSBkIC0gcyAtIDE7CisgICAgZWxzZQorICAgICAgICByZXMgPSBkIC0gczsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisJYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc3ViX2J5dGUodTggZCwgdTggcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBiYzsKKworCXJlcyA9IGQgLSBzOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKwliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTVUIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc3ViX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgcmVnaXN0ZXIgdTMyIGJjOworCisgICAgcmVzID0gZCAtIHM7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKwliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMCwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKwlyZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHN1Yl9sb25nKHUzMiBkLCB1MzIgcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCXJlZ2lzdGVyIHUzMiBiYzsKKworCXJlcyA9IGQgLSBzOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCisJLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKwliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMDAwMDAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0ZXN0X2J5dGUodTggZCwgdTggcykKK3sKKyAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworCUNMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKwlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisJcmVzID0gZCAmIHM7CisKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJLyogQUYgPT0gZG9udCBjYXJlICovCisJQ0xFQVJfRkxBRyhGX0NGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0ZXN0X2xvbmcodTMyIGQsIHUzMiBzKQoreworCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKwlyZXMgPSBkICYgczsKKworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJLyogQUYgPT0gZG9udCBjYXJlICovCisJQ0xFQVJfRkxBRyhGX0NGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBYT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCB4b3JfYnl0ZSh1OCBkLCB1OCBzKQoreworCXJlZ2lzdGVyIHU4IHJlczsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKwlyZXMgPSBkIF4gczsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHhvcl93b3JkKHUxNiBkLCB1MTYgcykKK3sKKwlyZWdpc3RlciB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisJcmVzID0gZCBeIHM7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX0FGKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB4b3JfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisJcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworCXJlcyA9IGQgXiBzOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF9ieXRlKHU4IHMpCit7CisJczE2IHJlcyA9IChzMTYpKChzOClNLng4Ni5SX0FMICogKHM4KXMpOworCisJTS54ODYuUl9BWCA9IHJlczsKKwlpZiAoKChNLng4Ni5SX0FMICYgMHg4MCkgPT0gMCAmJiBNLng4Ni5SX0FIID09IDB4MDApIHx8CisJCSgoTS54ODYuUl9BTCAmIDB4ODApICE9IDAgJiYgTS54ODYuUl9BSCA9PSAweEZGKSkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCX0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF93b3JkKHUxNiBzKQoreworCXMzMiByZXMgPSAoczE2KU0ueDg2LlJfQVggKiAoczE2KXM7CisKKwlNLng4Ni5SX0FYID0gKHUxNilyZXM7CisJTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7CisJaWYgKCgoTS54ODYuUl9BWCAmIDB4ODAwMCkgPT0gMCAmJiBNLng4Ni5SX0RYID09IDB4MDApIHx8CisJCSgoTS54ODYuUl9BWCAmIDB4ODAwMCkgIT0gMCAmJiBNLng4Ni5SX0RYID09IDB4RkYpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpCit7CisjaWZkZWYJX19IQVNfTE9OR19MT05HX18KKwlzNjQgcmVzID0gKHMzMilkICogKHMzMilzOworCisJKnJlc19sbyA9ICh1MzIpcmVzOworCSpyZXNfaGkgPSAodTMyKShyZXMgPj4gMzIpOworI2Vsc2UKKwl1MzIJZF9sbyxkX2hpLGRfc2lnbjsKKwl1MzIJc19sbyxzX2hpLHNfc2lnbjsKKwl1MzIJcmxvX2xvLHJsb19oaSxyaGlfbG87CisKKwlpZiAoKGRfc2lnbiA9IGQgJiAweDgwMDAwMDAwKSAhPSAwKQorCQlkID0gLWQ7CisJZF9sbyA9IGQgJiAweEZGRkY7CisJZF9oaSA9IGQgPj4gMTY7CisJaWYgKChzX3NpZ24gPSBzICYgMHg4MDAwMDAwMCkgIT0gMCkKKwkJcyA9IC1zOworCXNfbG8gPSBzICYgMHhGRkZGOworCXNfaGkgPSBzID4+IDE2OworCXJsb19sbyA9IGRfbG8gKiBzX2xvOworCXJsb19oaSA9IChkX2hpICogc19sbyArIGRfbG8gKiBzX2hpKSArIChybG9fbG8gPj4gMTYpOworCXJoaV9sbyA9IGRfaGkgKiBzX2hpICsgKHJsb19oaSA+PiAxNik7CisJKnJlc19sbyA9IChybG9faGkgPDwgMTYpIHwgKHJsb19sbyAmIDB4RkZGRik7CisJKnJlc19oaSA9IHJoaV9sbzsKKwlpZiAoZF9zaWduICE9IHNfc2lnbikgeworCQlkID0gfipyZXNfbG87CisJCXMgPSAoKChkICYgMHhGRkZGKSArIDEpID4+IDE2KSArIChkID4+IDE2KTsKKwkJKnJlc19sbyA9IH4qcmVzX2xvKzE7CisJCSpyZXNfaGkgPSB+KnJlc19oaSsocyA+PiAxNik7CisJCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfbG9uZyh1MzIgcykKK3sKKwlpbXVsX2xvbmdfZGlyZWN0KCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7CisJaWYgKCgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSA9PSAwICYmIE0ueDg2LlJfRURYID09IDB4MDApIHx8CisJCSgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSAhPSAwICYmIE0ueDg2LlJfRURYID09IDB4RkYpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG11bF9ieXRlKHU4IHMpCit7CisJdTE2IHJlcyA9ICh1MTYpKE0ueDg2LlJfQUwgKiBzKTsKKworCU0ueDg2LlJfQVggPSByZXM7CisJaWYgKE0ueDg2LlJfQUggPT0gMCkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCX0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfd29yZCh1MTYgcykKK3sKKwl1MzIgcmVzID0gTS54ODYuUl9BWCAqIHM7CisKKwlNLng4Ni5SX0FYID0gKHUxNilyZXM7CisJTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7CisJaWYgKE0ueDg2LlJfRFggPT0gMCkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfbG9uZyh1MzIgcykKK3sKKyNpZmRlZglfX0hBU19MT05HX0xPTkdfXworCXU2NCByZXMgPSAodTMyKU0ueDg2LlJfRUFYICogKHUzMilzOworCisJTS54ODYuUl9FQVggPSAodTMyKXJlczsKKwlNLng4Ni5SX0VEWCA9ICh1MzIpKHJlcyA+PiAzMik7CisjZWxzZQorCXUzMglhLGFfbG8sYV9oaTsKKwl1MzIJc19sbyxzX2hpOworCXUzMglybG9fbG8scmxvX2hpLHJoaV9sbzsKKworCWEgPSBNLng4Ni5SX0VBWDsKKwlhX2xvID0gYSAmIDB4RkZGRjsKKwlhX2hpID0gYSA+PiAxNjsKKwlzX2xvID0gcyAmIDB4RkZGRjsKKwlzX2hpID0gcyA+PiAxNjsKKwlybG9fbG8gPSBhX2xvICogc19sbzsKKwlybG9faGkgPSAoYV9oaSAqIHNfbG8gKyBhX2xvICogc19oaSkgKyAocmxvX2xvID4+IDE2KTsKKwlyaGlfbG8gPSBhX2hpICogc19oaSArIChybG9faGkgPj4gMTYpOworCU0ueDg2LlJfRUFYID0gKHJsb19oaSA8PCAxNikgfCAocmxvX2xvICYgMHhGRkZGKTsKKwlNLng4Ni5SX0VEWCA9IHJoaV9sbzsKKyNlbmRpZgorCisJaWYgKE0ueDg2LlJfRURYID09IDApIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwl9IGVsc2UgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlkaXZfYnl0ZSh1OCBzKQoreworICAgIHMzMiBkdmQsIGRpdiwgbW9kOworCisJZHZkID0gKHMxNilNLng4Ni5SX0FYOworCWlmIChzID09IDApIHsKKwkJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisgICAgICAgIHJldHVybjsKKwl9CisJZGl2ID0gZHZkIC8gKHM4KXM7CisJbW9kID0gZHZkICUgKHM4KXM7CisJaWYgKGFicyhkaXYpID4gMHg3ZikgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwkJcmV0dXJuOworCX0KKwlNLng4Ni5SX0FMID0gKHM4KSBkaXY7CisJTS54ODYuUl9BSCA9IChzOCkgbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlkaXZfd29yZCh1MTYgcykKK3sKKwlzMzIgZHZkLCBkaXYsIG1vZDsKKworCWR2ZCA9ICgoKHMzMilNLng4Ni5SX0RYKSA8PCAxNikgfCBNLng4Ni5SX0FYOworCWlmIChzID09IDApIHsKKwkJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJCXJldHVybjsKKwl9CisJZGl2ID0gZHZkIC8gKHMxNilzOworCW1vZCA9IGR2ZCAlIChzMTYpczsKKwlpZiAoYWJzKGRpdikgPiAweDdmZmYpIHsKKwkJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJCXJldHVybjsKKwl9CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOworCisJTS54ODYuUl9BWCA9ICh1MTYpZGl2OworCU0ueDg2LlJfRFggPSAodTE2KW1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZGl2X2xvbmcodTMyIHMpCit7CisjaWZkZWYJX19IQVNfTE9OR19MT05HX18KKwlzNjQgZHZkLCBkaXYsIG1vZDsKKworCWR2ZCA9ICgoKHM2NClNLng4Ni5SX0VEWCkgPDwgMzIpIHwgTS54ODYuUl9FQVg7CisJaWYgKHMgPT0gMCkgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwkJcmV0dXJuOworCX0KKwlkaXYgPSBkdmQgLyAoczMyKXM7CisJbW9kID0gZHZkICUgKHMzMilzOworCWlmIChhYnMoZGl2KSA+IDB4N2ZmZmZmZmYpIHsKKwkJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJCXJldHVybjsKKwl9CisjZWxzZQorCXMzMiBkaXYgPSAwLCBtb2Q7CisJczMyIGhfZHZkID0gTS54ODYuUl9FRFg7CisJdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7CisJdTMyIGFic19zID0gcyAmIDB4N0ZGRkZGRkY7CisJdTMyIGFic19oX2R2ZCA9IGhfZHZkICYgMHg3RkZGRkZGRjsKKwl1MzIgaF9zID0gYWJzX3MgPj4gMTsKKwl1MzIgbF9zID0gYWJzX3MgPDwgMzE7CisJaW50IGNvdW50ZXIgPSAzMTsKKwlpbnQgY2Fycnk7CisKKwlpZiAocyA9PSAwKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJZGl2IDw8PSAxOworCQljYXJyeSA9IChsX2R2ZCA+PSBsX3MpID8gMCA6IDE7CisJCQorCQlpZiAoYWJzX2hfZHZkIDwgKGhfcyArIGNhcnJ5KSkgeworCQkJaF9zID4+PSAxOworCQkJbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWFic19oX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCQkJbF9kdmQgPSBjYXJyeSA/ICgoMHhGRkZGRkZGRiAtIGxfcykgKyBsX2R2ZCArIDEpCisJCQkJOiAobF9kdmQgLSBsX3MpOworCQkJaF9zID4+PSAxOworCQkJbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7CisJCQlkaXYgfD0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCX0gd2hpbGUgKGNvdW50ZXIgPiAtMSk7CisJLyogb3ZlcmZsb3cgKi8KKwlpZiAoYWJzX2hfZHZkIHx8IChsX2R2ZCA+IGFic19zKSkgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwkJcmV0dXJuOworCX0KKwkvKiBzaWduICovCisJZGl2IHw9ICgoaF9kdmQgJiAweDEwMDAwMDAwKSBeIChzICYgMHgxMDAwMDAwMCkpOworCW1vZCA9IGxfZHZkOworCisjZW5kaWYKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlTRVRfRkxBRyhGX1pGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOworCisJTS54ODYuUl9FQVggPSAodTMyKWRpdjsKKwlNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZGl2X2J5dGUodTggcykKK3sKKwl1MzIgZHZkLCBkaXYsIG1vZDsKKworCWR2ZCA9IE0ueDg2LlJfQVg7CisgICAgaWYgKHMgPT0gMCkgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwlkaXYgPSBkdmQgLyAodTgpczsKKwltb2QgPSBkdmQgJSAodTgpczsKKwlpZiAoYWJzKGRpdikgPiAweGZmKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworICAgICAgICByZXR1cm47CisJfQorCU0ueDg2LlJfQUwgPSAodTgpZGl2OworCU0ueDg2LlJfQUggPSAodTgpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZGl2X3dvcmQodTE2IHMpCit7CisJdTMyIGR2ZCwgZGl2LCBtb2Q7CisKKwlkdmQgPSAoKCh1MzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKKwlpZiAocyA9PSAwKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCWRpdiA9IGR2ZCAvICh1MTYpczsKKwltb2QgPSBkdmQgJSAodTE2KXM7CisJaWYgKGFicyhkaXYpID4gMHhmZmZmKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCQlyZXR1cm47CisJfQorCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhkaXYgPT0gMCwgRl9aRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKG1vZCAmIDB4ZmYpLCBGX1BGKTsKKworCU0ueDg2LlJfQVggPSAodTE2KWRpdjsKKwlNLng4Ni5SX0RYID0gKHUxNiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkaXZfbG9uZyh1MzIgcykKK3sKKyNpZmRlZglfX0hBU19MT05HX0xPTkdfXworCXU2NCBkdmQsIGRpdiwgbW9kOworCisJZHZkID0gKCgodTY0KU0ueDg2LlJfRURYKSA8PCAzMikgfCBNLng4Ni5SX0VBWDsKKwlpZiAocyA9PSAwKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCQlyZXR1cm47CisJfQorCWRpdiA9IGR2ZCAvICh1MzIpczsKKwltb2QgPSBkdmQgJSAodTMyKXM7CisJaWYgKGFicyhkaXYpID4gMHhmZmZmZmZmZikgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwkJcmV0dXJuOworCX0KKyNlbHNlCisJczMyIGRpdiA9IDAsIG1vZDsKKwlzMzIgaF9kdmQgPSBNLng4Ni5SX0VEWDsKKwl1MzIgbF9kdmQgPSBNLng4Ni5SX0VBWDsKKworCXUzMiBoX3MgPSBzOworCXUzMiBsX3MgPSAwOworCWludCBjb3VudGVyID0gMzI7CisJaW50IGNhcnJ5OworCQkKKwlpZiAocyA9PSAwKSB7CisJCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJZGl2IDw8PSAxOworCQljYXJyeSA9IChsX2R2ZCA+PSBsX3MpID8gMCA6IDE7CisJCQorCQlpZiAoaF9kdmQgPCAoaF9zICsgY2FycnkpKSB7CisJCQloX3MgPj49IDE7CisJCQlsX3MgPSBzIDw8ICgtLWNvdW50ZXIpOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQloX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCQkJbF9kdmQgPSBjYXJyeSA/ICgoMHhGRkZGRkZGRiAtIGxfcykgKyBsX2R2ZCArIDEpCisJCQkJOiAobF9kdmQgLSBsX3MpOworCQkJaF9zID4+PSAxOworCQkJbF9zID0gcyA8PCAoLS1jb3VudGVyKTsKKwkJCWRpdiB8PSAxOworCQkJY29udGludWU7CisJCX0KKwkJCisJfSB3aGlsZSAoY291bnRlciA+IC0xKTsKKwkvKiBvdmVyZmxvdyAqLworCWlmIChoX2R2ZCB8fCAobF9kdmQgPiBzKSkgeworCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwkJcmV0dXJuOworCX0KKwltb2QgPSBsX2R2ZDsKKyNlbmRpZgorCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX0FGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCVNFVF9GTEFHKEZfWkYpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShtb2QgJiAweGZmKSwgRl9QRik7CisKKwlNLng4Ni5SX0VBWCA9ICh1MzIpZGl2OworCU0ueDg2LlJfRURYID0gKHUzMiltb2Q7Cit9CisKKyNlbmRpZgkvKiBfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU4gc3RyaW5nIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbnMoaW50IHNpemUpCit7CisJaW50IGluYyA9IHNpemU7CisKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpIHsKKwkJaW5jID0gLXNpemU7CisJfQorCWlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKyAgICAgICAgLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworICAgICAgICAvKiBpbiB1bnRpbCBDWCBpcyBaRVJPLiAqLworCQl1MzIgY291bnQgPSAoKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSA/CisJCQkJCSBNLng4Ni5SX0VDWCA6IE0ueDg2LlJfQ1gpOworICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworCQkJCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKKwkJCQkJCQkJCSgqc3lzX2luYikoTS54ODYuUl9EWCkpOworCQkJCU0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworCQkJCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKKwkJCQkJCQkJCSgqc3lzX2ludykoTS54ODYuUl9EWCkpOworCQkJCU0ueDg2LlJfREkgKz0gaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKwkJCQlzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCisJCQkJCQkJCQkoKnN5c19pbmwpKE0ueDg2LlJfRFgpKTsKKwkJCQlNLng4Ni5SX0RJICs9IGluYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQlNLng4Ni5SX0NYID0gMDsKKwkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQlNLng4Ni5SX0VDWCA9IDA7CisgICAgICAgIH0KKwkJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgY2FzZSAxOgorCQkJc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAorCQkJCQkJCQkoKnN5c19pbmIpKE0ueDg2LlJfRFgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKwkJCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKKwkJCQkJCQkJKCpzeXNfaW53KShNLng4Ni5SX0RYKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisJCQlzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCisJCQkJCQkJCSgqc3lzX2lubCkoTS54ODYuUl9EWCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwkJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9VVCBzdHJpbmcgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG91dHMoaW50IHNpemUpCit7CisgICAgaW50IGluYyA9IHNpemU7CisKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpIHsKKyAgICAgICAgaW5jID0gLXNpemU7CisgICAgfQorCWlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKyAgICAgICAgLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworICAgICAgICAvKiBvdXQgdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwkJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPworCQkJCQkgTS54ODYuUl9FQ1ggOiBNLng4Ni5SX0NYKTsKKyAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKwkJCQkoKnN5c19vdXRiKShNLng4Ni5SX0RYLAorCQkJCQkJIGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOworCQkJCU0ueDg2LlJfU0kgKz0gaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworCQkJCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsCisJCQkJCQkgZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7CisJCQkJTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworCQkJCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsCisJCQkJCQkgZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7CisJCQkJTS54ODYuUl9TSSArPSBpbmM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJTS54ODYuUl9DWCA9IDA7CisJCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQkJTS54ODYuUl9FQ1ggPSAwOworICAgICAgICB9CisJCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgIGNhc2UgMToKKwkJCSgqc3lzX291dGIpKE0ueDg2LlJfRFgsCisJCQkJCSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKwkJCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsCisJCQkJCSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKwkJCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsCisJCQkJCSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJCU0ueDg2LlJfU0kgKz0gaW5jOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyCS0gQWRkcmVzcyB0byBmZXRjaCB3b3JkIGZyb20KKworUkVNQVJLUzoKK0ZldGNoZXMgYSB3b3JkIGZyb20gZW11bGF0b3IgbWVtb3J5IHVzaW5nIGFuIGFic29sdXRlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IG1lbV9hY2Nlc3Nfd29yZChpbnQgYWRkcikKK3sKK0RCKAlpZiAoQ0hFQ0tfTUVNX0FDQ0VTUygpKQorCSAgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MoYWRkcik7KQorCXJldHVybiAoKnN5c19yZHcpKGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1c2hlcyBhIHdvcmQgb250byB0aGUgc3RhY2suCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHB1c2hfd29yZCh1MTYgdykKK3sKK0RCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisJICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorCU0ueDg2LlJfU1AgLT0gMjsKKwkoKnN5c193cncpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCwgdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVzaGVzIGEgbG9uZyBvbnRvIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHVzaF9sb25nKHUzMiB3KQoreworREIoCWlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKwkgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisJTS54ODYuUl9TUCAtPSA0OworCSgqc3lzX3dybCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgd29yZCBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBwb3Bfd29yZCh2b2lkKQoreworCXJlZ2lzdGVyIHUxNiByZXM7CisKK0RCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisJICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorCXJlcyA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKwlNLng4Ni5SX1NQICs9IDI7CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgbG9uZyBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBwb3BfbG9uZyh2b2lkKQoreworICAgIHJlZ2lzdGVyIHUzMiByZXM7CisKK0RCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisJICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorCXJlcyA9ICgqc3lzX3JkbCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKwlNLng4Ni5SX1NQICs9IDQ7CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KKwordTE2IGFhYV93b3JkICh1MTYgZCkKK3sgcmV0dXJuIGFhYV93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9CisKK3UxNiBhYXNfd29yZCAodTE2IGQpCit7IHJldHVybiBhYXNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQorCit1MTYgYWFkX3dvcmQgKHUxNiBkKQoreyByZXR1cm4gYWFkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KKwordTE2IGFhbV93b3JkICh1OCBkKQoreyByZXR1cm4gYWFtX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KKwordTggYWRjX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiBhZGNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiBhZGNfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4gYWRjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgYWRjX2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgcmV0dXJuIGFkY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggYWRkX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiBhZGRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiBhZGRfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4gYWRkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgYWRkX2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgcmV0dXJuIGFkZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggYW5kX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiBhbmRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiBhbmRfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4gYW5kX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgcmV0dXJuIGFuZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggY21wX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiBjbXBfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiBjbXBfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4gY21wX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgY21wX2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgcmV0dXJuIGNtcF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggZGFhX2J5dGUgKHU4IGQpCit7IHJldHVybiBkYWFfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQorCit1OCBkYXNfYnl0ZSAodTggZCkKK3sgcmV0dXJuIGRhc19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9CisKK3U4IGRlY19ieXRlICh1OCBkKQoreyByZXR1cm4gZGVjX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KKwordTE2IGRlY193b3JkICh1MTYgZCkKK3sgcmV0dXJuIGRlY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9CisKK3UzMiBkZWNfbG9uZyAodTMyIGQpCit7IHJldHVybiBkZWNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQorCit1OCBpbmNfYnl0ZSAodTggZCkKK3sgcmV0dXJuIGluY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9CisKK3UxNiBpbmNfd29yZCAodTE2IGQpCit7IHJldHVybiBpbmNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQorCit1MzIgaW5jX2xvbmcgKHUzMiBkKQoreyByZXR1cm4gaW5jX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KKwordTggb3JfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIG9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MTYgb3Jfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4gb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UzMiBvcl9sb25nICh1MzIgZCwgdTMyIHMpCit7IHJldHVybiBvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggbmVnX2J5dGUgKHU4IHMpCit7IHJldHVybiBuZWdfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQorCit1MTYgbmVnX3dvcmQgKHUxNiBzKQoreyByZXR1cm4gbmVnX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KKwordTMyIG5lZ19sb25nICh1MzIgcykKK3sgcmV0dXJuIG5lZ19sb25nX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9CisKK3U4IG5vdF9ieXRlICh1OCBzKQoreyByZXR1cm4gbm90X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KKwordTE2IG5vdF93b3JkICh1MTYgcykKK3sgcmV0dXJuIG5vdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9CisKK3UzMiBub3RfbG9uZyAodTMyIHMpCit7IHJldHVybiBub3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQorCit1OCByY2xfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIHJjbF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHJjbF93b3JkICh1MTYgZCwgdTggcykKK3sgcmV0dXJuIHJjbF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTMyIHJjbF9sb25nICh1MzIgZCwgdTggcykKK3sgcmV0dXJuIHJjbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggcmNyX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiByY3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiByY3Jfd29yZCAodTE2IGQsIHU4IHMpCit7IHJldHVybiByY3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UzMiByY3JfbG9uZyAodTMyIGQsIHU4IHMpCit7IHJldHVybiByY3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3U4IHJvbF9ieXRlICh1OCBkLCB1OCBzKQoreyByZXR1cm4gcm9sX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MTYgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKQoreyByZXR1cm4gcm9sX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKQoreyByZXR1cm4gcm9sX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1OCByb3JfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIHJvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHJvcl93b3JkICh1MTYgZCwgdTggcykKK3sgcmV0dXJuIHJvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTMyIHJvcl9sb25nICh1MzIgZCwgdTggcykKK3sgcmV0dXJuIHJvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggc2hsX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiBzaGxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiBzaGxfd29yZCAodTE2IGQsIHU4IHMpCit7IHJldHVybiBzaGxfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UzMiBzaGxfbG9uZyAodTMyIGQsIHU4IHMpCit7IHJldHVybiBzaGxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3U4IHNocl9ieXRlICh1OCBkLCB1OCBzKQoreyByZXR1cm4gc2hyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MTYgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKQoreyByZXR1cm4gc2hyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKQoreyByZXR1cm4gc2hyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1OCBzYXJfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIHNhcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHNhcl93b3JkICh1MTYgZCwgdTggcykKK3sgcmV0dXJuIHNhcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTMyIHNhcl9sb25nICh1MzIgZCwgdTggcykKK3sgcmV0dXJuIHNhcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQoreyByZXR1cm4gc2hsZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQorCit1MzIgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCit7IHJldHVybiBzaGxkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpOyB9CisKK3UxNiBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKK3sgcmV0dXJuIHNocmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscyk7IH0KKwordTMyIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreyByZXR1cm4gc2hyZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQorCit1OCBzYmJfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIHNiYl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHNiYl93b3JkICh1MTYgZCwgdTE2IHMpCit7IHJldHVybiBzYmJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UzMiBzYmJfbG9uZyAodTMyIGQsIHUzMiBzKQoreyByZXR1cm4gc2JiX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1OCBzdWJfYnl0ZSAodTggZCwgdTggcykKK3sgcmV0dXJuIHN1Yl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTE2IHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpCit7IHJldHVybiBzdWJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UzMiBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKQoreyByZXR1cm4gc3ViX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit2b2lkIHRlc3RfYnl0ZSAodTggZCwgdTggcykKK3sgdGVzdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordm9pZCB0ZXN0X3dvcmQgKHUxNiBkLCB1MTYgcykKK3sgdGVzdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordm9pZCB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgdGVzdF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordTggeG9yX2J5dGUgKHU4IGQsIHU4IHMpCit7IHJldHVybiB4b3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9CisKK3UxNiB4b3Jfd29yZCAodTE2IGQsIHUxNiBzKQoreyByZXR1cm4geG9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQorCit1MzIgeG9yX2xvbmcgKHUzMiBkLCB1MzIgcykKK3sgcmV0dXJuIHhvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KKwordm9pZCBpbXVsX2J5dGUgKHU4IHMpCit7IGltdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpOyB9CisKK3ZvaWQgaW11bF93b3JkICh1MTYgcykKK3sgaW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscyk7IH0KKwordm9pZCBpbXVsX2xvbmcgKHUzMiBzKQoreyBpbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKTsgfQorCit2b2lkIGltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcykKK3sgaW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLHJlc19sbyxyZXNfaGksZCxzKTsgfQorCit2b2lkIG11bF9ieXRlICh1OCBzKQoreyBtdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpOyB9CisKK3ZvaWQgbXVsX3dvcmQgKHUxNiBzKQoreyBtdWxfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLHMpOyB9CisKK3ZvaWQgbXVsX2xvbmcgKHUzMiBzKQoreyBtdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpOyB9CisKK3ZvaWQgaWRpdl9ieXRlICh1OCBzKQoreyBpZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKTsgfQorCit2b2lkIGlkaXZfd29yZCAodTE2IHMpCit7IGlkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscyk7IH0KKwordm9pZCBpZGl2X2xvbmcgKHUzMiBzKQoreyBpZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKTsgfQorCit2b2lkIGRpdl9ieXRlICh1OCBzKQoreyBkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpOyB9CisKK3ZvaWQgZGl2X3dvcmQgKHUxNiBzKQoreyBkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscyk7IH0KKwordm9pZCBkaXZfbG9uZyAodTMyIHMpCit7IGRpdl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgsTS54ODYuUl9FRFgscyk7IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvc3lzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0Y2E3OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9zeXMuYwpAQCAtMCwwICsxLDY1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8KKyoJCQkJcHJvZ3JhbW1lZCBJL08gYW5kIG1lbW9yeSBhY2Nlc3MuIEluY2x1ZGVkIGluIHRoaXMgbW9kdWxlCisqCQkJCWFyZSBkZWZhdWx0IGZ1bmN0aW9ucyB3aXRoIGxpbWl0ZWQgdXNlZnVsbmVzcy4gRm9yIHJlYWwKKyoJCQkJdXNlcyB0aGVzZSBmdW5jdGlvbnMgd2lsbCBtb3N0IGxpa2VseSBiZSBvdmVycmlkZW4gYnkgdGhlCisqCQkJCXVzZXIgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgorI2luY2x1ZGUgIng4NmVtdS9kZWJ1Zy5oIgorI2luY2x1ZGUgIng4NmVtdS9wcmltX29wcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitYODZFTVVfc3lzRW52CQlfWDg2RU1VX2VudjsJCS8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlICovCitYODZFTVVfaW50ckZ1bmNzCV9YODZFTVVfaW50clRhYlsyNTZdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIF9fYWxwaGFfXworLyogdG8gY29wZSB3aXRoIGJyb2tlbiBlZ2NzLTEuMS4yIDotKCgoKCAqLworCisvKgorICogaW5saW5lIGZ1bmN0aW9ucyB0byBkbyB1bmFsaWduZWQgYWNjZXNzZXMKKyAqIGZyb20gbGludXgvaW5jbHVkZS9hc20tYWxwaGEvdW5hbGlnbmVkLmgKKyAqLworCisvKgorICogRUdDUyAxLjEga25vd3MgYWJvdXQgYXJiaXRyYXJ5IHVuYWxpZ25lZCBsb2Fkcy4gIERlZmluZSBzb21lCisgKiBwYWNrZWQgc3RydWN0dXJlcyB0byB0YWxrIGFib3V0IHN1Y2ggdGhpbmdzIHdpdGguCisgKi8KKworI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQorc3RydWN0IF9fdW5hX3U2NCB7IHVuc2lnbmVkIGxvbmcgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07CitzdHJ1Y3QgX191bmFfdTMyIHsgdW5zaWduZWQgaW50ICAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKK3N0cnVjdCBfX3VuYV91MTYgeyB1bnNpZ25lZCBzaG9ydCB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9OworI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGRxX3UodW5zaWduZWQgbG9uZyAqIHIxMSkKK3sKKyNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKKwljb25zdCBzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqKSByMTE7CisJcmV0dXJuIHB0ci0+eDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyByMSxyMjsKKwlfX2FzbV9fKCJsZHFfdSAlMCwlM1xuXHQiCisJCSJsZHFfdSAlMSwlNFxuXHQiCisJCSJleHRxbCAlMCwlMiwlMFxuXHQiCisJCSJleHRxaCAlMSwlMiwlMSIKKwkJOiI9JnIiIChyMSksICI9JnIiIChyMikKKwkJOiJyIiAocjExKSwKKwkJICJtIiAoKnIxMSksCisJCSAibSIgKCooY29uc3QgdW5zaWduZWQgbG9uZyAqKSg3KyhjaGFyICopIHIxMSkpKTsKKwlyZXR1cm4gcjEgfCByMjsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxkbF91KHVuc2lnbmVkIGludCAqIHIxMSkKK3sKKyNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKKwljb25zdCBzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7CisJcmV0dXJuIHB0ci0+eDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyByMSxyMjsKKwlfX2FzbV9fKCJsZHFfdSAlMCwlM1xuXHQiCisJCSJsZHFfdSAlMSwlNFxuXHQiCisJCSJleHRsbCAlMCwlMiwlMFxuXHQiCisJCSJleHRsaCAlMSwlMiwlMSIKKwkJOiI9JnIiIChyMSksICI9JnIiIChyMikKKwkJOiJyIiAocjExKSwKKwkJICJtIiAoKnIxMSksCisJCSAibSIgKCooY29uc3QgdW5zaWduZWQgbG9uZyAqKSgzKyhjaGFyICopIHIxMSkpKTsKKwlyZXR1cm4gcjEgfCByMjsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxkd191KHVuc2lnbmVkIHNob3J0ICogcjExKQoreworI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQorCWNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTE2ICopIHIxMTsKKwlyZXR1cm4gcHRyLT54OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHIxLHIyOworCV9fYXNtX18oImxkcV91ICUwLCUzXG5cdCIKKwkJImxkcV91ICUxLCU0XG5cdCIKKwkJImV4dHdsICUwLCUyLCUwXG5cdCIKKwkJImV4dHdoICUxLCUyLCUxIgorCQk6Ij0mciIgKHIxKSwgIj0mciIgKHIyKQorCQk6InIiIChyMTEpLAorCQkgIm0iICgqcjExKSwKKwkJICJtIiAoKihjb25zdCB1bnNpZ25lZCBsb25nICopKDErKGNoYXIgKikgcjExKSkpOworCXJldHVybiByMSB8IHIyOworI2VuZGlmCit9CisKKy8qCisgKiBFbGVtZW50YWwgdW5hbGlnbmVkIHN0b3JlcyAKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0cV91KHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgKiByMTEpCit7CisjaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCisJc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKHN0cnVjdCBfX3VuYV91NjQgKikgcjExOworCXB0ci0+eCA9IHI1OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHIxLHIyLHIzLHI0OworCisJX19hc21fXygibGRxX3UgJTMsJTFcblx0IgorCQkibGRxX3UgJTIsJTBcblx0IgorCQkiaW5zcWggJTYsJTcsJTVcblx0IgorCQkiaW5zcWwgJTYsJTcsJTRcblx0IgorCQkibXNrcWggJTMsJTcsJTNcblx0IgorCQkibXNrcWwgJTIsJTcsJTJcblx0IgorCQkiYmlzICUzLCU1LCUzXG5cdCIKKwkJImJpcyAlMiwlNCwlMlxuXHQiCisJCSJzdHFfdSAlMywlMVxuXHQiCisJCSJzdHFfdSAlMiwlMCIKKwkJOiI9bSIgKCpyMTEpLAorCQkgIj1tIiAoKih1bnNpZ25lZCBsb25nICopKDcrKGNoYXIgKikgcjExKSksCisJCSAiPSZyIiAocjEpLCAiPSZyIiAocjIpLCAiPSZyIiAocjMpLCAiPSZyIiAocjQpCisJCToiciIgKHI1KSwgInIiIChyMTEpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0bF91KHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGludCAqIHIxMSkKK3sKKyNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKKwlzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7CisJcHRyLT54ID0gcjU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgcjEscjIscjMscjQ7CisKKwlfX2FzbV9fKCJsZHFfdSAlMywlMVxuXHQiCisJCSJsZHFfdSAlMiwlMFxuXHQiCisJCSJpbnNsaCAlNiwlNywlNVxuXHQiCisJCSJpbnNsbCAlNiwlNywlNFxuXHQiCisJCSJtc2tsaCAlMywlNywlM1xuXHQiCisJCSJtc2tsbCAlMiwlNywlMlxuXHQiCisJCSJiaXMgJTMsJTUsJTNcblx0IgorCQkiYmlzICUyLCU0LCUyXG5cdCIKKwkJInN0cV91ICUzLCUxXG5cdCIKKwkJInN0cV91ICUyLCUwIgorCQk6Ij1tIiAoKnIxMSksCisJCSAiPW0iICgqKHVuc2lnbmVkIGxvbmcgKikoMysoY2hhciAqKSByMTEpKSwKKwkJICI9JnIiIChyMSksICI9JnIiIChyMiksICI9JnIiIChyMyksICI9JnIiIChyNCkKKwkJOiJyIiAocjUpLCAiciIgKHIxMSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3R3X3UodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgc2hvcnQgKiByMTEpCit7CisjaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCisJc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MTYgKikgcjExOworCXB0ci0+eCA9IHI1OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHIxLHIyLHIzLHI0OworCisJX19hc21fXygibGRxX3UgJTMsJTFcblx0IgorCQkibGRxX3UgJTIsJTBcblx0IgorCQkiaW5zd2ggJTYsJTcsJTVcblx0IgorCQkiaW5zd2wgJTYsJTcsJTRcblx0IgorCQkibXNrd2ggJTMsJTcsJTNcblx0IgorCQkibXNrd2wgJTIsJTcsJTJcblx0IgorCQkiYmlzICUzLCU1LCUzXG5cdCIKKwkJImJpcyAlMiwlNCwlMlxuXHQiCisJCSJzdHFfdSAlMywlMVxuXHQiCisJCSJzdHFfdSAlMiwlMCIKKwkJOiI9bSIgKCpyMTEpLAorCQkgIj1tIiAoKih1bnNpZ25lZCBsb25nICopKDErKGNoYXIgKikgcjExKSksCisJCSAiPSZyIiAocjEpLCAiPSZyIiAocjIpLCAiPSZyIiAocjMpLCAiPSZyIiAocjQpCisJCToiciIgKHI1KSwgInIiIChyMTEpKTsKKyNlbmRpZgorfQorCisjZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKKy8qCisgKiBFR0NTIDEuMSBrbm93cyBhYm91dCBhcmJpdHJhcnkgdW5hbGlnbmVkIGxvYWRzLiAgRGVmaW5lIHNvbWUKKyAqIHBhY2tlZCBzdHJ1Y3R1cmVzIHRvIHRhbGsgYWJvdXQgc3VjaCB0aGluZ3Mgd2l0aC4KKyAqLworc3RydWN0IF9fdW5hX3U2NCB7IHVuc2lnbmVkIGxvbmcgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07CitzdHJ1Y3QgX191bmFfdTMyIHsgdW5zaWduZWQgaW50ICAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKK3N0cnVjdCBfX3VuYV91MTYgeyB1bnNpZ25lZCBzaG9ydCB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9OworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCitfX3VsZHEgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKiByMTEpCit7CisJY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKikgcjExOworCXJldHVybiBwdHItPng7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKK3VsZGwgKGNvbnN0IHVuc2lnbmVkIGludCAqIHIxMSkKK3sKKwljb25zdCBzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7CisJcmV0dXJuIHB0ci0+eDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwordWxkdyAoY29uc3QgdW5zaWduZWQgc2hvcnQgKiByMTEpCit7CisJY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKikgcjExOworCXJldHVybiBwdHItPng7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3VzdHEgKHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgKiByMTEpCit7CisJc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKHN0cnVjdCBfX3VuYV91NjQgKikgcjExOworCXB0ci0+eCA9IHI1OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCit1c3RsICh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBpbnQgKiByMTEpCit7CisJc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MzIgKikgcjExOworCXB0ci0+eCA9IHI1OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCit1c3R3ICh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBzaG9ydCAqIHIxMSkKK3sKKwlzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoc3RydWN0IF9fdW5hX3UxNiAqKSByMTE7CisJcHRyLT54ID0gcjU7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitCeXRlIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIGJ5dGUgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgcmRiKAorICAgIHUzMiBhZGRyKQoreworCXU4IHZhbDsKKworCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKKwkJREIocHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKKwkJSEFMVF9TWVMoKTsKKwkJfQorCXZhbCA9ICoodTgqKShNLm1lbV9iYXNlICsgYWRkcik7CitEQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQorCQlwcmludGsoIiUjMDh4IDEgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKKwlyZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIHdvcmQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgcmR3KAorCXUzMiBhZGRyKQoreworCXUxNiB2YWwgPSAwOworCisJaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMikgeworCQlEQihwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQorCQlIQUxUX1NZUygpOworCQl9CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKwlpZiAoYWRkciAmIDB4MSkgeworCQl2YWwgPSAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSB8CisJCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7CisJCX0KKwllbHNlCisjZW5kaWYKKyNpZmRlZiBfX2FscGhhX18KKwkJdmFsID0gbGR3X3UoKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7CisjZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKKwkgIHZhbCA9IHVsZHcoKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7CisjZWxzZQorCQl2YWwgPSAqKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKKyNlbmRpZgorCQlEQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQorCQlwcmludGsoIiUjMDh4IDIgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKKyAgICByZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCitSRU1BUktTOgorUmVhZHMgYSBsb25nIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSByZGwoCisJdTMyIGFkZHIpCit7CisJdTMyIHZhbCA9IDA7CisKKwlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSA0KSB7CisJCURCKHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisJCUhBTFRfU1lTKCk7CisJCX0KKyNpZmRlZiBfX0JJR19FTkRJQU5fXworCWlmIChhZGRyICYgMHgzKSB7CisJCXZhbCA9ICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSB8CisJCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSB8CisJCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAyKSA8PCAxNikgfAorCQkJICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPDwgMjQpKTsKKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworCQl2YWwgPSBsZGxfdSgodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKKyNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQorCQl2YWwgPSB1bGRsKCh1MzIqKShNLm1lbV9iYXNlICsgYWRkcikpOworI2Vsc2UKKwkJdmFsID0gKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcik7CisjZW5kaWYKK0RCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCisJCXByaW50aygiJSMwOHggNCAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQorCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKK3ZhbAkJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgd3JiKAorCXUzMiBhZGRyLAorCXU4IHZhbCkKK3sKK0RCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCisJCXByaW50aygiJSMwOHggMSA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQorICAgIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKKwkJREIocHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisJCUhBTFRfU1lTKCk7CisJCX0KKwkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwJCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIHdydygKKwl1MzIgYWRkciwKKwl1MTYgdmFsKQoreworREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKKwkJcHJpbnRrKCIlIzA4eCAyIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCisJaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMikgeworCQlEQihwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKKwkJSEFMVF9TWVMoKTsKKwkJfQorI2lmZGVmIF9fQklHX0VORElBTl9fCisJaWYgKGFkZHIgJiAweDEpIHsKKwkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+IDApICYgMHhmZjsKKwkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworCSBzdHdfdSh2YWwsKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7CisjZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKKwkgdXN0dyh2YWwsKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7CisjZWxzZQorCSAqKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwJCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGxvbmcgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cmwoCisJdTMyIGFkZHIsCisJdTMyIHZhbCkKK3sKK0RCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCisJCXByaW50aygiJSMwOHggNCA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQorCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDQpIHsKKwkJREIocHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCisJCUhBTFRfU1lTKCk7CisJCX0KKyNpZmRlZiBfX0JJR19FTkRJQU5fXworCWlmIChhZGRyICYgMHgxKSB7CisJCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAgMCkgJiAweGZmOworCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKKwkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpID0gKHZhbCA+PiAyNCkgJiAweGZmOworCQl9CisJZWxzZQorI2VuZGlmCisjaWZkZWYgX19hbHBoYV9fCisJIHN0bF91KHZhbCwodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKKyNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQorCSB1c3RsKHZhbCwodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKKyNlbHNlCisJICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkcgktIFBJTyBhZGRyZXNzIHRvIHJlYWQKK1JFVFVSTjoKKzAKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBieXRlIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGluYi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTggWDg2QVBJIHBfaW5iKAorCVg4NkVNVV9waW9BZGRyIGFkZHIpCit7CitEQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJCXByaW50aygiaW5iICUjMDR4IFxuIiwgYWRkcik7KQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gd29yZCByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbncuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUxNiBYODZBUEkgcF9pbncoCisJWDg2RU1VX3Bpb0FkZHIgYWRkcikKK3sKK0RCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkJcHJpbnRrKCJpbncgJSMwNHggXG4iLCBhZGRyKTspCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkcgktIFBJTyBhZGRyZXNzIHRvIHJlYWQKK1JFVFVSTjoKKzAKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBsb25nIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGlubC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIFg4NkFQSSBwX2lubCgKKwlYODZFTVVfcGlvQWRkciBhZGRyKQoreworREIoCWlmIChERUJVR19JT19UUkFDRSgpKQorCQlwcmludGsoImlubCAlIzA0eCBcbiIsIGFkZHIpOykKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyCS0gUElPIGFkZHJlc3MgdG8gd3JpdGUKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorUkVNQVJLUzoKK0RlZmF1bHQgUElPIGJ5dGUgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dGIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0YigKKwlYODZFTVVfcGlvQWRkciBhZGRyLAorCXU4IHZhbCkKK3sKK0RCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkJcHJpbnRrKCJvdXRiICUjMDJ4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBQSU8gYWRkcmVzcyB0byB3cml0ZQordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCitSRU1BUktTOgorRGVmYXVsdCBQSU8gd29yZCB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0dy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgcF9vdXR3KAorCVg4NkVNVV9waW9BZGRyIGFkZHIsCisJdTE2IHZhbCkKK3sKK0RCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkJcHJpbnRrKCJvdXR3ICUjMDR4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBQSU8gYWRkcmVzcyB0byB3cml0ZQordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCitSRU1BUktTOgorRGVmYXVsdCBQSU8gO29uZyB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0bC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgcF9vdXRsKAorCVg4NkVNVV9waW9BZGRyIGFkZHIsCisJdTMyIHZhbCkKK3sKK0RCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkJcHJpbnRrKCJvdXRsICUjMDh4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1OCAgCShYODZBUElQIHN5c19yZGIpKHUzMiBhZGRyKSAJCQkgICAgICAgICAgICA9IHJkYjsKK3UxNiAJKFg4NkFQSVAgc3lzX3JkdykodTMyIGFkZHIpIAkJCSAgICAgICAgICAgID0gcmR3OwordTMyIAkoWDg2QVBJUCBzeXNfcmRsKSh1MzIgYWRkcikgCQkJICAgICAgICAgICAgPSByZGw7Cit2b2lkIAkoWDg2QVBJUCBzeXNfd3JiKSh1MzIgYWRkcix1OCB2YWwpIAkJICAgICAgICAgICAgPSB3cmI7Cit2b2lkIAkoWDg2QVBJUCBzeXNfd3J3KSh1MzIgYWRkcix1MTYgdmFsKSAJICAgICAgICAgICAgPSB3cnc7Cit2b2lkIAkoWDg2QVBJUCBzeXNfd3JsKSh1MzIgYWRkcix1MzIgdmFsKSAJICAgICAgICAgICAgPSB3cmw7Cit1OCAgCShYODZBUElQIHN5c19pbmIpKFg4NkVNVV9waW9BZGRyIGFkZHIpCSAgICAgICAgICAgID0gcF9pbmI7Cit1MTYgCShYODZBUElQIHN5c19pbncpKFg4NkVNVV9waW9BZGRyIGFkZHIpCSAgICAgICAgICAgID0gcF9pbnc7Cit1MzIgCShYODZBUElQIHN5c19pbmwpKFg4NkVNVV9waW9BZGRyIGFkZHIpICAgICAgICAgICAgICA9IHBfaW5sOwordm9pZCAJKFg4NkFQSVAgc3lzX291dGIpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCkgCT0gcF9vdXRiOwordm9pZCAJKFg4NkFQSVAgc3lzX291dHcpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpCT0gcF9vdXR3Owordm9pZCAJKFg4NkFQSVAgc3lzX291dGwpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpCT0gcF9vdXRsOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Z1bmNzCS0gTmV3IG1lbW9yeSBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcworbWVtb3J5IHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKK2FuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBNZW1GdW5jcygKKwlYODZFTVVfbWVtRnVuY3MgKmZ1bmNzKQoreworCXN5c19yZGIgPSBmdW5jcy0+cmRiOworICAgIHN5c19yZHcgPSBmdW5jcy0+cmR3OworICAgIHN5c19yZGwgPSBmdW5jcy0+cmRsOworICAgIHN5c193cmIgPSBmdW5jcy0+d3JiOworICAgIHN5c193cncgPSBmdW5jcy0+d3J3OworICAgIHN5c193cmwgPSBmdW5jcy0+d3JsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Z1bmNzCS0gTmV3IHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1ha2UgYWN0aXZlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgd2hpY2ggYWNjZXNzCitJL08gc3BhY2UsIGFsbG93aW5nIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucworYW5kIGhvb2sgdGhlbSBvdXQgYXMgbmVjZXNzYXJ5IGZvciB0aGVpciBhcHBsaWNhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKAorCVg4NkVNVV9waW9GdW5jcyAqZnVuY3MpCit7CisgICAgc3lzX2luYiA9IGZ1bmNzLT5pbmI7CisgICAgc3lzX2ludyA9IGZ1bmNzLT5pbnc7CisgICAgc3lzX2lubCA9IGZ1bmNzLT5pbmw7CisgICAgc3lzX291dGIgPSBmdW5jcy0+b3V0YjsKKyAgICBzeXNfb3V0dyA9IGZ1bmNzLT5vdXR3OworICAgIHN5c19vdXRsID0gZnVuY3MtPm91dGw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZnVuY3MJLSBOZXcgaW50ZXJydXB0IHZlY3RvciB0YWJsZSB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGhhbmRsZQoraW50ZXJydXB0IHByb2Nlc3NpbmcgaW4gdGhlIGVtdWxhdG9yLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0bworaG9vayBpbnRlcnJ1cHRzIGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uIEFueSBpbnRlcnJ1cHRzIHRoYXQKK2FyZSBub3QgaG9va2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uLCBhbmQgcmVmbGVjdGVkIGFuZCBoYW5kbGVkIGludGVybmFsbHkKK2luIHRoZSBlbXVsYXRvciB2aWEgdGhlIGludGVycnVwdCB2ZWN0b3IgdGFibGUuIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbgordG8gZ2V0IGNvbnRyb2wgd2hlbiB0aGUgY29kZSBiZWluZyBlbXVsYXRlZCBleGVjdXRlcyBzcGVjaWZpYyBzb2Z0d2FyZQoraW50ZXJydXB0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9zZXR1cEludHJGdW5jcygKKwlYODZFTVVfaW50ckZ1bmNzIGZ1bmNzW10pCit7CisgICAgaW50IGk7CisgICAgCisJZm9yIChpPTA7IGkgPCAyNTY7IGkrKykKKwkJX1g4NkVNVV9pbnRyVGFiW2ldID0gTlVMTDsKKwlpZiAoZnVuY3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJX1g4NkVNVV9pbnRyVGFiW2ldID0gZnVuY3NbaV07CisJCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnQJLSBOZXcgc29mdHdhcmUgaW50ZXJydXB0IHRvIHByZXBhcmUgZm9yCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBlbXVsYXRvciBzdGF0ZSB0byBleGNldXRlIGEgc29mdHdhcmUKK2ludGVycnVwdC4gVGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb2RlIHRvIGFsbG93IGFuCitpbnRlcnJ1cHQgdG8gYmUgaG9va2VkLCBleGFtaW5lZCBhbmQgdGhlbiByZWZsZWN0ZWQgYmFjayB0byB0aGUgZW11bGF0b3IKK3NvIHRoYXQgdGhlIGNvZGUgaW4gdGhlIGVtdWxhdG9yIHdpbGwgY29udGludWUgcHJvY2Vzc2luZyB0aGUgc29mdHdhcmUKK2ludGVycnVwdCBhcyBwZXIgbm9ybWFsLiBUaGlzIGVzc2VudGlhbGx5IGFsbG93cyBzeXN0ZW0gY29kZSB0byBhY3RpdmVseQoraG9vayBhbmQgaGFuZGxlIGNlcnRhaW4gc29mdHdhcmUgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfcHJlcGFyZUZvckludCgKKwlpbnQgbnVtKQoreworICAgIHB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKKyAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgIENMRUFSX0ZMQUcoRl9URik7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQobnVtICogNCArIDIpOworICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKKyAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKG51bSAqIDQpOworCU0ueDg2LmludHIgPSAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ZhbGlkYXRlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvdmFsaWRhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzlmNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ZhbGlkYXRlLmMKQEAgLTAsMCArMSw3NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIFdhdGNvbSBDIDEwLjYgb3IgbGF0ZXIKKyogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byB2YWxpZGF0ZSB0aGUgeDg2IGVtdWxhdG9yIGxpYnJhcnkgZm9yCisqICAgICAgICAgICAgICAgY29ycmVjdG5lc3MuIFdlIHJ1biB0aGUgZW11bGF0b3IgcHJpbWl0aXZlIG9wZXJhdGlvbnMKKyogICAgICAgICAgICAgICBmdW5jdGlvbnMgYWdhaW5zdCB0aGUgcmVhbCB4ODYgQ1BVLCBhbmQgY29tcGFyZSB0aGUgcmVzdWx0CisqICAgICAgICAgICAgICAgYW5kIGZsYWdzIHRvIGVuc3VyZSBjb3JyZWN0bmVzcy4KKyoKKyogICAgICAgICAgICAgICBXZSB1c2UgaW5saW5lIGFzc2VtYmxlciB0byBjb21waWxlIGFuZCBidWlsZCB0aGlzIHByb2dyYW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyNpbmNsdWRlICJ4ODZlbXUvcHJpbV9hc20uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSB0cnVlIDEKKyNkZWZpbmUgZmFsc2UgMAorCisjZGVmaW5lIEFMTF9GTEFHUyAgIChGX0NGIHwgRl9QRiB8IEZfQUYgfCBGX1pGIHwgRl9TRiB8IEZfT0YpCisKKyNkZWZpbmUgVkFMX1NUQVJUX0JJTkFSWShwYXJtX3R5cGUscmVzX3R5cGUsZG1heCxzbWF4LGRpbmNyLHNpbmNyKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGFybV90eXBlICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXNfdHlwZSAgICByLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVsb25nICAgICAJZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChkID0gMDsgZCA8IGRtYXg7IGQgKz0gZGluY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IHNtYXg7IHMgKz0gc2luY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7CisKKyNkZWZpbmUgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByX2FzbSA9IG5hbWUjI19hc20oJmZsYWdzLGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByID0gbmFtZShkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKHIgIT0gcl9hc20gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCB8fCB0cmFjZSkgeworCisjZGVmaW5lIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmFtZSMjX2FzbSgmZmxhZ3MsZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmFtZShkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHIgPSByX2FzbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgfHwgdHJhY2UpIHsKKworI2RlZmluZSBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTAyWCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7CisKKyNkZWZpbmUgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgciwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKKworI2RlZmluZSBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKKworI2RlZmluZSBWQUxfRU5EX0JJTkFSWSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWQUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgICBcCisgICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKKyAgICBWQUxfU1RBUlRfQklOQVJZKHU4LHU4LDB4RkYsMHhGRiwxLDEpICAgXAorICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0ZBSUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgIFwKKyAgICBWQUxfRU5EX0JJTkFSWSgpCisKKyNkZWZpbmUgVkFMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICBcCisgICAgVkFMX1NUQVJUX0JJTkFSWSh1MTYsdTE2LDB4RkYwMCwweEZGMDAsMHgxMDAsMHgxMDApIFwKKyAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9GQUlMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0VORF9CSU5BUlkoKQorCisjZGVmaW5lIFZBTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX1NUQVJUX0JJTkFSWSh1MzIsdTMyLDB4RkYwMDAwMDAsMHhGRjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwKSBcCisgICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0ZBSUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0VORF9CSU5BUlkoKQorCisjZGVmaW5lIFZBTF9WT0lEX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAorICAgIFZBTF9TVEFSVF9CSU5BUlkodTgsdTgsMHhGRiwweEZGLDEsMSkgICBcCisgICAgVkFMX1RFU1RfQklOQVJZX1ZPSUQobmFtZSkgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgXAorICAgIFZBTF9FTkRfQklOQVJZKCkKKworI2RlZmluZSBWQUxfVk9JRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfU1RBUlRfQklOQVJZKHUxNix1MTYsMHhGRjAwLDB4RkYwMCwweDEwMCwweDEwMCkgXAorICAgIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRU5EX0JJTkFSWSgpCisKKyNkZWZpbmUgVkFMX1ZPSURfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfU1RBUlRfQklOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwweEZGMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDApIFwKKyAgICBWQUxfVEVTVF9CSU5BUllfVk9JRChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRU5EX0JJTkFSWSgpCisKKyNkZWZpbmUgVkFMX0JZVEVfUk9UQVRFKG5hbWUpICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCisgICAgVkFMX1NUQVJUX0JJTkFSWSh1OCx1OCwweEZGLDgsMSwxKSAgICAgIFwKKyAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9GQUlMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICBcCisgICAgVkFMX0VORF9CSU5BUlkoKQorCisjZGVmaW5lIFZBTF9XT1JEX1JPVEFURShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgXAorICAgIFZBTF9TVEFSVF9CSU5BUlkodTE2LHUxNiwweEZGMDAsMTYsMHgxMDAsMSkgICAgICAgICBcCisgICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfQklOQVJZKCkKKworI2RlZmluZSBWQUxfTE9OR19ST1RBVEUobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9TVEFSVF9CSU5BUlkodTMyLHUzMiwweEZGMDAwMDAwLDMyLDB4MTAwMDAwMCwxKSAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9GQUlMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfQklOQVJZKCkKKworI2RlZmluZSBWQUxfU1RBUlRfVEVSTkFSWShwYXJtX3R5cGUscmVzX3R5cGUsZG1heCxzbWF4LGRpbmNyLHNpbmNyLG1heHNoaWZ0KVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm1fdHlwZSAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzX3R5cGUgICAgcixyX2FzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1OCAgICAgICAgICBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoZCA9IDA7IGQgPCBkbWF4OyBkICs9IGRpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAocyA9IDA7IHMgPCBzbWF4OyBzICs9IHNpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoc2hpZnQgPSAwOyBzaGlmdCA8IG1heHNoaWZ0OyBzaGlmdCArPSAxKSB7ICAgICAgICBcCisgICAgICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7CisKKyNkZWZpbmUgVkFMX1RFU1RfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcl9hc20gPSBuYW1lIyNfYXNtKCZmbGFncyxkLHMsc2hpZnQpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgciA9IG5hbWUoZCxzLHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgfHwgdHJhY2UpIHsKKworI2RlZmluZSBWQUxfRkFJTF9XT1JEX1dPUkRfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgsJWQpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgI25hbWUsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7CisKKyNkZWZpbmUgVkFMX0ZBSUxfTE9OR19MT05HX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYLCVkKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsICNuYW1lLCBkLCBzLCBzaGlmdCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7CisKKyNkZWZpbmUgVkFMX0VORF9URVJOQVJZKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWQUxfV09SRF9ST1RBVEVfREJMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9TVEFSVF9URVJOQVJZKHUxNix1MTYsMHhGRjAwLDB4RkYwMCwweDEwMCwweDEwMCwxNikgXAorICAgIFZBTF9URVNUX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9GQUlMX1dPUkRfV09SRF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfVEVSTkFSWSgpCisKKyNkZWZpbmUgVkFMX0xPTkdfUk9UQVRFX0RCTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9TVEFSVF9URVJOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwweEZGMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMzIpIFwKKyAgICBWQUxfVEVTVF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkFMX0ZBSUxfTE9OR19MT05HX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfVEVSTkFSWSgpCisKKyNkZWZpbmUgVkFMX1NUQVJUX1VOQVJZKHBhcm1fdHlwZSxtYXgsaW5jcikgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtX3R5cGUgICBkLHIscl9hc207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGQgPSAwOyBkIDwgbWF4OyBkICs9IGluY3IpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgIFwKKyAgICAgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeworCisjZGVmaW5lIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByX2FzbSA9IG5hbWUjI19hc20oJmZsYWdzLGQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByID0gbmFtZShkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgeyAgICAgIFwKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworCisjZGVmaW5lIFZBTF9GQUlMX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHIsICNuYW1lLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOworCisjZGVmaW5lIFZBTF9GQUlMX1dPUkRfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHIsICNuYW1lLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgXAorICAgICAgICAgICAgICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKKworI2RlZmluZSBWQUxfRkFJTF9MT05HX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByLCAjbmFtZSwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgXAorICAgICAgICAgICAgICAgIHByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKKworI2RlZmluZSBWQUxfRU5EX1VOQVJZKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgQUxMX0ZMQUdTOyAgICAgXAorICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFZBTF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAorICAgIFZBTF9TVEFSVF9VTkFSWSh1OCwweEZGLDB4MSkgICAgICAgICAgICBcCisgICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfVU5BUlkoKQorCisjZGVmaW5lIFZBTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAorICAgIFZBTF9TVEFSVF9VTkFSWSh1MTYsMHhGRjAwLDB4MTAwKSAgICAgICBcCisgICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfVU5BUlkoKQorCisjZGVmaW5lIFZBTF9XT1JEX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAorICAgIFZBTF9TVEFSVF9VTkFSWSh1MTYsMHhGRiwweDEpICAgICAgICAgICBcCisgICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWQUxfRkFJTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAorICAgIFZBTF9FTkRfVU5BUlkoKQorCisjZGVmaW5lIFZBTF9MT05HX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAorICAgIFZBTF9TVEFSVF9VTkFSWSh1MzIsMHhGRjAwMDAwMCwweDEwMDAwMDApIFwKKyAgICBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgXAorICAgIFZBTF9GQUlMX0xPTkdfVU5BUlkobmFtZSkgICAgICAgICAgICAgICBcCisgICAgVkFMX0VORF9VTkFSWSgpCisKKyNkZWZpbmUgVkFMX0JZVEVfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1OCAgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MTYgICAgICAgICByLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjsgZCArPSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IDB4RkY7IHMgKz0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lIyNfYXNtKCZmbGFncywmcl9hc20sZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0FMID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHIgPSBNLng4Ni5SX0FYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVkFMX1dPUkRfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MTYgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MTYgICAgICAgICByX2xvLHJfYXNtX2xvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MTYgICAgICAgICByX2hpLHJfYXNtX2hpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwOyBkICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lIyNfYXNtKCZmbGFncywmcl9hc21fbG8sJnJfYXNtX2hpLGQscyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0FYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfbG8gPSBNLng4Ni5SX0FYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfaGkgPSBNLng4Ni5SX0RYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChyX2xvICE9IHJfYXNtX2xvIHx8IHJfaGkgIT0gcl9hc21faGkgfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKVwKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcl9oaSxyX2xvLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA0WDoweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX2FzbV9oaSxyX2FzbV9sbywgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVkFMX0xPTkdfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MzIgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MzIgICAgICAgICByX2xvLHJfYXNtX2xvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MzIgICAgICAgICByX2hpLHJfYXNtX2hpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwMDAwMDsgZCArPSAweDEwMDAwMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IDB4RkYwMDAwMDA7IHMgKz0gMHgxMDAwMDAwKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lIyNfYXNtKCZmbGFncywmcl9hc21fbG8sJnJfYXNtX2hpLGQscyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0VBWCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfbG8gPSBNLng4Ni5SX0VBWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfaGkgPSBNLng4Ni5SX0VEWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChyX2xvICE9IHJfYXNtX2xvIHx8IHJfaGkgIT0gcl9hc21faGkgfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKVwKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcl9oaSxyX2xvLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTA4WDoweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX2FzbV9oaSxyX2FzbV9sbywgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVkFMX0JZVEVfRElWKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MTYgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1OCAgICAgICAgICByX3F1b3Qscl9yZW0scl9hc21fcXVvdCxyX2FzbV9yZW07ICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwOyBkICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChzID0gMTsgcyA8IDB4RkY7IHMgKz0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNLng4Ni5pbnRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNLng4Ni5SX0FYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfcXVvdCA9IE0ueDg2LlJfQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJfcmVtID0gTS54ODYuUl9BSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9xdW90LCZyX2FzbV9yZW0sZCxzKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChyX3F1b3QgIT0gcl9hc21fcXVvdCB8fCByX3JlbSAhPSByX2FzbV9yZW0gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSBcCisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDJYOjB4JTAyWCA9ICUtMTVzKDB4JTA0WCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX3F1b3QsIHJfcmVtLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMlg6MHglMDJYID0gJS0xNXMoMHglMDRYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWQUxfV09SRF9ESVYobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHUzMiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHUxNiAgICAgICAgIHJfcXVvdCxyX3JlbSxyX2FzbV9xdW90LHJfYXNtX3JlbTsgICAgICAgICAgICAgICAgICAgICAgXAorCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDAwMDAwOyBkICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHMgPSAweDEwMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LmludHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfQVggPSBkICYgMHhGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRFggPSBkID4+IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcl9xdW90ID0gTS54ODYuUl9BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcl9yZW0gPSBNLng4Ni5SX0RYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX3F1b3QsJnJfYXNtX3JlbSxkICYgMHhGRkZGLGQgPj4gMTYscyk7XAorICAgICAgICAgICAgICAgIGlmIChyX3F1b3QgIT0gcl9hc21fcXVvdCB8fCByX3JlbSAhPSByX2FzbV9yZW0gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSBcCisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDRYOjB4JTA0WCA9ICUtMTVzKDB4JTA4WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByX3F1b3QsIHJfcmVtLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDhYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWQUxfTE9OR19ESVYobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHUzMiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHUzMiAgICAgICAgIHJfcXVvdCxyX3JlbSxyX2FzbV9xdW90LHJfYXNtX3JlbTsgICAgICAgICAgICAgICAgICAgICAgXAorCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDAwMDAwOyBkICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHMgPSAweDEwMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LmludHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRUFYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRURYID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcl9xdW90ID0gTS54ODYuUl9FQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcl9yZW0gPSBNLng4Ni5SX0VEWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX3F1b3QsJnJfYXNtX3JlbSxkLDAscyk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKHJfcXVvdCAhPSByX2FzbV9xdW90IHx8IHJfcmVtICE9IHJfYXNtX3JlbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpIFwKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYOjB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcl9xdW90LCByX3JlbSwgI25hbWUsIDAsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICBcCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDhYOjB4JTA4WCA9ICUtMTVzKDB4JTA4WDoweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIDAsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3ZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRvdXQsIGZtdCwgYXJncHRyKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB2YV9lbmQoYXJncHRyKTsKK30KKworY2hhciAqIHByaW50X2ZsYWdzKGNoYXIgKmJ1Zix1bG9uZyBmbGFncykKK3sKKyAgICBjaGFyICpzZXBhcmF0b3IgPSAiIjsKKworICAgIGJ1ZlswXSA9IDA7CisgICAgaWYgKGZsYWdzICYgRl9DRikgeworICAgICAgICBzdHJjYXQoYnVmLHNlcGFyYXRvcik7CisgICAgICAgIHN0cmNhdChidWYsIkNGIik7CisgICAgICAgIHNlcGFyYXRvciA9ICIsIjsKKyAgICAgICAgfQorICAgIGlmIChmbGFncyAmIEZfUEYpIHsKKyAgICAgICAgc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOworICAgICAgICBzdHJjYXQoYnVmLCJQRiIpOworICAgICAgICBzZXBhcmF0b3IgPSAiLCI7CisgICAgICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBGX0FGKSB7CisgICAgICAgIHN0cmNhdChidWYsc2VwYXJhdG9yKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwiQUYiKTsKKyAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgICB9CisgICAgaWYgKGZsYWdzICYgRl9aRikgeworICAgICAgICBzdHJjYXQoYnVmLHNlcGFyYXRvcik7CisgICAgICAgIHN0cmNhdChidWYsIlpGIik7CisgICAgICAgIHNlcGFyYXRvciA9ICIsIjsKKyAgICAgICAgfQorICAgIGlmIChmbGFncyAmIEZfU0YpIHsKKyAgICAgICAgc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOworICAgICAgICBzdHJjYXQoYnVmLCJTRiIpOworICAgICAgICBzZXBhcmF0b3IgPSAiLCI7CisgICAgICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBGX09GKSB7CisgICAgICAgIHN0cmNhdChidWYsc2VwYXJhdG9yKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwiT0YiKTsKKyAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgICB9CisgICAgaWYgKHNlcGFyYXRvclswXSA9PSAwKQorICAgICAgICBzdHJjcHkoYnVmLCJOb25lIik7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MpCit7CisgICAgdWxvbmcgICBkZWZfZmxhZ3M7CisgICAgaW50IHRyYWNlID0gZmFsc2U7CisKKyAgICBpZiAoYXJnYyA+IDEpCisgICAgICAgIHRyYWNlID0gdHJ1ZTsKKyAgICBtZW1zZXQoJk0sIDAsIHNpemVvZihNKSk7CisgICAgZGVmX2ZsYWdzID0gZ2V0X2ZsYWdzX2FzbSgpICYgfkFMTF9GTEFHUzsKKworICAgIFZBTF9XT1JEX1VOQVJZKGFhYV93b3JkKTsKKyAgICBWQUxfV09SRF9VTkFSWShhYXNfd29yZCk7CisKKyAgICBWQUxfV09SRF9VTkFSWShhYWRfd29yZCk7CisgICAgVkFMX1dPUkRfVU5BUlkoYWFtX3dvcmQpOworCisgICAgVkFMX0JZVEVfQllURV9CSU5BUlkoYWRjX2J5dGUpOworICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGFkY193b3JkKTsKKyAgICBWQUxfTE9OR19MT05HX0JJTkFSWShhZGNfbG9uZyk7CisKKyAgICBWQUxfQllURV9CWVRFX0JJTkFSWShhZGRfYnl0ZSk7CisgICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoYWRkX3dvcmQpOworICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKGFkZF9sb25nKTsKKworICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKGFuZF9ieXRlKTsKKyAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShhbmRfd29yZCk7CisgICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoYW5kX2xvbmcpOworCisgICAgVkFMX0JZVEVfQllURV9CSU5BUlkoY21wX2J5dGUpOworICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGNtcF93b3JkKTsKKyAgICBWQUxfTE9OR19MT05HX0JJTkFSWShjbXBfbG9uZyk7CisKKyAgICBWQUxfQllURV9VTkFSWShkYWFfYnl0ZSk7CisgICAgVkFMX0JZVEVfVU5BUlkoZGFzX2J5dGUpOyAgIC8vIEZhaWxzIGZvciAweDlBIChvdXQgb2YgcmFuZ2UgYW55d2F5KQorCisgICAgVkFMX0JZVEVfVU5BUlkoZGVjX2J5dGUpOworICAgIFZBTF9XT1JEX1VOQVJZKGRlY193b3JkKTsKKyAgICBWQUxfTE9OR19VTkFSWShkZWNfbG9uZyk7CisKKyAgICBWQUxfQllURV9VTkFSWShpbmNfYnl0ZSk7CisgICAgVkFMX1dPUkRfVU5BUlkoaW5jX3dvcmQpOworICAgIFZBTF9MT05HX1VOQVJZKGluY19sb25nKTsKKworICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKG9yX2J5dGUpOworICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKG9yX3dvcmQpOworICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKG9yX2xvbmcpOworCisgICAgVkFMX0JZVEVfVU5BUlkobmVnX2J5dGUpOworICAgIFZBTF9XT1JEX1VOQVJZKG5lZ193b3JkKTsKKyAgICBWQUxfTE9OR19VTkFSWShuZWdfbG9uZyk7CisKKyAgICBWQUxfQllURV9VTkFSWShub3RfYnl0ZSk7CisgICAgVkFMX1dPUkRfVU5BUlkobm90X3dvcmQpOworICAgIFZBTF9MT05HX1VOQVJZKG5vdF9sb25nKTsKKworICAgIFZBTF9CWVRFX1JPVEFURShyY2xfYnl0ZSk7CisgICAgVkFMX1dPUkRfUk9UQVRFKHJjbF93b3JkKTsKKyAgICBWQUxfTE9OR19ST1RBVEUocmNsX2xvbmcpOworCisgICAgVkFMX0JZVEVfUk9UQVRFKHJjcl9ieXRlKTsKKyAgICBWQUxfV09SRF9ST1RBVEUocmNyX3dvcmQpOworICAgIFZBTF9MT05HX1JPVEFURShyY3JfbG9uZyk7CisKKyAgICBWQUxfQllURV9ST1RBVEUocm9sX2J5dGUpOworICAgIFZBTF9XT1JEX1JPVEFURShyb2xfd29yZCk7CisgICAgVkFMX0xPTkdfUk9UQVRFKHJvbF9sb25nKTsKKworICAgIFZBTF9CWVRFX1JPVEFURShyb3JfYnl0ZSk7CisgICAgVkFMX1dPUkRfUk9UQVRFKHJvcl93b3JkKTsKKyAgICBWQUxfTE9OR19ST1RBVEUocm9yX2xvbmcpOworCisgICAgVkFMX0JZVEVfUk9UQVRFKHNobF9ieXRlKTsKKyAgICBWQUxfV09SRF9ST1RBVEUoc2hsX3dvcmQpOworICAgIFZBTF9MT05HX1JPVEFURShzaGxfbG9uZyk7CisKKyAgICBWQUxfQllURV9ST1RBVEUoc2hyX2J5dGUpOworICAgIFZBTF9XT1JEX1JPVEFURShzaHJfd29yZCk7CisgICAgVkFMX0xPTkdfUk9UQVRFKHNocl9sb25nKTsKKworICAgIFZBTF9CWVRFX1JPVEFURShzYXJfYnl0ZSk7CisgICAgVkFMX1dPUkRfUk9UQVRFKHNhcl93b3JkKTsKKyAgICBWQUxfTE9OR19ST1RBVEUoc2FyX2xvbmcpOworCisgICAgVkFMX1dPUkRfUk9UQVRFX0RCTChzaGxkX3dvcmQpOworICAgIFZBTF9MT05HX1JPVEFURV9EQkwoc2hsZF9sb25nKTsKKworICAgIFZBTF9XT1JEX1JPVEFURV9EQkwoc2hyZF93b3JkKTsKKyAgICBWQUxfTE9OR19ST1RBVEVfREJMKHNocmRfbG9uZyk7CisKKyAgICBWQUxfQllURV9CWVRFX0JJTkFSWShzYmJfYnl0ZSk7CisgICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoc2JiX3dvcmQpOworICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKHNiYl9sb25nKTsKKworICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKHN1Yl9ieXRlKTsKKyAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShzdWJfd29yZCk7CisgICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoc3ViX2xvbmcpOworCisgICAgVkFMX0JZVEVfQllURV9CSU5BUlkoeG9yX2J5dGUpOworICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKHhvcl93b3JkKTsKKyAgICBWQUxfTE9OR19MT05HX0JJTkFSWSh4b3JfbG9uZyk7CisKKyAgICBWQUxfVk9JRF9CWVRFX0JJTkFSWSh0ZXN0X2J5dGUpOworICAgIFZBTF9WT0lEX1dPUkRfQklOQVJZKHRlc3Rfd29yZCk7CisgICAgVkFMX1ZPSURfTE9OR19CSU5BUlkodGVzdF9sb25nKTsKKworICAgIFZBTF9CWVRFX01VTChpbXVsX2J5dGUpOworICAgIFZBTF9XT1JEX01VTChpbXVsX3dvcmQpOworICAgIFZBTF9MT05HX01VTChpbXVsX2xvbmcpOworCisgICAgVkFMX0JZVEVfTVVMKG11bF9ieXRlKTsKKyAgICBWQUxfV09SRF9NVUwobXVsX3dvcmQpOworICAgIFZBTF9MT05HX01VTChtdWxfbG9uZyk7CisKKyAgICBWQUxfQllURV9ESVYoaWRpdl9ieXRlKTsKKyAgICBWQUxfV09SRF9ESVYoaWRpdl93b3JkKTsKKyAgICBWQUxfTE9OR19ESVYoaWRpdl9sb25nKTsKKworICAgIFZBTF9CWVRFX0RJVihkaXZfYnl0ZSk7CisgICAgVkFMX1dPUkRfRElWKGRpdl93b3JkKTsKKyAgICBWQUxfTE9OR19ESVYoZGl2X2xvbmcpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlYnVnLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhM2VkNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVidWcuaApAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgZGVidWcgZGVmaW5pdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX0RFQlVHX0gKKyNkZWZpbmUgX19YODZFTVVfREVCVUdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjaGVja3MgdG8gYmUgZW5hYmxlZCBmb3IgInJ1bnRpbWUiICovCisKKyNkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0hfRiAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTX0YgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTU19GICAgICAgICAgICAgICAweDQgLyp1c2luZyByZWd1bGFyIGxpbmVhciBwb2ludGVyICovCisjZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTX0YgICAgICAgICAgICAgMHg4IC8qdXNpbmcgc2VnbWVudDpvZmZzZXQqLworCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIENIRUNLX0lQX0ZFVENIKCkgICAgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19JUF9GRVRDSF9GKQorIyBkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTKCkgICAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX1NQX0FDQ0VTU19GKQorIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpICAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX01FTV9BQ0NFU1NfRikKKyMgZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTKCkgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19EQVRBX0FDQ0VTU19GKQorI2Vsc2UKKyMgZGVmaW5lIENIRUNLX0lQX0ZFVENIKCkKKyMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpCisjIGRlZmluZSBDSEVDS19NRU1fQUNDRVNTKCkKKyMgZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTKCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIERFQlVHX0lOU1RSVU1FTlQoKSAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfSU5TVFJVTUVOVF9GKQorIyBkZWZpbmUgREVCVUdfREVDT0RFKCkgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19ERUNPREVfRikKKyMgZGVmaW5lIERFQlVHX1RSQUNFKCkgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VfRikKKyMgZGVmaW5lIERFQlVHX1NURVAoKSAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1RFUF9GKQorIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKSAgIAkoTS54ODYuZGVidWcgJiBERUJVR19ESVNBU1NFTUJMRV9GKQorIyBkZWZpbmUgREVCVUdfQlJFQUsoKSAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19CUkVBS19GKQorIyBkZWZpbmUgREVCVUdfU1ZDKCkgICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19TVkNfRikKKyMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKSAgICAgKE0ueDg2LmRlYnVnICYgREVCVUdfU0FWRV9DU19JUCkKKworIyBkZWZpbmUgREVCVUdfRlMoKSAgICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19GU19GKQorIyBkZWZpbmUgREVCVUdfUFJPQygpICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19QUk9DX0YpCisjIGRlZmluZSBERUJVR19TWVNJTlQoKSAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NZU0lOVF9GKQorIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMKCkgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfRikKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKSAJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRikKKyMgZGVmaW5lIERFQlVHX1NZUygpICAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTX0YpCisjIGRlZmluZSBERUJVR19NRU1fVFJBQ0UoKSAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX01FTV9UUkFDRV9GKQorIyBkZWZpbmUgREVCVUdfSU9fVFJBQ0UoKSAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQorIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAoTS54ODYuZGVidWcgJiBERUJVR19ERUNPREVfTk9QUklOVF9GKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHX0lOU1RSVU1FTlQoKSAgICAJMAorIyBkZWZpbmUgREVCVUdfREVDT0RFKCkgICAgICAgIAkwCisjIGRlZmluZSBERUJVR19UUkFDRSgpICAgICAgICAgCTAKKyMgZGVmaW5lIERFQlVHX1NURVAoKSAgICAgICAgICAJMAorIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKSAgIAkwCisjIGRlZmluZSBERUJVR19CUkVBSygpICAgICAgICAgCTAKKyMgZGVmaW5lIERFQlVHX1NWQygpICAgICAgICAgICAJMAorIyBkZWZpbmUgREVCVUdfU0FWRV9JUF9DUygpICAgICAwCisjIGRlZmluZSBERUJVR19GUygpICAgICAgICAgICAgCTAKKyMgZGVmaW5lIERFQlVHX1BST0MoKSAgICAgICAgICAJMAorIyBkZWZpbmUgREVCVUdfU1lTSU5UKCkgICAgICAgIAkwCisjIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKSAgICAgCTAKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKSAJMAorIyBkZWZpbmUgREVCVUdfU1lTKCkgICAgICAgICAgIAkwCisjIGRlZmluZSBERUJVR19NRU1fVFJBQ0UoKSAgICAgCTAKKyMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkgICAgICAJMAorIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAwCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisKKyMgZGVmaW5lIERFQ09ERV9QUklOVEYoeCkgICAgIAlpZiAoREVCVUdfREVDT0RFKCkpIFwKKwkJCQkJCQkJCXg4NmVtdV9kZWNvZGVfcHJpbnRmKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpICAJaWYgKERFQlVHX0RFQ09ERSgpKSBcCisJCQkJCQkJCQl4ODZlbXVfZGVjb2RlX3ByaW50ZjIoeCx5KQorCisvKgorICogVGhlIGZvbGxvd2luZyBhbGxvdyB1cyB0byBsb29rIGF0IHRoZSBieXRlcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRoZQorICogZmlyc3QgSU5DUl9JTlNUUk5fTEVOLCBpcyBjYWxsZWQgZXZlcnl0aW1lIGJ5dGVzIGFyZSBjb25zdW1lZCBpbgorICogdGhlIGRlY29kaW5nIHByb2Nlc3MuICBUaGUgU0FWRV9JUF9DUyBpcyBjYWxsZWQgaW5pdGlhbGx5IHdoZW4gdGhlCisgKiBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIGlzIGFjY2Vzc2VkLgorICovCisjZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpICAgICAgICAgICAgICAgICAgICAJXAorCWlmIChERUJVR19ERUNPREUoKSkgIAkgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbih4KQorCisjZGVmaW5lIFNBVkVfSVBfQ1MoeCx5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlcCisJaWYgKERFQlVHX0RFQ09ERSgpIHwgREVCVUdfVFJBQ0VDQUxMKCkgfCBERUJVR19CUkVBSygpIFwKKyAgICAgICAgICAgICAgfCBERUJVR19JT19UUkFDRSgpIHwgREVCVUdfU0FWRV9JUF9DUygpKSB7IFwKKwkJTS54ODYuc2F2ZWRfY3MgPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJXAorCQlNLng4Ni5zYXZlZF9pcCA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlcCisJfQorI2Vsc2UKKyMgZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpCisjIGRlZmluZSBTQVZFX0lQX0NTKHgseSkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgVFJBQ0VfUkVHUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKKwlpZiAoREVCVUdfRElTQVNTRU1CTEUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKKwkJeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQlnb3RvIEVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU7ICAgICAgICAgICAgIAkJXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCWlmIChERUJVR19UUkFDRSgpIHx8IERFQlVHX0RFQ09ERSgpKSBYODZFTVVfdHJhY2VfcmVncygpCisjZWxzZQorIyBkZWZpbmUgVFJBQ0VfUkVHUygpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBTSU5HTEVfU1RFUCgpCQlpZiAoREVCVUdfU1RFUCgpKSB4ODZlbXVfc2luZ2xlX3N0ZXAoKQorI2Vsc2UKKyMgZGVmaW5lIFNJTkdMRV9TVEVQKCkKKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0FORF9TVEVQKCkJXAorCVRSQUNFX1JFR1MoKTsJCQlcCisJU0lOR0xFX1NURVAoKQorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIFNUQVJUX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUigpCQlFbmRPZlRoZUluc3RydWN0aW9uUHJvY2VkdXJlOiB4ODZlbXVfZW5kX2luc3RyKCk7CisjIGRlZmluZSBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKQl4ODZlbXVfZW5kX2luc3RyKCk7CisjZWxzZQorIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQorIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSAgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChERUJVR19UUkFDRUNBTExSRUdTKCkpCQkJCQkJCQkJXAorCQl4ODZlbXVfZHVtcF9yZWdzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoREVCVUdfVFJBQ0VDQUxMKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXByaW50aygiJTA0eDolMDR4OiBDQUxMICVzJTA0eDolMDR4XG4iLCB1ICwgdiwgcywgdywgeCk7CisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChERUJVR19UUkFDRUNBTExSRUdTKCkpCQkJCQkJCQkJXAorCQl4ODZlbXVfZHVtcF9yZWdzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoREVCVUdfVFJBQ0VDQUxMKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXByaW50aygiJTA0eDolMDR4OiAlc1xuIix1LHYsbik7CisjZWxzZQorIyBkZWZpbmUgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lCURCKHgpCXgKKyNlbHNlCisjZGVmaW5lCURCKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCitleHRlcm4gdm9pZCB4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4gKGludCB4KTsKK2V4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmIChjaGFyICp4KTsKK2V4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMiAoY2hhciAqeCwgaW50IHkpOworZXh0ZXJuIHZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUgKHZvaWQpOworZXh0ZXJuIHZvaWQgeDg2ZW11X3NpbmdsZV9zdGVwICh2b2lkKTsKK2V4dGVybiB2b2lkIHg4NmVtdV9lbmRfaW5zdHIgKHZvaWQpOworZXh0ZXJuIHZvaWQgeDg2ZW11X2R1bXBfcmVncyAodm9pZCk7CitleHRlcm4gdm9pZCB4ODZlbXVfZHVtcF94cmVncyAodm9pZCk7CitleHRlcm4gdm9pZCB4ODZlbXVfcHJpbnRfaW50X3ZlY3QgKHUxNiBpdik7CitleHRlcm4gdm9pZCB4ODZlbXVfaW5zdHJ1bWVudF9pbnN0cnVjdGlvbiAodm9pZCk7CitleHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzICh2b2lkKTsKK2V4dGVybiB2b2lkIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MgKHZvaWQpOworZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MgKHUzMiBwKTsKK2V4dGVybiB2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyAodWludCBzLCB1aW50IG8pOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9ERUJVR19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlY29kZS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFhMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWNvZGUuaApAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnN0cnVjdGlvbiBkZWNvZGluZyBsb2dpYy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfREVDT0RFX0gKKyNkZWZpbmUgX19YODZFTVVfREVDT0RFX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5zdHJ1Y3Rpb24gRGVjb2RpbmcgU3R1ZmYgKi8KKworI2RlZmluZSBGRVRDSF9ERUNPREVfTU9EUk0obW9kLHJoLHJsKSAJZmV0Y2hfZGVjb2RlX21vZHJtKCZtb2QsJnJoLCZybCkKKyNkZWZpbmUgREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocikgICAgCWRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKHIpCisjZGVmaW5lIERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHIpICAgIAlkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihyKQorI2RlZmluZSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyKSAgICAJZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIocikKKyNkZWZpbmUgREVDT0RFX0NMRUFSX1NFR09WUigpICAgICAgICAgCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfQ0xSTUFTSworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKK3ZvaWQgCXg4NmVtdV9pbnRyX3JhaXNlICh1OCB0eXBlKTsKK3ZvaWQgICAgZmV0Y2hfZGVjb2RlX21vZHJtIChpbnQgKm1vZCxpbnQgKnJlZ2gsaW50ICpyZWdsKTsKK3U4ICAgICAgZmV0Y2hfYnl0ZV9pbW0gKHZvaWQpOwordTE2ICAgICBmZXRjaF93b3JkX2ltbSAodm9pZCk7Cit1MzIgICAgIGZldGNoX2xvbmdfaW1tICh2b2lkKTsKK3U4ICAgICAgZmV0Y2hfZGF0YV9ieXRlICh1aW50IG9mZnNldCk7Cit1OCAgICAgIGZldGNoX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwordTE2ICAgICBmZXRjaF9kYXRhX3dvcmQgKHVpbnQgb2Zmc2V0KTsKK3UxNiAgICAgZmV0Y2hfZGF0YV93b3JkX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Cit1MzIgICAgIGZldGNoX2RhdGFfbG9uZyAodWludCBvZmZzZXQpOwordTMyICAgICBmZXRjaF9kYXRhX2xvbmdfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9ieXRlICh1aW50IG9mZnNldCwgdTggdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9ieXRlX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTggdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV93b3JkICh1aW50IG9mZnNldCwgdTE2IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUxNiB2YWwpOwordm9pZCAgICBzdG9yZV9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0LCB1MzIgdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTMyIHZhbCk7Cit1OCogCWRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKGludCByZWcpOwordTE2KiAJZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoaW50IHJlZyk7Cit1MzIqIAlkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcihpbnQgcmVnKTsKK3UxNiogCWRlY29kZV9ybV9zZWdfcmVnaXN0ZXIoaW50IHJlZyk7Cit1bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKGludCBybSk7Cit1bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKGludCBybSk7Cit1bnNpZ25lZCBkZWNvZGVfcm0xMF9hZGRyZXNzKGludCBybSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWDg2RU1VX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2ZwdS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9mcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmIyNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9mcHUuaApAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBGUFUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX0ZQVV9ICisjZGVmaW5lIF9fWDg2RU1VX0ZQVV9ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworLyogdGhlc2UgaGF2ZSB0byBiZSBkZWZpbmVkLCB3aGV0aGVyIDgwODcgc3VwcG9ydCBjb21waWxlZCBpbiBvciBub3QuICovCisKK2V4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDggKHU4IG9wMSk7CitleHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q5ICh1OCBvcDEpOworZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYSAodTggb3AxKTsKK2V4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIgKHU4IG9wMSk7CitleHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjICh1OCBvcDEpOworZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZCAodTggb3AxKTsKK2V4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUgKHU4IG9wMSk7CitleHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RmICh1OCBvcDEpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9GUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9vcHMuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlYTY3NgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvb3BzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igb3BlcmFuZCBkZWNvZGluZyBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX09QU19ICisjZGVmaW5lIF9fWDg2RU1VX09QU19ICisKK2V4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiWzB4MTAwXSkodTggb3AxKTsKK2V4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiMlsweDEwMF0pKHU4IG9wMik7CisKKyNlbmRpZiAvKiBfX1g4NkVNVV9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX2FzbS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjNjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fYXNtLmgKQEAgLTAsMCArMSw5NzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJCVdhdGNvbSBDKysgMTAuNiBvciBsYXRlcgorKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSW5saW5lIGFzc2VtYmxlciB2ZXJzaW9ucyBvZiB0aGUgcHJpbWl0aXZlIG9wZXJhbmQKKyoJCQkJZnVuY3Rpb25zIGZvciBmYXN0ZXIgcGVyZm9ybWFuY2UuIEF0IHRoZSBtb21lbnQgdGhpcyBpcworKgkJCQl4ODYgaW5saW5lIGFzc2VtYmxlciwgYnV0IHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSByZXBsYWNlZAorKgkJCQl3aXRoIG5hdGl2ZSBpbmxpbmUgYXNzZW1ibGVyIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9jZXNzb3IKKyoJCQkJcGxhdGZvcm0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9fWDg2RU1VX1BSSU1fQVNNX0gKKyNkZWZpbmUJX19YODZFTVVfUFJJTV9BU01fSAorCisjaWZkZWYJX19XQVRDT01DX18KKworI2lmbmRlZglWQUxJREFURQorI2RlZmluZQlfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCisjZW5kaWYKKwordTMyCQlnZXRfZmxhZ3NfYXNtKHZvaWQpOworI3ByYWdtYSBhdXggZ2V0X2ZsYWdzX2FzbSA9CQkJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJZWF4IiAgICAgICAgICAgICAgICAgIAlcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1MTYgICAgIGFhYV93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKKyNwcmFnbWEgYXV4IGFhYV93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhYWEiICAgICAgICAgICAgICAgICAgCQkJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIAkJCQlcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheF07CisKK3UxNiAgICAgYWFzX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOworI3ByYWdtYSBhdXggYWFzX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImFhcyIgICAgICAgICAgICAgICAgICAJCQlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gCQkJCVwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4XTsKKwordTE2ICAgICBhYWRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7CisjcHJhZ21hIGF1eCBhYWRfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiYWFkIiAgICAgICAgICAgICAgICAgIAkJCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSAJCQkJXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXhdOworCit1MTYgICAgIGFhbV93b3JkX2FzbSh1MzIgKmZsYWdzLHU4IGQpOworI3ByYWdtYSBhdXggYWFtX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImFhbSIgICAgICAgICAgICAgICAgICAJCQlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFthbF0gCQkJCVwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4XTsKKwordTggICAgICBhZGNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFkY19ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGMJYWwsYmwiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiAgICAgYWRjX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFkY193b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGMJYXgsYngiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiAgICAgYWRjX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFkY19sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGMJZWF4LGVieCIgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggICAgICBhZGRfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFkZF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGQJYWwsYmwiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiAgICAgYWRkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFkZF93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGQJYXgsYngiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiAgICAgYWRkX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFkZF9sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhZGQJZWF4LGVieCIgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggICAgICBhbmRfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFuZF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhbmQJYWwsYmwiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiAgICAgYW5kX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFuZF93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhbmQJYXgsYngiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiAgICAgYW5kX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFuZF9sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJhbmQJZWF4LGVieCIgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggICAgICBjbXBfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGNtcF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJjbXAJYWwsYmwiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiAgICAgY21wX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGNtcF93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJjbXAJYXgsYngiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiAgICAgY21wX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGNtcF9sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJjbXAJZWF4LGVieCIgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggICAgICBkYWFfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKKyNwcmFnbWEgYXV4IGRhYV9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJkYWEiICAgICAgICAgICAgICAgICAgCQkJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbF07CisKK3U4ICAgICAgZGFzX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7CisjcHJhZ21hIGF1eCBkYXNfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiZGFzIiAgICAgICAgICAgICAgICAgIAkJCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAorCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWxdOworCit1OCAgICAgIGRlY19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOworI3ByYWdtYSBhdXggZGVjX2J5dGVfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImRlYwlhbCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiAgICAgZGVjX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOworI3ByYWdtYSBhdXggZGVjX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImRlYwlheCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheF07CisKK3UzMiAgICAgZGVjX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOworI3ByYWdtYSBhdXggZGVjX2xvbmdfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImRlYwllYXgiICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggICAgICBpbmNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKKyNwcmFnbWEgYXV4IGluY19ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJpbmMJYWwiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAorCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWxdOworCit1MTYgICAgIGluY193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKKyNwcmFnbWEgYXV4IGluY193b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJpbmMJYXgiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgIAkJXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgICAgIGluY19sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkKTsKKyNwcmFnbWEgYXV4IGluY19sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJpbmMJZWF4IiAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAJCVwKKwl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2VheF07CisKK3U4ICAgICAgb3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IG9yX2J5dGVfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJIm9yCWFsLGJsIiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2ICAgICBvcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBvcl93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJvcglheCxieCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiAgICAgb3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggb3JfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkib3IJZWF4LGVieCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4ICAgICAgbmVnX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7CisjcHJhZ21hIGF1eCBuZWdfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkibmVnCWFsIiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKKwl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2ICAgICBuZWdfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7CisjcHJhZ21hIGF1eCBuZWdfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkibmVnCWF4IiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAJCVwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4XTsKKwordTMyICAgICBuZWdfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCk7CisjcHJhZ21hIGF1eCBuZWdfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkibmVnCWVheCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgCQlcCisJdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCAgICAgIG5vdF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOworI3ByYWdtYSBhdXggbm90X2J5dGVfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJIm5vdAlhbCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiAgICAgbm90X3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOworI3ByYWdtYSBhdXggbm90X3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJIm5vdAlheCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCisJdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFtheF07CisKK3UzMiAgICAgbm90X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOworI3ByYWdtYSBhdXggbm90X2xvbmdfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJIm5vdAllYXgiICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggICAgICByY2xfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjbF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJyY2wJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgcmNsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNsX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInJjbAlheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICByY2xfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY2xfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkicmNsCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICByY3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjcl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJyY3IJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgcmNyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNyX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInJjcglheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICByY3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY3JfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkicmNyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICByb2xfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvbF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJyb2wJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgcm9sX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9sX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInJvbAlheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICByb2xfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb2xfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkicm9sCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICByb3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvcl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJyb3IJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgcm9yX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9yX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInJvcglheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICByb3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb3JfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkicm9yCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICBzaGxfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJzaGwJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgc2hsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInNobAlheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICBzaGxfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaGxfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2hsCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICBzaHJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJzaHIJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgc2hyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInNocglheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICBzaHJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2hyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggICAgICBzYXJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNhcl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJzYXIJYWwsY2wiICAgICAgICAgICAgICAgICAgXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisJdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiAgICAgc2FyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2FyX3dvcmRfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJInNhcglheCxjbCIgICAgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyICAgICBzYXJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzYXJfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2FyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTE2CQlzaGxkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobGRfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2hsZAlheCxkeCxjbCIgICAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtheF0gW2R4XSBbY2xdICAgICAgIFwKKwl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2F4IGR4IGNsXTsKKwordTMyICAgICBzaGxkX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobGRfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2hsZAllYXgsZWR4LGNsIiAgICAgICAgICAgICBcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwlwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKKwl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKwltb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOworCit1MTYJCXNocmRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyZF93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJzaHJkCWF4LGR4LGNsIiAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXggZHggY2xdOworCit1MzIgICAgIHNocmRfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyZF9sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJzaHJkCWVheCxlZHgsY2wiICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VkeF0gW2NsXSAgICAgXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVkeCBjbF07CisKK3U4ICAgICAgc2JiX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzYmJfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2JiCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgICAgIHNiYl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBzYmJfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2JiCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgICAgIHNiYl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBzYmJfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic2JiCWVheCxlYngiICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4ICAgICAgc3ViX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzdWJfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic3ViCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgICAgIHN1Yl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBzdWJfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic3ViCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgICAgIHN1Yl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBzdWJfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkic3ViCWVheCxlYngiICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3ZvaWQJdGVzdF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggdGVzdF9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJ0ZXN0CWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWwgYmxdOworCit2b2lkCXRlc3Rfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggdGVzdF93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJ0ZXN0CWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXggYnhdOworCit2b2lkCXRlc3RfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggdGVzdF9sb25nX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJ0ZXN0CWVheCxlYngiICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4ICAgICAgeG9yX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCB4b3JfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkieG9yCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgICAgIHhvcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCB4b3Jfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkieG9yCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgICAgIHhvcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCB4b3JfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkieG9yCWVheCxlYngiICAgICAgICAgICAgICAgIFwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorCW1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3ZvaWQgICAgaW11bF9ieXRlX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTggZCx1OCBzKTsKKyNwcmFnbWEgYXV4IGltdWxfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiaW11bAlibCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJIm1vdglbZXNpXSxheCIJCQkJXAorCXBhcm0gW2VkaV0gW2VzaV0gW2FsXSBbYmxdICAgICAgXAorCW1vZGlmeSBleGFjdCBbZXNpIGF4IGJsXTsKKwordm9pZCAgICBpbXVsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1MTYgKmR4LHUxNiBkLHUxNiBzKTsKKyNwcmFnbWEgYXV4IGltdWxfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiaW11bAlieCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJIm1vdglbZXNpXSxheCIJCQkJXAorCSJtb3YJW2VjeF0sZHgiCQkJCVwKKwlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2J4XVwKKwltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYnggZHhdOworCit2b2lkICAgIGltdWxfbG9uZ19hc20odTMyICpmbGFncyx1MzIgKmVheCx1MzIgKmVkeCx1MzIgZCx1MzIgcyk7CisjcHJhZ21hIGF1eCBpbXVsX2xvbmdfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJImltdWwJZWJ4IiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkibW92CVtlc2ldLGVheCIJCQkJXAorCSJtb3YJW2VjeF0sZWR4IgkJCQlcCisJcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWJ4XSBcCisJbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlYnggZWR4XTsKKwordm9pZCAgICBtdWxfYnl0ZV9hc20odTMyICpmbGFncyx1MTYgKmF4LHU4IGQsdTggcyk7CisjcHJhZ21hIGF1eCBtdWxfYnl0ZV9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkibXVsCWJsIiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkibW92CVtlc2ldLGF4IgkJCQlcCisJcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCisJbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOworCit2b2lkICAgIG11bF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZCx1MTYgcyk7CisjcHJhZ21hIGF1eCBtdWxfd29yZF9hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkibXVsCWJ4IiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkibW92CVtlc2ldLGF4IgkJCQlcCisJIm1vdglbZWN4XSxkeCIJCQkJXAorCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAorCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07CisKK3ZvaWQgICAgbXVsX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGQsdTMyIHMpOworI3ByYWdtYSBhdXggbXVsX2xvbmdfYXNtID0JCQlcCisJInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCisJInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJIm11bAllYngiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJtb3YJW2VzaV0sZWF4IgkJCQlcCisJIm1vdglbZWN4XSxlZHgiCQkJCVwKKwlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlYnhdIFwKKwltb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVieCBlZHhdOworCit2b2lkCWlkaXZfYnl0ZV9hc20odTMyICpmbGFncyx1OCAqYWwsdTggKmFoLHUxNiBkLHU4IHMpOworI3ByYWdtYSBhdXggaWRpdl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJpZGl2CWJsIiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkibW92CVtlc2ldLGFsIgkJCQlcCisJIm1vdglbZWN4XSxhaCIJCQkJXAorCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYmxdXAorCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBibF07CisKK3ZvaWQJaWRpdl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZGxvLHUxNiBkaGksdTE2IHMpOworI3ByYWdtYSBhdXggaWRpdl93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJpZGl2CWJ4IiAgICAgICAgICAgICAgICAgIAlcCisJInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisJInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkibW92CVtlc2ldLGF4IgkJCQlcCisJIm1vdglbZWN4XSxkeCIJCQkJXAorCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbZHhdIFtieF1cCisJbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGR4IGJ4XTsKKwordm9pZAlpZGl2X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGRsbyx1MzIgZGhpLHUzMiBzKTsKKyNwcmFnbWEgYXV4IGlkaXZfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiaWRpdgllYngiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJtb3YJW2VzaV0sZWF4IgkJCQlcCisJIm1vdglbZWN4XSxlZHgiCQkJCVwKKwlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlZHhdIFtlYnhdXAorCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWR4IGVieF07CisKK3ZvaWQJZGl2X2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggKmFsLHU4ICphaCx1MTYgZCx1OCBzKTsKKyNwcmFnbWEgYXV4IGRpdl9ieXRlX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJkaXYJYmwiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJtb3YJW2VzaV0sYWwiCQkJCVwKKwkibW92CVtlY3hdLGFoIgkJCQlcCisJcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtibF1cCisJbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJsXTsKKwordm9pZAlkaXZfd29yZF9hc20odTMyICpmbGFncyx1MTYgKmF4LHUxNiAqZHgsdTE2IGRsbyx1MTYgZGhpLHUxNiBzKTsKKyNwcmFnbWEgYXV4IGRpdl93b3JkX2FzbSA9CQkJXAorCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCSJkaXYJYngiICAgICAgICAgICAgICAgICAgCVwKKwkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAorCSJtb3YJW2VzaV0sYXgiCQkJCVwKKwkibW92CVtlY3hdLGR4IgkJCQlcCisJcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKKwltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOworCit2b2lkCWRpdl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiAqZWF4LHUzMiAqZWR4LHUzMiBkbG8sdTMyIGRoaSx1MzIgcyk7CisjcHJhZ21hIGF1eCBkaXZfbG9uZ19hc20gPQkJCVwKKwkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKKwkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkiZGl2CWVieCIgICAgICAgICAgICAgICAgICAJXAorCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCisJIm1vdglbZXNpXSxlYXgiCQkJCVwKKwkibW92CVtlY3hdLGVkeCIJCQkJXAorCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCisJbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX0FTTV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fb3BzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzM2ZlMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9vcHMuaApAQCAtMCwwICsxLDIzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgcHJpbWl0aXZlIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX1BSSU1fT1BTX0gKKyNkZWZpbmUgX19YODZFTVVfUFJJTV9PUFNfSAorCisjaW5jbHVkZSAieDg2ZW11L3ByaW1fYXNtLmgiCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKwordTE2ICAgICBhYWFfd29yZCAodTE2IGQpOwordTE2ICAgICBhYXNfd29yZCAodTE2IGQpOwordTE2ICAgICBhYWRfd29yZCAodTE2IGQpOwordTE2ICAgICBhYW1fd29yZCAodTggZCk7Cit1OCAgICAgIGFkY19ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgYWRjX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGFkY19sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBhZGRfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIGFkZF93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBhZGRfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3U4ICAgICAgYW5kX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBhbmRfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIGNtcF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgY21wX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGNtcF9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBkYWFfYnl0ZSAodTggZCk7Cit1OCAgICAgIGRhc19ieXRlICh1OCBkKTsKK3U4ICAgICAgZGVjX2J5dGUgKHU4IGQpOwordTE2ICAgICBkZWNfd29yZCAodTE2IGQpOwordTMyICAgICBkZWNfbG9uZyAodTMyIGQpOwordTggICAgICBpbmNfYnl0ZSAodTggZCk7Cit1MTYgICAgIGluY193b3JkICh1MTYgZCk7Cit1MzIgICAgIGluY19sb25nICh1MzIgZCk7Cit1OCAgICAgIG9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBvcl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBuZWdfYnl0ZSAodTggcyk7Cit1MTYgICAgIG5lZ193b3JkICh1MTYgcyk7Cit1MzIgICAgIG5lZ19sb25nICh1MzIgcyk7Cit1OCAgICAgIG5vdF9ieXRlICh1OCBzKTsKK3UxNiAgICAgbm90X3dvcmQgKHUxNiBzKTsKK3UzMiAgICAgbm90X2xvbmcgKHUzMiBzKTsKK3U4ICAgICAgcmNsX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByY2xfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByY2xfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICByY3JfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHJjcl93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHJjcl9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHJvbF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgcm9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByb3Jfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByb3JfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICBzaGxfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHNobF93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHNobF9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHNocl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgc2FyX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBzYXJfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICBzYXJfbG9uZyAodTMyIGQsIHU4IHMpOwordTE2ICAgICBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Cit1MzIgICAgIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKK3UxNiAgICAgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwordTMyICAgICBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Cit1OCAgICAgIHNiYl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2JiX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHNiYl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBzdWJfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3ZvaWQgICAgdGVzdF9ieXRlICh1OCBkLCB1OCBzKTsKK3ZvaWQgICAgdGVzdF93b3JkICh1MTYgZCwgdTE2IHMpOwordm9pZCAgICB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIHhvcl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgeG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHhvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordm9pZCAgICBpbXVsX2J5dGUgKHU4IHMpOwordm9pZCAgICBpbXVsX3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgaW11bF9sb25nICh1MzIgcyk7Cit2b2lkIAlpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpOwordm9pZCAgICBtdWxfYnl0ZSAodTggcyk7Cit2b2lkICAgIG11bF93b3JkICh1MTYgcyk7Cit2b2lkICAgIG11bF9sb25nICh1MzIgcyk7Cit2b2lkICAgIGlkaXZfYnl0ZSAodTggcyk7Cit2b2lkICAgIGlkaXZfd29yZCAodTE2IHMpOwordm9pZCAgICBpZGl2X2xvbmcgKHUzMiBzKTsKK3ZvaWQgICAgZGl2X2J5dGUgKHU4IHMpOwordm9pZCAgICBkaXZfd29yZCAodTE2IHMpOwordm9pZCAgICBkaXZfbG9uZyAodTMyIHMpOwordm9pZCAgICBpbnMgKGludCBzaXplKTsKK3ZvaWQgICAgb3V0cyAoaW50IHNpemUpOwordTE2ICAgICBtZW1fYWNjZXNzX3dvcmQgKGludCBhZGRyKTsKK3ZvaWQgICAgcHVzaF93b3JkICh1MTYgdyk7Cit2b2lkICAgIHB1c2hfbG9uZyAodTMyIHcpOwordTE2ICAgICBwb3Bfd29yZCAodm9pZCk7Cit1MzIJCXBvcF9sb25nICh2b2lkKTsKKworI2lmICBkZWZpbmVkKF9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18pICYmICFkZWZpbmVkKFBSSU1fT1BTX05PX1JFREVGSU5FX0FTTSkKKworI2RlZmluZQlhYWFfd29yZChkKQkJYWFhX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKKyNkZWZpbmUgYWFzX3dvcmQoZCkJCWFhc193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCisjZGVmaW5lIGFhZF93b3JkKGQpCQlhYWRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQorI2RlZmluZSBhYW1fd29yZChkKQkJYWFtX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKKyNkZWZpbmUgYWRjX2J5dGUoZCxzKQlhZGNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIGFkY193b3JkKGQscykJYWRjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBhZGNfbG9uZyhkLHMpCWFkY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgYWRkX2J5dGUoZCxzKSAJYWRkX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBhZGRfd29yZChkLHMpCWFkZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgYWRkX2xvbmcoZCxzKQlhZGRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIGFuZF9ieXRlKGQscykJYW5kX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBhbmRfd29yZChkLHMpCWFuZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgYW5kX2xvbmcoZCxzKQlhbmRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIGNtcF9ieXRlKGQscykJY21wX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBjbXBfd29yZChkLHMpCWNtcF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgY21wX2xvbmcoZCxzKQljbXBfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIGRhYV9ieXRlKGQpCQlkYWFfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKQorI2RlZmluZSBkYXNfYnl0ZShkKQkJZGFzX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCkKKyNkZWZpbmUgZGVjX2J5dGUoZCkJCWRlY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCisjZGVmaW5lIGRlY193b3JkKGQpCQlkZWNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQorI2RlZmluZSBkZWNfbG9uZyhkKQkJZGVjX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCkKKyNkZWZpbmUgaW5jX2J5dGUoZCkJCWluY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCisjZGVmaW5lIGluY193b3JkKGQpCQlpbmNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQorI2RlZmluZSBpbmNfbG9uZyhkKQkJaW5jX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCkKKyNkZWZpbmUgb3JfYnl0ZShkLHMpCW9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBvcl93b3JkKGQscykJb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIG9yX2xvbmcoZCxzKQlvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgbmVnX2J5dGUocykJCW5lZ19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpCisjZGVmaW5lIG5lZ193b3JkKHMpCQluZWdfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKQorI2RlZmluZSBuZWdfbG9uZyhzKQkJbmVnX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscykKKyNkZWZpbmUgbm90X2J5dGUocykJCW5vdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpCisjZGVmaW5lIG5vdF93b3JkKHMpCQlub3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKQorI2RlZmluZSBub3RfbG9uZyhzKQkJbm90X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscykKKyNkZWZpbmUgcmNsX2J5dGUoZCxzKQlyY2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHJjbF93b3JkKGQscykJcmNsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSByY2xfbG9uZyhkLHMpCXJjbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgcmNyX2J5dGUoZCxzKQlyY3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHJjcl93b3JkKGQscykJcmNyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSByY3JfbG9uZyhkLHMpCXJjcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgcm9sX2J5dGUoZCxzKQlyb2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHJvbF93b3JkKGQscykJcm9sX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSByb2xfbG9uZyhkLHMpCXJvbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgcm9yX2J5dGUoZCxzKQlyb3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHJvcl93b3JkKGQscykJcm9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSByb3JfbG9uZyhkLHMpCXJvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc2hsX2J5dGUoZCxzKQlzaGxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHNobF93b3JkKGQscykJc2hsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBzaGxfbG9uZyhkLHMpCXNobF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc2hyX2J5dGUoZCxzKQlzaHJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHNocl93b3JkKGQscykJc2hyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBzaHJfbG9uZyhkLHMpCXNocl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc2FyX2J5dGUoZCxzKQlzYXJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHNhcl93b3JkKGQscykJc2FyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBzYXJfbG9uZyhkLHMpCXNhcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc2hsZF93b3JkKGQsZmlsbCxzKQlzaGxkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCisjZGVmaW5lIHNobGRfbG9uZyhkLGZpbGwscykJc2hsZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKQorI2RlZmluZSBzaHJkX3dvcmQoZCxmaWxsLHMpCXNocmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscykKKyNkZWZpbmUgc2hyZF9sb25nKGQsZmlsbCxzKQlzaHJkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCisjZGVmaW5lIHNiYl9ieXRlKGQscykJc2JiX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBzYmJfd29yZChkLHMpCXNiYl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc2JiX2xvbmcoZCxzKQlzYmJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHN1Yl9ieXRlKGQscykJc3ViX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSBzdWJfd29yZChkLHMpCXN1Yl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgc3ViX2xvbmcoZCxzKQlzdWJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHRlc3RfYnl0ZShkLHMpCXRlc3RfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHRlc3Rfd29yZChkLHMpCXRlc3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHRlc3RfbG9uZyhkLHMpCXRlc3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIHhvcl9ieXRlKGQscykJeG9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQorI2RlZmluZSB4b3Jfd29yZChkLHMpCXhvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKKyNkZWZpbmUgeG9yX2xvbmcoZCxzKQl4b3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCisjZGVmaW5lIGltdWxfYnl0ZShzKQlpbXVsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsTS54ODYuUl9BTCxzKQorI2RlZmluZSBpbXVsX3dvcmQocykJaW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscykKKyNkZWZpbmUgaW11bF9sb25nKHMpCWltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpCisjZGVmaW5lIGltdWxfbG9uZ19kaXJlY3QocmVzX2xvLHJlc19oaSxkLHMpCWltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxyZXNfbG8scmVzX2hpLGQscykKKyNkZWZpbmUgbXVsX2J5dGUocykJCW11bF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLE0ueDg2LlJfQUwscykKKyNkZWZpbmUgbXVsX3dvcmQocykJCW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscykKKyNkZWZpbmUgbXVsX2xvbmcocykJCW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscykKKyNkZWZpbmUgaWRpdl9ieXRlKHMpCWlkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpCisjZGVmaW5lIGlkaXZfd29yZChzKQlpZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpCisjZGVmaW5lIGlkaXZfbG9uZyhzKQlpZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKQorI2RlZmluZSBkaXZfYnl0ZShzKQkJZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKQorI2RlZmluZSBkaXZfd29yZChzKQkJZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpCisjZGVmaW5lIGRpdl9sb25nKHMpCQlkaXZfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLE0ueDg2LlJfRURYLHMpCisKKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX09QU19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3g4NmVtdWkuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUveDg2ZW11aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjQ5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3g4NmVtdWkuaApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMKKyoJCQkJYXJlIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudCBsaWJyYXJpZXMsCisqCQkJCWFuZCBuZXZlciBpbiBhIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX1g4NkVNVUlfSAorI2RlZmluZSBfX1g4NkVNVV9YODZFTVVJX0gKKworLyogSWYgd2UgYXJlIGNvbXBpbGluZyBpbiBDKysgbW9kZSwgd2UgY2FuIGNvbXBpbGUgc29tZSBmdW5jdGlvbnMgYXMKKyAqIGlubGluZSB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSAoaG93ZXZlciB0aGUgY29kZSBzaXplIGluY3JlYXNlcyBxdWl0ZQorICogZHJhbWF0aWNhbGx5IGluIHRoaXMgY2FzZSkuCisgKi8KKworI2lmCWRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKF9OT19JTkxJTkUpCisjZGVmaW5lCV9JTkxJTkUJaW5saW5lCisjZWxzZQorI2RlZmluZQlfSU5MSU5FIHN0YXRpYworI2VuZGlmCisKKy8qIEdldCByaWQgb2YgdW51c2VkIHBhcmFtZXRlcnMgaW4gQysrIGNvbXBpbGF0aW9uIG1vZGUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lCVg4NkVNVV9VTlVTRUQodikKKyNlbHNlCisjZGVmaW5lCVg4NkVNVV9VTlVTRUQodikJdgorI2VuZGlmCisKKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgorI2luY2x1ZGUgIng4NmVtdS9kZWJ1Zy5oIgorI2luY2x1ZGUgIng4NmVtdS9kZWNvZGUuaCIKKyNpbmNsdWRlICJ4ODZlbXUvb3BzLmgiCisjaW5jbHVkZSAieDg2ZW11L3ByaW1fb3BzLmgiCisjaW5jbHVkZSAieDg2ZW11L2ZwdS5oIgorI2luY2x1ZGUgIng4NmVtdS9mcHVfcmVncy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElubGluZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworZXh0ZXJuIHU4ICAJKFg4NkFQSVAgc3lzX3JkYikodTMyIGFkZHIpOworZXh0ZXJuIHUxNiAJKFg4NkFQSVAgc3lzX3JkdykodTMyIGFkZHIpOworZXh0ZXJuIHUzMiAJKFg4NkFQSVAgc3lzX3JkbCkodTMyIGFkZHIpOworZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dyYikodTMyIGFkZHIsdTggdmFsKTsKK2V4dGVybiB2b2lkIChYODZBUElQIHN5c193cncpKHUzMiBhZGRyLHUxNiB2YWwpOworZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dybCkodTMyIGFkZHIsdTMyIHZhbCk7CisKK2V4dGVybiB1OCAgCShYODZBUElQIHN5c19pbmIpKFg4NkVNVV9waW9BZGRyIGFkZHIpOworZXh0ZXJuIHUxNiAJKFg4NkFQSVAgc3lzX2ludykoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CitleHRlcm4gdTMyIAkoWDg2QVBJUCBzeXNfaW5sKShYODZFTVVfcGlvQWRkciBhZGRyKTsKK2V4dGVybiB2b2lkIChYODZBUElQIHN5c19vdXRiKShYODZFTVVfcGlvQWRkciBhZGRyLHU4IHZhbCk7CitleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0dykoWDg2RU1VX3Bpb0FkZHIgYWRkcix1MTYgdmFsKTsKK2V4dGVybiB2b2lkCShYODZBUElQIHN5c19vdXRsKShYODZFTVVfcGlvQWRkciBhZGRyLHUzMiB2YWwpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9YODZFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3g4NmludGVyZmFjZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IveDg2aW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZDYxYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3g4NmludGVyZmFjZS5jCkBAIC0wLDAgKzEsODE1IEBACisjaW5jbHVkZSAieDg2ZW11LmgiCisjaW5jbHVkZSAiZ2x1ZS5oIgorCisKKy8qCisgKiBUaGlzIGlzbid0IG5pY2UsIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgaW5jb21wYXRpYmlsaXRpZXMgaW4gdGhlIFUtQm9vdCBhbmQgc2NpdGVjaCBpbmNsdWRlCisgKiBmaWxlcyB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgcmVhbGx5IHdvcmthYmxlIHNvbHV0aW9uLgorICogTWlnaHQgYmUgY2xlYW5lZCBvdXQgbGF0ZXIuIAorICovCisKKyNpZmRlZiBERUJVRworI3VuZGVmIERFQlVHCisjZW5kaWYKKworI3VuZGVmIElPX0xPR0dJTkcKKyN1bmRlZiBNRU1fTE9HR0lORworCisjaWZkZWYgSU9fTE9HR0lORworI2RlZmluZSBMT0dJTyhwb3J0LCBmb3JtYXQsIGFyZ3MuLi4pIGlmIChkb2xvZyhwb3J0KSkgX3ByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTE9HSU8ocG9ydCwgZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBNRU1fTE9HR0lOCisjZGVmaW5lIExPR01FTShmb3JtYXQsIGFyZ3MuLi4pIF9wcmludGYoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIExPR01FTShmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFBSSU5URihmb3JtYXQsIGFyZ3MuLi4pIF9wcmludGYoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmb3JtYXQsIGFyZ2MuLi4pCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVCWVRFOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV09SRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKKwordHlwZWRlZiBjaGFyIEJZVEU7Cit0eXBlZGVmIHNob3J0IFdPUlQ7Cit0eXBlZGVmIGxvbmcgTE9ORzsKKworI2RlZmluZSBFTVVMQVRPUl9NRU1fU0laRSAgICAgICAoMTAyNCoxMDI0KQorI2RlZmluZSBFTVVMQVRPUl9CSU9TX09GRlNFVCAgICAweEMwMDAwCisjZGVmaW5lIEVNVUxBVE9SX1NUUkFQX09GRlNFVCAgIDB4MzAwMDAKKyNkZWZpbmUgRU1VTEFUT1JfU1RBQ0tfT0ZGU0VUICAgMHgyMDAwMAorI2RlZmluZSBFTVVMQVRPUl9MT0dPX09GRlNFVCAgICAweDQwMDAwIC8vIElmIHlvdSBjaGFuZ2UgdGhpcywgY2hhbmdlIHRoZSBzdHJhcCBjb2RlLCB0b28KKyNkZWZpbmUgVklERU9fQkFTRSAodm9pZCAqKTB4RkQwQjgwMDAKKworZXh0ZXJuIGNoYXIgKmdldGVudihjaGFyICopOworZXh0ZXJuIGludCB0c3RjKHZvaWQpOworZXh0ZXJuIGludCBnZXRjKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdmlkZW9fZ2V0X2F0dHIodm9pZCk7CisKK2ludCBhdG9pKGNoYXIgKnN0cmluZykKK3sKKyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAoKnN0cmluZz49JzAnICYmICpzdHJpbmcgPD0nOScpCisgICAgeworCXJlcyAqPSAxMDsKKwlyZXMgKz0gKnN0cmluZy0nMCc7CisJc3RyaW5nKys7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBjb25zX2dldHMoY2hhciAqYnVmZmVyKQoreworICAgIGludCBpID0gMDsKKyAgICBjaGFyIGMgPSAwOworCisgICAgYnVmZmVyWzBdID0gMDsKKyAgICBpZiAoZ2V0ZW52KCJ4ODZfcnVudGhydSIpKSByZXR1cm47IC8vRklYTUU6CisgICAgd2hpbGUgKGMgIT0gMHgwRCAmJiBjICE9IDB4MEEpCisgICAgeworCXdoaWxlICghdHN0YygpKTsKKwljID0gZ2V0YygpOworCWlmIChjPj0zMiAmJiBjIDwgMTI3KQorCXsKKwkgICAgYnVmZmVyW2ldID0gYzsKKwkgICAgaSsrOworCSAgICBidWZmZXJbaV0gPSAwOworCSAgICBwdXRjKGMpOworCX0KKwllbHNlCisJeworCSAgICBpZiAoYyA9PSAweDA4KQorCSAgICB7CisJCWlmIChpPjApIGktLTsKKwkJYnVmZmVyW2ldID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgYnVmZmVyW2ldID0gJ1xuJzsKKyAgICBidWZmZXJbaSsxXSA9IDA7Cit9CisKK2NoYXIgKmJpb3NfZGF0ZSA9ICIwOC8xNC8wMiI7CitVQllURSBtb2RlbCA9IDB4RkM7CitVQllURSBzdWJtb2RlbCA9IDB4MDA7CisKK3N0YXRpYyBpbmxpbmUgVUJZVEUgcmVhZF9ieXRlKHZvbGF0aWxlIFVCWVRFKiBmcm9tKQoreworICAgIGludCB4OworICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOworICAgIHJldHVybiAoVUJZVEUpeDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2J5dGUodm9sYXRpbGUgVUJZVEUgKnRvLCBpbnQgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdGIgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqZnJvbSkKK3sKKyAgICBpbnQgeDsKKyAgICBhc20gdm9sYXRpbGUgKCJsaGJyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIgKCpmcm9tKSk7CisgICAgcmV0dXJuIChVV09SRCl4OworfQorCitzdGF0aWMgaW5saW5lIFVXT1JEIHJlYWRfd29yZF9iaWcodm9sYXRpbGUgVVdPUkQgKmZyb20pCit7CisgICAgaW50IHg7CisgICAgYXNtIHZvbGF0aWxlICgibGh6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7CisgICAgcmV0dXJuIChVV09SRCl4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9saXR0bGUodm9sYXRpbGUgVVdPUkQgKnRvLCBpbnQgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdGhicnggJTEsMCwlMlxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpLCAiciIgKHRvKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQoreworICAgIGFzbSB2b2xhdGlsZSAoInN0aCAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKK30KKworc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICpmcm9tKQoreworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBhc20gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIoKmZyb20pKTsKKyAgICByZXR1cm4gKFVMT05HKXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgVUxPTkcgcmVhZF9sb25nX2JpZyh2b2xhdGlsZSBVTE9ORyAqZnJvbSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgYXNtIHZvbGF0aWxlICgibHd6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7CisgICAgcmV0dXJuIChVTE9ORyl4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQoreworICAgIGFzbSB2b2xhdGlsZSAoInN0d2JyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJzdHcgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cit9CisKK3N0YXRpYyBpbnQgbG9nX2luaXQgPSAwOworc3RhdGljIGludCBsb2dfZG8gPSAwOworc3RhdGljIGludCBsb2dfbG93ID0gMDsKKworaW50IGRvbG9nKGludCBwb3J0KQoreworICAgIGlmIChsb2dfaW5pdCAmJiBsb2dfZG8pIAorICAgIHsKKwlpZiAobG9nX2xvdyAmJiBwb3J0ID4gMHg0MDApIHJldHVybiAwOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmICghbG9nX2luaXQpCisgICAgeworCWxvZ19pbml0ID0gMTsKKwlsb2dfZG8gPSAoZ2V0ZW52KCJ4ODZfbG9naW8iKSAhPSAoY2hhciAqKTApOworCWxvZ19sb3cgPSAoZ2V0ZW52KCJ4ODZfbG9nbG93IikgIT0gKGNoYXIgKikwKTsKKwlpZiAobG9nX2RvKSAKKwl7CisJICAgIGlmIChsb2dfbG93ICYmIHBvcnQgPiAweDQwMCkgcmV0dXJuIDA7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIENvbnZlcnRzIGFuIGVtdWxhdG9yIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBhZGRyZXNzLgorLy8gSGFuZGxlcyBhbGwgc3BlY2lhbCBjYXNlcyAoYmlvcyBkYXRlLCBtb2RlbCBldGMpLCBhbmQgbWlnaHQgbmVlZCB3b3JrCit1MzIgbWVtYWRkcih1MzIgYWRkcikKK3sKKy8vICAgIGlmIChhZGRyID49IDB4RjAwMDAgJiYgYWRkciA8IDB4RkZGRkYpIHByaW50ZigiV0FSTklORzogU2VnbWVudCBGIGFjY2VzcyAoMHgleClcbiIsIGFkZHIpOworLy8gICAgcHJpbnRmKCJNZW1BZGRyPSVwXG4iLCBhZGRyKTsKKyAgICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPCAweEMwMDAwKQorCXJldHVybiAweEZEMDAwMDAwICsgYWRkcjsKKyAgICBlbHNlIGlmIChhZGRyID49IDB4RkZGRjUgJiYgYWRkciA8IDB4RkZGRkUpCisgICAgeworCXJldHVybiAodTMyKWJpb3NfZGF0ZSthZGRyLTB4RkZGRjU7CisgICAgfQorICAgIGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRSkKKwlyZXR1cm4gKHUzMikmbW9kZWw7CisgICAgZWxzZSBpZiAoYWRkciA9PSAweEZGRkZGKQorCXJldHVybiAodTMyKSZzdWJtb2RlbDsKKyAgICBlbHNlIGlmIChhZGRyID49IDB4ODAwMDAwMDApCisgICAgeworCS8vcHJpbnRmKCJXYXJuaW5nOiBIaWdoIG1lbW9yeSBhY2Nlc3MgYXQgMHgleFxuIiwgYWRkcik7CisJcmV0dXJuIGFkZHI7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4gKHUzMilNLm1lbV9iYXNlK2FkZHI7Cit9CisKK3U4IEExX3JkYih1MzIgYWRkcikKK3sKKyAgICB1OCBhID0gcmVhZF9ieXRlKChVQllURSAqKW1lbWFkZHIoYWRkcikpOworICAgIExPR01FTSgicmRiOiAleCAtPiAleFxuIiwgYWRkciwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3UxNiBBMV9yZHcodTMyIGFkZHIpCit7CisgICAgdTE2IGEgPSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKW1lbWFkZHIoYWRkcikpOworICAgIExPR01FTSgicmR3OiAleCAtPiAleFxuIiwgYWRkciwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3UzMiBBMV9yZGwodTMyIGFkZHIpCit7CisgICAgdTMyIGEgPSByZWFkX2xvbmdfbGl0dGxlKChVTE9ORyAqKW1lbWFkZHIoYWRkcikpOworICAgIExPR01FTSgicmRsOiAleCAtPiAleFxuIiwgYWRkciwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3ZvaWQgQTFfd3JiKHUzMiBhZGRyLCB1OCB2YWwpCit7CisgICAgTE9HTUVNKCJ3cmI6ICV4IDwtICV4XG4iLCBhZGRyLCB2YWwpOworICAgIHdyaXRlX2J5dGUoKFVCWVRFICopbWVtYWRkcihhZGRyKSwgdmFsKTsKK30KKwordm9pZCBBMV93cncodTMyIGFkZHIsIHUxNiB2YWwpCit7CisgICAgTE9HTUVNKCJ3cnc6ICV4IDwtICV4XG4iLCBhZGRyLCB2YWwpOworICAgIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKW1lbWFkZHIoYWRkciksIHZhbCk7Cit9CisKK3ZvaWQgQTFfd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQoreworICAgIExPR01FTSgid3JsOiAleCA8LSAleFxuIiwgYWRkciwgdmFsKTsKKyAgICB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKiltZW1hZGRyKGFkZHIpLCB2YWwpOworfQorCitYODZFTVVfbWVtRnVuY3MgX0ExX21lbSA9IAoreworICAgIEExX3JkYiwKKyAgICBBMV9yZHcsCisgICAgQTFfcmRsLAorICAgIEExX3dyYiwKKyAgICBBMV93cncsCisgICAgQTFfd3JsLAorfTsKKworI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHQUREUiAgMHhmZWMwMGNmOAorI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHREFUQSAgMHhmZWUwMGNmYworI2RlZmluZSBJT0JBU0UgICAgICAgICAgICAgICAgMHhGRTAwMDAwMAorCisjZGVmaW5lIGluX2J5dGUoZnJvbSkgcmVhZF9ieXRlKCAoVUJZVEUgKilwb3J0X3RvX21lbShmcm9tKSkKKyNkZWZpbmUgaW5fd29yZChmcm9tKSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKGZyb20pKQorI2RlZmluZSBpbl9sb25nKGZyb20pIHJlYWRfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0oZnJvbSkpCisjZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKFVCWVRFICopcG9ydF90b19tZW0odG8pLCB2YWwpCisjZGVmaW5lIG91dF93b3JkKHRvLCB2YWwpIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQorI2RlZmluZSBvdXRfbG9uZyh0bywgdmFsKSB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbSh0byksIHZhbCkKKwordTMyIHBvcnRfdG9fbWVtKGludCBwb3J0KQoreworICAgIGlmIChwb3J0ID49IDB4Q0ZDICYmIHBvcnQgPD0gMHhDRkYpIHJldHVybiAweEZFRTAwMDAwK3BvcnQ7CisgICAgZWxzZSBpZiAocG9ydCA+PSAweENGOCAmJiBwb3J0IDw9IDB4Q0ZCKSByZXR1cm4gMHhGRUMwMDAwMCtwb3J0OworICAgIGVsc2UgcmV0dXJuIElPQkFTRSArIHBvcnQ7Cit9CisKK3U4IEExX2luYihpbnQgcG9ydCkKK3sKKyAgICB1OCBhOworICAgIC8vaWYgKHBvcnQgPT0gMHgzQkEpIHJldHVybiAwOworICAgIGEgPSBpbl9ieXRlKHBvcnQpOworICAgIExPR0lPKHBvcnQsICJpbmI6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3UxNiBBMV9pbncoaW50IHBvcnQpCit7CisgICAgdTE2IGEgPSBpbl93b3JkKHBvcnQpOworICAgIExPR0lPKHBvcnQsICJpbnc6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3UzMiBBMV9pbmwoaW50IHBvcnQpCit7CisgICAgdTMyIGEgPSBpbl9sb25nKHBvcnQpOworICAgIExPR0lPKHBvcnQsICJpbmw6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7CisgICAgcmV0dXJuIGE7Cit9CisKK3ZvaWQgQTFfb3V0YihpbnQgcG9ydCwgdTggdmFsKQoreworICAgIExPR0lPKHBvcnQsICJvdXRiOiAlWGggPC0gJWQgKCVYaClcbiIsIHBvcnQsIHZhbCwgdmFsKTsKKy8qICAgIGlmIChwb3J0ID09IDB4Q0Y4KSBwb3J0ID0gMHhDRkI7CisgICAgZWxzZSBpZiAocG9ydCA9PSAweENGOSkgcG9ydCA9IDB4Q0ZBOworICAgIGVsc2UgaWYgKHBvcnQgPT0gMHhDRkEpIHBvcnQgPSAweENGOTsKKyAgICBlbHNlIGlmIChwb3J0ID09IDB4Q0ZCKSBwb3J0ID0gMHhDRjg7Ki8KKyAgICBvdXRfYnl0ZShwb3J0LCB2YWwpOworfQorCit2b2lkIEExX291dHcoaW50IHBvcnQsIHUxNiB2YWwpCit7CisgICAgTE9HSU8ocG9ydCwgIm91dHc6ICVYaCA8LSAlZCAoJVhoKVxuIiwgcG9ydCwgdmFsLCB2YWwpOworICAgIG91dF93b3JkKHBvcnQsIHZhbCk7Cit9CisKK3ZvaWQgQTFfb3V0bChpbnQgcG9ydCwgdTMyIHZhbCkKK3sKKyAgICBMT0dJTyhwb3J0LCAib3V0bDogJVhoIDwtICVkICglWGgpXG4iLCBwb3J0LCB2YWwsIHZhbCk7CisgICAgb3V0X2xvbmcocG9ydCwgdmFsKTsKK30KKworWDg2RU1VX3Bpb0Z1bmNzIF9BMV9waW8gPSAKK3sKKyAgICBBMV9pbmIsCisgICAgQTFfaW53LAorICAgIEExX2lubCwKKyAgICBBMV9vdXRiLAorICAgIEExX291dHcsCisgICAgQTFfb3V0bCwKK307CisKK3N0YXRpYyBpbnQgcmVsb2NlZF9vcHMgPSAwOworCit2b2lkIHJlbG9jX29wcyh2b2lkICpyZWxvY19hZGRyKQoreworICAgIGV4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiWzI1Nl0pKHU4KTsKKyAgICBleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYjJbMjU2XSkodTgpOworICAgIGV4dGVybiB2b2lkIHRhYmxlc19yZWxvY2F0ZSh1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIGRlbHRhOworICAgIGlmIChyZWxvY2VkX29wcyA9PSAxKSByZXR1cm47CisgICAgcmVsb2NlZF9vcHMgPSAxOworCisgICAgZGVsdGEgPSBURVhUX0JBU0UgLSAodW5zaWduZWQgbG9uZylyZWxvY19hZGRyOworCisgICAgZm9yIChpPTA7IGk8MjU2OyBpKyspCisgICAgeworCXg4NmVtdV9vcHRhYltpXSAtPSBkZWx0YTsKKwl4ODZlbXVfb3B0YWIyW2ldIC09IGRlbHRhOworICAgIH0KKyAgICAKKyAgICBfQTFfbWVtLnJkYiA9IEExX3JkYjsKKyAgICBfQTFfbWVtLnJkdyA9IEExX3JkdzsKKyAgICBfQTFfbWVtLnJkbCA9IEExX3JkbDsKKyAgICBfQTFfbWVtLndyYiA9IEExX3dyYjsKKyAgICBfQTFfbWVtLndydyA9IEExX3dydzsKKyAgICBfQTFfbWVtLndybCA9IEExX3dybDsKKworICAgIF9BMV9waW8uaW5iID0gQTFfaW5iOworICAgIF9BMV9waW8uaW53ID0gQTFfaW53OworICAgIF9BMV9waW8uaW5sID0gQTFfaW5sOworICAgIF9BMV9waW8ub3V0YiA9IEExX291dGI7CisgICAgX0ExX3Bpby5vdXR3ID0gQTFfb3V0dzsKKyAgICBfQTFfcGlvLm91dGwgPSBBMV9vdXRsOworICAgIAorICAgIHRhYmxlc19yZWxvY2F0ZShkZWx0YSk7CisKK30KKworCisjZGVmaW5lIEFOWV9LRVkodGV4dCkJCQkJXAorICAgIHByaW50Zih0ZXh0KTsJCQkJXAorICAgIHdoaWxlICghdHN0YygpKTsKKworCit1bnNpZ25lZCBjaGFyIG1vcmVfc3RyYXBbXSA9IHsKKyAgICAgICAgMHhiNCwgMHgwLCAweGIwLCAweDIsIDB4Y2QsIDB4MTAsCit9OworI2RlZmluZSBNT1JFX1NUUkFQX0JZVEVTIDYgLy8gQWRkaXRpb25hbCBieXRlcyBvZiBzdHJhcCBjb2RlCisKKwordW5zaWduZWQgY2hhciAqZG9uZV9tc2c9IlZHQSBJbml0aWFsaXplZFwwIjsKKworaW50IGV4ZWN1dGVfYmlvcyhwY2lfZGV2X3QgZ3JfZGV2LCB2b2lkICpyZWxvY19hZGRyKQoreworICAgIGV4dGVybiB2b2lkIGJpb3NfaW5pdCh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCByZW1vdmVfaW5pdF9kYXRhKHZvaWQpOworICAgIGV4dGVybiBpbnQgdmlkZW9fcm93cyh2b2lkKTsKKyAgICBleHRlcm4gaW50IHZpZGVvX2NvbHModm9pZCk7CisgICAgZXh0ZXJuIGludCB2aWRlb19zaXplKGludCwgaW50KTsKKyAgICB1OCAqc3RyYXA7CisgICAgdW5zaWduZWQgY2hhciAqbG9nbzsKKyAgICB1OCBjZmc7CisgICAgaW50IGk7CisgICAgY2hhciBjOworI2lmZGVmIERFQlVHCisgICAgY2hhciAqczsKKyNlbmRpZgorI2lmZGVmIEVBU1RFUkVHRworICAgIGludCBlYXN0ZXJlZ2dfYWN0aXZlID0gMDsKKyNlbmRpZgorICAgIGNoYXIgKnBhbF9yZXNldDsKKyAgICB1OCAqZmI7CisgICAgdW5zaWduZWQgY2hhciAqbXNnOworICAgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9hdHRyOworCisgICAgcmVtb3ZlX2luaXRfZGF0YSgpOworICAgIFBSSU5URigiUmVtb3ZlZCBpbml0IGRhdGEgZnJvbSBjYWNoZSwgbm93IGluIFJBTVxuIik7CisKKyAgICByZWxvY19vcHMocmVsb2NfYWRkcik7CisgICAgUFJJTlRGKCJBdHRlbXB0aW5nIHRvIHJ1biBlbXVsYXRvciBvbiAlMDJ4OiUwMng6JTAyeFxuIiwKKwkgICBQQ0lfQlVTKGdyX2RldiksIFBDSV9ERVYoZ3JfZGV2KSwgUENJX0ZVTkMoZ3JfZGV2KSk7CisKKyAgICAvLyBFbmFibGUgY29tcGF0aWJpbGl0eSBob2xlIGZvciBlbXVsYXRvciBhY2Nlc3MgdG8gZnJhbWUgYnVmZmVyCisgICAgUFJJTlRGKCJFbmFibGluZyBjb21wYXRpYmlsaXR5IGhvbGVcbiIpOworICAgIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUoKTsKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeQorICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgdXNlIHRoaXMgbXVjaCBtZW1vcnkgcmVhbGx5LgorICAgIG1lbXNldCgmTSwgMCwgc2l6ZW9mKFg4NkVNVV9zeXNFbnYpKTsKKyAgICBNLm1lbV9iYXNlID0gbWFsbG9jKEVNVUxBVE9SX01FTV9TSVpFKTsKKyAgICBNLm1lbV9zaXplID0gRU1VTEFUT1JfTUVNX1NJWkU7CisKKyAgICBpZiAoIU0ubWVtX2Jhc2UpCisgICAgeworCVBSSU5URigiVW5hYmxlIHRvIGFsbG9jYXRlIG9uZSBtZWdhYnl0ZSBmb3IgZW11bGF0b3JcbiIpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChhdHRlbXB0X21hcF9yb20oZ3JfZGV2LCBNLm1lbV9iYXNlICsgRU1VTEFUT1JfQklPU19PRkZTRVQpID09IDApCisgICAgeworCVBSSU5URigiRXJyb3IgbWFwcGluZyByb20uIEVtdWxhdGlvbiB0ZXJtaW5hdGVkXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIHMgPSBnZXRlbnYoIng4Nl9hc2tfc3RhcnQiKTsKKyAgICBpZiAocykKKyAgICB7CisJcHJpbnRmKCJQcmVzcyAncScgdG8gc2tpcCBpbml0aWFsaXphdGlvbiwgJ2QnIGZvciBkcnkgaW5pdFxuJ2knIGZvciBpL28gc2Vzc2lvbiIpOworCXdoaWxlICghdHN0YygpKTsKKwljID0gZ2V0YygpOworCWlmIChjID09ICdxJykgcmV0dXJuIDA7CisJaWYgKGMgPT0gJ2QnKQorCXsKKwkgICAgZXh0ZXJuIHZvaWQgYmlvc19zZXRfbW9kZShpbnQgbW9kZSk7CisJICAgIGJpb3Nfc2V0X21vZGUoMHgwMyk7CisJICAgIHJldHVybiAwOworCX0KKwlpZiAoYyA9PSAnaScpIGRvX2lub3V0KCk7CisgICAgfQorCisKKyNlbmRpZgorCisjaWZkZWYgRUFTVEVSRUdHCisvKiAgICBpZiAodHN0YygpKQorICAgIHsKKwlpZiAoZ2V0YygpID09ICdjJykKKwl7CisJICAgIGVhc3RlcmVnZ19hY3RpdmUgPSAxOworCX0KKyAgICB9CisqLworICAgIGlmIChnZXRlbnYoImVhc3RlcmVnZyIpKQorICAgIHsKKwllYXN0ZXJlZ2dfYWN0aXZlID0gMTsKKyAgICB9CisgICAgCisgICAgaWYgKGVhc3RlcmVnZ19hY3RpdmUpCisgICAgeworCS8vIFlheSEKKwlzZXRlbnYoIng4Nl9tb2RlIiwgIjEiKTsKKwlzZXRlbnYoInZnYV9mZ19jb2xvciIsICIxMSIpOworCXNldGVudigidmdhX2JnX2NvbG9yIiwgIjEiKTsKKwllYXN0ZXJlZ2dfYWN0aXZlID0gMTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cmFwID0gKHU4KilNLm1lbV9iYXNlICsgRU1VTEFUT1JfU1RSQVBfT0ZGU0VUOworCisgICAgeworCWNoYXIgKm0gPSBnZXRlbnYoIng4Nl9tb2RlIik7CisJaWYgKG0pCisJeworCSAgICBtb3JlX3N0cmFwWzNdID0gYXRvaShtKTsKKwkgICAgaWYgKG1vcmVfc3RyYXBbM10gPT0gMSkgdmlkZW9fc2l6ZSg0MCwgMjUpOworCSAgICBlbHNlICAgICAgICAgICAgICAgICAgICB2aWRlb19zaXplKDgwLCAyNSk7CisJfQorICAgIH0KKworICAgIC8qIAorICAgICAqIFBva2UgdGhlIHN0cmFwIHJvdXRpbmUuIFRoaXMgbWlnaHQgbmVlZCBhIGJpdCBvZiBleHRlbmRpbmcKKyAgICAgKiBpZiB0aGVyZSBpcyBhIG1vZGUgc3dpdGNoIGludm9sdmVkLCBpLmUuIHdlIHdhbnQgdG8gaW50MTAgCisgICAgICogYWZ0ZXJ3YXJkcyB0byBzZXQgYSBkaWZmZXJlbnQgZ3JhcGhpY3MgbW9kZSwgb3IgYWx0ZXJuYXRpdmVseQorICAgICAqIHRoZXJlIG1pZ2h0IGJlIGEgZGlmZmVyZW50IHN0YXJ0IGFkZHJlc3MgcmVxdWlyZW1lbnQgaWYgdGhlCisgICAgICogUk9NIGRvZXNuJ3QgaGF2ZSBhbiB4ODYgaW1hZ2UgaW4gaXRzIGZpcnN0IGltYWdlLgorICAgICAqLworCisgICAgUFJJTlRGKCJQb2tpbmcgc3RyYXAuLi5cbiIpOworCisgICAgLy8gRkFSIENBTEwgYzAwMDowMDAzCisgICAgKnN0cmFwKysgPSAweDlBOyAqc3RyYXArKyA9IDB4MDM7ICpzdHJhcCsrID0gMHgwMDsKKyAgICAqc3RyYXArKyA9IDB4MDA7ICpzdHJhcCsrID0gMHhDMDsgCisKKyNpZiAxCisgICAgLy8gaW5zZXJ0IGFkZGl0aW9uYWwgc3RyYXAgY29kZQorICAgIGZvciAoaT0wOyBpIDwgTU9SRV9TVFJBUF9CWVRFUzsgaSsrKQorICAgIHsKKwkqc3RyYXArKyA9IG1vcmVfc3RyYXBbaV07CisgICAgfQorI2VuZGlmCisgICAgLy8gSEFMVAorICAgICpzdHJhcCsrID0gMHhGNDsgCisKKyAgICBQUklOVEYoIlNldHRpbmcgdXAgbG9nbyBkYXRhXG4iKTsKKyAgICBsb2dvID0gKHVuc2lnbmVkIGNoYXIgKilNLm1lbV9iYXNlICsgRU1VTEFUT1JfTE9HT19PRkZTRVQ7CisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisJKmxvZ28rKyA9IDB4RkY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgaW5pdCBwYXJhbWV0ZXJzLgorICAgICAqIFBlciBQQ0kgc3BlY3MsIEFIIG11c3QgY29udGFpbiB0aGUgYnVzIGFuZCBBTAorICAgICAqIG11c3QgY29udGFpbiB0aGUgZGV2Zm4sIGVuY29kZWQgYXMgKGRldjw8Myl8Zm4KKyAgICAgKi8KKworICAgIC8vIEV4ZWN1dGlvbiBzdGFydHMgaGVyZQorICAgIE0ueDg2LlJfQ1MgPSBTRUcoRU1VTEFUT1JfU1RSQVBfT0ZGU0VUKTsgCisgICAgTS54ODYuUl9JUCA9IE9GRihFTVVMQVRPUl9TVFJBUF9PRkZTRVQpOyAKKworICAgIC8vIFN0YWNrIGF0IHRvcCBvZiByYW0KKyAgICBNLng4Ni5SX1NTID0gU0VHKEVNVUxBVE9SX1NUQUNLX09GRlNFVCk7CisgICAgTS54ODYuUl9TUCA9IE9GRihFTVVMQVRPUl9TVEFDS19PRkZTRVQpOworCisgICAgLy8gSW5wdXQgcGFyYW1ldGVycworICAgIE0ueDg2LlJfQUggPSBQQ0lfQlVTKGdyX2Rldik7CisgICAgTS54ODYuUl9BTCA9IChQQ0lfREVWKGdyX2Rldik8PDMpIHwgUENJX0ZVTkMoZ3JfZGV2KTsKKworICAgIC8vIFNldCB0aGUgSS9PIGFuZCBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucworICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKCZfQTFfbWVtKTsKKyAgICBYODZFTVVfc2V0dXBQaW9GdW5jcygmX0ExX3Bpbyk7CisKKyAgICAvLyBFbmFibGUgdGltZXIgMgorICAgIGNmZyA9IGluX2J5dGUoMHg2MSk7IC8vIEdldCBNaXNjIGNvbnRyb2wKKyAgICBjZmcgfD0gMHgwMTsgICAgICAgICAvLyBFbmFibGUgdGltZXIgMgorICAgIG91dF9ieXRlKDB4NjEsIGNmZyk7IC8vIG91dHB1dCBhZ2FpbgorCisgICAgLy8gU2V0IHVwIHRoZSB0aW1lcnMKKyAgICBvdXRfYnl0ZSgweDQzLCAweDU0KTsKKyAgICBvdXRfYnl0ZSgweDQxLCAweDE4KTsKKworICAgIG91dF9ieXRlKDB4NDMsIDB4MzYpOworICAgIG91dF9ieXRlKDB4NDAsIDB4MDApOworICAgIG91dF9ieXRlKDB4NDAsIDB4MDApOworCisgICAgb3V0X2J5dGUoMHg0MywgMHhiNik7CisgICAgb3V0X2J5dGUoMHg0MiwgMHgzMSk7CisgICAgb3V0X2J5dGUoMHg0MiwgMHgxMyk7CisKKyAgICAvLyBJbml0IHRoZSAiQklPUyIuCisgICAgYmlvc19pbml0KCk7CisKKyAgICAvLyBWaWRlbyBDYXJkIFJlc2V0CisgICAgb3V0X2J5dGUoMHgzRDgsIDApOworICAgIG91dF9ieXRlKDB4M0I4LCAxKTsKKyAgICAodm9pZClpbl9ieXRlKDB4M0JBKTsKKyAgICAodm9pZClpbl9ieXRlKDB4M0RBKTsKKyAgICBvdXRfYnl0ZSgweDNDMCwgMCk7CisgICAgb3V0X2J5dGUoMHg2MSwgMHhGQyk7CisKKyNpZmRlZiBERUJVRworICAgIHMgPSBfZ2V0ZW52KCJ4ODZfc2luZ2xlc3RlcCIpOworICAgIGlmIChzICYmIHN0cmNtcChzLCAib24iKT09MCkKKyAgICB7CisJUFJJTlRGKCJFbmFibGluZyBzaW5nbGUgc3RlcHBpbmcgZm9yIGRlYnVnXG4iKTsKKwlYODZFTVVfdHJhY2Vfb24oKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFJlYWR5IHNldCBnby4uLgorICAgIFBSSU5URigiUnVubmluZyBlbXVsYXRvclxuIik7CisgICAgWDg2RU1VX2V4ZWMoKTsKKyAgICBQUklOVEYoIkRvbmUgcnVubmluZyBlbXVsYXRvclxuIik7CisKKy8qIEZJWE1FOiBSZW1vdmUgbWUgKi8KKyAgICBwYWxfcmVzZXQgPSBnZXRlbnYoIng4Nl9wYWxldHRlX3Jlc2V0Iik7CisgICAgaWYgKHBhbF9yZXNldCAmJiBzdHJjbXAocGFsX3Jlc2V0LCAib24iKSA9PSAwKQorICAgIHsKKwlQUklOVEYoIlBhbGV0dGUgcmVzZXRcbiIpOworCS8vKHZvaWQpaW5fYnl0ZSgweDNkYSk7CisJLy9vdXRfYnl0ZSgweDNjMCwgMCk7CisKKwlvdXRfYnl0ZSgweDNDOCwgMCk7CisJb3V0X2J5dGUoMHgzQzksIDApOworCW91dF9ieXRlKDB4M0M5LCAwKTsKKwlvdXRfYnl0ZSgweDNDOSwgMCk7CisJZm9yIChpPTA7IGk8MjU0OyBpKyspCisJeworCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOworCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOworCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOworCX0KKworCW91dF9ieXRlKDB4M2MwLCAweDIwKTsKKyAgICB9CisvKiBGSVhNRTogcmVtb3ZlIG1lICovCisjaWZkZWYgRUFTVEVSRUdHCisgICAgaWYgKGVhc3RlcmVnZ19hY3RpdmUpCisgICAgeworCWV4dGVybiB2b2lkIHZpZGVvX2Vhc3RlcmVnZyh2b2lkKTsKKwl2aWRlb19lYXN0ZXJlZ2coKTsKKyAgICB9CisjZW5kaWYKKy8qCisgICAgY3VycmVudF9hdHRyID0gdmlkZW9fZ2V0X2F0dHIoKTsKKyAgICBmYiA9ICh1OCAqKVZJREVPX0JBU0U7CisgICAgZm9yIChpPTA7IGk8dmlkZW9fcm93cygpKnZpZGVvX2NvbHMoKSoyOyBpKz0yKQorICAgIHsKKwkqKGZiK2kpID0gJyAnOworCSooZmIraSsxKSA9IGN1cnJlbnRfYXR0cjsKKyAgICB9CisKKyAgICBmYiA9ICh1OCAqKVZJREVPX0JBU0UgKyAodmlkZW9fcm93cygpKS0xKih2aWRlb19jb2xzKCkqMik7CisgICAgZm9yIChpPTA7IGk8dmlkZW9fY29scygpOyBpKyspCisgICAgeworCSooZmIgKyAyKmkpICAgICA9IDMyOworCSooZmIgKyAyKmkgKyAxKSA9IDB4MTc7CisgICAgfQorCisgICAgbXNnID0gZG9uZV9tc2c7CisgICAgd2hpbGUgKCptc2cpCisgICAgeworCSpmYiA9ICptc2c7CisJZmIgICs9IDI7CisJbXNnICsrOworICAgIH0KKyovCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZ2V0ZW52KCJ4ODZfZG9faW5vdXQiKSkgZG9faW5vdXQoKTsKKyNlbmRpZgorCisgICAgZGNhY2hlX2Rpc2FibGUoKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gQ2xlYW4gdXAgdGhlIHg4NiBtZXNzCit2b2lkIHNodXRkb3duX2Jpb3Modm9pZCkKK3sKKy8vICAgIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKCk7CisgICAgLy8gRnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKKyAgICBmcmVlKE0ubWVtX2Jhc2UpOworCit9CisKK2ludCB0b19pbnQoY2hhciAqYnVmZmVyKQoreworICAgIGludCBiYXNlID0gMDsKKyAgICBpbnQgcmVzICA9IDA7CisKKyAgICBpZiAoKmJ1ZmZlciA9PSAnJCcpIAorICAgIHsKKwliYXNlID0gMTY7CisJYnVmZmVyKys7CisgICAgfQorICAgIGVsc2UgYmFzZSA9IDEwOworCisgICAgZm9yICg7OykKKyAgICB7CisJc3dpdGNoKCpidWZmZXIpCisJeworCWNhc2UgJzAnIC4uLiAnOSc6CisJICAgIHJlcyAqPSBiYXNlOworCSAgICByZXMgKz0gKmJ1ZmZlciAtICcwJzsKKwkgICAgYnJlYWs7CisJY2FzZSAnQSc6CisJY2FzZSAnYSc6CisJICAgIHJlcyAqPSBiYXNlOworCSAgICByZXMgKz0gMTA7CisJICAgIGJyZWFrOworCWNhc2UgJ0InOgorCWNhc2UgJ2InOgorCSAgICByZXMgKj0gYmFzZTsKKwkgICAgcmVzICs9IDExOworCSAgICBicmVhazsJICAgIAorCWNhc2UgJ0MnOgorCWNhc2UgJ2MnOgorCSAgICByZXMgKj0gYmFzZTsKKwkgICAgcmVzICs9IDEyOworCSAgICBicmVhazsJICAgIAorCWNhc2UgJ0QnOgorCWNhc2UgJ2QnOgorCSAgICByZXMgKj0gYmFzZTsKKwkgICAgcmVzICs9IDEzOworCSAgICBicmVhazsJICAgIAorCWNhc2UgJ0UnOgorCWNhc2UgJ2UnOgorCSAgICByZXMgKj0gYmFzZTsKKwkgICAgcmVzICs9IDE0OworCSAgICBicmVhazsJICAgIAorCWNhc2UgJ0YnOgorCWNhc2UgJ2YnOgorCSAgICByZXMgKj0gYmFzZTsKKwkgICAgcmVzICs9IDE1OworCSAgICBicmVhazsJCisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIHJlczsKKwl9CisJYnVmZmVyKys7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgb25lX2FyZyhjaGFyICpidWZmZXIsIGludCAqYSkKK3sKKyAgICB3aGlsZSAoKmJ1ZmZlciAmJiAqYnVmZmVyICE9ICdcbicpCisgICAgeworCWlmICgqYnVmZmVyID09ICcgJykgYnVmZmVyKys7CisJZWxzZSBicmVhazsKKyAgICB9CisKKyAgICAqYSA9IHRvX2ludChidWZmZXIpOworfQorCit2b2lkIHR3b19hcmdzKGNoYXIgKmJ1ZmZlciwgaW50ICphLCBpbnQgKmIpCit7CisgICAgd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKQorICAgIHsKKwlpZiAoKmJ1ZmZlciA9PSAnICcpIGJ1ZmZlcisrOworCWVsc2UgYnJlYWs7CisgICAgfQorCisgICAgKmEgPSB0b19pbnQoYnVmZmVyKTsKKworICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKKyAgICB7CisJaWYgKCpidWZmZXIgIT0gJyAnKSBidWZmZXIrKzsKKwllbHNlIGJyZWFrOworICAgIH0KKworICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKKyAgICB7CisJaWYgKCpidWZmZXIgPT0gJyAnKSBidWZmZXIrKzsKKwllbHNlIGJyZWFrOworICAgIH0KKworICAgICpiID0gdG9faW50KGJ1ZmZlcik7Cit9CisKK3ZvaWQgZG9faW5vdXQodm9pZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIGNoYXIgKmFyZzEsICphcmcyOworICAgIGludCBhLGI7CisKKyAgICBwcmludGYoIkluL091dCBTZXNzaW9uXG5Vc2UgJ2lbYndsXScgZm9yIGluLCAnb1tid2xdJyBmb3Igb3V0IGFuZCAncScgdG8gcXVpdFxuIik7CisKKyAgICBkbworICAgIHsKKwljb25zX2dldHMoYnVmZmVyKTsKKwlwcmludGYoIlxuIik7CisKKwkqYXJnMSA9IGJ1ZmZlcjsKKwl3aGlsZSAoKmFyZzEgIT0gJyAnICkgYXJnMSsrOworCXdoaWxlICgqYXJnMSA9PSAnICcpIGFyZzErKzsKKworCWlmIChidWZmZXJbMF0gPT0gJ2knKQorCXsKKwkgICAgb25lX2FyZyhidWZmZXIrMiwgJmEpOworCSAgICBzd2l0Y2ggKGJ1ZmZlclsxXSkKKwkgICAgeworCSAgICBjYXNlICdiJzoKKwkJcHJpbnRmKCJpbl9ieXRlKCV4aCkgPSAleGhcbiIsIGEsIEExX2luYihhKSk7CisJCWJyZWFrOworCSAgICBjYXNlICd3JzoKKwkJcHJpbnRmKCJpbl93b3JkKCV4aCkgPSAleGhcbiIsIGEsIEExX2ludyhhKSk7CisJCWJyZWFrOworCSAgICBjYXNlICdsJzoKKwkJcHJpbnRmKCJpbl9kd29yZCgleGgpID0gJXhoXG4iLCBhLCBBMV9pbmwoYSkpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRmKCJJbnZhbGlkIGxlbmd0aCAnJWMnXG4iLCBidWZmZXJbMV0pOworCQlicmVhazsKKwkgICAgfQorCX0KKwllbHNlIGlmIChidWZmZXJbMF0gPT0gJ28nKQorCXsKKwkgICAgdHdvX2FyZ3MoYnVmZmVyKzIsICZhLCAmYik7CisJICAgIHN3aXRjaCAoYnVmZmVyWzFdKQorCSAgICB7CisJICAgIGNhc2UgJ2InOgorCQlwcmludGYoIm91dF9ieXRlKCVkLCAlZClcbiIsIGEsIGIpOworCQlBMV9vdXRiKGEsYik7CisJCWJyZWFrOworCSAgICBjYXNlICd3JzoKKwkJcHJpbnRmKCJvdXRfd29yZCglZCwgJWQpXG4iLCBhLCBiKTsKKwkJQTFfb3V0dyhhLCBiKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2wnOgorCQlwcmludGYoIm91dF9sb25nKCVkLCAlZClcbiIsIGEsIGIpOworCQlBMV9vdXRsKGEsIGIpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRmKCJJbnZhbGlkIGxlbmd0aCAnJWMnXG4iLCBidWZmZXJbMV0pOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSBpZiAoYnVmZmVyWzBdID09ICdxJykgcmV0dXJuOworICAgIH0gd2hpbGUgKDEpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL21lbnUvY21kX21lbnUuYyBiL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YWI0OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9tZW51Lmg+CisKK2ludCBkb19tZW51KCBjbWRfdGJsX3QgKmNtZHRwLCBiZF90ICpiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworLy8gICAgcHJpbnRmKCI8Tk9UIFlFVCBJTVBMRU1FTlRFRD5cbiIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL21lbnUvbWVudS5jIGIvYm9hcmQvTUFJL21lbnUvbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzAxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NQUkvbWVudS9tZW51LmMKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgIm1lbnUuaCIKKworI2RlZmluZSBTSU5HTEVfQk9YIDAKKyNkZWZpbmUgRE9VQkxFX0JPWCAxCisKK3ZvaWQgdmlkZW9fZHJhd19ib3goaW50IHN0eWxlLCBpbnQgYXR0ciwgY2hhciAqdGl0bGUsIGludCBzZXBhcmF0ZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwordm9pZCB2aWRlb19kcmF3X3RleHQoaW50IHgsIGludCB5LCBpbnQgYXR0ciwgY2hhciAqdGV4dCk7Cit2b2lkIHZpZGVvX3NhdmVfcmVjdChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgdm9pZCAqc2F2ZV9hcmVhLCBpbnQgY2xlYXJjaGFyLCBpbnQgY2xlYXJhdHRyKTsKK3ZvaWQgdmlkZW9fcmVzdG9yZV9yZWN0KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCB2b2lkICpzYXZlX2FyZWEpOworaW50ICB2aWRlb19yb3dzKHZvaWQpOworaW50ICB2aWRlb19jb2xzKHZvaWQpOworCisjZGVmaW5lIE1BWF9NRU5VX09QVElPTlMgMjAwCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHVzZWQ7ICAgICAgICAgICAgICAgICAgLyogZmxhZyBpZiB0aGlzIGVudHJ5IGlzIHVzZWQgKi8KKyAgICBpbnQgZW50cnlfeDsgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgY29sdW1uIG9mIHRoZSBtZW51IGVudHJ5ICovCisgICAgaW50IGVudHJ5X3k7ICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGxpbmUgb2YgdGhlIGVudHJ5ICovCisgICAgaW50IG9wdGlvbl94OyAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGNvbHVtIG9mIHRoZSBvcHRpb24gKGVudHJ5IGlzIHNhbWUpICovCit9IG9wdGlvbl9kYXRhX3Q7CisKK29wdGlvbl9kYXRhX3Qgb2RhdGFbTUFYX01FTlVfT1BUSU9OU107CisKK2ludCBub3JtYWxfYXR0ciA9IDB4MEY7CitpbnQgc2VsZWN0X2F0dHIgPSAweDJGOworaW50IGRpc2FibGVkX2F0dHIgPSAweDA3OworCittZW51X3QgKnJvb3RfbWVudTsKKworaW50IG1lbnVfaW5pdCAobWVudV90ICpyb290KQoreworICAgIGNoYXIgKnM7CisgICAgaW50IGk7CisKKyAgICBzID0gZ2V0ZW52KCJtZW51X25vcm1hbCIpOworICAgIGlmIChzKSBub3JtYWxfYXR0ciA9IGF0b2kocyk7CisKKyAgICBzID0gZ2V0ZW52KCJtZW51X3NlbGVjdCIpOworICAgIGlmIChzKSBzZWxlY3RfYXR0ciA9IGF0b2kocyk7CisKKyAgICBzID0gZ2V0ZW52KCJtZW51X2Rpc2FibGVkIik7CisgICAgaWYgKHMpIGRpc2FibGVkX2F0dHIgPSBhdG9pKHMpOworICAgIAorICAgIGZvciAoaT0wOyBpPE1BWF9NRU5VX09QVElPTlM7IGkrKykgb2RhdGFbaV0udXNlZCA9IDA7CisgICAgCisgICAgcm9vdF9tZW51ID0gcm9vdDsKK30KKworb3B0aW9uX2RhdGFfdCAqbWVudV9hbGxvY19vZGF0YSh2b2lkKQoreworICAgIGludCBpOworICAgIGZvciAoaW50IGk9MDsgaTxNQVhfTUVOVV9PUFRJT05TOyBpKyspCisgICAgeworCWlmIChvZGF0YVtpXS51c2VkID09IDApIHJldHVybiAmb2RhdGFbaV07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIG1lbnVfZnJlZV9vZGF0YShvcHRpb25fZGF0YV90ICpvZGF0YSkKK3sKKyAgICBvZGF0YS0+dXNlZCA9IDA7Cit9CisKK3ZvaWQgbWVudV9sYXlvdXQgKG1lbnVfdCAqbWVudSkKK3sKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9tZW51L21lbnUuaCBiL2JvYXJkL01BSS9tZW51L21lbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTg4NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTUFJL21lbnUvbWVudS5oCkBAIC0wLDAgKzEsMTc0IEBACisjaWZuZGVmIE1FTlVfSAorI2RlZmluZSBNRU5VX0gKKworLyogQSBzaW5nbGUgbWVudSAqLwordHlwZWRlZiB2b2lkICgqbWVudV9maW5pc2hfY2FsbGJhY2spKHN0cnVjdCBtZW51X3MgKm1lbnUpOworCit0eXBlZGVmIHN0cnVjdCBtZW51X3MKK3sKKyAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgIC8qIE1lbnUgbmFtZSAqLworICAgIGludCAgbnVtX29wdGlvbnM7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIG9wdGlvbnMgaW4gdGhpcyBtZW51ICovCisgICAgaW50ICBmbGFnczsgICAgICAgICAgICAgICAgICAgICAvKiBWYXJpb3VzIGZsYWdzIC0gc2VlIGJlbG93ICovCisgICAgaW50ICBvcHRpb25fYWxpZ247ICAgICAgICAgICAgICAvKiBBbGlnbnMgb3B0aW9ucyB0byBhIGZpZWxkIHdpZHRoIG9mIHRoaXMgbXVjaCBjaGFyYWN0ZXJzIGlmICE9IDAgKi8KKworICAgIHN0cnVjdCBtZW51X29wdGlvbl9zICoqb3B0aW9uczsgLyogUG9pbnRlciB0byB0aGlzIG1lbnUncyBvcHRpb25zICovCisgICAgbWVudV9maW5pc2hfY2FsbGJhY2sgY2FsbGJhY2s7ICAvKiBDYWxsZWQgd2hlbiB0aGUgbWVudSBjbG9zZXMgKi8KK30gbWVudV90OworCisvKgorICogdHlwZTogVHlwZSBvZiB0aGUgb3B0aW9uIChzZWUgYmVsb3cpCisgKiBuYW1lOiBOYW1lIHRvIGRpc3BsYXkgZm9yIHRoaXMgb3B0aW9uCisgKiBoZWxwOiBPcHRpb25hbCBoZWxwIHN0cmluZworICogaWQgIDogb3B0aW9uYWwgaWQgbnVtYmVyCisgKiBzeXMgOiBwb2ludGVyIGZvciBzeXN0ZW0tc3BlY2lmaWMgZGF0YSwgaW5pdCB0byBOVUxMIGFuZCBkb24ndCB0b3VjaAorICovCisKKyNkZWZpbmUgT1BUSU9OX1BSRUFNQkxFCQkJCVwKKyAgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAJCVwKKyAgICBjaGFyICpuYW1lOyAgIAkJCQlcCisgICAgY2hhciAqaGVscDsgICAJCQkJXAorICAgIGludCBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgKnN5czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisKKy8qCisgKiBNZW51IG9wdGlvbiB0eXBlcy4KKyAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgbGF5b3V0cyBmb3IgbWVudSBvcHRpb25zIGRlcGVuZGluZworICogb24gdGhlaXIgdHlwZXMuIEN1cnJlbnRseSB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyBwb3NzaWJpbGl0aWVzOgorICoKKyAqIFN1Ym1lbnU6CisgKiAgIFRoaXMgZW50cnkgbGlua3MgdG8gYSBuZXcgbWVudS4KKyAqCisgKiBCb29sZWFuOgorICogICBBIHNpbXBsZSBvbi9vZmYgdG9nZ2xlIGVudHJ5LiBCb29sZWFucyBjYW4gYmUgZWl0aGVyIHllcy9ubywgMC8xIG9yIG9uL29mZi4KKyAqICAgT3B0aW9uYWxseSwgdGhpcyBlbnRyeSBjYW4gZW5hYmxlL2Rpc2FibGUgYSBzZXQgb2Ygb3RoZXIgb3B0aW9ucy4gQW4gZXhhbXBsZSB3b3VsZAorICogICBiZSB0byBlbmFibGUvZGlzYWJsZSBvbi1ib2FyZCBVU0IsIGFuZCBpZiBlbmFibGVkIGdpdmUgYWNjZXNzIHRvIGZ1cnRoZXIgb3B0aW9ucyBsaWtlCisgKiAgIGlycSBzZXR0aW5ncywgYmFzZSBhZGRyZXNzIGV0Yy4KKyAqCisgKiBUZXh0OgorICogICBBIHNpbmdsZSBsaW5lL2xpbWl0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGV4dCBlbnRyeSBib3guIFRleHQgY2FuIGJlIHJlc3RyaWN0ZWQKKyAqICAgdG8gYSBjZXJ0YWluIGNoYXJzZXQgKGRpZ2l0cy9oZXggZGlnaXRzL2FsbC9jdXN0b20pLiBSZXN1bHQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYW4KKyAqICAgaW50IGlmIG51bWVyaWMuIAorICoKKyAqIFNlbGVjdGlvbjoKKyAqICAgT25lLW9mLW1hbnkgdHlwZSBvZiBzZWxlY3Rpb24gZW50cnkuIFVzZXIgbWF5IGNob29zZSBvbiBvZiBhIHNldCBvZiBzdHJpbmdzLCB3aGljaAorICogICBtYXBzIHRvIGEgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4KKyAqCisgKiBSb3V0aW5lOgorICogICBTZWxlY3RpbmcgdGhpcyBjYWxscyBhbiBlbnRyeS1zcGVjaWZpYyByb3V0aW5lLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBzYXZpbmcgY29udGVudHMgZXRjLgorICoKKyAqIEN1c3RvbToKKyAqICAgRGlzcGxheSBhbmQgYmVoYXZpb3VyIG9mIHRoaXMgZW50cnkgaXMgZGVmaW5lZCBieSBhIHNldCBvZiBjYWxsYmFja3MuCisgKi8KKworI2RlZmluZSBNRU5VX1NVQk1FTlVfVFlQRSAwCit0eXBlZGVmIHN0cnVjdCBtZW51X3N1Ym1lbnVfcworeworICAgIE9QVElPTl9QUkVBTUJMRQorCisgICAgbWVudV90ICogICBzdWJtZW51OyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHN1Ym1lbnUgKi8KK30gbWVudV9zdWJtZW51X3Q7CisKKyNkZWZpbmUgTUVOVV9CT09MRUFOX1RZUEUgMQordHlwZWRlZiBzdHJ1Y3QgbWVudV9ib29sZWFuX3MKK3sKKyAgICBPUFRJT05fUFJFQU1CTEUKKworICAgIGNoYXIgKnZhcmlhYmxlOyAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBnZXRlbnYoKS9zZXRlbnYoKSAqLworICAgIGludCBzdWJ0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBTdWJ0eXBlIChvbi9vZmYsIDAvMSwgeWVzL25vLCBlbmFibGUvZGlzYWJsZSksIHNlZSBiZWxvdyAqLworICAgIGludCBtdXRleDsgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgbWFzayBvZiBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlLiBCaXQgMCBpcyB0aGUgb3B0aW9uCisJCQkJICAgICAgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgb25lLCBiaXQgMSBpcyB0aGUgbmV4dCBvbmUgZXRjLgorCQkJCSAgICAgIGJpdCA3ID0gMCBtZWFucyB0byBkaXNhYmxlIHdoZW4gdGhpcyBvcHRpb24gaXMgb2ZmLAorCQkJCSAgICAgIGJpdCA3ID0gMSBtZWFucyB0byBkaXNhYmxlIHdoZW4gdGhpcyBvcHRpb24gaXMgb24uCisJCQkJICAgICAgQW4gb3B0aW9uIGlzIGRpc2FibGVkIHdoZW4gdGhlIHR5cGUgZmllbGQncyB1cHBlciBiaXQgaXMgc2V0ICovCit9IG1lbnVfYm9vbGVhbl90OworCisvKiBCT09MRUFOIE1lbnUgZmxhZ3MgKi8KKyNkZWZpbmUgTUVOVV9CT09MRUFOX09OT0ZGICAgICAgICAgMHgwMQorI2RlZmluZSBNRU5VX0JPT0xFQU5fMDEgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1FTlVfQk9PTEVBTl9ZRVNOTyAgICAgICAgIDB4MDMKKyNkZWZpbmUgTUVOVV9CT09MRUFOX0VORElTICAgICAgICAgMHgwNAorI2RlZmluZSBNRU5VX0JPT0xFQU5fVFlQRV9NQVNLICAgICAweDA3CisKKworI2RlZmluZSBNRU5VX1RFWFRfVFlQRSAyCit0eXBlZGVmIHN0cnVjdCBtZW51X3RleHRfcworeworICAgIE9QVElPTl9QUkVBTUJMRQorCisgICAgY2hhciAqdmFyaWFibGU7ICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGdldGVudigpL3NldGVudigpICovCisgICAgaW50IG1heGNoYXJzOyAgICAgICAgICAgICAgICAgIC8qIE1heCBudW1iZXIgb2YgY2hhcmFjdGVycyAqLworICAgIGNoYXIgKmNoYXJzZXQ7ICAgICAgICAgICAgICAgICAvKiBPcHRpb25hbCBjaGFyc2V0IHRvIHVzZSAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAvKiBGbGFncyAtIHNlZSBiZWxvdyAqLworfSBtZW51X3RleHRfdDsKKworLyogVEVYVCBlbnRyeSBtZW51IGZsYWdzICovCisjZGVmaW5lIE1FTlVfVEVYVF9OVU1FUklDICAgICAgICAgMHgwMQorI2RlZmluZSBNRU5VX1RFWFRfSEVYQURFQ0lNQUwgICAgIDB4MDIKKyNkZWZpbmUgTUVOVV9URVhUX0ZSRUUgICAgICAgICAgICAweDAzCisjZGVmaW5lIE1FTlVfVEVYVF9UWVBFX01BU0sgICAgICAgMHgwNworCisKKyNkZWZpbmUgTUVOVV9TRUxFQ1RJT05fVFlQRSAzCit0eXBlZGVmIHN0cnVjdCBtZW51X3NlbGVjdF9vcHRpb25fcworeworICAgIGNoYXIgKm1hcF9mcm9tOyAgICAgICAgICAgICAgIC8qIE1hcCB0aGlzIHZhcmlhYmxlIGNvbnRlbnRzIC4uLiAqLworICAgIGNoYXIgKm1hcF90bzsgICAgICAgICAgICAgICAgIC8qIC4uLiB0byB0aGlzIG1lbnUgdGV4dCBhbmQgdmljZSB2ZXJzYSAqLworfSBtZW51X3NlbGVjdF9vcHRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWVudV9zZWxlY3RfcworeworICAgIE9QVElPTl9QUkVBTUJMRQorCisgICAgaW50IG51bV9vcHRpb25zOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbWFwcGluZ3MgKi8KKyAgICBtZW51X3NlbGVjdF9vcHRpb25fdCAqKm9wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcHRpb24gbGlzdCBhcnJheSAqLworfSBtZW51X3NlbGVjdF90OworCisKKyNkZWZpbmUgTUVOVV9ST1VUSU5FX1RZUEUgNAordHlwZWRlZiB2b2lkICgqbWVudV9yb3V0aW5lX2NhbGxiYWNrKShzdHJ1Y3QgbWVudV9yb3V0aW5lX3MgKik7CisKK3R5cGVkZWYgc3RydWN0IG1lbnVfcm91dGluZV9zCit7CisgICAgT1BUSU9OX1BSRUFNQkxFCisgICAgbWVudV9yb3V0aW5lX2NhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcm91dGluZSB0byBiZSBjYWxsZWQgKi8gCisgICAgdm9pZCAqdXNlcl9kYXRhOyAgICAgICAgICAgICAvKiBVc2VyIGRhdGEsIGRvbid0IGNhcmUgZm9yIHN5c3RlbSAqLworfSBtZW51X3JvdXRpbmVfdDsKKyAgICAKKworI2RlZmluZSBNRU5VX0NVU1RPTV9UWVBFIDUKK3R5cGVkZWYgdm9pZCAoKm1lbnVfY3VzdG9tX2RyYXcpKHN0cnVjdCBtZW51X2N1c3RvbV9zICopOwordHlwZWRlZiB2b2lkICgqbWVudV9jdXN0b21fa2V5KShzdHJ1Y3QgbWVudV9jdXN0b21fcyAqLCBpbnQpOworCit0eXBlZGVmIHN0cnVjdCBtZW51X2N1c3RvbV9zCit7CisgICAgT1BUSU9OX1BSRUFNQkxFCisgICAgbWVudV9jdXN0b21fZHJhdyBkcmF3ZnVuYzsKKyAgICBtZW51X2N1c3RvbV9rZXkgIGtleWZ1bmM7CisgICAgdm9pZCAqdXNlcl9kYXRhOworfSBtZW51X2N1c3RvbV90OworCisvKgorICogVGhlIG1lbnUgb3B0aW9uIHN1cGVyc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lbnVfb3B0aW9uX3MKK3sKKyAgICB1bmlvbgorICAgIHsKKwltZW51X3N1Ym1lbnVfdCBtX3N1Yl9tZW51OworCW1lbnVfYm9vbGVhbl90IG1fYm9vbGVhbjsKKwltZW51X3RleHRfdCAgICBtX3RleHQ7CisJbWVudV9zZWxlY3RfdCAgbV9zZWxlY3Q7CisJbWVudV9yb3V0aW5lX3QgbV9yb3V0aW5lOworICAgIH07Cit9IG1lbnVfb3B0aW9uX3Q7CisKKy8qIEluaXQgdGhlIG1lbnUgc3lzdGVtLiBSZXR1cm5zIDwwIG9uIGVycm9yICovCitpbnQgbWVudV9pbml0KG1lbnVfdCAqcm9vdCk7CisKKy8qIEV4ZWN1dGUgYSBzaW5nbGUgbWVudS4gUmV0dXJucyA8MCBvbiBlcnJvciAqLworaW50IG1lbnVfZG8obWVudV90ICptZW51KTsKKworI2VuZGlmCg==