LyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKICAgQ29weXJpZ2h0IDE5OTYsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCgogICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiAgIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCi8qCiAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgogKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KICovCgovKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAgKi8KI2RlZmluZSBPQkpfRVZBWCAxCgovKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICAqLwojaW5jbHVkZSAidGFyZy1jcHUuaCIKCiNpZmRlZiBCRkRfQVNTRU1CTEVSCiNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgojZW5kaWYKCi8qCiAqIFNZTUJPTFMKICovCgovKgogKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQogKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgogKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCiAqLwoKLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCgovKiAgKi8KdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICB2b2lkICpub3RoaW5nOwogIH0Kb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCgp0eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwoKI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDApCS8qIHlvdXIgbWFnaWMgbnVtYmVyICovCgojZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICAqLwoKI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpICAgICAgICB7O30KCiNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKQojZGVmaW5lIFNfU0VUX1RZUEUoUyxUKQojZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQojZGVmaW5lIFNfR0VUX09USEVSKFMpCTAKI2RlZmluZSBTX0dFVF9UWVBFKFMpCTAKI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKCiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9TVEFDSyA5CiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAojZGVmaW5lIFBEU0NfU19LX0tJTkRfTlVMTCA4CgojZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCiNkZWZpbmUgUERTQ19TX0tfTUlOX1JFR0lTVEVSX1NJWkUgMjQKI2RlZmluZSBQRFNDX1NfS19OVUxMX1NJWkUgMTYKCiNkZWZpbmUgUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgMHg4MAkvKiBsb3cgYnl0ZSAqLwojZGVmaW5lIFBEU0NfU19NX05BVElWRSAweDEwCQkvKiBoaWdoIGJ5dGUgKi8KI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCgojZGVmaW5lIExLUF9TX0tfU0laRSAxNgoKI2RlZmluZSBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQoU0laRSwgUDJWQVIpIChQMlZBUikgPSAzCgovKgogKiBMb2NhbCBWYXJpYWJsZXM6CiAqIGNvbW1lbnQtY29sdW1uOiAwCiAqIGZpbGwtY29sdW1uOiAxMzEKICogRW5kOgogKi8K