LyoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpMmMtYWRhcC1pdGUuYyBpMmMtaHcgYWNjZXNzIGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gdGhlIElURSBNSVBTIHN5c3RlbQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhaS1QYW8gRmFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgIGhwZmFuQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KCiAgIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtZWxla3Rvci5jLCB3aGljaCB3YXMgY3JlYXRlZAogICBieSBTaW1vbiBHLiBWb2dsIGFuZCBIYW5zIEJlcmdsdW5kOgoKIAogICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCiAgICAgICAgICAgICAgICAgICAxOTk4LTk5IEhhbnMgQmVyZ2x1bmQKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWl0ZS5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFkYXAtaXRlLmg+CiNpbmNsdWRlICIuLi9pMmMtaXRlLmgiCgojZGVmaW5lIERFRkFVTFRfQkFTRSAgMHgxNDAxNDAzMAojZGVmaW5lIElURV9JSUNfSU9fU0laRQkweDQwCiNkZWZpbmUgREVGQVVMVF9JUlEgICAwCiNkZWZpbmUgREVGQVVMVF9DTE9DSyAweDFiMGUJLyogZGVmYXVsdCAxNk1Iei8oMjcrMTQpID0gNDAwS0h6ICovCiNkZWZpbmUgREVGQVVMVF9PV04gICAweDU1CgpzdGF0aWMgaW50IGJhc2U7CnN0YXRpYyBpbnQgaXJxOwpzdGF0aWMgaW50IGNsb2NrOwpzdGF0aWMgaW50IG93bjsKCnN0YXRpYyBzdHJ1Y3QgaWljX2l0ZSBncGk7CnN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBpaWNfd2FpdDsKc3RhdGljIGludCBpaWNfcGVuZGluZzsKc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKCi8qIC0tLS0tIGxvY2FsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgdm9pZCBpaWNfaXRlX3NldGlpYyh2b2lkICpkYXRhLCBpbnQgY3RsLCBzaG9ydCB2YWwpCnsKICAgICAgICB1bnNpZ25lZCBsb25nIGogPSBqaWZmaWVzICsgMTA7CgoJcHJfZGVidWcoIiBXcml0ZSAweCUwMnggdG8gMHgleFxuIiwodW5zaWduZWQgc2hvcnQpdmFsLCBjdGwmMHhmZik7CiNpZmRlZiBERUJVRwoJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGopKQoJCXNjaGVkdWxlKCk7CiNlbmRpZgoJb3V0dyh2YWwsY3RsKTsKfQoKc3RhdGljIHNob3J0IGlpY19pdGVfZ2V0aWljKHZvaWQgKmRhdGEsIGludCBjdGwpCnsKCXNob3J0IHZhbDsKCgl2YWwgPSBpbncoY3RsKTsKCXByX2RlYnVnKCJSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsKHVuc2lnbmVkIHNob3J0KXZhbCwgY3RsJjB4ZmYpOwoJcmV0dXJuICh2YWwpOwp9CgovKiBSZXR1cm4gb3VyIHNsYXZlIGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzCiAqIHB1dCBvbiB0aGUgSTJDIGJ1cyB3aGVuIGFub3RoZXIgbWFzdGVyIG9uIHRoZSBidXMgd2FudHMgdG8gYWRkcmVzcyB1cwogKiBhcyBhIHNsYXZlCiAqLwpzdGF0aWMgaW50IGlpY19pdGVfZ2V0b3duKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoZ3BpLmlpY19vd24pOwp9CgoKc3RhdGljIGludCBpaWNfaXRlX2dldGNsb2NrKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoZ3BpLmlpY19jbG9jayk7Cn0KCgovKiBQdXQgdGhpcyBwcm9jZXNzIHRvIHNsZWVwLiAgV2Ugd2lsbCB3YWtlIHVwIHdoZW4gdGhlCiAqIElJQyBjb250cm9sbGVyIGludGVycnVwdHMuCiAqLwpzdGF0aWMgdm9pZCBpaWNfaXRlX3dhaXRmb3JwaW4odm9pZCkgewogICBERUZJTkVfV0FJVCh3YWl0KTsKICAgaW50IHRpbWVvdXQgPSAyOwogICB1bnNpZ25lZCBsb25nIGZsYWdzOwoKICAgLyogSWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAod2hpY2ggdGhleSBhcmUpLCB0aGVuIHB1dCB0aGUgcHJvY2VzcyB0bwogICAgKiBzbGVlcC4gIFRoaXMgcHJvY2VzcyB3aWxsIGJlIGF3YWtlbmVkIGJ5IHR3byBldmVudHMgLS0gZWl0aGVyIHRoZQogICAgKiB0aGUgSUlDIHBlcmlwaGVyYWwgaW50ZXJydXB0cyBvciB0aGUgdGltZW91dCBleHBpcmVzLiAKICAgICogSWYgaW50ZXJydXB0cyBhcmUgbm90IGVuYWJsZWQgdGhlbiBkZWxheSBmb3IgYSByZWFzb25hYmxlIGFtb3VudCAKICAgICogb2YgdGltZSBhbmQgcmV0dXJuLgogICAgKi8KICAgaWYgKGdwaS5paWNfaXJxID4gMCkgewoJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKCWlmIChpaWNfcGVuZGluZyA9PSAwKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCXByZXBhcmVfdG9fd2FpdCgmaWljX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwoJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CgkJCWlmIChpaWNfcGVuZGluZyA9PSAxKSB7CgkJCQlpaWNfcGVuZGluZyA9IDA7CgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCX0KCQlmaW5pc2hfd2FpdCgmaWljX3dhaXQsICZ3YWl0KTsKCX0gZWxzZSB7CgkJaWljX3BlbmRpbmcgPSAwOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCX0KICAgfSBlbHNlIHsKICAgICAgdWRlbGF5KDEwMCk7CiAgIH0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBpaWNfaXRlX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQpCnsKCXNwaW5fbG9jaygmbG9jayk7CglpaWNfcGVuZGluZyA9IDE7CglzcGluX3VubG9jaygmbG9jayk7CgoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpaWNfd2FpdCk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgoKLyogTG9jayB0aGUgcmVnaW9uIG9mIG1lbW9yeSB3aGVyZSBJL08gcmVnaXN0ZXJzIGV4aXN0LiAgUmVxdWVzdCBvdXIKICogaW50ZXJydXB0IGxpbmUgYW5kIHJlZ2lzdGVyIGl0cyBhc3NvY2lhdGVkIGhhbmRsZXIuCiAqLwpzdGF0aWMgaW50IGlpY19od19yZXNyY19pbml0KHZvaWQpCnsKCWlmICghcmVxdWVzdF9yZWdpb24oZ3BpLmlpY19iYXNlLCBJVEVfSUlDX0lPX1NJWkUsICJpMmMiKSkKCQlyZXR1cm4gLUVOT0RFVjsKICAKCWlmIChncGkuaWljX2lycSA8PSAwKQoJCXJldHVybiAwOwoKCWlmIChyZXF1ZXN0X2lycShncGkuaWljX2lycSwgaWljX2l0ZV9oYW5kbGVyLCAwLCAiSVRFIElJQyIsIDApIDwgMCkKCQlncGkuaWljX2lycSA9IDA7CgllbHNlCgkJZW5hYmxlX2lycShncGkuaWljX2lycSk7CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCBpaWNfaXRlX3JlbGVhc2Uodm9pZCkKewoJaWYgKGdwaS5paWNfaXJxID4gMCkgewoJCWRpc2FibGVfaXJxKGdwaS5paWNfaXJxKTsKCQlmcmVlX2lycShncGkuaWljX2lycSwgMCk7Cgl9CglyZWxlYXNlX3JlZ2lvbihncGkuaWljX2Jhc2UgLCAyKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEVuY2Fwc3VsYXRlIHRoZSBhYm92ZSBmdW5jdGlvbnMgaW4gdGhlIGNvcnJlY3Qgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuCiAqIFRoaXMgaXMgb25seSBkb25lIHdoZW4gbW9yZSB0aGFuIG9uZSBoYXJkd2FyZSBhZGFwdGVyIGlzIHN1cHBvcnRlZC4KICovCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgaWljX2l0ZV9kYXRhID0gewoJTlVMTCwKCWlpY19pdGVfc2V0aWljLAoJaWljX2l0ZV9nZXRpaWMsCglpaWNfaXRlX2dldG93biwKCWlpY19pdGVfZ2V0Y2xvY2ssCglpaWNfaXRlX3dhaXRmb3JwaW4sCgk4MCwgODAsIDEwMCwJCS8qCXdhaXRzLCB0aW1lb3V0ICovCn07CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGlpY19pdGVfb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmlkCQk9IEkyQ19IV19JX0lJQywKCS5hbGdvX2RhdGEJPSAmaWljX2l0ZV9kYXRhLAoJLm5hbWUJCT0gIklURSBJSUMgYWRhcHRlciIsCn07CgovKiBDYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZC4gIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZQogKiBjYXNjYWRlIG9mIGNhbGxzIHVwIHRocm91Z2ggdGhlIGhpZXJhcmNoeSBvZiBpMmMgbW9kdWxlcyAoaS5lLiB1cCB0byB0aGUKICogIGFsZ29yaXRobSBsYXllciBhbmQgaW50byB0byB0aGUgY29yZSBsYXllcikKICovCnN0YXRpYyBpbnQgX19pbml0IGlpY19pdGVfaW5pdCh2b2lkKSAKewoKCXN0cnVjdCBpaWNfaXRlICpwaWljID0gJmdwaTsKCglwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXplIElURSBJSUMgYWRhcHRlciBtb2R1bGVcbiIpOwoJaWYgKGJhc2UgPT0gMCkKCQlwaWljLT5paWNfYmFzZSA9IERFRkFVTFRfQkFTRTsKCWVsc2UKCQlwaWljLT5paWNfYmFzZSA9IGJhc2U7CgoJaWYgKGlycSA9PSAwKQoJCXBpaWMtPmlpY19pcnEgPSBERUZBVUxUX0lSUTsKCWVsc2UKCQlwaWljLT5paWNfaXJxID0gaXJxOwoKCWlmIChjbG9jayA9PSAwKQoJCXBpaWMtPmlpY19jbG9jayA9IERFRkFVTFRfQ0xPQ0s7CgllbHNlCgkJcGlpYy0+aWljX2Nsb2NrID0gY2xvY2s7CgoJaWYgKG93biA9PSAwKQoJCXBpaWMtPmlpY19vd24gPSBERUZBVUxUX09XTjsKCWVsc2UKCQlwaWljLT5paWNfb3duID0gb3duOwoKCWlpY19pdGVfZGF0YS5kYXRhID0gKHZvaWQgKilwaWljOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmaWljX3dhaXQpOwoJc3Bpbl9sb2NrX2luaXQoJmxvY2spOwoJaWYgKGlpY19od19yZXNyY19pbml0KCkgPT0gMCkgewoJCWlmIChpMmNfaWljX2FkZF9idXMoJmlpY19pdGVfb3BzKSA8IDApCgkJCXJldHVybiAtRU5PREVWOwoJfSBlbHNlIHsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCXByaW50ayhLRVJOX0lORk8gIiBmb3VuZCBkZXZpY2UgYXQgJSN4IGlycSAlZC5cbiIsIAoJCXBpaWMtPmlpY19iYXNlLCBwaWljLT5paWNfaXJxKTsKCXJldHVybiAwOwp9CgoKc3RhdGljIHZvaWQgaWljX2l0ZV9leGl0KHZvaWQpCnsKCWkyY19paWNfZGVsX2J1cygmaWljX2l0ZV9vcHMpOwogICAgICAgIGlpY19pdGVfcmVsZWFzZSgpOwp9CgovKiBJZiBtb2R1bGVzIGlzIE5PVCBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCB0aGVuIHRoZSBNT0RVTEVfKgogKiBtYWNyb3Mgd2lsbCByZXNvbHZlIHRvIG5vdGhpbmcKICovCk1PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUgPHd3dy5tdmlzdGEuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYWRhcHRlciByb3V0aW5lcyBmb3IgSVRFIElJQyBidXMgYWRhcHRlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oYmFzZSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ob3duLCBpbnQsIDApOwoKCi8qIENhbGxlZCB3aGVuIG1vZHVsZSBpcyBsb2FkZWQgb3Igd2hlbiBrZXJuZWwgaXMgaW5pdGlhbGl6ZWQuCiAqIElmIE1PRFVMRVMgaXMgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKICogcmVzb2x2ZSB0byBpbml0X21vZHVsZSAodGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGluc21vZCBpcyBpbnZva2VkIGZvciBhCiAqIG1vZHVsZSkuICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVhcmx5IGluIHRoZSBib290LCB3aGVuIHRoZQogKiBrZXJuZWwgaXMgaW50aWFsaXplZC4gIENoZWNrIG91dCAvaW5jbHVkZS9pbml0LmggdG8gc2VlIGhvdyB0aGlzIHdvcmtzLgogKi8KbW9kdWxlX2luaXQoaWljX2l0ZV9pbml0KTsKCi8qIFJlc29sdmVzIHRvIG1vZHVsZV9jbGVhbnVwIHdoZW4gTU9EVUxFUyBpcyBkZWZpbmVkLiAqLwptb2R1bGVfZXhpdChpaWNfaXRlX2V4aXQpOyAK