LyoKCXRveSB2bQoJcmVnaXN0ZXIgQSwgQiA6IDMyYml0CglQQyA6IHByb2dyYW0gY291bnRlcgoKCW1lbV8gIDRieXRlIHggNjU1MzYKCgmkuaTZpMakzsy/zuGkzzRieXRluMfE6goJwqjDzaTPwbSkxjE2Yml0CgoJUiA9IEEgb3IgQgoJdmxkaVIsIGltbSAgOyBSID0gaW1tCgl2bGRSLCBpZHggICA7IFIgPSBtZW1fW2lkeF0KCXZzdFIsIGlkeCAgIDsgbWVtX1tpZHhdID0gUgoJdmFkZGlSLCBpbW0gOyBSICs9IGltbQoJdnN1YmlSLCBpbW0gOyBSIC09IGltbQoJdmFkZFIsIGlkeCAgOyBSICs9IG1lbV9baWR4XQoJdnN1YlIsIGlkeCAgOyBSIC09IG1lbV9baWR4XQoJdnB1dFIgICAgICAgOyBwcmludCBSCgl2am56Uiwgb2Zmc2V0OyBpZiAoUiAhPSAwKSB0aGVuIGptcChQQyArPSBvZmZzZXQoc2lnbmVkKSkKKi8KI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxMjAwKQoJI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDUxNCkKCSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3ODYpCiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNkZWZpbmUgWEJZQUtfTk9fT1BfTkFNRVMKI2luY2x1ZGUgInhieWFrL3hieWFrLmgiCiNpbmNsdWRlICJ4Ynlhay94Ynlha191dGlsLmgiCiNkZWZpbmUgTlVNX09GX0FSUkFZKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCgojaWZkZWYgWEJZQUs2NAoJI2Vycm9yICJvbmx5IDMyYml0IgojZW5kaWYKCnVzaW5nIG5hbWVzcGFjZSBYYnlhazsKCmNsYXNzIFRveVZtIDogcHVibGljIFhieWFrOjpDb2RlR2VuZXJhdG9yIHsKCXR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEJ1ZmZlcjsKcHVibGljOgoJZW51bSBSZWcgewoJCUEsIEIKCX07CgllbnVtIENvZGUgewoJCUxELCBMREksIFNULCBBREQsIEFEREksIFNVQiwgU1VCSSwgUFVULCBKTlosCgkJRU5EX09GX0NPREUKCX07CglUb3lWbSgpCgkJIDogbWFya18oMCkKCXsKCQk6Om1lbXNldChtZW1fLCAwLCBzaXplb2YobWVtXykpOwoJfQoJdm9pZCB2bGRpKFJlZyByLCB1aW50MTZfdCBpbW0pIHsgZW5jb2RlKExESSwgciwgaW1tKTsgfQoJdm9pZCB2bGQoUmVnIHIsIHVpbnQxNl90IGlkeCkgeyBlbmNvZGUoTEQsIHIsIGlkeCk7IH0KCXZvaWQgdnN0KFJlZyByLCB1aW50MTZfdCBpZHgpIHsgZW5jb2RlKFNULCByLCBpZHgpOyB9Cgl2b2lkIHZhZGQoUmVnIHIsIHVpbnQxNl90IGlkeCkgeyBlbmNvZGUoQURELCByLCBpZHgpOyB9Cgl2b2lkIHZhZGRpKFJlZyByLCB1aW50MTZfdCBpbW0pIHsgZW5jb2RlKEFEREksIHIsIGltbSk7IH0KCXZvaWQgdnN1YihSZWcgciwgdWludDE2X3QgaWR4KSB7IGVuY29kZShTVUIsIHIsIGlkeCk7IH0KCXZvaWQgdnN1YmkoUmVnIHIsIHVpbnQxNl90IGltbSkgeyBlbmNvZGUoU1VCSSwgciwgaW1tKTsgfQoJdm9pZCB2am56KFJlZyByLCBpbnQgb2Zmc2V0KSB7IGVuY29kZShKTlosIHIsIHN0YXRpY19jYXN0PHVpbnQxNl90PihvZmZzZXQpKTsgfQoJdm9pZCB2cHV0KFJlZyByKSB7IGVuY29kZShQVVQsIHIpOyB9Cgl2b2lkIHNldE1hcmsoKQoJewoJCW1hcmtfID0gKGludCljb2RlXy5zaXplKCk7Cgl9CglpbnQgZ2V0TWFya09mZnNldCgpCgl7CgkJcmV0dXJuIG1hcmtfIC0gKGludCljb2RlXy5zaXplKCkgLSAxOwoJfQoJdm9pZCBydW4oKQoJewoJCWJvb2wgZGVidWcgPSBmYWxzZTsvL3RydWU7CgkJdWludDMyX3QgcmVnWzJdID0geyAwLCAwIH07CgkJY29uc3Qgc2l6ZV90IGVuZCA9IGNvZGVfLnNpemUoKTsKCQl1aW50MzJfdCBwYyA9IDA7CgkJZm9yICg7OykgewoJCQl1aW50MzJfdCB4ID0gY29kZV9bcGNdOwoJCQl1aW50MzJfdCBjb2RlLCByLCBpbW07CgkJCWRlY29kZShjb2RlLCByLCBpbW0sIHgpOwoJCQlpZiAoZGVidWcpIHsKCQkJCXByaW50ZigiLS0tXG4iKTsKCQkJCXByaW50ZigiQSAlMDh4IEIgJTA4eFxuIiwgcmVnWzBdLCByZWdbMV0pOwoJCQkJcHJpbnRmKCJtZW1fW10gPSAlMDh4ICUwOHggJTA4eFxuIiwgbWVtX1swXSwgbWVtX1sxXSwgbWVtX1syXSk7CgkJCQlwcmludGYoInBjPSU0ZCwgY29kZT0lMDJ4LCByPSVkLCBpbW09JTA0eFxuIiwgcGMsIGNvZGUsIHIsIGltbSk7CgkJCX0KCQkJc3dpdGNoIChjb2RlKSB7CgkJCWNhc2UgTERJOgoJCQkJcmVnW3JdID0gaW1tOwoJCQkJYnJlYWs7CgkJCWNhc2UgTEQ6CgkJCQlyZWdbcl0gPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBTVDoKCQkJCW1lbV9baW1tXSA9IHJlZ1tyXTsKCQkJCWJyZWFrOwoJCQljYXNlIEFERDoKCQkJCXJlZ1tyXSArPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBBRERJOgoJCQkJcmVnW3JdICs9IGltbTsKCQkJCWJyZWFrOwoJCQljYXNlIFNVQjoKCQkJCXJlZ1tyXSAtPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBTVUJJOgoJCQkJcmVnW3JdIC09IGltbTsKCQkJCWJyZWFrOwoJCQljYXNlIFBVVDoKCQkJCXByaW50ZigiJWMgJThkKDB4JTA4eClcbiIsICdBJyArIHIsIHJlZ1tyXSwgcmVnW3JdKTsKCQkJCWJyZWFrOwoJCQljYXNlIEpOWjoKCQkJCWlmIChyZWdbcl0gIT0gMCkgcGMgKz0gc3RhdGljX2Nhc3Q8c2lnbmVkIHNob3J0PihpbW0pOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlhc3NlcnQoMCk7CgkJCQlicmVhazsKCQkJfQoJCQlwYysrOwoJCQlpZiAocGMgPj0gZW5kKSBicmVhazsKCQl9IC8vIGZvciAoOzspCgl9Cgl2b2lkIHJlY29tcGlsZSgpCgl7CgkJdXNpbmcgbmFtZXNwYWNlIFhieWFrOwoJCS8qCgkJCWVzaSA6IEEKCQkJZWRpIDogQgoJCQllYnggOiBtZW1fCgkJCWZvciBzcGVlZCB1cAoJCQltZW1fWzBdIDogZWF4CgkJCW1lbV9bMV0gOiBlY3gKCQkJbWVtX1syXSA6IGVkeAoJCSovCgkJcHVzaChlYngpOwoJCXB1c2goZXNpKTsKCQlwdXNoKGVkaSk7CgoJCWNvbnN0IFJlZzMyIHJlZ1syXSA9IHsgZXNpLCBlZGkgfTsKCQljb25zdCBSZWczMiBtZW0oZWJ4KTsKCgkJY29uc3QgUmVnMzIgbWVtVGJsW10gPSB7IGVheCwgZWN4LCBlZHggfTsKCQljb25zdCBzaXplX3QgbWVtVGJsTnVtID0gTlVNX09GX0FSUkFZKG1lbVRibCk7CgkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZW1UYmxOdW07IGkrKykgeG9yXyhtZW1UYmxbaV0sIG1lbVRibFtpXSk7CgoJCXhvcl8oZXNpLCBlc2kpOwoJCXhvcl8oZWRpLCBlZGkpOwoJCW1vdihtZW0sIChzaXplX3QpbWVtXyk7CgkJY29uc3Qgc2l6ZV90IGVuZCA9IGNvZGVfLnNpemUoKTsKCQl1aW50MzJfdCBwYyA9IDA7CgkJdWludDMyX3QgbGFiZWxOdW0gPSAwOwoJCWZvciAoOzspIHsKCQkJdWludDMyX3QgeCA9IGNvZGVfW3BjXTsKCQkJdWludDMyX3QgY29kZSwgciwgaW1tOwoJCQlkZWNvZGUoY29kZSwgciwgaW1tLCB4KTsKCQlMKExhYmVsOjp0b1N0cihsYWJlbE51bSsrKSk7CgkJCXN3aXRjaCAoY29kZSkgewoJCQljYXNlIExESToKCQkJCW1vdihyZWdbcl0sIGltbSk7CgkJCQlicmVhazsKCQkJY2FzZSBMRDoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQltb3YocmVnW3JdLCBtZW1UYmxbaW1tXSk7CgkJCQl9IGVsc2UgewoJCQkJCW1vdihyZWdbcl0sIHB0clttZW0gKyBpbW0gKiA0XSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBTVDoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQltb3YobWVtVGJsW2ltbV0sIHJlZ1tyXSk7CgkJCQl9IGVsc2UgewoJCQkJCW1vdihwdHIgW21lbSArIGltbSAqIDRdLCByZWdbcl0pOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgQUREOgoJCQkJaWYgKGltbSA8IG1lbVRibE51bSkgewoJCQkJCWFkZChyZWdbcl0sIG1lbVRibFtpbW1dKTsKCQkJCX0gZWxzZSB7CgkJCQkJYWRkKHJlZ1tyXSwgcHRyIFttZW0gKyBpbW0gKiA0XSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBBRERJOgoJCQkJYWRkKHJlZ1tyXSwgaW1tKTsKCQkJCWJyZWFrOwoJCQljYXNlIFNVQjoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQlzdWIocmVnW3JdLCBtZW1UYmxbaW1tXSk7CgkJCQl9IGVsc2UgewoJCQkJCXN1YihyZWdbcl0sIHB0ciBbbWVtICsgaW1tICogNF0pOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgU1VCSToKCQkJCXN1YihyZWdbcl0sIGltbSk7CgkJCQlicmVhazsKCQkJY2FzZSBQVVQ6CgkJCQl7CgkJCQkJc3RhdGljIGNvbnN0IGNoYXIgKnN0ciA9ICIlYyAlOGQoMHglMDh4KVxuIjsKCQkJCQlwdXNoKGVheCk7CgkJCQkJcHVzaChlZHgpOwoJCQkJCXB1c2goZWN4KTsKCQkJCQlwdXNoKHJlZ1tyXSk7CgkJCQkJcHVzaChyZWdbcl0pOwoJCQkJCXB1c2goJ0EnICsgcik7CgkJCQkJcHVzaCgoaW50KXN0cik7CgkJCQkJY2FsbChyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwcmludGYpKTsKCQkJCQlhZGQoZXNwLCA0ICogNCk7CgkJCQkJcG9wKGVjeCk7CgkJCQkJcG9wKGVkeCk7CgkJCQkJcG9wKGVheCk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBKTlo6CgkJCQl0ZXN0KHJlZ1tyXSwgcmVnW3JdKTsKCQkJCWpueihMYWJlbDo6dG9TdHIobGFiZWxOdW0gKyBzdGF0aWNfY2FzdDxzaWduZWQgc2hvcnQ+KGltbSkpKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYXNzZXJ0KDApOwoJCQkJYnJlYWs7CgkJCX0KCQkJcGMrKzsKCQkJaWYgKHBjID49IGVuZCkgYnJlYWs7CgkJfSAvLyBmb3IgKDs7KQoKCQlwb3AoZWRpKTsKCQlwb3AoZXNpKTsKCQlwb3AoZWJ4KTsKCQlyZXQoKTsKCX0KcHJpdmF0ZToKCXVpbnQzMl90IG1lbV9bNjU1MzZdOwoJQnVmZmVyIGNvZGVfOwoJaW50IG1hcmtfOwoJdm9pZCBkZWNvZGUodWludDMyX3QmIGNvZGUsIHVpbnQzMl90JiByLCB1aW50MzJfdCYgaW1tLCB1aW50MzJfdCB4KQoJewoJCWNvZGUgPSB4ID4+IDI0OwoJCXIgPSAoeCA+PiAxNikgJiAweGZmOwoJCWltbSA9IHggJiAweGZmZmY7Cgl9Cgl2b2lkIGVuY29kZShDb2RlIGNvZGUsIFJlZyByLCB1aW50MTZfdCBpbW0gPSAwKQoJewoJCXVpbnQzMl90IHggPSAoY29kZSA8PCAyNCkgfCAociA8PCAxNikgfCBpbW07CgkJY29kZV8ucHVzaF9iYWNrKHgpOwoJfQp9OwoKY2xhc3MgRmliIDogcHVibGljIFRveVZtIHsKcHVibGljOgoJRmliKGludCBuKQoJewoJCWlmIChuID49IDY1NTM2KSB7CgkJCWZwcmludGYoc3RkZXJyLCAiY3VycmVudCB2ZXJzaW9uIHN1cHBvcnQgb25seSBpbW0xNlxuIik7CgkJCXJldHVybjsKCQl9CgkJLyoKCQkJQSA6IGMKCQkJQiA6IHRlbXBvcmFyeQoJCQltZW1fWzBdIDogcAoJCQltZW1fWzFdIDogdAoJCQltZW1fWzJdIDogbgoJCSovCgkJdmxkaShBLCAxKTsgLy8gYwoJCXZzdChBLCAwKTsgLy8gcCgxKQoJCXZsZGkoQiwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG4pKTsKCQl2c3QoQiwgMik7IC8vIG4KCQkvLyBscAoJc2V0TWFyaygpOwoJCXZzdChBLCAxKTsgLy8gdCA9IGMKCQl2YWRkKEEsIDApOyAvLyBjICs9IHAKCQl2bGQoQiwgMSk7CgkJdnN0KEIsIDApOyAvLyBwID0gdAovLwkJdnB1dChBKTsKCQl2bGQoQiwgMik7CgkJdnN1YmkoQiwgMSk7CgkJdnN0KEIsIDIpOyAvLyBuLS0KCQl2am56KEIsIGdldE1hcmtPZmZzZXQoKSk7CgkJdnB1dChBKTsKCX0KCXZvaWQgcnVuQnlKSVQoKQoJewoJCWdldENvZGU8dm9pZCAoKikoKT4oKTsKCX0KfTsKCnZvaWQgZmliQyh1aW50MzJfdCBuKQp7Cgl1aW50MzJfdCBwLCBjLCB0OwoJcCA9IDE7CgljID0gMTsKbHA6Cgl0ID0gYzsKCWMgKz0gcDsKCXAgPSB0OwoJbi0tOwoJaWYgKG4gIT0gMCkgZ290byBscDsKCXByaW50ZigiYz0lZCgweCUwOHgpXG4iLCBjLCBjKTsKfQoKaW50IG1haW4oKQp7Cgl0cnkgewoJCWNvbnN0IGludCBuID0gMTAwMDA7CgkJRmliIGZpYihuKTsKCgkJZmliLnJlY29tcGlsZSgpOwoKCQl7CgkJCVhieWFrOjp1dGlsOjpDbG9jayBjbGs7CgkJCWNsay5iZWdpbigpOwoJCQlmaWIucnVuKCk7CgkJCWNsay5lbmQoKTsKCQkJcHJpbnRmKCJ2bSAgICAgICAlLjJmS2Nsa1xuIiwgY2xrLmdldENsb2NrKCkgKiAxZS0zKTsKCQl9CgoJCXsKCQkJWGJ5YWs6OnV0aWw6OkNsb2NrIGNsazsKCQkJY2xrLmJlZ2luKCk7CgkJCWZpYi5ydW5CeUpJVCgpOwoJCQljbGsuZW5kKCk7CgkJCXByaW50Zigiaml0ICAgICAgJS4yZktjbGtcbiIsIGNsay5nZXRDbG9jaygpICogMWUtMyk7CgkJfQoKCQl7CgkJCVhieWFrOjp1dGlsOjpDbG9jayBjbGs7CgkJCWNsay5iZWdpbigpOwoJCQlmaWJDKG4pOwoJCQljbGsuZW5kKCk7CgkJCXByaW50ZigibmF0aXZlIEMgJS4yZktjbGtcbiIsIGNsay5nZXRDbG9jaygpICogMWUtMyk7CgkJfQoJfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKCQlwcmludGYoIkVSUjolc1xuIiwgZS53aGF0KCkpOwoJfSBjYXRjaCAoLi4uKSB7CgkJcHJpbnRmKCJ1bmtub3duIGVycm9yXG4iKTsKCX0KCXJldHVybiAwOwp9CgovKgoJdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IFhieWFrCiAgIHB1c2ggICAgICAgIGVieAogICBwdXNoICAgICAgICBlc2kKICAgcHVzaCAgICAgICAgZWRpCiAgIHhvciAgICAgICAgIGVheCxlYXgKICAgeG9yICAgICAgICAgZWN4LGVjeAogICB4b3IgICAgICAgICBlZHgsZWR4CiAgIHhvciAgICAgICAgIGVzaSxlc2kKICAgeG9yICAgICAgICAgZWRpLGVkaQogICBtb3YgICAgICAgICBlYngsMEVGRjU4aAogICBtb3YgICAgICAgICBlc2ksMQogICBtb3YgICAgICAgICBlYXgsZXNpCiAgIG1vdiAgICAgICAgIGVkaSwyNzEwaAogICBtb3YgICAgICAgICBlZHgsZWRpCi5scDoKICAgbW92ICAgICAgICAgZWN4LGVzaQogICBhZGQgICAgICAgICBlc2ksZWF4CiAgIG1vdiAgICAgICAgIGVkaSxlY3gKICAgbW92ICAgICAgICAgZWF4LGVkaQogICBtb3YgICAgICAgICBlZGksZWR4CiAgIHN1YiAgICAgICAgIGVkaSwxCiAgIG1vdiAgICAgICAgIGVkeCxlZGkKICAgdGVzdCAgICAgICAgZWRpLGVkaQogICBqbmUgICAgICAgICAubHAKICAgcHVzaCAgICAgICAgZWF4CiAgIHB1c2ggICAgICAgIGVkeAogICBwdXNoICAgICAgICBlY3gKICAgcHVzaCAgICAgICAgZXNpCiAgIHB1c2ggICAgICAgIGVzaQogICBwdXNoICAgICAgICA0MWgKICAgcHVzaCAgICAgICAgNDJDNDM0aAogICBjYWxsICAgICAgICBwcmludGYgKDQwOTM0MmgpCiAgIGFkZCAgICAgICAgIGVzcCwxMGgKICAgcG9wICAgICAgICAgZWN4CiAgIHBvcCAgICAgICAgIGVkeAogICBwb3AgICAgICAgICBlYXgKICAgcG9wICAgICAgICAgZWRpCiAgIHBvcCAgICAgICAgIGVzaQogICBwb3AgICAgICAgICBlYngKICAgcmV0CiovCg==