LyoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpMmMtYWRhcC1pdGUuYyBpMmMtaHcgYWNjZXNzIGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gdGhlIElURSBNSVBTIHN5c3RlbQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhaS1QYW8gRmFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgIGhwZmFuQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KCiAgIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtZWxla3Rvci5jLCB3aGljaCB3YXMgY3JlYXRlZAogICBieSBTaW1vbiBHLiBWb2dsIGFuZCBIYW5zIEJlcmdsdW5kOgoKIAogICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCiAgICAgICAgICAgICAgICAgICAxOTk4LTk5IEhhbnMgQmVyZ2x1bmQKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWl0ZS5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFkYXAtaXRlLmg+CiNpbmNsdWRlICIuLi9pMmMtaXRlLmgiCgojZGVmaW5lIERFRkFVTFRfQkFTRSAgMHgxNDAxNDAzMAojZGVmaW5lIElURV9JSUNfSU9fU0laRQkweDQwCiNkZWZpbmUgREVGQVVMVF9JUlEgICAwCiNkZWZpbmUgREVGQVVMVF9DTE9DSyAweDFiMGUJLyogZGVmYXVsdCAxNk1Iei8oMjcrMTQpID0gNDAwS0h6ICovCiNkZWZpbmUgREVGQVVMVF9PV04gICAweDU1CgpzdGF0aWMgaW50IGJhc2U7CnN0YXRpYyBpbnQgaXJxOwpzdGF0aWMgaW50IGNsb2NrOwpzdGF0aWMgaW50IG93bjsKCnN0YXRpYyBzdHJ1Y3QgaWljX2l0ZSBncGk7CnN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBpaWNfd2FpdDsKc3RhdGljIGludCBpaWNfcGVuZGluZzsKc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKCi8qIC0tLS0tIGxvY2FsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgdm9pZCBpaWNfaXRlX3NldGlpYyh2b2lkICpkYXRhLCBpbnQgY3RsLCBzaG9ydCB2YWwpCnsKICAgICAgICB1bnNpZ25lZCBsb25nIGogPSBqaWZmaWVzICsgMTA7CgoJcHJfZGVidWcoIiBXcml0ZSAweCUwMnggdG8gMHgleFxuIiwodW5zaWduZWQgc2hvcnQpdmFsLCBjdGwmMHhmZik7CiNpZmRlZiBERUJVRwoJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGopKQoJCXNjaGVkdWxlKCk7CiNlbmRpZgoJb3V0dyh2YWwsY3RsKTsKfQoKc3RhdGljIHNob3J0IGlpY19pdGVfZ2V0aWljKHZvaWQgKmRhdGEsIGludCBjdGwpCnsKCXNob3J0IHZhbDsKCgl2YWwgPSBpbncoY3RsKTsKCXByX2RlYnVnKCJSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsKHVuc2lnbmVkIHNob3J0KXZhbCwgY3RsJjB4ZmYpOwoJcmV0dXJuICh2YWwpOwp9CgovKiBSZXR1cm4gb3VyIHNsYXZlIGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzCiAqIHB1dCBvbiB0aGUgSTJDIGJ1cyB3aGVuIGFub3RoZXIgbWFzdGVyIG9uIHRoZSBidXMgd2FudHMgdG8gYWRkcmVzcyB1cwogKiBhcyBhIHNsYXZlCiAqLwpzdGF0aWMgaW50IGlpY19pdGVfZ2V0b3duKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoZ3BpLmlpY19vd24pOwp9CgoKc3RhdGljIGludCBpaWNfaXRlX2dldGNsb2NrKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoZ3BpLmlpY19jbG9jayk7Cn0KCgovKiBQdXQgdGhpcyBwcm9jZXNzIHRvIHNsZWVwLiAgV2Ugd2lsbCB3YWtlIHVwIHdoZW4gdGhlCiAqIElJQyBjb250cm9sbGVyIGludGVycnVwdHMuCiAqLwpzdGF0aWMgdm9pZCBpaWNfaXRlX3dhaXRmb3JwaW4odm9pZCkgewogICBERUZJTkVfV0FJVCh3YWl0KTsKICAgaW50IHRpbWVvdXQgPSAyOwogICBsb25nIGZsYWdzOwoKICAgLyogSWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAod2hpY2ggdGhleSBhcmUpLCB0aGVuIHB1dCB0aGUgcHJvY2VzcyB0bwogICAgKiBzbGVlcC4gIFRoaXMgcHJvY2VzcyB3aWxsIGJlIGF3YWtlbmVkIGJ5IHR3byBldmVudHMgLS0gZWl0aGVyIHRoZQogICAgKiB0aGUgSUlDIHBlcmlwaGVyYWwgaW50ZXJydXB0cyBvciB0aGUgdGltZW91dCBleHBpcmVzLiAKICAgICogSWYgaW50ZXJydXB0cyBhcmUgbm90IGVuYWJsZWQgdGhlbiBkZWxheSBmb3IgYSByZWFzb25hYmxlIGFtb3VudCAKICAgICogb2YgdGltZSBhbmQgcmV0dXJuLgogICAgKi8KICAgaWYgKGdwaS5paWNfaXJxID4gMCkgewoJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKCWlmIChpaWNfcGVuZGluZyA9PSAwKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCXByZXBhcmVfdG9fd2FpdCgmaWljX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwoJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CgkJCWlmIChpaWNfcGVuZGluZyA9PSAxKSB7CgkJCQlpaWNfcGVuZGluZyA9IDA7CgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCX0KCQlmaW5pc2hfd2FpdCgmaWljX3dhaXQsICZ3YWl0KTsKCX0gZWxzZSB7CgkJaWljX3BlbmRpbmcgPSAwOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCX0KICAgfSBlbHNlIHsKICAgICAgdWRlbGF5KDEwMCk7CiAgIH0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBpaWNfaXRlX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsCgkJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3Bpbl9sb2NrKCZsb2NrKTsKCWlpY19wZW5kaW5nID0gMTsKCXNwaW5fdW5sb2NrKCZsb2NrKTsKCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlpY193YWl0KTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgovKiBMb2NrIHRoZSByZWdpb24gb2YgbWVtb3J5IHdoZXJlIEkvTyByZWdpc3RlcnMgZXhpc3QuICBSZXF1ZXN0IG91cgogKiBpbnRlcnJ1cHQgbGluZSBhbmQgcmVnaXN0ZXIgaXRzIGFzc29jaWF0ZWQgaGFuZGxlci4KICovCnN0YXRpYyBpbnQgaWljX2h3X3Jlc3JjX2luaXQodm9pZCkKewoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihncGkuaWljX2Jhc2UsIElURV9JSUNfSU9fU0laRSwgImkyYyIpKQoJCXJldHVybiAtRU5PREVWOwogIAoJaWYgKGdwaS5paWNfaXJxIDw9IDApCgkJcmV0dXJuIDA7CgoJaWYgKHJlcXVlc3RfaXJxKGdwaS5paWNfaXJxLCBpaWNfaXRlX2hhbmRsZXIsIDAsICJJVEUgSUlDIiwgMCkgPCAwKQoJCWdwaS5paWNfaXJxID0gMDsKCWVsc2UKCQllbmFibGVfaXJxKGdwaS5paWNfaXJxKTsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyB2b2lkIGlpY19pdGVfcmVsZWFzZSh2b2lkKQp7CglpZiAoZ3BpLmlpY19pcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoZ3BpLmlpY19pcnEpOwoJCWZyZWVfaXJxKGdwaS5paWNfaXJxLCAwKTsKCX0KCXJlbGVhc2VfcmVnaW9uKGdwaS5paWNfYmFzZSAsIDIpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRW5jYXBzdWxhdGUgdGhlIGFib3ZlIGZ1bmN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZS4KICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgogKi8Kc3RhdGljIHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSBpaWNfaXRlX2RhdGEgPSB7CglOVUxMLAoJaWljX2l0ZV9zZXRpaWMsCglpaWNfaXRlX2dldGlpYywKCWlpY19pdGVfZ2V0b3duLAoJaWljX2l0ZV9nZXRjbG9jaywKCWlpY19pdGVfd2FpdGZvcnBpbiwKCTgwLCA4MCwgMTAwLAkJLyoJd2FpdHMsIHRpbWVvdXQgKi8KfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaWljX2l0ZV9vcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuaWQJCT0gSTJDX0hXX0lfSUlDLAoJLmFsZ29fZGF0YQk9ICZpaWNfaXRlX2RhdGEsCgkuZGV2CQk9IHsKCQkubmFtZQk9ICJJVEUgSUlDIGFkYXB0ZXIiLAoJfSwKfTsKCi8qIENhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkLiAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlCiAqIGNhc2NhZGUgb2YgY2FsbHMgdXAgdGhyb3VnaCB0aGUgaGllcmFyY2h5IG9mIGkyYyBtb2R1bGVzIChpLmUuIHVwIHRvIHRoZQogKiAgYWxnb3JpdGhtIGxheWVyIGFuZCBpbnRvIHRvIHRoZSBjb3JlIGxheWVyKQogKi8Kc3RhdGljIGludCBfX2luaXQgaWljX2l0ZV9pbml0KHZvaWQpIAp7CgoJc3RydWN0IGlpY19pdGUgKnBpaWMgPSAmZ3BpOwoKCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemUgSVRFIElJQyBhZGFwdGVyIG1vZHVsZVxuIik7CglpZiAoYmFzZSA9PSAwKQoJCXBpaWMtPmlpY19iYXNlID0gREVGQVVMVF9CQVNFOwoJZWxzZQoJCXBpaWMtPmlpY19iYXNlID0gYmFzZTsKCglpZiAoaXJxID09IDApCgkJcGlpYy0+aWljX2lycSA9IERFRkFVTFRfSVJROwoJZWxzZQoJCXBpaWMtPmlpY19pcnEgPSBpcnE7CgoJaWYgKGNsb2NrID09IDApCgkJcGlpYy0+aWljX2Nsb2NrID0gREVGQVVMVF9DTE9DSzsKCWVsc2UKCQlwaWljLT5paWNfY2xvY2sgPSBjbG9jazsKCglpZiAob3duID09IDApCgkJcGlpYy0+aWljX293biA9IERFRkFVTFRfT1dOOwoJZWxzZQoJCXBpaWMtPmlpY19vd24gPSBvd247CgoJaWljX2l0ZV9kYXRhLmRhdGEgPSAodm9pZCAqKXBpaWM7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZpaWNfd2FpdCk7CglzcGluX2xvY2tfaW5pdCgmbG9jayk7CglpZiAoaWljX2h3X3Jlc3JjX2luaXQoKSA9PSAwKSB7CgkJaWYgKGkyY19paWNfYWRkX2J1cygmaWljX2l0ZV9vcHMpIDwgMCkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9IGVsc2UgewoJCXJldHVybiAtRU5PREVWOwoJfQoJcHJpbnRrKEtFUk5fSU5GTyAiIGZvdW5kIGRldmljZSBhdCAlI3ggaXJxICVkLlxuIiwgCgkJcGlpYy0+aWljX2Jhc2UsIHBpaWMtPmlpY19pcnEpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCBpaWNfaXRlX2V4aXQodm9pZCkKewoJaTJjX2lpY19kZWxfYnVzKCZpaWNfaXRlX29wcyk7CiAgICAgICAgaWljX2l0ZV9yZWxlYXNlKCk7Cn0KCi8qIElmIG1vZHVsZXMgaXMgTk9UIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIHRoZW4gdGhlIE1PRFVMRV8qCiAqIG1hY3JvcyB3aWxsIHJlc29sdmUgdG8gbm90aGluZwogKi8KTU9EVUxFX0FVVEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSA8d3d3Lm12aXN0YS5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBJVEUgSUlDIGJ1cyBhZGFwdGVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgMCk7Cm1vZHVsZV9wYXJhbShvd24sIGludCwgMCk7CgoKLyogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZCBvciB3aGVuIGtlcm5lbCBpcyBpbml0aWFsaXplZC4KICogSWYgTU9EVUxFUyBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbAogKiByZXNvbHZlIHRvIGluaXRfbW9kdWxlICh0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gaW5zbW9kIGlzIGludm9rZWQgZm9yIGEKICogbW9kdWxlKS4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIGJvb3QsIHdoZW4gdGhlCiAqIGtlcm5lbCBpcyBpbnRpYWxpemVkLiAgQ2hlY2sgb3V0IC9pbmNsdWRlL2luaXQuaCB0byBzZWUgaG93IHRoaXMgd29ya3MuCiAqLwptb2R1bGVfaW5pdChpaWNfaXRlX2luaXQpOwoKLyogUmVzb2x2ZXMgdG8gbW9kdWxlX2NsZWFudXAgd2hlbiBNT0RVTEVTIGlzIGRlZmluZWQuICovCm1vZHVsZV9leGl0KGlpY19pdGVfZXhpdCk7IAo=