LyogCiAqIGFjY291bnRpbmcgbWF0Y2ggaGVscGVyIChsaWJpcHRfYWNjb3VudC5jKQogKiAoQykgMjAwMywyMDA0IGJ5IFBpb3RyIEdhc2lks28gKHF1YWtlckBiYXJiYXJhLmV1Lm9yZykKICoKICogVmVyc2lvbjogMC4xLjYKICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdQTAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxpcHRhYmxlcy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxnZXRvcHQuaD4KCiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWNjb3VudC5oPgoKI2lmbmRlZiBISVBRVUFECiNkZWZpbmUgSElQUVVBRChhZGRyKSBcCgkoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbM10sIFwKCSgodW5zaWduZWQgY2hhciAqKSZhZGRyKVsyXSwgXAoJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzFdLCBcCgkoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbMF0KI2VuZGlmCgkJCQkKc3RhdGljIHZvaWQgaGVscCh2b2lkKSB7CglwcmludGYoCgkJCSJhY2NvdW50IHYlcyBvcHRpb25zOlxuIgoJCQkiLS1hYWRkciBuZXR3b3JrL25ldG1hc2tcbiIKCQkJIglkZWZpbmVzIG5ldHdvcmsvbmV0bWFzayBmb3Igd2hpY2ggbWFrZSBzdGF0aXN0aWNzLlxuIgoJCQkiLS1hbmFtZSBuYW1lXG4iCgkJCSIJZGVmaW5lcyBuYW1lIG9mIGxpc3Qgd2hlcmUgc3RhdGlzdGljcyB3aWxsIGJlIGtlcHQuIElmIG5vIGlzXG4iCgkJCSIJc3BlY2lmaWVkIERFRkFVTFQgd2lsbCBiZSB1c2VkLlxuIgoJCQkiLS1hc2hvcnRcbiIKCQkJIiAgICAgICB0YWJsZSB3aWxsIGNvbGVjdCBvbmx5IHNob3J0IHN0YXRpc3RpY3MgKG9ubHkgdG90YWwgY291bnRlcnNcbiIKCQkJIiAgICAgICB3aXRob3V0IHNwbGl0dGluZyBpdCBpbnRvIHByb3RvY29scy5cbiIKCSwgCglJUFRBQkxFU19WRVJTSU9OKTsKfTsKCnN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKCXsgLm5hbWUgPSAiYWFkZHIiLCAgLmhhc19hcmcgPSAxLCAuZmxhZyA9IE5VTEwsIC52YWwgPSAyMDEgfSwKCXsgLm5hbWUgPSAiYW5hbWUiLCAgLmhhc19hcmcgPSAxLCAuZmxhZyA9IE5VTEwsIC52YWwgPSAyMDIgfSwKCXsgLm5hbWUgPSAiYXNob3J0IiwgLmhhc19hcmcgPSAwLCAuZmxhZyA9IE5VTEwsIC52YWwgPSAyMDMgfSwKCXsgLm5hbWUgPSAwLCAuaGFzX2FyZyA9IDAsIC5mbGFnID0gMCwgLnZhbCA9IDAgfQp9OwoKLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgcGFyc2VfbmV0d29yayAqLwppbnQgcGFyc2VpcChjb25zdCBjaGFyICpwYXJhbWV0ZXIsIHVfaW50MzJfdCAqaXApIHsKCQoJY2hhciBidWZmZXJbMTZdLCAqYnVmZmVycHRyLCAqZG90OwoJdW5zaWduZWQgaW50IGksIHNoaWZ0LCBwYXJ0OwoKCWlmIChzdHJsZW4ocGFyYW1ldGVyKSA+IDE1KQoJCXJldHVybiAwOwoKCXN0cm5jcHkoYnVmZmVyLCBwYXJhbWV0ZXIsIDE1KTsKCWJ1ZmZlclsxNV0gPSAwOwoKCWJ1ZmZlcnB0ciA9IGJ1ZmZlcjsKCglmb3IgKGkgPSAwLCBzaGlmdCA9IDI0LCAqaXAgPSAwOyBpIDwgMzsgaSsrLCBzaGlmdCAtPSA4KSB7CgkJLyogbm8gZG90ICovCgkJaWYgKChkb3QgPSBzdHJjaHIoYnVmZmVycHRyLCAnLicpKSA9PSBOVUxMKQoJCQlyZXR1cm4gMDsKCQkvKiBub3QgYSBudW1iZXIgKi8KCQlpZiAoKHBhcnQgPSBzdHJ0b2woYnVmZmVycHRyLCAoY2hhcioqKU5VTEwsIDEwKSkgPCAwKSAKCQkJcmV0dXJuIDA7CQoJCS8qIHRvIGJpZyBudW1iZXIgKi8KCQlpZiAocGFydCA+IDI1NSkKCQkJcmV0dXJuIDA7CgkJKmlwIHw9IHBhcnQgPDwgc2hpZnQ7CQkKCQlidWZmZXJwdHIgPSBkb3QgKyAxOwoJfQoJLyogbm90IGEgbnVtYmVyICovCglpZiAoKHBhcnQgPSBzdHJ0b2woYnVmZmVycHRyLCAoY2hhcioqKU5VTEwsIDEwKSkgPCAwKSAKCQlyZXR1cm4gMDsKCS8qIHRvIGJpZyBudW1iZXIgKi8KCWlmIChwYXJ0ID4gMjU1KQoJCXJldHVybiAwOwoJKmlwIHw9IHBhcnQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgcGFyc2VuZXR3b3JrKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgdV9pbnQzMl90ICpuZXR3b3JrKSB7CglpZiAoIXBhcnNlaXAocGFyYW1ldGVyLCBuZXR3b3JrKSkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiYWNjb3VudDogd3JvbmcgaXAgaW4gbmV0d29yayIpOwp9CgpzdGF0aWMgdm9pZCBwYXJzZW5ldG1hc2thc2JpdHMoY29uc3QgY2hhciAqcGFyYW1ldGVyLCB1X2ludDMyX3QgKm5ldG1hc2spIHsKCQoJdV9pbnQzMl90IGJpdHM7CgkKCWlmICgoYml0cyA9IHN0cnRvbChwYXJhbWV0ZXIsIChjaGFyICoqKU5VTEwsIDEwKSkgPCAwIHx8IGJpdHMgPiAzMikKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiYWNjb3VudDogd3JvbmcgbmV0bWFzayIpOwoKCSpuZXRtYXNrID0gMHhmZmZmZmZmZiA8PCAoMzIgLSBiaXRzKTsKfQoKc3RhdGljIHZvaWQgcGFyc2VuZXRtYXNrYXNpcChjb25zdCBjaGFyICpwYXJhbWV0ZXIsIHVfaW50MzJfdCAqbmV0bWFzaykgewoJaWYgKCFwYXJzZWlwKHBhcmFtZXRlciwgbmV0bWFzaykpCgkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgImFjY291bnQ6IHdyb25nIGlwIGluIG5ldG1hc2siKTsKfQoKc3RhdGljIHZvaWQgcGFyc2VuZXRtYXNrKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgdV9pbnQzMl90ICpuZXRtYXNrKSAKewoJaWYgKHN0cmNocihwYXJhbWV0ZXIsICcuJykgIT0gTlVMTCkKCQlwYXJzZW5ldG1hc2thc2lwKHBhcmFtZXRlciwgbmV0bWFzayk7CgllbHNlCgkJcGFyc2VuZXRtYXNrYXNiaXRzKHBhcmFtZXRlciwgbmV0bWFzayk7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlbmV0d29ya2FuZG5ldG1hc2soY29uc3QgY2hhciAqcGFyYW1ldGVyLCB1X2ludDMyX3QgKm5ldHdvcmssIHVfaW50MzJfdCAqbmV0bWFzaykgCnsKCQoJY2hhciBidWZmZXJbMzJdLCAqc2xhc2g7CgoJaWYgKHN0cmxlbihwYXJhbWV0ZXIpID4gMzEpCgkJLyogdGV4dCBpcyB0byBsb25nLCBldmVuIGZvciAyNTUuMjU1LjI1NS4yNTUvMjU1LjI1NS4yNTUuMjU1ICovCgkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgImFjY291bnQ6IHdyb25nIG5ldHdvcmsvbmV0bWFzayIpOwoKCXN0cm5jcHkoYnVmZmVyLCBwYXJhbWV0ZXIsIDMxKTsKCWJ1ZmZlclszMV0gPSAwOwoKCS8qIGNoZWNrIHdoZXRoZXIgbmV0bWFzayBpcyBnaXZlbiAqLwoJaWYgKChzbGFzaCA9IHN0cmNocihidWZmZXIsICcvJykpICE9IE5VTEwpIHsKCQlwYXJzZW5ldG1hc2soc2xhc2ggKyAxLCBuZXRtYXNrKTsKCQkqc2xhc2ggPSAwOwoJfSBlbHNlCgkJKm5ldG1hc2sgPSAweGZmZmZmZmZmOwoJcGFyc2VuZXR3b3JrKGJ1ZmZlciwgbmV0d29yayk7CgoJaWYgKCgqbmV0d29yayAmICpuZXRtYXNrKSAhPSAqbmV0d29yaykKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiYWNjb3VudDogd3JvbmcgbmV0d29yay9uZXRtYXNrIik7Cn0KCgovKiBGdW5jdGlvbiBnZXRzIG5ldHdvcmsgJiBuZXRtYXNrIGZyb20gYXJndW1lbnQgYWZ0ZXIgLS1hYWRkciAqLwpzdGF0aWMgdm9pZCBwYXJzZV9uZXR3b3JrKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgc3RydWN0IHRfaXB0X2FjY291bnRfaW5mbyAqaW5mbykgewoKCXBhcnNlbmV0d29ya2FuZG5ldG1hc2socGFyYW1ldGVyLCAmaW5mby0+bmV0d29yaywgJmluZm8tPm5ldG1hc2spOwoJCn0KCi8qIHZhbGlkYXRlIG5ldG1hc2sgKi8KaW5saW5lIGludCB2YWxpZF9uZXRtYXNrKHVfaW50MzJfdCBuZXRtYXNrKSB7Cgl3aGlsZSAobmV0bWFzayAmIDB4ODAwMDAwMDApCgkJbmV0bWFzayA8PD0gMTsKCWlmIChuZXRtYXNrICE9IDApCgkJcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIDE7Cn0KCi8qIHZhbGlkYXRlIG5ldHdvcmsvbmV0bWFzayBwYWlyICovCmlubGluZSBpbnQgdmFsaWRfbmV0d29ya19hbmRfbmV0bWFzayhzdHJ1Y3QgdF9pcHRfYWNjb3VudF9pbmZvICppbmZvKSB7CglpZiAoIXZhbGlkX25ldG1hc2soaW5mby0+bmV0bWFzaykpCgkJcmV0dXJuIDA7CglpZiAoKGluZm8tPm5ldHdvcmsgJiBpbmZvLT5uZXRtYXNrKSAhPSBpbmZvLT5uZXR3b3JrKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCgoKLyogRnVuY3Rpb24gaW5pdGlhbGl6ZXMgbWF0Y2ggKi8Kc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwgCgkJIHVuc2lnbmVkIGludCAqbmZjYWNoZSkgewoJCglzdHJ1Y3QgdF9pcHRfYWNjb3VudF9pbmZvICppbmZvID0gKHN0cnVjdCB0X2lwdF9hY2NvdW50X2luZm8gKikobWF0Y2gpLT5kYXRhOwoKCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOwoKCS8qIHNldCBkZWZhdWx0IHRhYmxlIG5hbWUgdG8gREVGQVVMVCAqLwoJc3RybmNweShpbmZvLT5uYW1lLCAiREVGQVVMVCIsIElQVF9BQ0NPVU5UX05BTUVfTEVOKTsKCWluZm8tPnNob3J0bGlzdGluZyA9IDA7CgkKfQoKLyogRnVuY3Rpb24gcGFyc2VzIG1hdGNoJ3MgYXJndW1lbnRzICovCnN0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCAKCQkgIGludCBpbnZlcnQsIAoJCSAgdW5zaWduZWQgaW50ICpmbGFncywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbmZjYWNoZSwKICAgICAgICAgICAgICAgICAgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqKm1hdGNoKSB7CgkKCXN0cnVjdCB0X2lwdF9hY2NvdW50X2luZm8gKmluZm8gPSAoc3RydWN0IHRfaXB0X2FjY291bnRfaW5mbyAqKSgqbWF0Y2gpLT5kYXRhOwoKCXN3aXRjaCAoYykgewoJCQoJCS8qIC0tYWFkZHIgKi8KCQljYXNlIDIwMToKCQkJcGFyc2VfbmV0d29yayhvcHRhcmcsIGluZm8pOwoJCQlpZiAoIXZhbGlkX25ldHdvcmtfYW5kX25ldG1hc2soaW5mbykpCgkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiYWNjb3VudDogd3JvbmcgbmV0d29yay9uZXRtYXNrIik7CgkJCSpmbGFncyA9IDE7CgkJCWJyZWFrOwoJCQkKCQkvKiAtLWFuYW1lICovCgkJY2FzZSAyMDI6CgkJCWlmIChzdHJsZW4ob3B0YXJnKSA8IElQVF9BQ0NPVU5UX05BTUVfTEVOKQoJCQkJc3RybmNweShpbmZvLT5uYW1lLCBvcHRhcmcsIElQVF9BQ0NPVU5UX05BTUVfTEVOKTsKCQkJZWxzZQoJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgImFjY291bnQ6IFRvbyBsb25nIHRhYmxlIG5hbWUiKTsJCQkKCQkJYnJlYWs7CQoJCS8qIC0tYXNob3J0ICovCgkJY2FzZSAyMDM6CgkJCWluZm8tPnNob3J0bGlzdGluZyA9IDE7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldHVybiAwOwkJCQoJfQoJcmV0dXJuIDE7CQp9CgovKiBGaW5hbCBjaGVjayB3aGV0aGVyIG5ldHdvcmsvbmV0bWFzayB3YXMgc3BlY2lmaWVkICovCnN0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykgewoJaWYgKCFmbGFncykKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiYWNjb3VudDogWW91IG5lZWQgc3BlY2lmeSAnLS1hYWRkcicgcGFyYW1ldGVyIik7Cn0KCi8qIEZ1bmN0aW9uIHVzZWQgZm9yIHByaW50aW5nIHJ1bGUgd2l0aCBhY2NvdW50IG1hdGNoIGZvciBpcHRhYmxlcyAtTCAqLwpzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gsIAoJCSAgaW50IG51bWVyaWMpIHsKCQoJc3RydWN0IHRfaXB0X2FjY291bnRfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgdF9pcHRfYWNjb3VudF9pbmZvICopbWF0Y2gtPmRhdGE7CgkKCXByaW50ZigiYWNjb3VudDogIik7CglwcmludGYoIm5ldHdvcmsvbmV0bWFzazogIik7CglwcmludGYoIiV1LiV1LiV1LiV1LyV1LiV1LiV1LiV1ICIsCgkJCUhJUFFVQUQoaW5mby0+bmV0d29yayksCgkJCUhJUFFVQUQoaW5mby0+bmV0bWFzaykKCSAgICAgICk7CgkKCXByaW50ZigibmFtZTogJXMgIiwgaW5mby0+bmFtZSk7CglpZiAoaW5mby0+c2hvcnRsaXN0aW5nKQoJCXByaW50Zigic2hvcnQtbGlzdGluZyAiKTsKfQoKLyogRnVuY3Rpb24gdXNlZCBmb3Igc2F2aW5nIHJ1bGUgY29udGFpbmluZyBhY2NvdW50IG1hdGNoICovCnN0YXRpYyB2b2lkIHNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIAoJCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCkgewoKCXN0cnVjdCB0X2lwdF9hY2NvdW50X2luZm8gKmluZm8gPSAoc3RydWN0IHRfaXB0X2FjY291bnRfaW5mbyAqKW1hdGNoLT5kYXRhOwoJCglwcmludGYoIi0tYWFkZHIgIik7CglwcmludGYoIiV1LiV1LiV1LiV1LyV1LiV1LiV1LiV1ICIsCgkJCSBISVBRVUFEKGluZm8tPm5ldHdvcmspLAoJCQkgSElQUVVBRChpbmZvLT5uZXRtYXNrKQoJICAgICAgICk7CgkKCXByaW50ZigiLS1hbmFtZSAlcyAiLCBpbmZvLT5uYW1lKTsKCWlmIChpbmZvLT5zaG9ydGxpc3RpbmcpCgkJcHJpbnRmKCItLWFzaG9ydCAiKTsKfQoJCnN0YXRpYyBzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggYWNjb3VudCA9IHsKCS5uZXh0ID0gTlVMTCwKCS5uYW1lID0gImFjY291bnQiLAoJLnZlcnNpb24gPSBJUFRBQkxFU19WRVJTSU9OLAoJLnNpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB0X2lwdF9hY2NvdW50X2luZm8pKSwKCS51c2Vyc3BhY2VzaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgdF9pcHRfYWNjb3VudF9pbmZvKSksCgkuaGVscCA9ICZoZWxwLAoJLmluaXQgPSAmaW5pdCwKCS5wYXJzZSA9ICZwYXJzZSwKCS5maW5hbF9jaGVjayA9ICZmaW5hbF9jaGVjaywKCS5wcmludCA9ICZwcmludCwKCS5zYXZlID0gJnNhdmUsCgkuZXh0cmFfb3B0cyA9IG9wdHMKfTsKCi8qIEZ1bmN0aW9uIHdoaWNoIHJlZ2lzdGVycyBtYXRjaCAqLwp2b2lkIF9pbml0KHZvaWQpCnsKCXJlZ2lzdGVyX21hdGNoKCZhY2NvdW50KTsKfQoJCg==