LyoKICogTVNXU09DSyBzcGVjaWZpYyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHLpIEpvaGFuc2VuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJtc3dzb2NrLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN3c29jayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjY2VwdEV4IChNU1dTT0NLLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiwgZ2V0IHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAqIGFkZHJlc3MsIGFuZCByZWNlaXZlIHRoZSBpbml0aWFsIGJsb2NrIG9mIGRhdGEgc2VudCBieSB0aGUgY2xpZW50LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgQWNjZXB0RXgoCglTT0NLRVQgc0xpc3RlblNvY2tldCwgLyogW2luXSBEZXNjcmlwdG9yIGlkZW50aWZ5aW5nIGEgc29ja2V0IHRoYXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggdGhlIGxpc3RlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLwoJU09DS0VUIHNBY2NlcHRTb2NrZXQsIC8qIFtpbl0gRGVzY3JpcHRvciBpZGVudGlmeWluZyBhIHNvY2tldCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG8gYWNjZXB0IGFuIGluY29taW5nIGNvbm5lY3Rpb24gKi8KCVBWT0lEIGxwT3V0cHV0QnVmZmVyLCAvKiBbaW5dICBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiBscE91dHB1dEJ1ZmZlcgoJCQkJICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFjdHVhbCByZWNlaXZlIGRhdGEKCQkJCSAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwoJRFdPUkQgZHdMb2NhbEFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCSAgICAgICBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uICovCglEV09SRCBkd1JlbW90ZUFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCQlyZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJTFBEV09SRCBscGR3Qnl0ZXNSZWNlaXZlZCwgLyogW291dF0gUG9pbnRlciB0byBhIERXT1JEIHRoYXQgcmVjZWl2ZXMKCQkJCSAgICAgIHRoZSBjb3VudCBvZiBieXRlcyByZWNlaXZlZCAqLwoJTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkgLyogW2luXSBTcGVjaWZ5IGluIG9yZGVyIHRvIGFjaGlldmUgYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBlZCAoYXN5bmNocm9ub3VzKSBJL08gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwogIAogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFjY2VwdEV4U29ja2FkZHJzIChNU1dTT0NLLkApCiAqLwpWT0lEIFdJTkFQSSBHZXRBY2NlcHRFeFNvY2thZGRycygKCVBWT0lEIGxwT3V0cHV0QnVmZmVyLCAvKiBbaW5dIFBvaW50ZXIgdG8gYSBidWZmZXIgKi8KCURXT1JEIGR3UmVjZWl2ZURhdGFMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgdXNlZAoJCQkJICAgICAgZm9yIHJlY2VpdmluZyB0aGUgZmlyc3QgZGF0YSAqLwoJRFdPUkQgZHdMb2NhbEFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCSAgICAgICBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uICovCglEV09SRCBkd1JlbW90ZUFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCQlyZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJc3RydWN0IHNvY2thZGRyICoqTG9jYWxTb2NrYWRkciwgLyogW291dF0gUG9pbnRlciB0byB0aGUgc29ja2FkZHIKCQkJCQkgICAgc3RydWN0dXJlIHRoYXQgcmVjZWl2ZXMgdGhlIGxvY2FsCgkJCQkJICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gICovCglMUElOVCBMb2NhbFNvY2thZGRyTGVuZ3RoLCAvKiBbb3V0XSBTaXplIGluIGJ5dGVzIG9mIHRoZSBsb2NhbAoJCQkJICAgICAgYWRkcmVzcyAqLwoJc3RydWN0IHNvY2thZGRyICoqUmVtb3RlU29ja2FkZHIsIC8qIFtvdXRdIFBvaW50ZXIgdG8gdGhlIHNvY2thZGRyCgkJCQkJICAgICBzdHJ1Y3R1cmUgdGhhdCByZWNlaXZlcyB0aGUgcmVtb3RlCgkJCQkJICAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uICovCglMUElOVCBSZW1vdGVTb2NrYWRkckxlbmd0aCkgLyogW291dF0gU2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KewogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZFxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVHJhbnNtaXRGaWxlIChNU1dTT0NLLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmFuc21pdCBhIGZpbGUgb3ZlciBzb2NrZXQuCiAqCiAqIFRPRE8KICogIFRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIGEgc3R1Yi4KICovCgpCT09MIFdJTkFQSSBUcmFuc21pdEZpbGUoCiAgICAgICAgU09DS0VUIGhTb2NrZXQsIC8qIFtpbl0gSGFuZGxlIHRvIGEgY29ubmVjdGVkIHNvY2tldCAqLwoJSEFORExFIGhGaWxlLCAgIC8qIFtpbl0gSGFuZGxlIHRvIHRoZSBvcGVuIGZpbGUgdGhhdCBzaG91bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXRlZCAqLwoJRFdPUkQgbk51bWJlck9mQnl0ZXNUb1dyaXRlLCAvKiBbaW5dIE51bWJlciBvZiBmaWxlIGJ5dGVzIHRvIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXQgKi8KCURXT1JEIG5OdW1iZXJPZkJ5dGVzUGVyU2VuZCwgLyogW2luXSBTaXplIGluIGJ5dGVzIG9mIGVhY2ggYmxvY2sgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNlbnQgaW4gZWFjaCBzZW5kIG9wZXJhdGlvbiAqLwoJTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCwgLyogW2luXSBTcGVjaWZ5IGluIG9yZGVyIHRvIGFjaGlldmUgYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBlZCAoYXN5bmNocm9ub3VzKSBJL08gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uICovCglMUFRSQU5TTUlUX0ZJTEVfQlVGRkVSUyBscFRyYW5zbWl0QnVmZmVycywgCgkJLyogW2luXSBDb250YWlucyBwb2ludGVycyB0byBkYXRhIHRvIHNlbmQgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgZGF0YSBpcyBzZW50ICovCglEV09SRCBkd0ZsYWdzKSAvKiBbaW5dIEZsYWdzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwoKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlXU0FSZWN2RXggKE1TV1NPQ0suQCkKICovCklOVCBXSU5BUEkgV1NBUmVjdkV4KAoJU09DS0VUIHMsICAgLyogW2luXSBEZXNjcmlwdG9yIGlkZW50aWZ5aW5nIGEgY29ubmVjdGVkIHNvY2tldCAqLwoJY2hhciAqYnVmLCAgLyogW291dF0gQnVmZmVyIGZvciB0aGUgaW5jb21pbmcgZGF0YSAqLwoJSU5UIGxlbiwgICAgLyogW2luXSBMZW5ndGggb2YgYnVmLCBpbiBieXRlcyAqLwogICAgICAgIElOVCAqZmxhZ3MpIC8qIFtpbi9vdXRdIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMKCSAgICAgICAgICAgICAgIGZ1bGx5IG9yIHBhcnRpYWxseSByZWNlaXZlZCBmb3IgZGF0YWdyYW0gc29ja2V0cyAqLwp7CiAgICBGSVhNRSgibm90IGltcGxlbWVudGVkXG4iKTsKICAgIAogICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKfQo=