LyoKICogUUVNVSBBY2VyIFBpY2EgTWFjaGluZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoYykgMjAwNyBIZXJ26SBQb3Vzc2luZWF1CiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICogVEhFIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJ2bC5oIgoKI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KI2RlZmluZSBCSU9TX0ZJTEVOQU1FICJtaXBzX2Jpb3MuYmluIgojZWxzZQojZGVmaW5lIEJJT1NfRklMRU5BTUUgIm1pcHNlbF9iaW9zLmJpbiIKI2VuZGlmCgojaWZkZWYgVEFSR0VUX01JUFM2NAojZGVmaW5lIFBIWVNfVE9fVklSVCh4KSAoKHgpIHwgfjB4N2ZmZmZmZmZVTEwpCiNlbHNlCiNkZWZpbmUgUEhZU19UT19WSVJUKHgpICgoeCkgfCB+MHg3ZmZmZmZmZlUpCiNlbmRpZgoKI2RlZmluZSBWSVJUX1RPX1BIWVNfQURERU5EICgtKChpbnQ2NF90KShpbnQzMl90KTB4ODAwMDAwMDApKQoKc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlWzJdID0geyAweDFmMCwgMHgxNzAgfTsKc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlMlsyXSA9IHsgMHgzZjYsIDB4Mzc2IH07CnN0YXRpYyBjb25zdCBpbnQgaWRlX2lycVsyXSA9IHsgMTQsIDE1IH07CgpzdGF0aWMgdWludDMyX3Qgc2VyaWFsX2Jhc2VbTUFYX1NFUklBTF9QT1JUU10gPSB7IDB4ODAwMDYwMDAsIDB4ODAwMDcwMDAgfTsKc3RhdGljIGludCBzZXJpYWxfaXJxW01BWF9TRVJJQUxfUE9SVFNdID0geyA4LCA5IH07CgpleHRlcm4gRklMRSAqbG9nZmlsZTsKCnN0YXRpYyB2b2lkIG1haW5fY3B1X3Jlc2V0KHZvaWQgKm9wYXF1ZSkKewogICAgQ1BVU3RhdGUgKmVudiA9IG9wYXF1ZTsKICAgIGNwdV9yZXNldChlbnYpOwogICAgY3B1X21pcHNfcmVnaXN0ZXIoZW52LCBOVUxMKTsKfQoKc3RhdGljCnZvaWQgbWlwc19waWNhNjFfaW5pdCAoaW50IHJhbV9zaXplLCBpbnQgdmdhX3JhbV9zaXplLCBpbnQgYm9vdF9kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVN0YXRlICpkcywgY29uc3QgY2hhciAqKmZkX2ZpbGVuYW1lLCBpbnQgc25hcHNob3QsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLCBjb25zdCBjaGFyICprZXJuZWxfY21kbGluZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0cmRfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKewogICAgY2hhciBidWZbMTAyNF07CiAgICB1bnNpZ25lZCBsb25nIGJpb3Nfb2Zmc2V0OwogICAgaW50IGJpb3Nfc2l6ZTsKICAgIENQVVN0YXRlICplbnY7CiAgICBpbnQgaTsKICAgIG1pcHNfZGVmX3QgKmRlZjsKICAgIGludCBhdmFpbGFibGVfcmFtOwogICAgcWVtdV9pcnEgKmk4MjU5OwoKICAgIC8qIGluaXQgQ1BVcyAqLwogICAgaWYgKGNwdV9tb2RlbCA9PSBOVUxMKSB7CiNpZmRlZiBUQVJHRVRfTUlQUzY0CiAgICAgICAgY3B1X21vZGVsID0gIlI0MDAwIjsKI2Vsc2UKICAgICAgICAvKiBGSVhNRTogQWxsIHdyb25nLCB0aGlzIG1heWJlIHNob3VsZCBiZSBSMzAwMCBmb3IgdGhlIG9sZGVyIFBJQ0FzLiAqLwogICAgICAgIGNwdV9tb2RlbCA9ICIyNEtmIjsKI2VuZGlmCiAgICB9CiAgICBpZiAobWlwc19maW5kX2J5X25hbWUoY3B1X21vZGVsLCAmZGVmKSAhPSAwKQogICAgICAgIGRlZiA9IE5VTEw7CiAgICBlbnYgPSBjcHVfaW5pdCgpOwogICAgY3B1X21pcHNfcmVnaXN0ZXIoZW52LCBkZWYpOwogICAgcmVnaXN0ZXJfc2F2ZXZtKCJjcHUiLCAwLCAzLCBjcHVfc2F2ZSwgY3B1X2xvYWQsIGVudik7CiAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KG1haW5fY3B1X3Jlc2V0LCBlbnYpOwoKICAgIC8qIGFsbG9jYXRlIFJBTSAobGltaXRlZCB0byAyNTYgTUIpICovCiAgICBpZiAocmFtX3NpemUgPCAyNTYgKiAxMDI0ICogMTAyNCkKICAgICAgICBhdmFpbGFibGVfcmFtID0gcmFtX3NpemU7CiAgICBlbHNlCiAgICAgICAgYXZhaWxhYmxlX3JhbSA9IDI1NiAqIDEwMjQgKiAxMDI0OwogICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeSgwLCBhdmFpbGFibGVfcmFtLCBJT19NRU1fUkFNKTsKCiAgICAvKiBsb2FkIGEgQklPUyBpbWFnZSAqLwogICAgYmlvc19vZmZzZXQgPSByYW1fc2l6ZSArIHZnYV9yYW1fc2l6ZTsKICAgIGlmIChiaW9zX25hbWUgPT0gTlVMTCkKICAgICAgICBiaW9zX25hbWUgPSBCSU9TX0ZJTEVOQU1FOwogICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLyVzIiwgYmlvc19kaXIsIGJpb3NfbmFtZSk7CiAgICBiaW9zX3NpemUgPSBsb2FkX2ltYWdlKGJ1ZiwgcGh5c19yYW1fYmFzZSArIGJpb3Nfb2Zmc2V0KTsKICAgIGlmICgoYmlvc19zaXplIDw9IDApIHx8IChiaW9zX3NpemUgPiBCSU9TX1NJWkUpKSB7CiAgICAgICAgLyogZmF0YWwgKi8KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IEVycm9yLCBjb3VsZCBub3QgbG9hZCBNSVBTIGJpb3MgJyVzJ1xuIiwKICAgICAgICAgICAgICAgIGJ1Zik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHgxZmMwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJT1NfU0laRSwgYmlvc19vZmZzZXQgfCBJT19NRU1fUk9NKTsKCiAgICAvKiBEZXZpY2UgbWFwCiAgICAgKgogICAgICogYWRkciAweGUwMDA0MDAwOiBtYzE0NjgxOAogICAgICogYWRkciAweGUwMDA1MDAwIGludHIgNjogcHMyIGtleWJvYXJkCiAgICAgKiBhZGRyIDB4ZTAwMDUwMDAgaW50ciA3OiBwczIgbW91c2UKICAgICAqIGFkZHIgMHhlMDAwNjAwMCBpbnRyIDg6IG5zMTY1NTBhLAogICAgICogYWRkciAweGUwMDA3MDAwIGludHIgOTogbnMxNjU1MGEKICAgICAqIGlzYV9pb19iYXNlIDB4ZTIwMDAwMDAgaXNhX21lbV9iYXNlIDB4ZTMwMDAwMDAKICAgICAqLwoKICAgIC8qIEluaXQgQ1BVIGludGVybmFsIGRldmljZXMgKi8KICAgIGNwdV9taXBzX2lycV9pbml0X2NwdShlbnYpOwogICAgY3B1X21pcHNfY2xvY2tfaW5pdChlbnYpOwogICAgY3B1X21pcHNfaXJxY3RybF9pbml0KCk7CgogICAgLyogUmVnaXN0ZXIgNjQgS0Igb2YgSVNBIElPIHNwYWNlIGF0IDB4MTAwMDAwMDAgKi8KICAgIGlzYV9tbWlvX2luaXQoMHgxMDAwMDAwMCwgMHgwMDAxMDAwMCk7CiAgICBpc2FfbWVtX2Jhc2UgPSAweDExMDAwMDAwOwoKICAgIC8qIFBDIHN0eWxlIElSUSAoaTgyNTkvaTgyNTQpIGFuZCBETUEgKGk4MjU3KSAqLwogICAgLyogVGhlIFBJQyBpcyBhdHRhY2hlZCB0byB0aGUgTUlQUyBDUFUgSU5UMCBwaW4gKi8KICAgIGk4MjU5ID0gaTgyNTlfaW5pdChlbnYtPmlycVsyXSk7CiAgICBydGNfbW1faW5pdCgweDgwMDA0MDcwLCAxLCBpODI1OVsxNF0pOwogICAgcGl0X2luaXQoMHg0MCwgMCk7CgogICAgLyogS2V5Ym9hcmQgKGk4MDQyKSAqLwogICAgaTgwNDJfbW1faW5pdChpODI1OVs2XSwgaTgyNTlbN10sIDB4ODAwMDUwNjAsIDApOwoKICAgIC8qIElERSBjb250cm9sbGVyICovCiAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspCiAgICAgICAgaXNhX2lkZV9pbml0KGlkZV9pb2Jhc2VbaV0sIGlkZV9pb2Jhc2UyW2ldLCBpODI1OVtpZGVfaXJxW2ldXSwKICAgICAgICAgICAgICAgICAgICAgYnNfdGFibGVbMiAqIGldLCBic190YWJsZVsyICogaSArIDFdKTsKCiAgICAvKiBOZXR3b3JrIGNvbnRyb2xsZXIgKi8KICAgIC8qIEZJWE1FOiBtaXNzaW5nIE5TIFNPTklDIERQODM5MzIgKi8KCiAgICAvKiBTQ1NJIGFkYXB0ZXIgKi8KICAgIC8qIEZJWE1FOiBtaXNzaW5nIE5DUiA1M0M5NCAqLwoKICAgIC8qIElTQSBkZXZpY2VzIChmbG9wcHksIHNlcmlhbCwgcGFyYWxsZWwpICovCiAgICBmZGN0cmxfaW5pdChpODI1OVsxXSwgMSwgMSwgMHg4MDAwMzAwMCwgZmRfdGFibGUpOwogICAgZm9yKGkgPSAwOyBpIDwgTUFYX1NFUklBTF9QT1JUUzsgaSsrKSB7CiAgICAgICAgaWYgKHNlcmlhbF9oZHNbaV0pIHsKICAgICAgICAgICAgc2VyaWFsX21tX2luaXQoc2VyaWFsX2Jhc2VbaV0sIDAsIGk4MjU5W3NlcmlhbF9pcnFbaV1dLCBzZXJpYWxfaGRzW2ldLCAxKTsKICAgICAgICB9CiAgICB9CiAgICAvKiBQYXJhbGxlbCBwb3J0ICovCiAgICBpZiAocGFyYWxsZWxfaGRzWzBdKSBwYXJhbGxlbF9tbV9pbml0KDB4ODAwMDgwMDAsIDAsIGk4MjU5WzFdLCBwYXJhbGxlbF9oZHNbMF0pOwoKICAgIC8qIFNvdW5kIGNhcmQgKi8KICAgIC8qIEZJWE1FOiBtaXNzaW5nIEphenogc291bmQsIElSUSAxOCAqLwoKICAgIC8qIExFRCBpbmRpY2F0b3IgKi8KICAgIC8qIEZJWE1FOiBtaXNzaW5nIExFRCBpbmRpY2F0b3IgKi8KCiAgICAvKiBOVlJBTSAqLwogICAgZHMxMjI1eV9pbml0KDB4ODAwMDkwMDAsICJudnJhbSIpOwoKICAgIC8qIFZpZGVvIGNhcmQgKi8KICAgIC8qIEZJWE1FOiBUaGlzIGNhcmQgaXMgbm90IHRoZSByZWFsIG9uZSB3aGljaCB3YXMgaW4gdGhlIG9yaWdpbmFsIFBJQ0EsCiAgICAgKiBidXQgbGV0J3MgZG8gd2l0aCB3aGF0IFFlbXUgY3VycmVubHkgZW11bGF0ZXMuLi4gKi8KICAgIGlzYV92Z2FfbW1faW5pdChkcywgcGh5c19yYW1fYmFzZSArIHJhbV9zaXplLCByYW1fc2l6ZSwgdmdhX3JhbV9zaXplLAogICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAsIDB4NjAwMDAwMDAsIDApOwoKICAgIC8qIExFRCBpbmRpY2F0b3IgKi8KICAgIGphenpfbGVkX2luaXQoZHMsIDB4ODAwMGYwMDApOwp9CgpRRU1VTWFjaGluZSBtaXBzX3BpY2E2MV9tYWNoaW5lID0gewogICAgInBpY2E2MSIsCiAgICAiQWNlciBQaWNhIDYxIiwKICAgIG1pcHNfcGljYTYxX2luaXQsCn07Cg==