LyoKICogTVNXU09DSyBzcGVjaWZpYyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHLpIEpvaGFuc2VuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJtc3dzb2NrLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN3c29jayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjY2VwdEV4IChNU1dTT0NLLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiwgZ2V0IHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAqIGFkZHJlc3MsIGFuZCByZWNlaXZlIHRoZSBpbml0aWFsIGJsb2NrIG9mIGRhdGEgc2VudCBieSB0aGUgY2xpZW50LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgQWNjZXB0RXgoCglTT0NLRVQgc0xpc3RlblNvY2tldCwgLyogW2luXSBEZXNjcmlwdG9yIGlkZW50aWZ5aW5nIGEgc29ja2V0IHRoYXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggdGhlIGxpc3RlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLwoJU09DS0VUIHNBY2NlcHRTb2NrZXQsIC8qIFtpbl0gRGVzY3JpcHRvciBpZGVudGlmeWluZyBhIHNvY2tldCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG8gYWNjZXB0IGFuIGluY29taW5nIGNvbm5lY3Rpb24gKi8KCVBWT0lEIGxwT3V0cHV0QnVmZmVyLCAvKiBbaW5dICBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiBscE91dHB1dEJ1ZmZlcgoJCQkJICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFjdHVhbCByZWNlaXZlIGRhdGEKCQkJCSAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwoJRFdPUkQgZHdMb2NhbEFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCSAgICAgICBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uICovCglEV09SRCBkd1JlbW90ZUFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCQlyZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJTFBEV09SRCBscGR3Qnl0ZXNSZWNlaXZlZCwgLyogW291dF0gUG9pbnRlciB0byBhIERXT1JEIHRoYXQgcmVjZWl2ZXMKCQkJCSAgICAgIHRoZSBjb3VudCBvZiBieXRlcyByZWNlaXZlZCAqLwoJTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkgLyogW2luXSBTcGVjaWZ5IGluIG9yZGVyIHRvIGFjaGlldmUgYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBlZCAoYXN5bmNocm9ub3VzKSBJL08gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uICovCnsKICAgIEZJWE1FKCIobGlzdGVuPSVkLCBhY2NlcHQ9JWQsICVwLCAlZCwgJWQsICVkLCAlcCwgJXApLCBub3QgaW1wbGVtZW50ZWRcbiIsCglzTGlzdGVuU29ja2V0LHNBY2NlcHRTb2NrZXQsbHBPdXRwdXRCdWZmZXIsZHdSZWNlaXZlRGF0YUxlbmd0aCwKCWR3TG9jYWxBZGRyZXNzTGVuZ3RoLGR3UmVtb3RlQWRkcmVzc0xlbmd0aCxscGR3Qnl0ZXNSZWNlaXZlZCxscE92ZXJsYXBwZWQKICAgICk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0QWNjZXB0RXhTb2NrYWRkcnMgKE1TV1NPQ0suQCkKICovClZPSUQgV0lOQVBJIEdldEFjY2VwdEV4U29ja2FkZHJzKAoJUFZPSUQgbHBPdXRwdXRCdWZmZXIsIC8qIFtpbl0gUG9pbnRlciB0byBhIGJ1ZmZlciAqLwoJRFdPUkQgZHdSZWNlaXZlRGF0YUxlbmd0aCwgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB1c2VkCgkJCQkgICAgICBmb3IgcmVjZWl2aW5nIHRoZSBmaXJzdCBkYXRhICovCglEV09SRCBkd0xvY2FsQWRkcmVzc0xlbmd0aCwgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZQoJCQkJICAgICAgIGxvY2FsIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KCURXT1JEIGR3UmVtb3RlQWRkcmVzc0xlbmd0aCwgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZQoJCQkJCXJlbW90ZSBhZGRyZXNzIGluZm9ybWF0aW9uICovCglzdHJ1Y3Qgc29ja2FkZHIgKipMb2NhbFNvY2thZGRyLCAvKiBbb3V0XSBQb2ludGVyIHRvIHRoZSBzb2NrYWRkcgoJCQkJCSAgICBzdHJ1Y3R1cmUgdGhhdCByZWNlaXZlcyB0aGUgbG9jYWwKCQkJCQkgICAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiAgKi8KCUxQSU5UIExvY2FsU29ja2FkZHJMZW5ndGgsIC8qIFtvdXRdIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGxvY2FsCgkJCQkgICAgICBhZGRyZXNzICovCglzdHJ1Y3Qgc29ja2FkZHIgKipSZW1vdGVTb2NrYWRkciwgLyogW291dF0gUG9pbnRlciB0byB0aGUgc29ja2FkZHIKCQkJCQkgICAgIHN0cnVjdHVyZSB0aGF0IHJlY2VpdmVzIHRoZSByZW1vdGUKCQkJCQkgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gKi8KCUxQSU5UIFJlbW90ZVNvY2thZGRyTGVuZ3RoKSAvKiBbb3V0XSBTaXplIGluIGJ5dGVzIG9mIHRoZSByZW1vdGUgYWRkcmVzcyAqLwp7CiAgICBGSVhNRSgibm90IGltcGxlbWVudGVkXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUcmFuc21pdEZpbGUgKE1TV1NPQ0suQCkKICoKICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbWl0IGEgZmlsZSBvdmVyIHNvY2tldC4KICoKICogVE9ETwogKiAgVGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgYSBzdHViLgogKi8KCkJPT0wgV0lOQVBJIFRyYW5zbWl0RmlsZSgKICAgICAgICBTT0NLRVQgaFNvY2tldCwgLyogW2luXSBIYW5kbGUgdG8gYSBjb25uZWN0ZWQgc29ja2V0ICovCglIQU5ETEUgaEZpbGUsICAgLyogW2luXSBIYW5kbGUgdG8gdGhlIG9wZW4gZmlsZSB0aGF0IHNob3VsZCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdGVkICovCglEV09SRCBuTnVtYmVyT2ZCeXRlc1RvV3JpdGUsIC8qIFtpbl0gTnVtYmVyIG9mIGZpbGUgYnl0ZXMgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdCAqLwoJRFdPUkQgbk51bWJlck9mQnl0ZXNQZXJTZW5kLCAvKiBbaW5dIFNpemUgaW4gYnl0ZXMgb2YgZWFjaCBibG9jayBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc2VudCBpbiBlYWNoIHNlbmQgb3BlcmF0aW9uICovCglMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkLCAvKiBbaW5dIFNwZWNpZnkgaW4gb3JkZXIgdG8gYWNoaWV2ZSBhbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGVkIChhc3luY2hyb25vdXMpIEkvTyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gKi8KCUxQVFJBTlNNSVRfRklMRV9CVUZGRVJTIGxwVHJhbnNtaXRCdWZmZXJzLCAKCQkvKiBbaW5dIENvbnRhaW5zIHBvaW50ZXJzIHRvIGRhdGEgdG8gc2VuZCBiZWZvcmUgYW5kIGFmdGVyCiAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBkYXRhIGlzIHNlbnQgKi8KCURXT1JEIGR3RmxhZ3MpIC8qIFtpbl0gRmxhZ3MgKi8KewogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZFxuIik7CgogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVdTQVJlY3ZFeCAoTVNXU09DSy5AKQogKi8KSU5UIFdJTkFQSSBXU0FSZWN2RXgoCglTT0NLRVQgcywgICAvKiBbaW5dIERlc2NyaXB0b3IgaWRlbnRpZnlpbmcgYSBjb25uZWN0ZWQgc29ja2V0ICovCgljaGFyICpidWYsICAvKiBbb3V0XSBCdWZmZXIgZm9yIHRoZSBpbmNvbWluZyBkYXRhICovCglJTlQgbGVuLCAgICAvKiBbaW5dIExlbmd0aCBvZiBidWYsIGluIGJ5dGVzICovCiAgICAgICAgSU5UICpmbGFncykgLyogW2luL291dF0gSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbWVzc2FnZSBpcwoJICAgICAgICAgICAgICAgZnVsbHkgb3IgcGFydGlhbGx5IHJlY2VpdmVkIGZvciBkYXRhZ3JhbSBzb2NrZXRzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgCiAgICByZXR1cm4gU09DS0VUX0VSUk9SOwp9Cg==