U3VibWl0dGVkIEJ5OiBKaW0gR2lmZm9yZCAocGF0Y2hlcyBhdCBqZzU1NSBkb3QgY29tKQpEYXRlOiAyMDA1LTA4LTMxCkluaXRpYWwgUGFja2FnZSBWZXJzaW9uOiAwLjk3Ck9yaWdpbjogT3BlblNvbGFyaXMsIEpvZSBDaWNjb25lLCBKaW0gR2lmZm9yZApVcHN0cmVhbSBTdGF0dXM6IE4vQQpEZXNjcmlwdGlvbjogQWRkcyBzdXBwb3J0IGZvciBGb3JjZWRldGggYW5kIG90aGVyIE5JQydzCgkgICAgIEZpeGVzIGZvciBHQ0MgNC54CgkgICAgIFJlbW92YWwgb2YgYmFkIG5ldHdvcmsgZHJpdmVycwogCkluZGV4OiBiL2NvbmZpZ3VyZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTg3Miw0NyArODcyLDMyIEBACiAgIC0tZGlzYWJsZS1wYWNrZXQtcmV0cmFuc21pc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybiBvZmYgcGFja2V0IHJldHJhbnNtaXNzaW9uCiAgIC0tZW5hYmxlLXBjaS1kaXJlY3QgICAgIGFjY2VzcyBQQ0kgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBCSU9TCi0gIC0tZW5hYmxlLTNjNTA5ICAgICAgICAgIGVuYWJsZSAzQ29tNTA5IGRyaXZlcgotICAtLWVuYWJsZS0zYzUyOSAgICAgICAgICBlbmFibGUgM0NvbTUyOSBkcml2ZXIKICAgLS1lbmFibGUtM2M1OTUgICAgICAgICAgZW5hYmxlIDNDb201OTUgZHJpdmVyCiAgIC0tZW5hYmxlLTNjOTB4ICAgICAgICAgIGVuYWJsZSAzQ29tOTB4IGRyaXZlcgotICAtLWVuYWJsZS1jczg5eDAgICAgICAgICBlbmFibGUgQ1M4OXgwIGRyaXZlcgogICAtLWVuYWJsZS1kYXZpY29tICAgICAgICBlbmFibGUgRGF2aWNvbSBkcml2ZXIKLSAgLS1lbmFibGUtZGVwY2EgICAgICAgICAgZW5hYmxlIERFUENBIGFuZCBFdGhlcldPUktTIGRyaXZlcgotICAtLWVuYWJsZS1lZXBybyAgICAgICAgICBlbmFibGUgRXRoZXJleHByZXNzIFByby8xMCBkcml2ZXIKKyAgLS1lbmFibGUtZTEwMDAgICAgICAgICAgZW5hYmxlIEV0aGVyZXhwcmVzcyBQcm8vMTAwMCBkcml2ZXIKICAgLS1lbmFibGUtZWVwcm8xMDAgICAgICAgZW5hYmxlIEV0aGVyZXhwcmVzcyBQcm8vMTAwIGRyaXZlcgogICAtLWVuYWJsZS1lcGljMTAwICAgICAgICBlbmFibGUgU01DIDgzYzE3MCBFUElDLzEwMCBkcml2ZXIKLSAgLS1lbmFibGUtM2M1MDcgICAgICAgICAgZW5hYmxlIDNDb201MDcgZHJpdmVyCi0gIC0tZW5hYmxlLWV4b3MyMDUgICAgICAgIGVuYWJsZSBFWE9TMjA1IGRyaXZlcgotICAtLWVuYWJsZS1uaTUyMTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk1MjEwIGRyaXZlcgotICAtLWVuYWJsZS1sYW5jZSAgICAgICAgICBlbmFibGUgTGFuY2UgUENJIFBDTmV0LzMyIGRyaXZlcgotICAtLWVuYWJsZS1uZTIxMDAgICAgICAgICBlbmFibGUgTm92ZWxsIE5FMjEwMCBkcml2ZXIKLSAgLS1lbmFibGUtbmk2NTEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNjUxMCBkcml2ZXIKKyAgLS1lbmFibGUtZm9yY2VkZXRoICAgICAgZW5hYmxlIE52aWRpYSBHZWZvcmNlIGRyaXZlcgogICAtLWVuYWJsZS1uYXRzZW1pICAgICAgICBlbmFibGUgTmF0U2VtaSBEUDgzODF4IGRyaXZlcgotICAtLWVuYWJsZS1uaTUwMTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk1MDEwIGRyaXZlcgotICAtLWVuYWJsZS0zYzUwMyAgICAgICAgICBlbmFibGUgM0NvbTUwMyBkcml2ZXIKLSAgLS1lbmFibGUtbmUgICAgICAgICAgICAgZW5hYmxlIE5FMTAwMC8yMDAwIElTQSBkcml2ZXIKKyAgLS1lbmFibGUtbnM4MzgyMCAgICAgICAgZW5hYmxlIE5TODM4MjAgZHJpdmVyCiAgIC0tZW5hYmxlLW5zODM5MCAgICAgICAgIGVuYWJsZSBORTIwMDAgUENJIGRyaXZlcgotICAtLWVuYWJsZS13ZCAgICAgICAgICAgICBlbmFibGUgV0Q4MDAzLzgwMTMsIFNNQzgyMTYvODQxNiBkcml2ZXIKLSAgLS1lbmFibGUtb3R1bGlwICAgICAgICAgZW5hYmxlIG9sZCBUdWxpcCBkcml2ZXIKKyAgLS1lbmFibGUtcGNuZXQzMiAgICAgICAgZW5hYmxlIEFNRCBMYW5jZS9QQ0kgUENOZXQvMzIgZHJpdmVyCisgIC0tZW5hYmxlLXBuaWMgICAgICAgICAgIGVuYWJsZSBCb2NocyBQc2V1ZG8gTmljIGRyaXZlcgogICAtLWVuYWJsZS1ydGw4MTM5ICAgICAgICBlbmFibGUgUmVhbHRlayA4MTM5IGRyaXZlcgorICAtLWVuYWJsZS1yODE2OSAgICAgICAgICBlbmFibGUgUmVhbHRlayA4MTY5IGRyaXZlcgogICAtLWVuYWJsZS1zaXM5MDAgICAgICAgICBlbmFibGUgU0lTIDkwMCBhbmQgU0lTIDcwMTYgZHJpdmVyCi0gIC0tZW5hYmxlLXNrLWcxNiAgICAgICAgIGVuYWJsZSBTY2huZWlkZXIgYW5kIEtvY2ggRzE2IGRyaXZlcgotICAtLWVuYWJsZS1zbWM5MDAwICAgICAgICBlbmFibGUgU01DOTAwMCBkcml2ZXIKLSAgLS1lbmFibGUtdGlhcmEgICAgICAgICAgZW5hYmxlIFRpYXJhIGRyaXZlcgorICAtLWVuYWJsZS10ZzMgICAgICAgICAgICBlbmFibGUgQnJvYWRjb20gVGlnb24zIGRyaXZlcgogICAtLWVuYWJsZS10dWxpcCAgICAgICAgICBlbmFibGUgVHVsaXAgZHJpdmVyCisgIC0tZW5hYmxlLXRsYW4gICAgICAgICAgIGVuYWJsZSBUSSBUaHVuZGVyTEFOIGRyaXZlcgorICAtLWVuYWJsZS11bmRpICAgICAgICAgICBlbmFibGUgUFhFIFVOREkgZHJpdmVyCiAgIC0tZW5hYmxlLXZpYS1yaGluZSAgICAgIGVuYWJsZSBSaGluZS1JL0lJIGRyaXZlcgotICAtLWVuYWJsZS13ODljODQwICAgICAgICBlbmFibGUgV2luYm9uZCBXODljODQwLCBDb21wZXggUkwxMDAtQVRYIGRyaXZlcgotICAtLWVuYWJsZS0zYzUwMy1zaG1lbSAgICB1c2UgM2M1MDMgc2hhcmVkIG1lbW9yeSBtb2RlCi0gIC0tZW5hYmxlLTNjNTAzLWF1aSAgICAgIHVzZSBBVUkgYnkgZGVmYXVsdCBvbiAzYzUwMyBjYXJkcworICAtLWVuYWJsZS13ODljODQwICAgICAgICBlbmFibGUgV2luYm9uZCBXODljODQwIGRyaXZlcgogICAtLWVuYWJsZS1jb21wZXgtcmwyMDAwLWZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgaWYgeW91IGhhdmUgYSBDb21wZXggUkwyMDAwIFBDSQotICAtLWVuYWJsZS1zbWM5MDAwLXNjYW49TElTVAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSBmb3IgU01DOTAwMCBJL08gYWRkcmVzc2VzIHVzaW5nIExJU1QKICAgLS1lbmFibGUtbmUtc2Nhbj1MSVNUICAgcHJvYmUgZm9yIE5FIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUCiAgIC0tZW5hYmxlLXdkLWRlZmF1bHQtbWVtPU1FTQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIGRlZmF1bHQgbWVtb3J5IGxvY2F0aW9uIGZvciBXRC9TTUMKLSAgLS1lbmFibGUtY3Mtc2Nhbj1MSVNUICAgcHJvYmUgZm9yIENTODl4MCBiYXNlIGFkZHJlc3MgdXNpbmcgTElTVAogICAtLWVuYWJsZS1kaXNrbGVzcyAgICAgICBlbmFibGUgZGlza2xlc3Mgc3VwcG9ydAogICAtLWRpc2FibGUtZ3JhcGhpY3MgICAgICBkaXNhYmxlIGdyYXBoaWNzIHRlcm1pbmFsIHN1cHBvcnQKICAgLS1kaXNhYmxlLWhlcmN1bGVzICAgICAgZGlzYWJsZSBoZXJjdWxlcyB0ZXJtaW5hbCBzdXBwb3J0CkBAIC01NTM3LDcgKzU1MjIsNyBAQAogCiBmaTsKIGlmIHRlc3QgIngkZW5hYmxlX3BhY2tldF9yZXRyYW5zbWlzc2lvbiIgIT0geG5vOyB0aGVuCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDT05HRVNURUQ9MSIKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIC1EQ09ORklHX1BDSSIKIGZpCiAKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wY2ktZGlyZWN0IG9yIC0tZGlzYWJsZS1wY2ktZGlyZWN0IHdhcyBnaXZlbi4KQEAgLTU1NDksMjYgKzU1MzQsNiBAQAogICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09ORklHX1BDSV9ESVJFQ1Q9MSIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwOSBvciAtLWRpc2FibGUtM2M1MDkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTA5IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA5IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA5IgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MDkubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUyOSBvciAtLWRpc2FibGUtM2M1Mjkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1Mjkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTI5IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTI5IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTI5PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUyOS5vIgotZmkKLQogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTk1IG9yIC0tZGlzYWJsZS0zYzU5NSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV8zYzU5NStzZXR9IiA9IHNldDsgdGhlbgogICBlbmFibGV2YWw9IiRlbmFibGVfM2M1OTUiCkBAIC01NTg5LDE2ICs1NTU0LDYgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjOTB4Lm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY3M4OXgwIG9yIC0tZGlzYWJsZS1jczg5eDAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY3M4OXgwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jczg5eDAiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfY3M4OXgwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0NTODlYMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgY3M4OXgwLm8iCi1maQotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGF2aWNvbSBvciAtLWRpc2FibGUtZGF2aWNvbSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9kYXZpY29tK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9kYXZpY29tIgpAQCAtNTYwOSwyNCArNTU2NCwxNCBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGF2aWNvbS5vIgogZmkKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGNhIG9yIC0tZGlzYWJsZS1kZXBjYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBjYStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZGVwY2EiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZTEwMDAgb3IgLS1kaXNhYmxlLWUxMDAwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2UxMDAwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9lMTAwMCIKIAogZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBjYSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ERVBDQT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGVwY2EubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lZXBybyBvciAtLWRpc2FibGUtZWVwcm8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZWVwcm8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2VlcHJvIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX2VlcHJvIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VFUFJPPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlZXByby5vIgoraWYgdGVzdCAieCRlbmFibGVfZTEwMDAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfRTEwMDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGUxMDAwLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZWVwcm8xMDAgb3IgLS1kaXNhYmxlLWVlcHJvMTAwIHdhcyBnaXZlbi4KQEAgLTU2NDksNjQgKzU1OTQsMTQgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGVwaWMxMDAubyIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwNyBvciAtLWRpc2FibGUtM2M1MDcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTA3IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA3IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA3PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwNy5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4b3MyMDUgb3IgLS1kaXNhYmxlLWV4b3MyMDUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZXhvczIwNStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZXhvczIwNSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9leG9zMjA1IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VYT1MyMDU9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGV4b3MyMDUubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uaTUyMTAgb3IgLS1kaXNhYmxlLW5pNTIxMCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9uaTUyMTArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25pNTIxMCIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9uaTUyMTAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MjEwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUyMTAubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYW5jZSBvciAtLWRpc2FibGUtbGFuY2Ugd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGFuY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xhbmNlIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX2xhbmNlIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0xBTkNFPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBsYW5jZS5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5lMjEwMCBvciAtLWRpc2FibGUtbmUyMTAwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25lMjEwMCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmUyMTAwIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX25lMjEwMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORTIxMDA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5lMjEwMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5pNjUxMCBvciAtLWRpc2FibGUtbmk2NTEwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25pNjUxMCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmk2NTEwIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZvcmNlZGV0aCBvciAtLWRpc2FibGUtZm9yY2VkZXRoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZvcmNlZGV0aCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZm9yY2VkZXRoIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX25pNjUxMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTY1MTA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNjUxMC5vIgoraWYgdGVzdCAieCRlbmFibGVfZm9yY2VkZXRoIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0ZPUkNFREVUSD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZm9yY2VkZXRoLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmF0c2VtaSBvciAtLWRpc2FibGUtbmF0c2VtaSB3YXMgZ2l2ZW4uCkBAIC01NzE5LDM0ICs1NjE0LDE0IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuYXRzZW1pLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmk1MDEwIG9yIC0tZGlzYWJsZS1uaTUwMTAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmk1MDEwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9uaTUwMTAiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbnM4MzgyMCBvciAtLWRpc2FibGUtbnM4MzgyMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uczgzODIwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9uczgzODIwIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX25pNTAxMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTUwMTA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNTAxMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTAzIG9yIC0tZGlzYWJsZS0zYzUwMyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV8zYzUwMytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfM2M1MDMiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfM2M1MDMiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1MDM9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTAzLm8iCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmUgb3IgLS1kaXNhYmxlLW5lIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9uZSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9uZSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmUubyIKK2lmIHRlc3QgIngkZW5hYmxlX25zODM4MjAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTlM4MzgyMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbnM4MzgyMC5vIgogZmkKIAogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5zODM5MCBvciAtLWRpc2FibGUtbnM4MzkwIHdhcyBnaXZlbi4KQEAgLTU3NTksMjQgKzU2MzQsMjQgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5zODM5MC5vIgogZmkKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXdkIG9yIC0tZGlzYWJsZS13ZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV93ZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfd2QiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGNuZXQzMiBvciAtLWRpc2FibGUtcGNuZXQzMiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wY25ldDMyK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wY25ldDMyIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX3dkIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1dEPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB3ZC5vIgoraWYgdGVzdCAieCRlbmFibGVfcGNuZXQzMiIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9QQ05FVDMyPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBwY25ldDMyLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtb3R1bGlwIG9yIC0tZGlzYWJsZS1vdHVsaXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfb3R1bGlwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9vdHVsaXAiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcG5pYyBvciAtLWRpc2FibGUtcG5pYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wbmljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wbmljIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX290dWxpcCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9PVFVMSVA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG90dWxpcC5vIgoraWYgdGVzdCAieCRlbmFibGVfcG5pYyIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9QTklDPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBwbmljLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnRsODEzOSBvciAtLWRpc2FibGUtcnRsODEzOSB3YXMgZ2l2ZW4uCkBAIC01Nzg5LDYgKzU2NjQsMTYgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHJ0bDgxMzkubyIKIGZpCiAKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yODE2OSBvciAtLWRpc2FibGUtcjgxNjkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcjgxNjkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3I4MTY5IgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX3I4MTY5IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1I4MTY5PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyByODE2OS5vIgorZmkKKwogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpczkwMCBvciAtLWRpc2FibGUtc2lzOTAwIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX3NpczkwMCtzZXR9IiA9IHNldDsgdGhlbgogICBlbmFibGV2YWw9IiRlbmFibGVfc2lzOTAwIgpAQCAtNTc5OSwzNCArNTY4NCwxNCBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2lzOTAwLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2stZzE2IG9yIC0tZGlzYWJsZS1zay1nMTYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2tfZzE2K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9za19nMTYiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfc2tfZzE2IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1NLX0cxNj0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2tfZzE2Lm8iCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc21jOTAwMCBvciAtLWRpc2FibGUtc21jOTAwMCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zbWM5MDAwIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX3NtYzkwMDAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU01DOTAwMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc21jOTAwMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRpYXJhIG9yIC0tZGlzYWJsZS10aWFyYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90aWFyYStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGlhcmEiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGczIG9yIC0tZGlzYWJsZS10ZzMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGczK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90ZzMiCiAKIGZpOwotaWYgdGVzdCAieCRlbmFibGVfdGlhcmEiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVElBUkE9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRpYXJhLm8iCitpZiB0ZXN0ICJ4JGVuYWJsZV90ZzMiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVEczPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0ZzMubyIKIGZpCiAKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10dWxpcCBvciAtLWRpc2FibGUtdHVsaXAgd2FzIGdpdmVuLgpAQCAtNTgzOSw2ICs1NzA0LDE2IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0dWxpcC5vIgogZmkKIAorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRsYW4gb3IgLS1kaXNhYmxlLXRsYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGxhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdGxhbiIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV90bGFuIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1RMQU49MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRsYW4ubyIKK2ZpCisKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12aWEtcmhpbmUgb3IgLS1kaXNhYmxlLXZpYS1yaGluZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV92aWFfcmhpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZW5hYmxldmFsPSIkZW5hYmxlX3ZpYV9yaGluZSIKQEAgLTU4NzMsMjQgKzU3NDgsNiBAQAogICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19URlRQPTEiCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1MDMtc2htZW0gb3IgLS1kaXNhYmxlLTNjNTAzLXNobWVtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlXzNjNTAzX3NobWVtK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUwM19zaG1lbSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwM19zaG1lbSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURUNTAzX1NITUVNPTEiCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1MDMtYXVpIG9yIC0tZGlzYWJsZS0zYzUwMy1hdWkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDNfYXVpK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUwM19hdWkiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfM2M1MDNfYXVpIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFQ1MDNfQVVJPTEiCi1maQotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tcGV4LXJsMjAwMC1maXggb3IgLS1kaXNhYmxlLWNvbXBleC1ybDIwMDAtZml4IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2NvbXBleF9ybDIwMDBfZml4K3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21wZXhfcmwyMDAwX2ZpeCIKQEAgLTU5MDAsMTIgKzU3NTcsNiBAQAogICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09NUEVYX1JMMjAwMF9GSVg9MSIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zbWM5MDAwLXNjYW4gb3IgLS1kaXNhYmxlLXNtYzkwMDAtc2NhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwX3NjYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NtYzkwMDBfc2NhbiIKLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFNNQzkwMDBfU0NBTj0kZW5hYmxlX3NtYzkwMDBfc2NhbiIKLWZpOwotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmUtc2NhbiBvciAtLWRpc2FibGUtbmUtc2NhbiB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9uZV9zY2FuK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9uZV9zY2FuIgpAQCAtNTkyMiwxMiArNTc3Myw2IEBACiAgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURXRF9ERUZBVUxUX01FTT0weENDMDAwIgogZmk7CiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jcy1zY2FuIG9yIC0tZGlzYWJsZS1jcy1zY2FuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NzX3NjYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NzX3NjYW4iCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDU19TQ0FOPSRlbmFibGVfY3Nfc2NhbiIKLWZpOwotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGlza2xlc3Mgb3IgLS1kaXNhYmxlLWRpc2tsZXNzIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2Rpc2tsZXNzK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9kaXNrbGVzcyIKSW5kZXg6IGIvY29uZmlndXJlLmFjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgIFsgIC0tZGlzYWJsZS1wYWNrZXQtcmV0cmFuc21pc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybiBvZmYgcGFja2V0IHJldHJhbnNtaXNzaW9uXSkKIGlmIHRlc3QgIngkZW5hYmxlX3BhY2tldF9yZXRyYW5zbWlzc2lvbiIgIT0geG5vOyB0aGVuCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDT05HRVNURUQ9MSIKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIC1EQ09ORklHX1BDSSIKIGZpCiAKIEFDX0FSR19FTkFCTEUocGNpLWRpcmVjdCwKQEAgLTM1NCwyMCArMzU0LDYgQEAKIGZpCiAKIGRubCBEZXZpY2UgZHJpdmVycy4KLUFDX0FSR19FTkFCTEUoM2M1MDksCi0gIFsgIC0tZW5hYmxlLTNjNTA5ICAgICAgICAgIGVuYWJsZSAzQ29tNTA5IGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwOSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV8zQzUwOSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTA5Lm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKDNjNTI5LAotICBbICAtLWVuYWJsZS0zYzUyOSAgICAgICAgICBlbmFibGUgM0NvbTUyOSBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfM2M1MjkiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1Mjk9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTI5Lm8iCi1maQotCiBBQ19BUkdfRU5BQkxFKDNjNTk1LAogICBbICAtLWVuYWJsZS0zYzU5NSAgICAgICAgICBlbmFibGUgM0NvbTU5NSBkcml2ZXJdKQogaWYgdGVzdCAieCRlbmFibGVfM2M1OTUiID0geHllczsgdGhlbgpAQCAtMzgyLDEzICszNjgsNiBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M5MHgubyIKIGZpCiAKLUFDX0FSR19FTkFCTEUoY3M4OXgwLAotICBbICAtLWVuYWJsZS1jczg5eDAgICAgICAgICBlbmFibGUgQ1M4OXgwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9jczg5eDAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfQ1M4OVgwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBjczg5eDAubyIKLWZpCi0KIEFDX0FSR19FTkFCTEUoZGF2aWNvbSwKICAgWyAgLS1lbmFibGUtZGF2aWNvbSAgICAgICAgZW5hYmxlIERhdmljb20gZHJpdmVyXSkKIGlmIHRlc3QgIngkZW5hYmxlX2Rhdmljb20iID0geHllczsgdGhlbgpAQCAtMzk2LDE4ICszNzUsMTEgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGRhdmljb20ubyIKIGZpCiAKLUFDX0FSR19FTkFCTEUoZGVwY2EsCi0gIFsgIC0tZW5hYmxlLWRlcGNhICAgICAgICAgIGVuYWJsZSBERVBDQSBhbmQgRXRoZXJXT1JLUyBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfZGVwY2EiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfREVQQ0E9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGRlcGNhLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKGVlcHJvLAotICBbICAtLWVuYWJsZS1lZXBybyAgICAgICAgICBlbmFibGUgRXRoZXJleHByZXNzIFByby8xMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfZWVwcm8iID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfRUVQUk89MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGVlcHJvLm8iCitBQ19BUkdfRU5BQkxFKGUxMDAwLAorICBbICAtLWVuYWJsZS1lMTAwMCAgICAgICAgICBlbmFibGUgRXRoZXJleHByZXNzIFByby8xMDAwIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9lMTAwMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FMTAwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZTEwMDAubyIKIGZpCiAKIEFDX0FSR19FTkFCTEUoZWVwcm8xMDAsCkBAIC00MjQsNDYgKzM5NiwxMSBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZXBpYzEwMC5vIgogZmkKIAotQUNfQVJHX0VOQUJMRSgzYzUwNywKLSAgWyAgLS1lbmFibGUtM2M1MDcgICAgICAgICAgZW5hYmxlIDNDb201MDcgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA3IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA3PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwNy5vIgotZmkKLQotQUNfQVJHX0VOQUJMRShleG9zMjA1LAotICBbICAtLWVuYWJsZS1leG9zMjA1ICAgICAgICBlbmFibGUgRVhPUzIwNSBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfZXhvczIwNSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FWE9TMjA1PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBleG9zMjA1Lm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKG5pNTIxMCwKLSAgWyAgLS1lbmFibGUtbmk1MjEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNTIxMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfbmk1MjEwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05JNTIxMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmk1MjEwLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKGxhbmNlLAotICBbICAtLWVuYWJsZS1sYW5jZSAgICAgICAgICBlbmFibGUgTGFuY2UgUENJIFBDTmV0LzMyIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9sYW5jZSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9MQU5DRT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbGFuY2UubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUobmUyMTAwLAotICBbICAtLWVuYWJsZS1uZTIxMDAgICAgICAgICBlbmFibGUgTm92ZWxsIE5FMjEwMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfbmUyMTAwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05FMjEwMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmUyMTAwLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKG5pNjUxMCwKLSAgWyAgLS1lbmFibGUtbmk2NTEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNjUxMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfbmk2NTEwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05JNjUxMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmk2NTEwLm8iCitBQ19BUkdfRU5BQkxFKGZvcmNlZGV0aCwKKyAgWyAgLS1lbmFibGUtZm9yY2VkZXRoICAgICAgZW5hYmxlIE52aWRpYSBHZWZvcmNlIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9mb3JjZWRldGgiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfRk9SQ0VERVRIPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBmb3JjZWRldGgubyIKIGZpCiAKIEFDX0FSR19FTkFCTEUobmF0c2VtaSwKQEAgLTQ3MywyNSArNDEwLDExIEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuYXRzZW1pLm8iCiBmaQogCi1BQ19BUkdfRU5BQkxFKG5pNTAxMCwKLSAgWyAgLS1lbmFibGUtbmk1MDEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNTAxMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfbmk1MDEwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05JNTAxMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmk1MDEwLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKDNjNTAzLAotICBbICAtLWVuYWJsZS0zYzUwMyAgICAgICAgICBlbmFibGUgM0NvbTUwMyBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfM2M1MDMiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1MDM9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTAzLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKG5lLAotICBbICAtLWVuYWJsZS1uZSAgICAgICAgICAgICBlbmFibGUgTkUxMDAwLzIwMDAgSVNBIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9uZSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmUubyIKK0FDX0FSR19FTkFCTEUobnM4MzgyMCwKKyAgWyAgLS1lbmFibGUtbnM4MzgyMCAgICAgICAgZW5hYmxlIE5TODM4MjAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX25zODM4MjAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTlM4MzgyMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbnM4MzgyMC5vIgogZmkKIAogQUNfQVJHX0VOQUJMRShuczgzOTAsCkBAIC01MDEsMTggKzQyNCwxOCBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbnM4MzkwLm8iCiBmaQogCi1BQ19BUkdfRU5BQkxFKHdkLAotICBbICAtLWVuYWJsZS13ZCAgICAgICAgICAgICBlbmFibGUgV0Q4MDAzLzgwMTMsIFNNQzgyMTYvODQxNiBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfd2QiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfV0Q9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHdkLm8iCitBQ19BUkdfRU5BQkxFKHBjbmV0MzIsCisgIFsgIC0tZW5hYmxlLXBjbmV0MzIgICAgICAgIGVuYWJsZSBBTUQgTGFuY2UvUENJIFBDTmV0LzMyIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9wY25ldDMyIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1BDTkVUMzI9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHBjbmV0MzIubyIKIGZpCiAKLUFDX0FSR19FTkFCTEUob3R1bGlwLAotICBbICAtLWVuYWJsZS1vdHVsaXAgICAgICAgICBlbmFibGUgb2xkIFR1bGlwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9vdHVsaXAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfT1RVTElQPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBvdHVsaXAubyIKK0FDX0FSR19FTkFCTEUocG5pYywKKyAgWyAgLS1lbmFibGUtcG5pYyAgICAgICAgICAgZW5hYmxlIEJvY2hzIFBzZXVkbyBOaWMgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3BuaWMiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfUE5JQz0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgcG5pYy5vIgogZmkKIAogQUNfQVJHX0VOQUJMRShydGw4MTM5LApAQCAtNTIyLDYgKzQ0NSwxMyBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgcnRsODEzOS5vIgogZmkKIAorQUNfQVJHX0VOQUJMRShyODE2OSwKKyAgWyAgLS1lbmFibGUtcjgxNjkgICAgICAgICAgZW5hYmxlIFJlYWx0ZWsgODE2OSBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfcjgxNjkiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfUjgxNjk9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHI4MTY5Lm8iCitmaQorCiBBQ19BUkdfRU5BQkxFKHNpczkwMCwKICAgWyAgLS1lbmFibGUtc2lzOTAwICAgICAgICAgZW5hYmxlIFNJUyA5MDAgYW5kIFNJUyA3MDE2IGRyaXZlcl0pCiBpZiB0ZXN0ICJ4JGVuYWJsZV9zaXM5MDAiID0geHllczsgdGhlbgpAQCAtNTI5LDI1ICs0NTksMTEgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHNpczkwMC5vIgogZmkKIAotQUNfQVJHX0VOQUJMRShzay1nMTYsCi0gIFsgIC0tZW5hYmxlLXNrLWcxNiAgICAgICAgIGVuYWJsZSBTY2huZWlkZXIgYW5kIEtvY2ggRzE2IGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9za19nMTYiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU0tfRzE2PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBza19nMTYubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUoc21jOTAwMCwKLSAgWyAgLS1lbmFibGUtc21jOTAwMCAgICAgICAgZW5hYmxlIFNNQzkwMDAgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX3NtYzkwMDAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU01DOTAwMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc21jOTAwMC5vIgotZmkKLQotQUNfQVJHX0VOQUJMRSh0aWFyYSwKLSAgWyAgLS1lbmFibGUtdGlhcmEgICAgICAgICAgZW5hYmxlIFRpYXJhIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV90aWFyYSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9USUFSQT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgdGlhcmEubyIKK0FDX0FSR19FTkFCTEUodGczLAorICBbICAtLWVuYWJsZS10ZzMgICAgICAgICAgICBlbmFibGUgQnJvYWRjb20gVGlnb24zIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV90ZzMiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVEczPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0ZzMubyIKIGZpCiAKIEFDX0FSR19FTkFCTEUodHVsaXAsCkBAIC01NTcsNiArNDczLDEzIEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0dWxpcC5vIgogZmkKIAorQUNfQVJHX0VOQUJMRSh0bGFuLAorICBbICAtLWVuYWJsZS10bGFuICAgICAgICAgICBlbmFibGUgVEkgVGh1bmRlckxBTiBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfdGxhbiIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9UTEFOPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0bGFuLm8iCitmaQorCiBBQ19BUkdfRU5BQkxFKHZpYS1yaGluZSwKICAgWyAgLS1lbmFibGUtdmlhLXJoaW5lICAgICAgZW5hYmxlIFJoaW5lLUkvSUkgZHJpdmVyXSkKIGlmIHRlc3QgIngkZW5hYmxlX3ZpYV9yaGluZSIgPSB4eWVzOyB0aGVuCkBAIC01NjUsNyArNDg4LDcgQEAKIGZpCiAKIEFDX0FSR19FTkFCTEUodzg5Yzg0MCwKLSAgWyAgLS1lbmFibGUtdzg5Yzg0MCAgICAgICAgZW5hYmxlIFdpbmJvbmQgVzg5Yzg0MCwgQ29tcGV4IFJMMTAwLUFUWCBkcml2ZXJdKQorICBbICAtLWVuYWJsZS13ODljODQwICAgICAgICBlbmFibGUgV2luYm9uZCBXODljODQwIGRyaXZlcl0pCiBpZiB0ZXN0ICJ4JGVuYWJsZV93ODljODQwIiA9IHh5ZXM7IHRoZW4KICAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1c4OUM4NDA9MSIKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHc4OWM4NDAubyIKQEAgLTU3NywxOSArNTAwLDcgQEAKICAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfVEZUUD0xIgogZmkKIAotZG5sIEV4dHJhIG9wdGlvbnMuCi1BQ19BUkdfRU5BQkxFKDNjNTAzLXNobWVtLAotICBbICAtLWVuYWJsZS0zYzUwMy1zaG1lbSAgICB1c2UgM2M1MDMgc2hhcmVkIG1lbW9yeSBtb2RlXSkKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTAzX3NobWVtIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFQ1MDNfU0hNRU09MSIKLWZpCi0KLUFDX0FSR19FTkFCTEUoM2M1MDMtYXVpLAotICBbICAtLWVuYWJsZS0zYzUwMy1hdWkgICAgICB1c2UgQVVJIGJ5IGRlZmF1bHQgb24gM2M1MDMgY2FyZHNdKQotaWYgdGVzdCAieCRlbmFibGVfM2M1MDNfYXVpIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFQ1MDNfQVVJPTEiCi1maQotCitkbmwgZXh0cmEgZmxhZyBmb3IgbnM4MzkwLmMKIEFDX0FSR19FTkFCTEUoY29tcGV4LXJsMjAwMC1maXgsCiAgIFsgIC0tZW5hYmxlLWNvbXBleC1ybDIwMDAtZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBpZiB5b3UgaGF2ZSBhIENvbXBleCBSTDIwMDAgUENJXSkKQEAgLTU5NywxMSArNTA4LDYgQEAKICAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTVBFWF9STDIwMDBfRklYPTEiCiBmaQogCi1BQ19BUkdfRU5BQkxFKHNtYzkwMDAtc2NhbiwKLSAgWyAgLS1lbmFibGUtc21jOTAwMC1zY2FuPUxJU1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmUgZm9yIFNNQzkwMDAgSS9PIGFkZHJlc3NlcyB1c2luZyBMSVNUXSwKLSAgW05FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURTTUM5MDAwX1NDQU49JGVuYWJsZV9zbWM5MDAwX3NjYW4iXSkKLQogQUNfQVJHX0VOQUJMRShuZS1zY2FuLAogICBbICAtLWVuYWJsZS1uZS1zY2FuPUxJU1QgICBwcm9iZSBmb3IgTkUgYmFzZSBhZGRyZXNzIHVzaW5nIExJU1RdLAogICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRE5FX1NDQU49JGVuYWJsZV9uZV9zY2FuIl0sCkBAIC02MTMsMTAgKzUxOSw2IEBACiAgIFtORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EV0RfREVGQVVMVF9NRU09JGVuYWJsZV93ZF9kZWZhdWx0X21lbSJdLAogICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFdEX0RFRkFVTFRfTUVNPTB4Q0MwMDAiXSkKIAotQUNfQVJHX0VOQUJMRShjcy1zY2FuLAotICBbICAtLWVuYWJsZS1jcy1zY2FuPUxJU1QgICBwcm9iZSBmb3IgQ1M4OXgwIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUXSwKLSAgW05FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDU19TQ0FOPSRlbmFibGVfY3Nfc2NhbiJdKQotCiBkbmwgRGlza2xlc3MKIEFDX0FSR19FTkFCTEUoZGlza2xlc3MsCiAgIFsgIC0tZW5hYmxlLWRpc2tsZXNzICAgICAgIGVuYWJsZSBkaXNrbGVzcyBzdXBwb3J0XSkKSW5kZXg6IGIvbmV0Ym9vdC8zYzUwOS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC8zYzUwOS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgSGVyYiBQZXllcmwgKGhwZXllcmxAbm92YXRlbC5jYSkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4gVGhlIG5hbWUKLSAqIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91Z2ggc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLSAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi0gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIGlmX2VwcmVnLmgsdiAxLjQgMTk5NC8xMS8xMyAxMDoxMjozNyBnaWJicyBFeHAgTW9kaWZpZWQgYnk6Ci0gKgotIE9jdG9iZXIgMiwgMTk5NAotCi0gTW9kaWZpZWQgYnk6IEFuZHJlcyBWZWdhIEdhcmNpYQotCi0gSU5SSUEgLSBTb3BoaWEgQW50aXBvbGlzLCBGcmFuY2UKLSBlLW1haWw6IGF2ZWdhQHNvcGhpYS5pbnJpYS5mcgotIGZpbmdlcjogYXZlZ2FAcGF4LmlucmlhLmZyCi0KLSAqLwotCi0vKgotICogRXRoZXJuZXQgc29mdHdhcmUgc3RhdHVzIHBlciBpbnRlcmZhY2UuCi0gKi8KLS8qCi0gKiBTb21lIGdsb2JhbCBjb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIFRYX0lOSVRfUkFURQkJMTYKLSNkZWZpbmUgVFhfSU5JVF9NQVhfUkFURQk2NAotI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kJCTY0Ci0jZGVmaW5lIFJYX0lOSVRfRUFSTFlfVEhSRVNICTY0Ci0jZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hGCTE2CS8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCi0jZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMCTQKLQotI2RlZmluZSBFRVBST01TSVpFCTB4NDAKLSNkZWZpbmUgTUFYX0VFUFJPTUJVU1kJMTAwMAotI2RlZmluZSBFUF9MQVNUX1RBRwkweGQ3Ci0jZGVmaW5lIEVQX01BWF9CT0FSRFMJMTYKLSNkZWZpbmUgRVBfSURfUE9SVAkweDEwMAotCi0vKgotICogc29tZSBtYWNyb3MgdG8gYWNjZXMgbG9uZyBuYW1lZCBmaWVsZHMKLSAqLwotI2RlZmluZSBJU19CQVNFIChldGhfbmljX2Jhc2UpCi0jZGVmaW5lIEJBU0UJKGV0aF9uaWNfYmFzZSkKLQotLyoKLSAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCi0gKiBPZmZzZXQgMHhhKQotICovCi0jZGVmaW5lIEVFUFJPTV9DTURfUkQJMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfV1IJMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfRVdFTgkweDAwMzAJLyogRXJhc2UvV3JpdGUgRW5hYmxlOiBObyBkYXRhIHJlcXVpcmVkICovCi0KLSNkZWZpbmUgRUVQUk9NX0JVU1kJCSgxPDwxNSkKLSNkZWZpbmUgRUVQUk9NX1RTVF9NT0RFCQkoMTw8MTQpCi0KLS8qCi0gKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybwotICovCi0jZGVmaW5lIGlzX2VlcHJvbV9idXN5KGIpIChpbncoKGIpK0VQX1cwX0VFUFJPTV9DT01NQU5EKSZFRVBST01fQlVTWSkKLSNkZWZpbmUgR09fV0lORE9XKHgpCW91dHcoV0lORE9XX1NFTEVDVHwoeCksIEJBU0UrRVBfQ09NTUFORCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlc2UgZGVmaW5lIHRoZSBFRVBST00gZGF0YSBzdHJ1Y3R1cmUuICBUaGV5IGFyZSB1c2VkIGluIHRoZSBwcm9iZQotICogZnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSBleGlzdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgYWZ0ZXIgaGF2aW5nIHNlbnQKLSAqIHRoZSBJRF9TZXF1ZW5jZS4KLSAqCi0gKiBUaGVyZSBhcmUgb3RoZXJzIGJ1dCBvbmx5IHRoZSBvbmVzIHdlIHVzZSBhcmUgZGVmaW5lZCBoZXJlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzAJMHgwCS8qIFdvcmQgKi8KLSNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8xCTB4MQkvKiBXb3JkICovCi0jZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMgkweDIJLyogV29yZCAqLwotI2RlZmluZSBFRVBST01fUFJPRF9JRAkJMHgzCS8qIDB4OVswLWZdNTAgKi8KLSNkZWZpbmUgRUVQUk9NX01GR19JRAkJMHg3CS8qIDB4NmQ1MCAqLwotI2RlZmluZSBFRVBST01fQUREUl9DRkcJCTB4OAkvKiBCYXNlIGFkZHIgKi8KLSNkZWZpbmUgRUVQUk9NX1JFU09VUkNFX0NGRwkweDkJLyogSVJRLiBCaXRzIDEyLTE1ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZXNlIGFyZSB0aGUgcmVnaXN0ZXJzIGZvciB0aGUgM0NvbSAzYzUwOSBhbmQgdGhlaXIgYml0IHBhdHRlcm5zIHdoZW4KLSAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbAotICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbAotICogZnJvbSAzY29tLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFUF9DT01NQU5ECQkweDBlCS8qIFdyaXRlLiBCQVNFKzB4MGUgaXMgYWx3YXlzIGEKLQkJCQkJICogY29tbWFuZCByZWcuICovCi0jZGVmaW5lIEVQX1NUQVRVUwkJMHgwZQkvKiBSZWFkLiBCQVNFKzB4MGUgaXMgYWx3YXlzIHN0YXR1cwotCQkJCQkgKiByZWcuICovCi0jZGVmaW5lIEVQX1dJTkRPVwkJMHgwZgkvKiBSZWFkLiBCQVNFKzB4MGYgaXMgYWx3YXlzIHdpbmRvdwotCQkJCQkgKiByZWcuICovCi0vKgotICogV2luZG93IDAgcmVnaXN0ZXJzLiBTZXR1cC4KLSAqLwotLyogV3JpdGUgKi8KLSNkZWZpbmUgRVBfVzBfRUVQUk9NX0RBVEEJMHgwYwotI2RlZmluZSBFUF9XMF9FRVBST01fQ09NTUFORAkweDBhCi0jZGVmaW5lIEVQX1cwX1JFU09VUkNFX0NGRwkweDA4Ci0jZGVmaW5lIEVQX1cwX0FERFJFU1NfQ0ZHCTB4MDYKLSNkZWZpbmUgRVBfVzBfQ09ORklHX0NUUkwJMHgwNAotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XMF9QUk9EVUNUX0lECTB4MDIKLSNkZWZpbmUgRVBfVzBfTUZHX0lECQkweDAwCi0KLS8qCi0gKiBXaW5kb3cgMSByZWdpc3RlcnMuIE9wZXJhdGluZyBTZXQuCi0gKi8KLS8qIFdyaXRlICovCi0jZGVmaW5lIEVQX1cxX1RYX1BJT19XUl8yCTB4MDIKLSNkZWZpbmUgRVBfVzFfVFhfUElPX1dSXzEJMHgwMAotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XMV9GUkVFX1RYCQkweDBjCi0jZGVmaW5lIEVQX1cxX1RYX1NUQVRVUwkJMHgwYgkvKiBieXRlICovCi0jZGVmaW5lIEVQX1cxX1RJTUVSCQkweDBhCS8qIGJ5dGUgKi8KLSNkZWZpbmUgRVBfVzFfUlhfU1RBVFVTCQkweDA4Ci0jZGVmaW5lIEVQX1cxX1JYX1BJT19SRF8yCTB4MDIKLSNkZWZpbmUgRVBfVzFfUlhfUElPX1JEXzEJMHgwMAotCi0vKgotICogV2luZG93IDIgcmVnaXN0ZXJzLiBTdGF0aW9uIEFkZHJlc3MgU2V0dXAvUmVhZAotICovCi0vKiBSZWFkL1dyaXRlICovCi0jZGVmaW5lIEVQX1cyX0FERFJfNQkJMHgwNQotI2RlZmluZSBFUF9XMl9BRERSXzQJCTB4MDQKLSNkZWZpbmUgRVBfVzJfQUREUl8zCQkweDAzCi0jZGVmaW5lIEVQX1cyX0FERFJfMgkJMHgwMgotI2RlZmluZSBFUF9XMl9BRERSXzEJCTB4MDEKLSNkZWZpbmUgRVBfVzJfQUREUl8wCQkweDAwCi0KLS8qCi0gKiBXaW5kb3cgMyByZWdpc3RlcnMuICBGSUZPIE1hbmFnZW1lbnQuCi0gKi8KLS8qIFJlYWQgKi8KLSNkZWZpbmUgRVBfVzNfRlJFRV9UWAkJMHgwYwotI2RlZmluZSBFUF9XM19GUkVFX1JYCQkweDBhCi0KLS8qCi0gKiBXaW5kb3cgNCByZWdpc3RlcnMuIERpYWdub3N0aWNzLgotICovCi0vKiBSZWFkL1dyaXRlICovCi0jZGVmaW5lIEVQX1c0X01FRElBX1RZUEUJMHgwYQotI2RlZmluZSBFUF9XNF9DVFJMUl9TVEFUVVMJMHgwOAotI2RlZmluZSBFUF9XNF9ORVRfRElBRwkJMHgwNgotI2RlZmluZSBFUF9XNF9GSUZPX0RJQUcJCTB4MDQKLSNkZWZpbmUgRVBfVzRfSE9TVF9ESUFHCQkweDAyCi0jZGVmaW5lIEVQX1c0X1RYX0RJQUcJCTB4MDAKLQotLyoKLSAqIFdpbmRvdyA1IFJlZ2lzdGVycy4gIFJlc3VsdHMgYW5kIEludGVybmFsIHN0YXR1cy4KLSAqLwotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XNV9SRUFEXzBfTUFTSwkweDBjCi0jZGVmaW5lIEVQX1c1X0lOVFJfTUFTSwkJMHgwYQotI2RlZmluZSBFUF9XNV9SWF9GSUxURVIJCTB4MDgKLSNkZWZpbmUgRVBfVzVfUlhfRUFSTFlfVEhSRVNICTB4MDYKLSNkZWZpbmUgRVBfVzVfVFhfQVZBSUxfVEhSRVNICTB4MDIKLSNkZWZpbmUgRVBfVzVfVFhfU1RBUlRfVEhSRVNICTB4MDAKLQotLyoKLSAqIFdpbmRvdyA2IHJlZ2lzdGVycy4gU3RhdGlzdGljcy4KLSAqLwotLyogUmVhZC9Xcml0ZSAqLwotI2RlZmluZSBUWF9UT1RBTF9PSwkJMHgwYwotI2RlZmluZSBSWF9UT1RBTF9PSwkJMHgwYQotI2RlZmluZSBUWF9ERUZFUlJBTFMJCTB4MDgKLSNkZWZpbmUgUlhfRlJBTUVTX09LCQkweDA3Ci0jZGVmaW5lIFRYX0ZSQU1FU19PSwkJMHgwNgotI2RlZmluZSBSWF9PVkVSUlVOUwkJMHgwNQotI2RlZmluZSBUWF9DT0xMSVNJT05TCQkweDA0Ci0jZGVmaW5lIFRYX0FGVEVSXzFfQ09MTElTSU9OCTB4MDMKLSNkZWZpbmUgVFhfQUZURVJfWF9DT0xMSVNJT05TCTB4MDIKLSNkZWZpbmUgVFhfTk9fU1FFCQkweDAxCi0jZGVmaW5lIFRYX0NEX0xPU1QJCTB4MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvbW1hbmQgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgotICoKLSAqIDE2IGJpdCByZWdpc3Rlci4KLSAqICAgICAxNS0xMTogIDUtYml0IGNvZGUgZm9yIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuCi0gKiAgICAgMTAtMDogICAxMS1iaXQgYXJnIGlmIGFueS4gRm9yIGNvbW1hbmRzIHdpdGggbm8gYXJnczsKLSAqCSAgICAgIHRoaXMgY2FuIGJlIHNldCB0byBhbnl0aGluZy4KLSAqLwotI2RlZmluZSBHTE9CQUxfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgMHgwMDAwCS8qIFdhaXQgYXQgbGVhc3QgMW1zCi0JCQkJCQkJICogYWZ0ZXIgaXNzdWluZyAqLwotI2RlZmluZSBXSU5ET1dfU0VMRUNUCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDExKQotI2RlZmluZSBTVEFSVF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDI8PDExKQkvKiBSZWFkIEFERFJfQ0ZHIHJlZyB0bwotCQkJCQkJCSAqIGRldGVybWluZSB3aGV0aGVyCi0JCQkJCQkJICogdGhpcyBpcyBuZWVkZWQuIElmCi0JCQkJCQkJICogc287IHdhaXQgODAwIHVTZWMKLQkJCQkJCQkgKiBiZWZvcmUgdXNpbmcgdHJhbnMtCi0JCQkJCQkJICogY2VpdmVyLiAqLwotI2RlZmluZSBSWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDM8PDExKQkvKiBzdGF0ZSBkaXNhYmxlZCBvbgotCQkJCQkJCSAqIHBvd2VyLXVwICovCi0jZGVmaW5lIFJYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0PDwxMSkKLSNkZWZpbmUgUlhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NTw8MTEpCi0jZGVmaW5lIFJYX0RJU0NBUkRfVE9QX1BBQ0sJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKLSNkZWZpbmUgVFhfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQotI2RlZmluZSBUWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweGE8PDExKQotI2RlZmluZSBUWF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAoMHhiPDwxMSkKLSNkZWZpbmUgUkVRX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yzw8MTEpCi0jZGVmaW5lIFNFVF9JTlRSX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ZTw8MTEpCi0jZGVmaW5lIFNFVF9SRF8wX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Zjw8MTEpCi0jZGVmaW5lIFNFVF9SWF9GSUxURVIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTA8PDExKQotI2RlZmluZSBGSUxfSU5ESVZJRFVBTAkodW5zaWduZWQgc2hvcnQpICgweDEpCi0jZGVmaW5lIEZJTF9HUk9VUAkJKHVuc2lnbmVkIHNob3J0KSAoMHgyKQotI2RlZmluZSBGSUxfQlJEQ1NUCSh1bnNpZ25lZCBzaG9ydCkgKDB4NCkKLSNkZWZpbmUgRklMX0FMTAkJKHVuc2lnbmVkIHNob3J0KSAoMHg4KQotI2RlZmluZSBTRVRfUlhfRUFSTFlfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTE8PDExKQotI2RlZmluZSBTRVRfVFhfQVZBSUxfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTI8PDExKQotI2RlZmluZSBTRVRfVFhfU1RBUlRfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTM8PDExKQotI2RlZmluZSBTVEFUU19FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTU8PDExKQotI2RlZmluZSBTVEFUU19ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE2PDwxMSkKLSNkZWZpbmUgU1RPUF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDE3PDwxMSkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIENfKiBhY2tub3dsZWRnZSB0aGUgdmFyaW91cyBpbnRlcnJ1cHRzLiBTb21lIG9mIHRoZW0gZG9uJ3QKLSAqIGRvIGFueXRoaW5nLiAgU2VlIHRoZSBtYW51YWwuCi0gKi8KLSNkZWZpbmUgQUNLX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NjgwMCkKLSNkZWZpbmUgQ19JTlRSX0xBVENICSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MSkKLSNkZWZpbmUgQ19DQVJEX0ZBSUxVUkUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgyKQotI2RlZmluZSBDX1RYX0NPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NCkKLSNkZWZpbmUgQ19UWF9BVkFJTAkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgpCi0jZGVmaW5lIENfUlhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxMCkKLSNkZWZpbmUgQ19SWF9FQVJMWQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDIwKQotI2RlZmluZSBDX0lOVF9SUUQJCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NDApCi0jZGVmaW5lIENfVVBEX1NUQVRTCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4ODApCi0KLS8qCi0gKiBTdGF0dXMgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgotICoKLSAqICAgICAxNS0xMzogIFdpbmRvdyBudW1iZXIoMC03KS4KLSAqICAgICAxMjogICAgIENvbW1hbmRfaW5fcHJvZ3Jlc3MuCi0gKiAgICAgMTE6ICAgICByZXNlcnZlZC4KLSAqICAgICAxMDogICAgIHJlc2VydmVkLgotICogICAgIDk6ICAgICAgcmVzZXJ2ZWQuCi0gKiAgICAgODogICAgICByZXNlcnZlZC4KLSAqICAgICA3OiAgICAgIFVwZGF0ZSBTdGF0aXN0aWNzLgotICogICAgIDY6ICAgICAgSW50ZXJydXB0IFJlcXVlc3RlZC4KLSAqICAgICA1OiAgICAgIFJYIEVhcmx5LgotICogICAgIDQ6ICAgICAgUlggQ29tcGxldGUuCi0gKiAgICAgMzogICAgICBUWCBBdmFpbGFibGUuCi0gKiAgICAgMjogICAgICBUWCBDb21wbGV0ZS4KLSAqICAgICAxOiAgICAgIEFkYXB0ZXIgRmFpbHVyZS4KLSAqICAgICAwOiAgICAgIEludGVycnVwdCBMYXRjaC4KLSAqLwotI2RlZmluZSBTX0lOVFJfTEFUQ0gJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKLSNkZWZpbmUgU19DQVJEX0ZBSUxVUkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MikKLSNkZWZpbmUgU19UWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQotI2RlZmluZSBTX1RYX0FWQUlMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCi0jZGVmaW5lIFNfUlhfQ09NUExFVEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTApCi0jZGVmaW5lIFNfUlhfRUFSTFkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MjApCi0jZGVmaW5lIFNfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoMHg0MCkKLSNkZWZpbmUgU19VUERfU1RBVFMJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODApCi0jZGVmaW5lIFNfNV9JTlRTCQkoU19DQVJEX0ZBSUxVUkV8U19UWF9DT01QTEVURXxcCi0JCQkJIFNfVFhfQVZBSUx8U19SWF9DT01QTEVURXxTX1JYX0VBUkxZKQotI2RlZmluZSBTX0NPTU1BTkRfSU5fUFJPR1JFU1MJKHVuc2lnbmVkIHNob3J0KSAoMHgxMDAwKQotCi0vKgotICogRklGTyBSZWdpc3RlcnMuCi0gKiBSWCBTdGF0dXMuIFdpbmRvdyAxL1BvcnQgMDgKLSAqCi0gKiAgICAgMTU6ICAgICBJbmNvbXBsZXRlIG9yIEZJRk8gZW1wdHkuCi0gKiAgICAgMTQ6ICAgICAxOiBFcnJvciBpbiBSWCBQYWNrZXQgICAwOiBJbmNvbXBsZXRlIG9yIG5vIGVycm9yLgotICogICAgIDEzLTExOiAgVHlwZSBvZiBlcnJvci4KLSAqCSAgICAgIDEwMDAgPSBPdmVycnVuLgotICoJICAgICAgMTAxMSA9IFJ1biBQYWNrZXQgRXJyb3IuCi0gKgkgICAgICAxMTAwID0gQWxpZ25tZW50IEVycm9yLgotICoJICAgICAgMTEwMSA9IENSQyBFcnJvci4KLSAqCSAgICAgIDEwMDEgPSBPdmVyc2l6ZSBQYWNrZXQgRXJyb3IgKD4xNTE0IGJ5dGVzKQotICoJICAgICAgMDAxMCA9IERyaWJibGUgQml0cy4KLSAqCSAgICAgIChhbGwgb3RoZXIgZXJyb3IgY29kZXMsIG5vIGVycm9ycy4pCi0gKgotICogICAgIDEwLTA6ICAgUlggQnl0ZXMgKDAtMTUxNCkKLSAqLwotI2RlZmluZSBFUlJfUlhfSU5DT01QTEVURQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE1KQotI2RlZmluZSBFUlJfUlgJCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE0KQotI2RlZmluZSBFUlJfUlhfT1ZFUlJVTgkJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKLSNkZWZpbmUgRVJSX1JYX1JVTl9QS1QJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yjw8MTEpCi0jZGVmaW5lIEVSUl9SWF9BTElHTgkJKHVuc2lnbmVkIHNob3J0KSAoMHhjPDwxMSkKLSNkZWZpbmUgRVJSX1JYX0NSQwkJKHVuc2lnbmVkIHNob3J0KSAoMHhkPDwxMSkKLSNkZWZpbmUgRVJSX1JYX09WRVJTSVpFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQotI2RlZmluZSBFUlJfUlhfRFJJQkJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyPDwxMSkKLQotLyoKLSAqIEZJRk8gUmVnaXN0ZXJzLgotICogVFggU3RhdHVzLiBXaW5kb3cgMS9Qb3J0IDBCCi0gKgotICogICBSZXBvcnRzIHRoZSB0cmFuc21pdCBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgdHJhbnNtaXNzaW9uLiBXcml0aW5nIHRoaXMKLSAqICAgcmVnaXN0ZXIgcG9wcyB0aGUgdHJhbnNtaXQgY29tcGxldGlvbiBzdGFjay4KLSAqCi0gKiAgIFdpbmRvdyAxL1BvcnQgMHgwYi4KLSAqCi0gKiAgICAgNzogICAgICBDb21wbGV0ZQotICogICAgIDY6ICAgICAgSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIHJlcXVlc3RlZC4KLSAqICAgICA1OiAgICAgIEphYmJlciBFcnJvciAoVFAgT25seSwgVFggUmVzZXQgcmVxdWlyZWQuICkKLSAqICAgICA0OiAgICAgIFVuZGVycnVuIChUWCBSZXNldCByZXF1aXJlZC4gKQotICogICAgIDM6ICAgICAgTWF4aW11bSBDb2xsaXNpb25zLgotICogICAgIDI6ICAgICAgVFggU3RhdHVzIE92ZXJmbG93LgotICogICAgIDEtMDogICAgVW5kZWZpbmVkLgotICoKLSAqLwotI2RlZmluZSBUWFNfQ09NUExFVEUJCTB4ODAKLSNkZWZpbmUgVFhTX1NVQ0NFU19JTlRSX1JFUQkJMHg0MAotI2RlZmluZSBUWFNfSkFCQkVSCQkweDIwCi0jZGVmaW5lIFRYU19VTkRFUlJVTgkJMHgxMAotI2RlZmluZSBUWFNfTUFYX0NPTExJU0lPTgkweDgKLSNkZWZpbmUgVFhTX1NUQVRVU19PVkVSRkxPVwkweDQKLQotLyoKLSAqIENvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3Rlci4KLSAqIFdpbmRvdyAwL1BvcnQgMDQKLSAqLwotLyogUmVhZCAqLwotI2RlZmluZSBJU19BVUkJCQkJKDE8PDEzKQotI2RlZmluZSBJU19CTkMJCQkJKDE8PDEyKQotI2RlZmluZSBJU19VVFAJCQkJKDE8PDkpCi0vKiBXcml0ZSAqLwotI2RlZmluZSBFTkFCTEVfRFJRX0lSUQkJCTB4MDAwMQotI2RlZmluZSBXMF9QNF9DTURfUkVTRVRfQURBUFRFUgkJMHg0Ci0jZGVmaW5lIFcwX1A0X0NNRF9FTkFCTEVfQURBUFRFUgkweDEKLS8qCi0gKiBNZWRpYSB0eXBlIGFuZCBzdGF0dXMuCi0gKiBXaW5kb3cgNC9Qb3J0IDBBCi0gKi8KLSNkZWZpbmUgRU5BQkxFX1VUUAkJCTB4YzAKLSNkZWZpbmUgRElTQUJMRV9VVFAJCQkweDAKLQotLyoKLSAqIFJlc291cmNlIGNvbnRyb2wgcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lIFNFVF9JUlEoaSkJKCAoKGkpPDwxMikgfCAweEYwMCkgLyogc2V0IElSUSBpICovCi0KLS8qCi0gKiBSZWNlaXZlIHN0YXR1cyByZWdpc3RlcgotICovCi0KLSNkZWZpbmUgUlhfQllURVNfTUFTSwkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MDdmZikKLSNkZWZpbmUgUlhfRVJST1IJMHg0MDAwCi0jZGVmaW5lIFJYX0lOQ09NUExFVEUJMHg4MDAwCi0KLQotLyoKLSAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCi0gKi8KLSNkZWZpbmUgQUNUSVZBVEVfQURBUFRFUl9UT19DT05GSUcJMHhmZiAvKiB0byB0aGUgaWRfcG9ydCAqLwotI2RlZmluZSBNRkdfSUQJCQkJMHg2ZDUwIC8qIGluIEVFUFJPTSBhbmQgVzAgQUREUl9DT05GSUcgKi8KLSNkZWZpbmUgUFJPRF9JRAkJCQkweDkxNTAKLQotI2RlZmluZSBBVUkJCQkJMHgxCi0jZGVmaW5lIEJOQwkJCQkweDIKLSNkZWZpbmUgVVRQCQkJCTB4NAotCi0jZGVmaW5lIFJYX0JZVEVTX01BU0sJCQkodW5zaWduZWQgc2hvcnQpICgweDA3ZmYpCi0KLSAvKiBFSVNBIHN1cHBvcnQgKi8KLSNkZWZpbmUgRVBfRUlTQV9TVEFSVAkJCTB4MTAwMAotI2RlZmluZSBFUF9FSVNBX1cwCQkJMHgwYzgwCi0KLSNpZmRlZglJTkNMVURFXzNDNTI5Ci0gLyogTUNBIHN1cHBvcnQgKi8KLSNkZWZpbmUgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRwkweDk0Ci0jZGVmaW5lIE1DQV9BREFQVEVSX1NFVFVQX1JFRwkJMHg5NgotI2RlZmluZSBNQ0FfTUFYX1NMT1RfTlIJCQk4Ci0jZGVmaW5lIE1DQV9QT1NfUkVHKG4pCQkJKDB4MTAwKyhuKSkKLSNlbmRpZgotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KSW5kZXg6IGIvbmV0Ym9vdC8zYzU5NS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC8zYzU5NS5jCisrKyBiL25ldGJvb3QvM2M1OTUuYwpAQCAtMjAsNiArMjAsNyBAQAogKgogKiAgQ29weXJpZ2h0IChjKSAxOTk0IEhlcmIgUGV5ZXJsIDxocGV5ZXJsQG5vdmF0ZWwuY2E+CiAqCisqIHRpbWxlZ2dlCTA4LTI0LTIwMDMJQWRkIE11bHRpY2FzdCBTdXBwb3J0CiAqLwogCiAvKiAjZGVmaW5lIEVERUJVRyAqLwpAQCAtMzAsNyArMzEsNyBAQAogI2luY2x1ZGUgIjNjNTk1LmgiCiAjaW5jbHVkZSAidGltZXIuaCIKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0CWV0aF9uaWNfYmFzZSwgZXRoX2FzaWNfYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQJdnhfY29ubmVjdG9yLCB2eF9jb25uZWN0b3JzOwogCiBzdGF0aWMgc3RydWN0IGNvbm5lY3Rvcl9lbnRyeSB7CkBAIC01NywxNCArNTgsMTIgQEAKIHN0YXRpYyB2b2lkIHZ4Z2V0bGluayh2b2lkKTsKIHN0YXRpYyB2b2lkIHZ4c2V0bGluayh2b2lkKTsKIAotI2RlZmluZQl1ZGVsYXkobikJd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCB0NTk1X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKIHsKLQlpbnQgaSwgajsKKwlpbnQgaTsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJUmVzZXQgM0NvbSA1OTUgY2FyZApAQCAtMTMzLDcgKzEzMiw3IEBACiAJb3V0dyhBQ0tfSU5UUiB8IDB4ZmYsIEJBU0UgKyBWWF9DT01NQU5EKTsKIAogCW91dHcoU0VUX1JYX0ZJTFRFUiB8IEZJTF9JTkRJVklEVUFMIHwKLQkgICAgRklMX0JSRENTVCwgQkFTRSArIFZYX0NPTU1BTkQpOworCSAgICBGSUxfQlJEQ1NUfEZJTF9NVUxUSUNBU1QsIEJBU0UgKyBWWF9DT01NQU5EKTsKIAogCXZ4c2V0bGluaygpOwogLyp7CkBAIC0yMjUsMTAgKzIyNCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0NTk1X3BvbGwoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIGludCB0NTk1X3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAJLyogY29tbW9uIHZhcmlhYmxlcyAqLwotCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOwkvKiB1c2VkIGJ5IEVERUJVRyAqLwogCS8qIHZhcmlhYmxlcyBmb3IgM0M1OTUgKi8KIAlzaG9ydCBzdGF0dXMsIGNzdDsKIAlyZWdpc3RlciBzaG9ydCByeF9maWZvOwpAQCAtMjYyLDYgKzI2MCw4IEBACiAJaWYgKHJ4X2ZpZm89PTApCiAJCXJldHVybiAwOwogCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKIAkJLyogcmVhZCBwYWNrZXQgKi8KICNpZmRlZiBFREVCVUcKIAlwcmludGYoIltsPSVkIixyeF9maWZvKTsKQEAgLTMwMCwxMiArMzAwLDE1IEBACiAJb3V0dyhSWF9ESVNDQVJEX1RPUF9QQUNLLCBCQVNFICsgVlhfQ09NTUFORCk7CiAJd2hpbGUgKGludyhCQVNFICsgVlhfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUyk7CiAjaWZkZWYgRURFQlVHCit7CisJdW5zaWduZWQgc2hvcnQgdHlwZSA9IDA7CS8qIHVzZWQgYnkgRURFQlVHICovCiAJdHlwZSA9IChuaWMtPnBhY2tldFsxMl08PDgpIHwgbmljLT5wYWNrZXRbMTNdOwogCWlmKG5pYy0+cGFja2V0WzBdK25pYy0+cGFja2V0WzFdK25pYy0+cGFja2V0WzJdK25pYy0+cGFja2V0WzNdK25pYy0+cGFja2V0WzRdKwogCSAgICBuaWMtPnBhY2tldFs1XSA9PSAweEZGKkVUSF9BTEVOKQogCQlwcmludGYoIix0PSVoWCxiXSIsdHlwZSk7CiAJZWxzZQogCQlwcmludGYoIix0PSVoWF0iLHR5cGUpOworfQogI2VuZGlmCiAJcmV0dXJuIDE7CiB9CkBAIC0zODIsOSArMzg1LDggQEAKIHN0YXRpYyB2b2lkICAgICAgICAgICAgCiB2eHNldGxpbmsodm9pZCkKIHsgICAgICAgCi0gICAgaW50IGksIGosIGs7CisgICAgaW50IGksIGo7CiAgICAgY2hhciAqcmVhc29uLCAqd2FybmluZzsKLSAgICBzdGF0aWMgc2hvcnQgcHJldl9mbGFnczsKICAgICBzdGF0aWMgY2hhciBwcmV2X2Nvbm4gPSAtMTsKIAogICAgIGlmIChwcmV2X2Nvbm4gPT0gLTEpIHsKQEAgLTQzOCwyOCArNDQwLDQ3IEBACiAgICAgR09fV0lORE9XKDEpOyAKIH0KIAotc3RhdGljIHZvaWQgdDU5NV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIHQ1OTVfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpCiB7Ci0gICAgb3V0dyhTVE9QX1RSQU5TQ0VJVkVSLCBCQVNFICsgVlhfQ09NTUFORCk7Ci0gICAgdWRlbGF5KDgwMDApOwotICAgIEdPX1dJTkRPVyg0KTsKLSAgICBvdXR3KDAsIEJBU0UgKyBWWF9XNF9NRURJQV9UWVBFKTsKLSAgICBHT19XSU5ET1coMSk7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJdDU5NV9yZXNldChuaWMpOworCisJb3V0dyhTVE9QX1RSQU5TQ0VJVkVSLCBCQVNFICsgVlhfQ09NTUFORCk7CisJdWRlbGF5KDgwMDApOworCUdPX1dJTkRPVyg0KTsKKwlvdXR3KDAsIEJBU0UgKyBWWF9XNF9NRURJQV9UWVBFKTsKKwlHT19XSU5ET1coMSk7Cit9CisKK3N0YXRpYyB2b2lkIHQ1OTVfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqdDU5NV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorc3RhdGljIGludCB0NTk1X3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKIAlpbnQgaTsKIAl1bnNpZ25lZCBzaG9ydCAqcDsKIAotCWlmIChwcm9iZWFkZHJzID09IDAgfHwgcHJvYmVhZGRyc1swXSA9PSAwKQorCWlmIChwY2ktPmlvYWRkciA9PSAwKQogCQlyZXR1cm4gMDsKIC8qCWV0aF9uaWNfYmFzZSA9IHByb2JlYWRkcnNbMF0gJiB+MzsgKi8KIAlldGhfbmljX2Jhc2UgPSBwY2ktPmlvYWRkcjsKIAorCW5pYy0+aXJxbm8gID0gMDsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKIAlHT19XSU5ET1coMCk7CiAJb3V0dyhHTE9CQUxfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKIAlWWF9CVVNZX1dBSVQ7CkBAIC00ODcsMTQgKzUwOCw0MCBAQAogCXByaW50ZigiRXRoZXJuZXQgYWRkcmVzczogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKIAogCXQ1OTVfcmVzZXQobmljKTsKLQluaWMtPnJlc2V0ID0gdDU5NV9yZXNldDsKLQluaWMtPnBvbGwgPSB0NTk1X3BvbGw7CisJZGV2LT5kaXNhYmxlICA9IHQ1OTVfZGlzYWJsZTsKKwluaWMtPnBvbGwgICAgID0gdDU5NV9wb2xsOwogCW5pYy0+dHJhbnNtaXQgPSB0NTk1X3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IHQ1OTVfZGlzYWJsZTsKLQlyZXR1cm4gbmljOworCW5pYy0+aXJxICAgICAgPSB0NTk1X2lycTsKKwlyZXR1cm4gMTsKIAogfQogCitzdGF0aWMgc3RydWN0IHBjaV9pZCB0NTk1X25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMGI3LCAweDU5MDAsICIzYzU5MCIsICAgICAgICAgICAiM0NvbTU5MCIpLAkJLyogVm9ydGV4IDEwTWJwcyAqLworUENJX1JPTSgweDEwYjcsIDB4NTk1MCwgIjNjNTk1IiwgICAgICAgICAgICIzQ29tNTk1IiksCQkvKiBWb3J0ZXggMTAwYmFzZVR4ICovCitQQ0lfUk9NKDB4MTBiNywgMHg1OTUxLCAiM2M1OTUtMSIsICAgICAgICAgIjNDb201OTUiKSwJCS8qIFZvcnRleCAxMDBiYXNlVDQgKi8KK1BDSV9ST00oMHgxMGI3LCAweDU5NTIsICIzYzU5NS0yIiwgICAgICAgICAiM0NvbTU5NSIpLAkJLyogVm9ydGV4IDEwMGJhc2UtTUlJICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDAwLCAiM2M5MDAtdHBvIiwgICAgICAgIjNDb205MDAtVFBPIiksCS8qIDEwIEJhc2UgVFBPICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDAxLCAiM2M5MDAtdDQiLCAgICAgICAgIjNDb205MDAtQ29tYm8iKSwJLyogMTAvMTAwIFQ0ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA0LCAiM2M5MDBiLXRwbyIsICAgICAgIjNDb205MDBCLVRQTyIpLAkvKiAxMCBCYXNlIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwNSwgIjNjOTAwYi1jb21ibyIsICAgICIzQ29tOTAwQi1Db21ibyIpLAkvKiAxMCBCYXNlIENvbWJvICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA2LCAiM2M5MDBiLXRwYjIiLCAgICAgIjNDb205MDBCLTIvVCIpLAkvKiAxMCBCYXNlIFRQIGFuZCBCYXNlMiAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwYSwgIjNjOTAwYi1mbCIsICAgICAgICIzQ29tOTAwQi1GTCIpLAkvKiAxMCBCYXNlIEYgKi8KK1BDSV9ST00oMHgxMGI3LCAweDk4MDAsICIzYzk4MC1jeWNsb25lLTEiLCAiM0NvbTk4MC1DeWNsb25lIiksCS8qIEN5Y2xvbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDk4MDUsICIzYzk4MDUtMSIsICAgICAgICAiM0NvbTk4MDUiKSwJCS8qIER1YWwgUG9ydCBTZXJ2ZXIgQ3ljbG9uZSAqLworUENJX1JPTSgweDEwYjcsIDB4NzY0NiwgIjNjc29obzEwMC10eC0xIiwgICIzQ1NPSE8xMDAtVFgiKSwJLyogSHVycmljYW5lICovCitQQ0lfUk9NKDB4MTBiNywgMHg0NTAwLCAiM2M0NTAtMSIsICAgICAgICAgIjNDb200NTAgSG9tZVBOQSBUb3JuYWRvIiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciB0NTk1X2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICIzQzU5NSIsCisJLnByb2JlICAgID0gdDU5NV9wcm9iZSwKKwkuaWRzICAgICAgPSB0NTk1X25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHQ1OTVfbmljcykvc2l6ZW9mKHQ1OTVfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CisKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKSW5kZXg6IGIvbmV0Ym9vdC8zYzkweC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC8zYzkweC5jCisrKyBiL25ldGJvb3QvM2M5MHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAzYzkweC5jIC0tIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAzYzkweCBkcml2ZXIgZm9yIGV0aGVyYm9vdC4gIFdyaXR0ZW4KICAqIGJ5IEdyZWcgQmVlbGV5LCBHcmVnLkJlZWxleUBMaWdodFN5cy5vcmcuICBNb2RpZmllZCBieSBTdGV2ZSBTbWl0aCwKLSAqIFN0ZXZlLlNtaXRoQEp1bm8uQ29tCisgKiBTdGV2ZS5TbWl0aEBKdW5vLkNvbS4gQWxpZ25tZW50IGJ1ZyBmaXggTmVpbCBOZXdlbGwgKG5uQGljZW5vaXIubmV0KS4KICAqCiAgKiBUaGlzIHByb2dyYW0gQ29weXJpZ2h0IChDKSAxOTk5IExpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5OSBTdGV2ZSBTbWl0aApAQCAtMzEsMTMgKzMxLDE1IEBACiAgKgkJCQkJUmUtd3JvdGUgcG9sbCBhbmQgdHJhbnNtaXQgZm9yCiAgKgkJCQkJYmV0dGVyIGVycm9yIHJlY292ZXJ5IGFuZCBoZWF2eQogICoJCQkJCW5ldHdvcmsgdHJhZmZpYyBvcGVyYXRpb24KKyAqIHYyLjAxICAgIDUtMjYtMjAwMyBOTiBGaXhlZCBkcml2ZXIgYWxpZ25tZW50IGlzc3VlIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgIGNhdXNlZCBzeXN0ZW0gbG9ja3VwcyBpZiBkcml2ZXIgc3RydWN0dXJlcworICogICAgICAgICAgICAgICAgICBub3QgOC1ieXRlIGFsaWduZWQuCiAgKgogICovCiAKICNpbmNsdWRlICJldGhlcmJvb3QuaCIKICNpbmNsdWRlICJuaWMuaCIKICNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgogI2luY2x1ZGUgInRpbWVyLmgiCiAKICNkZWZpbmUJWENWUl9NQUdJQwkoMHg1QTAwKQpAQCAtNDcsOSArNDksNiBAQAogICoqLwogI2RlZmluZQlYTUlUX1JFVFJJRVMJMjUwCiAKLSN1bmRlZgl2aXJ0X3RvX2J1cwotI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkoKHVuc2lnbmVkIGxvbmcpeCkKLQogLyoqKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIDNjOTA1ICoqKi8KIGVudW0gUmVnaXN0ZXJzCiAgICAgewpAQCAtMjI1LDcgKzIyNCw3IEBACiAgICAgdW5zaWduZWQgaW50CURhdGFBZGRyOwogICAgIHVuc2lnbmVkIGludAlEYXRhTGVuZ3RoOwogICAgIH0KLSAgICBUWEQ7CisgICAgVFhEIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7IC8qIDY0LWJpdCBhbGlnbmVkIGZvciBidXMgbWFzdGVyaW5nICovCiAKIC8qKiogUlggZGVzY3JpcHRvciAqKiovCiB0eXBlZGVmIHN0cnVjdApAQCAtMjM1LDcgKzIzNCw3IEBACiAgICAgdW5zaWduZWQgaW50CURhdGFBZGRyOwogICAgIHVuc2lnbmVkIGludAlEYXRhTGVuZ3RoOwogICAgIH0KLSAgICBSWEQ7CisgICAgUlhEIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7IC8qIDY0LWJpdCBhbGlnbmVkIGZvciBidXMgbWFzdGVyaW5nICovCiAKIC8qKiogR2xvYmFsIHZhcmlhYmxlcyAqKiovCiBzdGF0aWMgc3RydWN0CkBAIC0zMTEsNiArMzEwLDcgQEAKICAgICB9CiAKIAorI2lmIDAKIC8qKiogYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tV29yZCAtIHdyaXRlIGEgcGh5c2ljYWwgd29yZCBvZgogICoqKiBkYXRhIHRvIHRoZSBvbmJvYXJkIHNlcmlhbCBlZXByb20gKG5vdCB0aGUgQklPUyBwcm9tLCBidXQgdGhlCiAgKioqIG52cmFtIGluIHRoZSBjYXJkIHRoYXQgc3RvcmVzLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBNQUMKQEAgLTM0NCw4ICszNDQsOSBAQAogCiAgICAgcmV0dXJuIDA7CiAgICAgfQorI2VuZGlmCiAKLQorI2lmIDAKIC8qKiogYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tIC0gd3JpdGUgZGF0YSB0byB0aGUgc2VyaWFsIGVlcHJvbSwKICAqKiogYW5kIHJlLWNvbXB1dGUgdGhlIGVlcHJvbSBjaGVja3N1bS4KICAqKiovCkBAIC0zODQsOCArMzg1LDcgQEAKIAogICAgIHJldHVybiAwOwogICAgIH0KLQotCisjZW5kaWYKIAogLyoqKiBhM2M5MHhfcmVzZXQ6IGV4cG9ydGVkIGZ1bmN0aW9uIHRoYXQgcmVzZXRzIHRoZSBjYXJkIHRvIGl0cyBkZWZhdWx0CiAgKioqIHN0YXRlLiAgVGhpcyBpcyBzbyB0aGUgTGludXggZHJpdmVyIGNhbiByZS1zZXQgdGhlIGNhcmQgdXAgdGhlIHdheQpAQCAtMzkzLDEyICszOTMsMTAgQEAKICAqKiogbm90IGFsdGVyIHRoZSBzZWxlY3RlZCB0cmFuc2NlaXZlciB0aGF0IHdlIHVzZWQgdG8gZG93bmxvYWQgdGhlIGJvb3QKICAqKiogaW1hZ2UuCiAgKioqLwotc3RhdGljIHZvaWQKLWEzYzkweF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBhM2M5MHhfcmVzZXQodm9pZCkKICAgICB7Ci0gICAgaW50IGNmZzsKLQogI2lmZGVmCUNGR18zQzkwWF9QUkVTRVJWRV9YQ1ZSCisgICAgaW50IGNmZzsKICAgICAvKiogUmVhZCB0aGUgY3VycmVudCBJbnRlcm5hbENvbmZpZyB2YWx1ZS4gKiovCiAgICAgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhJTkZfM0M5MFguSU9BZGRyLCB3aW5UeFJ4T3B0aW9uczMpOwogICAgIGNmZyA9IGlubChJTkZfM0M5MFguSU9BZGRyICsgcmVnSW50ZXJuYWxDb25maWdfM19sKTsKQEAgLTQ3Myw3ICs0NzEsNyBAQAogICoqKiBwIC0gdGhlIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBkYXRhIGl0c2VsZi4KICAqKiovCiBzdGF0aWMgdm9pZAotYTNjOTB4X3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCithM2M5MHhfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkKICAgICB7CiAKQEAgLTU1Myw3ICs1NTEsNyBAQAogCWlmIChzdGF0dXMgJiAweDAyKQogCSAgICB7CiAJICAgIHByaW50ZigiM0M5MFg6IFR4IFJlY2xhaW0gRXJyb3IgKCVoaFgpXG4iLCBzdGF0dXMpOwotCSAgICBhM2M5MHhfcmVzZXQoTlVMTCk7CisJICAgIGEzYzkweF9yZXNldCgpOwogCSAgICB9CiAJZWxzZSBpZiAoc3RhdHVzICYgMHgwNCkKIAkgICAgewpAQCAtNTcyLDE4ICs1NzAsMTggQEAKIAllbHNlIGlmIChzdGF0dXMgJiAweDEwKQogCSAgICB7CiAJICAgIHByaW50ZigiM0M5MFg6IFR4IFVuZGVycnVuICglaGhYKVxuIiwgc3RhdHVzKTsKLQkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICBhM2M5MHhfcmVzZXQoKTsKIAkgICAgfQogCWVsc2UgaWYgKHN0YXR1cyAmIDB4MjApCiAJICAgIHsKIAkgICAgcHJpbnRmKCIzQzkwWDogVHggSmFiYmVyICglaGhYKVxuIiwgc3RhdHVzKTsKLQkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICBhM2M5MHhfcmVzZXQoKTsKIAkgICAgfQogCWVsc2UgaWYgKChzdGF0dXMgJiAweDgwKSAhPSAweDgwKQogCSAgICB7CiAJICAgIHByaW50ZigiM0M5MFg6IEludGVybmFsIEVycm9yIC0gSW5jb21wbGV0ZSBUcmFuc21pc3Npb24gKCVoaFgpXG4iLAogCSAgICAgICAgICAgc3RhdHVzKTsKLQkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICBhM2M5MHhfcmVzZXQoKTsKIAkgICAgfQogCX0KIApAQCAtNjAxLDcgKzU5OSw3IEBACiAgKioqIGluIG5pYy0+cGFja2V0bGVuLiAgUmV0dXJuIDEgaWYgYSBwYWNrZXQgd2FzIGZvdW5kLgogICoqKi8KIHN0YXRpYyBpbnQKLWEzYzkweF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK2EzYzkweF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogICAgIHsKICAgICBpbnQgaSwgZXJyY29kZTsKIApAQCAtNjEwLDYgKzYwOCw4IEBACiAJcmV0dXJuIDA7CiAJfQogCisgICAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICAgICAvKiogd2UgZG9uJ3QgbmVlZCB0byBhY2tub3dsZWRnZSByeENvbXBsZXRlIC0tIHRoZSB1cGxvYWQgZW5naW5lCiAgICAgICoqIGRvZXMgaXQgZm9yIHVzLgogICAgICAqKi8KQEAgLTY2MywzNCArNjYzLDUxIEBACiAgKioqIFtLZW5dCiAgKioqLwogc3RhdGljIHZvaWQKLWEzYzkweF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLSAgICB7CithM2M5MHhfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYgX191bnVzZWQpCit7CisJLyogcmVzZXQgYW5kIGRpc2FibGUgbWVyZ2UgKi8KKwlhM2M5MHhfcmVzZXQoKTsKIAkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIuICovCiAJb3V0dyhjbWRSeERpc2FibGUsIElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpOwogCW91dHcoY21kVHhEaXNhYmxlLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKLSAgICB9Ci0KK30KIAorc3RhdGljIHZvaWQgYTNjOTB4X2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQogCiAvKioqIGEzYzkweF9wcm9iZTogZXhwb3J0ZWQgcm91dGluZSB0byBwcm9iZSBmb3IgdGhlIDNjOTA1IGNhcmQgYW5kIHBlcmZvcm0KICAqKiogaW5pdGlhbGl6YXRpb24uICBJZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgcGNpIGZ1bmN0aW9ucyBkaWQgZmluZCB0aGUKICAqKiogY2FyZC4gIFdlIGp1c3QgaGF2ZSB0byBpbml0IGl0IGhlcmUuCiAgKioqLwotc3RydWN0IG5pYyoKLWEzYzkweF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQotICAgIHsKK3N0YXRpYyBpbnQgYTNjOTB4X3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKyAgICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKICAgICBpbnQgaSwgYzsKICAgICB1bnNpZ25lZCBzaG9ydCBlZXByb21bMHgyMV07CiAgICAgdW5zaWduZWQgaW50IGNmZzsKICAgICB1bnNpZ25lZCBpbnQgbW9wdDsKKyAgICB1bnNpZ25lZCBpbnQgbXN0YXQ7CiAgICAgdW5zaWduZWQgc2hvcnQgbGlua3R5cGU7CisjZGVmaW5lCUhXQUREUl9PRkZTRVQJMTAKIAotICAgIGlmIChwcm9iZWFkZHJzID09IDAgfHwgcHJvYmVhZGRyc1swXSA9PSAwKQorICAgIGlmIChwY2ktPmlvYWRkciA9PSAwKQogICAgICAgICAgIHJldHVybiAwOwogCiAgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKIAotICAgIElORl8zQzkwWC5JT0FkZHIgPSBwcm9iZWFkZHJzWzBdICYgfjM7CisgICAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworICAgIG5pYy0+aXJxbm8gPSAwOworCisgICAgSU5GXzNDOTBYLklPQWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CiAgICAgSU5GXzNDOTBYLkN1cnJlbnRXaW5kb3cgPSAyNTU7CiAgICAgc3dpdGNoIChhM2M5MHhfaW50ZXJuYWxfUmVhZEVlcHJvbShJTkZfM0M5MFguSU9BZGRyLCAweDAzKSkKIAl7CkBAIC03NTYsMzAgKzc3Myw0NSBAQAogICAgICAgICAgICAiQ29weXJpZ2h0IDE5OTkgTGlnaHRTeXMgVGVjaG5vbG9neSBTZXJ2aWNlcywgSW5jLlxuIgogICAgICAgICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0IDE5OTkgU3RldmUgU21pdGhcbiIpOwogICAgIHByaW50ZigiUHJvdmlkZWQgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLlxuIik7CisjaWZkZWYJQ0ZHXzNDOTBYX0JPT1RST01fRklYCisgICAgaWYgKElORl8zQzkwWC5pc0JyZXYpCisgICAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJOT1RFOiAzYzkwNWIgYm9vdHJvbSBmaXggZW5hYmxlZDsgaGFzIHNpZGUgIgorCSAgICJlZmZlY3RzLiAgU2VlIDNjOTB4LnR4dCBmb3IgaW5mby5cbiIpOworCX0KKyNlbmRpZgogICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKICAgICAvKiogUmV0cmlldmUgdGhlIEhhcmR3YXJlIGFkZHJlc3MgYW5kIHByaW50IGl0IG9uIHRoZSBzY3JlZW4uICoqLwotICAgIElORl8zQzkwWC5IV0FkZHJbMF0gPSBlZXByb21bMF0+Pjg7Ci0gICAgSU5GXzNDOTBYLkhXQWRkclsxXSA9IGVlcHJvbVswXSYweEZGOwotICAgIElORl8zQzkwWC5IV0FkZHJbMl0gPSBlZXByb21bMV0+Pjg7Ci0gICAgSU5GXzNDOTBYLkhXQWRkclszXSA9IGVlcHJvbVsxXSYweEZGOwotICAgIElORl8zQzkwWC5IV0FkZHJbNF0gPSBlZXByb21bMl0+Pjg7Ci0gICAgSU5GXzNDOTBYLkhXQWRkcls1XSA9IGVlcHJvbVsyXSYweEZGOworICAgIElORl8zQzkwWC5IV0FkZHJbMF0gPSBlZXByb21bSFdBRERSX09GRlNFVCArIDBdPj44OworICAgIElORl8zQzkwWC5IV0FkZHJbMV0gPSBlZXByb21bSFdBRERSX09GRlNFVCArIDBdJjB4RkY7CisgICAgSU5GXzNDOTBYLkhXQWRkclsyXSA9IGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMV0+Pjg7CisgICAgSU5GXzNDOTBYLkhXQWRkclszXSA9IGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMV0mMHhGRjsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzRdID0gZWVwcm9tW0hXQUREUl9PRkZTRVQgKyAyXT4+ODsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzVdID0gZWVwcm9tW0hXQUREUl9PRkZTRVQgKyAyXSYweEZGOwogICAgIHByaW50ZigiTUFDIEFkZHJlc3MgPSAlIVxuIiwgSU5GXzNDOTBYLkhXQWRkcik7CiAKKyAgICAvKiBUZXN0IGlmIHRoZSBsaW5rIGlzIGdvb2QsIGlmIG5vdCBjb250aW51ZSAqLworICAgIGEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coSU5GXzNDOTBYLklPQWRkciwgd2luRGlhZ25vc3RpY3M0KTsKKyAgICBtc3RhdCA9IGludyhJTkZfM0M5MFguSU9BZGRyICsgcmVnTWVkaWFTdGF0dXNfNF93KTsKKyAgICBpZigobXN0YXQgJiAoMTw8MTEpKSA9PSAwKSB7CisJcHJpbnRmKCJWYWxpZCBsaW5rIG5vdCBlc3RhYmxpc2hlZFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCiAgICAgLyoqIFByb2dyYW0gdGhlIE1BQyBhZGRyZXNzIGludG8gdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3RlcnMgKiovCiAgICAgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhJTkZfM0M5MFguSU9BZGRyLCB3aW5BZGRyZXNzaW5nMik7Ci0gICAgb3V0dyhodG9ucyhlZXByb21bMF0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdyk7Ci0gICAgb3V0dyhodG9ucyhlZXByb21bMV0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdysyKTsKLSAgICBvdXR3KGh0b25zKGVlcHJvbVsyXSksIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uQWRkcmVzc18yXzN3KzQpOworICAgIG91dHcoaHRvbnMoZWVwcm9tW0hXQUREUl9PRkZTRVQgKyAwXSksIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uQWRkcmVzc18yXzN3KTsKKyAgICBvdXR3KGh0b25zKGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMV0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdysyKTsKKyAgICBvdXR3KGh0b25zKGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMl0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdys0KTsKICAgICBvdXR3KDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uTWFza18yXzN3KzApOwogICAgIG91dHcoMCwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25NYXNrXzJfM3crMik7CiAgICAgb3V0dygwLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdys0KTsKIAogICAgIC8qKiBGaWxsIGluIG91ciBlbnRyeSBpbiB0aGUgZXRoZXJib290IGFycCB0YWJsZSAqKi8KICAgICBmb3IoaT0wO2k8RVRIX0FMRU47aSsrKQotCW5pYy0+bm9kZV9hZGRyW2ldID0gKGVlcHJvbVtpLzJdID4+ICg4KigoaSYxKV4xKSkpICYgMHhmZjsKKwluaWMtPm5vZGVfYWRkcltpXSA9IChlZXByb21bSFdBRERSX09GRlNFVCArIGkvMl0gPj4gKDgqKChpJjEpXjEpKSkgJiAweGZmOwogCiAgICAgLyoqIFJlYWQgdGhlIG1lZGlhIG9wdGlvbnMgcmVnaXN0ZXIsIHByaW50IGEgbWVzc2FnZSBhbmQgc2V0IGRlZmF1bHQKICAgICAgKiogeGN2ci4KQEAgLTkwMyw4ICs5MzUsOCBAQAogICAgIHdoaWxlIChpbncoSU5GXzNDOTBYLklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdykgJiBJTlRfQ01ESU5QUk9HUkVTUykKIAk7CiAKLSAgICAvKiogU2V0IHRoZSBSWCBmaWx0ZXIgPSByZWNlaXZlIG9ubHkgaW5kaXZpZHVhbCBwa3RzICYgYmNhc3QuICoqLwotICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kU2V0UnhGaWx0ZXIsIDB4MDEgKyAweDA0KTsKKyAgICAvKiogU2V0IHRoZSBSWCBmaWx0ZXIgPSByZWNlaXZlIG9ubHkgaW5kaXZpZHVhbCBwa3RzICYgbXVsdGljYXN0ICYgYmNhc3QuICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kU2V0UnhGaWx0ZXIsIDB4MDEgKyAweDAyICsgMHgwNCk7CiAgICAgYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRSeEVuYWJsZSwgMCk7CiAKIApAQCAtOTE4LDEyICs5NTAsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZEFja25vd2xlZGdlSW50ZXJydXB0LCAweDY2MSk7CiAKICAgICAvKiogU2V0IG91ciBleHBvcnRlZCBmdW5jdGlvbnMgKiovCi0gICAgbmljLT5yZXNldCAgICA9IGEzYzkweF9yZXNldDsKKyAgICBkZXYtPmRpc2FibGUgID0gYTNjOTB4X2Rpc2FibGU7CiAgICAgbmljLT5wb2xsICAgICA9IGEzYzkweF9wb2xsOwogICAgIG5pYy0+dHJhbnNtaXQgPSBhM2M5MHhfdHJhbnNtaXQ7Ci0gICAgbmljLT5kaXNhYmxlICA9IGEzYzkweF9kaXNhYmxlOworICAgIG5pYy0+aXJxICAgICAgPSBhM2M5MHhfaXJxOwogCi0gICAgcmV0dXJuIG5pYzsKLSAgICB9CisgICAgcmV0dXJuIDE7Cit9CiAKIAorc3RhdGljIHN0cnVjdCBwY2lfaWQgYTNjOTB4X25pY3NbXSA9IHsKKy8qIE9yaWdpbmFsIDkweCByZXZpc2lvbnM6ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDAwLCAiM2M5MDUtdHBvIiwgICAgICIzQ29tOTAwLVRQTyIpLAkvKiAxMCBCYXNlIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwMSwgIjNjOTA1LXQ0IiwgICAgICAiM0NvbTkwMC1Db21ibyIpLAkvKiAxMC8xMDAgVDQgKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwNTAsICIzYzkwNS10cG8xMDAiLCAgIjNDb205MDUtVFgiKSwJCS8qIDEwMCBCYXNlIFRYIC8gMTAvMTAwIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTA1MSwgIjNjOTA1LWNvbWJvIiwgICAiM0NvbTkwNS1UNCIpLAkJLyogMTAwIEJhc2UgVDQgLyAxMCBCYXNlIENvbWJvICovCisvKiBOZXdlciA5MHhCIHJldmlzaW9uczogKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDQsICIzYzkwNWItdHBvIiwgICAgIjNDb205MDBCLVRQTyIpLAkvKiAxMCBCYXNlIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwNSwgIjNjOTA1Yi1jb21ibyIsICAiM0NvbTkwMEItQ29tYm8iKSwJLyogMTAgQmFzZSBDb21ibyAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwNiwgIjNjOTA1Yi10cGIyIiwgICAiM0NvbTkwMEItMi9UIiksCS8qIDEwIEJhc2UgVFAgYW5kIEJhc2UyICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDBhLCAiM2M5MDViLWZsIiwgICAgICIzQ29tOTAwQi1GTCIpLAkvKiAxMCBCYXNlIEZMICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDU1LCAiM2M5MDViLXRwbzEwMCIsICIzQ29tOTA1Qi1UWCIpLAkvKiAxMC8xMDAgVFBPICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDU2LCAiM2M5MDViLXQ0IiwgICAgICIzQ29tOTA1Qi1UNCIpLAkvKiAxMC8xMDAgVDQgKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwNTgsICIzYzkwNWItOTA1OCIsICAgIjNDb205MDVCLTkwNTgiKSwJLyogQ3ljbG9uZSAxMC8xMDAvQk5DICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDVhLCAiM2M5MDViLWZ4IiwgICAgICIzQ29tOTA1Qi1GTCIpLAkvKiAxMDAgQmFzZSBGWCAvIDEwIEJhc2UgRlggKi8KKy8qIE5ld2VyIDkweEMgcmV2aXNpb246ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MjAwLCAiM2M5MDVjLXRwbyIsICAgICIzQ29tOTA1Qy1UWE0iKSwJLyogMTAvMTAwIFRQTyAoM0M5MDVDLVRYTSkgKi8KK1BDSV9ST00oMHgxMGI3LCAweDkyMTAsICIzYzkyMGItZW1iLXdubSIsIjNDb20yMEItRU1CIFdOTSIpLAorUENJX1JPTSgweDEwYjcsIDB4OTgwMCwgIjNjOTgwIiwgICAgICAgICAiM0NvbTk4MC1DeWNsb25lIiksCS8qIEN5Y2xvbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDk4MDUsICIzYzk4MDUiLCAgICAgICAgIjNDb205ODA1IiksCQkvKiBEdWFsIFBvcnQgU2VydmVyIEN5Y2xvbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDc2NDYsICIzY3NvaG8xMDAtdHgiLCAgIjNDU09ITzEwMC1UWCIpLAkvKiBIdXJyaWNhbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDQ1MDAsICIzYzQ1MCIsICAgICAgICAgIjNDb200NTAgSG9tZVBOQSBUb3JuYWRvIiksCitQQ0lfUk9NKDB4MTBiNywgMHgxMjAxLCAiM2M5ODJhIiwgICAgICAgICIzQ29tOTgyQSIpLAorUENJX1JPTSgweDEwYjcsIDB4MTIwMiwgIjNjOTgyYiIsICAgICAgICAiM0NvbTk4MkIiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIGEzYzkweF9kcml2ZXIgPSB7CisJLnR5cGUgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgPSAiM0M5MFgiLAorCS5wcm9iZSAgICA9IGEzYzkweF9wcm9iZSwKKwkuaWRzICAgICAgPSBhM2M5MHhfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YoYTNjOTB4X25pY3MpL3NpemVvZihhM2M5MHhfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CkluZGV4OiBiL25ldGJvb3QvM2M5MHgudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC8zYzkweC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotCi0JSW5zdHJ1Y3Rpb25zIGZvciB1c2Ugb2YgdGhlIDNDOTBYIGRyaXZlciBmb3IgRXRoZXJCb290Ci0KLQkJT3JpZ2luYWwgM0M5MDVCIHN1cHBvcnQgYnk6Ci0JCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKSwKLQkJCUxpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4KLQkJCUZlYnJ1YXJ5IDExLCAxOTk5Ci0KLQkJVXBkYXRlcyBmb3IgM0M5MFggZmFtaWx5IGJ5OgotCQkJU3RldmUgU21pdGggKHN0ZXZlLnNtaXRoQGp1bm8uY29tKQotCQkJT2N0b2JlciAxLCAxOTk5Ci0KLQkJTWlub3IgZG9jdW1lbnRhdGlvbiB1cGRhdGVzIGJ5Ci0JCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKQotCQkJTWFyY2ggMjksIDIwMDAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JICAgT1ZFUlZJRVcKLQotICAgIFRoZSAzYzkwWCBzZXJpZXMgZXRoZXJuZXQgY2FyZHMgYXJlIGEgZ3JvdXAgb2YgaGlnaC1wZXJmb3JtYW5jZSBidXNtYXN0ZXIKLSAgICBETUEgY2FyZHMgZnJvbSAzQ29tLiAgVGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBzdXBwb3J0cyBib3RoIHRoZSAzYzkweCBhbmQKLSAgICB0aGUgM2M5MHhCIHJldmlzaW9uIGNhcmRzLiAgM0M5MHhDIGZhbWlseSBzdXBwb3J0IGhhcyBiZWVuIHRlc3RlZCB0byBzb21lCi0gICAgZGVncmVlIGJ1dCBub3QgZXh0ZW5zaXZlbHkuCi0KLSAgICBIZXJlJ3MgdGhlIGxpY2Vuc2luZyBpbmZvcm1hdGlvbjoKLQotICAgIFRoaXMgcHJvZ3JhbSBDb3B5cmlnaHQgKEMpIDE5OTkgTGlnaHRTeXMgVGVjaG5vbG9neSBTZXJ2aWNlcywgSW5jLgotICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5OSBTdGV2ZSBTbWl0aC4KLQotICAgIFRoaXMgcHJvZ3JhbSBtYXkgYmUgcmUtZGlzdHJpYnV0ZWQgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtLCBtb2RpZmllZCwKLSAgICBzb2xkLCBvciBjb3BpZWQgZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbWVzc2FnZQotICAgIGFuZCB0aGlzIHRleHQgYXJlIGluY2x1ZGVkIHdpdGggYWxsIHNvdXJjZSBjb3BpZXMgb3IgZGVyaXZhdGl2ZSB3b3JrcywgYW5kCi0gICAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIHRoaXMgdGV4dCBhcmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgZG9jdW1lbnRhdGlvbiBvZiBhbnkgYmluYXJ5LW9ubHkgZGlzdHJpYnV0aW9ucy4gIFRoaXMgcHJvZ3JhbSBpcwotICAgIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB3aXRob3V0IGV2ZW4gdGhlIHdhcnJhbnR5IG9mIEZJVE5FU1MgRk9SCi0gICAgQSBQQVJUSUNVTEFSIFBVUlBPU0Ugb3IgTUVSQ0hBTlRBQklMSVRZLiAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQKLSAgICBkb2N1bWVudGF0aW9uICIzYzkweC50eHQiIGJlZm9yZSBjb21waWxpbmcgYW5kIHVzaW5nIHRoaXMgZHJpdmVyLgotCi0KLUlJICBGTEFTSCBQUk9NUwotCi0gICAgVGhlIDNjOTB4QiBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIG9ubHkgYWNjZXB0IHRoZQotICAgIGZvbGxvd2luZyBmbGFzaCBtZW1vcnkgY2hpcHM6Ci0KLQlBdG1lbCBBVDI5QzUxMiAoNjQga2lsb2J5dGUpCi0JQXRtZWwgQVQyOUMwMTAgKDEyOCBraWxvYnl0ZSkKLQotICAgIFRoZSAzYzkweCBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIGFjY2VwdCB0aGUKLSAgICBmb2xsb3dpbmcgZmxhc2ggbWVtb3J5IGNoaXBzIGNhcGFjaXRpZXM6Ci0KLQk2NCAga2IgKDgga0IpCi0JMTI4IGtiICgxNiBrQikKLQkyNTYga2IgKDMyIGtCKSBhbmQKLQk1MTIga2IgKDY0IGtCKQotCi0gICAgQXRtZWwgQVQyOUM1MTIgKDY0IGtpbG9ieXRlKSBjaGlwcyBhcmUgc3BlY2lmaWNhbGx5IGxpc3RlZCBmb3IgYm90aAotICAgIGFkYXB0ZXJzLCBidXQgZmxhc2hpbmcgb24gdGhlIDNjOTA1YiBjYXJkcyB3b3VsZCBvbmx5IGJlIHN1cHBvcnRlZAotICAgIHRocm91Z2ggdGhlIEF0bWVsIHBhcnRzLiAgQW55IGRldmljZSwgb2YgdGhlIHN1cHBvcnRlZCBzaXplLCBzaG91bGQKLSAgICBiZSBzdXBwb3J0ZWQgd2hlbiBwcm9ncmFtbWVkIGJ5IGEgZGVkaWNhdGVkIFBST00gcHJvZ3JhbW1lciAoZS5nLgotICAgIG5vdCB0aGUgY2FyZCkuCi0KLSAgICBUbyB1c2UgdGhpcyBkcml2ZXIgaW4gc3VjaCBhIFBST00sIHZpc2l0IEF0bWVsJ3Mgd2ViIHNpdGUgYW5kIGRvd25sb2FkCi0gICAgdGhlaXIgLlBERiBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHRoZWlyIGRpc3RyaWJ1dG9ycy4gIENvbnRhY3QgdGhlCi0gICAgZGlzdHJpYnV0b3JzIGZvciBwcmljaW5nIGluZm9ybWF0aW9uLiAgVGhlIHByaWNlcyBhcmUgcXVpdGUgcmVhc29uYWJsZQotICAgIChhYm91dCAkMyBVUyBlYWNoIGZvciB0aGUgNjQga0IgcGFydCksIGFuZCBhcmUgY29tcGFyYWJsZSB0byB3aGF0IG9uZSB3b3VsZAotICAgIGV4cGVjdCBmb3Igc2ltaWxhcmx5IHNpemVkIHN0YW5kYXJkIEVQUk9Ncy4gIEFuZCwgdGhlIGZsYXNoIGNoaXBzIGFyZSBtdWNoCi0gICAgZWFzaWVyIHRvIHdvcmsgd2l0aCwgYXMgdGhleSBkb24ndCBuZWVkIHRvIGJlIFVWLWVyYXNlZCB0byBiZSByZXByb2dyYW1tZWQuCi0gICAgVGhlIDNDOTA1QiBjYXJkIGFjdHVhbGx5IHByb3ZpZGVzIGEgbWV0aG9kIHRvIHByb2dyYW0gdGhlIGZsYXNoIG1lbW9yeQotICAgIHdoaWxlIGl0IGlzIHJlc2lkZW50IG9uIGJvYXJkIHRoZSBjYXJkIGl0c2VsZjsgaWYgc29tZW9uZSB3b3VsZCBsaWtlIHRvCi0gICAgd3JpdGUgYSBzbWFsbCBET1MgcHJvZ3JhbSB0byBkbyB0aGUgcHJvZ3JhbW1pbmcsIEkgY2FuIHByb3ZpZGUgdGhlCi0gICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc28gZm9ydGguCi0KLSAgICBBIHV0aWxpdHkgcHJvZ3JhbSwgM2M5MHh1dGlsLCBpcyBwcm92aWRlZCB3aXRoIEV0aGVyYm9vdCBpbiB0aGUgJ2NvbnRyaWInCi0gICAgZGlyZWN0b3J5IHRoYXQgYWxsb3dzIGZvciB0aGUgb24tYm9hcmQgZmxhc2hpbmcgb2YgdGhlIFJPTSB3aGlsZSBMaW51eAotICAgIGlzIHJ1bm5pbmcuICBUaGUgcHJvZ3JhbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXNlZCB1bmRlciBMaW51eCwgYnV0IEkKLSAgICBoYXZlIGhlYXJkIHByb2JsZW0gcmVwb3J0cyBvZiBpdHMgdXNlIHVuZGVyIEZyZWVCU0QuICBBbnlvbmUgd2lsbGluZyB0bwotICAgIG1ha2UgaXQgd29yayB1bmRlciBGcmVlQlNEIGlzIG1vcmUgdGhhbiB3ZWxjb21lIHRvIGRvIHNvIQotCi0gICAgWW91IGFsc28gaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIEVQUk9NIGNoaXBzIC0gdGhlIDNDOTA1Qi1UWC1OTSBoYXMgYmVlbgotICAgIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgd2l0aCAyN0MyNTYgKDMya0IpIGFuZCAyN0M1MTIgKDY0a0IpIGNoaXBzIHdpdGggYQotICAgIHNwZWNpZmllZCBhY2Nlc3MgdGltZSBvZiAxMDBucyBhbmQgZmFzdGVyLgotCi0KLUlJSSBHRU5FUkFMIFVTRQotCi0gICAgTm9ybWFsbHksIHRoZSBiYXNpYyBwcm9jZWR1cmUgZm9yIHVzaW5nIHRoaXMgZHJpdmVyIGlzIGFzIGZvbGxvd3M6Ci0KLQkxLiAgUnVuIHRoZSAzYzkweGNmZyBwcm9ncmFtIG9uIHRoZSBkcml2ZXIgZGlza2V0dGUgdG8gZW5hYmxlIHRoZQotCWJvb3QgUFJPTSBhbmQgc2V0IGl0IHRvIDY0ayBvciAxMjhrLCBhcyBhcHByb3ByaWF0ZS4KLQkyLiAgQnVpbGQgdGhlIGFwcHJvcHJpYXRlIDNjOTB4LmZkMCBvciAzYzkweC5mZDAgZmxvcHB5IGltYWdlIHdpdGgKLQlwb3NzaWJseSB0aGUgdmFsdWUgQ0ZHXzNDOTBYX1hDVlIgZGVmaW5lZCB0byB0aGUgdHJhbnNjZWl2ZXIgdHlwZSB0aGF0Ci0JeW91IHdhbnQgdG8gdXNlIChpLmUuLCAxMC8xMDAgcmo0NSwgQVVJLCBjb2F4LCBNSUkpLgotCTMuICBSdW4gdGhlIGZsb3BweSBpbWFnZSBvbiB0aGUgUEMgdG8gYmUgbmV0d29yayBib290ZWQsIHRvIGdldAotCWl0IGNvbmZpZ3VyZWQsIGFuZCB0byB2ZXJpZnkgdGhhdCBpdCB3aWxsIGJvb3QgcHJvcGVybHkuCi0JNC4gIEJ1aWxkIHRoZSAzYzkweC5yb20gb3IgM2M5MHgubHpyb20gUFJPTSBpbWFnZSBhbmQgcHJvZ3JhbQotCWl0IGludG8gdGhlIGZsYXNoIG9yIEVQUk9NIG1lbW9yeSBjaGlwLgotCTUuICBQdXQgdGhlIFBST00gaW4gdGhlIGV0aGVybmV0IGNhcmQsIGJvb3QgYW5kIGVuYWJsZSAnYm9vdCBmcm9tCi0JbmV0d29yayBmaXJzdCcgaW4gdGhlIHN5c3RlbSBCSU9TLCBzYXZlIGFuZCByZWJvb3QuCi0KLSAgICBIZXJlIGFyZSBzb21lIGlzc3VlcyB0byBiZSBhd2FyZSBvZjoKLQotCTEuICBJZiB5b3UgZXhwZXJpZW5jZSBjcmFzaGVzIG9yIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiB1c2luZyB0aGUKLQlib290IFBST00sIGFkZCB0aGUgc2V0dGluZyBDRkdfM0M5MFhfQk9PVFJPTV9GSVggYW5kIGdvIHRocm91Z2ggdGhlCi0Jc3RlcHMgMi01IGFib3ZlLiAgVGhpcyB3b3JrcyBhcm91bmQgYSBidWcgaW4gc29tZSAzYzkwNUIgY2FyZHMgKHNlZQotCWJlbG93KSwgYnV0IGhhcyBzb21lIHNpZGUtZWZmZWN0cyB3aGljaCBtYXkgbm90IGJlIGRlc2lyYWJsZS4KLSAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCB5b3UgaGF2ZSB0byBib290IG9mZiBhIGZsb3BweSAobm90IFBST00hKSBvbmNlIGZvcgotICAgICAgICB0aGlzIGZpeCB0byB0YWtlIGVmZmVjdC4KLQkyLiAgVGhlIHBvc3NpYmxlIG5lZWQgdG8gbWFudWFsbHkgc2V0IHRoZSBDRkdfM0M5MFhfWENWUiB2YWx1ZSB0bwotCWNvbmZpZ3VyZSB0aGUgdHJhbnNjZWl2ZXIgdHlwZS4gIFZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LgotCTMuICBUaGUgcG9zc2libGUgbmVlZCB0byBkZWZpbmUgQ0ZHXzNDOTBYX1BSRVNFUlZFX1hDVlIgZm9yIHVzZSBpbgotCW9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3QgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmUgdGhlCi0JdHJhbnNjZWl2ZXIgdHlwZS4KLQotICAgIFNvbWUgdGhpbmdzIHRoYXQgYXJlIG9uIHRoZSAnVG8tRG8nIGxpc3QsIHBlcmhhcHMgZm9yIG1lLCBidXQgcGVyaGFwcwotICAgIGZvciBhbnkgb3RoZXIgdm9sdW50ZWVycyBvdXQgdGhlcmU6Ci0KLQkxLiAgRXh0ZW5kIHRoZSBkcml2ZXIgdG8gZnVsbHkgaW1wbGVtZW50IHRoZSBhdXRvLXNlbGVjdAotCWFsZ29yaXRobSBpZiB0aGUgY2FyZCBoYXMgbXVsdGlwbGUgbWVkaWEgcG9ydHMuCi0JMi4gIEZpeCBhbnkgYnVncyBpbiB0aGUgY29kZSA8Z3Jpbj4uLi4uCi0JMy4gIEV4dGVuZCB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdGhlIDNjOTA1YyByZXZpc2lvbiBjYXJkcwotCSJvZmZpY2lhbGx5Ii4gIFJpZ2h0IG5vdywgdGhlIHN1cHBvcnQgaGFzIGJlZW4gcHJpbWFyaWx5IGVtcGlyaWNhbAotCWFuZCBub3QgYmFzZWQgb24gM2M5MDVDIGRvY3VtZW50YXRpb24uCi0KLSAgICBOb3cgZm9yIHRoZSBkZXRhaWxzLi4uLgotCi0gICAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIHJvdWdobHkgMzAwIHN5c3RlbXMuICBUaGUgbWFpbiB0d28KLSAgICBjb25maWd1cmF0aW9uIGlzc3VlcyB0byBjb250ZW5kIHdpdGggYXJlOgotCi0JMS4gIEVuc3VyZSB0aGF0IFBDSSBCdXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGFkYXB0ZXIgKGNvbmZpZ3VyZWQKLQlpbiB0aGUgQ01PUyBzZXR1cCkKLQkyLiAgU29tZSBzeXN0ZW1zIGRvbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgYWRhcHRlciB3aGVuIHBsdWcgYW5kCi0JcGxheSBPUyBpcyBlbmFibGVkOyBJIGFsd2F5cyBzZXQgaXQgdG8gIk5vIiBvciAiRGlzYWJsZWQiIC0tIHRoaXMgbWFrZXMKLQlpdCBlYXNpZXIgYW5kIHJlYWxseSBkb2Vzbid0IGFkdmVyc2VseSBhZmZlY3QgYW55dGhpbmcuCi0KLSAgICBSb3VnaGx5IDk1JSBvZiB0aGUgc3lzdGVtcyB3b3JrZWQgd2hlbiBjb25maWd1cmVkIHByb3Blcmx5LiAgQSBmZXcKLSAgICBoYXZlIGlzc3VlcyB3aXRoIGJvb3RpbmcgbG9jYWxseSBvbmNlIHRoZSBib290IFBST00gaGFzIGJlZW4gaW5zdGFsbGVkCi0gICAgKHRoaXMgbnVtYmVyIGhhcyBiZWVuIGxlc3MgdGhhbiAyJSkuICBPdGhlciBjb25maWd1cmF0aW9uIGlzc3VlcyB0aGF0Ci0gICAgdG8gY2hlY2s6Ci0KLQkxLiAgTmV3ZXIgQklPUydzIGFjdHVhbGx5IHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldHdvcmsgYm9vdCBvcmRlci4KLQlTZXQgdGhlIG5ldHdvcmsgYWRhcHRlciBmaXJzdC4gIE1vc3Qgb2xkZXIgQklPUydzIGF1dG9tYXRpY2FsbHkgZ28gdG8KLQl0aGUgbmV0d29yayBib290IFBST00gZmlyc3QuCi0JMi4gIEZvciBzeXN0ZW1zIHdoZXJlIHRoZSBhZGFwdGVyIHdhcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgaXMganVzdAotCWhhdmluZyB0aGUgUFJPTSBpbnN0YWxsZWQsIHRyeSBzZXR0aW5nIHRoZSAicmVzZXQgY29uZmlndXJhdGlvbiBkYXRhIgotCXRvIHllcyBpbiB0aGUgQ01PUyBzZXR1cCBpZiB0aGUgQklPUyBpc24ndCBzZWVuIGF0IGZpcnN0LiAgSWYgeW91ciBCSU9TCi0JZG9lc24ndCBoYXZlIHRoaXMgb3B0aW9uLCByZW1vdmUgdGhlIGNhcmQsIHN0YXJ0IHRoZSBzeXN0ZW0sIHNodXQgZG93biwKLQlpbnN0YWxsIHRoZSBjYXJkIGFuZCByZXN0YXJ0IChvciBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgUENJIHNsb3QpLgotCTMuICBNYWtlIHN1cmUgdGhlIENNT1Mgc2VjdXJpdHkgc2V0dGluZ3MgYXJlbid0IHByZXZlbnRpbmcgYSBib290LgotCi0gICAgVGhlIDNjOTA1QiBjYXJkcyBoYXZlIGEgc2lnbmlmaWNhbnQgJ2J1ZycgdGhhdCByZWxhdGVzIHRvIHRoZSBmbGFzaCBwcm9tOgotICAgIHVubGVzcyB0aGUgY2FyZCBpcyBzZXQgaW50ZXJuYWxseSB0byB0aGUgTUlJIHRyYW5zY2VpdmVyLCBpdCB3aWxsIG9ubHkKLSAgICByZWFkIHRoZSBmaXJzdCA4ayBvZiB0aGUgUFJPTSBpbWFnZS4gIERvbid0IGFzayB3aHkgLS0gaXQgc2VlbXMgcmVhbGx5Ci0gICAgb2JzY3VyZSwgYnV0IGl0IGhhcyB0byBkbyB3aXRoIHRoZSB3YXkgdGhleSBtdXgnZCB0aGUgYWRkcmVzcyBsaW5lcwotICAgIGZyb20gdGhlIFBDSSBidXMgdG8gdGhlIFJPTS4gIFVuZm9ydHVuYXRlbHksIG1vc3Qgb2YgdXMgYXJlIG5vdCB1c2luZwotICAgIE1JSSB0cmFuc2NlaXZlcnMsIGFuZCBldmVuIHRoZSAubHpyb20gaW1hZ2UgZW5kcyB1cCBiZWluZyBqdXN0IGEgbGl0dGxlCi0gICAgYml0IGxhcmdlciB0aGFuIDhrLiAgTm90ZSB0aGF0IHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIGRpc2FibGVkIGJ5Ci0gICAgZGVmYXVsdCwgYmVjYXVzZSB0aGUgV2luZG93cyBOVCA0LjAgZHJpdmVyIGRvZXMgbm90IGxpa2UgaXQgKG5vIHBhY2tldHMKLSAgICBhcmUgdHJhbnNtaXR0ZWQpLgotCi0gICAgU28sIHRoZSBzb2x1dGlvbiB0aGF0IEkndmUgdXNlZCBpcyB0byBpbnRlcm5hbGx5IHNldCB0aGUgY2FyZCdzIG52cmFtCi0gICAgY29uZmlndXJhdGlvbiB0byB1c2UgTUlJIHdoZW4gaXQgYm9vdHMuICBUaGUgM2M5MDViIGRyaXZlciBkb2VzIHRoaXMKLSAgICBhdXRvbWF0aWNhbGx5LiAgVGhpcyB3YXksIHRoZSAxNmsgcHJvbSBpbWFnZSBjYW4gYmUgbG9hZGVkIGludG8gbWVtb3J5LAotICAgIGFuZCB0aGVuIHRoZSAzYzkwNWIgZHJpdmVyIGNhbiBzZXQgdGhlIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIG9mIHRoZQotICAgIGNhcmQgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsIGVpdGhlciBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgb3IgY2hvc2VuCi0gICAgYnkgdGhlIGRyaXZlci4KLQotICAgIFRvIGVuYWJsZSB0aGUgM2M5MDVCIGJ1Z2ZpeCwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGVzZSBjYXJkcyB3aGVuIAotICAgIGJvb3RpbmcgZnJvbSB0aGUgRmxhc2ggUk9NLCBkZWZpbmUgLURDRkdfM0M5MFhfQk9PVFJPTV9GSVggd2hlbiBidWlsZGluZywKLSAgICBjcmVhdGUgYSBmbG9wcHkgaW1hZ2UgYW5kIGJvb3QgaXQgb25jZS4KLSAgICBUaGVyZWFmdGVyLCB0aGUgY2FyZCBzaG91bGQgYWNjZXB0IHRoZSBsYXJnZXIgcHJvbSBpbWFnZS4KLQotICAgIFRoZSBkcml2ZXIgc2hvdWxkIGNob29zZSBhbiBhcHByb3ByaWF0ZSB0cmFuc2NlaXZlciBvbiB0aGUgY2FyZC4gIEhvd2V2ZXIsCi0gICAgaWYgaXQgZG9lc24ndCBvbiB5b3VyIGNhcmQgb3IgaWYgeW91IG5lZWQgdG8sIGZvciBpbnN0YW5jZSwgc2V0IHlvdXIKLSAgICBjYXJkIHRvIDEwbWJwcyB3aGVuIGNvbm5lY3RlZCB0byBhbiB1bm1hbmFnZWQgMTAvMTAwIGh1YiwgeW91IGNhbiBzcGVjaWZ5Ci0gICAgd2hpY2ggdHJhbnNjZWl2ZXIgeW91IHdhbnQgdG8gdXNlLiAgVG8gZG8gdGhpcywgYnVpbGQgdGhlIDNjOTA1Yi5mZDAKLSAgICBpbWFnZSB3aXRoIC1EQ0ZHXzNDOTBYX1hDVlI9eCwgd2hlcmUgJ3gnIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgdmFsdWVzOgotCi0JMAkxMEJhc2UtVAotCTEJMTBtYnBzIEFVSQotCTMJMTBCYXNlLTIgKHRoaW5uZXQvY29heCkKLQk0CTEwMEJhc2UtVFgKLQk1CTEwMEJhc2UtRlgKLQk2CU1JSQotCTgJQXV0by1uZWdvdGlhdGlvbiAxMEJhc2UtVCAvIDEwMEJhc2UtVFggKHVzdWFsbHkgdGhlIGRlZmF1bHQpCi0JOQlNSUkgRXh0ZXJuYWwgTUFDIE1vZGUKLQkyNTUJQWxsb3cgZHJpdmVyIHRvIGNob29zZSBhbiAnYXBwcm9wcmlhdGUnIG1lZGlhIHBvcnQuCi0KLSAgICBUaGVuIHByb2NlZWQgZnJvbSBzdGVwIDIgaW4gdGhlIGFib3ZlICdnZW5lcmFsIHVzZScgaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICAgLnJvbSBpbWFnZSBjYW4gYmUgYnVpbHQgd2l0aCBDRkdfM0M5MFhfWENWUiBzZXQgdG8gYSB2YWx1ZSwgYnV0IHlvdQotICAgIG5vcm1hbGx5IGRvbid0IHdhbnQgdG8gZG8gdGhpcywgc2luY2UgaXQgaXMgZWFzaWVyIHRvIGNoYW5nZSB0aGUKLSAgICB0cmFuc2NlaXZlciB0eXBlIGJ5IHJlYnVpbGRpbmcgYSBuZXcgZmxvcHB5LCBjaGFuZ2luZyB0aGUgQklPUyB0byBmbG9wcHkKLSAgICBib290LCBib290aW5nLCBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgQklPUyBiYWNrIHRvIG5ldHdvcmsgYm9vdC4gIElmCi0gICAgQ0ZHXzNDOTBYX1hDVlIgaXMgbm90IHNldCBpbiBhIHBhcnRpY3VsYXIgYnVpbGQsIGl0IGp1c3QgdXNlcyB0aGUKLSAgICBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKGVpdGhlciBpdHMgJ2Jlc3QgZ3Vlc3MnIG9yIHdoYXRldmVyIHRoZSBzdG9yZWQKLSAgICBDRkdfM0M5MFhfWENWUiB2YWx1ZSB3YXMgZnJvbSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzZXQpLgotCi0gICAgW1sgTm90ZSBmb3IgdGhlIG1vcmUgdGVjaG5pY2FsbHkgaW5jbGluZWQ6ICBUaGUgQ0ZHXzNDOTBYX1hDVlIgdmFsdWUgaXMKLSAgICBwcm9ncmFtbWVkIGludG8gYSByZWdpc3RlciBpbiB0aGUgY2FyZCdzIE5WUkFNIHRoYXQgd2FzIHJlc2VydmVkIGZvcgotICAgIExhbldvcmtzIFBST00gaW1hZ2VzIHRvIHVzZS4gIFdoZW4gdGhlIGRyaXZlciBib290cywgdGhlIGNhcmQgY29tZXMKLSAgICB1cCBpbiBNSUkgbW9kZSwgYW5kIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBMYW5Xb3JrcyByZWdpc3RlciB0byBmaW5kCi0gICAgb3V0IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHRyYW5zY2VpdmVyIHR5cGUuICBJZiBpdCBmaW5kcyB0aGF0Ci0gICAgaW5mb3JtYXRpb24sIGl0IHVzZXMgdGhhdCwgb3RoZXJ3aXNlIGl0IHBpY2tzIGEgdHJhbnNjZWl2ZXIgdGhhdCB0aGUKLSAgICBjYXJkIGhhcyBiYXNlZCBvbiB0aGUgM2M5MDViJ3MgTWVkaWFPcHRpb25zIHJlZ2lzdGVyLiAgVGhpcyBkcml2ZXIgaXNuJ3QKLSAgICBxdWl0ZSBzbWFydCBlbm91Z2ggdG8gYWx3YXlzIGRldGVybWluZSB3aGljaCBtZWRpYSBwb3J0IGlzIGFjdHVhbGx5Ci0gICAgX2Nvbm5lY3RlZF87IG1heWJlIHNvbWVvbmUgZWxzZSB3b3VsZCBsaWtlIHRvIHRha2Ugb24gdGhhdCB0YXNrIChpdAotICAgIGFjdHVhbGx5IGludm9sdmVzIHNlbmRpbmcgYSBzZWxmLWRpcmVjdGVkIHBhY2tldCBhbmQgc2VlaW5nIGlmIGl0Ci0gICAgY29tZXMgYmFjay4gIElGIGl0IGRvZXMsIHRoYXQgcG9ydCBpcyBjb25uZWN0ZWQpLiBdXQotCi0gICAgQW5vdGhlciBpc3N1ZSB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgT1MnZXMKLSAgICBtaWdodCBub3QgYmUgaGFwcHkgd2l0aCB0aGUgd2F5IEkndmUgaGFuZGxlZCB0aGUgUFJPTS1pbWFnZSBoYWNrIHdpdGgKLSAgICBzZXR0aW5nIE1JSSBtb2RlIG9uIGJvb3R1cC4gIExpbnV4IDIuMC4zNSBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbS4KLSAgICBCZWhhdmlvciBvZiBvdGhlciBzeXN0ZW1zIG1heSB2YXJ5LiAgVGhlIDNjb20gZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkKLSAgICBzYXlzIHRoYXQsIGF0IGxlYXN0IHdpdGggdGhlIGNhcmQgdGhhdCBJIGhhdmUsIHRoZSBkZXZpY2UgZHJpdmVyIGluIHRoZQotICAgIE9TIHNob3VsZCBhdXRvLXNlbGVjdCB0aGUgbWVkaWEgcG9ydCwgc28gb3RoZXIgZHJpdmVycyBzaG91bGQgd29yayBmaW5lCi0gICAgd2l0aCB0aGlzICdoYWNrJy4gIEhvd2V2ZXIsIGlmIHlvdXJzIGRvZXNuJ3Qgc2VlbSB0bywgeW91IGNhbiB0cnkgZGVmaW5pbmcKLSAgICBDRkdfM0M5MFhfUFJFU0VSVkVfWENWUiB3aGVuIGJ1aWxkaW5nIHRvIGNhdXNlIEV0aGVyYm9vdCB0byBrZWVwIHRoZQotICAgIHdvcmtpbmcgc2V0dGluZyAodGhhdCBhbGxvd2VkIHRoZSBib290cC90ZnRwIHByb2Nlc3MpIGFjcm9zcyB0aGUgZXRoX3Jlc2V0Ci0gICAgb3BlcmF0aW9uLgotCi0KLUlWICBGT1IgREVWRUxPUEVSUy4uLi4KLQotICAgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGZpeC9leHRlbmQvZXRjLiB0aGlzIGRyaXZlciwgZmVlbCBmcmVlIHRvIGRvIHNvOyBqdXN0Ci0gICAgYmUgc3VyZSB5b3UgY2FuIHRlc3QgdGhlIG1vZGlmaWVkIHZlcnNpb24gb24gdGhlIDNjOTA1Qi1UWCBjYXJkcyB0aGF0IHRoZQotICAgIGRyaXZlciB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IuICBUaGlzIHNlY3Rpb24gb2YgdGhpcyBkb2N1bWVudCBnaXZlcwotICAgIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSByZWxldmFudCB0byBhIHByb2dyYW1tZXIuCi0KLSAgICBBLiAgTWFpbiBFbnRyeSBQb2ludAotCi0JYTNjOTB4X3Byb2JlIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIGRyaXZlci4gIEl0IGlzIHJlZmVycmVkCi0JdG8gaW4gYW4gYXJyYXkgaW4gJ2NvbmZpZy5jJy4KLQotICAgIEIuICBPdGhlciBJbXBvcnRhbnQgRnVuY3Rpb25zCi0KLQlUaGUgZnVuY3Rpb25zIGEzYzkweF90cmFuc21pdCwgYTNjOTB4X3BvbGwsIGEzYzkweF9yZXNldCwgYW5kCi0JYTNjOTB4X2Rpc2FibGUgYXJlIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBFdGhlckJvb3QgZmluZHMgb3V0IGFib3V0Ci0JYXMgYSAgcmVzdWx0IG9mIGEzYzkweF9wcm9iZSBzZXR0aW5nIGVudHJpZXMgaW4gdGhlIG5pYyBzdHJ1Y3R1cmUKLQlmb3IgdGhlbS4gIFRoZSBFdGhlckJvb3QgZnJhbWV3b3JrIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzLiAgSXQgaXMKLQlwb2xsZWQuICBBbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgaW5pdGlhdGVkIGJ5IHRoZQotCWV0aGVyYm9vdCBmcmFtZXdvcmssIG5vdCBieSBhbiBpbnRlcnJ1cHQgb3IgYnkgdGhlIGRyaXZlci4KLQotICAgIEMuICBJbnRlcm5hbCBGdW5jdGlvbnMKLQotCVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbnRlcm5hbCB0byB0aGUgZHJpdmVyOgotCi0JYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZCAtIHNlbmRzIGEgY29tbWFuZCB0byB0aGUgM2M5MDViIGNhcmQuCi0JYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyAtIHNoaWZ0cyBiZXR3ZWVuIG9uZSBvZiBlaWdodCByZWdpc3RlcgotCXdpbmRvd3Mgb25ib2FyZCB0aGUgM2M5MHguICBUaGUgYm90dG9tIDE2IGJ5dGVzIG9mIHRoZSBjYXJkJ3MKLQlJL08gc3BhY2UgYXJlIG11bHRpcGxleGVkIGFtb25nIDEyOCBieXRlcywgb25seSAxNiBvZiB3aGljaCBhcmUKLQl2aXNpYmxlIGF0IGFueSBvbmUgdGltZS4gIFRoaXMgU2V0V2luZG93IGZ1bmN0aW9uIHNlbGVjdHMgb25lIG9mCi0JdGhlIGVpZ2h0IHNldHMuCi0JYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20gLSByZWFkcyBhIHdvcmQgKDE2IGJpdHMpIGZyb20gdGhlCi0JY2FyZCdzIG9uYm9hcmQgbnZyYW0uICBUaGlzIGlzIE5PVCB0aGUgQklPUyBib290IHJvbS4gIFRoaXMgaXMKLQl3aGVyZSB0aGUgY2FyZCBzdG9yZXMgc3VjaCB0aGluZ3MgYXMgaXRzIGhhcmR3YXJlIGFkZHJlc3MuCi0JYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tIC0gd3JpdGVzIGEgd29yZCAoMTYgYml0cykgdG8gdGhlCi0JY2FyZCdzIG52cmFtLCBhbmQgcmVjb21wdXRlcyB0aGUgZWVwcm9tIGNoZWNrc3VtLgotCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKLQljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgotCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKLQljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgotCi0gICAgRC4gIEdsb2JhbHMKLQotCUFsbCBnbG9iYWwgdmFyaWFibGVzIGFyZSBpbnNpZGUgYSBnbG9iYWwgc3RydWN0dXJlIG5hbWVkIElORl8zQzkwWC4KLQlTbywgd2hlcmV2ZXIgeW91IHNlZSB0aGF0IHN0cnVjdHVyZSByZWZlcmVuY2VkLCB5b3Uga25vdyB0aGUgdmFyaWFibGUKLQlpcyBhIGdsb2JhbC4gIEp1c3Qga2VlcHMgdGhpbmdzIGEgbGl0dGxlIG5lYXRlci4KLQotICAgIEUuICBFbnVtZXJhdGlvbnMKLQotCVRoZXJlIGFyZSBxdWl0ZSBhIGZldyBlbnVtZXJhdGVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVycyBhbmQKLQlzbyBmb3J0aCwgbWFueSBmb3IgcmVnaXN0ZXJzIHRoYXQgSSBkaWRuJ3QgZXZlbiB0b3VjaCBpbiB0aGUgZHJpdmVyLgotCVJlZ2lzdGVyIHR5cGVzIHN0YXJ0IHdpdGggJ3JlZycsIHdpbmRvdyBudW1iZXJzIChmb3IgU2V0V2luZG93KQotCXN0YXJ0IHdpdGggJ3dpbicsIGFuZCBjb21tYW5kcyAoZm9yIElzc3VlQ29tbWFuZCkgc3RhcnQgd2l0aCAnY21kJy4KLQlSZWdpc3RlciBvZmZzZXRzIGFsc28gaW5jbHVkZSBhbiBpbmRpY2F0aW9uIGluIHRoZSBuYW1lIGFzIHRvIHRoZQotCXNpemUgb2YgdGhlIHJlZ2lzdGVyIChfYiA9IGJ5dGUsIF93ID0gd29yZCwgX2wgPSBsb25nKSwgYW5kIHdoaWNoCi0Jd2luZG93IHRoZSByZWdpc3RlciBpcyBpbiwgaWYgaXQgaXMgd2luZG93ZWQgKDAtNykuCi0KLSAgICBGLiAgV2h5IHRoZSAnYTNjOTB4JyBuYW1lPwotCi0JSSBoYWQgdG8gY29tZSB1cCB3aXRoIGEgbGV0dGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIG9mIHRoZQotCWlkZW50aWZpZXJzLCBzaW5jZSAzY29tIHNvIGNvbnZlbmllbnRseSBoYWQgdGhlaXIgbmFtZSBzdGFydCB3aXRoIGEKLQludW1iZXIuICBBbm90aGVyIGRyaXZlciB1c2VkICd0JyAoZm9yICd0aHJlZSc/KTsgSSBjaG9zZSAnYScgZm9yCi0Jbm8gcmVhc29uIGF0IGFsbC4KLQotQWRkZW5kdW0gYnkgSm9yZ2UgTC4gZGVMeXJhIDxkZWx5cmFAbGF0dC5pZi51c3AuYnI+LCAyMk5vdjIwMDAgcmUKLXdvcmtpbmcgYXJvdW5kIHRoZSAzQzkwNSBoYXJkd2FyZSBidWcgbWVudGlvbmVkIGFib3ZlOgotCi1Vc2UgdGhpcyBmbG9wcHkgdG8gZml4IGFueSAzQ09NIG1vZGVsIDNDOTA1QiBQQ0kgMTAvMTAwIEV0aGVybmV0IGNhcmRzCi10aGF0IGZhaWwgdG8gbG9hZCBhbmQgcnVuIHRoZSBib290IHByb2dyYW0gdGhlIGZpcnN0IHRpbWUgYXJvdW5kLiBJZgotdGhleSBoYXZlIGEgIkx1Y2VudCIgcmF0aGVyIHRoYW4gYSAiQnJvYWRjb20iIGNoaXBzZXQgdGhlc2UgY2FyZHMgaGF2ZQotYSBjb25maWd1cmF0aW9uIGJ1ZyB0aGF0IGNhdXNlcyBhIGhhbmcgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgYm9vdAotcHJvZ3JhbSBmcm9tIHRoZSBQUk9NLCBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtIHJpZ2h0IG91dCBvZiB0aGUgYm94LgotCi1UaGUgYm9vdCBwcm9ncmFtIGluIHRoaXMgZmxvcHB5IGlzIHRoZSBmaWxlIG5hbWVkIDNjOTA1Yi10cG8xMDAucm9tCi1mcm9tIEV0aGVyYm9vdCB2ZXJzaW9uIDQuNi4xMCwgY29tcGlsZWQgd2l0aCB0aGUgYnVnZml4IHBhcmFtZXRlcgotCi0JCQlDRkdfM0M5MFhfQk9PVFJPTV9GSVgKLQotWW91IGhhdmUgdG8gdGFrZSB0aGUgY2hpcCBvZmYgdGhlIGNhcmQgYW5kIGJvb3QgdGhlIHN5c3RlbSBvbmNlIHVzaW5nCi10aGlzIGZsb3BweS4gT25jZSBsb2FkZWQgZnJvbSB0aGUgZmxvcHB5LCB0aGUgYm9vdCBwcm9ncmFtIHdpbGwgYWNjZXNzCi10aGUgY2FyZCBhbmQgY2hhbmdlIHNvbWUgc2V0dGluZyBpbiBpdCwgY29ycmVjdGluZyB0aGUgcHJvYmxlbS4gQWZ0ZXIKLXRoYXQgeW91IG1heSB1c2UgZWl0aGVyIHRoaXMgYm9vdCBwcm9ncmFtIG9yIHRoZSBub3JtYWwgb25lLCBjb21waWxlZAotd2l0aG91dCB0aGlzIGJ1Z2ZpeCBwYXJhbWV0ZXIsIHRvIGJvb3QgdGhlIG1hY2hpbmUgZnJvbSB0aGUgUFJPTSBjaGlwLgotCi1bQW55IHJlY2VudCBFdGhlcmJvb3QgdmVyc2lvbiBzaG91bGQgZG8sIG5vdCBqdXN0IDQuNi4xMCAtIEVkLl0KSW5kZXg6IGIvbmV0Ym9vdC9NYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvTWFrZWZpbGUuYW0KKysrIGIvbmV0Ym9vdC9NYWtlZmlsZS5hbQpAQCAtMTAsNTggKzEwLDcyIEBACiAKIG5vaW5zdF9MSUJSQVJJRVMgPSAkKExJQkRSSVZFUlMpCiAKLWxpYmRyaXZlcnNfYV9TT1VSQ0VTID0gY2FyZHMuaCBjb25maWcuYyBldGhlcmJvb3QuaCBcCi0JZnN5c190ZnRwLmMgbGludXgtYXNtLWlvLmggbGludXgtYXNtLXN0cmluZy5oIFwKLQltYWluLmMgbWlzYy5jIG5pYy5oIG9zZGVwLmggcGNpLmMgcGNpLmggdGltZXIuYyB0aW1lci5oCi1FWFRSQV9saWJkcml2ZXJzX2FfU09VUkNFUyA9IDNjNTA5LmMgM2M1MDkuaCAzYzU5NS5jIDNjNTk1LmggM2M5MHguYyBcCi0JY3M4OXgwLmMgY3M4OXgwLmggZGF2aWNvbS5jIGRlcGNhLmMgZWVwcm8uYyBlZXBybzEwMC5jIFwKLQllcGljMTAwLmMgZXBpYzEwMC5oIGZhMzExLmMgaTgyNTg2LmMgbGFuY2UuYyBuYXRzZW1pLmMgXAotCW5pNTAxMC5jIG5zODM5MC5jIG5zODM5MC5oIG90dWxpcC5jIG90dWxpcC5oIHJ0bDgxMzkuYyBcCi0Jc2lzOTAwLmMgc2lzOTAwLmggc2tfZzE2LmMgc2tfZzE2Lmggc21jOTAwMC5jIHNtYzkwMDAuaCBcCi0JdGlhcmEuYyB0bGFuLmMgdHVsaXAuYyB2aWEtcmhpbmUuYyB3ODljODQwLmMKK2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gYmlnX2Jzd2FwLmggYm9vdHAuaCBieXRlc3dhcC5oIGNvbmZpZy5jIGNwdS5oIFwKKwlkZXYuaCBlbGYuaCBlbmRpYW4uaCBldGhlcmJvb3QuaCBmc3lzX3RmdHAuYyBncnViLmggXAorCWkzODZfYnl0ZXN3YXAuaCBpMzg2X2VsZi5oIGkzODZfZW5kaWFuLmggaTM4Nl90aW1lci5jIFwKKwlpZl9hcnAuaCBpZl9ldGhlci5oIGlnbXAuaCBpbi5oIGlvLmggaXAuaCBpc2EuaCBsYXRjaC5oIFwKKwlsaXR0bGVfYnN3YXAuaCBtaXNjLmMgbmljLmMgbmljLmggb3NkZXAuaCBwY2kuYyBwY2kuaCBcCisJcGNpX2lkcy5oIHBjaV9pby5jIHN0ZGludC5oIHRmdHAuaCB0aW1lci5jIHRpbWVyLmggXAorCXR5cGVzLmggdWRwLmggbWlpLmggcGljODI1OS5jIHBpYzgyNTkuaCBweGUuaCBiYXNlbWVtLmMgc2Vnb2ZmLmgKK0VYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgZGF2aWNvbS5jIFwKKwllMTAwMC5jIGUxMDAwX2h3LmggZWVwcm8xMDAuYyBlcGljMTAwLmMgZXBpYzEwMC5oIG5hdHNlbWkuYyBcCisJbnM4MzkwLmMgbnM4MzkwLmggcGNuZXQzMi5jIHJ0bDgxMzkuYyBzaXM5MDAuYyBzaXM5MDAuaCBcCisJc3VuZGFuY2UuYyB0ZzMuYyB0ZzMuaCB0bGFuLmMgdGxhbi5oIHR1bGlwLmMgdmlhLXJoaW5lLmMgXAorCXc4OWM4NDAuYyByODE2OS5jIGZvcmNlZGV0aC5jIG5zODM4MjAuYyBwbmljLmMgcG5pY19hcGkuYyBcCisJdW5kaS5jIHVuZGkuaAogbGliZHJpdmVyc19hX0NGTEFHUyA9ICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJLURGU1lTX1RGVFA9MSAkKE5FVF9DRkxBR1MpICQoTkVUX0VYVFJBRkxBR1MpCiAjIEZpbGxlZCBieSBjb25maWd1cmUuCiBsaWJkcml2ZXJzX2FfTElCQUREID0gQE5FVEJPT1RfRFJJVkVSU0AKIGxpYmRyaXZlcnNfYV9ERVBFTkRFTkNJRVMgPSAkKGxpYmRyaXZlcnNfYV9MSUJBREQpCiAKLUVYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorRVhUUkFfRElTVCA9IFJFQURNRS5uZXRib290CiAKICMgVGhlc2UgYmVsb3cgYXJlIHNldmVyYWwgc3BlY2lhbCBydWxlcyBmb3IgdGhlIGRldmljZSBkcml2ZXJzLgogIyBXZSBjYW5ub3QgdXNlIGEgc2ltcGxlIHJ1bGUgZm9yIHRoZW0uLi4KIAogIyBXaGF0IG9iamVjdHMgYXJlIGRlcml2ZWQgZnJvbSBhIGRyaXZlcj8KLTNjNTA5X2RyaXZlcnMgPSAzYzUwOS5vIDNjNTI5Lm8KKyMzYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiAzYzU5NV9kcml2ZXJzID0gM2M1OTUubwogM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KLWNzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KKyNjczg5eDBfZHJpdmVycyA9IGNzODl4MC5vCiBkYXZpY29tX2RyaXZlcnMgPSBkYXZpY29tLm8KLWRlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCi1lZXByb19kcml2ZXJzID0gZWVwcm8ubworI2RlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCisjZWVwcm9fZHJpdmVycyA9IGVlcHJvLm8KK2UxMDAwX2RyaXZlcnMgPSBlMTAwMC5vCiBlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubwogZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCiAjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KLWk4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KLWxhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCitmb3JjZWRldGhfZHJpdmVycyA9IGZvcmNlZGV0aC5vCisjaTgyNTg2X2RyaXZlcnMgPSAzYzUwNy5vIGV4b3MyMDUubyBuaTUyMTAubworI2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCiBuYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KLW5pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KKyNuaTUwMTBfZHJpdmVycyA9IG5pNTAxMC5vCituczgzODIwX2RyaXZlcnMgPSBuczgzODIwLm8KIG5zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KLW90dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KKyNvdHVsaXBfZHJpdmVycyA9IG90dWxpcC5vCitwY25ldDMyX2RyaXZlcnMgPSBwY25ldDMyLm8KK3BuaWNfZHJpdmVycyA9IHBuaWMubworcjgxNjlfZHJpdmVycyA9IHI4MTY5Lm8KIHJ0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubwogc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubwotc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubwotc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCi10aWFyYV9kcml2ZXJzID0gdGlhcmEubwotI3RsYW5fZHJpdmVycyA9IHRsYW4ubworI3NrX2cxNl9kcml2ZXJzID0gc2tfZzE2Lm8KK3N1bmRhbmNlX2RyaXZlciA9IHN1bmRhbmNlLm8KKyNzbWM5MDAwX2RyaXZlcnMgPSBzbWM5MDAwLm8KK3RnM19kcml2ZXJzID0gdGczLm8KKyN0aWFyYV9kcml2ZXJzID0gdGlhcmEubwordGxhbl9kcml2ZXJzID0gdGxhbi5vCiB0dWxpcF9kcml2ZXJzID0gdHVsaXAubwordW5kaV9kcml2ZXJzID0gdW5kaS5vCiB2aWFfcmhpbmVfZHJpdmVycyA9IHZpYV9yaGluZS5vCiB3ODljODQwX2RyaXZlcnMgPSB3ODljODQwLm8KIAorCiAjIElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gc3BlY2lmeSBkZXBlbmRlY2llcyBleHBsaWNpdGx5PwotJCgzYzUwOV9kcml2ZXJzKTogM2M1MDkuYyAzYzUwOS5oCi0kKDNjNTA5X2RyaXZlcnMpOiAlLm86IDNjNTA5LmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoM2M1MDlfZHJpdmVycyk6IDNjNTA5LmMgM2M1MDkuaAorIyQoM2M1MDlfZHJpdmVycyk6ICUubzogM2M1MDkuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJCgzYzU5NV9kcml2ZXJzKTogM2M1OTUuYyAzYzU5NS5oCiAkKDNjNTk1X2RyaXZlcnMpOiAlLm86IDNjNTk1LmMKQEAgLTczLDIzICs4NywyOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoY3M4OXgwX2RyaXZlcnMpOiBjczg5eDAuYyBjczg5eDAuaAotJChjczg5eDBfZHJpdmVycyk6ICUubzogY3M4OXgwLmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoY3M4OXgwX2RyaXZlcnMpOiBjczg5eDAuYyBjczg5eDAuaAorIyQoY3M4OXgwX2RyaXZlcnMpOiAlLm86IGNzODl4MC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCiAkKGRhdmljb21fZHJpdmVycyk6IGRhdmljb20uYwogJChkYXZpY29tX2RyaXZlcnMpOiAlLm86IGRhdmljb20uYwogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZGVwY2FfZHJpdmVycyk6IGRlcGNhLmMKLSQoZGVwY2FfZHJpdmVycyk6ICUubzogZGVwY2EuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChkZXBjYV9kcml2ZXJzKTogZGVwY2EuYworIyQoZGVwY2FfZHJpdmVycyk6ICUubzogZGVwY2EuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworIyQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKKyMkKGVlcHJvX2RyaXZlcnMpOiAlLm86IGVlcHJvLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKLSQoZWVwcm9fZHJpdmVycyk6ICUubzogZWVwcm8uYworJChlMTAwMF9kcml2ZXJzKTogZTEwMDAuYyBlMTAwMF9ody5oCiskKGUxMDAwX2RyaXZlcnMpOiAlLm86IGUxMDAwLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCkBAIC0xMDMsMjggKzEyMiwzOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKKyQoZm9yY2VkZXRoX2RyaXZlcnMpOiBmb3JjZWRldGguYworJChmb3JjZWRldGhfZHJpdmVycyk6ICUubzogZm9yY2VkZXRoLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiAjJChmYTMxMV9kcml2ZXJzKTogZmEzMTEuYwogIyQoZmEzMTFfZHJpdmVycyk6ICUubzogZmEzMTEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCi0kKGk4MjU4Nl9kcml2ZXJzKTogJS5vOiBpODI1ODYuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCisjJChpODI1ODZfZHJpdmVycyk6ICUubzogaTgyNTg2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQobGFuY2VfZHJpdmVycyk6IGxhbmNlLmMKLSQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChsYW5jZV9kcml2ZXJzKTogbGFuY2UuYworIyQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChuYXRzZW1pX2RyaXZlcnMpOiBuYXRzZW1pLmMKICQobmF0c2VtaV9kcml2ZXJzKTogJS5vOiBuYXRzZW1pLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKG5pNTAxMF9kcml2ZXJzKTogbmk1MDEwLmMKLSQobmk1MDEwX2RyaXZlcnMpOiAlLm86IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6ICUubzogbmk1MDEwLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobnM4MzgyMF9kcml2ZXJzKTogbnM4MzgyMC5jCiskKG5zODM4MjBfZHJpdmVycyk6ICUubzogbnM4MzgyMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTMzLDggKzE2MiwxOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQob3R1bGlwX2RyaXZlcnMpOiBvdHVsaXAuYyBvdHVsaXAuaAotJChvdHVsaXBfZHJpdmVycyk6ICUubzogb3R1bGlwLmMKKyMkKG90dWxpcF9kcml2ZXJzKTogb3R1bGlwLmMgb3R1bGlwLmgKKyMkKG90dWxpcF9kcml2ZXJzKTogJS5vOiBvdHVsaXAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChwY25ldDMyX2RyaXZlcnMpOiBwY25ldDMyLmMKKyQocGNuZXQzMl9kcml2ZXJzKTogJS5vOiBwY25ldDMyLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHBuaWNfZHJpdmVycyk6IHBuaWMuYworJChwbmljX2RyaXZlcnMpOiAlLm86IHBuaWMuYyBwbmljX2FwaS5oCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTQzLDM2ICsxODIsNTYgQEAKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMKLSQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jIHNpczkwMC5oCiskKHI4MTY5X2RyaXZlcnMpOiByODE2OS5jCiskKHI4MTY5X2RyaXZlcnMpOiAlLm86IHI4MTY5LmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHNrX2cxNl9kcml2ZXJzKTogc2tfZzE2LmMgc2tfZzE2LmgKLSQoc2tfZzE2X2RyaXZlcnMpOiAlLm86IHNrX2cxNi5jCiskKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMgc2lzOTAwLmgKKyQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChzbWM5MDAwX2RyaXZlcnMpOiBzbWM5MDAwLmMgc21jOTAwMC5oCi0kKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCisjJChza19nMTZfZHJpdmVycyk6ICUubzogc2tfZzE2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKHNtYzkwMDBfZHJpdmVycyk6IHNtYzkwMDAuYyBzbWM5MDAwLmgKKyMkKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHN1bmRhbmNlX2RyaXZlcnMpOiBzdW5kYW5jZS5jCiskKHN1bmRhbmNlX2RyaXZlcnMpOiAlLm86IHN1bmRhbmNlLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHRpYXJhX2RyaXZlcnMpOiB0aWFyYS5jCi0kKHRpYXJhX2RyaXZlcnMpOiAlLm86IHRpYXJhLmMKKyQodGczX2RyaXZlcnMpOiB0ZzMuYyB0ZzMuaAorJCh0ZzNfZHJpdmVycyk6ICUubzogdGczLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0jJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMKLSMkKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisjJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYworIyQodGlhcmFfZHJpdmVycyk6ICUubzogdGlhcmEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMgdGxhbi5oCiskKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKwogJCh0dWxpcF9kcml2ZXJzKTogdHVsaXAuYwogJCh0dWxpcF9kcml2ZXJzKTogJS5vOiB0dWxpcC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh1bmRpX2RyaXZlcnMpOiB1bmRpLmMgdW5kaS5oCiskKHVuZGlfZHJpdmVycyk6ICUubzogdW5kaS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorICAgICAgICAgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKICQodmlhX3JoaW5lX2RyaXZlcnMpOiB2aWEtcmhpbmUuYwogJCh2aWFfcmhpbmVfZHJpdmVycyk6ICUubzogdmlhLXJoaW5lLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCkBAIC0xODQsMzYgKzI0Myw0NSBAQAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogIyBQZXItb2JqZWN0IGZsYWdzLgotM2M1MDlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDk9MQotM2M1Mjlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1Mjk9MQorIzNjNTA5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA5PTEKKyMzYzUyOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUyOT0xCiAzYzU5NV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzU5NT0xCiAzYzkweF9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzkwWD0xCi1jczg5eDBfb19DRkxBR1MgPSAtRElOQ0xVREVfQ1M4OVgwPTEKKyNjczg5eDBfb19DRkxBR1MgPSAtRElOQ0xVREVfQ1M4OVgwPTEKIGRhdmljb21fb19DRkxBR1MgPSAtRElOQ0xVREVfREFWSUNPTT0xCi1kZXBjYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ERVBDQT0xCi1lZXByb19vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTz0xCisjZGVwY2Ffb19DRkxBR1MgPSAtRElOQ0xVREVfREVQQ0E9MQorI2VlcHJvX29fQ0ZMQUdTID0gLURJTkNMVURFX0VFUFJPPTEKK2UxMDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0UxMDAwPTEKIGVlcHJvMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0VFUFJPMTAwPTEKIGVwaWMxMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfRVBJQzEwMD0xCiAjZmEzMTFfb19DRkxBR1MgPSAtRElOQ0xVREVfRkEzMTE9MQotM2M1MDdfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDc9MQotZXhvczIwNV9vX0NGTEFHUyA9IC1ESU5DTFVERV9FWE9TMjA1PTEKLW5pNTIxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTUyMTA9MQotbGFuY2Vfb19DRkxBR1MgPSAtRElOQ0xVREVfTEFOQ0U9MQotbmUyMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX05FMjEwMD0xCi1uaTY1MTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk2NTEwPTEKK2ZvcmNlZGV0aF9vX0NGTEFHUyA9IC1ESU5DTFVERV9GT1JDRURFVEg9MQorIzNjNTA3X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA3PTEKKyNleG9zMjA1X29fQ0ZMQUdTID0gLURJTkNMVURFX0VYT1MyMDU9MQorI25pNTIxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTUyMTA9MQorI2xhbmNlX29fQ0ZMQUdTID0gLURJTkNMVURFX0xBTkNFPTEKKyNuZTIxMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkUyMTAwPTEKKyNuaTY1MTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk2NTEwPTEKIG5hdHNlbWlfb19DRkxBR1MgPSAtRElOQ0xVREVfTkFUU0VNST0xCi1uaTUwMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MDEwPTEKLTNjNTAzX29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTAzPTEKLW5lX29fQ0ZMQUdTID0gLURJTkNMVURFX05FPTEKKyNuaTUwMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MDEwPTEKKyMzYzUwM19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwMz0xCisjbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfTkU9MQorbnM4MzgyMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OUzgzODIwPTEKIG5zODM5MF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OUzgzOTA9MQotd2Rfb19DRkxBR1MgPSAtRElOQ0xVREVfV0Q9MQotb3R1bGlwX29fQ0ZMQUdTID0gLURJTkNMVURFX09UVUxJUD0xCisjd2Rfb19DRkxBR1MgPSAtRElOQ0xVREVfV0Q9MQorI290dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9PVFVMSVA9MQorcGNuZXQzMl9vX0NGTEFHUyA9IC1ESU5DTFVERV9QQ05FVDMyPTEKK3BuaWNfb19DRkxBR1MgPSAtRElOQ0xVREVfUE5JQz0xCityODE2OV9vX0NGTEFHUyA9IC1ESU5DTFVERV9SODE2OT0xCiBydGw4MTM5X29fQ0ZMQUdTID0gLURJTkNMVURFX1JUTDgxMzk9MQogc2lzOTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NJUzkwMD0xCi1za19nMTZfb19DRkxBR1MgPSAtRElOQ0xVREVfU0tfRzE2PTEKLXNtYzkwMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfU01DOTAwMD0xCi10aWFyYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9USUFSQT0xCi0jdGxhbl9vX0NGTEFHUyA9IC1ESU5DTFVERV9UTEFOPTEKKyNza19nMTZfb19DRkxBR1MgPSAtRElOQ0xVREVfU0tfRzE2PTEKKyNzbWM5MDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NNQzkwMDA9MQorc3VuZGFuY2Vfb19DRkxBR1MgPSAtRElOQ0xVREVfU1VOREFOQ0U9MQorI3RpYXJhX29fQ0ZMQUdTID0gLURJTkNMVURFX1RJQVJBPTEKK3RnM19vX0NGTEFHUyA9IC1ESU5DTFVERV9URzM9MQordGxhbl9vX0NGTEFHUyA9IC1ESU5DTFVERV9UTEFOPTEKIHR1bGlwX29fQ0ZMQUdTID0gLURJTkNMVURFX1RVTElQPTEKK3VuZGlfb19DRkxBR1MgPSAtRElOQ0xVREVfVU5EST0xCiB2aWFfcmhpbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfVklBX1JISU5FPTEKIHc4OWM4NDBfb19DRkxBR1MgPSAtRElOQ0xVREVfVzg5Qzg0MD0xCkluZGV4OiBiL25ldGJvb3QvTWFrZWZpbGUuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L01ha2VmaWxlLmluCisrKyBiL25ldGJvb3QvTWFrZWZpbGUuaW4KQEAgLTQ2LDE4ICs0Niw1MSBAQAogbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycwogQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAogQ09ORklHX0NMRUFOX0ZJTEVTID0KLUxJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKIEFSID0gYXIKIEFSRkxBR1MgPSBjcnUKK0xJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKIGxpYmRyaXZlcnNfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKIGFtX2xpYmRyaXZlcnNfYV9PQkpFQ1RTID0gbGliZHJpdmVyc19hLWNvbmZpZy4kKE9CSkVYVCkgXAotCWxpYmRyaXZlcnNfYS1mc3lzX3RmdHAuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1tYWluLiQoT0JKRVhUKSBcCi0JbGliZHJpdmVyc19hLW1pc2MuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1wY2kuJChPQkpFWFQpIFwKLQlsaWJkcml2ZXJzX2EtdGltZXIuJChPQkpFWFQpCisJbGliZHJpdmVyc19hLWZzeXNfdGZ0cC4kKE9CSkVYVCkgXAorCWxpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLiQoT0JKRVhUKSBsaWJkcml2ZXJzX2EtbWlzYy4kKE9CSkVYVCkgXAorCWxpYmRyaXZlcnNfYS1uaWMuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1wY2kuJChPQkpFWFQpIFwKKwlsaWJkcml2ZXJzX2EtcGNpX2lvLiQoT0JKRVhUKSBsaWJkcml2ZXJzX2EtdGltZXIuJChPQkpFWFQpIFwKKwlsaWJkcml2ZXJzX2EtcGljODI1OS4kKE9CSkVYVCkgbGliZHJpdmVyc19hLWJhc2VtZW0uJChPQkpFWFQpCiBsaWJkcml2ZXJzX2FfT0JKRUNUUyA9ICQoYW1fbGliZHJpdmVyc19hX09CSkVDVFMpCiBERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCiBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCiBhbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQEFNREVQX1RSVUVAREVQX0ZJTEVTID0gLi8kKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlBvCiBDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKIAkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCiBDQ0xEID0gJChDQykKQEAgLTE0OCw4ICsxODEsNiBAQAogYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACiBhbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAogYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACiBiaW5kaXIgPSBAYmluZGlyQAogYnVpbGQgPSBAYnVpbGRACiBidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKQEAgLTE4NiwxNiArMjE3LDE5IEBACiAjIERvbid0IGJ1aWxkIHRoZSBuZXRib290IHN1cHBvcnQgYnkgZGVmYXVsdC4KIEBORVRCT09UX1NVUFBPUlRfVFJVRUBMSUJEUklWRVJTID0gbGliZHJpdmVycy5hCiBub2luc3RfTElCUkFSSUVTID0gJChMSUJEUklWRVJTKQotbGliZHJpdmVyc19hX1NPVVJDRVMgPSBjYXJkcy5oIGNvbmZpZy5jIGV0aGVyYm9vdC5oIFwKLQlmc3lzX3RmdHAuYyBsaW51eC1hc20taW8uaCBsaW51eC1hc20tc3RyaW5nLmggXAotCW1haW4uYyBtaXNjLmMgbmljLmggb3NkZXAuaCBwY2kuYyBwY2kuaCB0aW1lci5jIHRpbWVyLmgKLQotRVhUUkFfbGliZHJpdmVyc19hX1NPVVJDRVMgPSAzYzUwOS5jIDNjNTA5LmggM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgXAotCWNzODl4MC5jIGNzODl4MC5oIGRhdmljb20uYyBkZXBjYS5jIGVlcHJvLmMgZWVwcm8xMDAuYyBcCi0JZXBpYzEwMC5jIGVwaWMxMDAuaCBmYTMxMS5jIGk4MjU4Ni5jIGxhbmNlLmMgbmF0c2VtaS5jIFwKLQluaTUwMTAuYyBuczgzOTAuYyBuczgzOTAuaCBvdHVsaXAuYyBvdHVsaXAuaCBydGw4MTM5LmMgXAotCXNpczkwMC5jIHNpczkwMC5oIHNrX2cxNi5jIHNrX2cxNi5oIHNtYzkwMDAuYyBzbWM5MDAwLmggXAotCXRpYXJhLmMgdGxhbi5jIHR1bGlwLmMgdmlhLXJoaW5lLmMgdzg5Yzg0MC5jCitsaWJkcml2ZXJzX2FfU09VUkNFUyA9IGJpZ19ic3dhcC5oIGJvb3RwLmggYnl0ZXN3YXAuaCBjb25maWcuYyBjcHUuaCBcCisJZGV2LmggZWxmLmggZW5kaWFuLmggZXRoZXJib290LmggZnN5c190ZnRwLmMgZ3J1Yi5oIFwKKwlpMzg2X2J5dGVzd2FwLmggaTM4Nl9lbGYuaCBpMzg2X2VuZGlhbi5oIGkzODZfdGltZXIuYyBcCisJaWZfYXJwLmggaWZfZXRoZXIuaCBpZ21wLmggaW4uaCBpby5oIGlwLmggaXNhLmggbGF0Y2guaCBcCisJbGl0dGxlX2Jzd2FwLmggbWlzYy5jIG5pYy5jIG5pYy5oIG9zZGVwLmggcGNpLmMgcGNpLmggXAorCXBjaV9pZHMuaCBwY2lfaW8uYyBzdGRpbnQuaCB0ZnRwLmggdGltZXIuYyB0aW1lci5oIFwKKwl0eXBlcy5oIHVkcC5oIG1paS5oIHBpYzgyNTkuYyBwaWM4MjU5LmggcHhlLmggYmFzZW1lbS5jIHNlZ29mZi5oCisKK0VYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgZGF2aWNvbS5jIFwKKwllMTAwMC5jIGUxMDAwX2h3LmggZWVwcm8xMDAuYyBlcGljMTAwLmMgZXBpYzEwMC5oIG5hdHNlbWkuYyBcCisJbnM4MzkwLmMgbnM4MzkwLmggcGNuZXQzMi5jIHJ0bDgxMzkuYyBzaXM5MDAuYyBzaXM5MDAuaCBcCisJdGczLmMgdGczLmggdGxhbi5jIHRsYW4uaCB0dWxpcC5jIHZpYS1yaGluZS5jIFwKKwl3ODljODQwLmMgcjgxNjkuYyBmb3JjZWRldGguYyBuczgzODIwLmMgcG5pYy5jIHBuaWNfYXBpLmMgCiAKIGxpYmRyaXZlcnNfYV9DRkxBR1MgPSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCS1ERlNZU19URlRQPTEgJChORVRfQ0ZMQUdTKSAkKE5FVF9FWFRSQUZMQUdTKQpAQCAtMjAzLDY5ICsyMzcsODMgQEAKICMgRmlsbGVkIGJ5IGNvbmZpZ3VyZS4KIGxpYmRyaXZlcnNfYV9MSUJBREQgPSBATkVUQk9PVF9EUklWRVJTQAogbGliZHJpdmVyc19hX0RFUEVOREVOQ0lFUyA9ICQobGliZHJpdmVyc19hX0xJQkFERCkKLUVYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorRVhUUkFfRElTVCA9IFJFQURNRS5uZXRib290CiAKICMgVGhlc2UgYmVsb3cgYXJlIHNldmVyYWwgc3BlY2lhbCBydWxlcyBmb3IgdGhlIGRldmljZSBkcml2ZXJzLgogIyBXZSBjYW5ub3QgdXNlIGEgc2ltcGxlIHJ1bGUgZm9yIHRoZW0uLi4KIAogIyBXaGF0IG9iamVjdHMgYXJlIGRlcml2ZWQgZnJvbSBhIGRyaXZlcj8KLTNjNTA5X2RyaXZlcnMgPSAzYzUwOS5vIDNjNTI5Lm8KKyMzYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiAzYzU5NV9kcml2ZXJzID0gM2M1OTUubwogM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KLWNzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KKyNjczg5eDBfZHJpdmVycyA9IGNzODl4MC5vCiBkYXZpY29tX2RyaXZlcnMgPSBkYXZpY29tLm8KLWRlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCi1lZXByb19kcml2ZXJzID0gZWVwcm8ubworI2RlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCisjZWVwcm9fZHJpdmVycyA9IGVlcHJvLm8KK2UxMDAwX2RyaXZlcnMgPSBlMTAwMC5vCiBlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubwogZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCiAjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KLWk4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KLWxhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCitmb3JjZWRldGhfZHJpdmVycyA9IGZvcmNlZGV0aC5vCisjaTgyNTg2X2RyaXZlcnMgPSAzYzUwNy5vIGV4b3MyMDUubyBuaTUyMTAubworI2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCiBuYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KLW5pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KKyNuaTUwMTBfZHJpdmVycyA9IG5pNTAxMC5vCituczgzODIwX2RyaXZlcnMgPSBuczgzODIwLm8KIG5zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KLW90dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KKyNvdHVsaXBfZHJpdmVycyA9IG90dWxpcC5vCitwY25ldDMyX2RyaXZlcnMgPSBwY25ldDMyLm8KK3BuaWNfZHJpdmVycyA9IHBuaWMubworcjgxNjlfZHJpdmVycyA9IHI4MTY5Lm8KIHJ0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubwogc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubwotc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubwotc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCi10aWFyYV9kcml2ZXJzID0gdGlhcmEubwotI3RsYW5fZHJpdmVycyA9IHRsYW4ubworI3NrX2cxNl9kcml2ZXJzID0gc2tfZzE2Lm8KKyNzbWM5MDAwX2RyaXZlcnMgPSBzbWM5MDAwLm8KK3RnM19kcml2ZXJzID0gdGczLm8KKyN0aWFyYV9kcml2ZXJzID0gdGlhcmEubwordGxhbl9kcml2ZXJzID0gdGxhbi5vCiB0dWxpcF9kcml2ZXJzID0gdHVsaXAubwogdmlhX3JoaW5lX2RyaXZlcnMgPSB2aWFfcmhpbmUubwogdzg5Yzg0MF9kcml2ZXJzID0gdzg5Yzg0MC5vCiAKICMgUGVyLW9iamVjdCBmbGFncy4KLTNjNTA5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA5PTEKLTNjNTI5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTI5PTEKKyMzYzUwOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwOT0xCisjM2M1Mjlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1Mjk9MQogM2M1OTVfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1OTU9MQogM2M5MHhfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M5MFg9MQotY3M4OXgwX29fQ0ZMQUdTID0gLURJTkNMVURFX0NTODlYMD0xCisjY3M4OXgwX29fQ0ZMQUdTID0gLURJTkNMVURFX0NTODlYMD0xCiBkYXZpY29tX29fQ0ZMQUdTID0gLURJTkNMVURFX0RBVklDT009MQotZGVwY2Ffb19DRkxBR1MgPSAtRElOQ0xVREVfREVQQ0E9MQotZWVwcm9fb19DRkxBR1MgPSAtRElOQ0xVREVfRUVQUk89MQorI2RlcGNhX29fQ0ZMQUdTID0gLURJTkNMVURFX0RFUENBPTEKKyNlZXByb19vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTz0xCitlMTAwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FMTAwMD0xCiBlZXBybzEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTzEwMD0xCiBlcGljMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0VQSUMxMDA9MQogI2ZhMzExX29fQ0ZMQUdTID0gLURJTkNMVURFX0ZBMzExPTEKLTNjNTA3X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA3PTEKLWV4b3MyMDVfb19DRkxBR1MgPSAtRElOQ0xVREVfRVhPUzIwNT0xCi1uaTUyMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MjEwPTEKLWxhbmNlX29fQ0ZMQUdTID0gLURJTkNMVURFX0xBTkNFPTEKLW5lMjEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORTIxMDA9MQotbmk2NTEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNjUxMD0xCitmb3JjZWRldGhfb19DRkxBR1MgPSAtRElOQ0xVREVfRk9SQ0VERVRIPTEKKyMzYzUwN19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwNz0xCisjZXhvczIwNV9vX0NGTEFHUyA9IC1ESU5DTFVERV9FWE9TMjA1PTEKKyNuaTUyMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MjEwPTEKKyNsYW5jZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9MQU5DRT0xCisjbmUyMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX05FMjEwMD0xCisjbmk2NTEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNjUxMD0xCiBuYXRzZW1pX29fQ0ZMQUdTID0gLURJTkNMVURFX05BVFNFTUk9MQotbmk1MDEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTAxMD0xCi0zYzUwM19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwMz0xCi1uZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORT0xCisjbmk1MDEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTAxMD0xCisjM2M1MDNfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDM9MQorI25lX29fQ0ZMQUdTID0gLURJTkNMVURFX05FPTEKK25zODM4MjBfb19DRkxBR1MgPSAtRElOQ0xVREVfTlM4MzgyMD0xCiBuczgzOTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTlM4MzkwPTEKLXdkX29fQ0ZMQUdTID0gLURJTkNMVURFX1dEPTEKLW90dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9PVFVMSVA9MQorI3dkX29fQ0ZMQUdTID0gLURJTkNMVURFX1dEPTEKKyNvdHVsaXBfb19DRkxBR1MgPSAtRElOQ0xVREVfT1RVTElQPTEKK3BjbmV0MzJfb19DRkxBR1MgPSAtRElOQ0xVREVfUENORVQzMj0xCitwbmljX29fQ0ZMQUdTID0gLURJTkNMVURFX1BOSUM9MQorcjgxNjlfb19DRkxBR1MgPSAtRElOQ0xVREVfUjgxNjk9MQogcnRsODEzOV9vX0NGTEFHUyA9IC1ESU5DTFVERV9SVEw4MTM5PTEKIHNpczkwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TSVM5MDA9MQotc2tfZzE2X29fQ0ZMQUdTID0gLURJTkNMVURFX1NLX0cxNj0xCi1zbWM5MDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NNQzkwMDA9MQotdGlhcmFfb19DRkxBR1MgPSAtRElOQ0xVREVfVElBUkE9MQotI3RsYW5fb19DRkxBR1MgPSAtRElOQ0xVREVfVExBTj0xCisjc2tfZzE2X29fQ0ZMQUdTID0gLURJTkNMVURFX1NLX0cxNj0xCisjc21jOTAwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TTUM5MDAwPTEKKyN0aWFyYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9USUFSQT0xCit0ZzNfb19DRkxBR1MgPSAtRElOQ0xVREVfVEczPTEKK3RsYW5fb19DRkxBR1MgPSAtRElOQ0xVREVfVExBTj0xCiB0dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9UVUxJUD0xCiB2aWFfcmhpbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfVklBX1JISU5FPTEKIHc4OWM4NDBfb19DRkxBR1MgPSAtRElOQ0xVREVfVzg5Qzg0MD0xCkBAIC0zMTYsMzIgKzM2NCwzMiBAQAogZGlzdGNsZWFuLWNvbXBpbGU6CiAJLXJtIC1mICoudGFiLmMKIAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG9AYW1fX3F1b3RlQApAQCAtMzUyLDQ1MCArNDAwLDUxMyBAQAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAogCiAuYy5vYmo6CiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpLyQqLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAogCiBsaWJkcml2ZXJzX2EtY29uZmlnLm86IGNvbmZpZy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jb25maWcubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm8gYHRlc3QgLWYgJ2NvbmZpZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWcuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWcuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtY29uZmlnLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1jb25maWcubyBgdGVzdCAtZiAnY29uZmlnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy5jCiAKIGxpYmRyaXZlcnNfYS1jb25maWcub2JqOiBjb25maWcuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1jb25maWcub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubzogZnN5c190ZnRwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubyBgdGVzdCAtZiAnZnN5c190ZnRwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdGZ0cC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdGZ0cC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vIGB0ZXN0IC1mICdmc3lzX3RmdHAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c190ZnRwLmMKIAogbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vYmo6IGZzeXNfdGZ0cC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3RmdHAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3RmdHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c190ZnRwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c190ZnRwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3RmdHAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3RmdHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c190ZnRwLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW1haW4ubzogbWFpbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1tYWluLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1tYWluLm8gYHRlc3QgLWYgJ21haW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFpbi5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21haW4uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWFpbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW1haW4ubyBgdGVzdCAtZiAnbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmMKLQotbGliZHJpdmVyc19hLW1haW4ub2JqOiBtYWluLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW1haW4ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbWFpbi5vYmogYGlmIHRlc3QgLWYgJ21haW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21haW4uYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtYWluLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW1haW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW1haW4ub2JqIGBpZiB0ZXN0IC1mICdtYWluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWFpbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWluLmMnOyBmaWAKK2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLm86IGkzODZfdGltZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIGB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGkzODZfdGltZXIuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdpMzg2X3RpbWVyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWkzODZfdGltZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIGB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGkzODZfdGltZXIuYworCitsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmo6IGkzODZfdGltZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLm9iaiBgaWYgdGVzdCAtZiAnaTM4Nl90aW1lci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2kzODZfdGltZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaTM4Nl90aW1lci5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2kzODZfdGltZXIuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWkzODZfdGltZXIub2JqIGBpZiB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaTM4Nl90aW1lci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pMzg2X3RpbWVyLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLW1pc2MubzogbWlzYy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1taXNjLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1taXNjLm8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21pc2MuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWlzYy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1taXNjLm8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jCiAKIGxpYmRyaXZlcnNfYS1taXNjLm9iajogbWlzYy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1taXNjLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW1pc2Mub2JqIGBpZiB0ZXN0IC1mICdtaXNjLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWlzYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9taXNjLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbWlzYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1taXNjLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWlzYy5vYmogYGlmIHRlc3QgLWYgJ21pc2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtaXNjLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21pc2MuYyc7IGZpYAogCitsaWJkcml2ZXJzX2EtbmljLm86IG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uaWMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm8gYHRlc3QgLWYgJ25pYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BuaWMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduaWMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbmljLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1uaWMubyBgdGVzdCAtZiAnbmljLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5pYy5jCisKK2xpYmRyaXZlcnNfYS1uaWMub2JqOiBuaWMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmljLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm9iaiBgaWYgdGVzdCAtZiAnbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pYy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25pYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1uaWMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm9iaiBgaWYgdGVzdCAtZiAnbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pYy5jJzsgZmlgCisKIGxpYmRyaXZlcnNfYS1wY2kubzogcGNpLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjaS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kubyBgdGVzdCAtZiAncGNpLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBjaS5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BjaS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wY2kubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjaS5vIGB0ZXN0IC1mICdwY2kuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcGNpLmMKIAogbGliZHJpdmVyc19hLXBjaS5vYmo6IHBjaS5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wY2kub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kub2JqIGBpZiB0ZXN0IC1mICdwY2kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY2kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNpLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNpLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kub2JqIGBpZiB0ZXN0IC1mICdwY2kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY2kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNpLmMnOyBmaWAKIAorbGliZHJpdmVyc19hLXBjaV9pby5vOiBwY2lfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGNpX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vIGB0ZXN0IC1mICdwY2lfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcGNpX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNpX2lvLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjaV9pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcGNpX2lvLm8gYHRlc3QgLWYgJ3BjaV9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY2lfaW8uYworCitsaWJkcml2ZXJzX2EtcGNpX2lvLm9iajogcGNpX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjaV9pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vYmogYGlmIHRlc3QgLWYgJ3BjaV9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjaV9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wY2lfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY2lfaW8uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGNpX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vYmogYGlmIHRlc3QgLWYgJ3BjaV9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjaV9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wY2lfaW8uYyc7IGZpYAorCiBsaWJkcml2ZXJzX2EtdGltZXIubzogdGltZXIuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGltZXIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10aW1lci5vIGB0ZXN0IC1mICd0aW1lci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aW1lci5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RpbWVyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRpbWVyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdGltZXIubyBgdGVzdCAtZiAndGltZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGltZXIuYwogCiBsaWJkcml2ZXJzX2EtdGltZXIub2JqOiB0aW1lci5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10aW1lci5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGltZXIub2JqIGBpZiB0ZXN0IC1mICd0aW1lci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RpbWVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RpbWVyLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGltZXIuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGltZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRpbWVyLm9iaiBgaWYgdGVzdCAtZiAndGltZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0aW1lci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90aW1lci5jJzsgZmlgCiAKLWxpYmRyaXZlcnNfYS0zYzUwOS5vOiAzYzUwOS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzUwOS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjNTA5Lm8gYHRlc3QgLWYgJzNjNTA5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjNTA5LmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1MDkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1MDkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzUwOS5vIGB0ZXN0IC1mICczYzUwOS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzUwOS5jCi0KLWxpYmRyaXZlcnNfYS0zYzUwOS5vYmo6IDNjNTA5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjNTA5Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzUwOS5vYmogYGlmIHRlc3QgLWYgJzNjNTA5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M1MDkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M1MDkuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzUwOS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzUwOS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1MDkub2JqIGBpZiB0ZXN0IC1mICczYzUwOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTA5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTA5LmMnOyBmaWAKK2xpYmRyaXZlcnNfYS1waWM4MjU5Lm86IHBpYzgyNTkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGljODI1OS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcGljODI1OS5vIGB0ZXN0IC1mICdwaWM4MjU5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBpYzgyNTkuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwaWM4MjU5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBpYzgyNTkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcGljODI1OS5vIGB0ZXN0IC1mICdwaWM4MjU5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBpYzgyNTkuYworCitsaWJkcml2ZXJzX2EtcGljODI1OS5vYmo6IHBpYzgyNTkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGljODI1OS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1waWM4MjU5Lm9iaiBgaWYgdGVzdCAtZiAncGljODI1OS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BpYzgyNTkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGljODI1OS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BpYzgyNTkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGljODI1OS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBpYzgyNTkub2JqIGBpZiB0ZXN0IC1mICdwaWM4MjU5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncGljODI1OS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9waWM4MjU5LmMnOyBmaWAKKworbGliZHJpdmVyc19hLWJhc2VtZW0ubzogYmFzZW1lbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gYHRlc3QgLWYgJ2Jhc2VtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmFzZW1lbS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jhc2VtZW0uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtYmFzZW1lbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gYHRlc3QgLWYgJ2Jhc2VtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmFzZW1lbS5jCisKK2xpYmRyaXZlcnNfYS1iYXNlbWVtLm9iajogYmFzZW1lbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWJhc2VtZW0ub2JqIGBpZiB0ZXN0IC1mICdiYXNlbWVtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmFzZW1lbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iYXNlbWVtLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmFzZW1lbS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1iYXNlbWVtLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtYmFzZW1lbS5vYmogYGlmIHRlc3QgLWYgJ2Jhc2VtZW0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiYXNlbWVtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jhc2VtZW0uYyc7IGZpYAogCiBsaWJkcml2ZXJzX2EtM2M1OTUubzogM2M1OTUuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtM2M1OTUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzU5NS5vIGB0ZXN0IC1mICczYzU5NS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzU5NS5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JzNjNTk1LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLTNjNTk1Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1OTUubyBgdGVzdCAtZiAnM2M1OTUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgM2M1OTUuYwogCiBsaWJkcml2ZXJzX2EtM2M1OTUub2JqOiAzYzU5NS5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzU5NS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1OTUub2JqIGBpZiB0ZXN0IC1mICczYzU5NS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTk1LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTk1LmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1OTUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1OTUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLTNjNTk1Lm9iaiBgaWYgdGVzdCAtZiAnM2M1OTUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICczYzU5NS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS8zYzU5NS5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS0zYzkweC5vOiAzYzkweC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzkweC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjOTB4Lm8gYHRlc3QgLWYgJzNjOTB4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjOTB4LmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M5MHguYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M5MHgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzkweC5vIGB0ZXN0IC1mICczYzkweC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzkweC5jCiAKIGxpYmRyaXZlcnNfYS0zYzkweC5vYmo6IDNjOTB4LmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjOTB4Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzkweC5vYmogYGlmIHRlc3QgLWYgJzNjOTB4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M5MHguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M5MHguYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzkweC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzkweC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M5MHgub2JqIGBpZiB0ZXN0IC1mICczYzkweC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjOTB4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjOTB4LmMnOyBmaWAKIAotbGliZHJpdmVyc19hLWNzODl4MC5vOiBjczg5eDAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtY3M4OXgwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWNzODl4MC5vIGB0ZXN0IC1mICdjczg5eDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3M4OXgwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY3M4OXgwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNzODl4MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWNzODl4MC5vIGB0ZXN0IC1mICdjczg5eDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3M4OXgwLmMKLQotbGliZHJpdmVyc19hLWNzODl4MC5vYmo6IGNzODl4MC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jczg5eDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWNzODl4MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1jczg5eDAub2JqIGBpZiB0ZXN0IC1mICdjczg5eDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjczg5eDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY3M4OXgwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY3M4OXgwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNzODl4MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY3M4OXgwLm9iaiBgaWYgdGVzdCAtZiAnY3M4OXgwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY3M4OXgwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NzODl4MC5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1kYXZpY29tLm86IGRhdmljb20uYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIGB0ZXN0IC1mICdkYXZpY29tLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRhdmljb20uYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYXZpY29tLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRhdmljb20ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIGB0ZXN0IC1mICdkYXZpY29tLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRhdmljb20uYwogCiBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmo6IGRhdmljb20uYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1kYXZpY29tLm9iaiBgaWYgdGVzdCAtZiAnZGF2aWNvbS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rhdmljb20uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGF2aWNvbS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rhdmljb20uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRhdmljb20ub2JqIGBpZiB0ZXN0IC1mICdkYXZpY29tLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGF2aWNvbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kYXZpY29tLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLWRlcGNhLm86IGRlcGNhLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWRlcGNhLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGVwY2EubyBgdGVzdCAtZiAnZGVwY2EuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVwY2EuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXBjYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1kZXBjYS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm8gYHRlc3QgLWYgJ2RlcGNhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlcGNhLmMKLQotbGliZHJpdmVyc19hLWRlcGNhLm9iajogZGVwY2EuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGVwY2Eub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm9iaiBgaWYgdGVzdCAtZiAnZGVwY2EuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXBjYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kZXBjYS5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RlcGNhLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRlcGNhLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1kZXBjYS5vYmogYGlmIHRlc3QgLWYgJ2RlcGNhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVwY2EuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVwY2EuYyc7IGZpYAotCi1saWJkcml2ZXJzX2EtZWVwcm8ubzogZWVwcm8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZWVwcm8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXByby5vIGB0ZXN0IC1mICdlZXByby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXByby5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VlcHJvLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWVlcHJvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ubyBgdGVzdCAtZiAnZWVwcm8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZWVwcm8uYwotCi1saWJkcml2ZXJzX2EtZWVwcm8ub2JqOiBlZXByby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXByby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ub2JqIGBpZiB0ZXN0IC1mICdlZXByby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvLm9iaiBgaWYgdGVzdCAtZiAnZWVwcm8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlZXByby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lZXByby5jJzsgZmlgCitsaWJkcml2ZXJzX2EtZTEwMDAubzogZTEwMDAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZTEwMDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lMTAwMC5vIGB0ZXN0IC1mICdlMTAwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlMTAwMC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2UxMDAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWUxMDAwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZTEwMDAubyBgdGVzdCAtZiAnZTEwMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZTEwMDAuYworCitsaWJkcml2ZXJzX2EtZTEwMDAub2JqOiBlMTAwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lMTAwMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZTEwMDAub2JqIGBpZiB0ZXN0IC1mICdlMTAwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2UxMDAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2UxMDAwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZTEwMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZTEwMDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWUxMDAwLm9iaiBgaWYgdGVzdCAtZiAnZTEwMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlMTAwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lMTAwMC5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vOiBlZXBybzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvMTAwLm8gYHRlc3QgLWYgJ2VlcHJvMTAwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGVlcHJvMTAwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8xMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8xMDAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIGB0ZXN0IC1mICdlZXBybzEwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXBybzEwMC5jCiAKIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmo6IGVlcHJvMTAwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWVlcHJvMTAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VlcHJvMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZWVwcm8xMDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZWVwcm8xMDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdlZXBybzEwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8xMDAub2JqIGBpZiB0ZXN0IC1mICdlZXBybzEwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvMTAwLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLWVwaWMxMDAubzogZXBpYzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gYHRlc3QgLWYgJ2VwaWMxMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXBpYzEwMC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VwaWMxMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZXBpYzEwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gYHRlc3QgLWYgJ2VwaWMxMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXBpYzEwMC5jCiAKIGxpYmRyaXZlcnNfYS1lcGljMTAwLm9iajogZXBpYzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lcGljMTAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWVwaWMxMDAub2JqIGBpZiB0ZXN0IC1mICdlcGljMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXBpYzEwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcGljMTAwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXBpYzEwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1lcGljMTAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZXBpYzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VwaWMxMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcGljMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VwaWMxMDAuYyc7IGZpYAogCi1saWJkcml2ZXJzX2EtZmEzMTEubzogZmEzMTEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZmEzMTEubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mYTMxMS5vIGB0ZXN0IC1mICdmYTMxMS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmYTMxMS5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZhMzExLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWZhMzExLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZmEzMTEubyBgdGVzdCAtZiAnZmEzMTEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmEzMTEuYwotCi1saWJkcml2ZXJzX2EtZmEzMTEub2JqOiBmYTMxMS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mYTMxMS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZmEzMTEub2JqIGBpZiB0ZXN0IC1mICdmYTMxMS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZhMzExLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZhMzExLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZmEzMTEuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZmEzMTEub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZhMzExLm9iaiBgaWYgdGVzdCAtZiAnZmEzMTEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmYTMxMS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mYTMxMS5jJzsgZmlgCi0KLWxpYmRyaXZlcnNfYS1pODI1ODYubzogaTgyNTg2LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWk4MjU4Ni5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1pODI1ODYubyBgdGVzdCAtZiAnaTgyNTg2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGk4MjU4Ni5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2k4MjU4Ni5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1pODI1ODYubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1pODI1ODYubyBgdGVzdCAtZiAnaTgyNTg2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGk4MjU4Ni5jCi0KLWxpYmRyaXZlcnNfYS1pODI1ODYub2JqOiBpODI1ODYuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iaiBgaWYgdGVzdCAtZiAnaTgyNTg2LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaTgyNTg2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2k4MjU4Ni5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2k4MjU4Ni5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1pODI1ODYub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWk4MjU4Ni5vYmogYGlmIHRlc3QgLWYgJ2k4MjU4Ni5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2k4MjU4Ni5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pODI1ODYuYyc7IGZpYAotCi1saWJkcml2ZXJzX2EtbGFuY2UubzogbGFuY2UuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbGFuY2UubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1sYW5jZS5vIGB0ZXN0IC1mICdsYW5jZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BsYW5jZS5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2xhbmNlLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWxhbmNlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbGFuY2UubyBgdGVzdCAtZiAnbGFuY2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbGFuY2UuYwotCi1saWJkcml2ZXJzX2EtbGFuY2Uub2JqOiBsYW5jZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1sYW5jZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbGFuY2Uub2JqIGBpZiB0ZXN0IC1mICdsYW5jZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xhbmNlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2xhbmNlLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbGFuY2UuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbGFuY2Uub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWxhbmNlLm9iaiBgaWYgdGVzdCAtZiAnbGFuY2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdsYW5jZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9sYW5jZS5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1uYXRzZW1pLm86IG5hdHNlbWkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIGB0ZXN0IC1mICduYXRzZW1pLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5hdHNlbWkuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduYXRzZW1pLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5hdHNlbWkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIGB0ZXN0IC1mICduYXRzZW1pLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5hdHNlbWkuYwogCiBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmo6IG5hdHNlbWkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uYXRzZW1pLm9iaiBgaWYgdGVzdCAtZiAnbmF0c2VtaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25hdHNlbWkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbmF0c2VtaS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25hdHNlbWkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5hdHNlbWkub2JqIGBpZiB0ZXN0IC1mICduYXRzZW1pLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmF0c2VtaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9uYXRzZW1pLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW5pNTAxMC5vOiBuaTUwMTAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etbmk1MDEwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW5pNTAxMC5vIGB0ZXN0IC1mICduaTUwMTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbmk1MDEwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbmk1MDEwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5pNTAxMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5pNTAxMC5vIGB0ZXN0IC1mICduaTUwMTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbmk1MDEwLmMKLQotbGliZHJpdmVyc19hLW5pNTAxMC5vYmo6IG5pNTAxMC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uaTUwMTAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pNTAxMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uaTUwMTAub2JqIGBpZiB0ZXN0IC1mICduaTUwMTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduaTUwMTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvbmk1MDEwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbmk1MDEwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5pNTAxMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etbmk1MDEwLm9iaiBgaWYgdGVzdCAtZiAnbmk1MDEwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmk1MDEwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pNTAxMC5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1uczgzOTAubzogbnM4MzkwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW5zODM5MC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAubyBgdGVzdCAtZiAnbnM4MzkwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM5MC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25zODM5MC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1uczgzOTAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5zODM5MC5vIGB0ZXN0IC1mICduczgzOTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbnM4MzkwLmMKIAogbGliZHJpdmVyc19hLW5zODM5MC5vYmo6IG5zODM5MC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIGBpZiB0ZXN0IC1mICduczgzOTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduczgzOTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzkwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbnM4MzkwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM5MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIGBpZiB0ZXN0IC1mICduczgzOTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduczgzOTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzkwLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW90dWxpcC5vOiBvdHVsaXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etb3R1bGlwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW90dWxpcC5vIGB0ZXN0IC1mICdvdHVsaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgb3R1bGlwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1vdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nb3R1bGlwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW90dWxpcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW90dWxpcC5vIGB0ZXN0IC1mICdvdHVsaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgb3R1bGlwLmMKLQotbGliZHJpdmVyc19hLW90dWxpcC5vYmo6IG90dWxpcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1vdHVsaXAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1vdHVsaXAub2JqIGBpZiB0ZXN0IC1mICdvdHVsaXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdvdHVsaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvb3R1bGlwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1vdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nb3R1bGlwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW90dWxpcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etb3R1bGlwLm9iaiBgaWYgdGVzdCAtZiAnb3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnb3R1bGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL290dWxpcC5jJzsgZmlgCitsaWJkcml2ZXJzX2EtcGNuZXQzMi5vOiBwY25ldDMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjbmV0MzIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjbmV0MzIubyBgdGVzdCAtZiAncGNuZXQzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY25ldDMyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNuZXQzMi5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wY25ldDMyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjbmV0MzIubyBgdGVzdCAtZiAncGNuZXQzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY25ldDMyLmMKKworbGliZHJpdmVyc19hLXBjbmV0MzIub2JqOiBwY25ldDMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjbmV0MzIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcGNuZXQzMi5vYmogYGlmIHRlc3QgLWYgJ3BjbmV0MzIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY25ldDMyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BjbmV0MzIuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY25ldDMyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjbmV0MzIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wY25ldDMyLm9iaiBgaWYgdGVzdCAtZiAncGNuZXQzMi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjbmV0MzIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNuZXQzMi5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1ydGw4MTM5Lm86IHJ0bDgxMzkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIGB0ZXN0IC1mICdydGw4MTM5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJ0bDgxMzkuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdydGw4MTM5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXJ0bDgxMzkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIGB0ZXN0IC1mICdydGw4MTM5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJ0bDgxMzkuYwogCiBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmo6IHJ0bDgxMzkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1ydGw4MTM5Lm9iaiBgaWYgdGVzdCAtZiAncnRsODEzOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3J0bDgxMzkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnRsODEzOS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3J0bDgxMzkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXJ0bDgxMzkub2JqIGBpZiB0ZXN0IC1mICdydGw4MTM5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnRsODEzOS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ydGw4MTM5LmMnOyBmaWAKIAogbGliZHJpdmVyc19hLXNpczkwMC5vOiBzaXM5MDAuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vIGB0ZXN0IC1mICdzaXM5MDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2lzOTAwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2lzOTAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNpczkwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gYHRlc3QgLWYgJ3NpczkwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaXM5MDAuYwogCiBsaWJkcml2ZXJzX2Etc2lzOTAwLm9iajogc2lzOTAwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNpczkwMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vYmogYGlmIHRlc3QgLWYgJ3NpczkwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpczkwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaXM5MDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaXM5MDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2lzOTAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vYmogYGlmIHRlc3QgLWYgJ3NpczkwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpczkwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaXM5MDAuYyc7IGZpYAogCi1saWJkcml2ZXJzX2Etc2tfZzE2Lm86IHNrX2cxNi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1za19nMTYubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc2tfZzE2Lm8gYHRlc3QgLWYgJ3NrX2cxNi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bza19nMTYuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNrX2cxNi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdza19nMTYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2tfZzE2Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2tfZzE2Lm8gYHRlc3QgLWYgJ3NrX2cxNi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bza19nMTYuYwotCi1saWJkcml2ZXJzX2Etc2tfZzE2Lm9iajogc2tfZzE2LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNrX2cxNi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNrX2cxNi5vYmogYGlmIHRlc3QgLWYgJ3NrX2cxNi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NrX2cxNi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9za19nMTYuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNrX2cxNi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdza19nMTYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2tfZzE2Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1za19nMTYub2JqIGBpZiB0ZXN0IC1mICdza19nMTYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdza19nMTYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2tfZzE2LmMnOyBmaWAKLQotbGliZHJpdmVyc19hLXNtYzkwMDAubzogc21jOTAwMC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm8gYHRlc3QgLWYgJ3NtYzkwMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc21jOTAwMC5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NtYzkwMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc21jOTAwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNtYzkwMDAubyBgdGVzdCAtZiAnc21jOTAwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzbWM5MDAwLmMKLQotbGliZHJpdmVyc19hLXNtYzkwMDAub2JqOiBzbWM5MDAwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNtYzkwMDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc21jOTAwMC5vYmogYGlmIHRlc3QgLWYgJ3NtYzkwMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzbWM5MDAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NtYzkwMDAuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzbWM5MDAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNtYzkwMDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNtYzkwMDAub2JqIGBpZiB0ZXN0IC1mICdzbWM5MDAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc21jOTAwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zbWM5MDAwLmMnOyBmaWAKLQotbGliZHJpdmVyc19hLXRpYXJhLm86IHRpYXJhLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRpYXJhLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGlhcmEubyBgdGVzdCAtZiAndGlhcmEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlhcmEuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0aWFyYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10aWFyYS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRpYXJhLm8gYHRlc3QgLWYgJ3RpYXJhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpYXJhLmMKLQotbGliZHJpdmVyc19hLXRpYXJhLm9iajogdGlhcmEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGlhcmEub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRpYXJhLm9iaiBgaWYgdGVzdCAtZiAndGlhcmEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0aWFyYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90aWFyYS5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RpYXJhLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRpYXJhLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10aWFyYS5vYmogYGlmIHRlc3QgLWYgJ3RpYXJhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGlhcmEuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGlhcmEuYyc7IGZpYAorbGliZHJpdmVyc19hLXRnMy5vOiB0ZzMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGczLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vIGB0ZXN0IC1mICd0ZzMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGczLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGczLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRnMy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRnMy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdGczLm8gYHRlc3QgLWYgJ3RnMy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZzMuYworCitsaWJkcml2ZXJzX2EtdGczLm9iajogdGczLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRnMy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vYmogYGlmIHRlc3QgLWYgJ3RnMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RnMy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZzMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRnMy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZzMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGczLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vYmogYGlmIHRlc3QgLWYgJ3RnMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RnMy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZzMuYyc7IGZpYAogCiBsaWJkcml2ZXJzX2EtdGxhbi5vOiB0bGFuLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRsYW4ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ubyBgdGVzdCAtZiAndGxhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bGFuLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGxhbi5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10bGFuLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ubyBgdGVzdCAtZiAndGxhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bGFuLmMKIAogbGliZHJpdmVyc19hLXRsYW4ub2JqOiB0bGFuLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRsYW4ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGxhbi5vYmogYGlmIHRlc3QgLWYgJ3RsYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0bGFuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RsYW4uYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0bGFuLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRsYW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10bGFuLm9iaiBgaWYgdGVzdCAtZiAndGxhbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RsYW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGxhbi5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS10dWxpcC5vOiB0dWxpcC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10dWxpcC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXR1bGlwLm8gYHRlc3QgLWYgJ3R1bGlwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHR1bGlwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndHVsaXAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdHVsaXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10dWxpcC5vIGB0ZXN0IC1mICd0dWxpcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0dWxpcC5jCiAKIGxpYmRyaXZlcnNfYS10dWxpcC5vYmo6IHR1bGlwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXR1bGlwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10dWxpcC5vYmogYGlmIHRlc3QgLWYgJ3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHVsaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHVsaXAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0dWxpcC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10dWxpcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdHVsaXAub2JqIGBpZiB0ZXN0IC1mICd0dWxpcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3R1bGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3R1bGlwLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLXZpYS1yaGluZS5vOiB2aWEtcmhpbmUuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vIGB0ZXN0IC1mICd2aWEtcmhpbmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdmlhLXJoaW5lLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndmlhLXJoaW5lLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXZpYS1yaGluZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gYHRlc3QgLWYgJ3ZpYS1yaGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2aWEtcmhpbmUuYwogCiBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iajogdmlhLXJoaW5lLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogYGlmIHRlc3QgLWYgJ3ZpYS1yaGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZpYS1yaGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92aWEtcmhpbmUuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd2aWEtcmhpbmUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogYGlmIHRlc3QgLWYgJ3ZpYS1yaGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZpYS1yaGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92aWEtcmhpbmUuYyc7IGZpYAogCiBsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vOiB3ODljODQwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXc4OWM4NDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAubyBgdGVzdCAtZiAndzg5Yzg0MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3ODljODQwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndzg5Yzg0MC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS13ODljODQwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAubyBgdGVzdCAtZiAndzg5Yzg0MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3ODljODQwLmMKIAogbGliZHJpdmVyc19hLXc4OWM4NDAub2JqOiB3ODljODQwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXc4OWM4NDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vYmogYGlmIHRlc3QgLWYgJ3c4OWM4NDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd3ODljODQwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3c4OWM4NDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd3ODljODQwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXc4OWM4NDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS13ODljODQwLm9iaiBgaWYgdGVzdCAtZiAndzg5Yzg0MC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3c4OWM4NDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvdzg5Yzg0MC5jJzsgZmlgCi11bmluc3RhbGwtaW5mby1hbToKKworbGliZHJpdmVyc19hLXI4MTY5Lm86IHI4MTY5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXI4MTY5Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcjgxNjkubyBgdGVzdCAtZiAncjgxNjkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcjgxNjkuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdyODE2OS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1yODE2OS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXI4MTY5Lm8gYHRlc3QgLWYgJ3I4MTY5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHI4MTY5LmMKKworbGliZHJpdmVyc19hLXI4MTY5Lm9iajogcjgxNjkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcjgxNjkub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXI4MTY5Lm9iaiBgaWYgdGVzdCAtZiAncjgxNjkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdyODE2OS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yODE2OS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3I4MTY5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXI4MTY5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1yODE2OS5vYmogYGlmIHRlc3QgLWYgJ3I4MTY5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncjgxNjkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcjgxNjkuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm86IGZvcmNlZGV0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mb3JjZWRldGgubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm8gYHRlc3QgLWYgJ2ZvcmNlZGV0aC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmb3JjZWRldGguYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmb3JjZWRldGguYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mb3JjZWRldGgubyBgdGVzdCAtZiAnZm9yY2VkZXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZvcmNlZGV0aC5jCisKK2xpYmRyaXZlcnNfYS1mb3JjZWRldGgub2JqOiBmb3JjZWRldGguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiBgaWYgdGVzdCAtZiAnZm9yY2VkZXRoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZm9yY2VkZXRoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZvcmNlZGV0aC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZvcmNlZGV0aC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mb3JjZWRldGgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiBgaWYgdGVzdCAtZiAnZm9yY2VkZXRoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZm9yY2VkZXRoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZvcmNlZGV0aC5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1uczgzODIwLm86IG5zODM4MjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIGB0ZXN0IC1mICduczgzODIwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM4MjAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduczgzODIwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM4MjAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIGB0ZXN0IC1mICduczgzODIwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM4MjAuYworCitsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmo6IG5zODM4MjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzODIwLm9iaiBgaWYgdGVzdCAtZiAnbnM4MzgyMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25zODM4MjAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzgyMC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25zODM4MjAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5zODM4MjAub2JqIGBpZiB0ZXN0IC1mICduczgzODIwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbnM4MzgyMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9uczgzODIwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXBuaWMubzogcG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljLm8gYHRlc3QgLWYgJ3BuaWMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pYy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuaWMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcG5pYy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljLm8gYHRlc3QgLWYgJ3BuaWMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pYy5jCisKK2xpYmRyaXZlcnNfYS1wbmljLm9iajogcG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBuaWMub2JqIGBpZiB0ZXN0IC1mICdwbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncG5pYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wbmljLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5pYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wbmljLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pYy5vYmogYGlmIHRlc3QgLWYgJ3BuaWMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BuaWMuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtcG5pY19hcGkubzogcG5pY19hcGkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcG5pY19hcGkubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljX2FwaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljX2FwaS5vIGB0ZXN0IC1mICdwbmljX2FwaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmljX2FwaS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuaWNfYXBpLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBuaWNfYXBpLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pY19hcGkubyBgdGVzdCAtZiAncG5pY19hcGkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pY19hcGkuYworCitsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqOiBwbmljX2FwaS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljX2FwaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqIGBpZiB0ZXN0IC1mICdwbmljX2FwaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BuaWNfYXBpLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BuaWNfYXBpLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljX2FwaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5pY19hcGkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBuaWNfYXBpLm9iaiBgaWYgdGVzdCAtZiAncG5pY19hcGkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwbmljX2FwaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wbmljX2FwaS5jJzsgZmlgCiAKIElEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCiAJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKQEAgLTgxNywxMSArOTI4LDkgQEAKIAkgIGRvbmUgfCBcCiAJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKIAkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQorCXRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCiBjdGFnczogQ1RBR1MKIENUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCiAJCSQoVEFHU19GSUxFUykgJChMSVNQKQpAQCAtODk1LDcgKzEwMDQsNyBAQAogY2xlYW4tZ2VuZXJpYzoKIAogZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQogCiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CiAJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgpAQCAtOTYyLDEwICsxMDcxLDEwIEBACiAKIAogIyBJcyBpdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgZGVwZW5kZWNpZXMgZXhwbGljaXRseT8KLSQoM2M1MDlfZHJpdmVycyk6IDNjNTA5LmMgM2M1MDkuaAotJCgzYzUwOV9kcml2ZXJzKTogJS5vOiAzYzUwOS5jCi0JJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAotCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKyMkKDNjNTA5X2RyaXZlcnMpOiAzYzUwOS5jIDNjNTA5LmgKKyMkKDNjNTA5X2RyaXZlcnMpOiAlLm86IDNjNTA5LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKICQoM2M1OTVfZHJpdmVycyk6IDNjNTk1LmMgM2M1OTUuaAogJCgzYzU5NV9kcml2ZXJzKTogJS5vOiAzYzU5NS5jCkBAIC05NzcsMjMgKzEwODYsMjggQEAKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKGNzODl4MF9kcml2ZXJzKTogY3M4OXgwLmMgY3M4OXgwLmgKLSQoY3M4OXgwX2RyaXZlcnMpOiAlLm86IGNzODl4MC5jCi0JJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAotCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKyMkKGNzODl4MF9kcml2ZXJzKTogY3M4OXgwLmMgY3M4OXgwLmgKKyMkKGNzODl4MF9kcml2ZXJzKTogJS5vOiBjczg5eDAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChkYXZpY29tX2RyaXZlcnMpOiBkYXZpY29tLmMKICQoZGF2aWNvbV9kcml2ZXJzKTogJS5vOiBkYXZpY29tLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKGRlcGNhX2RyaXZlcnMpOiBkZXBjYS5jCi0kKGRlcGNhX2RyaXZlcnMpOiAlLm86IGRlcGNhLmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoZGVwY2FfZHJpdmVycyk6IGRlcGNhLmMKKyMkKGRlcGNhX2RyaXZlcnMpOiAlLm86IGRlcGNhLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKLSQoZWVwcm9fZHJpdmVycyk6ICUubzogZWVwcm8uYworIyQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKKyMkKGVlcHJvX2RyaXZlcnMpOiAlLm86IGVlcHJvLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZTEwMDBfZHJpdmVycyk6IGUxMDAwLmMgZTEwMDBfaHcuaAorJChlMTAwMF9kcml2ZXJzKTogJS5vOiBlMTAwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTAwNywyOCArMTEyMSwzOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKKyQoZm9yY2VkZXRoX2RyaXZlcnMpOiBmb3JjZWRldGguYworJChmb3JjZWRldGhfZHJpdmVycyk6ICUubzogZm9yY2VkZXRoLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiAjJChmYTMxMV9kcml2ZXJzKTogZmEzMTEuYwogIyQoZmEzMTFfZHJpdmVycyk6ICUubzogZmEzMTEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCi0kKGk4MjU4Nl9kcml2ZXJzKTogJS5vOiBpODI1ODYuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCisjJChpODI1ODZfZHJpdmVycyk6ICUubzogaTgyNTg2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQobGFuY2VfZHJpdmVycyk6IGxhbmNlLmMKLSQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChsYW5jZV9kcml2ZXJzKTogbGFuY2UuYworIyQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChuYXRzZW1pX2RyaXZlcnMpOiBuYXRzZW1pLmMKICQobmF0c2VtaV9kcml2ZXJzKTogJS5vOiBuYXRzZW1pLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKG5pNTAxMF9kcml2ZXJzKTogbmk1MDEwLmMKLSQobmk1MDEwX2RyaXZlcnMpOiAlLm86IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6ICUubzogbmk1MDEwLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobnM4MzgyMF9kcml2ZXJzKTogbnM4MzgyMC5jCiskKG5zODM4MjBfZHJpdmVycyk6ICUubzogbnM4MzgyMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTAzNyw0MSArMTE2MSw2MiBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQob3R1bGlwX2RyaXZlcnMpOiBvdHVsaXAuYyBvdHVsaXAuaAotJChvdHVsaXBfZHJpdmVycyk6ICUubzogb3R1bGlwLmMKKyMkKG90dWxpcF9kcml2ZXJzKTogb3R1bGlwLmMgb3R1bGlwLmgKKyMkKG90dWxpcF9kcml2ZXJzKTogJS5vOiBvdHVsaXAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChwY25ldDMyX2RyaXZlcnMpOiBwY25ldDMyLmMKKyQocGNuZXQzMl9kcml2ZXJzKTogJS5vOiBwY25ldDMyLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHJ0bDgxMzlfZHJpdmVycyk6IHJ0bDgxMzkuYwotJChydGw4MTM5X2RyaXZlcnMpOiAlLm86IHJ0bDgxMzkuYworJChwbmljX2RyaXZlcnMpOiBwbmljLmMKKyQocG5pY19kcml2ZXJzKTogJS5vOiBwbmljLmMgcG5pY19hcGkuaAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoc2lzOTAwX2RyaXZlcnMpOiBzaXM5MDAuYwotJChzaXM5MDBfZHJpdmVycyk6ICUubzogc2lzOTAwLmMgc2lzOTAwLmgKKyQocnRsODEzOV9kcml2ZXJzKTogcnRsODEzOS5jCiskKHJ0bDgxMzlfZHJpdmVycyk6ICUubzogcnRsODEzOS5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCi0kKHNrX2cxNl9kcml2ZXJzKTogJS5vOiBza19nMTYuYworJChyODE2OV9kcml2ZXJzKTogcjgxNjkuYworJChyODE2OV9kcml2ZXJzKTogJS5vOiByODE2OS5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChzbWM5MDAwX2RyaXZlcnMpOiBzbWM5MDAwLmMgc21jOTAwMC5oCi0kKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCiskKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMgc2lzOTAwLmgKKyQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYwotJCh0aWFyYV9kcml2ZXJzKTogJS5vOiB0aWFyYS5jCisjJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCisjJChza19nMTZfZHJpdmVycyk6ICUubzogc2tfZzE2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKHNtYzkwMDBfZHJpdmVycyk6IHNtYzkwMDAuYyBzbWM5MDAwLmgKKyMkKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCisKKyQodGczX2RyaXZlcnMpOiB0ZzMuYyB0ZzMuaAorJCh0ZzNfZHJpdmVycyk6ICUubzogdGczLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0jJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMKLSMkKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisjJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYworIyQodGlhcmFfZHJpdmVycyk6ICUubzogdGlhcmEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMgdGxhbi5oCiskKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKwogJCh0dWxpcF9kcml2ZXJzKTogdHVsaXAuYwogJCh0dWxpcF9kcml2ZXJzKTogJS5vOiB0dWxpcC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXApJbmRleDogYi9uZXRib290L2Jhc2VtZW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9iYXNlbWVtLmMKQEAgLTAsMCArMSwxNzggQEAKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNkZWZpbmUgREVCVUdfQkFTRU1FTQorLyogUm91dGluZXMgdG8gYWxsb2NhdGUgYmFzZSBtZW1vcnkgaW4gYSBCSU9TLWNvbXBhdGlibGUgd2F5LCBieQorICogdXBkYXRpbmcgdGhlIEZyZWUgQmFzZSBNZW1vcnkgU2l6ZSBjb3VudGVyIGF0IDQwOjEzaC4KKyAqCisgKiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4gKG1jYjMwKQorICogJElkOiBncnViLTAuOTUtZGlza2xlc3MtcGF0Y2gtMi11bmRpLnBhdGNoLHYgMS4xLjEuMSAyMDA1LzA2LzE0IDA4OjE4OjUwIHdlc29sb3dzIEV4cCAkCisgKi8KKworI2RlZmluZSBmYm1zICggKCB1aW50MTZfdCAqICkgcGh5c190b192aXJ0ICggMHg0MTMgKSApCisjZGVmaW5lIEJBU0VfTUVNT1JZX01BWCAoIDY0MCApCisjZGVmaW5lIEZSRUVfQkxPQ0tfTUFHSUMgKCAoJyEnPDwwKSArICgnRic8PDgpICsgKCdSJzw8MTYpICsgKCdFJzw8MjQpICkKKwordHlwZWRlZiBzdHJ1Y3QgZnJlZV9iYXNlX21lbW9yeV9ibG9jayB7CisJdWludDMyX3QJbWFnaWM7CisJdWludDE2X3QJc2l6ZV9rYjsKK30gZnJlZV9iYXNlX21lbW9yeV9ibG9ja190OworCisvKiBSZXR1cm4gYW1vdW50IG9mIGZyZWUgYmFzZSBtZW1vcnkgaW4gYnl0ZXMKKyAqLworCit1aW50MzJfdCBnZXRfZnJlZV9iYXNlX21lbW9yeSAoIHZvaWQgKSB7CisJcmV0dXJuICpmYm1zIDw8IDEwOworfQorCisvKiBBZGp1c3QgdGhlIHJlYWwgbW9kZSBzdGFjayBwb2ludGVyLiAgV2Uga2VlcCB0aGUgcmVhbCBtb2RlIHN0YWNrIGF0CisgKiB0aGUgdG9wIG9mIGZyZWUgYmFzZSBtZW1vcnksIHJhdGhlciB0aGFuIGFsbG9jYXRpbmcgc3BhY2UgZm9yIGl0LgorICovCisKK2lubGluZSB2b2lkIGFkanVzdF9yZWFsX21vZGVfc3RhY2sgKCB2b2lkICkgeworLyogIAlyZWFsX21vZGVfc3RhY2sgPSAoICpmYm1zIDw8IDEwICk7ICovCit9CisKKy8qIEFsbG9jYXRlIE4gYnl0ZXMgb2YgYmFzZSBtZW1vcnkuICBBbW91bnQgYWxsb2NhdGVkIHdpbGwgYmUgcm91bmRlZAorICogdXAgdG8gdGhlIG5lYXJlc3Qga0IsIHNpbmNlIHRoYXQncyB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIEJJT1MgRkJNUworICogY291bnRlci4gIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqLworCit2b2lkICogYWxsb3RfYmFzZV9tZW1vcnkgKCBzaXplX3Qgc2l6ZSApIHsKKwl1aW50MTZfdCBzaXplX2tiID0gKCBzaXplICsgMTAyMyApID4+IDEwOworCXZvaWQgKnB0ciA9IE5VTEw7CisKKyNpZmRlZiBERUJVR19CQVNFTUVNCisJcHJpbnRmICggIlRyeWluZyB0byBhbGxvY2F0ZSAlZCBrQiBvZiBiYXNlIG1lbW9yeSwgJWQga0IgZnJlZVxuIiwKKwkJIHNpemVfa2IsICpmYm1zICk7CisjZW5kaWYKKworCS8qIEZyZWUgdXAgYW55IHVudXNlZCBtZW1vcnkgYmVmb3JlIHdlIHN0YXJ0ICovCisJZnJlZV91bnVzZWRfYmFzZV9tZW1vcnkoKTsKKworCS8qIENoZWNrIGF2YWlsYWJsZSBiYXNlIG1lbW9yeSAqLworCWlmICggc2l6ZV9rYiA+ICpmYm1zICkgeyByZXR1cm4gTlVMTDsgfQorCisJLyogUmVkdWNlIGF2YWlsYWJsZSBiYXNlIG1lbW9yeSAqLworCSpmYm1zIC09IHNpemVfa2I7CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzcyBvZiBtZW1vcnkgYWxsb2NhdGVkICovCisJcHRyID0gcGh5c190b192aXJ0ICggKmZibXMgPDwgMTAgKTsKKworI2lmZGVmIERFQlVHX0JBU0VNRU0KKwkvKiBaZXJvIG91dCBtZW1vcnkuICBXZSBkbyB0aGlzIHNvIHRoYXQgYWxsb2NhdGlvbiBvZgorCSAqIGFscmVhZHktdXNlZCBzcGFjZSB3aWxsIHNob3cgdXAgaW4gdGhlIGZvcm0gb2YgYSBjcmFzaCBhcworCSAqIHNvb24gYXMgcG9zc2libGUuCisJICovCisJbWVtc2V0ICggcHRyLCAwLCBzaXplX2tiIDw8IDEwICk7CisjZW5kaWYKKworCS8qIEFkanVzdCByZWFsIG1vZGUgc3RhY2sgcG9pbnRlciAqLworCWFkanVzdF9yZWFsX21vZGVfc3RhY2sgKCk7CisKKwlyZXR1cm4gcHRyOworfQorCisvKiBGcmVlIGJhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvdF9iYXNlX21lbW9yeS4gIFRoZSBCSU9TIHByb3ZpZGVzCisgKiBub3RoaW5nIGJldHRlciB0aGFuIGEgTElGTyBtZWNoYW5pc20gZm9yIGZyZWVpbmcgbWVtb3J5IChpLmUuIGl0CisgKiBqdXN0IGhhcyB0aGUgc2luZ2xlICJ0b3RhbCBmcmVlIG1lbW9yeSIgY291bnRlciksIGJ1dCB3ZSBpbXByb3ZlCisgKiB1cG9uIHRoaXMgc2xpZ2h0bHk7IGFzIGxvbmcgYXMgeW91IGZyZWUgYWxsIHRoZSBhbGxvdHRlZCBibG9ja3MsIGl0CisgKiBkb2Vzbid0IG1hdHRlciB3aGF0IG9yZGVyIHlvdSBmcmVlIHRoZW0gaW4uICAoVGhpcyB3aWxsIG9ubHkgd29yaworICogZm9yIGJsb2NrcyB0aGF0IGFyZSBmcmVlZCB2aWEgZm9yZ2V0X2Jhc2VfbWVtb3J5KCkpLgorICoKKyAqIFllcywgaXQncyBhbm5veWluZyB0aGF0IHlvdSBoYXZlIHRvIHJlbWVtYmVyIHRoZSBzaXplIG9mIHRoZSBibG9ja3MKKyAqIHlvdSd2ZSBhbGxvdHRlZC4gIEhvd2V2ZXIsIHNpbmNlIG91ciBncmFudWxhcml0eSBvZiBhbGxvY2F0aW9uIGlzCisgKiAxSywgdGhlIGFsdGVybmF0aXZlIGlzIHRvIHJpc2sgd2FzdGluZyB0aGUgb2NjYXNpb25hbCBrQiBvZiBiYXNlCisgKiBtZW1vcnksIHdoaWNoIGlzIGEgQmFkIFRoaW5nLiAgUmVhbGx5LCB5b3Ugc2hvdWxkIGJlIHVzaW5nIGFzCisgKiBsaXR0bGUgYmFzZSBtZW1vcnkgYXMgcG9zc2libGUsIHNvIGNvbnNpZGVyIHRoZSBhd2t3YXJkbmVzcyBvZiB0aGUKKyAqIEFQSSB0byBiZSBhIGZlYXR1cmUhIDotKQorICovCisKK3ZvaWQgZm9yZ2V0X2Jhc2VfbWVtb3J5ICggdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSApIHsKKwl1aW50MTZfdCByZW1haW5kZXIgPSB2aXJ0X3RvX3BoeXMocHRyKSAmIDEwMjM7CisJdWludDE2X3Qgc2l6ZV9rYiA9ICggc2l6ZSArIHJlbWFpbmRlciArIDEwMjMgKSA+PiAxMDsKKwlmcmVlX2Jhc2VfbWVtb3J5X2Jsb2NrX3QgKmZyZWVfYmxvY2sgPQorCQkoIGZyZWVfYmFzZV9tZW1vcnlfYmxvY2tfdCAqICkgKCBwdHIgLSByZW1haW5kZXIgKTsKKwkKKwlpZiAoICggcHRyID09IE5VTEwgKSB8fCAoIHNpemUgPT0gMCApICkgeyByZXR1cm47IH0KKworI2lmZGVmIERFQlVHX0JBU0VNRU0KKwlwcmludGYgKCAiVHJ5aW5nIHRvIGZyZWUgJWQgYnl0ZXMgYmFzZSBtZW1vcnkgYXQgMHgleFxuIiwKKwkJIHNpemUsIHZpcnRfdG9fcGh5cyAoIHB0ciApICk7CisJaWYgKCByZW1haW5kZXIgPiAwICkgeworCQlwcmludGYgKCAiV0FSTklORzogZGVzdHJ1Y3RpdmVseSBleHBhbmRpbmcgZnJlZSBibG9jayAiCisJCQkgImRvd253YXJkcyB0byAweCV4XG4iLAorCQkJIHZpcnRfdG9fcGh5cyAoIHB0ciAtIHJlbWFpbmRlciApICk7CisJfQorI2VuZGlmCisKKwkvKiBNYXJrIGV2ZXJ5IGtpbG9ieXRlIHdpdGhpbiB0aGlzIGJsb2NrIGFzIGZyZWUuICBUaGlzIGlzCisJICogb3ZlcmtpbGwgZm9yIG5vcm1hbCBwdXJwb3NlcywgYnV0IGhlbHBzIHdoZW4gc29tZXRoaW5nIGhhcworCSAqIGFsbG9jYXRlZCBiYXNlIG1lbW9yeSB3aXRoIGEgZ3JhbnVsYXJpdHkgZmluZXIgdGhhbiB0aGUKKwkgKiBCSU9TIGdyYW51bGFyaXR5IG9mIDFrQi4gIFBYRSBST01zIHRlbmQgdG8gZG8gdGhpcyB3aGVuCisJICogdGhleSBhbGxvY2F0ZSB0aGVpciBvd24gbWVtb3J5LiAgVGhpcyBtZXRob2QgYWxsb3dzIHVzIHRvCisJICogZnJlZSB0aGVpciBibG9ja3MgKGFkbWl0dGVkbHkgaW4gYSByYXRoZXIgZGFuZ2Vyb3VzLAorCSAqIHRyZWFkLW9uLWFueXRoaW5nLWVpdGhlci1zaWRlIHNvcnQgb2Ygd2F5LCBidXQgdGhlcmUncyBubworCSAqIG90aGVyIHdheSB0byBkbyBpdCkuCisJICoKKwkgKiBTaW5jZSB3ZSdyZSBtYXJraW5nIGV2ZXJ5IGtCIGFzIGZyZWUsIHRoZXJlJ3MgYWN0dWFsbHkgbm8KKwkgKiBuZWVkIGZvciByZWNvcmRpbmcgdGhlIHNpemUgb2YgdGhlIGJsb2Nrcy4gIEhvd2V2ZXIsIHdlCisJICoga2VlcCB0aGlzIGluIHNvIHRoYXQgZGVidWcgbWVzc2FnZXMgYXJlIGZyaWVuZGxpZXIuICBJdAorCSAqIHByb2JhYmx5IGFkZHMgYXJvdW5kIDggYnl0ZXMgdG8gdGhlIG92ZXJhbGwgY29kZSBzaXplLgorCSAqLworCXdoaWxlICggc2l6ZV9rYiA+IDAgKSB7CisJCS8qIE1hcmsgdGhpcyBibG9jayBhcyB1bnVzZWQgKi8KKwkJZnJlZV9ibG9jay0+bWFnaWMgPSBGUkVFX0JMT0NLX01BR0lDOworCQlmcmVlX2Jsb2NrLT5zaXplX2tiID0gc2l6ZV9rYjsKKwkJLyogTW92ZSB1cCBieSAxIGtCICovCisJCSh2b2lkICopKGZyZWVfYmxvY2sgKz0gKCAxIDw8IDEwICkpOworCQlzaXplX2tiLS07CisJfQorCisJLyogRnJlZSB1cCB1bnVzZWQgYmFzZSBtZW1vcnkgKi8KKwlmcmVlX3VudXNlZF9iYXNlX21lbW9yeSgpOworfQorCisvKiBEbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2YgbWVtb3J5LiAgVGhpcyBpcyBzcGxpdCBvdXQgZnJvbQorICogZm9yZ2V0X2Jhc2VfbWVtb3J5KCkgc28gdGhhdCBpdCBtYXkgYmUgY2FsbGVkIHNlcGFyYXRlbHkuICBJdAorICogc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBiYXNlIG1lbW9yeSBpcyBkZWFsbG9jYXRlZCBieSBhbiBleHRlcm5hbAorICogZW50aXR5IChpZiB3ZSBjYW4gZGV0ZWN0IHRoYXQgaXQgaGFzIGRvbmUgc28pIHNvIHRoYXQgd2UgZ2V0IHRoZQorICogY2hhbmNlIHRvIGZyZWUgdXAgb3VyIG93biBibG9ja3MuCisgKi8KK3ZvaWQgZnJlZV91bnVzZWRfYmFzZV9tZW1vcnkgKCB2b2lkICkgeworCWZyZWVfYmFzZV9tZW1vcnlfYmxvY2tfdCAqZnJlZV9ibG9jayA9IE5VTEw7CisKKwkvKiBUcnkgdG8gcmVsZWFzZSBtZW1vcnkgYmFjayB0byB0aGUgQklPUy4gIEZyZWUgYWxsCisJICogY29uc2VjdXRpdmUgYmxvY2tzIG1hcmtlZCBhcyBmcmVlLgorCSAqLworCXdoaWxlICggMSApIHsKKwkJLyogQ2FsY3VsYXRlIGFkZHJlc3Mgb2YgbmV4dCBwb3RlbnRpYWwgZnJlZSBibG9jayAqLworCQlmcmVlX2Jsb2NrID0gKCBmcmVlX2Jhc2VfbWVtb3J5X2Jsb2NrX3QgKiApCisJCQlwaHlzX3RvX3ZpcnQgKCAqZmJtcyA8PCAxMCApOworCQkKKwkJLyogU3RvcCBwcm9jZXNzaW5nIGlmIHdlJ3JlIGFsbCB0aGUgd2F5IHVwIHRvIDY0MEsgb3IKKwkJICogaWYgdGhpcyBpcyBub3QgYSBmcmVlIGJsb2NrCisJCSAqLworCQlpZiAoICggKmZibXMgPT0gQkFTRV9NRU1PUllfTUFYICkgfHwKKwkJICAgICAoIGZyZWVfYmxvY2stPm1hZ2ljICE9IEZSRUVfQkxPQ0tfTUFHSUMgKSApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmV0dXJuIG1lbW9yeSB0byBCSU9TICovCisJCSpmYm1zICs9IGZyZWVfYmxvY2stPnNpemVfa2I7CisKKyNpZmRlZiBERUJVR19CQVNFTUVNCisJCXByaW50ZiAoICJGcmVlZCAlZCBrQiBiYXNlIG1lbW9yeSwgJWQga0Igbm93IGZyZWVcbiIsCisJCQkgZnJlZV9ibG9jay0+c2l6ZV9rYiwgKmZibXMgKTsKKwkJCisJCS8qIFplcm8gb3V0IGZyZWVkIGJsb2NrLiAgV2UgZG8gdGhpcyBpbiBjYXNlCisJCSAqIHRoZSBibG9jayBjb250YWluZWQgYW55IHN0cnVjdHVyZXMgdGhhdAorCQkgKiBtaWdodCBiZSBsb2NhdGVkIGJ5IHNjYW5uaW5nIHRocm91Z2gKKwkJICogbWVtb3J5LgorCQkgKi8KKwkJbWVtc2V0ICggZnJlZV9ibG9jaywgMCwgZnJlZV9ibG9jay0+c2l6ZV9rYiA8PCAxMCApOworI2VuZGlmCQkJCisJfQorCisJLyogQWRqdXN0IHJlYWwgbW9kZSBzdGFjayBwb2ludGVyICovCisJYWRqdXN0X3JlYWxfbW9kZV9zdGFjayAoKTsKK30KKwpJbmRleDogYi9uZXRib290L2JpZ19ic3dhcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2JpZ19ic3dhcC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JJR19CU1dBUF9ICisjZGVmaW5lIEVUSEVSQk9PVF9CSUdfQlNXQVBfSAorCisjZGVmaW5lIG50b2hsKHgpIAkoeCkKKyNkZWZpbmUgaHRvbmwoeCkgCSh4KQorI2RlZmluZSBudG9ocyh4KSAJKHgpCisjZGVmaW5lIGh0b25zKHgpIAkoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBjcHVfdG9fbGUxNih4KQlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19iZTMyKHgpCSh4KQorI2RlZmluZSBjcHVfdG9fYmUxNih4KQkoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBsZTE2X3RvX2NwdSh4KQlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpCSh4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KQkoeCkKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9CSUdfQlNXQVBfSCAqLwpJbmRleDogYi9uZXRib290L2Jvb3RwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvYm9vdHAuaApAQCAtMCwwICsxLDE4MiBAQAorI2lmbmRlZglfQk9PVFBfSAorI2RlZmluZQlfQk9PVFBfSAorCisjaW5jbHVkZSAiaWZfZXRoZXIuaCIKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgInVkcC5oIgorCisjaWZuZGVmCU1BWF9CT09UUF9SRVRSSUVTCisjZGVmaW5lIE1BWF9CT09UUF9SRVRSSUVTCTIwCisjZW5kaWYKKworI2lmZGVmCUFMVEVSTkFURV9ESENQX1BPUlRTXzEwNjdfMTA2OAorI3VuZGVmCU5PTl9TVEFOREFSRF9CT09UUF9TRVJWRVIKKyNkZWZpbmUJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgkxMDY3CisjdW5kZWYJTk9OX1NUQU5EQVJEX0JPT1RQX0NMSUVOVAorI2RlZmluZQlOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCTEwNjgKKyNlbmRpZgorCisjaWZkZWYJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgorI2RlZmluZQlCT09UUF9TRVJWRVIJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgorI2Vsc2UKKyNkZWZpbmUgQk9PVFBfU0VSVkVSCTY3CisjZW5kaWYKKyNpZmRlZglOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCisjZGVmaW5lCUJPT1RQX0NMSUVOVAlOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCisjZWxzZQorI2RlZmluZSBCT09UUF9DTElFTlQJNjgKKyNlbmRpZgorCisjZGVmaW5lIEJPT1RQX1JFUVVFU1QJMQorI2RlZmluZSBCT09UUF9SRVBMWQkyCisKKyNkZWZpbmUgVEFHX0xFTihwKQkJKCooKHApKzEpKQorI2RlZmluZSBSRkMxNTMzX0NPT0tJRQkJOTksIDEzMCwgODMsIDk5CisjZGVmaW5lIFJGQzE1MzNfUEFECQkwCisjZGVmaW5lIFJGQzE1MzNfTkVUTUFTSwkJMQorI2RlZmluZSBSRkMxNTMzX1RJTUVPRkZTRVQJMgorI2RlZmluZSBSRkMxNTMzX0dBVEVXQVkJCTMKKyNkZWZpbmUgUkZDMTUzM19USU1FU0VSVkVSCTQKKyNkZWZpbmUgUkZDMTUzM19JRU4xMTZOUwk1CisjZGVmaW5lIFJGQzE1MzNfRE5TCQk2CisjZGVmaW5lIFJGQzE1MzNfTE9HU0VSVkVSCTcKKyNkZWZpbmUgUkZDMTUzM19DT09LSUVTRVJWRVIJOAorI2RlZmluZSBSRkMxNTMzX0xQUlNFUlZFUgk5CisjZGVmaW5lIFJGQzE1MzNfSU1QUkVTU1NFUlZFUgkxMAorI2RlZmluZSBSRkMxNTMzX1JFU09VUkNFU0VSVkVSCTExCisjZGVmaW5lIFJGQzE1MzNfSE9TVE5BTUUJMTIKKyNkZWZpbmUgUkZDMTUzM19CT09URklMRVNJWkUJMTMKKyNkZWZpbmUgUkZDMTUzM19NRVJJVERVTVBGSUxFCTE0CisjZGVmaW5lIFJGQzE1MzNfRE9NQUlOTkFNRQkxNQorI2RlZmluZSBSRkMxNTMzX1NXQVBTRVJWRVIJMTYKKyNkZWZpbmUgUkZDMTUzM19ST09UUEFUSAkxNworI2RlZmluZSBSRkMxNTMzX0VYVEVOU0lPTlBBVEgJMTgKKyNkZWZpbmUgUkZDMTUzM19JUEZPUldBUkRJTkcJMTkKKyNkZWZpbmUgUkZDMTUzM19JUFNPVVJDRVJPVVRJTkcJMjAKKyNkZWZpbmUgUkZDMTUzM19JUFBPTElDWUZJTFRFUgkyMQorI2RlZmluZSBSRkMxNTMzX0lQTUFYUkVBU1NFTUJMWQkyMgorI2RlZmluZSBSRkMxNTMzX0lQVFRMCQkyMworI2RlZmluZSBSRkMxNTMzX0lQTVRVCQkyNAorI2RlZmluZSBSRkMxNTMzX0lQTVRVUExBVEVBVQkyNQorI2RlZmluZSBSRkMxNTMzX0lOVE1UVQkJMjYKKyNkZWZpbmUgUkZDMTUzM19JTlRMT0NBTFNVQk5FVFMJMjcKKyNkZWZpbmUgUkZDMTUzM19JTlRCUk9BRENBU1QJMjgKKyNkZWZpbmUgUkZDMTUzM19JTlRJQ01QRElTQ09WRVIJMjkKKyNkZWZpbmUgUkZDMTUzM19JTlRJQ01QUkVTUE9ORAkzMAorI2RlZmluZSBSRkMxNTMzX0lOVFJPVVRFRElTQ09WRVIgMzEKKyNkZWZpbmUgUkZDMTUzM19JTlRST1VURVNPTElDSVQJMzIKKyNkZWZpbmUgUkZDMTUzM19JTlRTVEFUSUNST1VURVMJMzMKKyNkZWZpbmUgUkZDMTUzM19MTFRSQUlMRVJFTkNBUAkzNAorI2RlZmluZSBSRkMxNTMzX0xMQVJQQ0FDSEVUTU8JMzUKKyNkZWZpbmUgUkZDMTUzM19MTEVUSEVSTkVURU5DQVAJMzYKKyNkZWZpbmUgUkZDMTUzM19UQ1BUVEwJCTM3CisjZGVmaW5lIFJGQzE1MzNfVENQS0VFUEFMSVZFVE1PCTM4CisjZGVmaW5lIFJGQzE1MzNfVENQS0VFUEFMSVZFR0IJMzkKKyNkZWZpbmUgUkZDMTUzM19OSVNET01BSU4JNDAKKyNkZWZpbmUgUkZDMTUzM19OSVNTRVJWRVIJNDEKKyNkZWZpbmUgUkZDMTUzM19OVFBTRVJWRVIJNDIKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1IJCTQzCisjZGVmaW5lIFJGQzE1MzNfTkJOUwkJNDQKKyNkZWZpbmUgUkZDMTUzM19OQkRECQk0NQorI2RlZmluZSBSRkMxNTMzX05CTlQJCTQ2CisjZGVmaW5lIFJGQzE1MzNfTkJTQ09QRQkJNDcKKyNkZWZpbmUgUkZDMTUzM19YRlMJCTQ4CisjZGVmaW5lIFJGQzE1MzNfWERNCQk0OQorI2lmbmRlZglOT19ESENQX1NVUFBPUlQKKyNkZWZpbmUgUkZDMjEzMl9SRVFfQUREUgk1MAorI2RlZmluZSBSRkMyMTMyX01TR19UWVBFCTUzCisjZGVmaW5lIFJGQzIxMzJfU1JWX0lECQk1NAorI2RlZmluZSBSRkMyMTMyX1BBUkFNX0xJU1QJNTUKKyNkZWZpbmUgUkZDMjEzMl9NQVhfU0laRQk1NworI2RlZmluZQlSRkMyMTMyX1ZFTkRPUl9DTEFTU19JRAk2MAorCisjZGVmaW5lIERIQ1BESVNDT1ZFUgkJMQorI2RlZmluZSBESENQT0ZGRVIJCTIKKyNkZWZpbmUgREhDUFJFUVVFU1QJCTMKKyNkZWZpbmUgREhDUEFDSwkJCTUKKyNlbmRpZgkvKiBOT19ESENQX1NVUFBPUlQgKi8KKworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NQUpPUgkwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01JTk9SCTAKKworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NQUdJQwkxMjgKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfQUREUEFSTQkxMjkKKyNkZWZpbmUJUkZDMTUzM19WRU5ET1JfRVRIREVWCTEzMAorI2lmZGVmCUlNQUdFX0ZSRUVCU0QKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfSE9XVE8gICAgMTMyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0tFUk5FTF9FTlYgICAgMTMzCisjZW5kaWYKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfRVRIRVJCT09UX0VOQ0FQIDE1MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NTlVPUFRTCTE2MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OSUNfREVWX0lEIDE3NQorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9TRUxFQ1RJT04gMTc2CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FSQ0ggICAgIDE3NworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NT1RECTE4NAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OVU1PRk1PVEQgOAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9JTUcJMTkyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX05VTU9GSU1HCTE2CisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSAxNTAKKworI2RlZmluZSBSRkMxNTMzX0VORAkJMjU1CisKKyNkZWZpbmUgQk9PVFBfVkVORE9SX0xFTgk2NAorCisjZGVmaW5lIERIQ1BfT1BUX0xFTgkJMzEyCisKKy8qIEZvcm1hdCBvZiBhIGJvb3RwIHBhY2tldCAqLworc3RydWN0IGJvb3RwX3QgeworCXVpbnQ4X3QgIGJwX29wOworCXVpbnQ4X3QgIGJwX2h0eXBlOworCXVpbnQ4X3QgIGJwX2hsZW47CisJdWludDhfdCAgYnBfaG9wczsKKwl1aW50MzJfdCBicF94aWQ7CisJdWludDE2X3QgYnBfc2VjczsKKwl1aW50MTZfdCB1bnVzZWQ7CisJaW5fYWRkciBicF9jaWFkZHI7CisJaW5fYWRkciBicF95aWFkZHI7CisJaW5fYWRkciBicF9zaWFkZHI7CisJaW5fYWRkciBicF9naWFkZHI7CisJdWludDhfdCAgYnBfaHdhZGRyWzE2XTsKKwl1aW50OF90ICBicF9zbmFtZVs2NF07CisJY2hhciAgICAgYnBfZmlsZVsxMjhdOworCXVpbnQ4X3QgIGJwX3ZlbmRbQk9PVFBfVkVORE9SX0xFTl07Cit9OworCitzdHJ1Y3QgZGhjcF90IHsKKwl1aW50OF90ICBicF9vcDsKKwl1aW50OF90ICBicF9odHlwZTsKKwl1aW50OF90ICBicF9obGVuOworCXVpbnQ4X3QgIGJwX2hvcHM7CisJdWludDMyX3QgYnBfeGlkOworCXVpbnQxNl90IGJwX3NlY3M7CisJdWludDE2X3QgYnBfZmxhZzsKKwlpbl9hZGRyIGJwX2NpYWRkcjsKKwlpbl9hZGRyIGJwX3lpYWRkcjsKKwlpbl9hZGRyIGJwX3NpYWRkcjsKKwlpbl9hZGRyIGJwX2dpYWRkcjsKKwl1aW50OF90ICBicF9od2FkZHJbMTZdOworCXVpbnQ4X3QgIGJwX3NuYW1lWzY0XTsKKwljaGFyICAgICBicF9maWxlWzEyOF07CisJdWludDhfdCAgYnBfdmVuZFtESENQX09QVF9MRU5dOworfTsKKworLyogRm9ybWF0IG9mIGEgYm9vdHAgSVAgcGFja2V0ICovCitzdHJ1Y3QgYm9vdHBpcF90Cit7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBib290cF90IGJwOworfTsKK3N0cnVjdCBkaGNwaXBfdAoreworCXN0cnVjdCBpcGhkciBpcDsKKwlzdHJ1Y3QgdWRwaGRyIHVkcDsKKwlzdHJ1Y3QgZGhjcF90IGJwOworfTsKKworI2RlZmluZSBNQVhfUkZDMTUzM19WRU5ETEVOIChFVEhfTUFYX01UVSAtIHNpemVvZihzdHJ1Y3QgYm9vdHBpcF90KSArIEJPT1RQX1ZFTkRPUl9MRU4pCisKKyNkZWZpbmUgQk9PVFBfREFUQV9BRERSICgmYm9vdHBfZGF0YSkKKworI2VuZGlmCS8qIF9CT09UUF9IICovCkluZGV4OiBiL25ldGJvb3QvYnl0ZXN3YXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JZVEVTV0FQX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgImVuZGlhbi5oIgorI2luY2x1ZGUgImkzODZfYnl0ZXN3YXAuaCIKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpbmNsdWRlICJsaXR0bGVfYnN3YXAuaCIKKyNlbmRpZgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpbmNsdWRlICJiaWdfYnN3YXAuaCIKKyNlbmRpZgorCisvKiBNYWtlIHJvdXRpbmVzIGF2YWlsYWJsZSB0byBhbGwgKi8KKyNkZWZpbmUgc3dhcDMyKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgc3dhcDE2KHgpCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgYnN3YXBfMzIoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBic3dhcF8xNih4KQlfX2Jzd2FwXzE2KHgpCisJCisjZW5kaWYgLyogRVRIRVJCT09UX0JZVEVTV0FQX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9jYXJkcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9jYXJkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSNpZm5kZWYJQ0FSRFNfSAotI2RlZmluZSBDQVJEU19ICi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlICJuaWMuaCIKLQotLyogT0ssIHRoaXMgaXMgaG93IHRoZSBQQ0kgc3VwcG9ydCBoYWNrIHdvcmtzOiAgaWYgcGNpLmggaXMgaW5jbHVkZWQgYmVmb3JlCi0gKiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQsIGFzc3VtZSB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgUENJLiAgVGhpcyBtZWFucyB0aGF0Ci0gKiB0aGlzIGZpbGUgaXMgdXN1YWxseSBpbmNsdWRlZCBsYXN0LiAgKi8KLQotI2lmZGVmCVBDSV9ICi0jZGVmaW5lIFBDSV9BUkcoeCkgLHgKLSNlbHNlCi0jZGVmaW5lIFBDSV9BUkcoeCkKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9XRAotZXh0ZXJuIHN0cnVjdCBuaWMJKndkX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFXzNDNTAzCi1leHRlcm4gc3RydWN0IG5pYwkqdDUwM19wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKLWV4dGVybiBzdHJ1Y3QgbmljCSpyaGluZV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9ORQotZXh0ZXJuIHN0cnVjdCBuaWMJKm5lX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05TODM5MAotZXh0ZXJuIHN0cnVjdCBuaWMJKm5lcGNpX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFXzNDNTA5Ci1leHRlcm4gc3RydWN0IG5pYwkqdDUwOV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV8zQzUyOQotZXh0ZXJuIHN0cnVjdCBuaWMJKnQ1MjlfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfM0M1OTUKLWV4dGVybiBzdHJ1Y3QgbmljCSp0NTk1X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFXzNDOTBYCi1leHRlcm4gc3RydWN0IG5pYwkqYTNjOTB4X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0VFUFJPCi1leHRlcm4gc3RydWN0IG5pYwkqZWVwcm9fcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfRUVQUk8xMDAKLWV4dGVybiBzdHJ1Y3QgbmljCSplZXBybzEwMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9FUElDMTAwCi1leHRlcm4gc3RydWN0IG5pYwkqZXBpYzEwMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9PVFVMSVAKLWV4dGVybiBzdHJ1Y3QgbmljCSpvdHVsaXBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfVFVMSVAKLWV4dGVybiBzdHJ1Y3QgbmljCSp0dWxpcF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9EQVZJQ09NCi1leHRlcm4gc3RydWN0IG5pYwkqZGF2aWNvbV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9DUzg5WDAKLWV4dGVybiBzdHJ1Y3QgbmljCSpjczg5eDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfTEFOQ0UKLWV4dGVybiBzdHJ1Y3QgbmljCSpsYW5jZXBjaV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9ORTIxMDAKLWV4dGVybiBzdHJ1Y3QgbmljCSpuZTIxMDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfTkk2NTEwCi1leHRlcm4gc3RydWN0IG5pYwkqbmk2NTEwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1NLX0cxNgotZXh0ZXJuIHN0cnVjdCBuaWMJKlNLX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFXzNDNTA3Ci1leHRlcm4gc3RydWN0IG5pYwkqdDUwN19wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9OSTUwMTAKLWV4dGVybiBzdHJ1Y3QgbmljCSpuaTUwMTBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfTkk1MjEwCi1leHRlcm4gc3RydWN0IG5pYwkqbmk1MjEwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0VYT1MyMDUKLWV4dGVybiBzdHJ1Y3QgbmljCSpleG9zMjA1X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1NNQzkwMDAKLWV4dGVybiBzdHJ1Y3QgbmljCSpzbWM5MDAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1RJQVJBCi1leHRlcm4gc3RydWN0IG5pYwkqdGlhcmFfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfREVQQ0EKLWV4dGVybiBzdHJ1Y3QgbmljCSpkZXBjYV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9SVEw4MTM5Ci1leHRlcm4gc3RydWN0IG5pYwkqcnRsODEzOV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9XODlDODQwCi1leHRlcm4gc3RydWN0IG5pYwkqdzg5Yzg0MF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9TSVM5MDAKLWV4dGVybiBzdHJ1Y3QgbmljCSpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0gICAgICAgIFBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05BVFNFTUkKLWV4dGVybiBzdHJ1Y3QgbmljCSpuYXRzZW1pX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotICAgICAgICBQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9UTEFOCi1leHRlcm4gc3RydWN0IG5pYwkqdGxhbl9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLSAgICAgICAgUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2VuZGlmCS8qIENBUkRTX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9jb25maWcuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvY29uZmlnLmMKKysrIGIvbmV0Ym9vdC9jb25maWcuYwpAQCAtMSw1OTggKzEsMTY1IEBACiAvKgotICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0vKiBCYXNlZCBvbiAic3JjL2NvbmZpZy5jIiBpbiBldGhlcmJvb3QtNS4wLjUuICAqLwotCi0vKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jZGVmaW5lIEdSVUIJMQotI2luY2x1ZGUgPGV0aGVyYm9vdC5oPgotI2luY2x1ZGUgPG5pYy5oPgorI2luY2x1ZGUJImdydWIuaCIKKyNpbmNsdWRlCSJwY2kuaCIKKyNpbmNsdWRlCSJpc2EuaCIKKyNpbmNsdWRlCSJuaWMuaCIKIAotI3VuZGVmCUlOQ0xVREVfUENJCi0jaWYJZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgZGVmaW5lZChJTkNMVURFX0VFUFJPMTAwKSB8fCBkZWZpbmVkKElOQ0xVREVfTEFOQ0UpIHx8IGRlZmluZWQoSU5DTFVERV9FUElDMTAwKSB8fCBkZWZpbmVkKElOQ0xVREVfVFVMSVApIHx8IGRlZmluZWQoSU5DTFVERV9PVFVMSVApIHx8IGRlZmluZWQoSU5DTFVERV8zQzkwWCkgfHwgIGRlZmluZWQoSU5DTFVERV8zQzU5NSkgfHwgZGVmaW5lZChJTkNMVURFX1JUTDgxMzkpIHx8IGRlZmluZWQoSU5DTFVERV9WSUFfUkhJTkUpIHx8IGRlZmluZWQoSU5DTFVERV9XODlDODQwKSB8fCBkZWZpbmVkKElOQ0xVREVfREFWSUNPTSkgfHwgZGVmaW5lZChJTkNMVURFX1NJUzkwMCkgfHwgZGVmaW5lZChJTkNMVURFX05BVFNFTUkpIHx8IGRlZmluZWQoSU5DTFVERV9UTEFOKQotCS8qIHx8IG90aGVycyBsYXRlciAqLwotIyBkZWZpbmUgSU5DTFVERV9QQ0kKLSMgaW5jbHVkZSA8cGNpLmg+Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2lvYWRkcnNbMTZdOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2UgcGNpX25pY19saXN0W10gPQorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgcGNpX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgY29uc3QgY2hhciAqdHlwZV9uYW1lKQogewotI2lmZGVmCUlOQ0xVREVfTlM4MzkwCi0gIHsgUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAlQQ0lfREVWSUNFX0lEX1JFQUxURUtfODAyOSwKLSAgICAiUmVhbHRlayA4MDI5IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwJUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDAsCi0gICAgIldpbmJvbmQgTkUyMDAwLVBDSSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfQ09NUEVYLAlQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDIwMDAsCi0gICAgIkNvbXBleCBSZWFkeUxpbmsgMjAwMCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfS1RJLAkJUENJX0RFVklDRV9JRF9LVElfRVQzMlAyLAotICAgICJLVEkgRVQzMlAyIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ORVRWSU4sCVBDSV9ERVZJQ0VfSURfTkVUVklOX05WNTAwMFNDLAotICAgICJOZXRWaW4gTlY1MDAwU0MiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0hPTFRFSywJUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMiwKLSAgICAiSG9sdGVrIEhUODAyMzIiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M5MFgKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sCi0gICAgIjNDb205MDAtVFBPIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sCi0gICAgIjNDb205MDAtQ29tYm8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUWCwKLSAgICAiM0NvbTkwNS1UWCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0LAotICAgICIzQ29tOTA1LVQ0IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDA0LAotICAgICIzQ29tOTAwQi1UUE8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDUsCi0gICAgIjNDb205MDBCLUNvbWJvIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDA2LAotICAgICIzQ29tOTAwQi0yL1QiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMEEsCi0gICAgIjNDb205MDBCLUZMIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Ql9UWCwKLSAgICAiM0NvbTkwNUItVFgiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwNTYsCi0gICAgIjNDb205MDVCLVQ0IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDVBLAotICAgICIzQ29tOTA1Qi1GTCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUNfVFhNLAotICAgICIzQ29tOTA1Qy1UWE0iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDk4MDAsCi0gICAgIjNDb205ODAtQ3ljbG9uZSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwNSwKLSAgICAiM0NvbTk4MDUiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDc2NDYsCi0gICAgIjNDU09ITzEwMC1UWCIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV8zQzU5NQotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5MCwKLSAgICAiM0NvbTU5MCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NSwKLSAgICAiM0NvbTU5NSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xLAotICAgICIzQ29tNTk1IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzIsCi0gICAgIjNDb201OTUiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sCi0gICAgIjNDb205MDAtVFBPIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sCi0gICAgIjNDb205MDAtQ29tYm8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDQsCi0gICAgIjNDb205MDBCLVRQTyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwNSwKLSAgICAiM0NvbTkwMEItQ29tYm8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDYsCi0gICAgIjNDb205MDBCLTIvVCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwQSwKLSAgICAiM0NvbTkwMEItRkwiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDk4MDAsCi0gICAgIjNDb205ODAtQ3ljbG9uZSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwNSwKLSAgICAiM0NvbTk4MDUiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDc2NDYsCi0gICAgIjNDU09ITzEwMC1UWCIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9FRVBSTzEwMAotICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcsCi0gICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUiwKLSAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIDgyNTU5RVIiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAyOSwKLSAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAyOSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwLAotICAgICJJbnRlbCBDb3Jwb3JhdGlvbiA4MjU1OSBJbkJ1c2luZXNzIDEwLzEwMCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NjIsCi0gICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCA4MjU2MkVNIiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX0VQSUMxMDAKLSAgeyBQQ0lfVkVORE9SX0lEX1NNQywJCVBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAsCi0gICAgIlNNQyBFdGhlclBvd2VySUkiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfTEFOQ0UKLSAgeyBQQ0lfVkVORE9SX0lEX0FNRCwJCVBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFLAotICAgICJBTUQgTGFuY2UvUENJIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9BTURfSE9NRVBOQSwJUENJX0RFVklDRV9JRF9BTURfSE9NRVBOQSwKLSAgICAiQU1EIExhbmNlL0hvbWVQTkEiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfUlRMODEzOQotICB7IFBDSV9WRU5ET1JfSURfUkVBTFRFSywJUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzksCi0gICAgIlJlYWx0ZWsgODEzOSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfRExJTkssCVBDSV9ERVZJQ0VfSURfREZFNTMwVFhQLAotICAgICJERkU1MzBUWCsvREZFNTM4VFgiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1NNQ18xMjExLAlQQ0lfREVWSUNFX0lEX1NNQ18xMjExLAotICAgICJTTUMgRVoxMC8xMDAiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfT1RVTElQCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwKLSAgICAiRGlnaXRhbCBUdWxpcCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwKLSAgICAiRGlnaXRhbCBUdWxpcCBGYXN0IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9QTFVTLAotICAgICJEaWdpdGFsIFR1bGlwKyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfMjExNDIsCi0gICAgIkRpZ2l0YWwgVHVsaXAgMjExNDIiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVFVMSVAKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAotICAgICJEaWdpdGFsIFR1bGlwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULAotICAgICJEaWdpdGFsIFR1bGlwIEZhc3QiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCi0gICAgIkRpZ2l0YWwgVHVsaXArIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwKLSAgICAiRGlnaXRhbCBUdWxpcCAyMTE0MiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfTUFDUk9OSVgsCVBDSV9ERVZJQ0VfSURfTVg5ODd4NSwKLSAgICAiTWFjcm9uaXggTVg5ODd4NSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywJUENJX0RFVklDRV9JRF9MQzgyQzExNSwKLSAgICAiTGlua1N5cyBMTkUxMDBUWCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywJUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsCi0gICAgIk5ldGdlYXIgRkEzMTBUWCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkxMDIsCi0gICAgIkRhdmljb20gOTEwMiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkwMDksCi0gICAgIkRhdmljb20gOTAwOSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfQURNVEVLLAlQQ0lfREVWSUNFX0lEX0FETVRFS18wOTg1LAotICAgICJBRE10ZWsgQ2VudGF1ci1QIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9BRE1URUssCTB4MDk4MSwKLSAgICAiQURNdGVrIEFOOTgxIENvbWV0IiwgMCwgMCwgMCwgMH0sCi0gIHsgMHgxMjVCLAkJCTB4MTQwMCwKLSAgICAiQVNJWCBBWDg4MTQwIiwgMCwgMCwgMCwgMCB9LAotICB7IDB4MTFGNiwJCQkweDk4ODEsCi0gICAgIkNvbXBleCBSTDEwMC1UWCIsIDAsIDAsIDAsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfREFWSUNPTQotICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkxMDIsCi0gICAgIkRhdmljb20gOTEwMiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkwMDksCi0gICAgIkRhdmljb20gOTAwOSIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKLSAgeyBQQ0lfVkVORE9SX0lEX1ZJQVRFQywJUENJX0RFVklDRV9JRF9WSUFfVlQ2MTAyLAotICAgICJWSUEgNjEwMiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLAlQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JLAotICAgICJWSUEgMzA0MyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLAlQQ0lfREVWSUNFX0lEX1ZJQV84NkMxMDBBLAotICAgICJWSUEgODZDMTAwQSIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9XODlDODQwCi0gIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwJUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDAsCi0gICAgIldpbmJvbmQgVzg5Qzg0MEYiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0NPTVBFWCwJUENJX0RFVklDRV9JRF9DT01QRVhfUkwxMDBBVFgsCi0gICAgIkNvbXBleCBSTDEwMEFUWCIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYgSU5DTFVERV9TSVM5MDAKLSAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgIAlQQ0lfREVWSUNFX0lEX1NJUzkwMCwKLSAgICAiU0lTOTAwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAJUENJX0RFVklDRV9JRF9TSVM3MDE2LAotICAgICJTSVM3MDE2IiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSAgCi0jaWZkZWYgSU5DTFVERV9OQVRTRU1JCi0gIHsgUENJX1ZFTkRPUl9JRF9OUywJICAgICAJUENJX0RFVklDRV9JRF9EUDgzODE1LAotICAgICJEUDgzODE1IiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSAgCi0jaWZkZWYgSU5DTFVERV9UTEFOCi0gIHsgUENJX1ZFTkRPUl9JRF9PTElDT00sCVBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNiwKLSAgICAiT0MyMzI2IiwgMCwgMCwgMCwgMH0sCisvKgorICoJTklDIHByb2JpbmcgaXMgaW4gcGNpIGRldmljZSBvcmRlciwgZm9sbG93ZWQgYnkgdGhlIAorICogICAgICBsaW5rIG9yZGVyIG9mIHRoZSBkcml2ZXJzLiAgQSBkcml2ZXIgdGhhdCBtYXRjaGVzIAorICogICAgICBvbiB2ZW5kb3IgYW5kIGRldmljZSBpZCB3aWxsIHN1cGVyc2VkZSBhIGRyaXZlcgorICogICAgICB0aGF0IG1hdGNoZXMgb24gcGNpIGNsYXNzLgorICoKKyAqCUlmIHlvdSB3YW50IHRvIHByb2JlIGZvciBhbm90aGVyIGRldmljZSBiZWhpbmQgdGhlIHNhbWUgcGNpCisgKiAgICAgIGRldmljZSBqdXN0IGluY3JlbWVudCBpbmRleC4gIEFuZCB0aGUgcHJldmlvdXMgcHJvYmUgY2FsbAorICogICAgICB3aWxsIGJlIHJlcGVhdGVkLgorICovCisJc3RydWN0IHBjaV9wcm9iZV9zdGF0ZSAqc3RhdGUgPSAmZGV2LT5zdGF0ZS5wY2k7CisJcHJpbnRmKCJQcm9iaW5nIHBjaSAlcy4uLlxuIiwgdHlwZV9uYW1lKTsKKwlpZiAoZGV2LT5ob3dfcHJvYmUgPT0gUFJPQkVfRklSU1QpIHsKKwkJc3RhdGUtPmFkdmFuY2UgICAgPSAxOworCQlzdGF0ZS0+ZGV2LmRyaXZlciA9IDA7CisJCXN0YXRlLT5kZXYuYnVzICAgID0gMDsKKwkJc3RhdGUtPmRldi5kZXZmbiAgPSAwOworCQlkZXYtPmluZGV4ICAgICAgICA9IC0xOworCX0KKwlmb3IoOzspIHsKKwkJaWYgKChkZXYtPmhvd19wcm9iZSAhPSBQUk9CRV9BV0FLRSkgJiYgc3RhdGUtPmFkdmFuY2UpIHsKKwkJCWZpbmRfcGNpKGRldi0+dHlwZSwgJnN0YXRlLT5kZXYpOworCQkJZGV2LT5pbmRleCA9IC0xOworCQl9CisJCXN0YXRlLT5hZHZhbmNlID0gMTsKKwkJCisJCWlmIChzdGF0ZS0+ZGV2LmRyaXZlciA9PSAwKQorCQkJYnJlYWs7CisJCQorI2lmIDAKKwkJLyogRklYTUUgdGhlIHJvbWFkZHIgY29kZSBuZWVkcyBhIHRvdGFsIHJldGhvdWdodCB0byBiZSB1c2VmdWwgKi8KKwkJaWYgKHN0YXRlLT5kZXYucm9tYWRkciAhPSAoKHVuc2lnbmVkIGxvbmcpIHJvbS5yb21fc2VnbWVudCA8PCA0KSkgeworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlpZiAoZGV2LT5ob3dfcHJvYmUgIT0gUFJPQkVfQVdBS0UpIHsKKwkJCWRldi0+dHlwZV9pbmRleCsrOworCQl9CisJCWRldi0+ZGV2aWQuYnVzX3R5cGUgPSBQQ0lfQlVTX1RZUEU7CisJCWRldi0+ZGV2aWQudmVuZG9yX2lkID0gaHRvbnMoc3RhdGUtPmRldi52ZW5kb3IpOworCQlkZXYtPmRldmlkLmRldmljZV9pZCA9IGh0b25zKHN0YXRlLT5kZXYuZGV2X2lkKTsKKwkJLyogRklYTUUgaG93IGRvIEkgaGFuZGxlIGRldi0+aW5kZXggKyBQUk9CRV9BR0FJTj8/ICovCisJCQorCQlwcmludGYoIlslc10iLCBzdGF0ZS0+ZGV2Lm5hbWUpOworCQlpZiAoc3RhdGUtPmRldi5kcml2ZXItPnByb2JlKGRldiwgJnN0YXRlLT5kZXYpKSB7CisJCQlzdGF0ZS0+YWR2YW5jZSA9IChkZXYtPmluZGV4ID09IC0xKTsKKwkJCXJldHVybiBQUk9CRV9XT1JLRUQ7CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwl9CisJcmV0dXJuIFBST0JFX0ZBSUxFRDsKK30KICNlbmRpZgogCi0gIC8qIG90aGVyIFBDSSBOSUNzIGdvIGhlcmUgKi8KLSAgezAsIDAsIE5VTEwsIDAsIDAsIDAsIDB9Ci19OwotI2VuZGlmCS8qIElOQ0xVREVfKlBDSSAqLwotCi0jaW5jbHVkZSA8Y2FyZHMuaD4KLQotI2lmZGVmIElOQ0xVREVfUENJCi1zdHJ1Y3QgcGNpX2Rpc3BhdGNoX3RhYmxlCisjaWZkZWYgQ09ORklHX0lTQQorc3RhdGljIGludCBpc2FfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBjb25zdCBjaGFyICp0eXBlX25hbWUpCiB7Ci0gIHVuc2lnbmVkIHNob3J0IHZlbmRvcjsKLSAgdW5zaWduZWQgc2hvcnQgZGV2X2lkOwotICBzdHJ1Y3QgbmljICooKmV0aF9wcm9iZSkgKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKiwKLQkJCSAgICBzdHJ1Y3QgcGNpX2RldmljZSAqKTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2Rpc3BhdGNoX3RhYmxlIFBDSV9OSUNbXSA9Ci17Ci0jIGlmZGVmIElOQ0xVREVfTlM4MzkwCi0gIHsgUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgwMjksICAgIG5lcGNpX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDAsIG5lcGNpX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9DT01QRVgsICAgUENJX0RFVklDRV9JRF9DT01QRVhfUkwyMDAwLCAgIG5lcGNpX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9LVEksICAgICAgUENJX0RFVklDRV9JRF9LVElfRVQzMlAyLCAgICAgIG5lcGNpX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ORVRWSU4sICAgUENJX0RFVklDRV9JRF9ORVRWSU5fTlY1MDAwU0MsIG5lcGNpX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9IT0xURUssICAgUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMiwgIG5lcGNpX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfTlM4MzkwICovCi0jIGlmZGVmIElOQ0xVREVfM0M5MFgKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCSAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVRYLCAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUNCwgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA0LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNSwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDYsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDBBLCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUJfVFgsICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwNTYsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDVBLCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUNfVFhNLCBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDk4MDAsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5ODA1LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4NzY0NiwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV8zQzkwWCAqLwotIyBpZmRlZglJTkNMVURFXzNDNTk1Ci0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDNTkwLCAgICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTUsICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xLCAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzIsICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMENPTUJPLCB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA0LCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDUsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNiwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDBBLCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDk4MDAsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTgwNSwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg3NjQ2LCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV8zQzU5NSAqLwotIyBpZmRlZglJTkNMVURFX0VFUFJPMTAwCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjU1NywgICAgIGVlcHJvMTAwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjU1OUVSLCAgIGVlcHJvMTAwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMjksICAgIGVlcHJvMTAwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzAsICAgIGVlcHJvMTAwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjU2MiwgICAgIGVlcHJvMTAwX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfRUVQUk8xMDAgKi8KLSMgaWZkZWYJSU5DTFVERV9FUElDMTAwCi0gIHsgUENJX1ZFTkRPUl9JRF9TTUMsICAgICAgUENJX0RFVklDRV9JRF9TTUNfRVBJQzEwMCwgICAgIGVwaWMxMDBfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9FUElDMTAwICovCi0jIGlmZGVmCUlOQ0xVREVfTEFOQ0UKLSAgeyBQQ0lfVkVORE9SX0lEX0FNRCwgICAgICBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRSwgICAgICAgbGFuY2VwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0FNRF9IT01FUE5BLCBQQ0lfREVWSUNFX0lEX0FNRF9IT01FUE5BLCAgbGFuY2VwY2lfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9MQU5DRSAqLwotIyBpZmRlZglJTkNMVURFX1JUTDgxMzkKLSAgeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssICBQQ0lfREVWSUNFX0lEX1JFQUxURUtfODEzOSwgICAgcnRsODEzOV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfRExJTkssICAgIFBDSV9ERVZJQ0VfSURfREZFNTMwVFhQLCAgICAgICBydGw4MTM5X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9TTUNfMTIxMSwgUENJX0RFVklDRV9JRF9TTUNfMTIxMSwgICAgICAgIHJ0bDgxMzlfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9SVEw4MTM5ICovCi0jIGlmZGVmCUlOQ0xVREVfT1RVTElQCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsICAgICAgIG90dWxpcF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsICBvdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9QTFVTLCAgb3R1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfMjExNDIsICAgICAgIG90dWxpcF9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX09UVUxJUCAqLwotIyBpZmRlZglJTkNMVURFX1RVTElQCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUywgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfMjExNDIsICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9NQUNST05JWCwgUENJX0RFVklDRV9JRF9NWDk4N3g1LCAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCAgUENJX0RFVklDRV9JRF9MQzgyQzExNSwgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLCAgUENJX0RFVklDRV9JRF9ETTkxMDIsICAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLCAgUENJX0RFVklDRV9JRF9ETTkwMDksICAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9BRE1URUssICAgUENJX0RFVklDRV9JRF9BRE1URUtfMDk4NSwgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9BRE1URUssICAgMHgwOTgxLCAgICAgICAgICAgICAgICAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgMHgxMjVCLCAgICAgICAgICAgICAgICAgMHgxNDAwLCAgICAgICAgICAgICAgICAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0gIHsgMHgxMUY2LCAgICAgICAgICAgICAgICAgMHg5ODgxLCAgICAgICAgICAgICAgICAgICAgICAgIHR1bGlwX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfVFVMSVAgKi8KLSMgaWZkZWYgSU5DTFVERV9EQVZJQ09NCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLCAgIFBDSV9ERVZJQ0VfSURfRE05MTAyLCAgICAgICAgICAgZGF2aWNvbV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwgICBQQ0lfREVWSUNFX0lEX0RNOTAwOSwgICAgICAgICAgIGRhdmljb21fcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9EQVZJQ09NICovCi0jIGlmZGVmCUlOQ0xVREVfVklBX1JISU5FCi0gIHsgUENJX1ZFTkRPUl9JRF9WSUFURUMsICAgUENJX0RFVklDRV9JRF9WSUFfVlQ2MTAyLCAgICAgIHJoaW5lX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9WSUFURUMsICAgUENJX0RFVklDRV9JRF9WSUFfUkhJTkVfSSwgICAgIHJoaW5lX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9WSUFURUMsICAgUENJX0RFVklDRV9JRF9WSUFfODZDMTAwQSwgICAgIHJoaW5lX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfVklBX1JISU5FICovCi0jIGlmZGVmIElOQ0xVREVfVzg5Qzg0MAotICB7IFBDSV9WRU5ET1JfSURfV0lOQk9ORDIsIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDODQwLCB3ODljODQwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9DT01QRVgsICAgUENJX0RFVklDRV9JRF9DT01QRVhfUkwxMDBBVFgsIHc4OWM4NDBfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9XODlDODQwICovCi0jIGlmZGVmIElOQ0xVREVfU0lTOTAwCi0gIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAgUENJX0RFVklDRV9JRF9TSVM5MDAsICAgICAgICAgIHNpczkwMF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfU0lTLCAgICAgIFBDSV9ERVZJQ0VfSURfU0lTNzAxNiwgICAgICAgICBzaXM5MDBfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9TSVM5MDAgKi8KLSMgaWZkZWYgSU5DTFVERV9OQVRTRU1JCi0gIHsgUENJX1ZFTkRPUl9JRF9OUywgICAgICAgUENJX0RFVklDRV9JRF9EUDgzODE1LCAgICAgICAgIG5hdHNlbWlfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9OQVRTRU1JICovCi0jIGlmZGVmIElOQ0xVREVfVExBTgotICB7IFBDSV9WRU5ET1JfSURfT0xJQ09NLCAgIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNiwgICB0bGFuX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfVExBTiAqLwotICB7IDAsICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0KLX07Ci0jZW5kaWYgLyogR1JVQiAmJiBJTkNMVURFX1BDSSAqLwotCi1zdHJ1Y3QgZGlzcGF0Y2hfdGFibGUKLXsKLSAgY29uc3QgY2hhcgkqbmljX25hbWU7Ci0jaWZkZWYJSU5DTFVERV9QQ0kKLSAgc3RydWN0IG5pYwkqKCpldGhfcHJvYmUpIChzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICosCi0JCQkgICAgICAgc3RydWN0IHBjaV9kZXZpY2UgKik7Ci0jZWxzZQotICBzdHJ1Y3QgbmljCSooKmV0aF9wcm9iZSkgKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKik7Ci0jZW5kaWYJLyogSU5DTFVERV9QQ0kgKi8KLSAgdW5zaWduZWQgc2hvcnQJKnByb2JlX2lvYWRkcnM7CQkvKiBmb3IgcHJvYmUgb3ZlcnJpZGVzICovCi19OwotCiAvKgotICoJTklDIHByb2JpbmcgaXMgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSBpbiB0aGlzIHRhYmxlLgorICoJTklDIHByb2JpbmcgaXMgaW4gdGhlIG9yZGVyIHRoZSBkcml2ZXJzIHdlcmUgbGlua2VkIHRvZ2V0ZXIuCiAgKglJZiBmb3Igc29tZSByZWFzb24geW91IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmRlciwKLSAqCWp1c3QgcmVhcnJhbmdlIHRoZSBlbnRyaWVzIChicmFja2V0ZWQgYnkgdGhlICNpZmRlZi8jZW5kaWYpCisgKglqdXN0IGNoYW5nZSB0aGUgb3JkZXIgeW91IGxpc3QgdGhlIGRyaXZlcnMgaW4uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGlzcGF0Y2hfdGFibGUJTklDW10gPQotewotI2lmZGVmCUlOQ0xVREVfUlRMODEzOQotICB7ICJSVEw4MTM5IiwgcnRsODEzOV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmIElOQ0xVREVfU0lTOTAwCi0gIHsgIlNJUzkwMCIsIHNpczkwMF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwJCi0jZW5kaWYKLSNpZmRlZiBJTkNMVURFX05BVFNFTUkKLSAgeyAiTkFUU0VNSSIsIG5hdHNlbWlfcHJvYmUsIHBjaV9pb2FkZHJzIH0sCQotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9XRAotICB7ICJXRCIsIHdkX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFXzNDNTAzCi0gIHsgIjNDNTAzIiwgdDUwM19wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9ORQotICB7ICJORSowMDAiLCBuZV9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV8zQzUwOQotICB7ICIzQzV4OSIsIHQ1MDlfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M1MjkKLSAgeyAiM0M1eDkiLCB0NTI5X3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFXzNDNTk1Ci0gIHsgIjNDNTk1IiwgdDU5NV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M5MFgKLSAgeyAiM0M5MFgiLCBhM2M5MHhfcHJvYmUsIHBjaV9pb2FkZHJzIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX0VFUFJPCi0gIHsgIkVFUFJPIiwgZWVwcm9fcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfRUVQUk8xMDAKLSAgeyAiRUVQUk8xMDAiLCBlZXBybzEwMF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfRVBJQzEwMAotICB7ICJFUElDMTAwIiwgZXBpYzEwMF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfT1RVTElQCi0gIHsgIk9UdWxpcCIsIG90dWxpcF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVFVMSVAKLSAgeyAiVHVsaXAiLCB0dWxpcF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfREFWSUNPTQotICB7ICJEQVZJQ09NIiwgZGF2aWNvbV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfQ1M4OVgwCi0gIHsgIkNTODl4MCIsIGNzODl4MF9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9ORTIxMDAKLSAgeyAiTkUyMTAwIiwgbmUyMTAwX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05JNjUxMAotICB7ICJOSTY1MTAiLCBuaTY1MTBfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfU0tfRzE2Ci0gIHsgIlNLX0cxNiIsIFNLX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFXzNDNTA3Ci0gIHsgIjNDNTA3IiwgdDUwN19wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9OSTUwMTAKLSAgeyAiTkk1MDEwIiwgbmk1MDEwX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05JNTIxMAotICB7ICJOSTUyMTAiLCBuaTUyMTBfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfRVhPUzIwNQotICB7ICJFWE9TMjA1IiwgZXhvczIwNV9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9TTUM5MDAwCi0gIHsgIlNNQzkwMDAiLCBzbWM5MDAwX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1RJQVJBCi0gIHsgIlRJQVJBIiwgdGlhcmFfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfREVQQ0EKLSAgeyAiREVQQ0EiLCBkZXBjYV9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9OUzgzOTAKLSAgeyAiTkUyMDAwL1BDSSIsIG5lcGNpX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotICB7ICJMQU5DRS9QQ0kiLCBsYW5jZXBjaV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVklBX1JISU5FCi0gIHsgIlZJQSA4NkMxMDAiLCByaGluZV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVzg5Qzg0MAotICB7ICJXODlDODQwRiIsIHc4OWM4NDBfcHJvYmUsIHBjaV9pb2FkZHJzIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1RMQU4KLSAgeyAiT2xpY29tIDIzMjYiLCB0bGFuX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0gIC8qIHRoaXMgZW50cnkgbXVzdCBhbHdheXMgYmUgbGFzdCB0byBtYXJrIHRoZSBlbmQgb2YgbGlzdCAqLwotICB7IDAsIDAsIDAgfQotfTsKLQotI2RlZmluZQlOSUNfVEFCTEVfU0laRQkoc2l6ZW9mIChOSUMpIC8gc2l6ZW9mIChOSUNbMF0pKQotCi1zdGF0aWMgaW50Ci1ldGhfZHVtbXkgKHN0cnVjdCBuaWMgKmR1bW15KQotewotICByZXR1cm4gMDsKKwlzdHJ1Y3QgaXNhX3Byb2JlX3N0YXRlICpzdGF0ZSA9ICZkZXYtPnN0YXRlLmlzYTsKKwlwcmludGYoIlByb2JpbmcgaXNhICVzLi4uXG4iLCB0eXBlX25hbWUpOworCWlmIChkZXYtPmhvd19wcm9iZSA9PSBQUk9CRV9GSVJTVCkgeworCQlzdGF0ZS0+YWR2YW5jZSA9IDA7CisJCXN0YXRlLT5kcml2ZXIgID0gaXNhX2RyaXZlcnM7CisJCWRldi0+aW5kZXggICAgID0gLTE7CisJfQorCWZvcig7OykKKwl7CisJCWlmICgoZGV2LT5ob3dfcHJvYmUgIT0gUFJPQkVfQVdBS0UpICYmIHN0YXRlLT5hZHZhbmNlKSB7CisJCQlzdGF0ZS0+ZHJpdmVyKys7CisJCQlkZXYtPmluZGV4ID0gLTE7CisJCX0KKwkJc3RhdGUtPmFkdmFuY2UgPSAxOworCQkKKwkJaWYgKHN0YXRlLT5kcml2ZXIgPj0gaXNhX2RyaXZlcnNfZW5kKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXRlLT5kcml2ZXItPnR5cGUgIT0gZGV2LT50eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldi0+aG93X3Byb2JlICE9IFBST0JFX0FXQUtFKSB7CisJCQlkZXYtPnR5cGVfaW5kZXgrKzsKKwkJfQorCQlwcmludGYoIlslc10iLCBzdGF0ZS0+ZHJpdmVyLT5uYW1lKTsKKwkJZGV2LT5kZXZpZC5idXNfdHlwZSA9IElTQV9CVVNfVFlQRTsKKwkJLyogRklYTUUgaG93IGRvIEkgaGFuZGxlIGRldi0+aW5kZXggKyBQUk9CRV9BR0FJTj8/ICovCisJCS8qIGRyaXZlciB3aWxsIGZpbGwgaW4gdmVuZG9yIGFuZCBkZXZpY2UgSURzICovCisJCWlmIChzdGF0ZS0+ZHJpdmVyLT5wcm9iZShkZXYsIHN0YXRlLT5kcml2ZXItPmlvYWRkcnMpKSB7CisJCQlzdGF0ZS0+YWR2YW5jZSA9IChkZXYtPmluZGV4ID09IC0xKTsKKwkJCXJldHVybiBQUk9CRV9XT1JLRUQ7CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwl9CisJcmV0dXJuIFBST0JFX0ZBSUxFRDsKIH0KLQotc3RhdGljIGNoYXIJcGFja2V0W0VUSF9GUkFNRV9MRU5dOwotCi1zdHJ1Y3QgbmljCW5pYyA9Ci17Ci0gICh2b2lkICgqKSAoc3RydWN0IG5pYyAqKSkgZXRoX2R1bW15LAkvKiByZXNldCAqLwotICBldGhfZHVtbXksCQkJCS8qIHBvbGwgKi8KLSAgKHZvaWQgKCopIChzdHJ1Y3QgbmljICosIGNvbnN0IGNoYXIgKiwKLQkgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgY29uc3QgY2hhciAqKSkgZXRoX2R1bW15LAkvKiB0cmFuc21pdCAqLwotICAodm9pZCAoKikgKHN0cnVjdCBuaWMgKikpIGV0aF9kdW1teSwJLyogZGlzYWJsZSAqLwotI2lmZGVmCVQ1MDNfQVVJCi0gIDEsCQkJCQkvKiBhdWkgKi8KICNlbHNlCi0gIDAsCQkJCQkvKiBubyBhdWkgKi8KKyNkZWZpbmUgaXNhX3Byb2JlKGQsdG4pIChQUk9CRV9GQUlMRUQpCiAjZW5kaWYKLSAgJnJvbSwJCQkJCS8qIHJvbV9pbmZvICovCi0gIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCQkvKiBub2RlX2FkZHIgKi8KLSAgcGFja2V0LAkJCQkvKiBwYWNrZXQgKi8KLSAgMCwJCQkJLyogcGFja2V0bGVuICovCi0gIDAsCQkJCS8qIHByaXZfZGF0YSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lW10gPSB7CisJIm5pYyIsIAorCSJkaXNrIiwgCisJImZsb3BweSIsCiB9OwotCi12b2lkCi1ldGhfcmVzZXQgKHZvaWQpCitpbnQgcHJvYmUoc3RydWN0IGRldiAqZGV2KQogewotICAoKm5pYy5yZXNldCkgKCZuaWMpOwotfQorCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKIAotaW50Ci1ldGhfcHJvYmUgKHZvaWQpCi17Ci0gIHN0cnVjdCBwY2lfZGV2aWNlCSpwOwotICBjb25zdCBzdHJ1Y3QgZGlzcGF0Y2hfdGFibGUJKnQ7Ci0gIHN0YXRpYyBpbnQgcHJvYmVkID0gMDsKKwlFbnRlckZ1bmN0aW9uKCJwcm9iZSIpOwogCi0gIC8qIElmIGFscmVhZHkgcHJvYmVkLCBkb24ndCB0cnkgdG8gcHJvYmUgaXQgYW55IGxvbmdlci4gICovCi0gIGlmIChwcm9iZWQpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBDbGVhciB0aGUgcmVhZHkgZmxhZy4gICovCi0gIG5ldHdvcmtfcmVhZHkgPSAwOwotICAvKiBDbGVhciB0aGUgQVJQIHRhYmxlLiAgKi8KLSAgZ3J1Yl9tZW1zZXQgKChjaGFyICopIGFycHRhYmxlLCAwLAotCSAgICAgICBNQVhfQVJQICogc2l6ZW9mIChzdHJ1Y3QgYXJwdGFibGVfdCkpOwotICAKLSAgcCA9IDA7Ci0gIAotI2lmZGVmCUlOQ0xVREVfUENJCi0gIC8qIEluIEdSVUIsIHRoZSBST00gaW5mbyBpcyBpbml0aWFsaXplZCBoZXJlLiAgKi8KLSAgcm9tID0gKigoc3RydWN0IHJvbV9pbmZvICopIFJPTV9JTkZPX0xPQ0FUSU9OKTsKLSAgCi0gIGV0aF9wY2lfaW5pdChwY2lfbmljX2xpc3QpOwotICBwY2lfaW9hZGRyc1swXSA9IDA7Ci0gIHBjaV9pb2FkZHJzWzFdID0gMDsKLSAgLyogYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgbGlzdCBvZiBwb3NzaWJsZSBQQ0kgY2FuZGlkYXRlcwotICAgICB3ZSBqdXN0IHBpY2sgdGhlIGZpcnN0IG9uZSB3aXRoIGEgbm9uLXplcm8gaW9hZGRyICovCi0gIGZvciAocCA9IHBjaV9uaWNfbGlzdDsgcC0+dmVuZG9yICE9IDA7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAocC0+aW9hZGRyICE9IDApCi0JewotCSAgcGNpX2lvYWRkcnNbMF0gPSBwLT5pb2FkZHI7Ci0JICBicmVhazsKKwl0eXBlX25hbWUgPSAiIjsKKwlpZiAoKGRldi0+dHlwZSA+PSAwKSAmJiAKKwkJKGRldi0+dHlwZSA8IHNpemVvZihkcml2ZXJfbmFtZSkvc2l6ZW9mKGRyaXZlcl9uYW1lWzBdKSkpIHsKKwkJdHlwZV9uYW1lID0gZHJpdmVyX25hbWVbZGV2LT50eXBlXTsKIAl9Ci0gICAgfQotI2VuZGlmCi0gIAotICBldGhlcmJvb3RfcHJpbnRmKCJQcm9iaW5nLi4uIik7Ci0JCi0jaWZkZWYgSU5DTFVERV9QQ0kKLSAgaWYgKHAtPnZlbmRvcikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcGNpX2Rpc3BhdGNoX3RhYmxlICpwdDsKLSAgICAgIAotICAgICAgZm9yIChwdCA9IFBDSV9OSUM7IHB0LT5ldGhfcHJvYmUgIT0gMDsgcHQrKykKLQlpZiAocC0+dmVuZG9yID09IHB0LT52ZW5kb3IgJiYgcC0+ZGV2X2lkID09IHB0LT5kZXZfaWQpCi0JICB7Ci0JICAgIGV0aGVyYm9vdF9wcmludGYgKCJbJXNdIiwgcC0+bmFtZSk7Ci0JICAgIGlmICgocHQtPmV0aF9wcm9iZSkgKCZuaWMsIHBjaV9pb2FkZHJzLCBwKSkKLQkgICAgICB7Ci0JCXByb2JlZCA9IDE7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgIH0KLSAgICB9Ci0jZW5kaWYgLyogSU5DTFVERV9QQ0kgKi8KLQkKLSAgZm9yICh0ID0gTklDOyB0LT5uaWNfbmFtZSAhPSAwOyArK3QpCi0gICAgewotICAgICAgZXRoZXJib290X3ByaW50ZigiWyVzXSIsIHQtPm5pY19uYW1lKTsKLSNpZmRlZglJTkNMVURFX1BDSQotICAgICAgaWYgKCgqdC0+ZXRoX3Byb2JlKSAoJm5pYywgdC0+cHJvYmVfaW9hZGRycywgcCkpCi0JewotCSAgcHJvYmVkID0gMTsKLQkgIHJldHVybiAxOworCWlmIChkZXYtPmhvd19wcm9iZSA9PSBQUk9CRV9GSVJTVCkgeworCQlkZXYtPnRvX3Byb2JlID0gUFJPQkVfUENJOworCQltZW1zZXQoJmRldi0+c3RhdGUsIDAsIHNpemVvZihkZXYtPnN0YXRlKSk7CiAJfQotI2Vsc2UKLSAgICAgIGlmICgoKnQtPmV0aF9wcm9iZSkgKCZuaWMsIHQtPnByb2JlX2lvYWRkcnMpKQotCXsKLQkgIHByb2JlZCA9IDE7Ci0JICByZXR1cm4gMTsKKwlpZiAoZGV2LT50b19wcm9iZSA9PSBQUk9CRV9QQ0kpIHsKKwkJZGV2LT5ob3dfcHJvYmUgPSBwY2lfcHJvYmUoZGV2LCB0eXBlX25hbWUpOworCQlpZiAoZGV2LT5ob3dfcHJvYmUgPT0gUFJPQkVfRkFJTEVEKSB7CisJCQlkZXYtPnRvX3Byb2JlID0gUFJPQkVfSVNBOworCQl9CisJfQorCWlmIChkZXYtPnRvX3Byb2JlID09IFBST0JFX0lTQSkgeworCQlkZXYtPmhvd19wcm9iZSA9IGlzYV9wcm9iZShkZXYsIHR5cGVfbmFtZSk7CisJCWlmIChkZXYtPmhvd19wcm9iZSA9PSBQUk9CRV9GQUlMRUQpIHsKKwkJCWRldi0+dG9fcHJvYmUgPSBQUk9CRV9OT05FOworCQl9CisJfQorCWlmICgoZGV2LT50b19wcm9iZSAhPSBQUk9CRV9QQ0kpICYmCisJCShkZXYtPnRvX3Byb2JlICE9IFBST0JFX0lTQSkpIHsKKwkJZGV2LT5ob3dfcHJvYmUgPSBQUk9CRV9GQUlMRUQ7CisJCQogCX0KLSNlbmRpZgkvKiBJTkNMVURFX1BDSSAqLwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi1pbnQKLWV0aF9wb2xsICh2b2lkKQotewotICByZXR1cm4gKCgqbmljLnBvbGwpICgmbmljKSk7Ci19CiAKLXZvaWQKLWV0aF90cmFuc21pdCAoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCB2b2lkICpwKQotewotICAoKm5pYy50cmFuc21pdCkgKCZuaWMsIGQsIHQsIHMsIHApOwotICBpZiAodCA9PSBJUCkKLSAgICB0d2lkZGxlICgpOworCUxlYXZlRnVuY3Rpb24oInByb2JlIik7CisJcmV0dXJuIGRldi0+aG93X3Byb2JlOwogfQogCi12b2lkCi1ldGhfZGlzYWJsZSAodm9pZCkKK3ZvaWQgZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpCiB7Ci0gICgqbmljLmRpc2FibGUpICgmbmljKTsKKwlpZiAoZGV2LT5kaXNhYmxlKSB7CisJCWRldi0+ZGlzYWJsZShkZXYpOworCQlkZXYtPmRpc2FibGUgPSAwOworCX0KIH0KSW5kZXg6IGIvbmV0Ym9vdC9jcHUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9jcHUuaApAQCAtMCwwICsxLDI0MyBAQAorI2lmbmRlZiBJMzg2X0JJVFNfQ1BVX0gKKyNkZWZpbmUgSTM4Nl9CSVRTX0NQVV9ICisKKworLyogU2FtcGxlIHVzYWdlOiBDUFVfRkVBVFVSRV9QKGNwdS54ODZfY2FwYWJpbGl0eSwgRlBVKSAqLworI2RlZmluZSBDUFVfRkVBVFVSRV9QKENBUCwgRkVBVFVSRSkgXAorCSghIShDQVBbKFg4Nl9GRUFUVVJFXyMjRkVBVFVSRSkvMzJdICYgKChYODZfRkVBVFVSRV8jI0ZFQVRVUkUpICYgMHgxZikpKQorCisjZGVmaW5lIE5DQVBJTlRTCTQJLyogQ3VycmVudGx5IHdlIGhhdmUgNCAzMi1iaXQgd29yZHMgd29ydGggb2YgaW5mbyAqLworCisvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwMSwgd29yZCAwICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZQVQkJKDAqMzIrIDApIC8qIE9uYm9hcmQgRlBVICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1ZNRQkJKDAqMzIrIDEpIC8qIFZpcnR1YWwgTW9kZSBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0RFCQkoMCozMisgMikgLyogRGVidWdnaW5nIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFIAkoMCozMisgMykgLyogUGFnZSBTaXplIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVFNDCQkoMCozMisgNCkgLyogVGltZSBTdGFtcCBDb3VudGVyICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01TUgkJKDAqMzIrIDUpIC8qIE1vZGVsLVNwZWNpZmljIFJlZ2lzdGVycywgUkRNU1IsIFdSTVNSICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BBRQkJKDAqMzIrIDYpIC8qIFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NQ0UJCSgwKjMyKyA3KSAvKiBNYWNoaW5lIENoZWNrIEFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DWDgJCSgwKjMyKyA4KSAvKiBDTVBYQ0hHOCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BUElDCSgwKjMyKyA5KSAvKiBPbmJvYXJkIEFQSUMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU0VQCQkoMCozMisxMSkgLyogU1lTRU5URVIvU1lTRVhJVCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NVFJSCSgwKjMyKzEyKSAvKiBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEdFCQkoMCozMisxMykgLyogUGFnZSBHbG9iYWwgRW5hYmxlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01DQQkJKDAqMzIrMTQpIC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NNT1YJKDAqMzIrMTUpIC8qIENNT1YgaW5zdHJ1Y3Rpb24gKEZDTU9WQ0MgYW5kIEZDT01JIHRvbyBpZiBGUFUgcHJlc2VudCkgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFUCQkoMCozMisxNikgLyogUGFnZSBBdHRyaWJ1dGUgVGFibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFMzYJKDAqMzIrMTcpIC8qIDM2LWJpdCBQU0VzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BOCQkoMCozMisxOCkgLyogUHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFNICSgwKjMyKzE5KSAvKiBTdXBwb3J0cyB0aGUgQ0xGTFVTSCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9EVEVTCSgwKjMyKzIxKSAvKiBEZWJ1ZyBUcmFjZSBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BQ1BJCSgwKjMyKzIyKSAvKiBBQ1BJIHZpYSBNU1IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTU1YCQkoMCozMisyMykgLyogTXVsdGltZWRpYSBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU1IJKDAqMzIrMjQpIC8qIEZYU0FWRSBhbmQgRlhSU1RPUiBpbnN0cnVjdGlvbnMgKGZhc3Qgc2F2ZSBhbmQgcmVzdG9yZSAqLworCQkJCSAgICAgICAgICAvKiBvZiBGUFUgY29udGV4dCksIGFuZCBDUjQuT1NGWFNSIGF2YWlsYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YTU0JCSgwKjMyKzI1KSAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTIJKDAqMzIrMjYpIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMtMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TRUxGU05PT1AJKDAqMzIrMjcpIC8qIENQVSBzZWxmIHNub29wICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0hUCQkoMCozMisyOCkgLyogSHlwZXItVGhyZWFkaW5nICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDQwkJKDAqMzIrMjkpIC8qIEF1dG9tYXRpYyBjbG9jayBjb250cm9sICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0lBNjQJKDAqMzIrMzApIC8qIElBLTY0IHByb2Nlc3NvciAqLworCisvKiBBTUQtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4ODAwMDAwMDEsIHdvcmQgMSAqLworLyogRG9uJ3QgZHVwbGljYXRlIGZlYXR1cmUgZmxhZ3Mgd2hpY2ggYXJlIHJlZHVuZGFudCB3aXRoIEludGVsISAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TWVNDQUxMCSgxKjMyKzExKSAvKiBTWVNDQUxML1NZU1JFVCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NTVhFWFQJKDEqMzIrMjIpIC8qIEFNRCBNTVggZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9MTQkJKDEqMzIrMjkpIC8qIExvbmcgTW9kZSAoeDg2LTY0KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV8zRE5PV0VYVAkoMSozMiszMCkgLyogQU1EIDNETm93ISBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFXzNETk9XCSgxKjMyKzMxKSAvKiAzRE5vdyEgKi8KKworLyogVHJhbnNtZXRhLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDgwODYwMDAxLCB3b3JkIDIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUkVDT1ZFUlkJKDIqMzIrIDApIC8qIENQVSBpbiByZWNvdmVyeSBtb2RlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xPTkdSVU4JKDIqMzIrIDEpIC8qIExvbmdydW4gcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9MUlRJCSgyKjMyKyAzKSAvKiBMb25nUnVuIHRhYmxlIGludGVyZmFjZSAqLworCisvKiBPdGhlciBmZWF0dXJlcywgTGludXgtZGVmaW5lZCBtYXBwaW5nLCB3b3JkIDMgKi8KKy8qIFRoaXMgcmFuZ2UgaXMgdXNlZCBmb3IgZmVhdHVyZSBiaXRzIHdoaWNoIGNvbmZsaWN0IG9yIGFyZSBzeW50aGVzaXplZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DWE1NWAkoMyozMisgMCkgLyogQ3lyaXggTU1YIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSzZfTVRSUgkoMyozMisgMSkgLyogQU1EIEs2IG5vbnN0YW5kYXJkIE1UUlJzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NZUklYX0FSUgkoMyozMisgMikgLyogQ3lyaXggQVJScyAoPSBNVFJScykgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0VOVEFVUl9NQ1IJKDMqMzIrIDMpIC8qIENlbnRhdXIgTUNScyAoPSBNVFJScykgKi8KKworI2RlZmluZSBNQVhfWDg2X1ZFTkRPUl9JRCAxNgorc3RydWN0IGNwdWluZm9feDg2IHsKKwl1aW50OF90CSB4ODY7CQkvKiBDUFUgZmFtaWx5ICovCisJdWludDhfdAkgeDg2X21vZGVsOworCXVpbnQ4X3QJIHg4Nl9tYXNrOworCisgICAgICAgCWludAkgY3B1aWRfbGV2ZWw7CS8qIE1heGltdW0gc3VwcG9ydGVkIENQVUlEIGxldmVsLCAtMT1ubyBDUFVJRCAqLworCXVuc2lnbmVkIHg4Nl9jYXBhYmlsaXR5W05DQVBJTlRTXTsKKwljaGFyCSB4ODZfdmVuZG9yX2lkW01BWF9YODZfVkVORE9SX0lEXTsKK307CisKKworI2RlZmluZSBYODZfVkVORE9SX0lOVEVMIDAKKyNkZWZpbmUgWDg2X1ZFTkRPUl9DWVJJWCAxCisjZGVmaW5lIFg4Nl9WRU5ET1JfQU1EIDIKKyNkZWZpbmUgWDg2X1ZFTkRPUl9VTUMgMworI2RlZmluZSBYODZfVkVORE9SX05FWEdFTiA0CisjZGVmaW5lIFg4Nl9WRU5ET1JfQ0VOVEFVUiA1CisjZGVmaW5lIFg4Nl9WRU5ET1JfUklTRSA2CisjZGVmaW5lIFg4Nl9WRU5ET1JfVFJBTlNNRVRBIDcKKyNkZWZpbmUgWDg2X1ZFTkRPUl9OU0MgOAorI2RlZmluZSBYODZfVkVORE9SX1VOS05PV04gMHhmZgorCisvKgorICogRUZMQUdTIGJpdHMKKyAqLworI2RlZmluZSBYODZfRUZMQUdTX0NGCTB4MDAwMDAwMDEgLyogQ2FycnkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1BGCTB4MDAwMDAwMDQgLyogUGFyaXR5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19BRgkweDAwMDAwMDEwIC8qIEF1eGlsbGFyeSBjYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfWkYJMHgwMDAwMDA0MCAvKiBaZXJvIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19TRgkweDAwMDAwMDgwIC8qIFNpZ24gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1RGCTB4MDAwMDAxMDAgLyogVHJhcCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUYJMHgwMDAwMDIwMCAvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0RGCTB4MDAwMDA0MDAgLyogRGlyZWN0aW9uIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19PRgkweDAwMDAwODAwIC8qIE92ZXJmbG93IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JT1BMCTB4MDAwMDMwMDAgLyogSU9QTCBtYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfTlQJMHgwMDAwNDAwMCAvKiBOZXN0ZWQgVGFzayAqLworI2RlZmluZSBYODZfRUZMQUdTX1JGCTB4MDAwMTAwMDAgLyogUmVzdW1lIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WTQkweDAwMDIwMDAwIC8qIFZpcnR1YWwgTW9kZSAqLworI2RlZmluZSBYODZfRUZMQUdTX0FDCTB4MDAwNDAwMDAgLyogQWxpZ25tZW50IENoZWNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVklGCTB4MDAwODAwMDAgLyogVmlydHVhbCBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZJUAkweDAwMTAwMDAwIC8qIFZpcnR1YWwgSW50ZXJydXB0IFBlbmRpbmcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JRAkweDAwMjAwMDAwIC8qIENQVUlEIGRldGVjdGlvbiBmbGFnICovCisKKy8qCisgKiBHZW5lcmljIENQVUlEIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVpZChpbnQgb3AsIAorCXVuc2lnbmVkIGludCAqZWF4LCB1bnNpZ25lZCBpbnQgKmVieCwgdW5zaWduZWQgaW50ICplY3gsIHVuc2lnbmVkIGludCAqZWR4KQoreworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKCplYXgpLAorCQkgICI9YiIgKCplYngpLAorCQkgICI9YyIgKCplY3gpLAorCQkgICI9ZCIgKCplZHgpCisJCTogIjAiIChvcCkpOworfQorCisvKgorICogQ1BVSUQgZnVuY3Rpb25zIHJldHVybmluZyBhIHNpbmdsZSBkYXR1bQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lYXgodW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXg7CisKKwlfX2FzbV9fKCJjcHVpZCIKKwkJOiAiPWEiIChlYXgpCisJCTogIjAiIChvcCkKKwkJOiAiYngiLCAiY3giLCAiZHgiKTsKKwlyZXR1cm4gZWF4OworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWJ4KHVuc2lnbmVkIGludCBvcCkKK3sKKwl1bnNpZ25lZCBpbnQgZWF4LCBlYng7CisKKwlfX2FzbV9fKCJjcHVpZCIKKwkJOiAiPWEiIChlYXgpLCAiPWIiIChlYngpCisJCTogIjAiIChvcCkKKwkJOiAiY3giLCAiZHgiICk7CisJcmV0dXJuIGVieDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VjeCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheCwgZWN4OworCisJX19hc21fXygiY3B1aWQiCisJCTogIj1hIiAoZWF4KSwgIj1jIiAoZWN4KQorCQk6ICIwIiAob3ApCisJCTogImJ4IiwgImR4IiApOworCXJldHVybiBlY3g7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lZHgodW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVkeDsKKworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKGVheCksICI9ZCIgKGVkeCkKKwkJOiAiMCIgKG9wKQorCQk6ICJieCIsICJjeCIpOworCXJldHVybiBlZHg7Cit9CisKKy8qCisgKiBJbnRlbCBDUFUgZmVhdHVyZXMgaW4gQ1I0CisgKi8KKyNkZWZpbmUgWDg2X0NSNF9WTUUJCTB4MDAwMQkvKiBlbmFibGUgdm04NiBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfUFZJCQkweDAwMDIJLyogdmlydHVhbCBpbnRlcnJ1cHRzIGZsYWcgZW5hYmxlICovCisjZGVmaW5lIFg4Nl9DUjRfVFNECQkweDAwMDQJLyogZGlzYWJsZSB0aW1lIHN0YW1wIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfREUJCTB4MDAwOAkvKiBlbmFibGUgZGVidWdnaW5nIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QU0UJCTB4MDAxMAkvKiBlbmFibGUgcGFnZSBzaXplIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QQUUJCTB4MDAyMAkvKiBlbmFibGUgcGh5c2ljYWwgYWRkcmVzcyBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfTUNFCQkweDAwNDAJLyogTWFjaGluZSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSNF9QR0UJCTB4MDA4MAkvKiBlbmFibGUgZ2xvYmFsIHBhZ2VzICovCisjZGVmaW5lIFg4Nl9DUjRfUENFCQkweDAxMDAJLyogZW5hYmxlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfT1NGWFNSCQkweDAyMDAJLyogZW5hYmxlIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU1hNTUVYQ1BUCTB4MDQwMAkvKiBlbmFibGUgdW5tYXNrZWQgU1NFIGV4Y2VwdGlvbnMgKi8KKworCisjZGVmaW5lIE1TUl9LNl9FRkVSCQkJMHhDMDAwMDA4MAorLyogRUZFUiBiaXRzOiAqLyAKKyNkZWZpbmUgX0VGRVJfU0NFIDAgIC8qIFNZU0NBTEwvU1lTUkVUICovCisjZGVmaW5lIF9FRkVSX0xNRSA4ICAvKiBMb25nIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIF9FRkVSX0xNQSAxMCAvKiBMb25nIG1vZGUgYWN0aXZlIChyZWFkLW9ubHkpICovCisjZGVmaW5lIF9FRkVSX05YIDExICAvKiBObyBleGVjdXRlIGVuYWJsZSAqLworCisjZGVmaW5lIEVGRVJfU0NFICgxPDxfRUZFUl9TQ0UpCisjZGVmaW5lIEVGRVJfTE1FICgxPDxFRkVSX0xNRSkKKyNkZWZpbmUgRUZFUl9MTUEgKDE8PEVGRVJfTE1BKQorI2RlZmluZSBFRkVSX05YICgxPDxfRUZFUl9OWCkKKworI2RlZmluZSByZG1zcihtc3IsdmFsMSx2YWwyKSBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZG1zciIgXAorCQkJICA6ICI9YSIgKHZhbDEpLCAiPWQiICh2YWwyKSBcCisJCQkgIDogImMiIChtc3IpKQorCisjZGVmaW5lIHdybXNyKG1zcix2YWwxLHZhbDIpIFwKKyAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIndybXNyIiBcCisJCQkgIDogLyogbm8gb3V0cHV0cyAqLyBcCisJCQkgIDogImMiIChtc3IpLCAiYSIgKHZhbDEpLCAiZCIgKHZhbDIpKQorCisKKyNkZWZpbmUgcmVhZF9jcjAoKQkoeyBcCisJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKKwlfX2FzbV9fKCBcCisJCSJtb3ZsICUlY3IwLCAlMFxuXHQiIFwKKwkJOiI9ciIgKF9fZHVtbXkpKTsgXAorCV9fZHVtbXk7IFwKK30pCisjZGVmaW5lIHdyaXRlX2NyMCh4KSBcCisJX19hc21fXygibW92bCAlMCwlJWNyMCI6IDoiciIgKHgpKTsKKworI2RlZmluZSByZWFkX2NyMygpCSh7IFwKKwl1bnNpZ25lZCBpbnQgX19kdW1teTsgXAorCV9fYXNtX18oIFwKKwkJIm1vdmwgJSVjcjMsICUwXG5cdCIgXAorCQk6Ij1yIiAoX19kdW1teSkpOyBcCisJX19kdW1teTsgXAorfSkKKyNkZWZpbmUgd3JpdGVfY3IzeCh4KSBcCisJX19hc21fXygibW92bCAlMCwlJWNyMyI6IDoiciIgKHgpKTsKKworCisjZGVmaW5lIHJlYWRfY3I0KCkJKHsgXAorCXVuc2lnbmVkIGludCBfX2R1bW15OyBcCisJX19hc21fXyggXAorCQkibW92bCAlJWNyNCwgJTBcblx0IiBcCisJCToiPXIiIChfX2R1bW15KSk7IFwKKwlfX2R1bW15OyBcCit9KQorI2RlZmluZSB3cml0ZV9jcjR4KHgpIFwKKwlfX2FzbV9fKCJtb3ZsICUwLCUlY3I0IjogOiJyIiAoeCkpOworCisKK2V4dGVybiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2luZm87CisjaWZkZWYgQ09ORklHX1g4Nl82NAorZXh0ZXJuIHZvaWQgY3B1X3NldHVwKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgY3B1X3NldHVwKCkgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogSTM4Nl9CSVRTX0NQVV9IICovCkluZGV4OiBiL25ldGJvb3QvY3M4OXgwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2NzODl4MC5jCisrKyBiL25ldGJvb3QvY3M4OXgwLmMKQEAgLTE2LDY2MiArMTYsMyBAQAogICAgLS0gcXVvdGUgZnJvbSBlbWFpbAogKiovCiAKLS8qIGNzODl4MC5jOiBBIENyeXN0YWwgU2VtaWNvbmR1Y3RvciBDUzg5WzAyXTAgZHJpdmVyIGZvciBldGhlcmJvb3QuICovCi0vKgotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCi0gIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgRXRoZXJib290IHBhY2thZ2UuICBUaGUgY29kZSBpcwotICBvcmRpbmFyaWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuCi0gIAotICBSdXNzIE5lbHNvbiwgSmFudWFyeSAyMDAwCi0KLSAgQ2hhbmdlTG9nOgotCi0gIFRodSBEZWMgNiAyMjo0MDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgotCi0gICogZGlzYWJsZWQgYWxsICJhZHZhbmNlZCIgZmVhdHVyZXM7IHRoaXMgc2hvdWxkIG1ha2UgdGhlIGNvZGUgbW9yZSByZWxpYWJsZQotCi0gICogcmVvcmdhbml6ZWQgdGhlIHJlc2V0IGZ1bmN0aW9uCi0KLSAgKiBhbHdheXMgcmVzZXQgdGhlIGFkZHJlc3MgcG9ydCwgc28gdGhhdCBhdXRvcHJvYmluZyB3aWxsIGNvbnRpbnVlIHdvcmtpbmcKLQotICAqIHNvbWUgY29zbWV0aWMgY2hhbmdlcwotCi0gICogMi41Ci0KLSAgVGh1IERlYyA1IDIxOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+Ci0KLSAgKiB0ZXN0ZWQgdGhlIGNvZGUgYWdhaW5zdCBhIENTODkwMCBjYXJkCi0KLSAgKiBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBhbmQgYWRqdXN0bWVudHMKLQotICAqIHRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2UsIHRoYXQgYWN0dWFsbHkgd29ya3MhIGl0IHN0aWxsIHJlcXVpcmVzIHNvbWUKLSAgICBjaGFuZ2VzIGluIG9yZGVyIHRvIGJlIG1vcmUgdG9sZXJhbnQgdG8gZGlmZmVyZW50IGVudmlyb25tZW50cwotCi0gICogNAotCi0gIEZyaSBOb3YgMjIgMjM6MDA6MDAgMTk5NiAgTWFya3VzIEd1dHNjaGtlICA8Z3V0c2Noa0BtYXRoLnVuaS1tdWVuc3Rlci5kZT4KLQotICAqIHJlYWQgdGhlIG1hbnVhbHMgZm9yIHRoZSBDUzg5eDAgY2hpcHNldHMgYW5kIHRvb2sgbm90ZSBvZiBhbGwgdGhlCi0gICAgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbmVjY2Vzc2FyeSBpbiBvcmRlciB0byBhZGFwdCBSdXNzZWwgTmVsc29uJ3MgY29kZQotICAgIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgYSBCT09ULVByb20KLQotICAqIDYKLQotICBUaHUgTm92IDE5IDIyOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+Ci0KLSAgKiBTeW5jaGVkIHdpdGggUnVzc2VsIE5lbHNvbidzIGN1cnJlbnQgY29kZSAodjEuMDApCi0KLSAgKiAyCi0KLSAgVGh1IE5vdiAxMiAxODowMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgotCi0gICogQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBjb2RlIGFuZCB0cmllZCB0byBvcHRpbWl6ZSB0aGUgY29kZSBzaXplLgotCi0gICogMS41Ci0KLSAgU3VuIE5vdiAxMCAxNjozMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgotCi0gICogRmlyc3QgZXhwZXJpbWVudGFsIHJlbGVhc2UuIFRoaXMgY29kZSBjb21waWxlcyBmaW5lLCBidXQgSQotICBoYXZlIG5vIHdheSBvZiB0ZXN0aW5nIHdoZXRoZXIgaXQgYWN0dWFsbHkgd29ya3MuCi0KLSAgKiBJIGRpZCBub3QgKHlldCkgYm90aGVyIHRvIG1ha2UgdGhlIGNvZGUgMTZiaXQgYXdhcmUsIHNvIGZvcgotICB0aGUgdGltZSBiZWluZywgaXQgd2lsbCBvbmx5IHdvcmsgZm9yIEV0aGVyYm9vdC8zMi4KLQotICAqIDEyCi0KLSAgKi8KLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0jaW5jbHVkZSAiY3M4OXgwLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgICBldGhfbWVtX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2lycTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9jc190eXBlOwkvKiBvbmUgb2Y6IENTODkwMCwgQ1M4OTIwLCBDUzg5MjBNICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2F1dG9fbmVnX2NuZjsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9hZGFwdGVyX2NuZjsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbGluZWN0bDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlDUzg5eDAgLSBzcGVjaWZpYyByb3V0aW5lcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJlYWRyZWcoaW50IHBvcnRubykKLXsKLQlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCXJldHVybiBpbncoZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcmVnKGludCBwb3J0bm8sIGludCB2YWx1ZSkKLXsKLQlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCW91dHcodmFsdWUsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7Ci0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRUVQUk9NIGFjY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgd2FpdF9lZXByb21fcmVhZHkodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgNCpUSUNLU19QRVJfU0VDOwotCi0JLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBFRVBST00gaXMgcmVhZHksIGEgdGltZW91dCBpcyB1c2VkIC0KLQkgICBqdXN0IGluIGNhc2UgRUVQUk9NIGlzIHJlYWR5IHdoZW4gU0lfQlVTWSBpbiB0aGUKLQkgICBQUF9TZWxmU1QgaXMgY2xlYXIgKi8KLQl3aGlsZShyZWFkcmVnKFBQX1NlbGZTVCkgJiBTSV9CVVNZKSB7Ci0JCWlmIChjdXJydGlja3MoKSA+PSB0bW8pCi0JCQlyZXR1cm4gLTE7IH0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfZWVwcm9tX2RhdGEoaW50IG9mZiwgaW50IGxlbiwgdW5zaWduZWQgc2hvcnQgKmJ1ZmZlcikKLXsKLQlpbnQgaTsKLQotI2lmZGVmCUVERUJVRwotCXByaW50ZigiXG5jczogRUVQUk9NIGRhdGEgZnJvbSAlaFggZm9yICVoWDoiLG9mZixsZW4pOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICh3YWl0X2VlcHJvbV9yZWFkeSgpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJLyogTm93IHNlbmQgdGhlIEVFUFJPTSByZWFkIGNvbW1hbmQgYW5kIEVFUFJPTSBsb2NhdGlvbgotCQkgICB0byByZWFkICovCi0JCXdyaXRlcmVnKFBQX0VFQ01ELCAob2ZmICsgaSkgfCBFRVBST01fUkVBRF9DTUQpOwotCQlpZiAod2FpdF9lZXByb21fcmVhZHkoKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWJ1ZmZlcltpXSA9IHJlYWRyZWcoUFBfRUVEYXRhKTsKLSNpZmRlZglFREVCVUcKLQkJaWYgKCEoaSUxMCkpCi0JCQlwcmludGYoIlxuY3M6ICIpOwotCQlwcmludGYoIiVoWCAiLCBidWZmZXJbaV0pOwotI2VuZGlmCi0JfQotI2lmZGVmCUVERUJVRwotCXB1dGNoYXIoJ1xuJyk7Ci0jZW5kaWYKLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBnZXRfZWVwcm9tX2Noa3N1bShpbnQgb2ZmLCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqYnVmZmVyKQotewotCWludCAgaSwgY2tzdW07Ci0KLQlja3N1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlja3N1bSArPSBidWZmZXJbaV07Ci0JY2tzdW0gJj0gMHhmZmZmOwotCWlmIChja3N1bSA9PSAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1BY3RpdmF0ZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZWRpYSBhbmQgcHJvYmUgZm9yIG5ldHdvcmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjbHJsaW5lKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlwdXRjaGFyKCdccicpOwotCWZvciAoaSA9IDc5OyBpLS07ICkgcHV0Y2hhcignICcpOwotCXByaW50ZigiXHJjczogIik7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBjb250cm9sX2RjX2RjKGludCBvbl9ub3Rfb2ZmKQotewotCXVuc2lnbmVkIGludCBzZWxmY29udHJvbDsKLQl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsKLQotCS8qIGNvbnRyb2wgdGhlIERDIHRvIERDIGNvbnZlcnRvciBpbiB0aGUgU2VsZkNvbnRyb2wgcmVnaXN0ZXIuICAqLwotCXNlbGZjb250cm9sID0gSENCMV9FTkJMOyAvKiBFbmFibGUgdGhlIEhDQjEgYml0IGFzIGFuIG91dHB1dCAqLwotCWlmICgoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0RDX0RDX1BPTEFSSVRZKSAhPSAwKSBeIG9uX25vdF9vZmYpCi0JCXNlbGZjb250cm9sIHw9IEhDQjE7Ci0JZWxzZQotCQlzZWxmY29udHJvbCAmPSB+SENCMTsKLQl3cml0ZXJlZyhQUF9TZWxmQ1RMLCBzZWxmY29udHJvbCk7Ci0KLQkvKiBXYWl0IGZvciB0aGUgREMvREMgY29udmVydGVyIHRvIHBvd2VyIHVwIC0gMTAwMG1zICovCi0Jd2hpbGUgKGN1cnJ0aWNrcygpIDwgdG1vKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBkZXRlY3RfdHAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQotCS8qIFR1cm4gb24gdGhlIGNoaXAgYXV0byBkZXRlY3Rpb24gb2YgMTBCVC8gQVVJICovCi0KLQljbHJsaW5lKCk7IHByaW50ZigiYXR0ZW1wdGluZyAlczoiLCJUUCIpOwotCi0gICAgICAgIC8qIElmIGNvbm5lY3RlZCB0byBhbm90aGVyIGZ1bGwgZHVwbGV4IGNhcGFibGUgMTAtQmFzZS1UIGNhcmQKLQkgICB0aGUgbGluayBwdWxzZXMgc2VlbSB0byBiZSBsb3N0IHdoZW4gdGhlIGF1dG8gZGV0ZWN0IGJpdCBpbgotCSAgIHRoZSBMaW5lQ1RMIGlzIHNldC4gIFRvIG92ZXJjb21lIHRoaXMgdGhlIGF1dG8gZGV0ZWN0IGJpdAotCSAgIHdpbGwgYmUgY2xlYXJlZCB3aGlsc3QgdGVzdGluZyB0aGUgMTAtQmFzZS1UIGludGVyZmFjZS4KLQkgICBUaGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgZm9yIHRoZSBzcGFycm93IGNoaXAgYnV0IGlzCi0JICAgc2ltcGxlciB0byBkbyBpdCBhbnl3YXkuICovCi0Jd3JpdGVyZWcoUFBfTGluZUNUTCwgZXRoX2xpbmVjdGwgJn4gQVVJX09OTFkpOwotCWNvbnRyb2xfZGNfZGMoMCk7Ci0KLSAgICAgICAgLyogRGVsYXkgZm9yIHRoZSBoYXJkd2FyZSB0byB3b3JrIG91dCBpZiB0aGUgVFAgY2FibGUgaXMKLQkgICBwcmVzZW50IC0gMTUwbXMgKi8KLQlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpICsgNDsgY3VycnRpY2tzKCkgPCB0bW87ICk7Ci0KLQlpZiAoKHJlYWRyZWcoUFBfTGluZVNUKSAmIExJTktfT0spID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgewotCi0JCXdyaXRlcmVnKFBQX0F1dG9OZWdDVEwsIGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19NQVNLKTsKLQotCQlpZiAoKGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19CSVRTKSA9PSBBVVRPX05FR19FTkFCTEUpIHsKLQkJCXByaW50ZigiIG5lZ290aWF0aW5nIGR1cGxleC4uLiAiKTsKLQkJCXdoaWxlIChyZWFkcmVnKFBQX0F1dG9OZWdTVCkgJiBBVVRPX05FR19CVVNZKSB7Ci0JCQkJaWYgKGN1cnJ0aWNrcygpIC0gdG1vID4gNDAqVElDS1NfUEVSX1NFQykgewotCQkJCQlwcmludGYoInRpbWUgb3V0ICIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRyZWcoUFBfQXV0b05lZ1NUKSAmIEZEWF9BQ1RJVkUpCi0JCQlwcmludGYoInVzaW5nIGZ1bGwgZHVwbGV4Iik7Ci0JCWVsc2UKLQkJCXByaW50ZigidXNpbmcgaGFsZiBkdXBsZXgiKTsKLQl9Ci0KLQlyZXR1cm4gQV9DTkZfTUVESUFfMTBCX1Q7Ci19Ci0KLS8qIHNlbmQgYSB0ZXN0IHBhY2tldCAtIHJldHVybiB0cnVlIGlmIGNhcnJpZXIgYml0cyBhcmUgb2sgKi8KLXN0YXRpYyBpbnQgc2VuZF90ZXN0X3BrdChzdHJ1Y3QgbmljICpuaWMpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdHBhY2tldFtdID0geyAwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsCi0JCQkJICAgICAwLCA0NiwgLypBIDQ2IGluIG5ldHdvcmsgb3JkZXIgICAgICAgKi8KLQkJCQkgICAgIDAsIDAsICAvKkRTQVA9MCAmIFNTQVA9MCBmaWVsZHMgICAgICAqLwotCQkJCSAgICAgMHhmMywwIC8qQ29udHJvbCAoVGVzdCBSZXErUCBiaXQgc2V0KSovIH07Ci0JdW5zaWduZWQgbG9uZyB0bW87Ci0KLQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpIHwgU0VSSUFMX1RYX09OKTsKLQotCW1lbWNweSh0ZXN0cGFja2V0LCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh0ZXN0cGFja2V0K0VUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCi0Jb3V0dyhUWF9BRlRFUl9BTEwsIGV0aF9uaWNfYmFzZSArIFRYX0NNRF9QT1JUKTsKLQlvdXR3KEVUSF9aTEVOLCBldGhfbmljX2Jhc2UgKyBUWF9MRU5fUE9SVCk7Ci0KLQkvKiBUZXN0IHRvIHNlZSBpZiB0aGUgY2hpcCBoYXMgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIHBhY2tldCAqLwotCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOwotCSAgICAgKHJlYWRyZWcoUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMDsgKQotCQlpZiAoY3VycnRpY2tzKCkgPj0gdG1vKQotCQkJcmV0dXJuKDApOwotCi0JLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KLQlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCB0ZXN0cGFja2V0LAotCSAgICAgIChFVEhfWkxFTisxKT4+MSk7Ci0KLQlwcmludGYoIiBzZW5kaW5nIHRlc3QgcGFja2V0ICIpOwotCS8qIHdhaXQgYSBjb3VwbGUgb2YgdGltZXIgdGlja3MgZm9yIHBhY2tldCB0byBiZSByZWNlaXZlZCAqLwotCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOyBjdXJydGlja3MoKSA8IHRtbzsgKTsKLQotCWlmICgocmVhZHJlZyhQUF9UeEV2ZW50KSAmIFRYX1NFTkRfT0tfQklUUykgPT0gVFhfT0spIHsKLQkJCXByaW50Zigic3VjY2VlZGVkIik7Ci0JCQlyZXR1cm4gMTsKLQl9Ci0JcHJpbnRmKCJmYWlsZWQiKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGRldGVjdF9hdWkoc3RydWN0IG5pYyAqbmljKQotewotCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkFVSSIpOwotCWNvbnRyb2xfZGNfZGMoMCk7Ci0KLQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7Ci0KLQlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7Ci0JCXJldHVybiBBX0NORl9NRURJQV9BVUk7IH0KLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRldGVjdF9ibmMoc3RydWN0IG5pYyAqbmljKQotewotCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkJOQyIpOwotCWNvbnRyb2xfZGNfZGMoMSk7Ci0KLQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7Ci0KLQlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7Ci0JCXJldHVybiBBX0NORl9NRURJQV8xMEJfMjsgfQotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjczg5eDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCWludCAgaTsKLQl1bnNpZ25lZCBsb25nIHJlc2V0X3RtbzsKLQotCXdyaXRlcmVnKFBQX1NlbGZDVEwsIHJlYWRyZWcoUFBfU2VsZkNUTCkgfCBQT1dFUl9PTl9SRVNFVCk7Ci0KLQkvKiB3YWl0IGZvciB0d28gdGlja3M7IHRoYXQgaXMgMio1NW1zICovCi0JZm9yIChyZXNldF90bW8gPSBjdXJydGlja3MoKSArIDI7IGN1cnJ0aWNrcygpIDwgcmVzZXRfdG1vOyApOwotCi0JaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgewotCQkvKiBIYXJkd2FyZSBwcm9ibGVtIHJlcXVpcmVzIFBOUCByZWdpc3RlcnMgdG8gYmUgcmVjb25maWd1cmVkCi0JCSAgIGFmdGVyIGEgcmVzZXQgKi8KLQkJaWYgKGV0aF9pcnEgIT0gMHhGRkZGKSB7Ci0JCQlvdXR3KFBQX0NTODkyMF9JU0FJTlQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQkJCW91dGIoZXRoX2lycSwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKLQkJCW91dGIoMCwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUICsgMSk7IH0KLQotCQlpZiAoZXRoX21lbV9zdGFydCkgewotCQkJb3V0dyhQUF9DUzg5MjBfSVNBTWVtQiwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCQkJb3V0YigoZXRoX21lbV9zdGFydCA+PiA4KSAmIDB4ZmYsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7Ci0JCQlvdXRiKChldGhfbWVtX3N0YXJ0ID4+IDI0KSAmIDB4ZmYsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCArIDEpOyB9IH0KLQotCS8qIFdhaXQgdW50aWwgdGhlIGNoaXAgaXMgcmVzZXQgKi8KLQlmb3IgKHJlc2V0X3RtbyA9IGN1cnJ0aWNrcygpICsgMjsKLQkgICAgIChyZWFkcmVnKFBQX1NlbGZTVCkgJiBJTklUX0RPTkUpID09IDAgJiYKLQkJICAgICBjdXJydGlja3MoKSA8IHJlc2V0X3RtbzsgKTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyBhbmQgbWVtb3J5IGFjY2Vzc2VzICovCi0Jd3JpdGVyZWcoUFBfQnVzQ1RMLCAwKTsKLQotCS8qIHNldCB0aGUgZXRoZXJuZXQgYWRkcmVzcyAqLwotCWZvciAoaT0wOyBpIDwgRVRIX0FMRU4vMjsgaSsrKQotCQl3cml0ZXJlZyhQUF9JQStpKjIsCi0JCQkgbmljLT5ub2RlX2FkZHJbaSoyXSB8Ci0JCQkgKG5pYy0+bm9kZV9hZGRyW2kqMisxXSA8PCA4KSk7Ci0KLQkvKiByZWNlaXZlIG9ubHkgZXJyb3IgZnJlZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGlzIGNhcmQgKi8KLQl3cml0ZXJlZyhQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCk7Ci0KLQkvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gcmVjZWl2ZSBvcGVyYXRpb25zICovCi0Jd3JpdGVyZWcoUFBfUnhDRkcsIDApOwotCi0JLyogZG8gbm90IGdlbmVyYXRlIGFueSBpbnRlcnJ1cHRzIG9uIHRyYW5zbWl0IG9wZXJhdGlvbnMgKi8KLQl3cml0ZXJlZyhQUF9UeENGRywgMCk7Ci0KLQkvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gYnVmZmVyIG9wZXJhdGlvbnMgKi8KLQl3cml0ZXJlZyhQUF9CdWZDRkcsIDApOwotCi0JLyogcmVzZXQgYWRkcmVzcyBwb3J0LCBzbyB0aGF0IGF1dG9wcm9iaW5nIHdpbGwga2VlcCB3b3JraW5nICovCi0Jb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FVEhfVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNzODl4MF90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQlpbnQgICAgICAgICAgIHNyOwotCi0JLyogZG9lcyB0aGlzIHNpemUgaGF2ZSB0byBiZSByb3VuZGVkPz8/IHBsZWFzZSwKLQkgICBzb21lYm9keSBoYXZlIGEgbG9vayBpbiB0aGUgc3BlY3MgKi8KLQlpZiAoKHNyID0gKChzICsgRVRIX0hMRU4gKyAxKSZ+MSkpIDwgRVRIX1pMRU4pCi0JCXNyID0gRVRIX1pMRU47Ci0KLXJldHJ5OgotCS8qIGluaXRpYXRlIGEgdHJhbnNtaXQgc2VxdWVuY2UgKi8KLQlvdXR3KFRYX0FGVEVSX0FMTCwgZXRoX25pY19iYXNlICsgVFhfQ01EX1BPUlQpOwotCW91dHcoc3IsIGV0aF9uaWNfYmFzZSArIFRYX0xFTl9QT1JUKTsKLQotCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCi0JaWYgKChyZWFkcmVnKFBQX0J1c1NUKSAmIFJFQURZX0ZPUl9UWF9OT1cpID09IDApIHsKLQkJLyogT29wcy4uLiB0aGlzIHNob3VsZCBub3QgaGFwcGVuISAqLwotCQlwcmludGYoImNzOiB1bmFibGUgdG8gc2VuZCBwYWNrZXQ7IHJldHJ5aW5nLi4uXG4iKTsKLQkJZm9yICh0bW8gPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsgY3VycnRpY2tzKCkgPCB0bW87ICk7Ci0JCWNzODl4MF9yZXNldChuaWMpOwotCQlnb3RvIHJldHJ5OyB9Ci0KLQkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLwotCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIGQsIEVUSF9BTEVOLzIpOwotCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIG5pYy0+bm9kZV9hZGRyLAotCSAgICAgIEVUSF9BTEVOLzIpOwotCW91dHcoKCh0ID4+IDgpJjB4RkYpfCh0IDw8IDgpLCBldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JUKTsKLQlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCBwLCAocysxKS8yKTsKLQlmb3IgKHNyID0gc3IvMiAtIChzKzEpLzIgLSBFVEhfQUxFTiAtIDE7IHNyLS0gPiAwOwotCSAgICAgb3V0dygwLCBldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JUKSk7Ci0KLQkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBzdWNjZWVkICovCi0JZm9yICh0bW8gPSBjdXJydGlja3MoKSs1KlRJQ0tTX1BFUl9TRUM7Ci0JICAgICAocyA9IHJlYWRyZWcoUFBfVHhFdmVudCkmfjB4MUYpID09IDAgJiYgY3VycnRpY2tzKCkgPCB0bW87KQotCQkvKiBub3RoaW5nICovIDsKLQlpZiAoKHMgJiBUWF9TRU5EX09LX0JJVFMpICE9IFRYX09LKSB7Ci0JCXByaW50ZigiXG50cmFuc21pc3Npb24gZXJyb3IgJSNoWFxuIiwgcyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IGNzODl4MF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gcmVhZHJlZyhQUF9SeEV2ZW50KTsKLQotCWlmICgoc3RhdHVzICYgUlhfT0spID09IDApCi0JCXJldHVybigwKTsKLQotCXN0YXR1cyA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKLQluaWMtPnBhY2tldGxlbiA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKLQlpbnN3KGV0aF9uaWNfYmFzZSArIFJYX0ZSQU1FX1BPUlQsIG5pYy0+cGFja2V0LCBuaWMtPnBhY2tldGxlbiA+PiAxKTsKLQlpZiAobmljLT5wYWNrZXRsZW4gJiAxKQotCQluaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbi0xXSA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY3M4OXgwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCWNzODl4MF9yZXNldChuaWMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSF9QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IG5pYyAqY3M4OXgwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdID0gewotI2lmZGVmCUNTX1NDQU4KLQkJQ1NfU0NBTiwKLSNlbHNlCS8qIHVzZSAiY29uc2VydmF0aXZlIiBkZWZhdWx0IHZhbHVlcyBmb3IgYXV0b3Byb2JpbmcgKi8KLQkJMHgzMDAsMHgzMjAsMHgzNDAsMHgyMDAsMHgyMjAsMHgyNDAsCi0JCTB4MjYwLDB4MjgwLDB4MmEwLDB4MmMwLDB4MmUwLAotCS8qIGlmIHRoYXQgZGlkIG5vdCB3b3JrLCB0aGVuIGJlIG1vcmUgYWdncmVzc2l2ZSAqLwotCQkweDMwMSwweDMyMSwweDM0MSwweDIwMSwweDIyMSwweDI0MSwKLQkJMHgyNjEsMHgyODEsMHgyYTEsMHgyYzEsMHgyZTEsCi0jZW5kaWYKLQkJMH07Ci0KLQlpbnQgICAgICBpLCByZXN1bHQgPSAtMTsKLQl1bnNpZ25lZCByZXZfdHlwZSA9IDAsIGlvYWRkciwgaW9pZHgsIGlzYV9jbmYsIGNzX3JldmlzaW9uOwotCXVuc2lnbmVkIHNob3J0IGVlcHJvbV9idWZmW0NIS1NVTV9MRU5dOwotCi0KLQlmb3IgKGlvaWR4ID0gMDsgKGlvYWRkcj1uZXRjYXJkX3BvcnRsaXN0W2lvaWR4KytdKSAhPSAwOyApIHsKLQkJLyogaWYgdGhleSBnaXZlIHVzIGFuIG9kZCBJL08gYWRkcmVzcywgdGhlbiBkbyBPTkUgd3JpdGUgdG8KLQkJICAgdGhlIGFkZHJlc3MgcG9ydCwgdG8gZ2V0IGl0IGJhY2sgdG8gYWRkcmVzcyB6ZXJvLCB3aGVyZSB3ZQotCQkgICBleHBlY3QgdG8gZmluZCB0aGUgRUlTQSBzaWduYXR1cmUgd29yZC4gKi8KLQkJaWYgKGlvYWRkciAmIDEpIHsKLQkJCWlvYWRkciAmPSB+MTsKLQkJCWlmICgoaW53KGlvYWRkciArIEFERF9QT1JUKSAmIEFERF9NQVNLKSAhPSBBRERfU0lHKQotCQkJCWNvbnRpbnVlOwotCQkJb3V0dyhQUF9DaGlwSUQsIGlvYWRkciArIEFERF9QT1JUKTsKLQkJfQotCi0JCWlmIChpbncoaW9hZGRyICsgREFUQV9QT1JUKSAhPSBDSElQX0VJU0FfSURfU0lHKQotCQkJY29udGludWU7Ci0JCWV0aF9uaWNfYmFzZSA9IGlvYWRkcjsKLQotCQkvKiBnZXQgdGhlIGNoaXAgdHlwZSAqLwotCQlyZXZfdHlwZSA9IHJlYWRyZWcoUFJPRFVDVF9JRF9BREQpOwotCQlldGhfY3NfdHlwZSA9IHJldl90eXBlICZ+IFJFVklTT05fQklUUzsKLQkJY3NfcmV2aXNpb24gPSAoKHJldl90eXBlICYgUkVWSVNPTl9CSVRTKSA+PiA4KSArICdBJzsKLQotCQlwcmludGYoIlxuY3M6IGNzODklYzAlcyByZXYgJWMsIGJhc2UgJSNoWCIsCi0JCSAgICAgICBldGhfY3NfdHlwZT09Q1M4OTAwPycwJzonMicsCi0JCSAgICAgICBldGhfY3NfdHlwZT09Q1M4OTIwTT8iTSI6IiIsCi0JCSAgICAgICBjc19yZXZpc2lvbiwKLQkJICAgICAgIGV0aF9uaWNfYmFzZSk7Ci0KLQkJLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFuIEVFUFJPTSBpcyBhdHRhY2hlZCovCi0JCWlmICgocmVhZHJlZyhQUF9TZWxmU1QpICYgRUVQUk9NX1BSRVNFTlQpID09IDApIHsKLQkJCXByaW50ZigiXG5jczogbm8gRUVQUk9NLi4uXG4iKTsKLQkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0JCQljb250aW51ZTsgfQotCQllbHNlIGlmIChnZXRfZWVwcm9tX2RhdGEoU1RBUlRfRUVQUk9NX0RBVEEsQ0hLU1VNX0xFTiwKLQkJCQkJIGVlcHJvbV9idWZmKSA8IDApIHsKLQkJCXByaW50ZigiXG5jczogRUVQUk9NIHJlYWQgZmFpbGVkLi4uXG4iKTsKLQkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0JCQljb250aW51ZTsgfQotCQllbHNlIGlmIChnZXRfZWVwcm9tX2Noa3N1bShTVEFSVF9FRVBST01fREFUQSxDSEtTVU1fTEVOLAotCQkJCQkgICBlZXByb21fYnVmZikgPCAwKSB7Ci0JCQlwcmludGYoIlxuY3M6IEVFUFJPTSBjaGVja3N1bSBiYWQuLi5cbiIpOwotCQkJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQkJCWNvbnRpbnVlOyB9Ci0KLQkJLyogZ2V0IHRyYW5zbWlzc2lvbiBjb250cm9sIHdvcmQgYnV0IGtlZXAgdGhlCi0JCSAgIGF1dG9uZWdvdGlhdGlvbiBiaXRzICovCi0JCWV0aF9hdXRvX25lZ19jbmYgPSBlZXByb21fYnVmZltBVVRPX05FR19DTkZfT0ZGU0VULzJdOwotCQkvKiBTdG9yZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gKi8KLQkJZXRoX2FkYXB0ZXJfY25mID0gZWVwcm9tX2J1ZmZbQURBUFRFUl9DTkZfT0ZGU0VULzJdOwotCQkvKiBTdG9yZSBJU0EgY29uZmlndXJhdGlvbiAqLwotCQlpc2FfY25mID0gZWVwcm9tX2J1ZmZbSVNBX0NORl9PRkZTRVQvMl07Ci0KLQkJLyogc3RvcmUgdGhlIGluaXRpYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotCQlldGhfbWVtX3N0YXJ0ID0gZWVwcm9tX2J1ZmZbUEFDS0VUX1BBR0VfT0ZGU0VULzJdIDw8IDg7Ci0KLQkJcHJpbnRmKCIlcyVzJXMsIGFkZHIgIiwKLQkJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCk/IiwgUkotNDUiOiIiLAotCQkgICAgICAgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0FVSSk/IiwgQVVJIjoiIiwKLQkJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMik/IiwgQk5DIjoiIik7Ci0KLQkJLyogSWYgdGhpcyBpcyBhIENTODkwMCB0aGVuIG5vIHBucCBzb2Z0ICovCi0JCWlmIChldGhfY3NfdHlwZSAhPSBDUzg5MDAgJiYKLQkJICAgIC8qIENoZWNrIGlmIHRoZSBJU0EgSVJRIGhhcyBiZWVuIHNldCAgKi8KLQkJICAgIChpID0gcmVhZHJlZyhQUF9DUzg5MjBfSVNBSU5UKSAmIDB4ZmYsCi0JCSAgICAgKGkgIT0gMCAmJiBpIDwgQ1M4OTIwX05PX0lOVFMpKSkKLQkJCWV0aF9pcnEgPSBpOwotCQllbHNlIHsKLQkJCWkgPSBpc2FfY25mICYgSU5UX05PX01BU0s7Ci0JCQlpZiAoZXRoX2NzX3R5cGUgPT0gQ1M4OTAwKSB7Ci0JCQkJLyogdGhlIHRhYmxlIHRoYXQgZm9sbG93cyBpcyBkZXBlbmRlbnQKLQkJCQkgICB1cG9uIGhvdyB5b3Ugd2lyZWQgdXAgeW91ciBjczg5MDAKLQkJCQkgICBpbiB5b3VyIHN5c3RlbS4gIFRoZSB0YWJsZSBpcyB0aGUKLQkJCQkgICBzYW1lIGFzIHRoZSBjczg5MDAgZW5naW5lZXJpbmcgZGVtbwotCQkJCSAgIGJvYXJkLiAgaXJxX21hcCBhbHNvIGRlcGVuZHMgb24gdGhlCi0JCQkJICAgY29udGVudHMgb2YgdGhlIHRhYmxlLiAgQWxzbyBzZWUKLQkJCQkgICB3cml0ZV9pcnEsIHdoaWNoIGlzIHRoZSByZXZlcnNlCi0JCQkJICAgbWFwcGluZyBvZiB0aGUgdGFibGUgYmVsb3cuICovCi0JCQkJaWYgKGkgPCA0KSBpID0gIlwwMTJcMDEzXDAxNFwwMDUiW2ldOwotCQkJCWVsc2UgcHJpbnRmKCJcbmNzOiBCVUc6IGlzYV9jb25maWcgaXMgJWRcbiIsIGkpOyB9Ci0JCQlldGhfaXJxID0gaTsgfQotCi0JCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KLQkJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgewotCQkJbmljLT5ub2RlX2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKillZXByb21fYnVmZilbaV07Ci0JCX0KLQkJcHJpbnRmKCIlIVxuIiwgbmljLT5ub2RlX2FkZHIpOwotCi0JCS8qIFNldCB0aGUgTGluZUNUTCBxdWludHVwbGV0IGJhc2VkIG9uIGFkYXB0ZXIKLQkJICAgY29uZmlndXJhdGlvbiByZWFkIGZyb20gRUVQUk9NICovCi0JCWlmICgoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfRVhUTkRfMTBCXzIpICYmCi0JCSAgICAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfTE9XX1JYX1NRVUVMQ0gpKQotCQkJZXRoX2xpbmVjdGwgPSBMT1dfUlhfU1FVRUxDSDsKLQkJZWxzZQotCQkJZXRoX2xpbmVjdGwgPSAwOwotCi0JCS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgaGF2ZSB0aGUgInJpZ2h0IgotCQkgICBoYXJkd2FyZSBhdmFpbGFibGUgKi8KLQkJc3dpdGNoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX01FRElBX1RZUEUpIHsKLQkJY2FzZSBBX0NORl9NRURJQV8xMEJfVDogcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV9BVUk6ICAgcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfQVVJOwotCQkJYnJlYWs7Ci0JCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHJlc3VsdCA9IGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IHJlc3VsdCA9IGV0aF9hZGFwdGVyX2NuZiAmIChBX0NORl8xMEJfVCB8IEFfQ05GX0FVSSB8Ci0JCQkJCQkgICAgIEFfQ05GXzEwQl8yKTsKLQkJfQotCQlpZiAoIXJlc3VsdCkgewotCQkJcHJpbnRmKCJjczogRUVQUk9NIGlzIGNvbmZpZ3VyZWQgZm9yIHVuYXZhaWxhYmxlIG1lZGlhXG4iKTsKLQkJZXJyb3I6Ci0JCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpICYKLQkJCQkgfihTRVJJQUxfVFhfT04gfCBTRVJJQUxfUlhfT04pKTsKLQkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgZm9yIHByb2Jpbmcgb2YgdGhlIGF0dGFjaGVkIG1lZGlhICovCi0JCWNzODl4MF9yZXNldChuaWMpOwotCi0JCS8qIHNldCB0aGUgaGFyZHdhcmUgdG8gdGhlIGNvbmZpZ3VyZWQgY2hvaWNlICovCi0JCXN3aXRjaChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9NRURJQV9UWVBFKSB7Ci0JCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6Ci0JCQlyZXN1bHQgPSBkZXRlY3RfdHAoKTsKLQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJY2xybGluZSgpOwotCQkJCXByaW50ZigiMTBCYXNlLVQgKFJKLTQ1JXMiLAotCQkJCSAgICAgICAiKSBoYXMgbm8gY2FibGVcbiIpOyB9Ci0JCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLwotCQkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQotCQkJCS8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgc2VlIGEgbGluayBwdWxzZSAqLwotCQkJCXJlc3VsdCA9IEFfQ05GX01FRElBXzEwQl9UOwotCQkJYnJlYWs7Ci0JCWNhc2UgQV9DTkZfTUVESUFfQVVJOgotCQkJcmVzdWx0ID0gZGV0ZWN0X2F1aShuaWMpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQljbHJsaW5lKCk7Ci0JCQkJcHJpbnRmKCIxMEJhc2UtNSAoQVVJJXMiLAotCQkJCSAgICAgICAiKSBoYXMgbm8gY2FibGVcbiIpOyB9Ci0JCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLwotCQkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQotCQkJCS8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgc2VlIGEgY2FycnJpZXIgKi8KLQkJCQlyZXN1bHQgPSBBX0NORl9NRURJQV9BVUk7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV8xMEJfMjoKLQkJCXJlc3VsdCA9IGRldGVjdF9ibmMobmljKTsKLQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJY2xybGluZSgpOwotCQkJCXByaW50ZigiMTBCYXNlLTIgKEJOQyVzIiwKLQkJCQkgICAgICAgIikgaGFzIG5vIGNhYmxlXG4iKTsgfQotCQkJLyogY2hlY2sgImlnbm9yZSBtaXNzaW5nIG1lZGlhIiBiaXQgKi8KLQkJCWlmIChldGhfYXV0b19uZWdfY25mICYgSU1NX0JJVCkKLQkJCQkvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIGNhbiB4bWl0IGEgcGFja2V0ICovCi0JCQkJcmVzdWx0ID0gQV9DTkZfTUVESUFfMTBCXzI7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV9BVVRPOgotCQkJd3JpdGVyZWcoUFBfTGluZUNUTCwgZXRoX2xpbmVjdGwgfCBBVVRPX0FVSV8xMEJBU0VUKTsKLQkJCWlmIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCkKLQkJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF90cCgpKSAhPSAwKQotCQkJCQlicmVhazsKLQkJCWlmIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9BVUkpCi0JCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYXVpKG5pYykpICE9IDApCi0JCQkJCWJyZWFrOwotCQkJaWYgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yKQotCQkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X2JuYyhuaWMpKSAhPSAwKQotCQkJCQlicmVhazsKLQkJCWNscmxpbmUoKTsgcHJpbnRmKCJubyBtZWRpYSBkZXRlY3RlZFxuIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWNscmxpbmUoKTsKLQkJc3dpdGNoKHJlc3VsdCkgewotCQljYXNlIDA6ICAgICAgICAgICAgICAgICBwcmludGYoIm5vIG5ldHdvcmsgY2FibGUgYXR0YWNoZWQgdG8gY29uZmlndXJlZCBtZWRpYVxuIik7Ci0JCQlnb3RvIGVycm9yOwotCQljYXNlIEFfQ05GX01FRElBXzEwQl9UOiBwcmludGYoInVzaW5nIDEwQmFzZS1UIChSSi00NSlcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQV9DTkZfTUVESUFfQVVJOiAgIHByaW50ZigidXNpbmcgMTBCYXNlLTUgKEFVSSlcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHByaW50ZigidXNpbmcgMTBCYXNlLTIgKEJOQylcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBUdXJuIG9uIGJvdGggcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucyAqLwotCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpIHwgU0VSSUFMX1JYX09OIHwKLQkJCSBTRVJJQUxfVFhfT04pOwotCi0JCWJyZWFrOwotCX0KLQotCWlmIChpb2FkZHIgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQluaWMtPnJlc2V0ID0gY3M4OXgwX3Jlc2V0OwotCW5pYy0+cG9sbCA9IGNzODl4MF9wb2xsOwotCW5pYy0+dHJhbnNtaXQgPSBjczg5eDBfdHJhbnNtaXQ7Ci0JbmljLT5kaXNhYmxlID0gY3M4OXgwX2Rpc2FibGU7Ci0JcmV0dXJuIChuaWMpOwotfQotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KLQpJbmRleDogYi9uZXRib290L2NzODl4MC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9jczg5eDAuaAorKysgYi9uZXRib290L2NzODl4MC5oCkBAIC0xNiw0NjQgKzE2LDMgQEAKICAgIC0tIHF1b3RlIGZyb20gZW1haWwKICoqLwogCi0vKiAgQ29weXJpZ2h0LCAxOTg4LTE5OTIsIFJ1c3NlbGwgTmVsc29uLCBDcnlud3IgU29mdHdhcmUKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDEuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jZGVmaW5lIFBQX0NoaXBJRCAweDAwMDAJLyogb2Zmc2V0ICAgMGggLT4gQ29ycCAtSUQgICAgICAgICAgICAgICovCi0JCQkJLyogb2Zmc2V0ICAgMmggLT4gTW9kZWwvUHJvZHVjdCBOdW1iZXIgICovCi0JCQkJLyogb2Zmc2V0ICAgM2ggLT4gQ2hpcCBSZXZpc2lvbiBOdW1iZXIgICovCi0KLSNkZWZpbmUgUFBfSVNBSU9CIDB4MDAyMAkvKiAgSU8gYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIFBQX0NTODkwMF9JU0FJTlQgMHgwMDIyCS8qICBJU0EgaW50ZXJydXB0IHNlbGVjdCAqLwotI2RlZmluZSBQUF9DUzg5MjBfSVNBSU5UIDB4MDM3MAkvKiAgSVNBIGludGVycnVwdCBzZWxlY3QgKi8KLSNkZWZpbmUgUFBfQ1M4OTAwX0lTQURNQSAweDAwMjQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KLSNkZWZpbmUgUFBfQ1M4OTIwX0lTQURNQSAweDAzNzQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KLSNkZWZpbmUgUFBfSVNBU09GIDB4MDAyNgkvKiAgSVNBIERNQSBvZmZzZXQgKi8KLSNkZWZpbmUgUFBfRG1hRnJhbWVDbnQgMHgwMDI4CS8qICBJU0EgRE1BIEZyYW1lIGNvdW50ICovCi0jZGVmaW5lIFBQX0RtYUJ5dGVDbnQgMHgwMDJBCS8qICBJU0EgRE1BIEJ5dGUgY291bnQgKi8KLSNkZWZpbmUgUFBfQ1M4OTAwX0lTQU1lbUIgMHgwMDJDCS8qICBNZW1vcnkgYmFzZSAqLwotI2RlZmluZSBQUF9DUzg5MjBfSVNBTWVtQiAweDAzNDggLyogICovCi0KLSNkZWZpbmUgUFBfSVNBQm9vdEJhc2UgMHgwMDMwCS8qICBCb290IFByb20gYmFzZSAgKi8KLSNkZWZpbmUgUFBfSVNBQm9vdE1hc2sgMHgwMDM0CS8qICBCb290IFByb20gTWFzayAqLwotCi0vKiBFRVBST00gZGF0YSBhbmQgY29tbWFuZCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFBfRUVDTUQgMHgwMDQwCQkvKiAgTlZSIEludGVyZmFjZSBDb21tYW5kIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX0VFRGF0YSAweDAwNDIJLyogIE5WUiBJbnRlcmZhY2UgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9EZWJ1Z1JlZyAweDAwNDQJLyogIERlYnVnIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgUFBfUnhDRkcgMHgwMTAyCQkvKiAgUnggQnVzIGNvbmZpZyAqLwotI2RlZmluZSBQUF9SeENUTCAweDAxMDQJCS8qICBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfVHhDRkcgMHgwMTA2CQkvKiAgVHJhbnNtaXQgQ29uZmlnIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX1R4Q01EIDB4MDEwOAkJLyogIFRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfQnVmQ0ZHIDB4MDEwQQkvKiAgQnVzIGNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfTGluZUNUTCAweDAxMTIJLyogIExpbmUgQ29uZmlnIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX1NlbGZDVEwgMHgwMTE0CS8qICBTZWxmIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfQnVzQ1RMIDB4MDExNgkvKiAgSVNBIGJ1cyBjb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX1Rlc3RDVEwgMHgwMTE4CS8qICBUZXN0IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX0F1dG9OZWdDVEwgMHgwMTFDCS8qICBBdXRvIE5lZ290aWF0aW9uIEN0cmwgKi8KLQotI2RlZmluZSBQUF9JU1EgMHgwMTIwCQkvKiAgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBQUF9SeEV2ZW50IDB4MDEyNAkvKiAgUnggRXZlbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfVHhFdmVudCAweDAxMjgJLyogIFR4IEV2ZW50IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX0J1ZkV2ZW50IDB4MDEyQwkvKiAgQnVzIEV2ZW50IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX1J4TWlzcyAweDAxMzAJLyogIFJlY2VpdmUgTWlzcyBDb3VudCAqLwotI2RlZmluZSBQUF9UeENvbCAweDAxMzIJCS8qICBUcmFuc21pdCBDb2xsaXNpb24gQ291bnQgKi8KLSNkZWZpbmUgUFBfTGluZVNUIDB4MDEzNAkvKiAgTGluZSBTdGF0ZSBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9TZWxmU1QgMHgwMTM2CS8qICBTZWxmIFN0YXRlIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX0J1c1NUIDB4MDEzOAkJLyogIEJ1cyBTdGF0dXMgKi8KLSNkZWZpbmUgUFBfVERSIDB4MDEzQwkJLyogIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KLSNkZWZpbmUgUFBfQXV0b05lZ1NUIDB4MDEzRQkvKiAgQXV0byBOZWcgU3RhdHVzICovCi0jZGVmaW5lIFBQX1R4Q29tbWFuZCAweDAxNDQJLyogIFR4IENvbW1hbmQgKi8KLSNkZWZpbmUgUFBfVHhMZW5ndGggMHgwMTQ2CS8qICBUeCBMZW5ndGggKi8KLSNkZWZpbmUgUFBfTEFGIDB4MDE1MAkJLyogIEhhc2ggVGFibGUgKi8KLSNkZWZpbmUgUFBfSUEgMHgwMTU4CQkvKiAgUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFBQX1J4U3RhdHVzIDB4MDQwMAkvKiAgUmVjZWl2ZSBzdGFydCBvZiBmcmFtZSAqLwotI2RlZmluZSBQUF9SeExlbmd0aCAweDA0MDIJLyogIFJlY2VpdmUgTGVuZ3RoIG9mIGZyYW1lICovCi0jZGVmaW5lIFBQX1J4RnJhbWUgMHgwNDA0CS8qICBSZWNlaXZlIGZyYW1lIHBvaW50ZXIgKi8KLSNkZWZpbmUgUFBfVHhGcmFtZSAweDBBMDAJLyogIFRyYW5zbWl0IGZyYW1lIHBvaW50ZXIgKi8KLQotLyogIFByaW1hcnkgSS9PIEJhc2UgQWRkcmVzcy4gSWYgbm8gSS9PIGJhc2UgaXMgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIHRoZW4gdGhpcyAqLwotLyogIGNhbiBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IEkvTyBiYXNlIHRvIGFjY2VzcyB0aGUgUGFja2V0UGFnZSBBcmVhLiAqLwotI2RlZmluZSBERUZBVUxUSU9CQVNFIDB4MDMwMAotI2RlZmluZSBGSVJTVF9JTyAweDAyMEMJCS8qICBGaXJzdCBJL08gcG9ydCB0byBjaGVjayAqLwotI2RlZmluZSBMQVNUX0lPIDB4MDM3QwkJLyogIExhc3QgSS9PIHBvcnQgdG8gY2hlY2sgKCsxMGgpICovCi0jZGVmaW5lIEFERF9NQVNLIDB4MzAwMAkJLyogIE1hc2sgaXQgdXNlIG9mIHRoZSBBRERfUE9SVCByZWdpc3RlciAqLwotI2RlZmluZSBBRERfU0lHIDB4MzAwMAkJLyogIEV4cGVjdGVkIElEIHNpZ25hdHVyZSAqLwotCi0jZGVmaW5lIENISVBfRUlTQV9JRF9TSUcgMHg2MzBFICAgLyogIFByb2R1Y3QgSUQgQ29kZSBmb3IgQ3J5c3RhbCBDaGlwIChDUzg5MDAgc3BlYyA0LjMpICovCi0KLSNpZmRlZglJQk1FSVBLVAotI2RlZmluZSBFSVNBX0lEX1NJRyAweDREMjQJLyogIElCTSAqLwotI2RlZmluZSBQQVJUX05PX1NJRyAweDEwMTAJLyogIElCTSAqLwotI2RlZmluZSBNT05HT09TRV9CSVQgMHgwMDAwCS8qICBJQk0gKi8KLSNlbHNlCi0jZGVmaW5lIEVJU0FfSURfU0lHIDB4NjMwRQkvKiAgUG5QIFZlbmRvciBJRCAoc2FtZSBhcyBjaGlwIGlkIGZvciBDcnlzdGFsIGJvYXJkKSAqLwotI2RlZmluZSBQQVJUX05PX1NJRyAweDQwMDAJLyogIElEIGNvZGUgQ1M4OTIwIGJvYXJkIChQblAgVmVuZG9yIFByb2R1Y3QgY29kZSkgKi8KLSNkZWZpbmUgTU9OR09PU0VfQklUIDB4MjAwMAkvKiAgUEFSVF9OT19TSUcgKyBNT05HT09TRV9CVVQgPT4gSUQgb2YgbW9uZ29vc2UgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFBST0RVQ1RfSURfQUREIDB4MDAwMiAgIC8qICBBZGRyZXNzIG9mIHByb2R1Y3QgSUQgKi8KLQotLyogIE1hc2sgdG8gZmluZCBvdXQgdGhlIHR5cGVzIG9mICByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVHX1RZUEVfTUFTSyAweDAwMUYKLQotLyogIEVlcHJvbSBDb21tYW5kcyAqLwotI2RlZmluZSBFUlNFX1dSX0VOQkwgMHgwMEYwCi0jZGVmaW5lIEVSU0VfV1JfRElTQUJMRSAweDAwMDAKLQotLyogIERlZmluZXMgQ29udHJvbC9Db25maWcgcmVnaXN0ZXIgcXVpbnR1cGxldCBudW1iZXJzICovCi0jZGVmaW5lIFJYX0JVRl9DRkcgMHgwMDAzCi0jZGVmaW5lIFJYX0NPTlRST0wgMHgwMDA1Ci0jZGVmaW5lIFRYX0NGRyAweDAwMDcKLSNkZWZpbmUgVFhfQ09NTUFORCAweDAwMDkKLSNkZWZpbmUgQlVGX0NGRyAweDAwMEIKLSNkZWZpbmUgTElORV9DT05UUk9MIDB4MDAxMwotI2RlZmluZSBTRUxGX0NPTlRST0wgMHgwMDE1Ci0jZGVmaW5lIEJVU19DT05UUk9MIDB4MDAxNwotI2RlZmluZSBURVNUX0NPTlRST0wgMHgwMDE5Ci0KLS8qICBEZWZpbmVzIFN0YXR1cy9Db3VudCByZWdpc3RlcnMgcXVpbnR1cGxldCBudW1iZXJzICovCi0jZGVmaW5lIFJYX0VWRU5UIDB4MDAwNAotI2RlZmluZSBUWF9FVkVOVCAweDAwMDgKLSNkZWZpbmUgQlVGX0VWRU5UIDB4MDAwQwotI2RlZmluZSBSWF9NSVNTX0NPVU5UIDB4MDAxMAotI2RlZmluZSBUWF9DT0xfQ09VTlQgMHgwMDEyCi0jZGVmaW5lIExJTkVfU1RBVFVTIDB4MDAxNAotI2RlZmluZSBTRUxGX1NUQVRVUyAweDAwMTYKLSNkZWZpbmUgQlVTX1NUQVRVUyAweDAwMTgKLSNkZWZpbmUgVERSIDB4MDAxQwotCi0vKiBQUF9SeENGRyAtIFJlY2VpdmUgIENvbmZpZ3VyYXRpb24gYW5kIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gIFJlYWQvd3JpdGUgKi8KLSNkZWZpbmUgU0tJUF8xIDB4MDA0MAotI2RlZmluZSBSWF9TVFJFQU1fRU5CTCAweDAwODAKLSNkZWZpbmUgUlhfT0tfRU5CTCAweDAxMDAKLSNkZWZpbmUgUlhfRE1BX09OTFkgMHgwMjAwCi0jZGVmaW5lIEFVVE9fUlhfRE1BIDB4MDQwMAotI2RlZmluZSBCVUZGRVJfQ1JDIDB4MDgwMAotI2RlZmluZSBSWF9DUkNfRVJST1JfRU5CTCAweDEwMDAKLSNkZWZpbmUgUlhfUlVOVF9FTkJMIDB4MjAwMAotI2RlZmluZSBSWF9FWFRSQV9EQVRBX0VOQkwgMHg0MDAwCi0KLS8qIFBQX1J4Q1RMIC0gUmVjZWl2ZSBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBSWF9JQV9IQVNIX0FDQ0VQVCAweDAwNDAKLSNkZWZpbmUgUlhfUFJPTV9BQ0NFUFQgMHgwMDgwCi0jZGVmaW5lIFJYX09LX0FDQ0VQVCAweDAxMDAKLSNkZWZpbmUgUlhfTVVMVENBU1RfQUNDRVBUIDB4MDIwMAotI2RlZmluZSBSWF9JQV9BQ0NFUFQgMHgwNDAwCi0jZGVmaW5lIFJYX0JST0FEQ0FTVF9BQ0NFUFQgMHgwODAwCi0jZGVmaW5lIFJYX0JBRF9DUkNfQUNDRVBUIDB4MTAwMAotI2RlZmluZSBSWF9SVU5UX0FDQ0VQVCAweDIwMDAKLSNkZWZpbmUgUlhfRVhUUkFfREFUQV9BQ0NFUFQgMHg0MDAwCi0jZGVmaW5lIFJYX0FMTF9BQ0NFUFQgKFJYX1BST01fQUNDRVBUfFJYX0JBRF9DUkNfQUNDRVBUfFJYX1JVTlRfQUNDRVBUfFJYX0VYVFJBX0RBVEFfQUNDRVBUKQotLyogIERlZmF1bHQgcmVjZWl2ZSBtb2RlIC0gaW5kaXZpZHVhbGx5IGFkZHJlc3NlZCwgYnJvYWRjYXN0LCBhbmQgZXJyb3IgZnJlZSAqLwotI2RlZmluZSBERUZfUlhfQUNDRVBUIChSWF9JQV9BQ0NFUFQgfCBSWF9CUk9BRENBU1RfQUNDRVBUIHwgUlhfT0tfQUNDRVBUKQotCi0vKiBQUF9UeENGRyAtIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCi0jZGVmaW5lIFRYX0xPU1RfQ1JTX0VOQkwgMHgwMDQwCi0jZGVmaW5lIFRYX1NRRV9FUlJPUl9FTkJMIDB4MDA4MAotI2RlZmluZSBUWF9PS19FTkJMIDB4MDEwMAotI2RlZmluZSBUWF9MQVRFX0NPTF9FTkJMIDB4MDIwMAotI2RlZmluZSBUWF9KQlJfRU5CTCAweDA0MDAKLSNkZWZpbmUgVFhfQU5ZX0NPTF9FTkJMIDB4MDgwMAotI2RlZmluZSBUWF8xNl9DT0xfRU5CTCAweDgwMDAKLQotLyogUFBfVHhDTUQgLSBUcmFuc21pdCBDb21tYW5kIGJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCi0jZGVmaW5lIFRYX1NUQVJUXzRfQllURVMgMHgwMDAwCi0jZGVmaW5lIFRYX1NUQVJUXzY0X0JZVEVTIDB4MDA0MAotI2RlZmluZSBUWF9TVEFSVF8xMjhfQllURVMgMHgwMDgwCi0jZGVmaW5lIFRYX1NUQVJUX0FMTF9CWVRFUyAweDAwQzAKLSNkZWZpbmUgVFhfRk9SQ0UgMHgwMTAwCi0jZGVmaW5lIFRYX09ORV9DT0wgMHgwMjAwCi0jZGVmaW5lIFRYX1RXT19QQVJUX0RFRkZfRElTQUJMRSAweDA0MDAKLSNkZWZpbmUgVFhfTk9fQ1JDIDB4MTAwMAotI2RlZmluZSBUWF9SVU5UIDB4MjAwMAotCi0vKiBQUF9CdWZDRkcgLSBCdWZmZXIgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KLSNkZWZpbmUgR0VORVJBVEVfU1dfSU5URVJSVVBUIDB4MDA0MAotI2RlZmluZSBSWF9ETUFfRU5CTCAweDAwODAKLSNkZWZpbmUgUkVBRFlfRk9SX1RYX0VOQkwgMHgwMTAwCi0jZGVmaW5lIFRYX1VOREVSUlVOX0VOQkwgMHgwMjAwCi0jZGVmaW5lIFJYX01JU1NfRU5CTCAweDA0MDAKLSNkZWZpbmUgUlhfMTI4X0JZVEVfRU5CTCAweDA4MDAKLSNkZWZpbmUgVFhfQ09MX0NPVU5UX09WUkZMT1dfRU5CTCAweDEwMDAKLSNkZWZpbmUgUlhfTUlTU19DT1VOVF9PVlJGTE9XX0VOQkwgMHgyMDAwCi0jZGVmaW5lIFJYX0RFU1RfTUFUQ0hfRU5CTCAweDgwMDAKLQotLyogUFBfTGluZUNUTCAtIExpbmUgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KLSNkZWZpbmUgU0VSSUFMX1JYX09OIDB4MDA0MAotI2RlZmluZSBTRVJJQUxfVFhfT04gMHgwMDgwCi0jZGVmaW5lIEFVSV9PTkxZIDB4MDEwMAotI2RlZmluZSBBVVRPX0FVSV8xMEJBU0VUIDB4MDIwMAotI2RlZmluZSBNT0RJRklFRF9CQUNLT0ZGIDB4MDgwMAotI2RlZmluZSBOT19BVVRPX1BPTEFSSVRZIDB4MTAwMAotI2RlZmluZSBUV09fUEFSVF9ERUZESVMgMHgyMDAwCi0jZGVmaW5lIExPV19SWF9TUVVFTENIIDB4NDAwMAotCi0vKiBQUF9TZWxmQ1RMIC0gU29mdHdhcmUgU2VsZiBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBQT1dFUl9PTl9SRVNFVCAweDAwNDAKLSNkZWZpbmUgU1dfU1RPUCAweDAxMDAKLSNkZWZpbmUgU0xFRVBfT04gMHgwMjAwCi0jZGVmaW5lIEFVVE9fV0FLRVVQIDB4MDQwMAotI2RlZmluZSBIQ0IwX0VOQkwgMHgxMDAwCi0jZGVmaW5lIEhDQjFfRU5CTCAweDIwMDAKLSNkZWZpbmUgSENCMCAweDQwMDAKLSNkZWZpbmUgSENCMSAweDgwMDAKLQotLyogUFBfQnVzQ1RMIC0gSVNBIEJ1cyBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBSRVNFVF9SWF9ETUEgMHgwMDQwCi0jZGVmaW5lIE1FTU9SWV9PTiAweDA0MDAKLSNkZWZpbmUgRE1BX0JVUlNUX01PREUgMHgwODAwCi0jZGVmaW5lIElPX0NIQU5ORUxfUkVBRFlfT04gMHgxMDAwCi0jZGVmaW5lIFJYX0RNQV9TSVpFXzY0SyAweDIwMDAKLSNkZWZpbmUgRU5BQkxFX0lSUSAweDgwMDAKLQotLyogUFBfVGVzdENUTCAtIFRlc3QgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KLSNkZWZpbmUgTElOS19PRkYgMHgwMDgwCi0jZGVmaW5lIEVOREVDX0xPT1BCQUNLIDB4MDIwMAotI2RlZmluZSBBVUlfTE9PUEJBQ0sgMHgwNDAwCi0jZGVmaW5lIEJBQ0tPRkZfT0ZGIDB4MDgwMAotI2RlZmluZSBGQVNUX1RFU1QgMHg4MDAwCi0KLS8qIFBQX1J4RXZlbnQgLSBSZWNlaXZlIEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCi0jZGVmaW5lIFJYX0lBX0hBU0hFRCAweDAwNDAKLSNkZWZpbmUgUlhfRFJJQkJMRSAweDAwODAKLSNkZWZpbmUgUlhfT0sgMHgwMTAwCi0jZGVmaW5lIFJYX0hBU0hFRCAweDAyMDAKLSNkZWZpbmUgUlhfSUEgMHgwNDAwCi0jZGVmaW5lIFJYX0JST0FEQ0FTVCAweDA4MDAKLSNkZWZpbmUgUlhfQ1JDX0VSUk9SIDB4MTAwMAotI2RlZmluZSBSWF9SVU5UIDB4MjAwMAotI2RlZmluZSBSWF9FWFRSQV9EQVRBIDB4NDAwMAotCi0jZGVmaW5lIEhBU0hfSU5ERVhfTUFTSyAweDBGQzAwCi0KLS8qIFBQX1R4RXZlbnQgLSBUcmFuc21pdCBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLwotI2RlZmluZSBUWF9MT1NUX0NSUyAweDAwNDAKLSNkZWZpbmUgVFhfU1FFX0VSUk9SIDB4MDA4MAotI2RlZmluZSBUWF9PSyAweDAxMDAKLSNkZWZpbmUgVFhfTEFURV9DT0wgMHgwMjAwCi0jZGVmaW5lIFRYX0pCUiAweDA0MDAKLSNkZWZpbmUgVFhfMTZfQ09MIDB4ODAwMAotI2RlZmluZSBUWF9TRU5EX09LX0JJVFMgKFRYX09LfFRYX0xPU1RfQ1JTKQotI2RlZmluZSBUWF9DT0xfQ09VTlRfTUFTSyAweDc4MDAKLQotLyogUFBfQnVmRXZlbnQgLSBCdWZmZXIgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KLSNkZWZpbmUgU1dfSU5URVJSVVBUIDB4MDA0MAotI2RlZmluZSBSWF9ETUEgMHgwMDgwCi0jZGVmaW5lIFJFQURZX0ZPUl9UWCAweDAxMDAKLSNkZWZpbmUgVFhfVU5ERVJSVU4gMHgwMjAwCi0jZGVmaW5lIFJYX01JU1MgMHgwNDAwCi0jZGVmaW5lIFJYXzEyOF9CWVRFIDB4MDgwMAotI2RlZmluZSBUWF9DT0xfT1ZSRkxXIDB4MTAwMAotI2RlZmluZSBSWF9NSVNTX09WUkZMVyAweDIwMDAKLSNkZWZpbmUgUlhfREVTVF9NQVRDSCAweDgwMDAKLQotLyogUFBfTGluZVNUIC0gRXRoZXJuZXQgTGluZSBTdGF0dXMgYml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KLSNkZWZpbmUgTElOS19PSyAweDAwODAKLSNkZWZpbmUgQVVJX09OIDB4MDEwMAotI2RlZmluZSBURU5CQVNFVF9PTiAweDAyMDAKLSNkZWZpbmUgUE9MQVJJVFlfT0sgMHgxMDAwCi0jZGVmaW5lIENSU19PSyAweDQwMDAKLQotLyogUFBfU2VsZlNUIC0gQ2hpcCBTb2Z0d2FyZSBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUgQUNUSVZFXzMzViAweDAwNDAKLSNkZWZpbmUgSU5JVF9ET05FIDB4MDA4MAotI2RlZmluZSBTSV9CVVNZIDB4MDEwMAotI2RlZmluZSBFRVBST01fUFJFU0VOVCAweDAyMDAKLSNkZWZpbmUgRUVQUk9NX09LIDB4MDQwMAotI2RlZmluZSBFTF9QUkVTRU5UIDB4MDgwMAotI2RlZmluZSBFRV9TSVpFXzY0IDB4MTAwMAotCi0vKiBQUF9CdXNTVCAtIElTQSBCdXMgU3RhdHVzIGJpdCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFRYX0JJRF9FUlJPUiAweDAwODAKLSNkZWZpbmUgUkVBRFlfRk9SX1RYX05PVyAweDAxMDAKLQotLyogUFBfQXV0b05lZ0NUTCAtIEF1dG8gTmVnb3RpYXRpb24gQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBSRV9ORUdfTk9XIDB4MDA0MAotI2RlZmluZSBBTExPV19GRFggMHgwMDgwCi0jZGVmaW5lIEFVVE9fTkVHX0VOQUJMRSAweDAxMDAKLSNkZWZpbmUgTkxQX0VOQUJMRSAweDAyMDAKLSNkZWZpbmUgRk9SQ0VfRkRYIDB4ODAwMAotI2RlZmluZSBBVVRPX05FR19CSVRTIChGT1JDRV9GRFh8TkxQX0VOQUJMRXxBVVRPX05FR19FTkFCTEUpCi0jZGVmaW5lIEFVVE9fTkVHX01BU0sgKEZPUkNFX0ZEWHxOTFBfRU5BQkxFfEFVVE9fTkVHX0VOQUJMRXxBTExPV19GRFh8UkVfTkVHX05PVykKLQotLyogUFBfQXV0b05lZ1NUIC0gQXV0byBOZWdvdGlhdGlvbiBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUgQVVUT19ORUdfQlVTWSAweDAwODAKLSNkZWZpbmUgRkxQX0xJTksgMHgwMTAwCi0jZGVmaW5lIEZMUF9MSU5LX0dPT0QgMHgwODAwCi0jZGVmaW5lIExJTktfRkFVTFQgMHgxMDAwCi0jZGVmaW5lIEhEWF9BQ1RJVkUgMHg0MDAwCi0jZGVmaW5lIEZEWF9BQ1RJVkUgMHg4MDAwCi0KLS8qICBUaGUgZm9sbG93aW5nIGJsb2NrIGRlZmluZXMgdGhlIElTUSBldmVudCB0eXBlcyAqLwotI2RlZmluZSBJU1FfUkVDRUlWRVJfRVZFTlQgMHgwNAotI2RlZmluZSBJU1FfVFJBTlNNSVRURVJfRVZFTlQgMHgwOAotI2RlZmluZSBJU1FfQlVGRkVSX0VWRU5UIDB4MGMKLSNkZWZpbmUgSVNRX1JYX01JU1NfRVZFTlQgMHgxMAotI2RlZmluZSBJU1FfVFhfQ09MX0VWRU5UIDB4MTIKLQotI2RlZmluZSBJU1FfRVZFTlRfTUFTSyAweDAwM0YgICAvKiAgSVNRIG1hc2sgdG8gZmluZCBvdXQgdHlwZSBvZiBldmVudCAqLwotI2RlZmluZSBJU1FfSElTVCAxNgkJLyogIHNtYWxsIGhpc3RvcnkgYnVmZmVyICovCi0jZGVmaW5lIEFVVE9JTkNSRU1FTlQgMHg4MDAwCS8qICBCaXQgbWFzayB0byBzZXQgYml0LTE1IGZvciBhdXRvaW5jcmVtZW50ICovCi0KLSNkZWZpbmUgVFhSWEJVRlNJWkUgMHgwNjAwCi0jZGVmaW5lIFJYRE1BQlVGU0laRSAweDgwMDAKLSNkZWZpbmUgUlhETUFTSVpFIDB4NDAwMAotI2RlZmluZSBUWFJYX0xFTkdUSF9NQVNLIDB4MDdGRgotCi0vKiAgcnggb3B0aW9ucyBiaXRzICovCi0jZGVmaW5lIFJDVl9XSVRIX1JYT04JMSAgICAgICAvKiAgU2V0IFNlclJ4IE9OICovCi0jZGVmaW5lIFJDVl9DT1VOVFMJMiAgICAgICAvKiAgVXNlIEZyYW1lY250MSAqLwotI2RlZmluZSBSQ1ZfUE9ORwk0ICAgICAgIC8qICBQb25nIHJlc3BvbmRlbnQgKi8KLSNkZWZpbmUgUkNWX0RPTkcJOCAgICAgICAvKiAgRG9uZyBvcGVyYXRpb24gKi8KLSNkZWZpbmUgUkNWX1BPTExJTkcJMHgxMAkvKiAgUG9sbCBSeEV2ZW50ICovCi0jZGVmaW5lIFJDVl9JU1EJCTB4MjAJLyogIFVzZSBJU1EsIGludCAqLwotI2RlZmluZSBSQ1ZfQVVUT19ETUEJMHgxMDAJLyogIFNldCBBdXRvUnhETUFFICovCi0jZGVmaW5lIFJDVl9ETUEJCTB4MjAwCS8qICBTZXQgUnhETUEgb25seSAqLwotI2RlZmluZSBSQ1ZfRE1BX0FMTAkweDQwMAkvKiAgQ29weSBhbGwgRE1BJ2VkICovCi0jZGVmaW5lIFJDVl9GSVhFRF9EQVRBCTB4ODAwCS8qICBFdmVyeSBmcmFtZSBzYW1lICovCi0jZGVmaW5lIFJDVl9JTwkJMHgxMDAwCS8qICBVc2UgSVNBIElPIG9ubHkgKi8KLSNkZWZpbmUgUkNWX01FTU9SWQkweDIwMDAJLyogIFVzZSBJU0EgTWVtb3J5ICovCi0KLSNkZWZpbmUgUkFNX1NJWkUJMHgxMDAwICAgICAgIC8qICBUaGUgY2FyZCBoYXMgNGsgYnl0ZXMgb3IgUkFNICovCi0jZGVmaW5lIFBLVF9TVEFSVCBQUF9UeEZyYW1lICAvKiAgU3RhcnQgb2YgcGFja2V0IFJBTSAqLwotCi0jZGVmaW5lIFJYX0ZSQU1FX1BPUlQJMHgwMDAwCi0jZGVmaW5lIFRYX0ZSQU1FX1BPUlQgUlhfRlJBTUVfUE9SVAotI2RlZmluZSBUWF9DTURfUE9SVAkweDAwMDQKLSNkZWZpbmUgVFhfTk9XCQkweDAwMDAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAgIDUgYnl0ZXMgY29waWVkICovCi0jZGVmaW5lIFRYX0FGVEVSXzM4MQkweDAwMjAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAzODEgYnl0ZXMgY29waWVkICovCi0jZGVmaW5lIFRYX0FGVEVSX0FMTAkweDAwNjAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciBhbGwgYnl0ZXMgY29waWVkICovCi0jZGVmaW5lIFRYX0xFTl9QT1JUCTB4MDAwNgotI2RlZmluZSBJU1FfUE9SVAkweDAwMDgKLSNkZWZpbmUgQUREX1BPUlQJMHgwMDBBCi0jZGVmaW5lIERBVEFfUE9SVAkweDAwMEMKLQotI2RlZmluZSBFRVBST01fV1JJVEVfRU4JCTB4MDBGMAotI2RlZmluZSBFRVBST01fV1JJVEVfRElTCTB4MDAwMAotI2RlZmluZSBFRVBST01fV1JJVEVfQ01ECTB4MDEwMAotI2RlZmluZSBFRVBST01fUkVBRF9DTUQJCTB4MDIwMAotCi0vKiAgUmVjZWl2ZSBIZWFkZXIgKi8KLS8qICBEZXNjcmlwdGlvbiBvZiBoZWFkZXIgb2YgZWFjaCBwYWNrZXQgaW4gcmVjZWl2ZSBhcmVhIG9mIG1lbW9yeSAqLwotI2RlZmluZSBSQlVGX0VWRU5UX0xPVwkwICAgLyogIExvdyBieXRlIG9mIFJ4RXZlbnQgLSBzdGF0dXMgb2YgcmVjZWl2ZWQgZnJhbWUgKi8KLSNkZWZpbmUgUkJVRl9FVkVOVF9ISUdICTEgICAvKiAgSGlnaCBieXRlIG9mIFJ4RXZlbnQgLSBzdGF0dXMgb2YgcmVjZWl2ZWQgZnJhbWUgKi8KLSNkZWZpbmUgUkJVRl9MRU5fTE9XCTIgICAvKiAgTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgLSBsb3cgYnl0ZSAqLwotI2RlZmluZSBSQlVGX0xFTl9ISQkzICAgLyogIExlbmd0aCBvZiByZWNlaXZlZCBkYXRhIC0gaGlnaCBieXRlICovCi0jZGVmaW5lIFJCVUZfSEVBRF9MRU4JNCAgIC8qICBMZW5ndGggb2YgdGhpcyBoZWFkZXIgKi8KLQotI2RlZmluZSBDSElQX1JFQUQgMHgxICAgLyogIFVzZWQgdG8gbWFyayBzdGF0ZSBvZiB0aGUgcmVwaW5zIGNvZGUgKGNoaXAgb3IgZG1hKSAqLwotI2RlZmluZSBETUFfUkVBRCAweDIgICAvKiAgVXNlZCB0byBtYXJrIHN0YXRlIG9mIHRoZSByZXBpbnMgY29kZSAoY2hpcCBvciBkbWEpICovCi0KLS8qICBmb3IgYmlvcyBzY2FuICovCi0vKiAgKi8KLSNpZmRlZglDU0RFQlVHCi0vKiAgdXNlIHRoZXNlIHZhbHVlcyBmb3IgZGVidWdnaW5nIGJpb3Mgc2NhbiAqLwotI2RlZmluZSBCSU9TX1NUQVJUX1NFRyAweDAwMDAwCi0jZGVmaW5lIEJJT1NfT0ZGU0VUX0lOQyAweDAwMTAKLSNlbHNlCi0jZGVmaW5lIEJJT1NfU1RBUlRfU0VHIDB4MGMwMDAKLSNkZWZpbmUgQklPU19PRkZTRVRfSU5DIDB4MDIwMAotI2VuZGlmCi0KLSNkZWZpbmUgQklPU19MQVNUX09GRlNFVCAweDBmYzAwCi0KLS8qICBCeXRlIG9mZnNldHMgaW50byB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gYnVmZmVyICovCi0jZGVmaW5lIElTQV9DTkZfT0ZGU0VUIDB4NgotI2RlZmluZSBUWF9DVExfT0ZGU0VUIChJU0FfQ05GX09GRlNFVCArIDgpCQkJLyogIDg5MDAgZWVwcm9tICovCi0jZGVmaW5lIEFVVE9fTkVHX0NORl9PRkZTRVQgKElTQV9DTkZfT0ZGU0VUICsgOCkJCS8qICA4OTIwIGVlcHJvbSAqLwotCi0gIC8qICB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgdGhlIGJpdHMgaW4gdGhlIGVlcHJvbSBhcmUgZ2VuZXJhbGx5ICAqLwotICAvKiAgaW4gdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhvc2UgaW4gdGhlIGF1dG9uZWdjdGwgcmVnaXN0ZXIuICovCi0gIC8qICBPZiBjb3Vyc2UgdGhlIElNTSBiaXQgaXMgbm90IGluIHRoYXQgcmVnaXN0ZXIgc28gaXQgbXVzdCBiZSAgKi8KLSAgLyogIG1hc2tlZCBvdXQgKi8KLSNkZWZpbmUgRUVfRk9SQ0VfRkRYICAweDgwMDAKLSNkZWZpbmUgRUVfTkxQX0VOQUJMRSAweDAyMDAKLSNkZWZpbmUgRUVfQVVUT19ORUdfRU5BQkxFIDB4MDEwMAotI2RlZmluZSBFRV9BTExPV19GRFggMHgwMDgwCi0jZGVmaW5lIEVFX0FVVE9fTkVHX0NORl9NQVNLIChFRV9GT1JDRV9GRFh8RUVfTkxQX0VOQUJMRXxFRV9BVVRPX05FR19FTkFCTEV8RUVfQUxMT1dfRkRYKQotCi0jZGVmaW5lIElNTV9CSVQgMHgwMDQwCQkvKiAgaWdub3JlIG1pc3NpbmcgbWVkaWEgKi8KLQotI2RlZmluZSBBREFQVEVSX0NORl9PRkZTRVQgKEFVVE9fTkVHX0NORl9PRkZTRVQgKyAyKQotI2RlZmluZSBBX0NORl8xMEJfVCAweDAwMDEKLSNkZWZpbmUgQV9DTkZfQVVJIDB4MDAwMgotI2RlZmluZSBBX0NORl8xMEJfMiAweDAwMDQKLSNkZWZpbmUgQV9DTkZfTUVESUFfVFlQRSAweDAwNjAKLSNkZWZpbmUgQV9DTkZfTUVESUFfQVVUTyAweDAwMDAKLSNkZWZpbmUgQV9DTkZfTUVESUFfMTBCX1QgMHgwMDIwCi0jZGVmaW5lIEFfQ05GX01FRElBX0FVSSAweDAwNDAKLSNkZWZpbmUgQV9DTkZfTUVESUFfMTBCXzIgMHgwMDYwCi0jZGVmaW5lIEFfQ05GX0RDX0RDX1BPTEFSSVRZIDB4MDA4MAotI2RlZmluZSBBX0NORl9OT19BVVRPX1BPTEFSSVRZIDB4MjAwMAotI2RlZmluZSBBX0NORl9MT1dfUlhfU1FVRUxDSCAweDQwMDAKLSNkZWZpbmUgQV9DTkZfRVhUTkRfMTBCXzIgMHg4MDAwCi0KLSNkZWZpbmUgUEFDS0VUX1BBR0VfT0ZGU0VUIDB4OAotCi0vKiAgQml0IGRlZmluaXRpb25zIGZvciB0aGUgSVNBIGNvbmZpZ3VyYXRpb24gd29yZCBmcm9tIHRoZSBFRVBST00gKi8KLSNkZWZpbmUgSU5UX05PX01BU0sgMHgwMDBGCi0jZGVmaW5lIERNQV9OT19NQVNLIDB4MDA3MAotI2RlZmluZSBJU0FfRE1BX1NJWkUgMHgwMjAwCi0jZGVmaW5lIElTQV9BVVRPX1J4RE1BIDB4MDQwMAotI2RlZmluZSBJU0FfUnhETUEgMHgwODAwCi0jZGVmaW5lIERNQV9CVVJTVCAweDEwMDAKLSNkZWZpbmUgU1RSRUFNX1RSQU5TRkVSIDB4MjAwMAotI2RlZmluZSBBTllfSVNBX0RNQSAoSVNBX0FVVE9fUnhETUEgfCBJU0FfUnhETUEpCi0KLS8qICBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BX0JBU0UgMHgwMCAgICAgLyogIERNQSBjb250cm9sbGVyIGJhc2UgKi8KLSNkZWZpbmUgRE1BX0JBU0VfMiAweDBDMCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLwotCi0jZGVmaW5lIERNQV9TVEFUIDB4MEQwICAgIC8qICBETUEgY29udHJvbGxlciBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX01BU0sgMHgwRDQgICAgLyogIERNQSBjb250cm9sbGVyIG1hc2sgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX01PREUgMHgwRDYgICAgLyogIERNQSBjb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX1JFU0VURkYgMHgwRDggICAgLyogIERNQSBjb250cm9sbGVyIGZpcnN0L2xhc3QgZmxpcCBmbG9wICovCi0KLS8qICBETUEgZGF0YSAqLwotI2RlZmluZSBETUFfRElTQUJMRSAweDA0ICAgICAvKiAgRGlzYWJsZSBjaGFubmVsIG4gKi8KLSNkZWZpbmUgRE1BX0VOQUJMRSAweDAwICAgICAvKiAgRW5hYmxlIGNoYW5uZWwgbiAqLwotLyogIERlbWFuZCB0cmFuc2ZlcnMsIGluY3IuIGFkZHJlc3MsIGF1dG8gaW5pdCwgd3JpdGVzLCBjaC4gbiAqLwotI2RlZmluZSBETUFfUlhfTU9ERSAweDE0Ci0vKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCByZWFkcywgY2guIG4gKi8KLSNkZWZpbmUgRE1BX1RYX01PREUgMHgxOAotCi0jZGVmaW5lIERNQV9TSVpFICgxNioxMDI0KSAvKiAgU2l6ZSBvZiBkbWEgYnVmZmVyIC0gMTZrICovCi0KLSNkZWZpbmUgQ1M4OTAwIDB4MDAwMAotI2RlZmluZSBDUzg5MjAgMHg0MDAwCi0jZGVmaW5lIENTODkyME0gMHg2MDAwCi0jZGVmaW5lIFJFVklTT05fQklUUyAweDFGMDAKLSNkZWZpbmUgRUVWRVJfTlVNQkVSIDB4MTIKLSNkZWZpbmUgQ0hLU1VNX0xFTiAweDE0Ci0jZGVmaW5lIENIS1NVTV9WQUwgMHgwMDAwCi0jZGVmaW5lIFNUQVJUX0VFUFJPTV9EQVRBIDB4MDAxYyAvKiAgT2Zmc2V0IGludG8gZWVwcm9tIGZvciBzdGFydCBvZiBkYXRhICovCi0jZGVmaW5lIElSUV9NQVBfRUVQUk9NX0RBVEEgMHgwMDQ2IC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHRoZSBJUlEgbWFwICovCi0jZGVmaW5lIElSUV9NQVBfTEVOIDB4MDAwNCAvKiAgTm8gb2YgYnl0ZXMgdG8gcmVhZCBmb3IgdGhlIElSUSBtYXAgKi8KLSNkZWZpbmUgUE5QX0lSUV9GUk1UIDB4MDAyMiAvKiAgUE5QIHNtYWxsIGl0ZW0gSVJRIGZvcm1hdCAqLwotI2RlZmluZSBDUzg5MDBfSVJRX01BUCAweDFjMjAgLyogIFRoaXMgSVJRIG1hcCBpcyBmaXhlZCAqLwotCi0jZGVmaW5lIENTODkyMF9OT19JTlRTIDB4MEYgICAvKiAgTWF4IENTODkyMCBpbnRlcnJ1cHQgc2VsZWN0ICMgKi8KLQotI2RlZmluZSBQTlBfQUREX1BPUlQgMHgwMjc5Ci0jZGVmaW5lIFBOUF9XUklURV9QT1JUIDB4MEE3OQotCi0jZGVmaW5lIEdFVF9QTlBfSVNBX1NUUlVDVCAweDQwCi0jZGVmaW5lIFBOUF9JU0FfU1RSVUNUX0xFTiAweDA2Ci0jZGVmaW5lIFBOUF9DU05fQ05UX09GRiAweDAxCi0jZGVmaW5lIFBOUF9SRF9QT1JUX09GRiAweDAyCi0jZGVmaW5lIFBOUF9GVU5DVElPTl9PSyAweDAwCi0jZGVmaW5lIFBOUF9XQUtFIDB4MDMKLSNkZWZpbmUgUE5QX1JTUkNfREFUQSAweDA0Ci0jZGVmaW5lIFBOUF9SU1JDX1JFQURZIDB4MDEKLSNkZWZpbmUgUE5QX1NUQVRVUyAweDA1Ci0jZGVmaW5lIFBOUF9BQ1RJVkFURSAweDMwCi0jZGVmaW5lIFBOUF9DTkZfSU9fSCAweDYwCi0jZGVmaW5lIFBOUF9DTkZfSU9fTCAweDYxCi0jZGVmaW5lIFBOUF9DTkZfSU5UIDB4NzAKLSNkZWZpbmUgUE5QX0NORl9ETUEgMHg3NAotI2RlZmluZSBQTlBfQ05GX01FTSAweDQ4Ci0KLSNkZWZpbmUgQklUMCAxCi0jZGVmaW5lIEJJVDE1IDB4ODAwMAotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KLQpJbmRleDogYi9uZXRib290L2NzODl4MC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2NzODl4MC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCi1vbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEV0aGVyYm9vdCBwYWNrYWdlLiAgVGhlIGNvZGUgaXMKLW9yZGluYXJpbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4KLQotUnVzcyBOZWxzb24sIEphbnVhcnkgMjAwMAotCi1DUkVESVRTCi0KLUkgd2FudCB0byB0aGFuawotCi0gIE1pa2UgQ3J1c2UgPG1jcnVzZUBjdGktbHRkLmNvbT4KLSAgICAgZm9yIHByb3ZpZGluZyBhbiBldmFsdWF0aW9uIE5JQyBhbmQgZm9yIHNwb25zb3JpbmcgdGhlCi0gICAgIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgotCi0gIFJhbmRhbGwgU2VhcnMgPHNlYXJzQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAgRGV2YSBCb2RhcyA8Ym9kYXNAY3J5c3RhbC5jaXJydXMuY29tPgotICBBbmRyZWFzIEtyYWVtZXIgPGFrcmFlbWVyQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAgV29sZmdhbmcgS3JhdXNlIDwxMDAzMDMuMjY3M0Bjb21wdXNlcnZlLmNvbT4KLSAgICAgZm9yIGV4Y2VsbGVudCB0ZWNobmljYWwgc3VwcG9ydCBhbmQgZm9yIHByb3ZpZGluZyB0aGUgcmVxdWlyZWQKLSAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24uIEkgYXBwcmVjaWF0ZSBDcnlzdGFsIFNlbWljb25kdWN0b3IncwotICAgICBjb21taXRtZW50IHRvd2FyZHMgZnJlZSBzb2Z0d2FyZS4KLQotICBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+Ci0gICAgIGZvciB3cml0aW5nIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQ1M4OXgwCi0gICAgIGNoaXBzZXQuIFJ1c3NlbCdzIGNvZGUgaXMgdmVyeSB3ZWxsIGRlc2lnbmVkIGFuZCBzaW1wbGlmaWVkIG15Ci0gICAgIGpvYiBhIGxvdC4KSW5kZXg6IGIvbmV0Ym9vdC9kYXZpY29tLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2Rhdmljb20uYworKysgYi9uZXRib290L2Rhdmljb20uYwpAQCAtMSwxMiArMSwxMiBAQAorI2lmZGVmIEFMTE1VTFRJCisjZXJyb3IgbXVsdGljYXN0IHN1cHBvcnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZAorI2VuZGlmCiAvKiAgCiAgICAgREFWSUNPTSBETTkwMDkvRE05MTAyL0RNOTEwMkEgRXRoZXJib290IERyaXZlcglWMS4wMAogCi0gICAgVGhpcyBkcml2ZXIgd2FzIHBvcnRlZCBmcm9tIE1hcnR5IENvbm5lcidzIFR1bGlwIEV0aGVyYm9vdCBkcml2ZXIuIAotICAgIFRoYW5rcyBNYXJ0eSBDb25ub3IgKG1kY0B0aGluZ3Vpbi5vcmcpIAotICAgIFlvdSBjYW4gZ2V0IFR1bGlwIGRyaXZlciBzb3VyY2UgZmlsZSBmcm9tIHRoaXMgVVJMOgorICAgIFRoaXMgZHJpdmVyIHdhcyBwb3J0ZWQgZnJvbSBNYXJ0eSBDb25ub3IncyBUdWxpcCBFdGhlcmJvb3QgZHJpdmVyLiAKKyAgICBUaGFua3MgTWFydHkgQ29ubm9yIChtZGNAZXRoZXJib290Lm9yZykgCiAKLSAgICAiaHR0cDovL2V0aGVyYm9vdC5zb3VyY2Vmb3JnZS4ubmV0LyNEaXN0cmlidXRpb24iCi0gICAgCiAgICAgVGhpcyBkYXZpY29tIGV0aGVyYm9vdCBkcml2ZXIgc3VwcG9ydHMgRE05MDA5L0RNOTEwMi9ETTkxMDJBLwogICAgIERNOTEwMkErRE05ODAxL0RNOTEwMkErRE05ODAyIE5JQ3MuCiAKQEAgLTM2LDcgKzM2LDYgQEAKIAkJCXJlZ2lzdGVyKENSNikKICovCiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ0LDcgKzQzLDYgQEAKICNpbmNsdWRlICJldGhlcmJvb3QuaCIKICNpbmNsdWRlICJuaWMuaCIKICNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgogCiAjdW5kZWYgREFWSUNPTV9ERUJVRwogI3VuZGVmIERBVklDT01fREVCVUdfV0hFUkUKQEAgLTk5LDggKzk3LDEwIEBACiAjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKIAogLyogaGVscGZ1bCBtYWNybyBpZiBvbiBhIGJpZ19lbmRpYW4gbWFjaGluZSBmb3IgY2hhbmdpbmcgYnl0ZSBvcmRlci4KLSAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwgKi8KKyAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwKKyAgIEFscmVhZHkgZGVmaW5lZCBpbiBFdGhlcmJvb3QgaW5jbHVkZXMKICNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQorKi8KIAogLyogdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvciBmb3JtYXQgKi8KIHN0cnVjdCB0eGRlc2MgewpAQCAtMTM4LDIwICsxMzgsMTIgQEAKIC8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciAqLwogI2RlZmluZSBOVFhEIDIKIHN0YXRpYyBzdHJ1Y3QgdHhkZXNjIHR4ZFtOVFhEXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHR4YiAoKGNoYXIgKikweDEwMDAwIC0gQlVGTEVOKQotI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltCVUZMRU5dIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0jZW5kaWYKIAogLyogcmVjZWl2ZSBkZXNjcmlwdG9yKHMpIGFuZCBidWZmZXIocykgKi8KICNkZWZpbmUgTlJYRCA0CiBzdGF0aWMgc3RydWN0IHJ4ZGVzYyByeGRbTlJYRF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSByeGIgKChjaGFyICopMHgxMDAwMCAtIE5SWEQgKiBCVUZMRU4gLSBCVUZMRU4pCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW05SWEQgKiBCVUZMRU5dIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0jZW5kaWYKIHN0YXRpYyBpbnQgcnhkX3RhaWw7CiBzdGF0aWMgaW50IFR4UHRyOwogCkBAIC0xNjEsMTUgKzE1MywxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIHdoZXJlYW1pKGNvbnN0IGNoYXIgKnN0cik7CiBzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7Ci1zdHJ1Y3QgbmljICpkYXZpY29tX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLAotCQkJc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IGRhdmljb21fcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKIHN0YXRpYyB2b2lkIGRhdmljb21faW5pdF9jaGFpbihzdHJ1Y3QgbmljICpuaWMpOwkvKiBTdGVuIDEwLzkgKi8KIHN0YXRpYyB2b2lkIGRhdmljb21fcmVzZXQoc3RydWN0IG5pYyAqbmljKTsKIHN0YXRpYyB2b2lkIGRhdmljb21fdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKIAkJCSAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKTsKLXN0YXRpYyBpbnQgZGF2aWNvbV9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCBkYXZpY29tX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyB2b2lkIHdoZXJlYW1pIChjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGludCBkYXZpY29tX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldik7CiAjaWZkZWYJREFWSUNPTV9ERUJVRwogc3RhdGljIHZvaWQgZGF2aWNvbV9tb3JlKHZvaWQpOwogI2VuZGlmIC8qIERBVklDT01fREVCVUcgKi8KQEAgLTE4NCwxMyArMTc0LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVXRpbGl0eSBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3aGVyZWFtaSAoY29uc3QgY2hhciAqc3RyKQorc3RhdGljIGlubGluZSB2b2lkIHdoZXJlYW1pKGNvbnN0IGNoYXIgKnN0cikKIHsKLSNpZmRlZglEQVZJQ09NX0RFQlVHX1dIRVJFCiAgIHByaW50ZigiJXNcbiIsIHN0cik7CiAgIC8qIHNsZWVwKDIpOyAqLwotI2VuZGlmCiB9CiAKICNpZmRlZglEQVZJQ09NX0RFQlVHCkBAIC0zNjAsNyArMzQ3LDcgQEAKIC8qCiAgIFNlbnNlIG1lZGlhIG1vZGUgYW5kIHNldCBDUjYKICovCi1zdGF0aWMgdm9pZCBkYXZpY29tX21lZGlhX2NoayhzdHJ1Y3QgbmljICogbmljKQorc3RhdGljIHZvaWQgZGF2aWNvbV9tZWRpYV9jaGsoc3RydWN0IG5pYyAqIG5pYyBfX3VudXNlZCkKIHsKICAgdW5zaWduZWQgbG9uZyB0bywgY3NyNjsKIApAQCAtNDQ2LDggKzQzMyw4IEBACiAgIC8qIFN0ZW46IFNldCAyIFRYIGRlc2NyaXB0b3IgYnV0IHVzZSBvbmUgVFggYnVmZmVyIGJlY2F1c2UKIAkgICBpdCB0cmFuc21pdCBhIHBhY2tldCBhbmQgd2FpdCBjb21wbGV0ZSBldmVyeSB0aW1lLiAqLwogICBmb3IgKGk9MDsgaTxOVFhEOyBpKyspIHsKLSAgICB0eGRbaV0uYnVmMWFkZHIgPSAmdHhiWzBdOwkJLyogVXNlZCBzYW1lIFRYIGJ1ZmZlciAqLwotICAgIHR4ZFtpXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnR4ZFtpKzFdOyAvKiAgUG9pbnQgdG8gTmV4dCBUWCBkZXNjICovCisgICAgdHhkW2ldLmJ1ZjFhZGRyID0gKHZvaWQgKil2aXJ0X3RvX2J1cygmdHhiWzBdKTsJLyogVXNlZCBzYW1lIFRYIGJ1ZmZlciAqLworICAgIHR4ZFtpXS5idWYyYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnR4ZFtpKzFdKTsJLyogIFBvaW50IHRvIE5leHQgVFggZGVzYyAqLwogICAgIHR4ZFtpXS5idWYxc3ogICA9IDA7CiAgICAgdHhkW2ldLmJ1ZjJzeiAgID0gMDsKICAgICB0eGRbaV0uY29udHJvbCAgPSAweDE4NDsgICAgICAgICAgIC8qIEJlZ2luL0VuZC9DaGFpbiAqLwpAQCAtNDY2LDggKzQ1Myw4IEBACiAKICAgLyogc2V0dXAgcmVjZWl2ZSBkZXNjcmlwdG9yICovCiAgIGZvciAoaT0wOyBpPE5SWEQ7IGkrKykgewotICAgIHJ4ZFtpXS5idWYxYWRkciA9ICZyeGJbaSAqIEJVRkxFTl07Ci0gICAgcnhkW2ldLmJ1ZjJhZGRyID0gKHVuc2lnbmVkIGNoYXIgKikmcnhkW2krMV07IC8qIFBvaW50IHRvIE5leHQgUlggZGVzYyAqLworICAgIHJ4ZFtpXS5idWYxYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnJ4YltpICogQlVGTEVOXSk7CisgICAgcnhkW2ldLmJ1ZjJhZGRyID0gKHZvaWQgKil2aXJ0X3RvX2J1cygmcnhkW2krMV0pOyAvKiBQb2ludCB0byBOZXh0IFJYIGRlc2MgKi8KICAgICByeGRbaV0uYnVmMXN6ICAgPSBCVUZMRU47CiAgICAgcnhkW2ldLmJ1ZjJzeiAgID0gMDsgICAgICAgIC8qIG5vdCB1c2VkICovCiAgICAgcnhkW2ldLmNvbnRyb2wgID0gMHg0OwkJLyogQ2hhaW4gU3RydWN0dXJlICovCkBAIC00NzUsOCArNDYyLDggQEAKICAgfQogCiAgIC8qIENoYWluIHRoZSBsYXN0IGRlc2NyaXB0b3IgdG8gZmlyc3QgKi8KLSAgdHhkW05UWEQgLSAxXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnR4ZFswXTsKLSAgcnhkW05SWEQgLSAxXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnJ4ZFswXTsKKyAgdHhkW05UWEQgLSAxXS5idWYyYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnR4ZFswXSk7CisgIHJ4ZFtOUlhEIC0gMV0uYnVmMmFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZyeGRbMF0pOwogICBUeFB0ciA9IDA7CiAgIHJ4ZF90YWlsID0gMDsKIH0KQEAgLTQ4OCw3ICs0NzUsNiBAQAogc3RhdGljIHZvaWQgZGF2aWNvbV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCiB7CiAgIHVuc2lnbmVkIGxvbmcgdG87Ci0gIHUzMiBhZGRyX2xvdywgYWRkcl9oaWdoOwogCiAgIHdoZXJlYW1pKCJkYXZpY29tX3Jlc2V0XG4iKTsKIApAQCAtNTA3LDggKzQ5Myw4IEBACiAgIGRhdmljb21faW5pdF9jaGFpbihuaWMpOwkvKiBTdGVuIDEwLzkgKi8KIAogICAvKiBQb2ludCB0byByZWNlaXZlIGRlc2NyaXB0b3IgKi8KLSAgb3V0bCgodW5zaWduZWQgbG9uZykmcnhkWzBdLCBpb2FkZHIgKyBDU1IzKTsKLSAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhkWzBdLCBpb2FkZHIgKyBDU1I0KTsJLyogU3RlbiAxMC85ICovCisgIG91dGwodmlydF90b19idXMoJnJ4ZFswXSksIGlvYWRkciArIENTUjMpOworICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGRbMF0pLCBpb2FkZHIgKyBDU1I0KTsJLyogU3RlbiAxMC85ICovCiAKICAgLyogQWNjb3JkaW5nIHBoeXhjZXIgbWVkaWEgbW9kZSB0byBzZXQgQ1I2LAogICAgICBETTkxMDIvQSBwaHl4Y2VyIGNhbiBhdXRvLWRldGVjdCBtZWRpYSBtb2RlICovCkBAIC01OTEsMTMgKzU3NywxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGV0aF9wb2xsIC0gV2FpdCBmb3IgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBkYXZpY29tX3BvbGwoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIGludCBkYXZpY29tX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAgIHdoZXJlYW1pKCJkYXZpY29tX3BvbGxcbiIpOwogCiAgIGlmIChyeGRbcnhkX3RhaWxdLnN0YXR1cyAmIDB4ODAwMDAwMDApCiAgICAgcmV0dXJuIDA7CiAKKyAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICAgd2hlcmVhbWkoImRhdmljb21fcG9sbCBnb3Qgb25lXG4iKTsKIAogICBuaWMtPnBhY2tldGxlbiA9IChyeGRbcnhkX3RhaWxdLnN0YXR1cyAmIDB4M0ZGRjAwMDApID4+IDE2OwpAQCAtNjI3LDEwICs2MTUsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfZGlzYWJsZSAtIERpc2FibGUgdGhlIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGRhdmljb21fZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBkYXZpY29tX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKICAgd2hlcmVhbWkoImRhdmljb21fZGlzYWJsZVxuIik7CiAKKyAgZGF2aWNvbV9yZXNldChuaWMpOworCiAgIC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwogICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjcpOwogCkBAIC02NDAsMjQgKzYzMSw0MyBAQAogICAvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLwogICAodm9sYXRpbGUgdW5zaWduZWQgbG9uZylpbmwoaW9hZGRyICsgQ1NSOCk7CiB9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfaXJxIC0gZW5hYmxlLCBkaXNhYmxlIGFuZCBmb3JjZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRhdmljb21faXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKIAwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfcHJvYmUgLSBMb29rIGZvciBhbiBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKmRhdmljb21fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IGRhdmljb21fcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogeworICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKICAgdW5zaWduZWQgaW50IGk7Ci0gIHUzMiBsMSwgbDI7CiAKICAgd2hlcmVhbWkoImRhdmljb21fcHJvYmVcbiIpOwogCi0gIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQorICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKICAgICByZXR1cm4gMDsKIAogICB2ZW5kb3IgID0gcGNpLT52ZW5kb3I7CiAgIGRldl9pZCAgPSBwY2ktPmRldl9pZDsKLSAgaW9hZGRyICA9ICppb19hZGRyczsKKyAgaW9hZGRyICA9IHBjaS0+aW9hZGRyICYgfjM7CisKKyAgbmljLT5pcnFubyAgPSAwOworICBuaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CiAKICAgLyogd2FrZXVwIGNoaXAgKi8KICAgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQocGNpLT5idXMsIHBjaS0+ZGV2Zm4sIDB4NDAsIDB4MDAwMDAwMDApOwpAQCAtNjgzLDEwICs2OTMsMjYgQEAKICAgLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KICAgZGF2aWNvbV9yZXNldChuaWMpOwogCi0gIG5pYy0+cmVzZXQgICAgPSBkYXZpY29tX3Jlc2V0OworICBkZXYtPmRpc2FibGUgID0gZGF2aWNvbV9kaXNhYmxlOwogICBuaWMtPnBvbGwgICAgID0gZGF2aWNvbV9wb2xsOwogICBuaWMtPnRyYW5zbWl0ID0gZGF2aWNvbV90cmFuc21pdDsKLSAgbmljLT5kaXNhYmxlICA9IGRhdmljb21fZGlzYWJsZTsKKyAgbmljLT5pcnEgICAgICA9IGRhdmljb21faXJxOwogCi0gIHJldHVybiBuaWM7CisgIHJldHVybiAxOwogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBkYXZpY29tX25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMjgyLCAweDkxMDAsICJkYXZpY29tOTEwMCIsICJEYXZpY29tIDkxMDAiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMDIsICJkYXZpY29tOTEwMiIsICJEYXZpY29tIDkxMDIiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkwMDksICJkYXZpY29tOTAwOSIsICJEYXZpY29tIDkwMDkiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMzIsICJkYXZpY29tOTEzMiIsICJEYXZpY29tIDkxMzIiKSwJLyogTmVlZHMgcHJvYmFibHkgc29tZSBmaXhpbmcgKi8KK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIGRhdmljb21fZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIkRBVklDT00iLAorCS5wcm9iZSAgICA9IGRhdmljb21fcHJvYmUsCisJLmlkcyAgICAgID0gZGF2aWNvbV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihkYXZpY29tX25pY3MpL3NpemVvZihkYXZpY29tX25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpJbmRleDogYi9uZXRib290L2RlcGNhLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2RlcGNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLyogRXRoZXJib290OiBkZXBjYS5oIG1lcmdlZCwgY29tbWVudHMgZnJvbSBMaW51eCBkcml2ZXIgcmV0YWluZWQgKi8KLS8qICBkZXBjYS5jOiBBIERJR0lUQUwgREVQQ0EgICYgRXRoZXJXT1JLUyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgotCi0gICAgV3JpdHRlbiAxOTk0LCAxOTk1IGJ5IERhdmlkIEMuIERhdmllcy4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTQgRGF2aWQgQy4gRGF2aWVzCi0JCSAgICAgICAgICAgICAgICAgICBhbmQgCi0JCQkgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50Ci0JIChhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeSkuICAKLQotICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTUgIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgotCi0KLSAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCi0gICAgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0KLSAgICBUaGlzIGRyaXZlciBpcyB3cml0dGVuIGZvciB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gc2VyaWVzCi0gICAgb2YgREVQQ0EgYW5kIEV0aGVyV09SS1MgZXRoZXJuZXQgY2FyZHM6Ci0KLSAgICAgICAgREVQQ0EgICAgICAgKHRoZSBvcmlnaW5hbCkKLSAgICAJREUxMDAKLSAgICAJREUxMDEKLQlERTIwMCBUdXJibwotCURFMjAxIFR1cmJvCi0JREUyMDIgVHVyYm8gKFRQIEJOQykKLQlERTIxMAotCURFNDIyICAgICAgIChFSVNBKQotCi0gICAgVGhlICBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIERFMTAwLCBERTIwMCBhbmQgREUyMDIgY2FyZHMgIGluICBhCi0gICAgcmVsYXRpdmVseSBidXN5IG5ldHdvcmsuIFRoZSBERTQyMiBoYXMgYmVlbiB0ZXN0ZWQgYSBsaXR0bGUuCi0KLSAgICBUaGlzICBkcml2ZXIgd2lsbCBOT1Qgd29yayAgIGZvciB0aGUgREUyMDMsICBERTIwNCAgYW5kIERFMjA1IHNlcmllcyAgb2YKLSAgICBjYXJkcywgIHNpbmNlIHRoZXkgaGF2ZSAgYSAgbmV3IGN1c3RvbSBBU0lDIGluICAgcGxhY2Ugb2YgdGhlIEFNRCAgTEFOQ0UKLSAgICBjaGlwLiAgU2VlIHRoZSAnZXdyazMuYycgICBkcml2ZXIgaW4gdGhlICBMaW51eCAgc291cmNlIHRyZWUgZm9yIHJ1bm5pbmcKLSAgICB0aG9zZSBjYXJkcy4KLQotICAgIEkgaGF2ZSBiZW5jaG1hcmtlZCB0aGUgZHJpdmVyIHdpdGggYSAgREUxMDAgYXQgNTk1a0IvcyB0byAoNTQya0IvcyBmcm9tKQotICAgIGEgREVDc3RhdGlvbiA1MDAwLzIwMC4KLQotICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXQgZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb20KLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFRoZSAgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IGJhc2VkICBvbiAgIHRoZSAnbGFuY2UuYycgZHJpdmVyIGZyb20gIERvbmFsZAotICAgIEJlY2tlciAgIHdoaWNoICBpcyBpbmNsdWRlZCB3aXRoICB0aGUgIHN0YW5kYXJkICBkcml2ZXIgZGlzdHJpYnV0aW9uIGZvcgotICAgIGxpbnV4LiAgVjAuNCAgaXMgIGEgY29tcGxldGUgIHJlLXdyaXRlICB3aXRoIG9ubHkgIHRoZSBrZXJuZWwgIGludGVyZmFjZQotICAgIHJlbWFpbmluZyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlLgotCi0gICAgMSkgTGFuY2UuYyBjb2RlIGluIC9saW51eC9kcml2ZXJzL25ldC8KLSAgICAyKSAiRXRoZXJuZXQvSUVFRSA4MDIuMyBGYW1pbHkuIDE5OTIgV29ybGQgTmV0d29yayBEYXRhIEJvb2svSGFuZGJvb2siLAotICAgICAgIEFNRCwgMTk5MiBbKDgwMCkgMjIyLTkzMjNdLgotICAgIDMpICJBbTc5QzkwIENNT1MgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChDLUxBTkNFKSIsCi0gICAgICAgQU1ELCBQdWIuICMxNzg4MSwgTWF5IDE5OTMuCi0gICAgNCkgIkFtNzlDOTYwIFBDbmV0LUlTQSh0bSksIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgZm9yIElTQSIsCi0gICAgICAgQU1ELCBQdWIuICMxNjkwNywgTWF5IDE5OTIKLSAgICA1KSAiREVDIEV0aGVyV09SS1MgTEMgRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKLSAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MCwgUHViLiAjRUstREUxMDAtT00uMDAzCi0gICAgNikgIkRFQyBFdGhlcldPUktTIFR1cmJvIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCi0gICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTAsIFB1Yi4gI0VLLURFMjAwLU9NLjAwMwotICAgIDcpICJERVBDQSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsIiwgUHViLiAjRUstREVQQ0EtUFIKLSAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgMTk4OQotICAgIDgpICJERUMgRXRoZXJXT1JLUyBUdXJib18oVFAgQk5DKSBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAotICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkxLCBQdWIuICNFSy1ERTIwMi1PTS4wMDEKLSAgICAKLQotICAgIFBldGVyIEJhdWVyJ3MgZGVwY2EuYyAoVjAuNSkgd2FzIHJlZmVycmVkIHRvIHdoZW4gZGVidWdnaW5nIFYwLjEgb2YgdGhpcwotICAgIGRyaXZlci4KLQotICAgIFRoZSBvcmlnaW5hbCBERVBDQSAgY2FyZCByZXF1aXJlcyB0aGF0IHRoZSAgZXRoZXJuZXQgUk9NIGFkZHJlc3MgY291bnRlcgotICAgIGJlIGVuYWJsZWQgdG8gY291bnQgYW5kIGhhcyBhbiA4IGJpdCBOSUNTUi4gIFRoZSBST00gY291bnRlciBlbmFibGluZyBpcwotICAgIG9ubHkgIGRvbmUgd2hlbiBhICAweDA4IGlzIHJlYWQgYXMgdGhlICBmaXJzdCBhZGRyZXNzIG9jdGV0ICh0byBtaW5pbWlzZQotICAgIHRoZSBjaGFuY2VzICBvZiB3cml0aW5nIG92ZXIgc29tZSAgb3RoZXIgaGFyZHdhcmUncyAgSS9PIHJlZ2lzdGVyKS4gIFRoZQotICAgIE5JQ1NSIGFjY2Vzc2VzICAgaGF2ZSBiZWVuIGNoYW5nZWQgIHRvICBieXRlIGFjY2Vzc2VzICBmb3IgYWxsIHRoZSBjYXJkcwotICAgIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgc2luY2UgdGhlcmUgaXMgb25seSBvbmUgIHVzZWZ1bCBiaXQgaW4gdGhlIE1TQgotICAgIChyZW1vdGUgYm9vdCB0aW1lb3V0KSBhbmQgaXQgIGlzIG5vdCB1c2VkLiAgQWxzbywgdGhlcmUgIGlzIGEgbWF4aW11bSBvZgotICAgIG9ubHkgNDhrQiBuZXR3b3JrICBSQU0gZm9yIHRoaXMgIGNhcmQuICBNeSB0aGFua3MgIHRvIFRvcmJqb3JuIExpbmRoIGZvcgotICAgIGhlbHAgZGVidWdnaW5nIGFsbCB0aGlzIChhbmQgaG9sZGluZyBteSBmZWV0IHRvICB0aGUgZmlyZSB1bnRpbCBJIGdvdCBpdAotICAgIHJpZ2h0KS4KLQotICAgIFRoZSBERTIwMCAgc2VyaWVzICBib2FyZHMgaGF2ZSAgb24tYm9hcmQgNjRrQiAgUkFNIGZvciAgdXNlICBhcyBhIHNoYXJlZAotICAgIG1lbW9yeSBuZXR3b3JrICBidWZmZXIuIE9ubHkgdGhlIERFMTAwICBjYXJkcyBtYWtlIHVzZSAgb2YgYSAgMmtCIGJ1ZmZlcgotICAgIG1vZGUgd2hpY2ggaGFzIG5vdCAgYmVlbiBpbXBsZW1lbnRlZCBpbiAgdGhpcyBkcml2ZXIgKG9ubHkgdGhlIDMya0IgIGFuZAotICAgIDY0a0IgbW9kZXMgYXJlIHN1cHBvcnRlZCBbMTZrQi80OGtCIGZvciB0aGUgb3JpZ2luYWwgREVQQ0FdKS4KLQotICAgIEF0IHRoZSBtb3N0IG9ubHkgMiBERVBDQSBjYXJkcyBjYW4gIGJlIHN1cHBvcnRlZCBvbiAgdGhlIElTQSBidXMgYmVjYXVzZQotICAgIHRoZXJlIGlzIG9ubHkgcHJvdmlzaW9uICBmb3IgdHdvIEkvTyBiYXNlIGFkZHJlc3NlcyAgb24gZWFjaCBjYXJkICgweDMwMAotICAgIGFuZCAweDIwMCkuIFRoZSBJL08gYWRkcmVzcyBpcyBkZXRlY3RlZCBieSBzZWFyY2hpbmcgZm9yIGEgYnl0ZSBzZXF1ZW5jZQotICAgIGluIHRoZSBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgZXhwZWN0ZWQgSS9PIGFkZHJlc3MgZm9yIHRoZQotICAgIEV0aGVybmV0ICBQUk9NLiAgIFRoZSBzaGFyZWQgbWVtb3J5ICBiYXNlICAgYWRkcmVzcyAgaXMgJ2F1dG9wcm9iZWQnICBieQotICAgIGxvb2tpbmcgIGZvciB0aGUgc2VsZiAgdGVzdCBQUk9NICBhbmQgZGV0ZWN0aW5nIHRoZSAgY2FyZCBuYW1lLiAgIFdoZW4gYQotICAgIHNlY29uZCAgREVQQ0EgaXMgIGRldGVjdGVkLCAgaW5mb3JtYXRpb24gIGlzICAgcGxhY2VkIGluIHRoZSAgIGJhc2VfYWRkcgotICAgIHZhcmlhYmxlIG9mIHRoZSAgbmV4dCBkZXZpY2Ugc3RydWN0dXJlICh3aGljaCAgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkpLAotICAgIHRodXMgIGVuYWJsaW5nIGV0aGlmX3Byb2JlICBpbml0aWFsaXphdGlvbiAgZm9yIHRoZSBkZXZpY2UuICBNb3JlIHRoYW4gMgotICAgIEVJU0EgY2FyZHMgY2FuICBiZSAgc3VwcG9ydGVkLCBidXQgIGNhcmUgd2lsbCAgYmUgIG5lZWRlZCBhc3NpZ25pbmcgIHRoZQotICAgIHNoYXJlZCBtZW1vcnkgdG8gZW5zdXJlIHRoYXQgZWFjaCBzbG90IGhhcyB0aGUgIGNvcnJlY3QgSVJRLCBJL08gYWRkcmVzcwotICAgIGFuZCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgYXNzaWduZWQuCi0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE5PVEU6IElmIHlvdSBhcmUgdXNpbmcgdHdvICBJU0EgREVQQ0FzLCBpdCBpcyAgaW1wb3J0YW50IHRoYXQgeW91IGFzc2lnbgotICAgIHRoZSBiYXNlIG1lbW9yeSBhZGRyZXNzZXMgY29ycmVjdGx5LiAgIFRoZSAgZHJpdmVyIGF1dG9wcm9iZXMgSS9PICAweDMwMAotICAgIHRoZW4gMHgyMDAuICBUaGUgIGJhc2UgbWVtb3J5IGFkZHJlc3MgZm9yICB0aGUgZmlyc3QgZGV2aWNlIG11c3QgYmUgbGVzcwotICAgIHRoYW4gdGhhdCBvZiB0aGUgc2Vjb25kIHNvIHRoYXQgdGhlIGF1dG8gcHJvYmUgd2lsbCBjb3JyZWN0bHkgYXNzaWduIHRoZQotICAgIEkvTyBhbmQgbWVtb3J5IGFkZHJlc3NlcyBvbiB0aGUgc2FtZSBjYXJkLiAgSSBjYW4ndCB0aGluayBvZiBhIHdheSB0byBkbwotICAgIHRoaXMgdW5hbWJpZ3VvdXNseSBhdCB0aGUgbW9tZW50LCBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIG9uIHRoZSBjYXJkcyB0bwotICAgIHRpZSBJL08gYW5kIG1lbW9yeSBpbmZvcm1hdGlvbiB0b2dldGhlci4KLQotICAgIEkgYW0gdW5hYmxlICB0byAgdGVzdCAgMiBjYXJkcyAgIHRvZ2V0aGVyIGZvciBub3csICAgIHNvIHRoaXMgIGNvZGUgICBpcwotICAgIHVuY2hlY2tlZC4gQWxsIHJlcG9ydHMsIGdvb2Qgb3IgYmFkLCBhcmUgd2VsY29tZS4KLQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgVGhlIGJvYXJkIElSUSAgIHNldHRpbmcgbXVzdCBiZSAgYXQgYW4gIHVudXNlZCBJUlEgd2hpY2ggIGlzIGF1dG8tcHJvYmVkCi0gICAgdXNpbmcgRG9uYWxkIEJlY2tlcidzIGF1dG9wcm9iZSByb3V0aW5lcy4gREVQQ0EgYW5kIERFMTAwIGJvYXJkIElSUXMgYXJlCi0gICAgezIsMyw0LDUsN30sIHdoZXJlYXMgdGhlICBERTIwMCBpcyBhdCB7NSw5LDEwLDExLDE1fS4gIE5vdGUgdGhhdCBJUlEyIGlzCi0gICAgcmVhbGx5IElSUTkgaW4gbWFjaGluZXMgd2l0aCAxNiBJUlEgbGluZXMuCi0KLSAgICBObyAxNk1CIG1lbW9yeSAgbGltaXRhdGlvbiBzaG91bGQgZXhpc3Qgd2l0aCB0aGlzICBkcml2ZXIgYXMgRE1BIGlzICBub3QKLSAgICB1c2VkIGFuZCB0aGUgY29tbW9uIG1lbW9yeSBhcmVhIGlzIGluIGxvdyBtZW1vcnkgb24gdGhlIG5ldHdvcmsgY2FyZCAobXkKLSAgICBjdXJyZW50IHN5c3RlbSBoYXMgMjBNQiBhbmQgSSd2ZSBub3QgaGFkIHByb2JsZW1zIHlldCkuCi0KLSAgICBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlIGhhcyBiZWVuIGFkZGVkLiBUbwotICAgIHV0aWxpc2UgdGhpcyBhYmlsaXR5LCB5b3UgaGF2ZSB0byBkbyA8OCB0aGluZ3M6Ci0KLSAgICAwKSBoYXZlIGEgY29weSBvZiB0aGUgbG9hZGFibGUgbW9kdWxlcyBjb2RlIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4KLSAgICAxKSBjb3B5IGRlcGNhLmMgZnJvbSB0aGUgIC9saW51eC9kcml2ZXJzL25ldCBkaXJlY3RvcnkgdG8geW91ciBmYXZvdXJpdGUKLSAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotICAgIDIpIGlmIHlvdSB3aXNoLCBlZGl0IHRoZSAgc291cmNlIGNvZGUgbmVhciAgbGluZSAxNTMwIHRvIHJlZmxlY3QgdGhlIEkvTwotICAgIGFkZHJlc3MgYW5kIElSUSB5b3UncmUgdXNpbmcgKHNlZSBhbHNvIDUpLgotICAgIDMpIGNvbXBpbGUgIGRlcGNhLmMsIGJ1dCBpbmNsdWRlIC1ETU9EVUxFIGluICB0aGUgY29tbWFuZCBsaW5lIHRvIGVuc3VyZQotICAgIHRoYXQgdGhlIGNvcnJlY3QgYml0cyBhcmUgY29tcGlsZWQgKHNlZSBlbmQgb2Ygc291cmNlIGNvZGUpLgotICAgIDQpIGlmIHlvdSBhcmUgd2FudGluZyB0byBhZGQgYSBuZXcgIGNhcmQsIGdvdG8gNS4gT3RoZXJ3aXNlLCByZWNvbXBpbGUgYQotICAgIGtlcm5lbCB3aXRoIHRoZSBkZXBjYSBjb25maWd1cmF0aW9uIHR1cm5lZCBvZmYgYW5kIHJlYm9vdC4KLSAgICA1KSBpbnNtb2QgZGVwY2EubyBbaXJxPTddIFtpbz0weDIwMF0gW21lbT0weGQwMDAwXSBbYWRhcHRlcl9uYW1lPURFMTAwXQotICAgICAgIFtBbGFuIENveDogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgaXJxL2lvIGFzc2lnbm1lbnRzXQotICAgICAgIFtEYXZlIERhdmllczogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgbWVtL25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50c10KLSAgICA2KSBydW4gdGhlIG5ldCBzdGFydHVwIGJpdHMgZm9yIHlvdXIgZXRoPz8gaW50ZXJmYWNlIG1hbnVhbGx5IAotICAgICh1c3VhbGx5IC9ldGMvcmMuaW5ldFsxMl0gYXQgYm9vdCB0aW1lKS4gCi0gICAgNykgZW5qb3khCi0KLSAgICBOb3RlIHRoYXQgYXV0b3Byb2JpbmcgaXMgbm90IGFsbG93ZWQgaW4gbG9hZGFibGUgbW9kdWxlcyAtIHRoZSBzeXN0ZW0gaXMKLSAgICBhbHJlYWR5IHVwIGFuZCBydW5uaW5nIGFuZCB5b3UncmUgbWVzc2luZyB3aXRoIGludGVycnVwdHMuCi0KLSAgICBUbyB1bmxvYWQgYSBtb2R1bGUsIHR1cm4gb2ZmIHRoZSBhc3NvY2lhdGVkIGludGVyZmFjZSAKLSAgICAnaWZjb25maWcgZXRoPz8gZG93bicgdGhlbiAncm1tb2QgZGVwY2EnLgotCi0gICAgVG8gYXNzaWduIGEgYmFzZSBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgIHdoZW4gcnVubmluZyBhcyBhCi0gICAgbG9hZGFibGUgbW9kdWxlLCBzZWUgNSBhYm92ZS4gIFRvIGluY2x1ZGUgdGhlIGFkYXB0ZXIgIG5hbWUgKGlmIHlvdSBoYXZlCi0gICAgbm8gUFJPTSAgYnV0IGtub3cgdGhlIGNhcmQgbmFtZSkgIGFsc28gc2VlIDUgIGFib3ZlLiBOb3RlIHRoYXQgdGhpcyBsYXN0Ci0gICAgb3B0aW9uICB3aWxsIG5vdCB3b3JrICB3aXRoIGtlcm5lbCAgYnVpbHQtaW4gIGRlcGNhJ3MuIAotCi0gICAgVGhlIHNoYXJlZCBtZW1vcnkgYXNzaWdubWVudCBmb3IgYSBsb2FkYWJsZSBtb2R1bGUgIG1ha2VzIHNlbnNlIHRvIGF2b2lkCi0gICAgdGhlICdtZW1vcnkgYXV0b3Byb2JlJyBwaWNraW5nIHRoZSB3cm9uZyBzaGFyZWQgbWVtb3J5ICAoZm9yIHRoZSBjYXNlIG9mCi0gICAgMiBkZXBjYSdzIGluIGEgUEMpLgotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgU3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgY2FyZHMgYWRkZWQgMTEtMy05OC4KLSAgICBWZXJpZmllZCB0byB3b3JrIHdpdGggdXAgdG8gMiBERTIxMiBjYXJkcyBpbiBhIHN5c3RlbSAoYWx0aG91Z2ggbm90Ci0gICAgICBmdWxseSBzdHJlc3MtdGVzdGVkKS4gIAotCi0gICAgQ3VycmVudGx5IGtub3duIGJ1Z3MvbGltaXRhdGlvbnM6Ci0KLSAgICBOb3RlOiAgd2l0aCB0aGUgTUNBIHN0dWZmIGFzIGEgbW9kdWxlLCBpdCB0cnVzdHMgdGhlIE1DQSBjb25maWd1cmF0aW9uLAotICAgICAgICAgICBub3QgdGhlIGNvbW1hbmQgbGluZSBmb3IgSVJRIGFuZCBtZW1vcnkgYWRkcmVzcy4gIFlvdSBjYW4KLSAgICAgICAgICAgc3BlY2lmeSB0aGVtIGlmIHlvdSB3YW50LCBidXQgaXQgd2lsbCB0aHJvdyB5b3VyIHZhbHVlcyBvdXQuCi0gICAgICAgICAgIFlvdSBzdGlsbCBoYXZlIHRvIHBhc3MgdGhlIElPIGFkZHJlc3MgaXQgd2FzIGNvbmZpZ3VyZWQgYXMKLSAgICAgICAgICAgdGhvdWdoLgotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgVE8gRE86Ci0gICAgLS0tLS0tCi0KLQotICAgIFJldmlzaW9uIEhpc3RvcnkKLSAgICAtLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBWZXJzaW9uICAgRGF0ZSAgICAgICAgRGVzY3JpcHRpb24KLSAgCi0gICAgICAwLjEgICAgIDI1LWphbi05NCAgIEluaXRpYWwgd3JpdGluZy4KLSAgICAgIDAuMiAgICAgMjctamFuLTk0ICAgQWRkZWQgTEFOQ0UgVFggaGFyZHdhcmUgYnVmZmVyIGNoYWluaW5nLgotICAgICAgMC4zICAgICAgMS1mZWItOTQgICBBZGRlZCBtdWx0aXBsZSBERVBDQSBzdXBwb3J0LgotICAgICAgMC4zMSAgICAgNC1mZWItOTQgICBBZGRlZCBERTIwMiByZWNvZ25pdGlvbi4KLSAgICAgIDAuMzIgICAgMTktZmViLTk0ICAgVGlkeSB1cC4gSW1wcm92ZSBtdWx0aS1ERVBDQSBzdXBwb3J0LgotICAgICAgMC4zMyAgICAyNS1mZWItOTQgICBGaXggREVQQ0EgZXRoZXJuZXQgUk9NIGNvdW50ZXIgZW5hYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgamFiYmVyIHBhY2tldCBmaXggZnJvbSBtdXJmQHBlcmZ0ZWNoLmNvbQotCQkJICBhbmQgYmVja2VyQHN1cGVyLm9yZwotICAgICAgMC4zNCAgICAgNy1tYXItOTQgICBGaXggREVQQ0EgbWF4IG5ldHdvcmsgbWVtb3J5IFJBTSAmIE5JQ1NSIGFjY2Vzcy4KLSAgICAgIDAuMzUgICAgIDgtbWFyLTk0ICAgQWRkZWQgREUyMDEgcmVjb2duaXRpb24uIFRpZGllZCB1cC4KLSAgICAgIDAuMzUxICAgMzAtYXByLTk0ICAgQWRkZWQgRUlTQSBzdXBwb3J0LiBBZGRlZCBERTQyMiByZWNvZ25pdGlvbi4KLSAgICAgIDAuMzYgICAgMTYtbWF5LTk0ICAgREU0MjIgZml4IHJlbGVhc2VkLgotICAgICAgMC4zNyAgICAyMi1qdWwtOTQgICBBZGRlZCBNT0RVTEUgc3VwcG9ydAotICAgICAgMC4zOCAgICAxNS1hdWctOTQgICBBZGRlZCBEQlIgUk9NIHN3aXRjaCBpbiBkZXBjYV9jbG9zZSgpLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGkgREVQQ0EgYnVnIGZpeC4KLSAgICAgIDAuMzhheHAgMTUtc2VwLTk0ICAgU3BlY2lhbCB2ZXJzaW9uIGZvciBBbHBoYSBBWFAgTGludXggVjEuMC4KLSAgICAgIDAuMzgxICAgMTItZGVjLTk0ICAgQWRkZWQgREUxMDEgcmVjb2duaXRpb24sIGZpeCBtdWx0aWNhc3QgYnVnLgotICAgICAgMC4zODIgICAgOS1mZWItOTUgICBGaXggcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4uCi0gICAgICAwLjM4MyAgIDIyLWZlYi05NSAgIEZpeCBmb3IgY29uZmxpY3Qgd2l0aCBWRVNBIFNDU0kgcmVwb3J0ZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9tYWluQGFsZi5kZWMuY29tPgotICAgICAgMC4zODQgICAxNy1tYXItOTUgICBGaXggYSByaW5nIGZ1bGwgYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4KLSAgICAgIDAuMzg1ICAgIDMtYXByLTk1ICAgRml4IGEgcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ5YW4ubmllbWlAbGFzdGZyb250aWVyLmNvbT4KLSAgICAgIDAuMzg2ICAgMjEtYXByLTk1ICAgRml4IHRoZSBsYXN0IGZpeC4uLnNvcnJ5LCBtdXN0IGJlIGdhbGxvcGluZyBzZW5pbGl0eQotICAgICAgMC40MCAgICAyNS1NYXktOTUgICBSZXdyaXRlIGZvciBwb3J0YWJpbGl0eSAmIHVwZGF0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBIHN1cHBvcnQgZnJvbSA8amVzdGFicm9AYW10LnRheTEuZGVjLmNvbT4KLSAgICAgIDAuNDEgICAgMjYtSnVuLTk1ICAgQWRkZWQgdmVyaWZ5X2FyZWEoKSBjYWxscyBpbiBkZXBjYV9pb2N0bCgpIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPgotICAgICAgMC40MiAgICAyNy1EZWMtOTUgICBBZGQgJ21lbScgc2hhcmVkIG1lbW9yeSBhc3NpZ25tZW50IGZvciBsb2FkYWJsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkICdhZGFwdGVyX25hbWUnIGZvciBsb2FkYWJsZSBtb2R1bGVzIHdoZW4gbm8gUFJPTS4KLQkJCSAgQm90aCBhYm92ZSBmcm9tIGEgc3VnZ2VzdGlvbiBieSAKLQkJCSAgPHBjaGVuQHdvb2RydWZmczEyMS5yZXNpZGVuY2UuZ2F0ZWNoLmVkdT4uCi0JCQkgIEFkZCBuZXcgbXVsdGljYXN0aW5nIGNvZGUuCi0gICAgICAwLjQyMSAgIDIyLUFwci05NgkgIEZpeCBhbGxvY19kZXZpY2UoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KLSAgICAgIDAuNDIyICAgMjktQXByLTk2CSAgRml4IGRlcGNhX2h3X2luaXQoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KLSAgICAgIDAuNDIzICAgIDctSnVuLTk2ICAgRml4IG1vZHVsZSBsb2FkIGJ1ZyA8a21nQGJhcmNvLmJlPgotICAgICAgMC40MyAgICAxNi1BdWctOTYgICBVcGRhdGUgYWxsb2NfZGV2aWNlKCkgdG8gY29uZm9ybSB0byBkZTR4NS5jCi0gICAgICAwLjQ0ICAgICAxLVNlcC05NyAgIEZpeCAqX3Byb2JlKCkgdG8gdGVzdCBjaGVja19yZWdpb24oKSBmaXJzdCAtIGJ1ZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgPG1tb2dpbHZpQGVsYmVydC51Y2NzLmVkdT4KLSAgICAgIDAuNDUgICAgIDMtTm92LTk4ICAgQWRkZWQgc3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgKERFMjEwL0RFMjEyKSBjYXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPHR5bW1AY29tcHV0ZXIub3JnPiAKLSAgICAgIDAuNDUxICAgIDUtTm92LTk4ICAgRml4ZWQgbWNhIHN0dWZmIGN1eiBJJ20gYSBkdW1teS4gPHR5bW1AY29tcHV0ZXIub3JnPgotICAgICAgMC41ICAgICAxNC1Ob3YtOTggICBSZS1zcGluIGZvciAyLjEueCBrZXJuZWxzLgotICAgICAgMC41MSAgICAyNy1KdW4tOTkgICBDb3JyZWN0IHJlY2VpdmVkIHBhY2tldCBsZW5ndGggZm9yIENSQyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgYnkgPHdvcm1AZGtpay5kaz4KLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKLSNpbmNsdWRlICJuaWMuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgotCi0vKgotKiogSS9PIGFkZHJlc3Nlcy4gTm90ZSB0aGF0IHRoZSAyayBidWZmZXIgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4KLSoqIHRoaXMgZHJpdmVyLgotKi8KLSNkZWZpbmUgREVQQ0FfTklDU1IgaW9hZGRyKzB4MDAgICAvKiBOZXR3b3JrIGludGVyZmFjZSBDU1IgKi8KLSNkZWZpbmUgREVQQ0FfUkJJICAgaW9hZGRyKzB4MDIgICAvKiBSQU0gYnVmZmVyIGluZGV4ICgyayBidWZmZXIgbW9kZSkgKi8KLSNkZWZpbmUgREVQQ0FfREFUQSAgaW9hZGRyKzB4MDQgICAvKiBMQU5DRSByZWdpc3RlcnMnIGRhdGEgcG9ydCAqLwotI2RlZmluZSBERVBDQV9BRERSICBpb2FkZHIrMHgwNiAgIC8qIExBTkNFIHJlZ2lzdGVycycgYWRkcmVzcyBwb3J0ICovCi0jZGVmaW5lIERFUENBX0hCQVNFIGlvYWRkcisweDA4ICAgLyogRUlTQSBoaWdoIG1lbW9yeSBiYXNlIGFkZHJlc3MgcmVnLiAqLwotI2RlZmluZSBERVBDQV9QUk9NICBpb2FkZHIrMHgwYyAgIC8qIEV0aGVybmV0IGFkZHJlc3MgUk9NIGRhdGEgcG9ydCAqLwotI2RlZmluZSBERVBDQV9DTkZHICBpb2FkZHIrMHgwYyAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBwb3J0ICovCi0jZGVmaW5lIERFUENBX1JCU0EgIGlvYWRkcisweDBlICAgLyogUkFNIGJ1ZmZlciBzdGFydGluZyBhZGRyZXNzICgyayBidWZmLikgKi8KLQotLyoKLSoqIFRoZXNlIGFyZSBMQU5DRSByZWdpc3RlcnMgYWRkcmVzc2FibGUgdGhyb3VnaCBERVBDQV9BRERSIAotKi8KLSNkZWZpbmUgQ1NSMCAgICAgICAwCi0jZGVmaW5lIENTUjEgICAgICAgMQotI2RlZmluZSBDU1IyICAgICAgIDIKLSNkZWZpbmUgQ1NSMyAgICAgICAzCi0KLS8qIAotKiogTkVUV09SSyBJTlRFUkZBQ0UgQ1NSIChOSV9DU1IpIGJpdCBkZWZpbml0aW9ucyAKLSovCi0gCi0jZGVmaW5lIFRPICAgICAgIAkweDAxMDAJLyogVGltZSBPdXQgZm9yIHJlbW90ZSBib290ICovCi0jZGVmaW5lIFNIRSAgICAgIAkweDAwODAgIC8qIFNIYWRvdyBtZW1vcnkgRW5hYmxlICovCi0jZGVmaW5lIEJTICAgICAgIAkweDAwNDAgIC8qIEJhbmsgU2VsZWN0ICovCi0jZGVmaW5lIEJVRiAgICAgIAkweDAwMjAJLyogQlVGZmVyIHNpemUgKDEtPjMyaywgMC0+NjRrKSAqLwotI2RlZmluZSBSQkUgICAgICAJMHgwMDEwCS8qIFJlbW90ZSBCb290IEVuYWJsZSAoMS0+bmV0IGJvb3QpICovCi0jZGVmaW5lIEFBQyAgICAgIAkweDAwMDggIC8qIEFkZHJlc3MgUk9NIEFkZHJlc3MgQ291bnRlciAoMS0+ZW5hYmxlKSAqLwotI2RlZmluZSBfMTI4S0IgICAgICAJMHgwMDA4ICAvKiAxMjhrQiBOZXR3b3JrIFJBTSAoMS0+ZW5hYmxlKSAqLwotI2RlZmluZSBJTSAgICAgICAJMHgwMDA0CS8qIEludGVycnVwdCBNYXNrICgxLT5tYXNrKSAqLwotI2RlZmluZSBJRU4gICAgICAJMHgwMDAyCS8qIEludGVycnVwdCB0cmlzdGF0ZSBFTmFibGUgKDEtPmVuYWJsZSkgKi8KLSNkZWZpbmUgTEVEICAgICAgCTB4MDAwMQkvKiBMRUQgY29udHJvbCAqLwotCi0vKiAKLSoqIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMgCi0qLwotCi0jZGVmaW5lIEVSUiAgICAgCTB4ODAwMCAJLyogRXJyb3Igc3VtbWFyeSAqLwotI2RlZmluZSBCQUJMICAgIAkweDQwMDAgCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yICAqLwotI2RlZmluZSBDRVJSICAgIAkweDIwMDAgCS8qIENvbGxpc2lvbiBFcnJvciAqLwotI2RlZmluZSBNSVNTICAgIAkweDEwMDAgCS8qIE1pc3NlZCBwYWNrZXQgKi8KLSNkZWZpbmUgTUVSUiAgICAJMHgwODAwIAkvKiBNZW1vcnkgRXJyb3IgKi8KLSNkZWZpbmUgUklOVCAgICAJMHgwNDAwIAkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVElOVCAgICAJMHgwMjAwIAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSURPTiAgICAJMHgwMTAwIAkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCi0jZGVmaW5lIElOVFIgICAgCTB4MDA4MCAJLyogSW50ZXJydXB0IEZsYWcgKi8KLSNkZWZpbmUgSU5FQSAgICAJMHgwMDQwIAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIFJYT04gICAgCTB4MDAyMCAJLyogUmVjZWl2ZXIgb24gKi8KLSNkZWZpbmUgVFhPTiAgICAJMHgwMDEwIAkvKiBUcmFuc21pdHRlciBvbiAqLwotI2RlZmluZSBURE1EICAgIAkweDAwMDggCS8qIFRyYW5zbWl0IERlbWFuZCAqLwotI2RlZmluZSBTVE9QICAgIAkweDAwMDQgCS8qIFN0b3AgKi8KLSNkZWZpbmUgU1RSVCAgICAJMHgwMDAyIAkvKiBTdGFydCAqLwotI2RlZmluZSBJTklUICAgIAkweDAwMDEgCS8qIEluaXRpYWxpemUgKi8KLSNkZWZpbmUgSU5UTSAgICAgICAgICAgIDB4ZmYwMCAgLyogSW50ZXJydXB0IE1hc2sgKi8KLSNkZWZpbmUgSU5URSAgICAgICAgICAgIDB4ZmZmMCAgLyogSW50ZXJydXB0IEVuYWJsZSAqLwotCi0vKgotKiogQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIDMgKENTUjMpCi0qLwotCi0jZGVmaW5lIEJTV1AgICAgCTB4MDAwNAkvKiBCeXRlIFNXYVAgKi8KLSNkZWZpbmUgQUNPTiAgICAJMHgwMDAyCS8qIEFMRSBjb250cm9sICovCi0jZGVmaW5lIEJDT04gICAgCTB4MDAwMQkvKiBCeXRlIENPTnRyb2wgKi8KLQotLyoKLSoqIEluaXRpYWxpemF0aW9uIEJsb2NrIE1vZGUgUmVnaXN0ZXIgCi0qLwotCi0jZGVmaW5lIFBST00gICAgICAgCTB4ODAwMCAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLwotI2RlZmluZSBFTUJBICAgICAgIAkweDAwODAJLyogRW5hYmxlIE1vZGlmaWVkIEJhY2stb2ZmIEFsZ29yaXRobSAqLwotI2RlZmluZSBJTlRMICAgICAgIAkweDAwNDAgCS8qIEludGVybmFsIExvb3BiYWNrICovCi0jZGVmaW5lIERSVFkgICAgICAgCTB4MDAyMCAJLyogRGlzYWJsZSBSZXRyeSAqLwotI2RlZmluZSBDT0xMICAgICAgIAkweDAwMTAgCS8qIEZvcmNlIENvbGxpc2lvbiAqLwotI2RlZmluZSBEVENSICAgICAgIAkweDAwMDggCS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDICovCi0jZGVmaW5lIExPT1AgICAgICAgCTB4MDAwNCAJLyogTG9vcGJhY2sgKi8KLSNkZWZpbmUgRFRYICAgICAgICAJMHgwMDAyIAkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLwotI2RlZmluZSBEUlggICAgICAgIAkweDAwMDEgCS8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCi0KLS8qCi0qKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciAxIChSTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAotKi8KLQotI2RlZmluZSBSX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLwotI2RlZmluZSBSX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLwotI2RlZmluZSBSX0ZSQU0gICAgCTB4MjAwMCAJLyogRnJhbWluZyBFcnJvciAqLwotI2RlZmluZSBSX09GTE8gICAgCTB4MTAwMCAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KLSNkZWZpbmUgUl9DUkMgICAgIAkweDA4MDAgCS8qIENSQyBFcnJvciAqLwotI2RlZmluZSBSX0JVRkYgICAgCTB4MDQwMCAJLyogQnVmZmVyIEVycm9yICovCi0jZGVmaW5lIFJfU1RQICAgICAJMHgwMjAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgUl9FTlAgICAgIAkweDAxMDAgCS8qIEVuZCBvZiBQYWNrZXQgKi8KLQotLyoKLSoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAxIChUTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAotKi8KLQotI2RlZmluZSBUX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLwotI2RlZmluZSBUX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLwotI2RlZmluZSBUX0FERF9GQ1MgCTB4MjAwMCAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLwotI2RlZmluZSBUX01PUkUgICAgCTB4MTAwMAkvKiA+MSByZXRyeSB0byB0cmFuc21pdCBwYWNrZXQgKi8KLSNkZWZpbmUgVF9PTkUgICAgIAkweDA4MDAgCS8qIDEgdHJ5IG5lZWRlZCB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCi0jZGVmaW5lIFRfREVGICAgICAJMHgwNDAwIAkvKiBEZWZlcnJlZCAqLwotI2RlZmluZSBUX1NUUCAgICAgICAweDAyMDAwMDAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgVF9FTlAgICAgICAgMHgwMTAwMDAwMAkvKiBFbmQgb2YgUGFja2V0ICovCi0jZGVmaW5lIFRfRkxBR1MgICAgIDB4ZmYwMDAwMDAgIC8qIFRYIEZsYWdzIEZpZWxkICovCi0KLS8qCi0qKiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgMyAoVE1EMykgYml0IGRlZmluaXRpb25zLgotKi8KLQotI2RlZmluZSBUTUQzX0JVRkYgICAgMHg4MDAwCS8qIEJVRkZlciBlcnJvciAqLwotI2RlZmluZSBUTUQzX1VGTE8gICAgMHg0MDAwCS8qIFVuZGVyRkxPdyBlcnJvciAqLwotI2RlZmluZSBUTUQzX1JFUyAgICAgMHgyMDAwCS8qIFJFU2VydmVkICovCi0jZGVmaW5lIFRNRDNfTENPTCAgICAweDEwMDAJLyogTGF0ZSBDT0xsaXNpb24gKi8KLSNkZWZpbmUgVE1EM19MQ0FSICAgIDB4MDgwMAkvKiBMb3NzIG9mIENBUnJpZXIgKi8KLSNkZWZpbmUgVE1EM19SVFJZICAgIDB4MDQwMAkvKiBSZVRSWSBlcnJvciAqLwotCi0vKgotKiogRXRoZXJuZXQgUFJPTSBkZWZpbmVzCi0qLwotI2RlZmluZSBQUk9CRV9MRU5HVEggICAgMzIKLQotLyoKLSoqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLiBFbnN1cmUgdGhhdCB0aGUgbWVtb3J5IHJlcXVlc3RlZAotKiogaGVyZSBpcyA8PSB0byB0aGUgYW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgc2V0IHVwIGJ5IHRoZSBib2FyZCBzd2l0Y2hlcy4KLSoqIFRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgTVVTVCBCRSBBIFBPV0VSIE9GIDIuCi0qKgotKiogdG90YWxfbWVtb3J5ID0gTlVNX1JYX0RFU0MqKDgrUlhfQlVGRl9TWikgKyBOVU1fVFhfREVTQyooOCtUWF9CVUZGX1NaKQotKi8KLSNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgKi8KLSNkZWZpbmUgTlVNX1RYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KLSNkZWZpbmUgUlhfQlVGRl9TWgkxNTM2ICAgICAgICAgICAgLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggUnggYnVmZmVyICovCi0jZGVmaW5lIFRYX0JVRkZfU1oJMTUzNiAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFR4IGJ1ZmZlciAqLwotCi0vKgotKiogSVNBIEJ1cyBkZWZpbmVzCi0qLwotI2RlZmluZSBERVBDQV9JT19QT1JUUwl7MHgzMDAsIDB4MjAwLCAwfQotCi0jaWZuZGVmCURFUENBX01PREVMCi0jZGVmaW5lCURFUENBX01PREVMCURFUENBCi0jZW5kaWYKLQotc3RhdGljIGVudW0gewotCURFUENBLCBERTEwMCwgREUxMDEsIERFMjAwLCBERTIwMSwgREUyMDIsIERFMjEwLCBERTIxMiwgREU0MjIsIHVua25vd24KLX0gYWRhcHRlciA9IERFUENBX01PREVMOwotCi0vKgotKiogTmFtZSA8LT4gQWRhcHRlciBtYXBwaW5nCi0qLwotCi1zdGF0aWMgY2hhciAqYWRhcHRlcl9uYW1lW10gPSB7Ci0JIkRFUENBIiwKLQkiREUxMDAiLCJERTEwMSIsCi0JIkRFMjAwIiwiREUyMDEiLCJERTIwMiIsCi0JIkRFMjEwIiwiREUyMTIiLAotCSJERTQyMiIsCi0JIiIKLX07Ci0KLSNpZm5kZWYJREVQQ0FfUkFNX0JBU0UKLSNkZWZpbmUgREVQQ0FfUkFNX0JBU0UJMHhkMDAwMAotI2VuZGlmCi0KLS8qCi0qKiBNZW1vcnkgQWxpZ25tZW50LiBFYWNoIGRlc2NyaXB0b3IgaXMgNCBsb25nd29yZHMgbG9uZy4gVG8gZm9yY2UgYQotKiogcGFydGljdWxhciBhbGlnbm1lbnQgb24gdGhlIFRYIGRlc2NyaXB0b3IsIGFkanVzdCBERVNDX1NLSVBfTEVOIGFuZAotKiogREVTQ19BTElHTi4gQUxJR04gYWxpZ25zIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBwcml2YXRlIG1lbW9yeSBhcmVhCi0qKiBhbmQgaGVuY2UgdGhlIFJYIGRlc2NyaXB0b3IgcmluZydzIGZpcnN0IGVudHJ5LiAKLSovCi0jZGVmaW5lIEFMSUdONCAgICAgICgodTMyKTQgLSAxKSAgICAgICAvKiAxIGxvbmd3b3JkIGFsaWduICovCi0jZGVmaW5lIEFMSUdOOCAgICAgICgodTMyKTggLSAxKSAgICAgICAvKiAyIGxvbmd3b3JkIChxdWFkd29yZCkgYWxpZ24gKi8KLSNkZWZpbmUgQUxJR04gICAgICAgICBBTElHTjggICAgICAgICAgICAgIC8qIEtlZXAgdGhlIExBTkNFIGhhcHB5Li4uICovCi0KLXR5cGVkZWYJbG9uZwkJczMyOwotdHlwZWRlZgl1bnNpZ25lZCBsb25nCXUzMjsKLXR5cGVkZWYJc2hvcnQJCXMxNjsKLXR5cGVkZWYJdW5zaWduZWQgc2hvcnQJdTE2OwotdHlwZWRlZgljaGFyCQlzODsKLXR5cGVkZWYJdW5zaWduZWQgY2hhcgl1ODsKLQotLyoKLSoqIFRoZSBERVBDQSBSeCBhbmQgVHggcmluZyBkZXNjcmlwdG9ycy4gCi0qLwotc3RydWN0IGRlcGNhX3J4X2Rlc2MgewotICAgIHZvbGF0aWxlIHMzMiBiYXNlOwotICAgIHMxNiBidWZfbGVuZ3RoOwkJLyogVGhpcyBsZW5ndGggaXMgbmVnYXRpdmUgMidzIGNvbXBsZW1lbnQhICovCi0gICAgczE2IG1zZ19sZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyAibm9ybWFsIi4gKi8KLX07Ci0KLXN0cnVjdCBkZXBjYV90eF9kZXNjIHsKLSAgICB2b2xhdGlsZSBzMzIgYmFzZTsKLSAgICBzMTYgbGVuZ3RoOwkJICAgICAgICAvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KLSAgICBzMTYgbWlzYzsgICAgICAgICAgICAgICAgICAgLyogRXJyb3JzIGFuZCBURFIgaW5mbyAqLwotfTsKLQotI2RlZmluZSBMQV9NQVNLIDB4MDAwMGZmZmYgICAgICAvKiBMQU5DRSBhZGRyZXNzIG1hc2sgZm9yIG1hcHBpbmcgbmV0d29yayBSQU0KLQkJCQkgICB0byBMQU5DRSBtZW1vcnkgYWRkcmVzcyBzcGFjZSAqLwotCi0vKgotKiogVGhlIExhbmNlIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2ssIGluIGNvbW1vbiBtZW1vcnkuCi0qLwotc3RydWN0IGRlcGNhX2luaXQgewotICAgIHUxNiBtb2RlOwkgICAgICAgICAgICAgICAgLyogTW9kZSByZWdpc3RlciAqLwotICAgIHU4ICBwaHlzX2FkZHJbRVRIX0FMRU5dOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCi0gICAgdTggIG1jYXN0X3RhYmxlWzhdOwkgICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlLiAqLwotICAgIHUzMiByeF9yaW5nOyAgICAgCSAgICAgICAgLyogUnggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLwotICAgIHUzMiB0eF9yaW5nOwkgICAgICAgIC8qIFR4IHJpbmcgYmFzZSBwb2ludGVyICYgcmluZyBsZW5ndGggKi8KLX07Ci0KLXN0cnVjdCBkZXBjYV9wcml2YXRlIHsKLQlzdHJ1Y3QgZGVwY2FfcnhfZGVzYwkqcnhfcmluZzsKLQlzdHJ1Y3QgZGVwY2FfdHhfZGVzYwkqdHhfcmluZzsKLQlzdHJ1Y3QgZGVwY2FfaW5pdAlpbml0X2Jsb2NrOwkvKiBTaGFkb3cgaW5pdCBibG9jayAqLwotCWNoYXIJCQkqcnhfbWVtY3B5W05VTV9SWF9ERVNDXTsKLQljaGFyCQkJKnR4X21lbWNweVtOVU1fVFhfREVTQ107Ci0JdTMyCQkJYnVzX29mZnNldDsJLyogSVNBIGJ1cyBhZGRyZXNzIG9mZnNldCAqLwotCXUzMgkJCXNoX21lbTsJCS8qIGFkZHJlc3Mgb2Ygc2hhcmVkIG1lbSAqLwotCXUzMgkJCWRtYV9idWZmczsJLyogUnggJiBUeCBidWZmZXIgc3RhcnQgKi8KLQlpbnQJCQlyeF9jdXIsIHR4X2N1cjsJLyogTmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KLQlpbnQJCQl0eFJpbmdNYXNrLCByeFJpbmdNYXNrOwotCXMzMgkJCXJ4X3JsZW4sIHR4X3JsZW47Ci0JLyogbG9nMihbcnRdeFJpbmdNYXNrKzEpIGZvciB0aGUgZGVzY3JpcHRvcnMgKi8KLX07Ci0KLXN0YXRpYyBBZGRyZXNzCQltZW1fc3RhcnQgPSBERVBDQV9SQU1fQkFTRTsKLXN0YXRpYyBBZGRyZXNzCQltZW1fbGVuLCBvZmZzZXQ7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyID0gMDsKLXN0YXRpYyBzdHJ1Y3QgZGVwY2FfcHJpdmF0ZQlscDsKLQotLyoKLSoqIE1pc2NlbGxhbmVvdXMgZGVmaW5lcy4uLgotKi8KLSNkZWZpbmUgU1RPUF9ERVBDQSBcCi0gICAgb3V0dyhDU1IwLCBERVBDQV9BRERSKTtcCi0gICAgb3V0dyhTVE9QLCBERVBDQV9EQVRBKQotCi0vKiBJbml0aWFsaXplIHRoZSBsYW5jZSBSeCBhbmQgVHggZGVzY3JpcHRvciByaW5ncy4gKi8KLXN0YXRpYyB2b2lkIGRlcGNhX2luaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CWk7Ci0JdTMyCXA7Ci0KLQlscC5yeF9jdXIgPSBscC50eF9jdXIgPSAwOwotCS8qIEluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgZWFjaCBidWZmZXIgaW4gdGhlIHJpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IGxwLnJ4UmluZ01hc2s7IGkrKykgewotCQl3cml0ZWwoKHAgPSBscC5kbWFfYnVmZnMgKyBpICogUlhfQlVGRl9TWikgfCBSX09XTiwgJmxwLnJ4X3JpbmdbaV0uYmFzZSk7Ci0JCXdyaXRldygtUlhfQlVGRl9TWiwgJmxwLnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCk7Ci0JCWxwLnJ4X21lbWNweVtpXSA9IChjaGFyICopIChwICsgbHAuYnVzX29mZnNldCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPD0gbHAudHhSaW5nTWFzazsgaSsrKSB7Ci0JCXdyaXRlbCgocCA9IGxwLmRtYV9idWZmcyArIChpICsgbHAudHhSaW5nTWFzayArIDEpICogVFhfQlVGRl9TWikgJiAweDAwZmZmZmZmLCAmbHAudHhfcmluZ1tpXS5iYXNlKTsKLQkJbHAudHhfbWVtY3B5W2ldID0gKGNoYXIgKikgKHAgKyBscC5idXNfb2Zmc2V0KTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCi0JbHAuaW5pdF9ibG9jay5yeF9yaW5nID0gKCh1MzIpICgodTMyKSBscC5yeF9yaW5nKSAmIExBX01BU0spIHwgbHAucnhfcmxlbjsKLQlscC5pbml0X2Jsb2NrLnR4X3JpbmcgPSAoKHUzMikgKCh1MzIpIGxwLnR4X3JpbmcpICYgTEFfTUFTSykgfCBscC50eF9ybGVuOwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQlscC5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOwotCWxwLmluaXRfYmxvY2subW9kZSA9IDB4MDAwMDsJLyogRW5hYmxlIHRoZSBUeCBhbmQgUnggKi8KLQltZW1zZXQobHAuaW5pdF9ibG9jay5tY2FzdF90YWJsZSwgMCwgc2l6ZW9mKGxwLmluaXRfYmxvY2subWNhc3RfdGFibGUpKTsKLX0KLQotc3RhdGljIHZvaWQgTG9hZENTUnModm9pZCkKLXsKLQlvdXR3KENTUjEsIERFUENBX0FERFIpOwkvKiBpbml0aWFsaXNhdGlvbiBibG9jayBhZGRyZXNzIExTVyAqLwotCW91dHcoKHUxNikgKGxwLnNoX21lbSAmIExBX01BU0spLCBERVBDQV9EQVRBKTsKLQlvdXR3KENTUjIsIERFUENBX0FERFIpOwkvKiBpbml0aWFsaXNhdGlvbiBibG9jayBhZGRyZXNzIE1TVyAqLwotCW91dHcoKHUxNikgKChscC5zaF9tZW0gJiBMQV9NQVNLKSA+PiAxNiksIERFUENBX0RBVEEpOwotCW91dHcoQ1NSMywgREVQQ0FfQUREUik7CS8qIEFMRSBjb250cm9sICovCi0Jb3V0dyhBQ09OLCBERVBDQV9EQVRBKTsKLQlvdXR3KENTUjAsIERFUENBX0FERFIpOwkvKiBQb2ludCBiYWNrIHRvIENTUjAgKi8KLX0KLQotc3RhdGljIGludCBJbml0UmVzdGFydERlcGNhKHZvaWQpCi17Ci0JaW50CQlpOwotCi0JLyogQ29weSB0aGUgc2hhZG93IGluaXRfYmxvY2sgdG8gc2hhcmVkIG1lbW9yeSAqLwotCW1lbWNweV90b2lvKChjaGFyICopbHAuc2hfbWVtLCAmbHAuaW5pdF9ibG9jaywgc2l6ZW9mKHN0cnVjdCBkZXBjYV9pbml0KSk7Ci0Jb3V0dyhDU1IwLCBERVBDQV9BRERSKTsJCS8qIHBvaW50IGJhY2sgdG8gQ1NSMCAqLwotCW91dHcoSU5JVCwgREVQQ0FfREFUQSk7CQkvKiBpbml0aWFsaXNlIERFUENBICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgMTAwICYmICEoaW53KERFUENBX0RBVEEpICYgSURPTik7IGkrKykKLQkJOwotCWlmIChpIDwgMTAwKSB7Ci0JCS8qIGNsZWFyIElET04gYnkgd3JpdGluZyBhIDEsIGFuZCBzdGFydCBMQU5DRSAqLwotCQlvdXR3KElET04gfCBTVFJULCBERVBDQV9EQVRBKTsKLQl9IGVsc2UgewotCQlwcmludGYoIkRFUENBIG5vdCBpbml0aWFsaXNlZFxuIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkZXBjYV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JczE2CW5pY3NyOwotCWludAlpLCBqOwotCi0JU1RPUF9ERVBDQTsKLQluaWNzciA9IGluYihERVBDQV9OSUNTUik7Ci0Jbmljc3IgPSAoKG5pY3NyICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKLQlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7Ci0JaWYgKGludyhERVBDQV9EQVRBKSAhPSBTVE9QKQotCXsKLQkJcHJpbnRmKCJkZXBjYTogQ2Fubm90IHN0b3AgTklDXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEluaXRpYWxpc2F0aW9uIGJsb2NrICovCi0JbHAuc2hfbWVtID0gbWVtX3N0YXJ0OwotCW1lbV9zdGFydCArPSBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpOwotCS8qIFR4ICYgUnggZGVzY3JpcHRvcnMgKGFsaWduZWQgdG8gYSBxdWFkd29yZCBib3VuZGFyeSkgKi8KLQltZW1fc3RhcnQgPSAobWVtX3N0YXJ0ICsgQUxJR04pICYgfkFMSUdOOwotCWxwLnJ4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3J4X2Rlc2MgKikgbWVtX3N0YXJ0OwotCW1lbV9zdGFydCArPSAoc2l6ZW9mKHN0cnVjdCBkZXBjYV9yeF9kZXNjKSAqIE5VTV9SWF9ERVNDKTsKLQlscC50eF9yaW5nID0gKHN0cnVjdCBkZXBjYV90eF9kZXNjICopIG1lbV9zdGFydDsKLQltZW1fc3RhcnQgKz0gKHNpemVvZihzdHJ1Y3QgZGVwY2FfdHhfZGVzYykgKiBOVU1fVFhfREVTQyk7Ci0KLQlscC5idXNfb2Zmc2V0ID0gbWVtX3N0YXJ0ICYgMHgwMGZmMDAwMDsKLQkvKiBMQU5DRSByZS1tYXBwZWQgc3RhcnQgYWRkcmVzcyAqLwotCWxwLmRtYV9idWZmcyA9IG1lbV9zdGFydCAmIExBX01BU0s7Ci0KLQkvKiBGaW5pc2ggaW5pdGlhbGlzaW5nIHRoZSByaW5nIGluZm9ybWF0aW9uLiAqLwotCWxwLnJ4UmluZ01hc2sgPSBOVU1fUlhfREVTQyAtIDE7Ci0JbHAudHhSaW5nTWFzayA9IE5VTV9UWF9ERVNDIC0gMTsKLQotCS8qIENhbGN1bGF0ZSBUeC9SeCBSTEVOIHNpemUgZm9yIHRoZSBkZXNjcmlwdG9ycy4gKi8KLQlmb3IgKGkgPSAwLCBqID0gbHAucnhSaW5nTWFzazsgaiA+IDA7IGkrKykgewotCQlqID4+PSAxOwotCX0KLQlscC5yeF9ybGVuID0gKHMzMikgKGkgPDwgMjkpOwotCWZvciAoaSA9IDAsIGogPSBscC50eFJpbmdNYXNrOyBqID4gMDsgaSsrKSB7Ci0JCWogPj49IDE7Ci0JfQotCWxwLnR4X3JsZW4gPSAoczMyKSAoaSA8PCAyOSk7Ci0KLQkvKiBMb2FkIHRoZSBpbml0aWFsaXNhdGlvbiBibG9jayAqLwotCWRlcGNhX2luaXRfcmluZyhuaWMpOwotCUxvYWRDU1JzKCk7Ci0JSW5pdFJlc3RhcnREZXBjYSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBPTEwgLSBXYWl0IGZvciBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGRlcGNhX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJZW50cnk7Ci0JdTMyCQlzdGF0dXM7Ci0KLQllbnRyeSA9IGxwLnJ4X2N1cjsKLQlpZiAoKHN0YXR1cyA9IHJlYWRsKCZscC5yeF9yaW5nW2VudHJ5XS5iYXNlKSAmIFJfT1dOKSkKLQkJcmV0dXJuICgwKTsKLQltZW1jcHkobmljLT5wYWNrZXQsIGxwLnJ4X21lbWNweVtlbnRyeV0sIG5pYy0+cGFja2V0bGVuID0gbHAucnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCk7Ci0JbHAucnhfcmluZ1tlbnRyeV0uYmFzZSB8PSBSX09XTjsKLQlscC5yeF9jdXIgPSAoKytscC5yeF9jdXIpICYgbHAucnhSaW5nTWFzazsKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZGVwY2FfdHJhbnNtaXQoCi0Jc3RydWN0IG5pYyAqbmljLAotCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KLQl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCi0JdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwotCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCi17Ci0JaW50CQllbnRyeSwgbGVuOwotCWNoYXIJCSptZW07Ci0KLQkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KLQkvKgotCSoqIENhdXRpb246IHRoZSByaWdodCBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZS4uLiBkb250Ci0JKiogc2V0dXAgdGhlIG93bmVyc2hpcCByaWdodHMgdW50aWwgYWxsIHRoZSBvdGhlcgotCSoqIGluZm9ybWF0aW9uIGlzIGluIHBsYWNlCi0JKi8KLQltZW0gPSBscC50eF9tZW1jcHlbZW50cnkgPSBscC50eF9jdXJdOwotCW1lbWNweV90b2lvKG1lbSwgZCwgRVRIX0FMRU4pOwotCW1lbWNweV90b2lvKG1lbSArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCW1lbVtFVEhfQUxFTiAqIDJdID0gdCA+PiA4OwotCW1lbVtFVEhfQUxFTiAqIDIgKyAxXSA9IHQ7Ci0JbWVtY3B5X3RvaW8obWVtICsgRVRIX0hMRU4sIHAsIHMpOwotCXMgKz0gRVRIX0hMRU47Ci0JbGVuID0gKHMgPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogcyk7Ci0JLyogY2xlYW4gb3V0IGZsYWdzICovCi0Jd3JpdGVsKHJlYWRsKCZscC50eF9yaW5nW2VudHJ5XS5iYXNlKSAmIH5UX0ZMQUdTLCAmbHAudHhfcmluZ1tlbnRyeV0uYmFzZSk7Ci0JLyogY2xlYXJzIG90aGVyIGVycm9yIGZsYWdzICovCi0Jd3JpdGV3KDB4MDAwMCwgJmxwLnR4X3JpbmdbZW50cnldLm1pc2MpOwotCS8qIHBhY2tldCBsZW5ndGggaW4gYnVmZmVyICovCi0Jd3JpdGV3KC1sZW4sICZscC50eF9yaW5nW2VudHJ5XS5sZW5ndGgpOwotCS8qIHN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0LCBvd25lcnNoaXAgKi8KLQl3cml0ZWwocmVhZGwoJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpIHwgKFRfU1RQfFRfRU5QfFRfT1dOKSwgJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpOwotCS8qIHVwZGF0ZSBjdXJyZW50IHBvaW50ZXJzICovCi0JbHAudHhfY3VyID0gKCsrbHAudHhfY3VyKSAmIGxwLnR4UmluZ01hc2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZGVwY2FfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JU1RPUF9ERVBDQTsKLX0KLQotLyoKLSoqIExvb2sgZm9yIGEgc3BlY2lhbCBzZXF1ZW5jZSBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gdGhhdAotKiogaXMgY29tbW9uIGFjcm9zcyBhbGwgREVQQ0EgcHJvZHVjdHMuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgREVQQ0EgbmVlZHMKLSoqIGl0cyBST00gYWRkcmVzcyBjb3VudGVyIHRvIGJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkLiBPbmx5IGVuYWJsZQotKiogaWYgdGhlIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgaXMgYSAweDA4IC0gdGhpcyBtaW5pbWlzZXMgdGhlIGNoYW5jZXMgb2YKLSoqIG1lc3NpbmcgYXJvdW5kIHdpdGggc29tZSBvdGhlciBoYXJkd2FyZSwgYnV0IGl0IGFzc3VtZXMgdGhhdCB0aGlzIERFUENBCi0qKiBjYXJkIGluaXRpYWxpemVkIGl0c2VsZiBjb3JyZWN0bHkuCi0qKgotKiogU2VhcmNoIHRoZSBFdGhlcm5ldCBhZGRyZXNzIFJPTSBmb3IgdGhlIHNpZ25hdHVyZS4gU2luY2UgdGhlIFJPTSBhZGRyZXNzCi0qKiBjb3VudGVyIGNhbiBzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBzZWFyY2ggbXVzdCBpbmNsdWRlIHRoZSBlbnRpcmUKLSoqIHByb2JlIHNlcXVlbmNlIGxlbmd0aCBwbHVzIHRoZSAobGVuZ3RoX29mX3RoZV9zaWduYXR1cmUgLSAxKS4KLSoqIFN0b3AgdGhlIHNlYXJjaCBJTU1FRElBVEVMWSBhZnRlciB0aGUgc2lnbmF0dXJlIGlzIGZvdW5kIHNvIHRoYXQgdGhlCi0qKiBQUk9NIGFkZHJlc3MgY291bnRlciBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCi0qKiBldGhlcm5ldCBhZGRyZXNzIGZvciBsYXRlciByZWFkIG91dC4KLSovCi1zdGF0aWMgaW50IGRlcGNhX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JdTgJZGF0YSwgbmljc3I7Ci0JLyogVGhpcyBpcyBvbmx5IGNvcnJlY3QgZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMsIGJ1dCB0aGVuCi0JICAgRXRoZXJib290IGRvZXNuJ3Qgd29yayBvbiBhbnl0aGluZyBidXQgYSBQQyAqLwotCXU4CXNpZ1tdID0geyAweEZGLCAweDAwLCAweDU1LCAweEFBLCAweEZGLCAweDAwLCAweDU1LCAweEFBIH07Ci0JaW50CWksIGo7Ci0JbG9uZwlzdW0sIGNoa3N1bTsKLQotCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CQkvKiBjbGVhciBjb3VudGVyIG9uIERFUENBICovCi0JZGF0YSA9IGluYihERVBDQV9QUk9NKTsJCS8qIHJlYWQgZGF0YSAqLwotCWlmIChkYXRhID09IDB4OCkgewotCQluaWNzciA9IGluYihERVBDQV9OSUNTUik7Ci0JCW5pY3NyIHw9IEFBQzsKLQkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOwotCX0KLQlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IChpbnQpc2l6ZW9mKHNpZykgJiYgaSA8IFBST0JFX0xFTkdUSCsoKGludClzaXplb2Yoc2lnKSktMTsgKytpKSB7Ci0JCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7Ci0JCWlmIChkYXRhID09IHNpZ1tqXSkJCS8qIHRyYWNrIHNpZ25hdHVyZSAqLwotCQkJKytqOwotCQllbHNlCi0JCQlqID0gKGRhdGEgPT0gc2lnWzBdKSA/IDEgOiAwOwotCX0KLQlpZiAoaiAhPSBzaXplb2Yoc2lnKSkKLQkJcmV0dXJuICgwKTsKLQkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KLQlTVE9QX0RFUENBOwotCW5pY3NyID0gKChpbmIoREVQQ0FfTklDU1IpICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKLQlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7Ci0JaWYgKGludyhERVBDQV9EQVRBKSAhPSBTVE9QKQotCQlyZXR1cm4gKDApOwotCW1lbWNweSgoY2hhciAqKW1lbV9zdGFydCwgc2lnLCBzaXplb2Yoc2lnKSk7Ci0JaWYgKG1lbWNtcCgoY2hhciAqKW1lbV9zdGFydCwgc2lnLCBzaXplb2Yoc2lnKSkgIT0gMCkKLQkJcmV0dXJuICgwKTsKLQlmb3IgKGkgPSAwLCBqID0gMCwgc3VtID0gMDsgaiA8IDM7IGorKykgewotCQlzdW0gPDw9IDE7Ci0JCWlmIChzdW0gPiAweEZGRkYpCi0JCQlzdW0gLT0gMHhGRkZGOwotCQlzdW0gKz0gKHU4KShuaWMtPm5vZGVfYWRkcltpKytdID0gaW5iKERFUENBX1BST00pKTsKLQkJc3VtICs9ICh1MTYpKChuaWMtPm5vZGVfYWRkcltpKytdID0gaW5iKERFUENBX1BST00pKSA8PCA4KTsKLQkJaWYgKHN1bSA+IDB4RkZGRikKLQkJCXN1bSAtPSAweEZGRkY7Ci0JfQotCWlmIChzdW0gPT0gMHhGRkZGKQotCQlzdW0gPSAwOwotCWNoa3N1bSA9ICh1OClpbmIoREVQQ0FfUFJPTSk7Ci0JY2hrc3VtIHw9ICh1MTYpKGluYihERVBDQV9QUk9NKSA8PCA4KTsKLQltZW1fbGVuID0gKGFkYXB0ZXIgPT0gREVQQ0EpID8gKDQ4IDw8IDEwKSA6ICg2NCA8PCAxMCk7Ci0Jb2Zmc2V0ID0gMDsKLQlpZiAobmljc3IgJiBCVUYpIHsKLQkJb2Zmc2V0ID0gMHg4MDAwOwotCQluaWNzciAmPSB+QlM7Ci0JCW1lbV9sZW4gLT0gKDMyIDw8IDEwKTsKLQl9Ci0JaWYgKGFkYXB0ZXIgIT0gREVQQ0EpCS8qIGVuYWJsZSBzaGFkb3cgUkFNICovCi0JCW91dGIobmljc3IgfD0gU0hFLCBERVBDQV9OSUNTUik7Ci0JcHJpbnRmKCIlcyBiYXNlICUjaFgsIG1lbW9yeSBbJSNoWC0lI2hYXSwgYWRkciAlISIsCi0JCWFkYXB0ZXJfbmFtZVthZGFwdGVyXSwgaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9zdGFydCArIG1lbV9sZW4sCi0JCW5pYy0+bm9kZV9hZGRyKTsKLQlpZiAoc3VtICE9IGNoa3N1bSkKLQkJcHJpbnRmKCIgKGJhZCBjaGVja3N1bSkiKTsKLQlwdXRjaGFyKCdcbicpOwotCXJldHVybiAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICpkZXBjYV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLXsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQJYmFzZVtdID0gREVQQ0FfSU9fUE9SVFM7Ci0JaW50CQkJaTsKLQotCWlmIChwcm9iZV9hZGRycyA9PSAwIHx8IHByb2JlX2FkZHJzWzBdID09IDApCi0JCXByb2JlX2FkZHJzID0gYmFzZTsJLyogVXNlIGRlZmF1bHRzICovCi0JZm9yIChpID0gMDsgKGlvYWRkciA9IGJhc2VbaV0pICE9IDA7ICsraSkgewotCQlpZiAoZGVwY2FfcHJvYmUxKG5pYykpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGlvYWRkciA9PSAwKQotCQlyZXR1cm4gKDApOwotCWRlcGNhX3Jlc2V0KG5pYyk7Ci0JLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JbmljLT5yZXNldCA9IGRlcGNhX3Jlc2V0OwotCW5pYy0+cG9sbCA9IGRlcGNhX3BvbGw7Ci0JbmljLT50cmFuc21pdCA9IGRlcGNhX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IGRlcGNhX2Rpc2FibGU7Ci0JcmV0dXJuIChuaWMpOwotfQpJbmRleDogYi9uZXRib290L2Rldi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2Rldi5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgX0RFVl9ICisjZGVmaW5lIF9ERVZfSAorCisjaW5jbHVkZSAiaXNhLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKy8qIE5lZWQgdG8gY2hlY2sgdGhlIHBhY2tpbmcgb2YgdGhpcyBzdHJ1Y3QgaWYgRXRoZXJib290IGlzIHBvcnRlZCAqLworc3RydWN0IGRldl9pZAoreworCXVuc2lnbmVkIHNob3J0CXZlbmRvcl9pZDsKKwl1bnNpZ25lZCBzaG9ydAlkZXZpY2VfaWQ7CisJdW5zaWduZWQgY2hhcglidXNfdHlwZTsKKyNkZWZpbmUJUENJX0JVU19UWVBFCTEKKyNkZWZpbmUJSVNBX0JVU19UWVBFCTIKK307CisKKy8qIERvbnQgdXNlIHNpemVvZiwgdGhhdCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcgKi8KKyNkZWZpbmUJREVWX0lEX1NJWkUJOAorCisKK3N0cnVjdCBwY2lfcHJvYmVfc3RhdGUgCit7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBwY2lfZGV2aWNlIGRldjsKKwlpbnQgYWR2YW5jZTsKKyNlbHNlCisJaW50IGR1bW15OworI2VuZGlmCit9Oworc3RydWN0IGlzYV9wcm9iZV9zdGF0ZQoreworI2lmZGVmIENPTkZJR19JU0EKKwljb25zdCBzdHJ1Y3QgaXNhX2RyaXZlciAqZHJpdmVyOworCWludCBhZHZhbmNlOworI2Vsc2UKKwlpbnQgZHVtbXk7CisjZW5kaWYKK307CisKK3VuaW9uIHByb2JlX3N0YXRlCit7CisJc3RydWN0IHBjaV9wcm9iZV9zdGF0ZSBwY2k7CisJc3RydWN0IGlzYV9wcm9iZV9zdGF0ZSBpc2E7Cit9OworCitzdHJ1Y3QgZGV2Cit7CisJdm9pZAkJKCpkaXNhYmxlKVAoKHN0cnVjdCBkZXYgKikpOworCXN0cnVjdCBkZXZfaWQJZGV2aWQ7CS8qIGRldmljZSBJRCBzdHJpbmcgKHNlbnQgdG8gREhDUCBzZXJ2ZXIpICovCisJaW50CQlpbmRleDsgIC8qIEluZGV4IG9mIG5leHQgZGV2aWNlIG9uIHRoaXMgY29udHJvbGxlciB0byBwcm9iZSAqLworCWludAkJdHlwZTsJCS8qIFR5cGUgb2YgZGV2aWNlIEkgYW0gcHJvYmluZyBmb3IgKi8KKwlpbnQJCWhvd19wcm9iZTsJLyogRmlyc3QsIG5leHQgb3IgYXdha2UgKi8KKwlpbnQgCQl0b19wcm9iZTsJLyogRmxhdm9yIG9mIGRldmljZSBJIGFtIHByb2JpbmcgKi8KKwlpbnQJCWZhaWxzYWZlOwkvKiBGYWlsc2FmZSBwcm9iZSByZXF1ZXN0ZWQgKi8KKwlpbnQJCXR5cGVfaW5kZXg7CS8qIEluZGV4IG9mIHRoaXMgZGV2aWNlICh3aXRoaW4gdHlwZSkgKi8KKyNkZWZpbmUJUFJPQkVfTk9ORSAwCisjZGVmaW5lIFBST0JFX1BDSSAgMQorI2RlZmluZSBQUk9CRV9JU0EgIDIKKwl1bmlvbiBwcm9iZV9zdGF0ZSBzdGF0ZTsKK307CisKKworI2RlZmluZSBOSUNfRFJJVkVSICAgIDAKKyNkZWZpbmUgRElTS19EUklWRVIgICAxCisjZGVmaW5lIEZMT1BQWV9EUklWRVIgMgorCisjZGVmaW5lIEJSSURHRV9EUklWRVIgMTAwMAorCisjZGVmaW5lIFBST0JFX0ZJUlNUICAoLTEpCisjZGVmaW5lIFBST0JFX05FWFQgICAwCisjZGVmaW5lIFBST0JFX0FXQUtFICAxCQkvKiBBZnRlciBjYWxsaW5nIGRpc2FibGUgYnJpbmcgdXAgdGhlIHNhbWUgZGV2aWNlICovCisKKy8qIFRoZSBwcm9iZSByZXN1bHQgY29kZXMgYXJlIHNlbGVjdGVkCisgKiB0byBhbGxvdyB0aGVtIHRvIGJlIGZlZCBiYWNrIGludG8gdGhlIHByb2JlCisgKiByb3V0aW5lIGFuZCBnZXQgYSBzdWNjZXNzZnVsIHByb2JlLgorICovCisjZGVmaW5lIFBST0JFX0ZBSUxFRCBQUk9CRV9GSVJTVAorI2RlZmluZSBQUk9CRV9XT1JLRUQgIFBST0JFX05FWFQKKworZXh0ZXJuIGludCBwcm9iZShzdHJ1Y3QgZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOworCisjZW5kaWYgLyogX0RFVl9IICovCkluZGV4OiBiL25ldGJvb3QvZTEwMDAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9lMTAwMC5jCkBAIC0wLDAgKzEsMzY4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorSW50ZXIgUHJvIDEwMDAgZm9yIEV0aGVyYm9vdAorRHJpdmVycyBhcmUgcG9ydCBmcm9tIEludGVsJ3MgTGludXggZHJpdmVyIGUxMDAwLTQuMy4xNQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDMgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSBBcmNod2F5IERpZ2l0YWwgU29sdXRpb25zLgorICoKKyAqICB3cml0dGVuIGJ5IENocnNpdG9waGVyIExpIDxjbGkgYXQgYXJjeXdheSBkb3QgY29tPiBvciA8Y2hyaXNsIGF0IGdudWNoaW5hIGRvdCBvcmc+CisgKiAgMi85LzIwMDIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSBMaW51eCBOZXR3b3J4LgorICogIE1hc3NpdmUgdXBncmFkZSB0byB3b3JrIHdpdGggdGhlIG5ldyBpbnRlbCBnaWdhYml0IE5JQ3MuCisgKiAgPGViaWVkZXJtYW4gYXQgbG54aSBkb3QgY29tPgorICoKKyAqICBTdXBwb3J0IGZvciA4MjU0MWVpICYgODI1NDdlaSBjaGlwcyBmcm9tIEludGVsJ3MgTGludXggZHJpdmVyIDUuMS4xMyBhZGRlZCBieQorICogIEdlb3JnIEJhdW0gPGdiYXVtQHVzZXJzLnNmLm5ldD4sIHNwb25zb3JlZCBieSBQZXRhTWVtIEdtYkggYW5kIGxpbmtMSU5FIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogIDAxLzIwMDQ6IFVwZGF0ZWQgdG8gTGludXggZHJpdmVyIDUuMi4yMiBieSBHZW9yZyBCYXVtIDxnYmF1bUB1c2Vycy5zZi5uZXQ+CisgKi8KKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICpkbWFfYWRkcl90OworCit0eXBlZGVmIGVudW0geworCUZBTFNFID0gMCwKKwlUUlVFID0gMQorfSBib29sZWFuX3Q7CisKKyNkZWZpbmUgREVCVUcgMAorCisKKy8qIFNvbWUgcGllY2VzIG9mIGNvZGUgYXJlIGRpc2FibGVkIHdpdGggI2lmIDAgLi4uICNlbmRpZi4KKyAqIFRoZXkgYXJlIG5vdCBkZWxldGVkIHRvIHNob3cgd2hlcmUgdGhlIGV0aGVyYm9vdCBkcml2ZXIgZGlmZmVycworICogZnJvbSB0aGUgbGludXggZHJpdmVyIGJlbG93IHRoZSBmdW5jdGlvbiBsZXZlbC4KKyAqIFNvbWUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGUgaHcgc3RydWN0IGhhdmUgYmVlbiBlbGltaW5hdGVkCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wbGFjZSBjaGVja3MgaW5zZXJ0ZWQgaW5zdGVhZC4KKyAqIFBpZWNlcyBzdWNoIGFzIExFRCBoYW5kbGluZyB0aGF0IHdlIGRlZmluaXRlbHkgZG9uJ3QgbmVlZCBhcmUgZGVsZXRlZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgbm9ybWFsbHksCisgKiBidXQgbWF5IGJlIGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gcHJvZ3JhbSB0aGUgdHJhbnNtaXNzaW9uIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIHRoZSB3YXkgdGhlIExpbnV4IGRyaXZlciBkb2VzIGl0LiAqLworI3VuZGVmIExJTlVYX0RSSVZFUl9UQ1RMCisKKy8qIERlZmluZSB0aGlzIHRvIGJlaGF2ZSBtb3JlIGxpa2UgdGhlIExpbnV4IGRyaXZlci4gKi8KKyN1bmRlZiBMSU5VWF9EUklWRVIKKworI2luY2x1ZGUgImUxMDAwX2h3LmgiCisKKy8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZTEwMDBfaHcgaHc7CitzdGF0aWMgY2hhciB0eF9wb29sWzEyOCArIDE2XTsKK3N0YXRpYyBjaGFyIHJ4X3Bvb2xbMTI4ICsgMTZdOworc3RhdGljIGNoYXIgcGFja2V0WzIwOTZdOworCitzdGF0aWMgc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Jhc2U7CitzdGF0aWMgc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Jhc2U7CisKK3N0YXRpYyBpbnQgdHhfdGFpbDsKK3N0YXRpYyBpbnQgcnhfdGFpbCwgcnhfbGFzdDsKKworLyogRnVuY3Rpb24gZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZTEwMDBfc2V0dXBfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX3NldHVwX2NvcHBlcl9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfY29uZmlnX21hY190b19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfd2FpdF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgKnNwZWVkLCB1aW50MTZfdCAqZHVwbGV4KTsKK3N0YXRpYyBpbnQgZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCAqcGh5X2RhdGEpOworc3RhdGljIGludCBlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90ICpwaHlfZGF0YSk7CitzdGF0aWMgaW50IGUxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90IHBoeV9kYXRhKTsKK3N0YXRpYyBpbnQgZTEwMDBfd3JpdGVfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwgdWludDE2X3QgcGh5X2RhdGEpOworc3RhdGljIHZvaWQgZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9waHlfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX2RldGVjdF9naWdfcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBQcmludGluZyBtYWNyb3MuLi4gKi8KKworI2RlZmluZSBFMTAwMF9FUlIoYXJncy4uLikgcHJpbnRmKCJlMTAwMDogIiBhcmdzKQorCisjaWYgREVCVUcgPj0gMworI2RlZmluZSBFMTAwMF9EQkcoYXJncy4uLikgcHJpbnRmKCJlMTAwMDogIiBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRTEwMDBfREJHKGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBNU0dPVVQoUywgQSwgQikgICAgIHByaW50ayhTICJcbiIsIEEsIEIpCisjaWYgREVCVUcgPj0gMgorI2RlZmluZSBERUJVR0ZVTkMoRikgICAgICAgIERFQlVHT1VUKEYgIlxuIik7CisjZWxzZQorI2RlZmluZSBERUJVR0ZVTkMoRikKKyNlbmRpZgorI2lmIERFQlVHID49IDEKKyNkZWZpbmUgREVCVUdPVVQoUykgcHJpbnRmKFMpCisjZGVmaW5lIERFQlVHT1VUMShTLEEpIHByaW50ZihTLEEpCisjZGVmaW5lIERFQlVHT1VUMihTLEEsQikgcHJpbnRmKFMsQSxCKQorI2RlZmluZSBERUJVR09VVDMoUyxBLEIsQykgcHJpbnRmKFMsQSxCLEMpCisjZGVmaW5lIERFQlVHT1VUNyhTLEEsQixDLEQsRSxGLEcpIHByaW50ZihTLEEsQixDLEQsRSxGLEcpCisjZWxzZQorI2RlZmluZSBERUJVR09VVChTKQorI2RlZmluZSBERUJVR09VVDEoUyxBKQorI2RlZmluZSBERUJVR09VVDIoUyxBLEIpCisjZGVmaW5lIERFQlVHT1VUMyhTLEEsQixDKQorI2RlZmluZSBERUJVR09VVDcoUyxBLEIsQyxELEUsRixHKQorI2VuZGlmCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHKGEsIHJlZywgdmFsdWUpICggXAorICAgICgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IFwKKyAgICAgICAgKHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgRTEwMDBfIyNyZWcpKSkgOiBcCisgICAgICAgICh3cml0ZWwoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIEUxMDAwXzgyNTQyXyMjcmVnKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHKGEsIHJlZykgKCBcCisgICAgKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gXAorICAgICAgICByZWFkbCgoYSktPmh3X2FkZHIgKyBFMTAwMF8jI3JlZykgOiBcCisgICAgICAgIHJlYWRsKChhKS0+aHdfYWRkciArIEUxMDAwXzgyNTQyXyMjcmVnKSkKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQsIHZhbHVlKSAoIFwKKyAgICAoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBcCisgICAgICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgRTEwMDBfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKSA6IFwKKyAgICAgICAgd3JpdGVsKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyBFMTAwMF84MjU0Ml8jI3JlZyArICgob2Zmc2V0KSA8PCAyKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0KSAoIFwKKyAgICAoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBcCisgICAgICAgIHJlYWRsKChhKS0+aHdfYWRkciArIEUxMDAwXyMjcmVnICsgKChvZmZzZXQpIDw8IDIpKSA6IFwKKyAgICAgICAgcmVhZGwoKGEpLT5od19hZGRyICsgRTEwMDBfODI1NDJfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX0ZMVVNIKGEpIHt1aW50MzJfdCB4OyB4ID0gRTEwMDBfUkVBRF9SRUcoYSwgU1RBVFVTKTt9CisKK3VpbnQzMl90CitlMTAwMF9pb19yZWFkKHN0cnVjdCBlMTAwMF9odyAqaHcgX191bnVzZWQsIHVpbnQzMl90IHBvcnQpCit7CisgICAgICAgIHJldHVybiBpbmwocG9ydCk7Cit9CisKK3ZvaWQKK2UxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcgX191bnVzZWQsIHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IHZhbHVlKQoreworICAgICAgICBvdXRsKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDAwX3BjaV9zZXRfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfQ09NTUFORCwgaHctPnBjaV9jbWRfd29yZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwMF9wY2lfY2xlYXJfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIGh3LT5wY2lfY21kX3dvcmQgJiB+UENJX0NPTU1BTkRfSU5WQUxJREFURSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhaXNlcyB0aGUgRUVQUk9NJ3MgY2xvY2sgaW5wdXQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGVlY2QgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplZWNkKQoreworCS8qIFJhaXNlIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbgorCSAqIHdhaXQgPGRlbGF5PiBtaWNyb3NlY29uZHMuCisJICovCisJKmVlY2QgPSAqZWVjZCB8IEUxMDAwX0VFQ0RfU0s7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZCk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlIAorICogZWVjZCAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfbG93ZXJfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVlY2QpCit7CisJLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IGNsZWFyaW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbiAKKwkgKiB3YWl0IDUwIG1pY3Jvc2Vjb25kcy4gCisJICovCisJKmVlY2QgPSAqZWVjZCAmIH5FMTAwMF9FRUNEX1NLOworCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgKmVlY2QpOworCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwl1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIG91dCB0byB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBkYXRhIC0gZGF0YSB0byBzZW5kIHRvIHRoZSBFRVBST00KKyAqIGNvdW50IC0gbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgb3V0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworCXVpbnQzMl90IGVlY2Q7CisJdWludDMyX3QgbWFzazsKKwkKKwkvKiBXZSBuZWVkIHRvIHNoaWZ0ICJjb3VudCIgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4gU28sIHZhbHVlIGluIHRoZQorCSAqICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIG9uZSBiaXQgYXQgYSB0aW1lLgorCSAqIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4gCisJICovCisJbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9ETzsKKwl9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCWVlY2QgfD0gRTEwMDBfRUVDRF9ETzsKKwl9CisJZG8geworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisJCSAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisJCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKwkJICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisJCQorCQlpZihkYXRhICYgbWFzaykKKwkJCWVlY2QgfD0gRTEwMDBfRUVDRF9ESTsKKwkJCisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJCisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCQkKKwkJZTEwMDBfcmFpc2VfZWVfY2xrKGh3LCAmZWVjZCk7CisJCWUxMDAwX2xvd2VyX2VlX2NsayhodywgJmVlY2QpOworCQkKKwkJbWFzayA9IG1hc2sgPj4gMTsKKwkJCisJfSB3aGlsZShtYXNrKTsKKworCS8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLworCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIGluIGZyb20gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDE2X3QKK2UxMDAwX3NoaWZ0X2luX2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpCit7CisJdWludDMyX3QgZWVjZDsKKwl1aW50MzJfdCBpOworCXVpbnQxNl90IGRhdGE7CisJCisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnIAorCSAqIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NLiBCaXRzIGFyZSAic2hpZnRlZCBpbiIgYnkgcmFpc2luZyB0aGUgY2xvY2sKKwkgKiBpbnB1dCB0byB0aGUgRUVQUk9NIChzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZgorCSAqIHRoZSAiRE8iIGJpdC4gIER1cmluZyB0aGlzICJzaGlmdGluZyBpbiIgcHJvY2VzcyB0aGUgIkRJIiBiaXQgc2hvdWxkCisJICogYWx3YXlzIGJlIGNsZWFyLgorCSAqLworCQorCWVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisJCisJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfRE8gfCBFMTAwMF9FRUNEX0RJKTsKKwlkYXRhID0gMDsKKwkKKwlmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworCQkKKwkJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwkJCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0RJKTsKKwkJaWYoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pCisJCQlkYXRhIHw9IDE7CisJCQorCQllMTAwMF9sb3dlcl9lZV9jbGsoaHcsICZlZWNkKTsKKwl9CisJCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByZXBhcmVzIEVFUFJPTSBmb3IgYWNjZXNzCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBMb3dlcnMgRUVQUk9NIGNsb2NrLiBDbGVhcnMgaW5wdXQgcGluLiBTZXRzIHRoZSBjaGlwIHNlbGVjdCBwaW4uIFRoaXMgCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpc3N1aW5nIGEgY29tbWFuZCB0byB0aGUgRUVQUk9NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FjcXVpcmVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1aW50MzJfdCBlZWNkLCBpPTA7CisKKwllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogUmVxdWVzdCBFRVBST00gQWNjZXNzICovCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKwkJZWVjZCB8PSBFMTAwMF9FRUNEX1JFUTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwkJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwkJd2hpbGUoKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgJiYKKwkJICAgICAgKGkgPCBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMpKSB7CisJCQlpKys7CisJCQl1ZGVsYXkoNSk7CisJCQllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCQl9CisJCWlmKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgeworCQkJZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQkJREVCVUdPVVQoIkNvdWxkIG5vdCBhY3F1aXJlIEVFUFJPTSBncmFudFxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwl9CisKKwkvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KKworCWlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQkvKiBDbGVhciBTSyBhbmQgREkgKi8KKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkgfCBFMTAwMF9FRUNEX1NLKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworCQkvKiBTZXQgQ1MgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCX0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJLyogQ2xlYXIgU0sgYW5kIENTICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmV0dXJucyBFRVBST00gdG8gYSAic3RhbmRieSIgc3RhdGUKKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgZWVjZDsKKwkKKwllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKworCQkvKiBEZXNlbGVjdCBFRVBST00gKi8KKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKwkKKwkJLyogQ2xvY2sgaGlnaCAqLworCQllZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJCisJCS8qIFNlbGVjdCBFRVBST00gKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCisJCS8qIENsb2NrIGxvdyAqLworCQllZWNkICY9IH5FMTAwMF9FRUNEX1NLOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCX0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworCQkvKiBUb2dnbGUgQ1MgdG8gZmx1c2ggY29tbWFuZHMgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCQllZWNkICY9IH5FMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVybWluYXRlcyBhIGNvbW1hbmQgYnkgaW52ZXJ0aW5nIHRoZSBFRVBST00ncyBjaGlwIHNlbGVjdCBwaW4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZDsKKworCWVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKwlpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOyAgLyogUHVsbCBDUyBoaWdoICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7IC8qIExvd2VyIFNDSyAqLworCisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJfSBlbHNlIGlmKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisJCS8qIGNsZWFudXAgZWVwcm9tICovCisKKwkJLyogQ1Mgb24gTWljcm93aXJlIGlzIGFjdGl2ZS1oaWdoICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9ESSk7CisKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworCQkvKiBSaXNpbmcgZWRnZSBvZiBjbG9jayAqLworCQllZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisKKwkJLyogRmFsbGluZyBlZGdlIG9mIGNsb2NrICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJfQorCisJLyogU3RvcCByZXF1ZXN0aW5nIEVFUFJPTSBhY2Nlc3MgKi8KKwlpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworCQllZWNkICY9IH5FMTAwMF9FRUNEX1JFUTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQxNl90IHJldHJ5X2NvdW50ID0gMDsKKwl1aW50OF90IHNwaV9zdGF0X3JlZzsKKworCS8qIFJlYWQgIlN0YXR1cyBSZWdpc3RlciIgcmVwZWF0ZWRseSB1bnRpbCB0aGUgTFNCIGlzIGNsZWFyZWQuICBUaGUKKwkgKiBFRVBST00gd2lsbCBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgY2xlYXJpbmcKKwkgKiBiaXQgMCBvZiB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVyLiAgSWYgaXQncyBub3QgY2xlYXJlZCB3aXRoaW4KKwkgKiA1IG1pbGxpc2Vjb25kcywgdGhlbiBlcnJvciBvdXQuCisJICovCisJcmV0cnlfY291bnQgPSAwOworCWRvIHsKKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9SRFNSX09QQ09ERV9TUEksCisJCWh3LT5lZXByb20ub3Bjb2RlX2JpdHMpOworCQlzcGlfc3RhdF9yZWcgPSAodWludDhfdCllMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCA4KTsKKwkJaWYgKCEoc3BpX3N0YXRfcmVnICYgRUVQUk9NX1NUQVRVU19SRFlfU1BJKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSg1KTsKKwkJcmV0cnlfY291bnQgKz0gNTsKKworCX0gd2hpbGUocmV0cnlfY291bnQgPCBFRVBST01fTUFYX1JFVFJZX1NQSSk7CisKKwkvKiBBVE1FTCBTUEkgd3JpdGUgdGltZSBjb3VsZCB2YXJ5IGZyb20gMC0yMG1TZWMgb24gMy4zViBkZXZpY2VzIChhbmQKKwkgKiBvbmx5IDAtNW1TZWMgb24gNVYgZGV2aWNlcykKKwkgKi8KKwlpZihyZXRyeV9jb3VudCA+PSBFRVBST01fTUFYX1JFVFJZX1NQSSkgeworCQlERUJVR09VVCgiU1BJIEVFUFJPTSBTdGF0dXMgZXJyb3JcbiIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKwkJICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgaSA9IDA7CisJCisJREVCVUdGVU5DKCJlMTAwMF9yZWFkX2VlcHJvbSIpOworCisJLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAorCSAqIGVub3VnaCB3b3Jkcy4KKwkgKi8KKwlpZigob2Zmc2V0ID4gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorCSAgICh3b3JkcyA9PSAwKSkgeworCQlERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisJaWYoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKworCWlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCXVpbnQxNl90IHdvcmRfaW47CisJCXVpbnQ4X3QgcmVhZF9vcGNvZGUgPSBFRVBST01fUkVBRF9PUENPREVfU1BJOworCisJCWlmKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSB7CisJCQllMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKworCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKwkJLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCisJCWlmKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisJCQlyZWFkX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworCQkvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQqMiksIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworCQkvKiBSZWFkIHRoZSBkYXRhLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGVlcHJvbSBpbnRlcm5hbGx5IGluY3JlbWVudHMgd2l0aAorCQkgKiBlYWNoIGJ5dGUgKHNwaSkgYmVpbmcgcmVhZCwgc2F2aW5nIG9uIHRoZSBvdmVyaGVhZCBvZiBlZXByb20gc2V0dXAKKwkJICogYW5kIHRlYXItZG93bi4gIFRoZSBhZGRyZXNzIGNvdW50ZXIgd2lsbCByb2xsIG92ZXIgaWYgcmVhZGluZyBiZXlvbmQKKwkJICogdGhlIHNpemUgb2YgdGhlIGVlcHJvbSwgdGh1cyBhbGxvd2luZyB0aGUgZW50aXJlIG1lbW9yeSB0byBiZSByZWFkCisJCSAqIHN0YXJ0aW5nIGZyb20gYW55IG9mZnNldC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKwkJCXdvcmRfaW4gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisJCQlkYXRhW2ldID0gKHdvcmRfaW4gPj4gOCkgfCAod29yZF9pbiA8PCA4KTsKKwkJfQorCX0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworCQkJLyogIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisJCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSwKKwkJCQkJCWVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0ICsgaSksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKwkJCS8qIFJlYWQgdGhlIGRhdGEuICBGb3IgbWljcm93aXJlLCBlYWNoIHdvcmQgcmVxdWlyZXMgdGhlIG92ZXJoZWFkCisJCQkgKiBvZiBlZXByb20gc2V0dXAgYW5kIHRlYXItZG93bi4gKi8KKwkJCWRhdGFbaV0gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisJCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisJCX0KKwl9CisKKwkvKiBFbmQgdGhpcyByZWFkIG9wZXJhdGlvbiAqLworCWUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBFRVBST00gaGFzIGEgdmFsaWQgY2hlY2tzdW0KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZWFkcyB0aGUgZmlyc3QgNjQgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00gYW5kIHN1bXMgdGhlIHZhbHVlcyByZWFkLgorICogSWYgdGhlIHRoZSBzdW0gb2YgdGhlIDY0IDE2IGJpdCB3b3JkcyBpcyAweEJBQkEsIHRoZSBFRVBST00ncyBjaGVja3N1bSBpcworICogdmFsaWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MTZfdCBjaGVja3N1bSA9IDA7CisJdWludDE2X3QgaSwgZWVwcm9tX2RhdGE7CisKKwlERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCisJZm9yKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisJCWlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBpLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworCQkJREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwkJfQorCQljaGVja3N1bSArPSBlZXByb21fZGF0YTsKKwl9CisJCisJaWYoY2hlY2tzdW0gPT0gKHVpbnQxNl90KSBFRVBST01fU1VNKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwllbHNlIHsKKwkJREVCVUdPVVQoIkVFUFJPTSBDaGVja3N1bSBJbnZhbGlkXG4iKTsgICAgCisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgTUFDIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NIGFuZCBpbnZlcnRzIHRoZSBMU0IgZm9yIHRoZQorICogc2Vjb25kIGZ1bmN0aW9uIG9mIGR1YWwgZnVuY3Rpb24gZGV2aWNlcworICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IAorZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50MTZfdCBlZXByb21fZGF0YTsKKwlpbnQgaTsKKworCURFQlVHRlVOQygiZTEwMDBfcmVhZF9tYWNfYWRkciIpOworCisJZm9yKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkgKz0gMikgeworCQlvZmZzZXQgPSBpID4+IDE7CisJCWlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisJCQlERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CisJCWh3LT5tYWNfYWRkcltpXSA9IGVlcHJvbV9kYXRhICYgMHhmZjsKKwkJaHctPm1hY19hZGRyW2krMV0gPSAoZWVwcm9tX2RhdGEgPj4gOCkgJiAweGZmOworCX0KKwlpZigoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NikgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpICYmCisJCShFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKQorCQkvKiBJbnZlcnQgdGhlIGxhc3QgYml0IGlmIHRoaXMgaXMgdGhlIHNlY29uZCBkZXZpY2UgKi8KKwkJaHctPm1hY19hZGRyWzVdIF49IDE7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemVzIHJlY2VpdmUgYWRkcmVzcyBmaWx0ZXJzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlIAorICoKKyAqIFBsYWNlcyB0aGUgTUFDIGFkZHJlc3MgaW4gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIDAgYW5kIGNsZWFycyB0aGUgcmVzdAorICogb2YgdGhlIHJlY2VpdmUgYWRkcmVzc3MgcmVnaXN0ZXJzLiBDbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4gQXNzdW1lcworICogdGhlIHJlY2VpdmVyIGlzIGluIHJlc2V0IHdoZW4gdGhlIHJvdXRpbmUgaXMgY2FsbGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2luaXRfcnhfYWRkcnMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGFkZHJfbG93OworCXVpbnQzMl90IGFkZHJfaGlnaDsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2luaXRfcnhfYWRkcnMiKTsKKwkKKwkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworCURFQlVHT1VUKCJQcm9ncmFtbWluZyBNQUMgQWRkcmVzcyBpbnRvIFJBUlswXVxuIik7CisJYWRkcl9sb3cgPSAoaHctPm1hY19hZGRyWzBdIHwKKwkJKGh3LT5tYWNfYWRkclsxXSA8PCA4KSB8CisJCShody0+bWFjX2FkZHJbMl0gPDwgMTYpIHwgKGh3LT5tYWNfYWRkclszXSA8PCAyNCkpOworCQorCWFkZHJfaGlnaCA9IChody0+bWFjX2FkZHJbNF0gfAorCQkoaHctPm1hY19hZGRyWzVdIDw8IDgpIHwgRTEwMDBfUkFIX0FWKTsKKwkKKwlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAwLCBhZGRyX2xvdyk7CisJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgMSwgYWRkcl9oaWdoKTsKKwkKKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisJREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSAxOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsZWFycyB0aGUgVkxBTiBmaWxlciB0YWJsZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfY2xlYXJfdmZ0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IG9mZnNldDsKKyAgICAKKwlmb3Iob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQorCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JpdGVzIGEgdmFsdWUgdG8gb25lIG9mIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyB1c2luZyBwb3J0IEkvTyAoYXMgb3Bwb3NlZCB0bworKiBtZW1vcnkgbWFwcGVkIEkvTykuIE9ubHkgODI1NDQgYW5kIG5ld2VyIGRldmljZXMgc3VwcG9ydCBwb3J0IEkvTy4gKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBvZmZzZXQgLSBvZmZzZXQgdG8gd3JpdGUgdG8gKiB2YWx1ZSAtIHZhbHVlIHRvIHdyaXRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZTEwMDBfd3JpdGVfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpeworCXVpbnQzMl90IGlvX2FkZHIgPSBody0+aW9fYmFzZTsKKwl1aW50MzJfdCBpb19kYXRhID0gaHctPmlvX2Jhc2UgKyA0OworCWUxMDAwX2lvX3dyaXRlKGh3LCBpb19hZGRyLCBvZmZzZXQpOworCWUxMDAwX2lvX3dyaXRlKGh3LCBpb19kYXRhLCB2YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCB0aGUgcGh5IHR5cGUgbWVtYmVyIGluIHRoZSBodyBzdHJ1Y3QuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfcGh5X3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfdHlwZSIpOworCisJc3dpdGNoKGh3LT5waHlfaWQpIHsKKwljYXNlIE04OEUxMDAwX0VfUEhZX0lEOgorCWNhc2UgTTg4RTEwMDBfSV9QSFlfSUQ6CisJY2FzZSBNODhFMTAxMV9JX1BIWV9JRDoKKwkJaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X204ODsKKwkJYnJlYWs7CisJY2FzZSBJR1AwMUUxMDAwX0lfUEhZX0lEOgorCQlody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfaWdwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KKwkJaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X3VuZGVmaW5lZDsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElHUCBwaHkgaW5pdCBzY3JpcHQgLSBpbml0aWFsaXplcyB0aGUgR2JFIFBIWQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcGh5X2luaXRfc2NyaXB0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfaW5pdF9zY3JpcHQiKTsKKworI2lmIDAKKwkvKiBTZWUgZTEwMDBfc3dfaW5pdCgpIG9mIHRoZSBMaW51eCBkcml2ZXIgKi8KKwlpZihody0+cGh5X2luaXRfc2NyaXB0KSB7CisjZWxzZQorCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8CisJICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgfHwKKwkgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yKSB8fAorCSAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpKSB7CisjZW5kaWYKKwkJbWRlbGF5KDIwKTsKKworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LDB4MDAwMCwweDAxNDApOworCisJCW1kZWxheSg1KTsKKworCQlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTUsIDB4MDAwMSk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY3MSwgMHhCRDIxKTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjc5LCAweDAwMTgpOworCisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGMzAsIDB4MTYwMCk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMSwgMHgwMDE0KTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMyLCAweDE2MUMpOworCisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTQsIDB4MDAwMyk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NiwgMHgwMDNGKTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyMDEwLCAweDAwMDgpOworCQl9IGVsc2UgeworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjczLCAweDAwOTkpOworCQl9CisKKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLCAweDMzMDApOworCisKKwkJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisJCQl1aW50MTZfdCBmdXNlZCwgZmluZSwgY29hcnNlOworCisJCQkvKiBNb3ZlIHRvIGFuYWxvZyByZWdpc3RlcnMgcGFnZSAqLworCQkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUywgJmZ1c2VkKTsKKworCQkJaWYoIShmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCkpIHsKKwkJCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOworCisJCQkJZmluZSA9IGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0s7CisJCQkJY29hcnNlID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLOworCisJCQkJaWYoY29hcnNlID4gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKSB7CisJCQkJCWNvYXJzZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKKwkJCQkJZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKKwkJCQl9IGVsc2UgaWYoY29hcnNlID09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCkKKwkJCQkJZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTA7CisKKwkJCQlmdXNlZCA9IChmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfUE9MWV9NQVNLKSB8CisJCQkJCShmaW5lICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0spIHwKKwkJCQkJKGNvYXJzZSAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0spOworCisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT05UUk9MLCBmdXNlZCk7CisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9CWVBBU1MsCisJCQkJCQlJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0VOQUJMRV9TV19DT05UUk9MKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IHRoZSBtYWMgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3NldF9tYWNfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCURFQlVHRlVOQygiZTEwMDBfc2V0X21hY190eXBlIik7CisKKwlzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKwkJc3dpdGNoIChody0+cmV2aXNpb25faWQpIHsKKwkJY2FzZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEOgorCQkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDJfcmV2Ml8wOworCQkJYnJlYWs7CisJCWNhc2UgRTEwMDBfODI1NDJfMl8xX1JFVl9JRDoKKwkJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQyX3JldjJfMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCA4MjU0MiByZXZpc2lvbiBJRCAqLworCQkJcmV0dXJuIC1FMTAwMF9FUlJfTUFDX1RZUEU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUjoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19MT006CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ0OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVNOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRU1fTE9NOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRVA6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MT006CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MUDoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDA7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVI6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ1OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NV9yZXZfMzsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NjsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDZfcmV2XzM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRUk6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFSV9NT0JJTEU6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MUVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxR0k6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFHSV9NT0JJTEU6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxX3Jldl8yOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0N0VJOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NzsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDdHSToKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDdfcmV2XzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworCQlyZXR1cm4gLUUxMDAwX0VSUl9NQUNfVFlQRTsKKwl9CisKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgbWVkaWEgdHlwZSBhbmQgVEJJIGNvbXBhdGliaWxpdHkuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3NldF9tZWRpYV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3Qgc3RhdHVzOworCisJREVCVUdGVU5DKCJlMTAwMF9zZXRfbWVkaWFfdHlwZSIpOworCQorCWlmKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0MykgeworCQkvKiB0YmlfY29tcGF0aWJpbGl0eSBpcyBvbmx5IHZhbGlkIG9uIDgyNTQzICovCisJCWh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IEZBTFNFOworCX0KKworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCQljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKKwkJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9TRVJERVM6CisJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwkJCQlzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKwkJCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgeworCQkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisJCQkJCS8qIHRiaV9jb21wYXRpYmlsaXR5IG5vdCB2YWxpZCBvbiBmaWJlciAqLworCQkJCQlody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKKwkJCQl9IGVsc2UgeworCQkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBpcyBhbiA4MjU0MiAoZmliZXIgb25seSkgKi8KKwkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisJCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IGN0cmxfZXh0OworCXVpbnQzMl90IGljcjsKKwl1aW50MzJfdCBtYW5jOworCQorCURFQlVHRlVOQygiZTEwMDBfcmVzZXRfaHciKTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBiZWZvcmUgaXNzdWluZyBhIGRldmljZSByZXNldCAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKwkJREVCVUdPVVQoIkRpc2FibGluZyBNV0kgb24gODI1NDIgcmV2IDIuMFxuIik7CisJCWUxMDAwX3BjaV9jbGVhcl9td2koaHcpOworCX0KKworCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwlERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworCUUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKKwkKKwkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKwkgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKwkgKiB0aGUgZ2xvYmFsIHJlc2V0LgorCSAqLworCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCBFMTAwMF9UQ1RMX1BTUCk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisJLyogVGhlIHRiaV9jb21wYXRpYmlsaXR5X29uIEZsYWcgbXVzdCBiZSBjbGVhcmVkIHdoZW4gUmN0bCBpcyBjbGVhcmVkLiAqLworCWh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IEZBTFNFOworCisJLyogRGVsYXkgdG8gYWxsb3cgYW55IG91dHN0YW5kaW5nIFBDSSB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlCisJICogcmVzZXR0aW5nIHRoZSBkZXZpY2UKKwkgKi8gCisJbWRlbGF5KDEwKTsKKworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKwkvKiBNdXN0IHJlc2V0IHRoZSBQSFkgYmVmb3JlIHJlc2V0dGluZyB0aGUgTUFDICovCisJaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKwkJRTEwMDBfV1JJVEVfUkVHX0lPKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOworCQltZGVsYXkoNSk7CisJfQorCisJLyogSXNzdWUgYSBnbG9iYWwgcmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCisJICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQSwgYW5kIGxpbmsgdW5pdHMuICBJdCB3aWxsIG5vdCBlZmZlY3QKKwkgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisJICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisJICovCisJREVCVUdPVVQoIklzc3VpbmcgYSBnbG9iYWwgcmVzZXQgdG8gTUFDXG4iKTsKKworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0NDoKKwkJY2FzZSBlMTAwMF84MjU0MDoKKwkJY2FzZSBlMTAwMF84MjU0NToKKwkJY2FzZSBlMTAwMF84MjU0NjoKKwkJY2FzZSBlMTAwMF84MjU0MToKKwkJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwkJCS8qIFRoZXNlIGNvbnRyb2xsZXJzIGNhbid0IGFjayB0aGUgNjQtYml0IHdyaXRlIHdoZW4gaXNzdWluZyB0aGUKKwkJCSAqIHJlc2V0LCBzbyB1c2UgSU8tbWFwcGluZyBhcyBhIHdvcmthcm91bmQgdG8gaXNzdWUgdGhlIHJlc2V0ICovCisJCQlFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCQljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQkJLyogUmVzZXQgaXMgcGVyZm9ybWVkIG9uIGEgc2hhZG93IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRFVQLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworCQkJYnJlYWs7CisJfQorCisJLyogQWZ0ZXIgTUFDIHJlc2V0LCBmb3JjZSByZWxvYWQgb2YgRUVQUk9NIHRvIHJlc3RvcmUgcG93ZXItb24gc2V0dGluZ3MgdG8KKwkgKiBkZXZpY2UuICBMYXRlciBjb250cm9sbGVycyByZWxvYWQgdGhlIEVFUFJPTSBhdXRvbWF0aWNhbGx5LCBzbyBqdXN0IHdhaXQKKwkgKiBmb3IgcmVsb2FkIHRvIGNvbXBsZXRlLgorCSAqLworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCQljYXNlIGUxMDAwXzgyNTQzOgorCQljYXNlIGUxMDAwXzgyNTQ0OgorCQkJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwkJCXVkZWxheSgxMCk7CisJCQljdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisJCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisJCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCQkvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisJCQltZGVsYXkoMik7CisJCQlicmVhazsKKwkJY2FzZSBlMTAwMF84MjU0MToKKwkJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwkJY2FzZSBlMTAwMF84MjU0NzoKKwkJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwkJCS8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKi8KKwkJCW1kZWxheSgyMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKGl0IGhhcHBlbnMgYXV0b21hdGljYWxseSkgKi8KKwkJCW1kZWxheSg1KTsKKwkJCWJyZWFrOworCX0KKworCS8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkgeworCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOworCQltYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOworCQlFMTAwMF9XUklURV9SRUcoaHcsIE1BTkMsIG1hbmMpOworCX0KKworCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworCURFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCQorCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBldmVudHMuICovCisJaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CisKKwkvKiBJZiBNV0kgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCwgcmVlbmFibGUgaXQuICovCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyNlbmRpZgorCQkJZTEwMDBfcGNpX3NldF9td2koaHcpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyZm9ybXMgYmFzaWMgY29uZmlndXJhdGlvbiBvZiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogCisgKiBBc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgaXMgaW4gYSAKKyAqIHBvc3QtcmVzZXQgdW5pbml0aWFsaXplZCBzdGF0ZS4gSW5pdGlhbGl6ZXMgdGhlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMsCisgKiBtdWx0aWNhc3QgdGFibGUsIGFuZCBWTEFOIGZpbHRlciB0YWJsZS4gQ2FsbHMgcm91dGluZXMgdG8gc2V0dXAgbGluaworICogY29uZmlndXJhdGlvbiBhbmQgZmxvdyBjb250cm9sIHNldHRpbmdzLiBDbGVhcnMgYWxsIG9uLWNoaXAgY291bnRlcnMuIExlYXZlcworICogdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHVuaXRzIGRpc2FibGVkIGFuZCB1bmluaXRpYWxpemVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfaW5pdF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwsIHN0YXR1czsKKwl1aW50MzJfdCBpOworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwY2l4X2NtZF93b3JkOworCXVpbnQxNl90IHBjaXhfc3RhdF9oaV93b3JkOworCXVpbnQxNl90IGNtZF9tbXJiYzsKKwl1aW50MTZfdCBzdGF0X21tcmJjOworCWUxMDAwX2J1c190eXBlIGJ1c190eXBlID0gZTEwMDBfYnVzX3R5cGVfdW5rbm93bjsKKworCURFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOworCisJLyogU2V0IHRoZSBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eSAqLworCWUxMDAwX3NldF9tZWRpYV90eXBlKGh3KTsKKworCS8qIERpc2FibGluZyBWTEFOIGZpbHRlcmluZy4gKi8KKwlERUJVR09VVCgiSW5pdGlhbGl6aW5nIHRoZSBJRUVFIFZMQU5cbiIpOworCUUxMDAwX1dSSVRFX1JFRyhodywgVkVULCAwKTsKKwkKKwllMTAwMF9jbGVhcl92ZnRhKGh3KTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBhbmQgcHV0IHRoZSByZWNlaXZlciBpbnRvIHJlc2V0ICovCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworCQlERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKKwkJZTEwMDBfcGNpX2NsZWFyX213aShodyk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgRTEwMDBfUkNUTF9SU1QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCW1kZWxheSg1KTsKKwl9CisJCisJLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gVGhpcyBpbnZvbHZlcyBpbml0aWFsaXppbmcgYWxsIG9mIHRoZSBSZWNlaXZlCisJICogQWRkcmVzcyBSZWdpc3RlcnMgKFJBUnMgMCAtIDE1KS4KKwkgKi8KKwllMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCB0YWtlIHRoZSByZWNlaXZlciBvdXQgb2YgcmVzZXQgYW5kIGVuYWJsZSBNV0kgKi8KKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJbWRlbGF5KDEpOworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyNlbmRpZgorCQkJZTEwMDBfcGNpX3NldF9td2koaHcpOworCX0KKwkKKwkvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KKwlERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQ19UQkxfU0laRTsgaSsrKQorCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisJCisjaWYgMAorCS8qIFNldCB0aGUgUENJIHByaW9yaXR5IGJpdCBjb3JyZWN0bHkgaW4gdGhlIENUUkwgcmVnaXN0ZXIuICBUaGlzCisJICogZGV0ZXJtaW5lcyBpZiB0aGUgYWRhcHRlciBnaXZlcyBwcmlvcml0eSB0byByZWNlaXZlcywgb3IgaWYgaXQKKwkgKiBnaXZlcyBlcXVhbCBwcmlvcml0eSB0byB0cmFuc21pdHMgYW5kIHJlY2VpdmVzLgorCSAqLworCWlmKGh3LT5kbWFfZmFpcm5lc3MpIHsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QUklPUik7CisJfQorI2VuZGlmCisKKwlzd2l0Y2goaHctPm1hY190eXBlKSB7CisJCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJCWNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwkJCQkvKiBTZWUgZTEwMDBfZ2V0X2J1c19pbmZvKCkgb2YgdGhlIExpbnV4IGRyaXZlciAqLworCQkJCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCQkJCWJ1c190eXBlID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX01PREUpID8KKwkJCQkJZTEwMDBfYnVzX3R5cGVfcGNpeCA6IGUxMDAwX2J1c190eXBlX3BjaTsKKwkJCX0KKworCQkJLyogV29ya2Fyb3VuZCBmb3IgUENJLVggcHJvYmxlbSB3aGVuIEJJT1Mgc2V0cyBNTVJCQyBpbmNvcnJlY3RseS4gKi8KKwkJCWlmKGJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChody0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCAmcGNpeF9jbWRfd29yZCk7CisJCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaHctPnBkZXYsIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJLCAmcGNpeF9zdGF0X2hpX3dvcmQpOworCQkJCWNtZF9tbXJiYyA9IChwY2l4X2NtZF93b3JkICYgUENJWF9DT01NQU5EX01NUkJDX01BU0spID4+CisJCQkJCVBDSVhfQ09NTUFORF9NTVJCQ19TSElGVDsKKwkJCQlzdGF0X21tcmJjID0gKHBjaXhfc3RhdF9oaV93b3JkICYgUENJWF9TVEFUVVNfSElfTU1SQkNfTUFTSykgPj4KKwkJCQkJUENJWF9TVEFUVVNfSElfTU1SQkNfU0hJRlQ7CisJCQkJaWYoc3RhdF9tbXJiYyA9PSBQQ0lYX1NUQVRVU19ISV9NTVJCQ180SykKKwkJCQkJc3RhdF9tbXJiYyA9IFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLOworCQkJCWlmKGNtZF9tbXJiYyA+IHN0YXRfbW1yYmMpIHsKKwkJCQkJcGNpeF9jbWRfd29yZCAmPSB+UENJWF9DT01NQU5EX01NUkJDX01BU0s7CisJCQkJCXBjaXhfY21kX3dvcmQgfD0gc3RhdF9tbXJiYyA8PCBQQ0lYX0NPTU1BTkRfTU1SQkNfU0hJRlQ7CisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCBwY2l4X2NtZF93b3JkKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKiBDYWxsIGEgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsgYW5kIHNldHVwIGZsb3cgY29udHJvbC4gKi8KKwlyZXRfdmFsID0gZTEwMDBfc2V0dXBfbGluayhodyk7CisJCisJLyogU2V0IHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcG9saWN5ICovCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUWERDVEwpOworCQljdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBUWERDVEwsIGN0cmwpOworCX0KKworI2lmIDAKKwkvKiBDbGVhciBhbGwgb2YgdGhlIHN0YXRpc3RpY3MgcmVnaXN0ZXJzIChjbGVhciBvbiByZWFkKS4gIEl0IGlzCisJICogaW1wb3J0YW50IHRoYXQgd2UgZG8gdGhpcyBhZnRlciB3ZSBoYXZlIHRyaWVkIHRvIGVzdGFibGlzaCBsaW5rCisJICogYmVjYXVzZSB0aGUgc3ltYm9sIGVycm9yIGNvdW50IHdpbGwgaW5jcmVtZW50IHdpbGRseSBpZiB0aGVyZQorCSAqIGlzIG5vIGxpbmsuCisJICovCisJZTEwMDBfY2xlYXJfaHdfY250cnMoaHcpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGJhc2VkIG9uIEVFUFJPTSBzZXR0aW5nLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDE2X3QgZWVwcm9tX2RhdGE7CisJaW50MzJfdCAgcmV0X3ZhbDsKKworCURFQlVHRlVOQygiZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUiKTsKKworCWlmKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwkJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJfQorCisJaWYgKChyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9TRVJERVNfQU1QTElUVURFLCAxLAorCQkJCQkmZWVwcm9tX2RhdGEpKSkgeworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlpZihlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgeworCQkvKiBBZGp1c3QgU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgb25seS4gKi8KKwkJZWVwcm9tX2RhdGEgJj0gRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSzsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfRVhUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21fZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisJCQkJCQkJCSAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgYW5kIGxpbmsgc2V0dGluZ3MuCisgKiAKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiAKKyAqIERldGVybWluZXMgd2hpY2ggZmxvdyBjb250cm9sIHNldHRpbmdzIHRvIHVzZS4gQ2FsbHMgdGhlIGFwcm9wcmlhdGUgbWVkaWEtCisgKiBzcGVjaWZpYyBsaW5rIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24uIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIEFzc3VtaW5nIHRoZSBhZGFwdGVyIGhhcyBhIHZhbGlkIGxpbmsgcGFydG5lciwgYSB2YWxpZCBsaW5rIHNob3VsZCBiZQorICogZXN0YWJsaXNoZWQuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVzZXQgYW5kIHRoZSAKKyAqIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgbm90IGVuYWJsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybF9leHQ7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IGVlcHJvbV9kYXRhOworCisJREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9saW5rIik7CisJCisJLyogUmVhZCBhbmQgc3RvcmUgd29yZCAweDBGIG9mIHRoZSBFRVBST00uIFRoaXMgd29yZCBjb250YWlucyBiaXRzCisJICogdGhhdCBkZXRlcm1pbmUgdGhlIGhhcmR3YXJlJ3MgZGVmYXVsdCBQQVVTRSAoZmxvdyBjb250cm9sKSBtb2RlLAorCSAqIGEgYml0IHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBIVyBkZWZhdWx0cyB0byBlbmFibGluZyBvcgorCSAqIGRpc2FibGluZyBhdXRvLW5lZ290aWF0aW9uLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiB0aGUKKwkgKiBTVyBkZWZpbmVkIHBpbnMuIElmIHRoZXJlIGlzIG5vIFNXIG92ZXItcmlkZSBvZiB0aGUgZmxvdworCSAqIGNvbnRyb2wgc2V0dGluZywgdGhlbiB0aGUgdmFyaWFibGUgaHctPmZjIHdpbGwKKwkgKiBiZSBpbml0aWFsaXplZCBiYXNlZCBvbiBhIHZhbHVlIGluIHRoZSBFRVBST00uCisJICovCisJaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKwkJREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KKwkKKwlpZihody0+ZmMgPT0gZTEwMDBfZmNfZGVmYXVsdCkgeworCQlpZigoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09IDApCisJCQlody0+ZmMgPSBlMTAwMF9mY19ub25lOworCQllbHNlIGlmKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0gCisJCQlFRVBST01fV09SRDBGX0FTTV9ESVIpCisJCQlody0+ZmMgPSBlMTAwMF9mY190eF9wYXVzZTsKKwkJZWxzZQorCQkJaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKKwl9CisJCisJLyogV2Ugd2FudCB0byBzYXZlIG9mZiB0aGUgb3JpZ2luYWwgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24ganVzdAorCSAqIGluIGNhc2Ugd2UgZ2V0IGRpc2Nvbm5lY3RlZCBhbmQgdGhlbiByZWNvbm5lY3RlZCBpbnRvIGEgZGlmZmVyZW50CisJICogaHViIG9yIHN3aXRjaCB3aXRoIGRpZmZlcmVudCBGbG93IENvbnRyb2wgY2FwYWJpbGl0aWVzLgorCSAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWh3LT5mYyAmPSAofmUxMDAwX2ZjX3R4X3BhdXNlKTsKKworI2lmIDAKKwkvKiBTZWUgZTEwMDBfc3dfaW5pdCgpIG9mIHRoZSBMaW51eCBkcml2ZXIgKi8KKwlpZigoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpICYmIChody0+cmVwb3J0X3R4X2Vhcmx5ID09IDEpKQorI2Vsc2UKKwlpZigoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpICYmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpKQorI2VuZGlmCisJCWh3LT5mYyAmPSAofmUxMDAwX2ZjX3J4X3BhdXNlKTsKKwkKKyNpZiAwCisJaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOworI2VuZGlmCisKKwlERUJVR09VVDEoIkFmdGVyIGZpeC11cHMgRmxvd0NvbnRyb2wgaXMgbm93ID0gJXhcbiIsIGh3LT5mYyk7CisJCisJLyogVGFrZSB0aGUgNCBiaXRzIGZyb20gRUVQUk9NIHdvcmQgMHgwRiB0aGF0IGRldGVybWluZSB0aGUgaW5pdGlhbAorCSAqIHBvbGFyaXR5IHZhbHVlIGZvciB0aGUgU1cgY29udHJvbGxlZCBwaW5zLCBhbmQgc2V0dXAgdGhlCisJICogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgcmVnIHdpdGggdGhhdCBpbmZvLgorCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb25lIG9mIHRoZSBTVyBjb250cm9sbGVkIHBpbnMgaXMgdXNlZCBmb3IKKwkgKiBzaWduYWwgZGV0ZWN0aW9uLiAgU28gdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZTEwMDBfc2V0dXBfcGNzX2xpbmsoKQorCSAqIG9yIGUxMDAwX3BoeV9zZXR1cCgpIGlzIGNhbGxlZC4KKwkgKi8KKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpIHsKKwkJY3RybF9leHQgPSAoKGVlcHJvbV9kYXRhICYgRUVQUk9NX1dPUkQwRl9TV1BESU9fRVhUKSA8PCAKKwkJCVNXRFBJT19fRVhUX1NISUZUKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworCX0KKwkKKwkvKiBDYWxsIHRoZSBuZWNlc3Nhcnkgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsuICovCisJcmV0X3ZhbCA9IChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgPworCQllMTAwMF9zZXR1cF9jb3BwZXJfbGluayhodykgOgorCQllMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhodyk7CisJaWYgKHJldF92YWwgPCAwKSB7CisJCXJldHVybiByZXRfdmFsOworCX0KKwkKKwkvKiBJbml0aWFsaXplIHRoZSBmbG93IGNvbnRyb2wgYWRkcmVzcywgdHlwZSwgYW5kIFBBVVNFIHRpbWVyCisJICogcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAgVGhpcyBpcyBkb25lIGV2ZW4gaWYgZmxvdworCSAqIGNvbnRyb2wgaXMgZGlzYWJsZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydCBhbnl0aGluZyB0bworCSAqIGluaXRpYWxpemUgdGhlc2UgcmVnaXN0ZXJzLgorCSAqLworCURFQlVHT1VUKCJJbml0aWFsaXppbmcgdGhlIEZsb3cgQ29udHJvbCBhZGRyZXNzLCB0eXBlIGFuZCB0aW1lciByZWdzXG4iKTsKKwkKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDQUwsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ0FILCBGTE9XX0NPTlRST0xfQUREUkVTU19ISUdIKTsKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDVCwgRkxPV19DT05UUk9MX1RZUEUpOworI2lmIDAKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDVFRWLCBody0+ZmNfcGF1c2VfdGltZSk7CisjZWxzZQorCUUxMDAwX1dSSVRFX1JFRyhodywgRkNUVFYsIEZDX0RFRkFVTFRfVFhfVElNRVIpOworI2VuZGlmCisJCisJLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCisJICogdGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIGEgZGVmYXVsdCB0aHJlc2hvbGQgdGhhdCBtYXkgYmUKKwkgKiBhZGp1c3RlZCBsYXRlciBieSB0aGUgZHJpdmVyJ3MgcnVudGltZSBjb2RlLiAgSG93ZXZlciwgaWYgdGhlCisJICogYWJpbGl0eSB0byB0cmFuc21pdCBwYXVzZSBmcmFtZXMgaW4gbm90IGVuYWJsZWQsIHRoZW4gdGhlc2UKKwkgKiByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gMC4gCisJICovCisJaWYoIShody0+ZmMgJiBlMTAwMF9mY190eF9wYXVzZSkpIHsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIDApOworCX0gZWxzZSB7CisJCS8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKKwkJICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgorCQkgKi8KKyNpZiAwCisJCWlmKGh3LT5mY19zZW5kX3hvbikgeworCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgKGh3LT5mY19sb3dfd2F0ZXIgfCBFMTAwMF9GQ1JUTF9YT05FKSk7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBody0+ZmNfaGlnaF93YXRlcik7CisJCX0gZWxzZSB7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRMLCBody0+ZmNfbG93X3dhdGVyKTsKKwkJCUUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKKwkJfQorI2Vsc2UKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgKEZDX0RFRkFVTFRfTE9fVEhSRVNIIHwgRTEwMDBfRkNSVExfWE9ORSkpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBGQ19ERUZBVUxUX0hJX1RIUkVTSCk7CisjZW5kaWYKKwl9CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldHMgdXAgbGluayBmb3IgYSBmaWJlciBiYXNlZCBvciBzZXJkZXMgYmFzZWQgYWRhcHRlcgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogTWFuaXB1bGF0ZXMgUGh5c2ljYWwgQ29kaW5nIFN1YmxheWVyIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBjb25maWd1cmUKKyAqIGxpbmsuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVzZXQgYW5kIHRoZSB0cmFuc21pdHRlcgorICogYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdHhjdyA9IDA7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBzaWduYWwgPSAwOworCWludDMyX3QgcmV0X3ZhbDsKKworCURFQlVHRlVOQygiZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsiKTsKKworCS8qIE9uIGFkYXB0ZXJzIHdpdGggYSBNQUMgbmV3ZXIgdGhhbiA4MjU0NCwgU1cgRGVmaW5lYWJsZSBwaW4gMSB3aWxsIGJlIAorCSAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZSAKKwkgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KKwkgKiBJZiB3ZSdyZSBvbiBzZXJkZXMgbWVkaWEsIGFkanVzdCB0aGUgb3V0cHV0IGFtcGxpdHVkZSB0byB2YWx1ZSBzZXQgaW4KKwkgKiB0aGUgRUVQUk9NLgorCSAqLworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKwkJc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKwlpZigocmV0X3ZhbCA9IGUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKGh3KSkpCisJCXJldHVybiByZXRfdmFsOworCisJLyogVGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKi8KKwljdHJsICY9IH4oRTEwMDBfQ1RSTF9MUlNUKTsKKworI2lmIDAKKwkvKiBBZGp1c3QgVkNPIHNwZWVkIHRvIGltcHJvdmUgQkVSIHBlcmZvcm1hbmNlICovCisJaWYoKHJldF92YWwgPSBlMTAwMF9zZXRfdmNvX3NwZWVkKGh3KSkpCisJCXJldHVybiByZXRfdmFsOworI2VuZGlmCisKKwllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQorCS8qIENoZWNrIGZvciBhIHNvZnR3YXJlIG92ZXJyaWRlIG9mIHRoZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MsIGFuZCBzZXR1cAorCSAqIHRoZSBkZXZpY2UgYWNjb3JkaW5nbHkuICBJZiBhdXRvLW5lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRoZW4gc29mdHdhcmUKKwkgKiB3aWxsIGhhdmUgdG8gc2V0IHRoZSAiUEFVU0UiIGJpdHMgdG8gdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlIFRyYW5tc2l0CisJICogQ29uZmlnIFdvcmQgUmVnaXN0ZXIgKFRYQ1cpIGFuZCByZS1zdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSG93ZXZlciwgaWYKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIGRpc2FibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBtYW51YWxseSAKKwkgKiBjb25maWd1cmUgdGhlIHR3byBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisJICoKKwkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisJICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKwkgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UgZnJhbWVzLCBidXQgCisJICogICAgICAgICAgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzIGJ1dCB3ZSBkbworCSAqICAgICAgICAgIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgZTEwMDBfZmNfbm9uZToKKwkJLyogRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuICovCisJCXR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEKTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF9mY19yeF9wYXVzZToKKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQgYW5kIFRYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhIAorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuIFNpbmNlIHRoZXJlIHJlYWxseSBpc24ndCBhIHdheSB0byBhZHZlcnRpc2UgCisJCSAqIHRoYXQgd2UgYXJlIGNhcGFibGUgb2YgUlggUGF1c2UgT05MWSwgd2Ugd2lsbCBhZHZlcnRpc2UgdGhhdCB3ZQorCQkgKiBzdXBwb3J0IGJvdGggc3ltbWV0cmljIGFuZCBhc3ltbWV0cmljIFJYIFBBVVNFLiBMYXRlciwgd2Ugd2lsbAorCQkgKiAgZGlzYWJsZSB0aGUgYWRhcHRlcidzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisJCSAqLworCQl0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfdHhfcGF1c2U6CisJCS8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkLCBieSBhIAorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQl0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfQVNNX0RJUik7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfZnVsbDoKKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKwkJdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJYnJlYWs7CisJfQorCQorCS8qIFNpbmNlIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKHRoZSBsaW5rCisJICogd2lsbCBiZSBpbiByZXNldCwgYmVjYXVzZSB3ZSBwcmV2aW91c2x5IHJlc2V0IHRoZSBjaGlwKS4gVGhpcyB3aWxsCisJICogcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSWYgYXV0by1uZW9ndGlhdGlvbiBpcyBzdWNjZXNzZnVsIHRoZW4gdGhlCisJICogbGluay11cCBzdGF0dXMgYml0IHdpbGwgYmUgc2V0IGFuZCB0aGUgZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIChSRkNFCisJICogYW5kIFRGQ0UpIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byB0aGVpciBuZWdvdGlhdGVkIHZhbHVlLgorCSAqLworCURFQlVHT1VUKCJBdXRvLW5lZ290aWF0aW9uIGVuYWJsZWRcbiIpOworCQorCUUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgdHhjdyk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCisJaHctPnR4Y3cgPSB0eGN3OworCW1kZWxheSgxKTsKKwkKKwkvKiBJZiB3ZSBoYXZlIGEgc2lnbmFsICh0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbikgdGhlbiBwb2xsIGZvciBhICJMaW5rLVVwIgorCSAqIGluZGljYXRpb24gaW4gdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIuICBUaW1lLW91dCBpZiBhIGxpbmsgaXNuJ3QgCisJICogc2VlbiBpbiA1MDAgbWlsbGlzZWNvbmRzIHNlY29uZHMgKEF1dG8tbmVnb3RpYXRpb24gc2hvdWxkIGNvbXBsZXRlIGluIAorCSAqIGxlc3MgdGhhbiA1MDAgbWlsbGlzZWNvbmRzIGV2ZW4gaWYgdGhlIG90aGVyIGVuZCBpcyBkb2luZyBpdCBpbiBTVykuCisJICogRm9yIGludGVybmFsIHNlcmRlcywgd2UganVzdCBhc3N1bWUgYSBzaWduYWwgaXMgcHJlc2VudCwgdGhlbiBwb2xsLgorCSAqLworCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisJICAgKEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKSAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSB7CisJCURFQlVHT1VUKCJMb29raW5nIGZvciBMaW5rXG4iKTsKKwkJZm9yKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7CisJCQltZGVsYXkoMTApOworCQkJc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisJCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIGJyZWFrOworCQl9CisJCWlmKGkgPT0gKExJTktfVVBfVElNRU9VVCAvIDEwKSkgeworCQkJREVCVUdPVVQoIk5ldmVyIGdvdCBhIHZhbGlkIGxpbmsgZnJvbSBhdXRvLW5lZyEhIVxuIik7CisJCQlody0+YXV0b25lZ19mYWlsZWQgPSAxOworCQkJLyogQXV0b05lZyBmYWlsZWQgdG8gYWNoaWV2ZSBhIGxpbmssIHNvIHdlJ2xsIGNhbGwgCisJCQkgKiBlMTAwMF9jaGVja19mb3JfbGluay4gVGhpcyByb3V0aW5lIHdpbGwgZm9yY2UgdGhlIGxpbmsgdXAgaWYKKwkJCSAqIHdlIGRldGVjdCBhIHNpZ25hbC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNvbW11bmljYXRlIHdpdGgKKwkJCSAqIG5vbi1hdXRvbmVnb3RpYXRpbmcgbGluayBwYXJ0bmVycy4KKwkJCSAqLworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9jaGVja19mb3JfbGluayhodykpKSB7CisJCQkJREVCVUdPVVQoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBsaW5rXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7CisJCX0gZWxzZSB7CisJCQlody0+YXV0b25lZ19mYWlsZWQgPSAwOworCQkJREVCVUdPVVQoIlZhbGlkIExpbmsgRm91bmRcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJREVCVUdPVVQoIk5vIFNpZ25hbCBEZXRlY3RlZFxuIik7CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERldGVjdHMgd2hpY2ggUEhZIGlzIHByZXNlbnQgYW5kIHRoZSBzcGVlZCBhbmQgZHVwbGV4CisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmw7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IGk7CisJdWludDE2X3QgcGh5X2RhdGE7CisJCisJREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9jb3BwZXJfbGluayIpOworCQorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJLyogV2l0aCA4MjU0Mywgd2UgbmVlZCB0byBmb3JjZSBzcGVlZCBhbmQgZHVwbGV4IG9uIHRoZSBNQUMgZXF1YWwgdG8gd2hhdAorCSAqIHRoZSBQSFkgc3BlZWQgYW5kIGR1cGxleCBjb25maWd1cmF0aW9uIGlzLiBJbiBhZGRpdGlvbiwgd2UgbmVlZCB0bworCSAqIHBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgUEhZIHRvIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorCSAqLworCWlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TTFU7CisJCWN0cmwgJj0gfihFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwl9IGVsc2UgeworCQljdHJsIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYIHwgRTEwMDBfQ1RSTF9TTFUpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCQllMTAwMF9waHlfaHdfcmVzZXQoaHcpOworCX0KKwkKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSAqLworCWlmKChyZXRfdmFsID0gZTEwMDBfZGV0ZWN0X2dpZ19waHkoaHcpKSkgeworCQlERUJVR09VVCgiRXJyb3IsIGRpZCBub3QgZGV0ZWN0IHZhbGlkIHBoeS5cbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJREVCVUdPVVQxKCJQaHkgSUQgPSAleCBcbiIsIGh3LT5waHlfaWQpOworCisJaWYoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzIHx8CisJICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAorI2lmIDAKKwkgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQorCQlody0+cGh5X3Jlc2V0X2Rpc2FibGUgPSBGQUxTRTsKKworCWlmKCFody0+cGh5X3Jlc2V0X2Rpc2FibGUpIHsKKyNlbHNlCisJICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworI2VuZGlmCisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJLyogV2FpdCAxMG1zIGZvciBNQUMgdG8gY29uZmlndXJlIFBIWSBmcm9tIGVlcHJvbSBzZXR0aW5ncyAqLworCQltZGVsYXkoMTUpOworCisjaWYgMAorCQkvKiBkaXNhYmxlIGxwbHUgZDMgZHVyaW5nIGRyaXZlciBpbml0ICovCisJCWlmKChyZXRfdmFsID0gZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUoaHcsIEZBTFNFKSkpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEM1xuIik7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCisJCS8qIENvbmZpZ3VyZSBtZGktbWRpeCBzZXR0aW5ncyAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisJCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQ7CisJCQkvKiBGb3JjZSBNREkgZm9yIElHUCBCLTAgUEhZICovCisJCQlwaHlfZGF0YSAmPSB+KElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVggfAorCQkJICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVgpOworCQkJaHctPm1kaXggPSAxOworCisJCX0gZWxzZSB7CisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKwkJCXBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCisJCQlzd2l0Y2ggKGh3LT5tZGl4KSB7CisJCQljYXNlIDE6CisJCQkJcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQlkZWZhdWx0OgorCQkJCXBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KKwkJZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CisKKwkJaWYoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUpCisJCQlody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKworCQlpZihody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKKwkJCWh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworI2VuZGlmCisKKwkJLyogd2hlbiBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50IGlzIG9ubHkgMTAwME1icHMgdGhlbiB3ZQorCQkgKiBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkIGFuZCBlbmFibGUgQXV0byBNYXN0ZXJTbGF2ZQorCQkgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCisJCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworCQkJLyogRGlzYWJsZSBTbWFydFNwZWVkICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworCQkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisjaWYgMAorCQkvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCisJCWh3LT5vcmlnaW5hbF9tYXN0ZXJfc2xhdmUgPSAocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19FTkFCTEUpID8KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19WQUxVRSkgPworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX21zX2ZvcmNlX21hc3RlciA6CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUpIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19hdXRvOworCisJCXN3aXRjaCAocGh5X21zX3NldHRpbmcpIHsKKwkJY2FzZSBlMTAwMF9tc19mb3JjZV9tYXN0ZXI6CisJCQlwaHlfZGF0YSB8PSAoQ1JfMTAwMFRfTVNfRU5BQkxFIHwgQ1JfMTAwMFRfTVNfVkFMVUUpOworCQkJYnJlYWs7CisJCWNhc2UgZTEwMDBfbXNfZm9yY2Vfc2xhdmU6CisJCQlwaHlfZGF0YSB8PSBDUl8xMDAwVF9NU19FTkFCTEU7CisJCQlwaHlfZGF0YSAmPSB+KENSXzEwMDBUX01TX1ZBTFVFKTsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX21zX2F1dG86CisJCQlwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIENSUyBvbiBUWC4gVGhpcyBtdXN0IGJlIHNldCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisKKwkJLyogT3B0aW9uczoKKwkJICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQorCQkgKiAgIDAgLSBBdXRvIGZvciBhbGwgc3BlZWRzCisJCSAqICAgMSAtIE1ESSBtb2RlCisJCSAqICAgMiAtIE1ESS1YIG1vZGUKKwkJICogICAzIC0gQXV0byBmb3IgMTAwMEJhc2UtVCBvbmx5IChNREktWCBmb3IgMTAvMTAwQmFzZS1UIG1vZGVzKQorCQkgKi8KKyNpZiAwCisJCXBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworCisJCXN3aXRjaCAoaHctPm1kaXgpIHsKKwkJY2FzZSAxOgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJZGVmYXVsdDoKKyNlbmRpZgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKyNpZiAwCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogT3B0aW9uczoKKwkJICogICBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPSAwIChkZWZhdWx0KQorCQkgKiAgICAgICBBdXRvbWF0aWMgQ29ycmVjdGlvbiBmb3IgUmV2ZXJzZWQgQ2FibGUgUG9sYXJpdHkKKwkJICogICAwIC0gRGlzYWJsZWQKKwkJICogICAxIC0gRW5hYmxlZAorCQkgKi8KKwkJcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQkvKiBGb3JjZSBUWF9DTEsgaW4gdGhlIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyCisJCSAqIHRvIDI1TUh6IGNsb2NrLgorCQkgKi8KKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKKworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZiAoaHctPnBoeV9yZXZpc2lvbiA8IE04OEUxMDExX0lfUkVWXzQpIHsKKyNlbmRpZgorCQkJLyogQ29uZmlndXJlIE1hc3RlciBhbmQgU2xhdmUgZG93bnNoaWZ0IHZhbHVlcyAqLworCQkJcGh5X2RhdGEgJj0gfihNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUX01BU0sgfAorCQkJCU04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9NQVNLKTsKKwkJCXBoeV9kYXRhIHw9IChNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYIHwKKwkJCQlNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMVgpOworCQkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwkKKwkJLyogU1cgUmVzZXQgdGhlIFBIWSBzbyBhbGwgY2hhbmdlcyB0YWtlIGVmZmVjdCAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodykpKSB7CisJCQlERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisjaWZkZWYgTElOVVhfRFJJVkVSCisJCX0KKyNlbmRpZgorCX0KKwkKKwkvKiBPcHRpb25zOgorCSAqICAgYXV0b25lZyA9IDEgKGRlZmF1bHQpCisJICogICAgICBQSFkgd2lsbCBhZHZlcnRpc2UgdmFsdWUocykgcGFyc2VkIGZyb20KKwkgKiAgICAgIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMKKwkgKiAgIGF1dG9uZWcgPSAwCisJICogICAgICBQSFkgd2lsbCBiZSBzZXQgdG8gMTBILCAxMEYsIDEwMEgsIG9yIDEwMEYKKwkgKiAgICAgIGRlcGVuZGluZyBvbiB2YWx1ZSBwYXJzZWQgZnJvbSBmb3JjZWRfc3BlZWRfZHVwbGV4LgorCSAqLworCQorCS8qIElzIGF1dG9uZWcgZW5hYmxlZD8gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9yIGJ5IHNvZnR3YXJlCisJICogb3ZlcnJpZGUuICBJZiBzbywgY2FsbCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyByb3V0aW5lIHRvIHBhcnNlIHRoZQorCSAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgb3B0aW9ucy4gSWYgYXV0b25lZyBpcyBOT1QgZW5hYmxlZCwgdGhlbgorCSAqIHRoZSB1c2VyIHNob3VsZCBoYXZlIHByb3ZpZGVkIGEgc3BlZWQvZHVwbGV4IG92ZXJyaWRlLiAgSWYgc28sIHRoZW4KKwkgKiBjYWxsIGUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXggdG8gcGFyc2UgYW5kIHNldCB0aGlzIHVwLgorCSAqLworCS8qIFBlcmZvcm0gc29tZSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQKKwkgKiBwYXJhbWV0ZXIuICBJZiB0aGlzIHZhcmlhYmxlIGlzIHplcm8sIHRoZW4gc2V0IGl0IHRvIHRoZSBkZWZhdWx0LgorCSAqLworCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJj0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKwkKKwkvKiBJZiBhdXRvbmVnX2FkdmVydGlzZWQgaXMgemVybywgd2UgYXNzdW1lIGl0IHdhcyBub3QgZGVmYXVsdGVkCisJICogYnkgdGhlIGNhbGxpbmcgY29kZSBzbyB3ZSBzZXQgdG8gYWR2ZXJ0aXNlIGZ1bGwgY2FwYWJpbGl0eS4KKwkgKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCisJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCQorCURFQlVHT1VUKCJSZWNvbmZpZ3VyaW5nIGF1dG8tbmVnIGFkdmVydGlzZW1lbnQgcGFyYW1zXG4iKTsKKwlpZigocmV0X3ZhbCA9IGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKGh3KSkpIHsKKwkJREVCVUdPVVQoIkVycm9yIFNldHRpbmcgdXAgQXV0by1OZWdvdGlhdGlvblxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KKwlERUJVR09VVCgiUmVzdGFydGluZyBBdXRvLU5lZ1xuIik7CisJCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIGJ5IHNldHRpbmcgdGhlIEF1dG8gTmVnIEVuYWJsZSBiaXQgYW5kCisJICogdGhlIEF1dG8gTmVnIFJlc3RhcnQgYml0IGluIHRoZSBQSFkgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSkpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXBoeV9kYXRhIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CisJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKyNpZiAwCQorCS8qIERvZXMgdGhlIHVzZXIgd2FudCB0byB3YWl0IGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZSBoZXJlLCBvcgorCSAqIGNoZWNrIGF0IGEgbGF0ZXIgdGltZSAoZm9yIGV4YW1wbGUsIGNhbGxiYWNrIHJvdXRpbmUpLgorCSAqLworCWlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIGF1dG9uZWcgdG8gY29tcGxldGVcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CisjZWxzZQorCS8qIElmIHdlIGRvIG5vdCB3YWl0IGZvciBhdXRvbmVnb3RpYXRpb24gdG8gY29tcGxldGUgSSAKKwkgKiBkbyBub3Qgc2VlIGEgdmFsaWQgbGluayBzdGF0dXMuCisJICovCisJaWYoKHJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpKSkgeworCQlERUJVR09VVCgiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgYXV0b25lZyB0byBjb21wbGV0ZVxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KKyNlbmRpZgorCX0gLyogIWh3LT5waHlfcmVzZXRfZGlzYWJsZSAqLworCQorCS8qIENoZWNrIGxpbmsgc3RhdHVzLiBXYWl0IHVwIHRvIDEwMCBtaWNyb3NlY29uZHMgZm9yIGxpbmsgdG8gYmVjb21lCisJICogdmFsaWQuCisJICovCisJZm9yKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJaWYocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKwkJCS8qIFdlIGhhdmUgbGluaywgc28gd2UgbmVlZCB0byBmaW5pc2ggdGhlIGNvbmZpZyBwcm9jZXNzOgorCQkJICogICAxKSBTZXQgdXAgdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CisJCQkgKiAgICAgIGlmIHdlIGFyZSBvbiA4MjU0My4gIElmIHdlCisJCQkgKiAgICAgIGFyZSBvbiBuZXdlciBzaWxpY29uLCB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlCisJCQkgKiAgICAgIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3Rlci4KKwkJCSAqICAgMikgU2V0IHVwIGZsb3cgY29udHJvbCBvbiB0aGUgTUFDIHRvIHRoYXQgZXN0YWJsaXNoZWQgd2l0aAorCQkJICogICAgICB0aGUgbGluayBwYXJ0bmVyLgorCQkJICovCisJCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKKwkJCQllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQkJfSBlbHNlIHsKKwkJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KGh3KSkpIHsKKwkJCQkJREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworCQkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCQl9CisJCQl9CisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KSkpIHsKKwkJCQlERUJVR09VVCgiRXJyb3IgQ29uZmlndXJpbmcgRmxvdyBDb250cm9sXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKyNpZiAwCisJCQlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQkJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSkpKSB7CisJCQkJCURFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBEU1AgYWZ0ZXIgbGluayB1cFxuIik7CisJCQkJCXJldHVybiByZXRfdmFsOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJREVCVUdPVVQoIlZhbGlkIGxpbmsgZXN0YWJsaXNoZWQhISFcbiIpOworCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisJCisJREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7CisJcmV0dXJuIC1FMTAwMF9FUlJfTk9MSU5LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvbmZpZ3VyZXMgUEhZIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHNldHRpbmdzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBtaWlfYXV0b25lZ19hZHZfcmVnOworCXVpbnQxNl90IG1paV8xMDAwdF9jdHJsX3JlZzsKKworCURFQlVHRlVOQygiZTEwMDBfcGh5X3NldHVwX2F1dG9uZWciKTsKKwkKKwkvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfYXV0b25lZ19hZHZfcmVnKSkpCisJCXJldHVybiByZXRfdmFsOworCisJLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZtaWlfMTAwMHRfY3RybF9yZWcpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkvKiBOZWVkIHRvIHBhcnNlIGJvdGggYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYyBhbmQgc2V0IHVwCisJICogdGhlIGFwcHJvcHJpYXRlIFBIWSByZWdpc3RlcnMuICBGaXJzdCB3ZSB3aWxsIHBhcnNlIGZvcgorCSAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBzb2Z0d2FyZSBvdmVycmlkZS4gIFNpbmNlIHdlIGNhbiBhZHZlcnRpc2UKKwkgKiBhIHBsZXRob3JhIG9mIGNvbWJpbmF0aW9ucywgd2UgbmVlZCB0byBjaGVjayBlYWNoIGJpdAorCSAqIGluZGl2aWR1YWxseS4KKwkgKi8KKwkKKwkvKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZworCSAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KKwkgKiB0aGUgIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4KKwkgKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5SRUc0X1NQRUVEX01BU0s7CisJbWlpXzEwMDB0X2N0cmxfcmVnICY9IH5SRUc5X1NQRUVEX01BU0s7CisKKwlERUJVR09VVDEoImF1dG9uZWdfYWR2ZXJ0aXNlZCAleFxuIiwgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCk7CisKKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBIYWxmIER1cGxleD8gKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKKwkJREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOworCX0KKworCS8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEZ1bGwgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfRlVMTCkgeworCQlERUJVR09VVCgiQWR2ZXJ0aXNlIDEwbWIgRnVsbCBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTBUX0ZEX0NBUFM7CisJfQorCisJLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEhhbGYgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0hBTEYpIHsKKwkJREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBIYWxmIGR1cGxleFxuIik7CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9IRF9DQVBTOworCX0KKworCS8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBGdWxsIER1cGxleD8gKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9GVUxMKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgRnVsbCBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfRkRfQ0FQUzsKKwl9CisKKwkvKiBXZSBkbyBub3QgYWxsb3cgdGhlIFBoeSB0byBhZHZlcnRpc2UgMTAwMCBNYiBIYWxmIER1cGxleCAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9IQUxGKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEhhbGYgZHVwbGV4IHJlcXVlc3RlZCwgcmVxdWVzdCBkZW5pZWQhXG4iKTsKKwl9CisKKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAwIE1iIEZ1bGwgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKwkJbWlpXzEwMDB0X2N0cmxfcmVnIHw9IENSXzEwMDBUX0ZEX0NBUFM7CisJfQorCisJLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCisJICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCisJICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCisJICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKwkgKgorCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKKwkgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisJICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorCSAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgZTEwMDBfZmNfbm9uZTogLyogMCAqLworCQkvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfcnhfcGF1c2U6IC8qIDEgKi8KKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKKwkJICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorCQkgKi8KKwkJLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQorCQkgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKwkJICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCisJCSAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQorCQkgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX3R4X3BhdXNlOiAvKiAyICovCisJCS8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCisJCSAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX2Z1bGw6IC8qIDMgKi8KKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCisJCSAqIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisKKwlpZigocmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0FEViwKKwkgICAgICAgICAgICAgICAgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlERUJVR09VVDEoIkF1dG8tTmVnIEFkdmVydGlzaW5nICV4XG4iLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKworCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIG1paV8xMDAwdF9jdHJsX3JlZykpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNldHMgdGhlIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCByZWdpc3RlcgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBMaW5rIHNob3VsZCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgcHJldmlvdXNseS4gUmVhZHMgdGhlIHNwZWVkIGFuZCBkdXBsZXgKKyogaW5mb3JtYXRpb24gZnJvbSB0aGUgRGV2aWNlIFN0YXR1cyByZWdpc3Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3Qoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCB0Y3RsOworCisJdGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKwkKKwl0Y3RsICY9IH5FMTAwMF9UQ1RMX0NPTEQ7CisJdGN0bCB8PSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UgPDwgRTEwMDBfQ09MRF9TSElGVDsKKwkKKwlFMTAwMF9XUklURV9SRUcoaHcsIFRDVEwsIHRjdGwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTZXRzIE1BQyBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIHRvIHJlZmxlY3QgdGhlIHRob3NlIGluIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogbWlpX3JlZyAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIE1JSSBjb250cm9sIHJlZ2lzdGVyCisqCisqIFRoZSBjb250ZW50cyBvZiB0aGUgUEhZIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBuZWVkIHRvCisqIGJlIHBhc3NlZCBpbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwlpbnQzMl90IHJldF92YWw7CisJdWludDE2X3QgcGh5X2RhdGE7CisKKwlERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5Iik7CisKKwkvKiBSZWFkIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciBhbmQgc2V0IHRoZSBiaXRzIHRvIEZvcmNlIFNwZWVkCisJICogYW5kIER1cGxleC4KKwkgKi8KKwljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCWN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworCWN0cmwgJj0gfihFMTAwMF9DVFJMX1NQRF9TRUwgfCBFMTAwMF9DVFJMX0lMT1MpOworCisJLyogU2V0IHVwIGR1cGxleCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgYW5kIFRyYW5zbWl0IENvbnRyb2wKKwkgKiByZWdpc3RlcnMgZGVwZW5kaW5nIG9uIG5lZ290aWF0ZWQgdmFsdWVzLgorCSAqLworCWlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJaWYocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfRlVMTF9EVVBMRVgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKwkJZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOworCisJCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKwkJLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKwkJICogbmVnb3RpYXRlZCB2YWx1ZXMuCisJCSAqLworCQlpZigocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KKwkJICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKQorCQkJY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDAwOworCQllbHNlIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorCQkJSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwME1CUFMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKwl9IGVsc2UgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJaWYocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKwkJZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOworCisJCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKwkJLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKwkJICogbmVnb3RpYXRlZCB2YWx1ZXMuCisJCSAqLworCQlpZigocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisJCWVsc2UgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKwl9CisJLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKwlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb3JjZXMgdGhlIE1BQydzIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIHRoZSBURkNFIGFuZCBSRkNFIGJpdHMgaW4gdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIHRvIHJlZmxlY3QKKyAqIHRoZSBhZGFwdGVyIHNldHRpbmdzLiBURkNFIGFuZCBSRkNFIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQgYnkKKyAqIHNvZnR3YXJlIHdoZW4gYSBDb3BwZXIgUEhZIGlzIHVzZWQgYmVjYXVzZSBhdXRvbmVnb3RpYXRpb24gaXMgbWFuYWdlZAorICogYnkgdGhlIFBIWSByYXRoZXIgdGhhbiB0aGUgTUFDLiBTb2Z0d2FyZSBtdXN0IGFsc28gY29uZmlndXJlIHRoZXNlCisgKiBiaXRzIHdoZW4gbGluayBpcyBmb3JjZWQgb24gYSBmaWJlciBjb25uZWN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2ZvcmNlX21hY19mYyIpOworCQorCS8qIEdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAqLworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogQmVjYXVzZSB3ZSBkaWRuJ3QgZ2V0IGxpbmsgdmlhIHRoZSBpbnRlcm5hbCBhdXRvLW5lZ290aWF0aW9uCisJICogbWVjaGFuaXNtICh3ZSBlaXRoZXIgZm9yY2VkIGxpbmsgb3Igd2UgZ290IGxpbmsgdmlhIFBIWQorCSAqIGF1dG8tbmVnKSwgd2UgaGF2ZSB0byBtYW51YWxseSBlbmFibGUvZGlzYWJsZSB0cmFuc21pdCBhbgorCSAqIHJlY2VpdmUgZmxvdyBjb250cm9sLgorCSAqCisJICogVGhlICJDYXNlIiBzdGF0ZW1lbnQgYmVsb3cgZW5hYmxlcy9kaXNhYmxlIGZsb3cgY29udHJvbAorCSAqIGFjY29yZGluZyB0byB0aGUgImh3LT5mYyIgcGFyYW1ldGVyLgorCSAqCisJICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgorCSAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisJICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlCisJICogICAgICAgICAgZnJhbWVzIGJ1dCBub3Qgc2VuZCBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMjogIFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBmcmFtZXMgYnV0IHdlIGRvIG5vdCByZWNlaXZlIHBhdXNlIGZyYW1lcykuCisJICogICAgICAzOiAgQm90aCBSeCBhbmQgVFggZmxvdyBjb250cm9sIChzeW1tZXRyaWMpIGlzIGVuYWJsZWQuCisJICogIG90aGVyOiAgTm8gb3RoZXIgdmFsdWVzIHNob3VsZCBiZSBwb3NzaWJsZSBhdCB0aGlzIHBvaW50LgorCSAqLworCQorCXN3aXRjaCAoaHctPmZjKSB7CisJY2FzZSBlMTAwMF9mY19ub25lOgorCQljdHJsICY9ICh+KEUxMDAwX0NUUkxfVEZDRSB8IEUxMDAwX0NUUkxfUkZDRSkpOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX3J4X3BhdXNlOgorCQljdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKKwkJY3RybCB8PSBFMTAwMF9DVFJMX1JGQ0U7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfdHhfcGF1c2U6CisJCWN0cmwgJj0gKH5FMTAwMF9DVFJMX1JGQ0UpOworCQljdHJsIHw9IEUxMDAwX0NUUkxfVEZDRTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF9mY19mdWxsOgorCQljdHJsIHw9IChFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJCisJLyogRGlzYWJsZSBUWCBGbG93IENvbnRyb2wgZm9yIDgyNTQyIChyZXYgMi4wKSAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWN0cmwgJj0gKH5FMTAwMF9DVFJMX1RGQ0UpOworCQorCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgZmxvdyBjb250cm9sIHNldHRpbmdzIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQKKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgdmFsaWQgbGluayBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAqIEZvcmNlcyBNQUMgZmxvdyBjb250cm9sIHNldHRpbmdzIGlmIGxpbmsgd2FzIGZvcmNlZC4gV2hlbiBpbiBNSUkvR01JSSBtb2RlCisgKiBhbmQgYXV0b25lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRoZSBNQUMgZmxvdyBjb250cm9sIHNldHRpbmdzIHdpbGwgYmUgc2V0CisgKiBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIG5lZ290aWF0ZWQgYnkgdGhlIFBIWS4gSW4gVEJJIG1vZGUsIHRoZSBURkNFCisgKiBhbmQgUkZDRSBiaXRzIHdpbGwgYmUgYXV0b21hdGljYWx5IHNldCB0byB0aGUgbmVnb3RpYXRlZCBmbG93IGNvbnRyb2wgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IG1paV9zdGF0dXNfcmVnOworCXVpbnQxNl90IG1paV9ud2F5X2Fkdl9yZWc7CisJdWludDE2X3QgbWlpX253YXlfbHBfYWJpbGl0eV9yZWc7CisJdWludDE2X3Qgc3BlZWQ7CisJdWludDE2X3QgZHVwbGV4OworCQorCURFQlVHRlVOQygiZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAiKTsKKwkKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBmaWJlciBtZWRpYSBhbmQgYXV0by1uZWcgZmFpbGVkCisJICogc28gd2UgaGFkIHRvIGZvcmNlIGxpbmsuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gZm9yY2UgdGhlCisJICogY29uZmlndXJhdGlvbiBvZiB0aGUgTUFDIHRvIG1hdGNoIHRoZSAiZmMiIHBhcmFtZXRlci4KKwkgKi8KKwlpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAorCSAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSkgeyAKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCQorCS8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGNvcHBlciBtZWRpYSBhbmQgYXV0by1uZWcgaXMKKwkgKiBlbmFibGVkLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNoZWNrIGFuZCBzZWUgaWYgQXV0by1OZWcKKwkgKiBoYXMgY29tcGxldGVkLCBhbmQgaWYgc28sIGhvdyB0aGUgUEhZIGFuZCBsaW5rIHBhcnRuZXIgaGFzCisJICogZmxvdyBjb250cm9sIGNvbmZpZ3VyZWQuCisJICovCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgY2hlY2sgdG8gc2VlIGlmIEF1dG9OZWcKKwkJICogaGFzIGNvbXBsZXRlZC4gIFdlIHJlYWQgdGhpcyB0d2ljZSBiZWNhdXNlIHRoaXMgcmVnIGhhcworCQkgKiBzb21lICJzdGlja3kiIChsYXRjaGVkKSBiaXRzLgorCQkgKi8KKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZykpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgeworCQkJLyogVGhlIEF1dG9OZWcgcHJvY2VzcyBoYXMgY29tcGxldGVkLCBzbyB3ZSBub3cgbmVlZCB0bworCQkJICogcmVhZCBib3RoIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKwkJCSAqIChBZGRyZXNzIDQpIGFuZCB0aGUgQXV0b19OZWdvdGlhdGlvbiBCYXNlIFBhZ2UgQWJpbGl0eQorCQkJICogUmVnaXN0ZXIgKEFkZHJlc3MgNSkgdG8gZGV0ZXJtaW5lIGhvdyBmbG93IGNvbnRyb2wgd2FzCisJCQkgKiBuZWdvdGlhdGVkLgorCQkJICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2Fkdl9yZWcpKSkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9scF9hYmlsaXR5X3JlZykpKQorCQkJCXJldHVybiByZXRfdmFsOworCisJCQkvKiBUd28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisJCQkgKiAoQWRkcmVzcyA0KSBhbmQgdHdvIGJpdHMgaW4gdGhlIEF1dG8gTmVnb3RpYXRpb24gQmFzZQorCQkJICogUGFnZSBBYmlsaXR5IFJlZ2lzdGVyIChBZGRyZXNzIDUpIGRldGVybWluZSBmbG93IGNvbnRyb2wKKwkJCSAqIGZvciBib3RoIHRoZSBQSFkgYW5kIHRoZSBsaW5rIHBhcnRuZXIuICBUaGUgZm9sbG93aW5nCisJCQkgKiB0YWJsZSwgdGFrZW4gb3V0IG9mIHRoZSBJRUVFIDgwMi4zYWIvRDYuMCBkYXRlZCBNYXJjaCAyNSwKKwkJCSAqIDE5OTksIGRlc2NyaWJlcyB0aGVzZSBQQVVTRSByZXNvbHV0aW9uIGJpdHMgYW5kIGhvdyBmbG93CisJCQkgKiBjb250cm9sIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGVzZSBzZXR0aW5ncy4KKwkJCSAqIE5PVEU6ICBEQyA9IERvbid0IENhcmUKKwkJCSAqCisJCQkgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorCQkJICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgTklDIFJlc29sdXRpb24KKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMCAgIHwgICAgMCAgICB8ICBEQyAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMCAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMCAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3R4X3BhdXNlCisJCQkgKiAgIDEgICB8ICAgIDAgICAgfCAgIDAgICB8ICAgREMgICAgfCBlMTAwMF9mY19ub25lCisJCQkgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBlMTAwMF9mY19mdWxsCisJCQkgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDAgICAgfCBlMTAwMF9mY19ub25lCisJCQkgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDEgICAgfCBlMTAwMF9mY19yeF9wYXVzZQorCQkJICoKKwkJCSAqLworCQkJLyogQXJlIGJvdGggUEFVU0UgYml0cyBzZXQgdG8gMT8gIElmIHNvLCB0aGlzIGltcGxpZXMKKwkJCSAqIFN5bW1ldHJpYyBGbG93IENvbnRyb2wgaXMgZW5hYmxlZCBhdCBib3RoIGVuZHMuICBUaGUKKwkJCSAqIEFTTV9ESVIgYml0cyBhcmUgaXJyZWxldmFudCBwZXIgdGhlIHNwZWMuCisJCQkgKgorCQkJICogRm9yIFN5bW1ldHJpYyBGbG93IENvbnRyb2w6CisJCQkgKgorCQkJICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKwkJCSAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorCQkJICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAxICAgfCAgIERDICAgIHwgICAxICAgfCAgIERDICAgIHwgZTEwMDBfZmNfZnVsbAorCQkJICoKKwkJCSAqLworCQkJaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkpIHsKKwkJCQkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSWCBPTkxZCisJCQkJICogb2YgcGF1c2UgZnJhbWVzLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYWQgdG8gYWR2ZXJ0aXNlCisJCQkJICogRlVMTCBmbG93IGNvbnRyb2wgYmVjYXVzZSB3ZSBjb3VsZCBub3QgYWR2ZXJ0aXNlIFJYCisJCQkJICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCisJCQkJICogdHVybiBPRkYgIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgorCQkJCSAqLworI2lmIDAKKwkJCQlpZihody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworCQkJCQlody0+ZmMgPSBlMTAwMF9mY19mdWxsOworI2Vsc2UKKwkJCQlpZihody0+ZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworI2VuZGlmCisJCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBGVUxMLlxyXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlody0+ZmMgPSBlMTAwMF9mY19yeF9wYXVzZTsKKwkJCQkJREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxyXG4iKTsKKwkJCQl9CisJCQl9CisJCQkvKiBGb3IgcmVjZWl2aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3R4X3BhdXNlCisJCQkgKgorCQkJICovCisJCQllbHNlIGlmKCEobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisJCQkJKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX0FTTV9ESVIpICYmCisJCQkJKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3R4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBUWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkvKiBGb3IgdHJhbnNtaXR0aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3J4X3BhdXNlCisJCQkgKgorCQkJICovCisJCQllbHNlIGlmKChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKwkJCQkobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKwkJCQkhKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkvKiBQZXIgdGhlIElFRUUgc3BlYywgYXQgdGhpcyBwb2ludCBmbG93IGNvbnRyb2wgc2hvdWxkIGJlCisJCQkgKiBkaXNhYmxlZC4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY29uc2lkZXIgdGhhdCB3ZSBjb3VsZAorCQkJICogYmUgY29ubmVjdGVkIHRvIGEgbGVnYWN5IHN3aXRjaCB0aGF0IGRvZXNuJ3QgYWR2ZXJ0aXNlCisJCQkgKiBkZXNpcmVkIGZsb3cgY29udHJvbCwgYnV0IGNhbiBiZSBmb3JjZWQgb24gdGhlIGxpbmsKKwkJCSAqIHBhcnRuZXIuICBTbyBpZiB3ZSBhZHZlcnRpc2VkIG5vIGZsb3cgY29udHJvbCwgdGhhdCBpcworCQkJICogd2hhdCB3ZSB3aWxsIHJlc29sdmUgdG8uICBJZiB3ZSBhZHZlcnRpc2VkIHNvbWUga2luZCBvZgorCQkJICogcmVjZWl2ZSBjYXBhYmlsaXR5IChSeCBQYXVzZSBPbmx5IG9yIEZ1bGwgRmxvdyBDb250cm9sKQorCQkJICogYW5kIHRoZSBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlZCBub25lLCB3ZSB3aWxsIGNvbmZpZ3VyZQorCQkJICogb3Vyc2VsdmVzIHRvIGVuYWJsZSBSeCBGbG93IENvbnRyb2wgb25seS4gIFdlIGNhbiBkbworCQkJICogdGhpcyBzYWZlbHkgZm9yIHR3byByZWFzb25zOiAgSWYgdGhlIGxpbmsgcGFydG5lciByZWFsbHkKKwkJCSAqIGRpZG4ndCB3YW50IGZsb3cgY29udHJvbCBlbmFibGVkLCBhbmQgd2UgZW5hYmxlIFJ4LCBubworCQkJICogaGFybSBkb25lIHNpbmNlIHdlIHdvbid0IGJlIHJlY2VpdmluZyBhbnkgUEFVU0UgZnJhbWVzCisJCQkgKiBhbnl3YXkuICBJZiB0aGUgaW50ZW50IG9uIHRoZSBsaW5rIHBhcnRuZXIgd2FzIHRvIGhhdmUKKwkJCSAqIGZsb3cgY29udHJvbCBlbmFibGVkLCB0aGVuIGJ5IHVzIGVuYWJsaW5nIFJYIG9ubHksIHdlCisJCQkgKiBjYW4gYXQgbGVhc3QgcmVjZWl2ZSBwYXVzZSBmcmFtZXMgYW5kIHByb2Nlc3MgdGhlbS4KKwkJCSAqIFRoaXMgaXMgYSBnb29kIGlkZWEgYmVjYXVzZSBpbiBtb3N0IGNhc2VzLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIHByZWRvbWluYW50bHkgYSBzZXJ2ZXIgTklDLCBtb3JlIHRpbWVzIHRoYW4gbm90IHdlIHdpbGwKKwkJCSAqIGJlIGFza2VkIHRvIGRlbGF5IHRyYW5zbWlzc2lvbiBvZiBwYWNrZXRzIHRoYW4gYXNraW5nCisJCQkgKiBvdXIgbGluayBwYXJ0bmVyIHRvIHBhdXNlIHRyYW5zbWlzc2lvbiBvZiBmcmFtZXMuCisJCQkgKi8KKyNpZiAwCisJCQllbHNlIGlmKGh3LT5vcmlnaW5hbF9mYyA9PSBlMTAwMF9mY19ub25lIHx8CisJCQkJaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX3R4X3BhdXNlKSB7CisjZWxzZQorCQkJZWxzZSBpZihody0+ZmMgPT0gZTEwMDBfZmNfbm9uZSkKKwkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cclxuIik7CisJCQllbHNlIGlmKGh3LT5mYyA9PSBlMTAwMF9mY190eF9wYXVzZSkgeworI2VuZGlmCisJCQkJaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKKwkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cclxuIik7CisJCQl9IGVsc2UgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkKKwkJCS8qIE5vdyB3ZSBuZWVkIHRvIGRvIG9uZSBsYXN0IGNoZWNrLi4uICBJZiB3ZSBhdXRvLQorCQkJICogbmVnb3RpYXRlZCB0byBIQUxGIERVUExFWCwgZmxvdyBjb250cm9sIHNob3VsZCBub3QgYmUKKwkJCSAqIGVuYWJsZWQgcGVyIElFRUUgODAyLjMgc3BlYy4KKwkJCSAqLworCQkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisJCQkKKwkJCWlmKGR1cGxleCA9PSBIQUxGX0RVUExFWCkKKwkJCQlody0+ZmMgPSBlMTAwMF9mY19ub25lOworCQkJCisJCQkvKiBOb3cgd2UgY2FsbCBhIHN1YnJvdXRpbmUgdG8gYWN0dWFsbHkgZm9yY2UgdGhlIE1BQworCQkJICogY29udHJvbGxlciB0byB1c2UgdGhlIGNvcnJlY3QgZmxvdyBjb250cm9sIHNldHRpbmdzLgorCQkJICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2ZvcmNlX21hY19mYyhodykpKSB7CisJCQkJREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURFQlVHT1VUKCJDb3BwZXIgUEhZIGFuZCBBdXRvIE5lZyBoYXMgbm90IGNvbXBsZXRlZC5cclxuIik7CisJCX0KKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIENhbGxlZCBieSBhbnkgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBjaGVjayB0aGUgbGluayBzdGF0dXMgb2YgdGhlIGFkYXB0ZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IHJ4Y3c7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCBzaWduYWwgPSAwOworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwaHlfZGF0YTsKKwl1aW50MTZfdCBscF9jYXBhYmlsaXR5OworCQorCURFQlVHRlVOQygiZTEwMDBfY2hlY2tfZm9yX2xpbmsiKTsKKwkKKwkvKiBPbiBhZGFwdGVycyB3aXRoIGEgTUFDIG5ld2VyIHRoYW4gODI1NDQsIFNXIERlZmluZWFibGUgcGluIDEgd2lsbCBiZSAKKwkgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUgCisJICogY2xlYXJlZCB3aGVuIHRoZXJlIGlzIGEgc2lnbmFsLiAgVGhpcyBhcHBsaWVzIHRvIGZpYmVyIG1lZGlhIG9ubHkuCisJICovCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKwkJc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKwljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCXJ4Y3cgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhDVyk7CisJCisJLyogSWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gZ28gb3V0IHRvIHRoZSBQSFkKKwkgKiByZWdpc3RlcnMgdG8gc2VlIGlmIEF1dG8tTmVnIGhhcyBjb21wbGV0ZWQgYW5kL29yIGlmIG91ciBsaW5rCisJICogc3RhdHVzIGhhcyBjaGFuZ2VkLiAgVGhlIGdldF9saW5rX3N0YXR1cyBmbGFnIHdpbGwgYmUgc2V0IGlmIHdlCisJICogcmVjZWl2ZSBhIExpbmsgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgb3Igd2UgaGF2ZSBSeCBTZXF1ZW5jZQorCSAqIEVycm9ycy4KKwkgKi8KKyNpZiAwCisJaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+Z2V0X2xpbmtfc3RhdHVzKSB7CisjZWxzZQorCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisjZW5kaWYKKwkJLyogRmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgcmVwb3J0cworCQkgKiBsaW5rLiAgSWYgc28sIHRoZW4gd2Ugd2FudCB0byBnZXQgdGhlIGN1cnJlbnQgc3BlZWQvZHVwbGV4CisJCSAqIG9mIHRoZSBQSFkuCisJCSAqIFJlYWQgdGhlIHJlZ2lzdGVyIHR3aWNlIHNpbmNlIHRoZSBsaW5rIGJpdCBpcyBzdGlja3kuCisJCSAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCQorCQlpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworI2lmIDAKKwkJCWh3LT5nZXRfbGlua19zdGF0dXMgPSBGQUxTRTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJLyogTm8gbGluayBkZXRlY3RlZCAqLworCQkJcmV0dXJuIC1FMTAwMF9FUlJfTk9MSU5LOworCQl9CisKKwkJLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCisJCSAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bworCQkgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4CisJCSAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgorCQkgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCisJCSAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKwkJICogc2V0dGluZ3MuCisJCSAqLworCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisJCQllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQllbHNlIHsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpKSkgeworCQkJCURFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBNQUMgdG8gUEhZIHNldHRpbmdzXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfQorCQkKKwkJLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBub3cgdGhhdCBBdXRvLU5lZyBoYXMgY29tcGxldGVkLiBGaXJzdCwgd2UgCisJCSAqIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGVzaXJlZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYmVjYXVzZSB3ZSBtYXkKKwkJICogaGF2ZSBoYWQgdG8gcmUtYXV0b25lZyB3aXRoIGEgZGlmZmVyZW50IGxpbmsgcGFydG5lci4KKwkJICovCisJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCQkKKwkJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIG9uIGNvcHBlciBhbmQgd2UgaGF2ZQorCQkgKiBhdXRvLW5lZ290aWF0ZWQgbGluay4gIFRoZXNlIGFyZSBjb25kaXRpb25zIGZvciBjaGVja2luZyB0aGUgbGluaworCQkgKiBwYXJ0ZXIgY2FwYWJpbGl0eSByZWdpc3Rlci4gIFdlIHVzZSB0aGUgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgdG8KKwkJICogZGV0ZXJtaW5lIGlmIFRCSSBDb21wYXRpYmlsaXR5IG5lZWRzIHRvIGJlIHR1cm5lZCBvbiBvciBvZmYuICBJZgorCQkgKiB0aGUgbGluayBwYXJ0bmVyIGFkdmVydGlzZXMgYW55IHNwZWVkIGluIGFkZGl0aW9uIHRvIEdpZ2FiaXQsIHRoZW4KKwkJICogd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgR01JSS1iYXNlZCwgYW5kIFRCSSBjb21wYXRpYmlsaXR5IGlzIG5vdAorCQkgKiBuZWVkZWQuIElmIG5vIG90aGVyIHNwZWVkcyBhcmUgYWR2ZXJ0aXNlZCwgd2UgYXNzdW1lIHRoZSBsaW5rCisJCSAqIHBhcnRuZXIgaXMgVEJJLWJhc2VkLCBhbmQgd2UgdHVybiBvbiBUQkkgQ29tcGF0aWJpbGl0eS4KKwkJICovCisJCWlmKGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbikgeworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9MUF9BQklMSVRZLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwX2NhcGFiaWxpdHkpKSkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWlmKGxwX2NhcGFiaWxpdHkgJiAoTldBWV9MUEFSXzEwVF9IRF9DQVBTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldBWV9MUEFSXzEwVF9GRF9DQVBTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV0FZX0xQQVJfMTAwVFhfRkRfQ0FQUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XQVlfTFBBUl8xMDBUNF9DQVBTKSkgeworCQkJCS8qIElmIG91ciBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlcyBhbnl0aGluZyBpbiBhZGRpdGlvbiB0byAKKwkJCQkgKiBnaWdhYml0LCB3ZSBkbyBub3QgbmVlZCB0byBlbmFibGUgVEJJIGNvbXBhdGliaWxpdHkuCisJCQkJICovCisJCQkJaWYoaHctPnRiaV9jb21wYXRpYmlsaXR5X29uKSB7CisJCQkJCS8qIElmIHdlIHByZXZpb3VzbHkgd2VyZSBpbiB0aGUgbW9kZSwgdHVybiBpdCBvZmYuICovCisJCQkJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CisJCQkJCXJjdGwgJj0gfkUxMDAwX1JDVExfU0JQOworCQkJCQlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworCQkJCQlody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBGQUxTRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIElmIFRCSSBjb21wYXRpYmlsaXR5IGlzIHdhcyBwcmV2aW91c2x5IG9mZiwgdHVybiBpdCBvbi4gRm9yCisJCQkJICogY29tcGF0aWJpbGl0eSB3aXRoIGEgVEJJIGxpbmsgcGFydG5lciwgd2Ugd2lsbCBzdG9yZSBiYWQKKwkJCQkgKiBwYWNrZXRzLiBTb21lIGZyYW1lcyBoYXZlIGFuIGFkZGl0aW9uYWwgYnl0ZSBvbiB0aGUgZW5kIGFuZAorCQkJCSAqIHdpbGwgbG9vayBsaWtlIENSQyBlcnJvcnMgdG8gdG8gdGhlIGhhcmR3YXJlLgorCQkJCSAqLworCQkJCWlmKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKwkJCQkJaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gVFJVRTsKKwkJCQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKwkJCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NCUDsKKwkJCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rIChhdXRvLW5lZ290aWF0aW9uIGZhaWxlZCBvciBsaW5rIHBhcnRuZXIgY2Fubm90CisJICogYXV0by1uZWdvdGlhdGUpLCB0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbiAod2UgaGF2ZSBzaWduYWwpLCBhbmQgb3VyCisJICogbGluayBwYXJ0bmVyIGlzIG5vdCB0cnlpbmcgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCB1cyAod2UgYXJlIHJlY2VpdmluZworCSAqIGlkbGVzIG9yIGRhdGEpLCB3ZSBuZWVkIHRvIGZvcmNlIGxpbmsgdXAuIFdlIGFsc28gbmVlZCB0byBnaXZlCisJICogYXV0by1uZWdvdGlhdGlvbiB0aW1lIHRvIGNvbXBsZXRlLCBpbiBjYXNlIHRoZSBjYWJsZSB3YXMganVzdCBwbHVnZ2VkCisJICogaW4uIFRoZSBhdXRvbmVnX2ZhaWxlZCBmbGFnIGRvZXMgdGhpcy4KKwkgKi8KKwllbHNlIGlmKCgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCisJICAgICAgICAoKGN0cmwgJiBFMTAwMF9DVFJMX1NXRFBJTjEpID09IHNpZ25hbCkpIHx8CisJICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorCQkoIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpKSAmJgorCQkoIShyeGN3ICYgRTEwMDBfUlhDV19DKSkpIHsKKwkJaWYoaHctPmF1dG9uZWdfZmFpbGVkID09IDApIHsKKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlERUJVR09VVCgiTk9UIFJYaW5nIC9DLywgZGlzYWJsZSBBdXRvTmVnIGFuZCBmb3JjZSBsaW5rLlxyXG4iKTsKKwkJCisJCS8qIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbiBpbiB0aGUgVFhDVyByZWdpc3RlciAqLworCQlFMTAwMF9XUklURV9SRUcoaHcsIFRYQ1csIChody0+dHhjdyAmIH5FMTAwMF9UWENXX0FORSkpOworCQkKKwkJLyogRm9yY2UgbGluay11cCBhbmQgYWxzbyBmb3JjZSBmdWxsLWR1cGxleC4gKi8KKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJY3RybCB8PSAoRTEwMDBfQ1RSTF9TTFUgfCBFMTAwMF9DVFJMX0ZEKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwkJCisJCS8qIENvbmZpZ3VyZSBGbG93IENvbnRyb2wgYWZ0ZXIgZm9yY2luZyBsaW5rIHVwLiAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KSkpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CisJLyogSWYgd2UgYXJlIGZvcmNpbmcgbGluayBhbmQgd2UgYXJlIHJlY2VpdmluZyAvQy8gb3JkZXJlZCBzZXRzLCByZS1lbmFibGUKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyIGFuZCBkaXNhYmxlIGZvcmNlZCBsaW5rIGluIHRoZQorCSAqIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGluIGFuIGF0dGVtcHQgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCBvdXIgbGluaworCSAqIHBhcnRuZXIuCisJICovCisJZWxzZSBpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICB8fAorCSAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCisJCShjdHJsICYgRTEwMDBfQ1RSTF9TTFUpICYmCisJCShyeGN3ICYgRTEwMDBfUlhDV19DKSkgeworCQlERUJVR09VVCgiUlhpbmcgL0MvLCBlbmFibGUgQXV0b05lZyBhbmQgc3RvcCBmb3JjaW5nIGxpbmsuXHJcbiIpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIFRYQ1csIGh3LT50eGN3KTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCAmIH5FMTAwMF9DVFJMX1NMVSkpOworCX0KKyNpZiAwCisJLyogSWYgd2UgZm9yY2UgbGluayBmb3Igbm9uLWF1dG8tbmVnb3RpYXRpb24gc3dpdGNoLCBjaGVjayBsaW5rIHN0YXR1cworCSAqIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsIHNlcmRlcyBtZWRpYSB0eXBlLgorCSAqLworCWVsc2UgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorCQkJIShFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKKwkJLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreS4gKi8KKwkJdWRlbGF5KDEwKTsKKwkJaWYoRTEwMDBfUlhDV19TWU5DSCAmIEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKSkgeworCQkJaWYoIShyeGN3ICYgRTEwMDBfUlhDV19JVikpIHsKKwkJCQlody0+c2VyZGVzX2xpbmtfZG93biA9IEZBTFNFOworCQkJCURFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgdXAuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh3LT5zZXJkZXNfbGlua19kb3duID0gVFJVRTsKKwkJCURFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgZG93bi5cbiIpOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldGVjdHMgdGhlIGN1cnJlbnQgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHNwZWVkIC0gU3BlZWQgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGR1cGxleCAtIER1cGxleCBzZXR0aW5nIG9mIHRoZSBjb25uZWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAKK2UxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHVwbGV4KQoreworCXVpbnQzMl90IHN0YXR1czsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4Iik7CisJCisJaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisJCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkgeworCQkJKnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCURFQlVHT1VUKCIxMDAwIE1icywgIik7CisJCX0gZWxzZSBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlERUJVR09VVCgiMTAwIE1icywgIik7CisJCX0gZWxzZSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJCURFQlVHT1VUKCIxMCBNYnMsICIpOworCQl9CisJCQorCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpIHsKKwkJCSpkdXBsZXggPSBGVUxMX0RVUExFWDsKKwkJCURFQlVHT1VUKCJGdWxsIER1cGxleFxyXG4iKTsKKwkJfSBlbHNlIHsKKwkJCSpkdXBsZXggPSBIQUxGX0RVUExFWDsKKwkJCURFQlVHT1VUKCIgSGFsZiBEdXBsZXhcclxuIik7CisJCX0KKwl9IGVsc2UgeworCQlERUJVR09VVCgiMTAwMCBNYnMsIEZ1bGwgRHVwbGV4XHJcbiIpOworCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEJsb2NrcyB1bnRpbCBhdXRvbmVnIGNvbXBsZXRlcyBvciB0aW1lcyBvdXQgKH40LjUgc2Vjb25kcykKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3dhaXRfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBpOworCXVpbnQxNl90IHBoeV9kYXRhOworCQorCURFQlVHRlVOQygiZTEwMDBfd2FpdF9hdXRvbmVnIik7CisJREVCVUdPVVQoIldhaXRpbmcgZm9yIEF1dG8tTmVnIHRvIGNvbXBsZXRlLlxuIik7CisJCisJLyogV2Ugd2lsbCB3YWl0IGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlIG9yIDQuNSBzZWNvbmRzIHRvIGV4cGlyZS4gKi8KKwlmb3IoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7CisJCS8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCisJCSAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCisJCSAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWlmKHBoeV9kYXRhICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKwkJCURFQlVHT1VUKCJBdXRvLU5lZyBjb21wbGV0ZS5cbiIpOworCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCX0KKwkJbWRlbGF5KDEwMCk7CisJfQorCURFQlVHT1VUKCJBdXRvLU5lZyB0aW1lZG91dC5cbiIpOworCXJldHVybiAtRTEwMDBfRVJSX1RJTUVPVVQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmFpc2VzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisJLyogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IHNldHRpbmcgdGhlIE1EQworCSAqIGJpdCksIGFuZCB0aGVuIGRlbGF5IDEwIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsICgqY3RybCB8IEUxMDAwX0NUUkxfTURDKSk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheSgxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTG93ZXJzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisJLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IGNsZWFyaW5nIHRoZSBNREMKKwkgKiBiaXQpLCBhbmQgdGhlbiBkZWxheSAxMCBtaWNyb3NlY29uZHMuCisJICovCisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoKmN0cmwgJiB+RTEwMDBfQ1RSTF9NREMpKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJdWRlbGF5KDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIG91dCB0byB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIGRhdGEgLSBEYXRhIHRvIHNlbmQgb3V0IHRvIHRoZSBQSFkKKyogY291bnQgLSBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyoKKyogQml0cyBhcmUgc2hpZnRlZCBvdXQgaW4gTVNCIHRvIExTQiBvcmRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3QgbWFzazsKKworCS8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBudW1iZXIgb2YgYml0cyBvdXQgdG8gdGhlIFBIWS4gU28sIHRoZSB2YWx1ZQorCSAqIGluIHRoZSAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBvbmUgYml0IGF0IGEgCisJICogdGltZS4gSW4gb3JkZXIgdG8gZG8gdGhpcywgImRhdGEiIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBiaXRzLgorCSAqLworCW1hc2sgPSAweDAxOworCW1hc2sgPDw9IChjb3VudCAtIDEpOworCQorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCisJY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CisJCisJd2hpbGUobWFzaykgeworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIxIiBhbmQKKwkJICogdGhlbiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrLiBBICIwIiBpcworCQkgKiBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIwIiBhbmQgdGhlbgorCQkgKiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgY2xvY2suCisJCSAqLworCQlpZihkYXRhICYgbWFzaykgY3RybCB8PSBFMTAwMF9DVFJMX01ESU87CisJCWVsc2UgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPOworCQkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQkKKwkJdWRlbGF5KDEwKTsKKworCQllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJCWUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworCQltYXNrID0gbWFzayA+PiAxOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIGluIGZyb20gdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBCaXRzIGFyZSBzaGlmdGVkIGluIGluIE1TQiB0byBMU0Igb3JkZXIuIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQxNl90CitlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmw7CisJdWludDE2X3QgZGF0YSA9IDA7CisJdWludDhfdCBpOworCisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBIWSwgd2UgbmVlZCB0byBzaGlmdCBpbiBhIHRvdGFsCisJICogb2YgMTggYml0cyBmcm9tIHRoZSBQSFkuIFRoZSBmaXJzdCB0d28gYml0ICh0dXJuYXJvdW5kKSB0aW1lcyBhcmUgdXNlZAorCSAqIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYSByZWFkIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisJICogVGhlc2UgdHdvIGJpdHMgYXJlIGlnbm9yZWQgYnkgdXMgYW5kIHRocm93biBhd2F5LiBCaXRzIGFyZSAic2hpZnRlZCBpbiIKKwkgKiBieSByYWlzaW5nIHRoZSBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChzZXR0aW5nIHRoZSBNREMgYml0KSwKKwkgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgTURJTyBiaXQuCisJICovIAorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogQ2xlYXIgTURJT19ESVIgKFNXRFBJTzEpIHRvIGluZGljYXRlIHRoaXMgYml0IGlzIHRvIGJlIHVzZWQgYXMgaW5wdXQuICovCisJY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPX0RJUjsKKwljdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CisJCisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCisJLyogUmFpc2UgYW5kIExvd2VyIHRoZSBjbG9jayBiZWZvcmUgcmVhZGluZyBpbiB0aGUgZGF0YS4gVGhpcyBhY2NvdW50cyBmb3IKKwkgKiB0aGUgdHVybmFyb3VuZCBiaXRzLiBUaGUgZmlyc3QgY2xvY2sgb2NjdXJyZWQgd2hlbiB3ZSBjbG9ja2VkIG91dCB0aGUKKwkgKiBsYXN0IGJpdCBvZiB0aGUgUmVnaXN0ZXIgQWRkcmVzcy4KKwkgKi8KKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCQorCWZvcihkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNoaWZ0ZWQgaW4gYSAiMSIuICovCisJCWlmKGN0cmwgJiBFMTAwMF9DVFJMX01ESU8pIGRhdGEgfD0gMTsKKwkJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCX0KKwkKKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCQorCXJldHVybiBkYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmVhZHMgdGhlIHZhbHVlIGZyb20gYSBQSFkgcmVnaXN0ZXIsIGlmIHRoZSB2YWx1ZSBpcyBvbiBhIHNwZWNpZmljIG5vbiB6ZXJvCisqIHBhZ2UsIHNldHMgdGhlIHBhZ2UgZmlyc3QuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHJlYWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCByZXRfdmFsOworCisJREVCVUdGVU5DKCJlMTAwMF9yZWFkX3BoeV9yZWciKTsKKworCWlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmCisJICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClyZWdfYWRkcikpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgJiByZWdfYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcGh5X2RhdGEpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBtZGljID0gMDsKKwljb25zdCB1aW50MzJfdCBwaHlfYWRkciA9IDE7CisKKwlERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZ19leCIpOworCQorCWlmKHJlZ19hZGRyID4gTUFYX1BIWV9SRUdfQUREUkVTUykgeworCQlERUJVR09VVDEoIlBIWSBBZGRyZXNzICVkIGlzIG91dCBvZiByYW5nZVxuIiwgcmVnX2FkZHIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9QQVJBTTsKKwl9CisJCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogU2V0IHVwIE9wLWNvZGUsIFBoeSBBZGRyZXNzLCBhbmQgcmVnaXN0ZXIgYWRkcmVzcyBpbiB0aGUgTURJCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIuICBUaGUgTUFDIHdpbGwgdGFrZSBjYXJlIG9mIGludGVyZmFjaW5nIHdpdGggdGhlCisJCSAqIFBIWSB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKwkJCShwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfCAKKwkJCShFMTAwMF9NRElDX09QX1JFQUQpKTsKKwkJCisJCUUxMDAwX1dSSVRFX1JFRyhodywgTURJQywgbWRpYyk7CisKKwkJLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisJCWZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJCXVkZWxheSg1MCk7CisJCQltZGljID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1ESUMpOworCQkJaWYobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOworCQl9CisJCWlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisJCQlERUJVR09VVCgiTURJIFJlYWQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCX0KKwkJaWYobWRpYyAmIEUxMDAwX01ESUNfRVJST1IpIHsKKwkJCURFQlVHT1VUKCJNREkgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCQl9CisJCSpwaHlfZGF0YSA9ICh1aW50MTZfdCkgbWRpYzsKKwl9IGVsc2UgeworCQkvKiBXZSBtdXN0IGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0aHJvdWdoIHRoZSBNRElPIHBpbiB0byBzaWduYWwgdGhlCisJCSAqIGJlZ2lubmluZyBvZiBhbiBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMgorCQkgKiBjb25zZWN1dGl2ZSAiMSIgYml0cy4KKwkJICovCisJCWUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgUEhZX1BSRUFNQkxFLCBQSFlfUFJFQU1CTEVfU0laRSk7CisJCQorCQkvKiBOb3cgY29tYmluZSB0aGUgbmV4dCBmZXcgZmllbGRzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBhIHJlYWQKKwkJICogb3BlcmF0aW9uLiAgV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKKwkJICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZml2ZSBkaWZmZXJlbnQgdGltZXMuIFRoZSBmb3JtYXQgb2YKKwkJICogYSBNSUkgcmVhZCBpbnN0cnVjdGlvbiBjb25zaXN0cyBvZiBhIHNoaWZ0IG91dCBvZiAxNCBiaXRzIGFuZCBpcworCQkgKiBkZWZpbmVkIGFzIGZvbGxvd3M6CisJCSAqICAgIDxQcmVhbWJsZT48U09GPjxPcCBDb2RlPjxQaHkgQWRkcj48UmVnIEFkZHI+CisJCSAqIGZvbGxvd2VkIGJ5IGEgc2hpZnQgaW4gb2YgMTggYml0cy4gIFRoaXMgZmlyc3QgdHdvIGJpdHMgc2hpZnRlZCBpbgorCQkgKiBhcmUgVHVybkFyb3VuZCBiaXRzIHVzZWQgdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgTURJTyBwaW4gd2hlbiBhCisJCSAqIFJFQUQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4gIFRoZXNlIHR3byBiaXRzIGFyZSB0aHJvd24gYXdheQorCQkgKiBmb2xsb3dlZCBieSBhIHNoaWZ0IGluIG9mIDE2IGJpdHMgd2hpY2ggY29udGFpbnMgdGhlIGRlc2lyZWQgZGF0YS4KKwkJICovCisJCW1kaWMgPSAoKHJlZ19hZGRyKSB8IChwaHlfYWRkciA8PCA1KSB8IAorCQkJKFBIWV9PUF9SRUFEIDw8IDEwKSB8IChQSFlfU09GIDw8IDEyKSk7CisJCQorCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIG1kaWMsIDE0KTsKKwkJCisJCS8qIE5vdyB0aGF0IHdlJ3ZlIHNoaWZ0ZWQgb3V0IHRoZSByZWFkIGNvbW1hbmQgdG8gdGhlIE1JSSwgd2UgbmVlZCB0bworCQkgKiAic2hpZnQgaW4iIHRoZSAxNi1iaXQgdmFsdWUgKDE4IHRvdGFsIGJpdHMpIG9mIHRoZSByZXF1ZXN0ZWQgUEhZCisJCSAqIHJlZ2lzdGVyIGFkZHJlc3MuCisJCSAqLworCQkqcGh5X2RhdGEgPSBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhodyk7CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyaXRlcyBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCisqIGRhdGEgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgCitlMTAwMF93cml0ZV9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCByZXRfdmFsOworCisJREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnIik7CisKKwlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCAmJgorCSAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpKSkKKwkJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCAmIHJlZ19hZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF93cml0ZV9waHlfcmVnX2V4KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IG1kaWMgPSAwOworCWNvbnN0IHVpbnQzMl90IHBoeV9hZGRyID0gMTsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWdfZXgiKTsKKwkKKwlpZihyZWdfYWRkciA+IE1BWF9QSFlfUkVHX0FERFJFU1MpIHsKKwkJREVCVUdPVVQxKCJQSFkgQWRkcmVzcyAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIHJlZ19hZGRyKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07CisJfQorCQorCWlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisJCS8qIFNldCB1cCBPcC1jb2RlLCBQaHkgQWRkcmVzcywgcmVnaXN0ZXIgYWRkcmVzcywgYW5kIGRhdGEgaW50ZW5kZWQKKwkJICogZm9yIHRoZSBQSFkgcmVnaXN0ZXIgaW4gdGhlIE1ESSBDb250cm9sIHJlZ2lzdGVyLiAgVGhlIE1BQyB3aWxsIHRha2UKKwkJICogY2FyZSBvZiBpbnRlcmZhY2luZyB3aXRoIHRoZSBQSFkgdG8gc2VuZCB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgoKHVpbnQzMl90KSBwaHlfZGF0YSkgfAorCQkJKHJlZ19hZGRyIDw8IEUxMDAwX01ESUNfUkVHX1NISUZUKSB8CisJCQkocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwgCisJCQkoRTEwMDBfTURJQ19PUF9XUklURSkpOworCQkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBNRElDLCBtZGljKTsKKwkJCisJCS8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLworCQlmb3IoaSA9IDA7IGkgPCA2NDA7IGkrKykgeworCQkJdWRlbGF5KDUpOworCQkJbWRpYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNRElDKTsKKwkJCWlmKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKKwkJfQorCQlpZighKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgeworCQkJREVCVUdPVVQoIk1ESSBXcml0ZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlJ2xsIG5lZWQgdG8gdXNlIHRoZSBTVyBkZWZpbmVkIHBpbnMgdG8gc2hpZnQgdGhlIHdyaXRlIGNvbW1hbmQKKwkJICogb3V0IHRvIHRoZSBQSFkuIFdlIGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0byB0aGUgUEhZIHRvIHNpZ25hbCB0aGUKKwkJICogYmVnaW5uaW5nIG9mIHRoZSBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMiAKKwkJICogY29uc2VjdXRpdmUgIjEiIGJpdHMuCisJCSAqLworCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIFBIWV9QUkVBTUJMRSwgUEhZX1BSRUFNQkxFX1NJWkUpOworCQkKKwkJLyogTm93IGNvbWJpbmUgdGhlIHJlbWFpbmluZyByZXF1aXJlZCBmaWVsZHMgdGhhdCB3aWxsIGluZGljYXRlIGEgCisJCSAqIHdyaXRlIG9wZXJhdGlvbi4gV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKKwkJICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIGNvbW1hbmQuIFRoZQorCQkgKiBmb3JtYXQgb2YgYSBNSUkgd3JpdGUgaW5zdHJ1Y3Rpb24gaXMgYXMgZm9sbG93czoKKwkJICogPFByZWFtYmxlPjxTT0Y+PE9wIENvZGU+PFBoeSBBZGRyPjxSZWcgQWRkcj48VHVybmFyb3VuZD48RGF0YT4uCisJCSAqLworCQltZGljID0gKChQSFlfVFVSTkFST1VORCkgfCAocmVnX2FkZHIgPDwgMikgfCAocGh5X2FkZHIgPDwgNykgfAorCQkJKFBIWV9PUF9XUklURSA8PCAxMikgfCAoUEhZX1NPRiA8PCAxNCkpOworCQltZGljIDw8PSAxNjsKKwkJbWRpYyB8PSAodWludDMyX3QpIHBoeV9kYXRhOworCQkKKwkJZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBtZGljLCAzMik7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmV0dXJucyB0aGUgUEhZIHRvIHRoZSBwb3dlci1vbiByZXNldCBzdGF0ZQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwsIGN0cmxfZXh0OworCisJREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKKwkKKwlERUJVR09VVCgiUmVzZXR0aW5nIFBoeS4uLlxuIik7CisJCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogUmVhZCB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGFzc2VydCB0aGUgRTEwMDBfQ1RSTF9QSFlfUlNUCisJCSAqIGJpdC4gVGhlbiwgdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisJCSAqLworCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCW1kZWxheSgxMCk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciwgYXNzZXJ0IHRoZSBQSFlfUkVTRVRfRElSCisJCSAqIGJpdCB0byBwdXQgdGhlIFBIWSBpbnRvIHJlc2V0LiBUaGVuLCB0YWtlIGl0IG91dCBvZiByZXNldC4KKwkJICovCisJCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkxfRVhUKTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVI7CisJCWN0cmxfZXh0ICY9IH5FMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQltZGVsYXkoMTApOworCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCX0KKwl1ZGVsYXkoMTUwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZXNldHMgdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBTZXRzIGJpdCAxNSBvZiB0aGUgTUlJIENvbnRyb2wgcmVnaXNlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCAKK2UxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwaHlfZGF0YTsKKworCURFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0Iik7CisKKwlpZihody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDFfcmV2XzIpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJcGh5X2RhdGEgfD0gTUlJX0NSX1JFU0VUOworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCQorCQl1ZGVsYXkoMSk7CisJfSBlbHNlIGUxMDAwX3BoeV9od19yZXNldChodyk7CisKKwlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkKKwkJZTEwMDBfcGh5X2luaXRfc2NyaXB0KGh3KTsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFByb2JlcyB0aGUgZXhwZWN0ZWQgUEhZIGFkZHJlc3MgZm9yIGtub3duIFBIWSBJRHMKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2RldGVjdF9naWdfcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJaW50MzJfdCBwaHlfaW5pdF9zdGF0dXMsIHJldF92YWw7CisJdWludDE2X3QgcGh5X2lkX2hpZ2gsIHBoeV9pZF9sb3c7CisJYm9vbGVhbl90IG1hdGNoID0gRkFMU0U7CisKKwlERUJVR0ZVTkMoImUxMDAwX2RldGVjdF9naWdfcGh5Iik7CisJCisJLyogUmVhZCB0aGUgUEhZIElEIFJlZ2lzdGVycyB0byBpZGVudGlmeSB3aGljaCBQSFkgaXMgb25ib2FyZC4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMSwgJnBoeV9pZF9oaWdoKSkpCisJCXJldHVybiByZXRfdmFsOworCisJaHctPnBoeV9pZCA9ICh1aW50MzJfdCkgKHBoeV9pZF9oaWdoIDw8IDE2KTsKKwl1ZGVsYXkoMjApOworCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfSUQyLCAmcGh5X2lkX2xvdykpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwkKKwlody0+cGh5X2lkIHw9ICh1aW50MzJfdCkgKHBoeV9pZF9sb3cgJiBQSFlfUkVWSVNJT05fTUFTSyk7CisjaWZkZWYgTElOVVhfRFJJVkVSCisJaHctPnBoeV9yZXZpc2lvbiA9ICh1aW50MzJfdCkgcGh5X2lkX2xvdyAmIH5QSFlfUkVWSVNJT05fTUFTSzsKKyNlbmRpZgorCQorCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQzOgorCQlpZihody0+cGh5X2lkID09IE04OEUxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDQ6CisJCWlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0MDoKKwljYXNlIGUxMDAwXzgyNTQ1OgorCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJY2FzZSBlMTAwMF84MjU0NjoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlpZihody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCWlmKGh3LT5waHlfaWQgPT0gSUdQMDFFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVDEoIkludmFsaWQgTUFDIHR5cGUgJWRcbiIsIGh3LT5tYWNfdHlwZSk7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJcGh5X2luaXRfc3RhdHVzID0gZTEwMDBfc2V0X3BoeV90eXBlKGh3KTsKKworCWlmICgobWF0Y2gpICYmIChwaHlfaW5pdF9zdGF0dXMgPT0gRTEwMDBfU1VDQ0VTUykpIHsKKwkJREVCVUdPVVQxKCJQSFkgSUQgMHglWCBkZXRlY3RlZFxuIiwgaHctPnBoeV9pZCk7CisJCXJldHVybiBFMTAwMF9TVUNDRVNTOworCX0KKwlERUJVR09VVDEoIkludmFsaWQgUEhZIElEIDB4JVhcbiIsIGh3LT5waHlfaWQpOworCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0cyB1cCBlZXByb20gdmFyaWFibGVzIGluIHRoZSBodyBzdHJ1Y3QuICBNdXN0IGJlIGNhbGxlZCBhZnRlciBtYWNfdHlwZQorICogaXMgY29uZmlndXJlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwl1aW50MTZfdCBlZXByb21fc2l6ZTsKKworCURFQlVHRlVOQygiZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zIik7CisKKwlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCWNhc2UgZTEwMDBfODI1NDM6CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKwkJZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0NToKKwljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCWNhc2UgZTEwMDBfODI1NDY6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworCQlpZihlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7CisJCQllZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKKwkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJfSBlbHNlIHsKKwkJCWVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0MToKKwljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCWNhc2UgZTEwMDBfODI1NDc6CisJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwkJaWYgKGVlY2QgJiBFMTAwMF9FRUNEX1RZUEUpIHsKKwkJCWVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisJCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQkJZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKKwkJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworCQkJfSBlbHNlIHsKKwkJCQllZXByb20tPnBhZ2Vfc2l6ZSA9IDg7CisJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworCQkJfQorCQl9IGVsc2UgeworCQkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJCWVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworCQkJZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisJCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworCQkJfSBlbHNlIHsKKwkJCQllZXByb20tPndvcmRfc2l6ZSA9IDY0OworCQkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOworCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQllZXByb20tPnBhZ2Vfc2l6ZSA9IDMyOworCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKwkJfSBlbHNlIHsKKwkJCWVlcHJvbS0+cGFnZV9zaXplID0gODsKKwkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisJCWVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisJCWlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKSA9PSAwKSB7CisJCQllZXByb21fc2l6ZSAmPSBFRVBST01fU0laRV9NQVNLOworCisJCQlzd2l0Y2ggKGVlcHJvbV9zaXplKSB7CisJCQljYXNlIEVFUFJPTV9TSVpFXzE2S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA4MTkyOworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV84S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA0MDk2OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV80S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyMDQ4OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV8yS0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAxMDI0OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV8xS0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA1MTI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVFUFJPTV9TSVpFXzUxMkI6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisJCQkJYnJlYWs7CisJCQljYXNlIEVFUFJPTV9TSVpFXzEyOEI6CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIGUxMDAwX3Jlc2V0IC0gUmVzZXQgdGhlIGFkYXB0ZXIKKyAqLworCitzdGF0aWMgaW50CitlMTAwMF9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IHBiYTsKKwkvKiBSZXBhcnRpdGlvbiBQYmEgZm9yIGdyZWF0ZXIgdGhhbiA5ayBtdHUKKwkgKiBUbyB0YWtlIGVmZmVjdCBDVFJMLlJTVCBpcyByZXF1aXJlZC4KKwkgKi8KKworCWlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ3KSB7CisJCXBiYSA9IEUxMDAwX1BCQV80OEs7CisJfSBlbHNlIHsKKwkJcGJhID0gRTEwMDBfUEJBXzMwSzsKKwl9CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBQQkEsIHBiYSk7CisKKwkvKiBmbG93IGNvbnRyb2wgc2V0dGluZ3MgKi8KKyNpZiAwCisJaHctPmZjX2hpZ2hfd2F0ZXIgPSBGQ19ERUZBVUxUX0hJX1RIUkVTSDsKKwlody0+ZmNfbG93X3dhdGVyID0gRkNfREVGQVVMVF9MT19USFJFU0g7CisJaHctPmZjX3BhdXNlX3RpbWUgPSBGQ19ERUZBVUxUX1RYX1RJTUVSOworCWh3LT5mY19zZW5kX3hvbiA9IDE7CisJaHctPmZjID0gaHctPm9yaWdpbmFsX2ZjOworI2VuZGlmCisJCisJZTEwMDBfcmVzZXRfaHcoaHcpOworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBXVUMsIDApOworCXJldHVybiBlMTAwMF9pbml0X2h3KGh3KTsKK30KKworLyoqCisgKiBlMTAwMF9zd19pbml0IC0gSW5pdGlhbGl6ZSBnZW5lcmFsIHNvZnR3YXJlIHN0cnVjdHVyZXMgKHN0cnVjdCBlMTAwMF9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBlMTAwMF9zd19pbml0IGluaXRpYWxpemVzIHRoZSBBZGFwdGVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiBGaWVsZHMgYXJlIGluaXRpYWxpemVkIGJhc2VkIG9uIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYW5kCisgKiBPUyBuZXR3b3JrIGRldmljZSBzZXR0aW5ncyAoTVRVIHNpemUpLgorICoqLworCitzdGF0aWMgaW50IAorZTEwMDBfc3dfaW5pdChzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwgc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlpbnQgcmVzdWx0OworCisJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1ZFTkRPUl9JRCwgJmh3LT52ZW5kb3JfaWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZody0+ZGV2aWNlX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT04sICZody0+cmV2aXNpb25faWQpOworI2lmIDAKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3LT5zdWJzeXN0ZW1fdmVuZG9yX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmaHctPnN1YnN5c3RlbV9pZCk7CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmaHctPnBjaV9jbWRfd29yZCk7CisKKwkvKiBpZGVudGlmeSB0aGUgTUFDICovCisKKwlyZXN1bHQgPSBlMTAwMF9zZXRfbWFjX3R5cGUoaHcpOworCWlmIChyZXN1bHQpIHsKKwkJRTEwMDBfRVJSKCJVbmtub3duIE1BQyBUeXBlXG4iKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCisKKwllMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoaHcpOworCisjaWYgMAorCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8CisJICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgfHwKKwkgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yKSB8fAorCSAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpKQorCQlody0+cGh5X2luaXRfc2NyaXB0ID0gMTsKKyNlbmRpZgorCisJZTEwMDBfc2V0X21lZGlhX3R5cGUoaHcpOworCisjaWYgMAorCWlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQorCQlody0+cmVwb3J0X3R4X2Vhcmx5ID0gMDsKKwllbHNlCisJCWh3LT5yZXBvcnRfdHhfZWFybHkgPSAxOworCisJaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSA9IEZBTFNFOworI2VuZGlmCisJaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gVFJVRTsKKyNpZiAwCisJaHctPmFkYXB0aXZlX2lmcyA9IFRSVUU7CisKKwkvKiBDb3BwZXIgb3B0aW9ucyAqLworCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJaHctPm1kaXggPSBBVVRPX0FMTF9NT0RFUzsKKwkJaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOworCQlody0+bWFzdGVyX3NsYXZlID0gRTEwMDBfTUFTVEVSX1NMQVZFOworCX0KKyNlbmRpZgorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3J4ICh2b2lkKQoreworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyZDsKKwlyeF9sYXN0ID0gcnhfdGFpbDsKKwlyZCA9IHJ4X2Jhc2UgKyByeF90YWlsOworCXJ4X3RhaWwgPSAocnhfdGFpbCArIDEpICUgODsKKwltZW1zZXQgKHJkLCAwLCAxNik7CisJcmQtPmJ1ZmZlcl9hZGRyID0gdmlydF90b19idXMoJnBhY2tldCk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJEVCwgcnhfdGFpbCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZGVzY3JpcHRvciAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwl1bnNpZ25lZCBsb25nIHRjdGw7CisKKwlwdHIgPSB2aXJ0X3RvX3BoeXModHhfcG9vbCk7CisJaWYgKHB0ciAmIDB4ZikKKwkJcHRyID0gKHB0ciArIDB4MTApICYgKH4weGYpOworCisJdHhfYmFzZSA9IHBoeXNfdG9fdmlydChwdHIpOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREQkFMLCB2aXJ0X3RvX2J1cyh0eF9iYXNlKSk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREQkFILCAwKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERMRU4sIDEyOCk7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERILCAwKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERULCAwKTsKKwl0eF90YWlsID0gMDsKKworCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKworI2lmZGVmIExJTlVYX0RSSVZFUl9UQ1RMCisJdGN0bCA9IEUxMDAwX1JFQURfUkVHKCZodywgVENUTCk7CisKKwl0Y3RsICY9IH5FMTAwMF9UQ1RMX0NUOworCXRjdGwgfD0gRTEwMDBfVENUTF9FTiB8IEUxMDAwX1RDVExfUFNQIHwKKwkJKEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQpOworI2Vsc2UKKwl0Y3RsID0gRTEwMDBfVENUTF9QU1AgfCBFMTAwMF9UQ1RMX0VOIHwKKwkJKEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQpIHwgCisJCShFMTAwMF9IRFhfQ09MTElTSU9OX0RJU1RBTkNFIDw8IEUxMDAwX0NPTERfU0hJRlQpOworI2VuZGlmCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVENUTCwgdGN0bCk7CisKKwllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoJmh3KTsKKworCisJcnhfdGFpbCA9IDA7CisJLyogZGlzYWJsZSByZWNlaXZlICovCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJDVEwsIDApOworCXB0ciA9IHZpcnRfdG9fcGh5cyhyeF9wb29sKTsKKwlpZiAocHRyICYgMHhmKQorCQlwdHIgPSAocHRyICsgMHgxMCkgJiAofjB4Zik7CisJcnhfYmFzZSA9IHBoeXNfdG9fdmlydChwdHIpOworCisJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgUnggRGVzY3JpcHRvciBSaW5nICovCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkRCQUwsIHZpcnRfdG9fYnVzKHJ4X2Jhc2UpKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkRCQUgsIDApOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJETEVOLCAxMjgpOworCisJLyogU2V0dXAgdGhlIEhXIFJ4IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSRFQsIDApOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJDVEwsIAorCQlFMTAwMF9SQ1RMX0VOIHwgCisJCUUxMDAwX1JDVExfQkFNIHwgCisJCUUxMDAwX1JDVExfU1pfMjA0OCB8IAorCQlFMTAwMF9SQ1RMX01QRSk7CisJZmlsbF9yeCgpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfcG9sbCAoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcmQ7CisKKwlyZCA9IHJ4X2Jhc2UgKyByeF9sYXN0OworCWlmICghcmQtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX0REKQorCQlyZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJLy8gICAgICBwcmludGYoInJlY3Y6IHBhY2tldCAlISAtPiAlISBsZW49JWQgXG4iLCBwYWNrZXQrNiwgcGFja2V0LHJkLT5MZW5ndGgpOworCW1lbWNweSAobmljLT5wYWNrZXQsIHBhY2tldCwgcmQtPmxlbmd0aCk7CisJbmljLT5wYWNrZXRsZW4gPSByZC0+bGVuZ3RoOworCWZpbGxfcnggKCk7CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfdHJhbnNtaXQgKHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJICAgIHVuc2lnbmVkIGludCB0eXBlLAkvKiBUeXBlICovCisJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwJLyogc2l6ZSAqLworCQkgICAgY29uc3QgY2hhciAqcCkJLyogUGFja2V0ICovCit7CisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJc3RydWN0IGV0aF9oZHIgeworCQl1bnNpZ25lZCBjaGFyIGRzdF9hZGRyW0VUSF9BTEVOXTsKKwkJdW5zaWduZWQgY2hhciBzcmNfYWRkcltFVEhfQUxFTl07CisJCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJfSBoZHI7CisJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4aGQ7CS8qIGhlYWRlciAqLworCXN0cnVjdCBlMTAwMF90eF9kZXNjICp0eHA7CS8qIHBheWxvYWQgKi8KKwlERUJVR0ZVTkMoInNlbmQiKTsKKworCW1lbWNweSAoJmhkci5kc3RfYWRkciwgZCwgRVRIX0FMRU4pOworCW1lbWNweSAoJmhkci5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKworCWhkci50eXBlID0gaHRvbnMgKHR5cGUpOworCXR4aGQgPSB0eF9iYXNlICsgdHhfdGFpbDsKKwl0eF90YWlsID0gKHR4X3RhaWwgKyAxKSAlIDg7CisJdHhwID0gdHhfYmFzZSArIHR4X3RhaWw7CisJdHhfdGFpbCA9ICh0eF90YWlsICsgMSkgJSA4OworCisJdHhoZC0+YnVmZmVyX2FkZHIgPSB2aXJ0X3RvX2J1cyAoJmhkcik7CisJdHhoZC0+bG93ZXIuZGF0YSA9IHNpemVvZiAoaGRyKTsKKwl0eGhkLT51cHBlci5kYXRhID0gMDsKKworCXR4cC0+YnVmZmVyX2FkZHIgPSB2aXJ0X3RvX2J1cyhwKTsKKwl0eHAtPmxvd2VyLmRhdGEgPSBFMTAwMF9UWERfQ01EX1JQUyB8IEUxMDAwX1RYRF9DTURfRU9QIHwgRTEwMDBfVFhEX0NNRF9JRkNTIHwgc2l6ZTsKKwl0eHAtPnVwcGVyLmRhdGEgPSAwOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREVCwgdHhfdGFpbCk7CisJd2hpbGUgKCEodHhwLT51cHBlci5kYXRhICYgRTEwMDBfVFhEX1NUQVRfREQpKSB7CisJCXVkZWxheSgxMCk7CS8qIGdpdmUgdGhlIG5pYyBhIGNoYW5jZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgKi8KKwkJcG9sbF9pbnRlcnJ1cHRpb25zKCk7CisJfQorCURFQlVHRlVOQygic2VuZCBlbmQiKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGUxMDAwX2Rpc2FibGUgKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwkvKiBDbGVhciB0aGUgdHJhbnNtaXQgcmluZyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBUREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBURFQsIDApOworCisJLyogQ2xlYXIgdGhlIHJlY2VpdmUgcmluZyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSRFQsIDApOworCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIENUUkwsIEUxMDAwX0NUUkxfUlNUKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBldGhlcm5ldCBpbnRlcmZhY2UgKi8KKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkNUTCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFRDVEwsIDApOworCW1kZWxheSAoMTApOworCisJLyogVW5tYXAgbXkgd2luZG93IHRvIHRoZSBkZXZpY2UgKi8KKwlpb3VubWFwKGh3Lmh3X2FkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZTEwMDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKyNkZWZpbmUgSU9SRVNPVVJDRV9JTwkweDAwMDAwMTAwICAgICAvKiBSZXNvdXJjZSB0eXBlICovCisjZGVmaW5lIEJBUl8wCQkwCisjZGVmaW5lIEJBUl8xCQkxCisjZGVmaW5lIEJBUl81CQk1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCitZb3Ugc2hvdWxkIG9taXQgdGhlIGxhc3QgYXJndW1lbnQgc3RydWN0IHBjaV9kZXZpY2UgKiBmb3IgYSBub24tUENJIE5JQworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBlMTAwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19sZW47CisJaW50IHJldF92YWwsIGk7CisKKwlpZiAocCA9PSAwKQorCQlyZXR1cm4gMDsKKwkvKiBJbml0aWFsaXplIGh3IHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKwltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKwlody5wZGV2ID0gcDsKKworI2lmIDEKKwkvKiBBcmUgdGhlc2UgdmFyaWFibGVzIG5lZWRlZD8gKi8KKwlody5mYyAgICAgICAgICAgICAgICAgICAgPSBlMTAwMF9mY19ub25lOworI2lmIDAKKwlody5vcmlnaW5hbF9mYyAgICAgICAgICAgPSBlMTAwMF9mY19ub25lOworI2VuZGlmCisJaHcuYXV0b25lZ19mYWlsZWQgICAgICAgID0gMDsKKyNpZiAwCisJaHcuZ2V0X2xpbmtfc3RhdHVzICAgICAgID0gVFJVRTsKKyNlbmRpZgorI2VuZGlmCisKKwltbWlvX3N0YXJ0ID0gcGNpX2Jhcl9zdGFydChwLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCW1taW9fbGVuICAgPSBwY2lfYmFyX3NpemUocCwgIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJaHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCisJZm9yKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CisJCWlmKHBjaV9iYXJfc2l6ZShwLCBpKSA9PSAwKQorCQkJY29udGludWU7ICAgICAgICAgICAgICAgIAorCQlpZihwY2lfZmluZF9jYXBhYmlsaXR5KHAsIGkpICYgSU9SRVNPVVJDRV9JTykgeworCQkJaHcuaW9fYmFzZSA9IHBjaV9iYXJfc3RhcnQocCwgaSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKwl9CisKKwlhZGp1c3RfcGNpX2RldmljZShwKTsKKworCW5pYy0+aW9hZGRyICAgPSBwLT5pb2FkZHIgJiB+MzsKKwluaWMtPmlycW5vICAgID0gMDsKKworCS8qIEZyb20gTWF0dCBIb3J0bWFuIDxtYmhvcnRtYW5AYWNwdGhpbmNsaWVudC5jb20+ICovCisJLyogTUFDIGFuZCBQaHkgc2V0dGluZ3MgKi8KKworCS8qIHNldHVwIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCWlmIChlMTAwMF9zd19pbml0KHAsICZodykgPCAwKSB7CisJCWlvdW5tYXAoaHcuaHdfYWRkcik7CisJCXJldHVybiAwOworCX0KKworCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KKworCWlmIChlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oJmh3KSA8IDApIHsKKwkJcHJpbnRmICgiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOworCQlpb3VubWFwKGh3Lmh3X2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjb3B5IHRoZSBNQUMgYWRkcmVzcyBvdXQgb2YgdGhlIEVFUFJPTSAqLworCisJZTEwMDBfcmVhZF9tYWNfYWRkcigmaHcpOworCW1lbWNweSAobmljLT5ub2RlX2FkZHIsIGh3Lm1hY19hZGRyLCBFVEhfQUxFTik7CisJCisJcHJpbnRmKCJFdGhlcm5ldCBhZGRyOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOworCisJLyogcmVzZXQgdGhlIGhhcmR3YXJlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLworCisJcmV0X3ZhbCA9IGUxMDAwX3Jlc2V0KCZodyk7CisJaWYgKHJldF92YWwgPCAwKSB7CisJCWlmICgocmV0X3ZhbCA9PSAtRTEwMDBfRVJSX05PTElOSykgfHwKKwkJCShyZXRfdmFsID09IC1FMTAwMF9FUlJfVElNRU9VVCkpIHsKKwkJCUUxMDAwX0VSUigiVmFsaWQgTGluayBub3QgZGV0ZWN0ZWRcbiIpOworCQl9IGVsc2UgeworCQkJRTEwMDBfRVJSKCJIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOworCQl9CisJCWlvdW5tYXAoaHcuaHdfYWRkcik7CisJCXJldHVybiAwOworCX0KKwlpbml0X2Rlc2NyaXB0b3IoKTsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCWRldi0+ZGlzYWJsZSAgPSBlMTAwMF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBlMTAwMF9wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBlMTAwMF90cmFuc21pdDsKKwluaWMtPmlycSAgICAgID0gZTEwMDBfaXJxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIGUxMDAwX25pY3NbXSA9IHsKK1BDSV9ST00oMHg4MDg2LCAweDEwMDAsICJlMTAwMC04MjU0MiIsICAgICAgICAgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMDEsICJlMTAwMC04MjU0M2djLWZpYmVyIiwgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDNHQyBGaWJlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwNCwgImUxMDAwLTgyNTQzZ2MtY29wcGVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0M0dDIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwOCwgImUxMDAwLTgyNTQ0ZWktY29wcGVyIiwgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NEVJIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwOSwgImUxMDAwLTgyNTQ0ZWktZmliZXIiLCAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NEVJIEZpYmVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBDLCAiZTEwMDAtODI1NDRnYy1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ0R0MgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBELCAiZTEwMDAtODI1NDRnYy1sb20iLCAgICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ0R0MgTE9NIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBFLCAiZTEwMDAtODI1NDBlbSIsICAgICAJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MEVNIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBGLCAiZTEwMDAtODI1NDVlbS1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1RU0gQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDEwLCAiZTEwMDAtODI1NDZlYi1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ2RUIgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDExLCAiZTEwMDAtODI1NDVlbS1maWJlciIsICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1RU0gRmliZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTIsICJlMTAwMC04MjU0NmViLWZpYmVyIiwgCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZFQiBDb3BwZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTMsICJlMTAwMC04MjU0MWVpIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MUVJIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDE1LCAiZTEwMDAtODI1NDBlbS1sb20iLCAgCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDBFTSBMT00iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTYsICJlMTAwMC04MjU0MGVwLWxvbSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDBFUCBMT00iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTcsICJlMTAwMC04MjU0MGVwIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MEVQIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDE4LCAiZTEwMDAtODI1NDFlcCIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDFFUCIpLAorUENJX1JPTSgweDgwODYsIDB4MTAxOSwgImUxMDAwLTgyNTQ3ZWkiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ3RUkiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMWQsICJlMTAwMC04MjU0NmViLXF1YWQtY29wcGVyIiwgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZFQiBRdWFkIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAxZSwgImUxMDAwLTgyNTQwZXAtbHAiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQwRVAgTFAiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMjYsICJlMTAwMC04MjU0NWdtLWNvcHBlciIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDVHTSBDb3BwZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMjcsICJlMTAwMC04MjU0NWdtLWZpYmVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NUdNIEZpYmVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDI4LCAiZTEwMDAtODI1NDVnbS1zZXJkZXMiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1R00gU0VSREVTIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDc1LCAiZTEwMDAtODI1NDdnaSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDdHSSIpLAorUENJX1JPTSgweDgwODYsIDB4MTA3NiwgImUxMDAwLTgyNTQxZ2kiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQxR0kiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNzcsICJlMTAwMC04MjU0MWdpLW1vYmlsZSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDFHSSBNb2JpbGUiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNzgsICJlMTAwMC04MjU0MWVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MUVSIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDc5LCAiZTEwMDAtODI1NDZnYi1jb3BwZXIiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ2R0IgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDdhLCAiZTEwMDAtODI1NDZnYi1maWJlciIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZHQiBGaWJlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTA3YiwgImUxMDAwLTgyNTQ2Z2Itc2VyZGVzIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NkdCIFNFUkRFUyIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgZTEwMDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIkUxMDAwIiwKKwkucHJvYmUgICAgPSBlMTAwMF9wcm9iZSwKKwkuaWRzICAgICAgPSBlMTAwMF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihlMTAwMF9uaWNzKS9zaXplb2YoZTEwMDBfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CkluZGV4OiBiL25ldGJvb3QvZTEwMDBfaHcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9lMTAwMF9ody5oCkBAIC0wLDAgKzEsMjA1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDAzIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGUxMDAwX2h3LmgKKyAqIFN0cnVjdHVyZXMsIGVudW1zLCBhbmQgbWFjcm9zIGZvciB0aGUgTUFDCisgKi8KKworI2lmbmRlZiBfRTEwMDBfSFdfSF8KKyNkZWZpbmUgX0UxMDAwX0hXX0hfCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKi8KK3N0cnVjdCBlMTAwMF9odzsKK3N0cnVjdCBlMTAwMF9od19zdGF0czsKKworLyogRW51bWVyYXRlZCB0eXBlcyBzcGVjaWZpYyB0byB0aGUgZTEwMDAgaGFyZHdhcmUgKi8KKy8qIE1lZGlhIEFjY2VzcyBDb250cm9sZXJzICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3VuZGVmaW5lZCA9IDAsCisgICAgZTEwMDBfODI1NDJfcmV2Ml8wLAorICAgIGUxMDAwXzgyNTQyX3JldjJfMSwKKyAgICBlMTAwMF84MjU0MywKKyAgICBlMTAwMF84MjU0NCwKKyAgICBlMTAwMF84MjU0MCwKKyAgICBlMTAwMF84MjU0NSwKKyAgICBlMTAwMF84MjU0NV9yZXZfMywKKyAgICBlMTAwMF84MjU0NiwKKyAgICBlMTAwMF84MjU0Nl9yZXZfMywKKyAgICBlMTAwMF84MjU0MSwKKyAgICBlMTAwMF84MjU0MV9yZXZfMiwKKyAgICBlMTAwMF84MjU0NywKKyAgICBlMTAwMF84MjU0N19yZXZfMiwKKyAgICBlMTAwMF9udW1fbWFjcworfSBlMTAwMF9tYWNfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9lZXByb21fdW5pbml0aWFsaXplZCA9IDAsCisgICAgZTEwMDBfZWVwcm9tX3NwaSwKKyAgICBlMTAwMF9lZXByb21fbWljcm93aXJlLAorICAgIGUxMDAwX251bV9lZXByb21fdHlwZXMKK30gZTEwMDBfZWVwcm9tX3R5cGU7CisKKy8qIE1lZGlhIFR5cGVzICovCit0eXBlZGVmIGVudW0geworCWUxMDAwX21lZGlhX3R5cGVfY29wcGVyID0gMCwKKwllMTAwMF9tZWRpYV90eXBlX2ZpYmVyID0gMSwKKwllMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcyA9IDIsCisJZTEwMDBfbnVtX21lZGlhX3R5cGVzCit9IGUxMDAwX21lZGlhX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfMTBfaGFsZiA9IDAsCisgICAgZTEwMDBfMTBfZnVsbCA9IDEsCisgICAgZTEwMDBfMTAwX2hhbGYgPSAyLAorICAgIGUxMDAwXzEwMF9mdWxsID0gMworfSBlMTAwMF9zcGVlZF9kdXBsZXhfdHlwZTsKKworLyogRmxvdyBDb250cm9sIFNldHRpbmdzICovCit0eXBlZGVmIGVudW0geworCWUxMDAwX2ZjX25vbmUgPSAwLAorCWUxMDAwX2ZjX3J4X3BhdXNlID0gMSwKKwllMTAwMF9mY190eF9wYXVzZSA9IDIsCisJZTEwMDBfZmNfZnVsbCA9IDMsCisJZTEwMDBfZmNfZGVmYXVsdCA9IDB4RkYKK30gZTEwMDBfZmNfdHlwZTsKKworLyogUENJIGJ1cyB0eXBlcyAqLwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9idXNfdHlwZV91bmtub3duID0gMCwKKwllMTAwMF9idXNfdHlwZV9wY2ksCisJZTEwMDBfYnVzX3R5cGVfcGNpeCwKKwllMTAwMF9idXNfdHlwZV9yZXNlcnZlZAorfSBlMTAwMF9idXNfdHlwZTsKKworLyogUENJIGJ1cyBzcGVlZHMgKi8KK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfYnVzX3NwZWVkX3Vua25vd24gPSAwLAorCWUxMDAwX2J1c19zcGVlZF8zMywKKwllMTAwMF9idXNfc3BlZWRfNjYsCisJZTEwMDBfYnVzX3NwZWVkXzEwMCwKKwllMTAwMF9idXNfc3BlZWRfMTIwLAorCWUxMDAwX2J1c19zcGVlZF8xMzMsCisJZTEwMDBfYnVzX3NwZWVkX3Jlc2VydmVkCit9IGUxMDAwX2J1c19zcGVlZDsKKworLyogUENJIGJ1cyB3aWR0aHMgKi8KK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfYnVzX3dpZHRoX3Vua25vd24gPSAwLAorCWUxMDAwX2J1c193aWR0aF8zMiwKKwllMTAwMF9idXNfd2lkdGhfNjQsCisJZTEwMDBfYnVzX3dpZHRoX3Jlc2VydmVkCit9IGUxMDAwX2J1c193aWR0aDsKKworLyogUEhZIHN0YXR1cyBpbmZvIHN0cnVjdHVyZSBhbmQgc3VwcG9ydGluZyBlbnVtcyAqLwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9jYWJsZV9sZW5ndGhfNTAgPSAwLAorCWUxMDAwX2NhYmxlX2xlbmd0aF81MF84MCwKKwllMTAwMF9jYWJsZV9sZW5ndGhfODBfMTEwLAorCWUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwLAorCWUxMDAwX2NhYmxlX2xlbmd0aF8xNDAsCisJZTEwMDBfY2FibGVfbGVuZ3RoX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfY2FibGVfbGVuZ3RoOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTAgID0gMTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8yMCAgPSAyMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzMwICA9IDMwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNDAgID0gNDAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCAgPSA1MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzYwICA9IDYwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNzAgID0gNzAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MCAgPSA4MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzkwICA9IDkwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTAwID0gMTAwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTEwID0gMTEwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTIwID0gMTIwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTMwID0gMTMwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwID0gMTQwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTUwID0gMTUwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTYwID0gMTYwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTcwID0gMTcwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTgwID0gMTgwCit9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGg7CisKK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsID0gMCwKKwllMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV9sb3dlciwKKwllMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlOworCit0eXBlZGVmIGVudW0geworCWUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWwgPSAwLAorCWUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCwKKwllMTAwMF9yZXZfcG9sYXJpdHlfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9yZXZfcG9sYXJpdHk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZG93bnNoaWZ0X25vcm1hbCA9IDAsCisgICAgZTEwMDBfZG93bnNoaWZ0X2FjdGl2YXRlZCwKKyAgICBlMTAwMF9kb3duc2hpZnRfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9kb3duc2hpZnQ7CisKK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZCA9IDAsCisJZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQsCisJZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbDsKKwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9hdXRvX3hfbW9kZV9tYW51YWxfbWRpID0gMCwKKwllMTAwMF9hdXRvX3hfbW9kZV9tYW51YWxfbWRpeCwKKwllMTAwMF9hdXRvX3hfbW9kZV9hdXRvMSwKKwllMTAwMF9hdXRvX3hfbW9kZV9hdXRvMiwKKwllMTAwMF9hdXRvX3hfbW9kZV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2F1dG9feF9tb2RlOworCit0eXBlZGVmIGVudW0geworCWUxMDAwXzEwMDB0X3J4X3N0YXR1c19ub3Rfb2sgPSAwLAorCWUxMDAwXzEwMDB0X3J4X3N0YXR1c19vaywKKwllMTAwMF8xMDAwdF9yeF9zdGF0dXNfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF8xMDAwdF9yeF9zdGF0dXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfcGh5X204OCA9IDAsCisgICAgZTEwMDBfcGh5X2lncCwKKyAgICBlMTAwMF9waHlfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9waHlfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9tc19od19kZWZhdWx0ID0gMCwKKyAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIsCisgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUsCisgICAgZTEwMDBfbXNfYXV0bworfSBlMTAwMF9tc190eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZCA9IDAsCisgICAgZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUsCisgICAgZTEwMDBfZmZlX2NvbmZpZ19ibG9ja2VkCit9IGUxMDAwX2ZmZV9jb25maWc7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZHNwX2NvbmZpZ19kaXNhYmxlZCA9IDAsCisgICAgZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkLAorICAgIGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkLAorICAgIGUxMDAwX2RzcF9jb25maWdfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9kc3BfY29uZmlnOworCitzdHJ1Y3QgZTEwMDBfcGh5X2luZm8geworCWUxMDAwX2NhYmxlX2xlbmd0aCBjYWJsZV9sZW5ndGg7CisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGUgZXh0ZW5kZWRfMTBidF9kaXN0YW5jZTsKKwllMTAwMF9yZXZfcG9sYXJpdHkgY2FibGVfcG9sYXJpdHk7CisJZTEwMDBfZG93bnNoaWZ0IGRvd25zaGlmdDsKKwllMTAwMF9wb2xhcml0eV9yZXZlcnNhbCBwb2xhcml0eV9jb3JyZWN0aW9uOworCWUxMDAwX2F1dG9feF9tb2RlIG1kaXhfbW9kZTsKKwllMTAwMF8xMDAwdF9yeF9zdGF0dXMgbG9jYWxfcng7CisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzIHJlbW90ZV9yeDsKK307CisKK3N0cnVjdCBlMTAwMF9waHlfc3RhdHMgeworCXVpbnQzMl90IGlkbGVfZXJyb3JzOworCXVpbnQzMl90IHJlY2VpdmVfZXJyb3JzOworfTsKKworc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvIHsKKyAgICBlMTAwMF9lZXByb21fdHlwZSB0eXBlOworICAgIHVpbnQxNl90IHdvcmRfc2l6ZTsKKyAgICB1aW50MTZfdCBvcGNvZGVfYml0czsKKyAgICB1aW50MTZfdCBhZGRyZXNzX2JpdHM7CisgICAgdWludDE2X3QgZGVsYXlfdXNlYzsKKyAgICB1aW50MTZfdCBwYWdlX3NpemU7Cit9OworCisKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRTEwMDBfU1VDQ0VTUyAgICAgIDAKKyNkZWZpbmUgRTEwMDBfRVJSX0VFUFJPTSAgIDEKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWSAgICAgIDIKKyNkZWZpbmUgRTEwMDBfRVJSX0NPTkZJRyAgIDMKKyNkZWZpbmUgRTEwMDBfRVJSX1BBUkFNICAgIDQKKyNkZWZpbmUgRTEwMDBfRVJSX01BQ19UWVBFIDUKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWV9UWVBFIDYKKyNkZWZpbmUgRTEwMDBfRVJSX05PTElOSyAgIDcKKyNkZWZpbmUgRTEwMDBfRVJSX1RJTUVPVVQgIDgKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFR19JTyhhLCByZWcpIFwKKwllMTAwMF9yZWFkX3JlZ19pbygoYSksIEUxMDAwXyMjcmVnKQorI2RlZmluZSBFMTAwMF9XUklURV9SRUdfSU8oYSwgcmVnLCB2YWwpIFwKKwllMTAwMF93cml0ZV9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZywgdmFsKQorCisvKiBQQ0kgRGV2aWNlIElEcyAqLworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDIgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVIgICAgICAgMHgxMDAxCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUiAgICAgIDB4MTAwNAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRFSV9DT1BQRVIgICAgICAweDEwMDgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVIgICAgICAgMHgxMDA5CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEdDX0NPUFBFUiAgICAgIDB4MTAwQworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRHQ19MT00gICAgICAgICAweDEwMEQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRU0gICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVNX0xPTSAgICAgICAgIDB4MTAxNQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MT00gICAgICAgICAweDEwMTYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRVAgICAgICAgICAgICAgMHgxMDE3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVQX0xQICAgICAgICAgIDB4MTAxRQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVFTV9DT1BQRVIgICAgICAweDEwMEYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVIgICAgICAgMHgxMDExCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUdNX0NPUFBFUiAgICAgIDB4MTAyNgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVHTV9GSUJFUiAgICAgICAweDEwMjcKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTICAgICAgMHgxMDI4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkVCX0NPUFBFUiAgICAgIDB4MTAxMAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUiAgICAgICAweDEwMTIKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIgMHgxMDFECisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUVJICAgICAgICAgICAgIDB4MTAxMworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFSV9NT0JJTEUgICAgICAweDEwMTgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxRVIgICAgICAgICAgICAgMHgxMDc4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0dJICAgICAgICAgICAgIDB4MTA3NQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFHSSAgICAgICAgICAgICAweDEwNzYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxR0lfTU9CSUxFICAgICAgMHgxMDc3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX0NPUFBFUiAgICAgIDB4MTA3OQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUiAgICAgICAweDEwN0EKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTICAgICAgMHgxMDdCCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0VJICAgICAgICAgICAgIDB4MTAxOQorCisjZGVmaW5lIE5PREVfQUREUkVTU19TSVpFIDYKKyNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTIDYKKworLyogTUFDIGRlY29kZSBzaXplIGlzIDEyOEsgLSBUaGlzIGlzIHRoZSBzaXplIG9mIEJBUjAgKi8KKyNkZWZpbmUgTUFDX0RFQ09ERV9TSVpFICgxMjggKiAxMDI0KQorCisjZGVmaW5lIEUxMDAwXzgyNTQyXzJfMF9SRVZfSUQgMgorI2RlZmluZSBFMTAwMF84MjU0Ml8yXzFfUkVWX0lEIDMKKworI2RlZmluZSBTUEVFRF8xMCAgICAxMAorI2RlZmluZSBTUEVFRF8xMDAgICAxMDAKKyNkZWZpbmUgU1BFRURfMTAwMCAgMTAwMAorI2RlZmluZSBIQUxGX0RVUExFWCAxCisjZGVmaW5lIEZVTExfRFVQTEVYIDIKKworLyogVGhlIHNpemVzIChpbiBieXRlcykgb2YgYSBldGhlcm5ldCBwYWNrZXQgKi8KKyNkZWZpbmUgRU5FVF9IRUFERVJfU0laRSAgICAgICAgICAgICAxNAorI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgIDE1MTggLyogV2l0aCBGQ1MgKi8KKyNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFICA2NCAgIC8qIFdpdGggRkNTICovCisjZGVmaW5lIEVUSEVSTkVUX0ZDU19TSVpFICAgICAgICAgICAgNAorI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX1BBQ0tFVF9TSVpFIFwKKyAgICAoTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFIC0gRVRIRVJORVRfRkNTX1NJWkUpCisjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUgXAorICAgIChNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgLSBFVEhFUk5FVF9GQ1NfU0laRSkKKyNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgICBFVEhFUk5FVF9GQ1NfU0laRQorI2RlZmluZSBNQVhfSlVNQk9fRlJBTUVfU0laRSAgICAgICAgIDB4M0YwMAorCisKKy8qIDgwMi4xcSBWTEFOIFBhY2tldCBTaXplcyAqLworI2RlZmluZSBWTEFOX1RBR19TSVpFICAgICAgICAgICAgICAgICAgICAgNCAgICAgLyogODAyLjNhYyB0YWcgKG5vdCBETUFlZCkgKi8KKworLyogRXRoZXJ0eXBlIGZpZWxkIHZhbHVlcyAqLworI2RlZmluZSBFVEhFUk5FVF9JRUVFX1ZMQU5fVFlQRSAweDgxMDAgIC8qIDgwMi4zYWMgcGFja2V0ICovCisjZGVmaW5lIEVUSEVSTkVUX0lQX1RZUEUgICAgICAgIDB4MDgwMCAgLyogSVAgcGFja2V0cyAqLworI2RlZmluZSBFVEhFUk5FVF9BUlBfVFlQRSAgICAgICAweDA4MDYgIC8qIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQVJQKSAqLworCisvKiBQYWNrZXQgSGVhZGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfVENQICAgIDYKKyNkZWZpbmUgSVBfUFJPVE9DT0xfVURQICAgIDB4MTEKKworLyogVGhpcyBkZWZpbmVzIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBpbiB0aGUgSW50ZXJydXB0IE1hc2sKKyAqIFNldC9SZWFkIFJlZ2lzdGVyLiAgRWFjaCBiaXQgaXMgZG9jdW1lbnRlZCBiZWxvdzoKKyAqICAgbyBSWERNVDAgPSBSZWNlaXZlIERlc2NyaXB0b3IgTWluaW11bSBUaHJlc2hvbGQgaGl0IChyaW5nIDApCisgKiAgIG8gUlhTRVEgID0gUmVjZWl2ZSBTZXF1ZW5jZSBFcnJvciAKKyAqLworI2RlZmluZSBQT0xMX0lNU19FTkFCTEVfTUFTSyAoIFwKKyAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgICAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRKQorCisvKiBUaGlzIGRlZmluZXMgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSBJbnRlcnJ1cHQgTWFzaworICogU2V0L1JlYWQgUmVnaXN0ZXIuICBFYWNoIGJpdCBpcyBkb2N1bWVudGVkIGJlbG93OgorICogICBvIFJYVDAgICA9IFJlY2VpdmVyIFRpbWVyIEludGVycnVwdCAocmluZyAwKQorICogICBvIFRYRFcgICA9IFRyYW5zbWl0IERlc2NyaXB0b3IgV3JpdHRlbiBCYWNrCisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IKKyAqICAgbyBMU0MgICAgPSBMaW5rIFN0YXR1cyBDaGFuZ2UKKyAqLworI2RlZmluZSBJTVNfRU5BQkxFX01BU0sgKCBcCisgICAgRTEwMDBfSU1TX1JYVDAgICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfVFhEVyAgIHwgICAgXAorICAgIEUxMDAwX0lNU19SWERNVDAgfCAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfTFNDKQorCisvKiBOdW1iZXIgb2YgaGlnaC9sb3cgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIFJBUi4gVGhlIFJBUiAoUmVjZWl2ZSBBZGRyZXNzCisgKiBSZWdpc3RlcnMpIGhvbGRzIHRoZSBkaXJlY3RlZCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcyB0aGF0IHdlIG1vbml0b3IuIFdlCisgKiByZXNlcnZlIG9uZSBvZiB0aGVzZSBzcG90cyBmb3Igb3VyIGRpcmVjdGVkIGFkZHJlc3MsIGFsbG93aW5nIHVzIHJvb20gZm9yCisgKiBFMTAwMF9SQVJfRU5UUklFUyAtIDEgbXVsdGljYXN0IGFkZHJlc3Nlcy4gCisgKi8KKyNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVMgMTUKKworI2RlZmluZSBNSU5fTlVNQkVSX09GX0RFU0NSSVBUT1JTIDgKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9ERVNDUklQVE9SUyAweEZGRjgKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfcnhfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7IC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgICAgIC8qIExlbmd0aCBvZiBkYXRhIERNQWVkIGludG8gZGF0YSBidWZmZXIgKi8KKyAgICB1aW50MTZfdCBjc3VtOyAgICAgICAvKiBQYWNrZXQgY2hlY2tzdW0gKi8KKyAgICB1aW50OF90IHN0YXR1czsgICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworICAgIHVpbnQ4X3QgZXJyb3JzOyAgICAgIC8qIERlc2NyaXB0b3IgRXJyb3JzICovCisgICAgdWludDE2X3Qgc3BlY2lhbDsKK307CisKKy8qIFJlY2VpdmUgRGVjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9FT1AgICAgICAweDAyICAgIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVhTTSAgICAgMHgwNCAgICAvKiBJZ25vcmUgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVlAgICAgICAgMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1RDUENTICAgIDB4MjAgICAgLyogVENQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JUENTICAgICAweDQwICAgIC8qIElQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9QSUYgICAgICAweDgwICAgIC8qIHBhc3NlZCBpbi1leGFjdCBmaWx0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DRSAgICAgICAgMHgwMSAgICAvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRSAgICAgICAgMHgwMiAgICAvKiBTeW1ib2wgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRVEgICAgICAgMHgwNCAgICAvKiBTZXF1ZW5jZSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0NYRSAgICAgICAweDEwICAgIC8qIENhcnJpZXIgRXh0ZW5zaW9uIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfVENQRSAgICAgIDB4MjAgICAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0lQRSAgICAgICAweDQwICAgIC8qIElQIENoZWNrc3VtIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfUlhFICAgICAgIDB4ODAgICAgLyogUnggRGF0YSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSyAweDBGRkYgIC8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9NQVNLICAweEUwMDAgIC8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgYml0cyAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9TSElGVCAweDAwMEQgIC8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgb2YgMTYgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19DRklfTUFTSyAgMHgxMDAwICAvKiBDRkkgaXMgYml0IDEyICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX1NISUZUIDB4MDAwQyAgLyogQ0ZJIGlzIGJpdCAxMiAqLworCisvKiBtYXNrIHRvIGRldGVybWluZSBpZiBwYWNrZXRzIHNob3VsZCBiZSBkcm9wcGVkIGR1ZSB0byBmcmFtZSBlcnJvcnMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKKyAgICBFMTAwMF9SWERfRVJSX0NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFUSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX0NYRSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1JYRSkKKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX3R4X2Rlc2MgeworICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOyAgICAgICAvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgZGF0YSBidWZmZXIgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDhfdCBjc287ICAgICAgICAvKiBDaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY21kOyAgICAgICAgLyogRGVzY3JpcHRvciBjb250cm9sICovCisgICAgICAgIH0gZmxhZ3M7CisgICAgfSBsb3dlcjsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IGNzczsgICAgICAgIC8qIENoZWNrc3VtIHN0YXJ0ICovCisgICAgICAgICAgICB1aW50MTZfdCBzcGVjaWFsOworICAgICAgICB9IGZpZWxkczsKKyAgICB9IHVwcGVyOworfTsKKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfRCAgICAgMHgwMDEwMDAwMCAvKiBEYXRhIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfQyAgICAgMHgwMDAwMDAwMCAvKiBDb250ZXh0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX0lYU00gMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX1RYU00gMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0VPUCAgICAweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JRkNTICAgMHgwMjAwMDAwMCAvKiBJbnNlcnQgRkNTIChFdGhlcm5ldCBDUkMpICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSUMgICAgIDB4MDQwMDAwMDAgLyogSW5zZXJ0IENoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfUlMgICAgIDB4MDgwMDAwMDAgLyogUmVwb3J0IFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1JQUyAgICAweDEwMDAwMDAwIC8qIFJlcG9ydCBQYWNrZXQgU2VudCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0RFWFQgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1ZMRSAgICAweDQwMDAwMDAwIC8qIEFkZCBWTEFOIHRhZyAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lERSAgICAweDgwMDAwMDAwIC8qIEVuYWJsZSBUaWR2IHJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0REICAgIDB4MDAwMDAwMDEgLyogRGVzY3JpcHRvciBEb25lICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0VDICAgIDB4MDAwMDAwMDIgLyogRXhjZXNzIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfTEMgICAgMHgwMDAwMDAwNCAvKiBMYXRlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfVFUgICAgMHgwMDAwMDAwOCAvKiBUcmFuc21pdCB1bmRlcnJ1biAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1RDUCAgICAweDAxMDAwMDAwIC8qIFRDUCBwYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JUCAgICAgMHgwMjAwMDAwMCAvKiBJUCBwYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9UU0UgICAgMHgwNDAwMDAwMCAvKiBUQ1AgU2VnIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9UQyAgICAweDAwMDAwMDA0IC8qIFR4IFVuZGVycnVuICovCisKKy8qIE9mZmxvYWQgQ29udGV4dCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGlwX2NvbmZpZzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaXBjc3M7ICAgICAgLyogSVAgY2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBjc287ICAgICAgLyogSVAgY2hlY2tzdW0gb2Zmc2V0ICovCisgICAgICAgICAgICB1aW50MTZfdCBpcGNzZTsgICAgIC8qIElQIGNoZWNrc3VtIGVuZCAqLworICAgICAgICB9IGlwX2ZpZWxkczsKKyAgICB9IGxvd2VyX3NldHVwOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgdGNwX2NvbmZpZzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdHVjc3M7ICAgICAgLyogVENQIGNoZWNrc3VtIHN0YXJ0ICovCisgICAgICAgICAgICB1aW50OF90IHR1Y3NvOyAgICAgIC8qIFRDUCBjaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHR1Y3NlOyAgICAgLyogVENQIGNoZWNrc3VtIGVuZCAqLworICAgICAgICB9IHRjcF9maWVsZHM7CisgICAgfSB1cHBlcl9zZXR1cDsKKyAgICB1aW50MzJfdCBjbWRfYW5kX2xlbmd0aDsgICAgLyogKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IGhkcl9sZW47ICAgIC8qIEhlYWRlciBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1zczsgICAgICAgLyogTWF4aW11bSBzZWdtZW50IHNpemUgKi8KKyAgICAgICAgfSBmaWVsZHM7CisgICAgfSB0Y3Bfc2VnX3NldHVwOworfTsKKworLyogT2ZmbG9hZCBkYXRhIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9kYXRhX2Rlc2MgeworICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOyAgICAgICAvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDhfdCB0eXBfbGVuX2V4dDsgICAgICAgIC8qICovCisgICAgICAgICAgICB1aW50OF90IGNtZDsgICAgICAgIC8qICovCisgICAgICAgIH0gZmxhZ3M7CisgICAgfSBsb3dlcjsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IHBvcHRzOyAgICAgIC8qIFBhY2tldCBPcHRpb25zICovCisgICAgICAgICAgICB1aW50MTZfdCBzcGVjaWFsOyAgIC8qICovCisgICAgICAgIH0gZmllbGRzOworICAgIH0gdXBwZXI7Cit9OworCisvKiBGaWx0ZXJzICovCisjZGVmaW5lIEUxMDAwX05VTV9VTklDQVNUICAgICAgICAgIDE2ICAgLyogVW5pY2FzdCBmaWx0ZXIgZW50cmllcyAqLworI2RlZmluZSBFMTAwMF9NQ19UQkxfU0laRSAgICAgICAgICAxMjggIC8qIE11bHRpY2FzdCBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkUgMTI4ICAvKiBWTEFOIEZpbHRlciBUYWJsZSAoNDA5NiBiaXRzKSAqLworCisKKy8qIFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciAqLworc3RydWN0IGUxMDAwX3JhciB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbG93OyAgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBsb3cgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBoaWdoOyAgICAgLyogcmVjZWl2ZSBhZGRyZXNzIGhpZ2ggKi8KK307CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBNdWx0aWNhc3QgVGFibGUgQXJyYXkgKE1UQSkuICovCisjZGVmaW5lIEUxMDAwX05VTV9NVEFfUkVHSVNURVJTIDEyOAorCisvKiBJUHY0IEFkZHJlc3MgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9pcHY0X2F0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpcHY0X2FkZHI7ICAgICAgICAvKiBJUCBBZGRyZXNzIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZvdXIgd2FrZXVwIElQIGFkZHJlc3NlcyBhcmUgc3VwcG9ydGVkICovCisjZGVmaW5lIEUxMDAwX1dBS0VVUF9JUF9BRERSRVNTX0NPVU5UX01BWCA0CisjZGVmaW5lIEUxMDAwX0lQNEFUX1NJWkUgICAgICAgICAgICAgICAgICBFMTAwMF9XQUtFVVBfSVBfQUREUkVTU19DT1VOVF9NQVgKKyNkZWZpbmUgRTEwMDBfSVA2QVRfU0laRSAgICAgICAgICAgICAgICAgIDEKKworLyogSVB2NiBBZGRyZXNzIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfaXB2Nl9hdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDhfdCBpcHY2X2FkZHJbMTZdOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2ZmbHRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IGxlbmd0aDsgICAvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZtdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFzazsgICAgIC8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2ZmdnRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IHZhbHVlOyAgICAvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRm91ciBGbGV4aWJsZSBGaWx0ZXJzIGFyZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWCA0CisKKy8qIEVhY2ggRmxleGlibGUgRmlsdGVyIGlzIGF0IG1vc3QgMTI4ICgweDgwKSBieXRlcyBpbiBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfRkxFWElCTEVfRklMVEVSX1NJWkVfTUFYICAxMjgKKworI2RlZmluZSBFMTAwMF9GRkxUX1NJWkUgRTEwMDBfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWAorI2RlZmluZSBFMTAwMF9GRk1UX1NJWkUgRTEwMDBfRkxFWElCTEVfRklMVEVSX1NJWkVfTUFYCisjZGVmaW5lIEUxMDAwX0ZGVlRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVgKKworLyogUmVnaXN0ZXIgU2V0LiAoODI1NDMsIDgyNTQ0KQorICoKKyAqIFJlZ2lzdGVycyBhcmUgZGVmaW5lZCB0byBiZSAzMiBiaXRzIGFuZCAgc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIDMyIGJpdCB2YWx1ZXMuCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIHBoeXNpY2FsbHkgbG9jYXRlZCBvbiB0aGUgTklDLCBidXQgYXJlIG1hcHBlZCBpbnRvIHRoZSAKKyAqIGhvc3QgbWVtb3J5IGFkZHJlc3Mgc3BhY2UuCisgKgorICogUlcgLSByZWdpc3RlciBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZQorICogUk8gLSByZWdpc3RlciBpcyByZWFkIG9ubHkKKyAqIFdPIC0gcmVnaXN0ZXIgaXMgd3JpdGUgb25seQorICogUi9jbHIgLSByZWdpc3RlciBpcyByZWFkIG9ubHkgYW5kIGlzIGNsZWFyZWQgd2hlbiByZWFkCisgKiBBIC0gcmVnaXN0ZXIgYXJyYXkKKyAqLworI2RlZmluZSBFMTAwMF9DVFJMICAgICAweDAwMDAwICAvKiBEZXZpY2UgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRFVQIDB4MDAwMDQgIC8qIERldmljZSBDb250cm9sIER1cGxpY2F0ZSAoU2hhZG93KSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1NUQVRVUyAgIDB4MDAwMDggIC8qIERldmljZSBTdGF0dXMgLSBSTyAqLworI2RlZmluZSBFMTAwMF9FRUNEICAgICAweDAwMDEwICAvKiBFRVBST00vRmxhc2ggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0VFUkQgICAgIDB4MDAwMTQgIC8qIEVFUFJPTSBSZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFQgMHgwMDAxOCAgLyogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GTEEgICAgICAweDAwMDFDICAvKiBGbGFzaCBBY2Nlc3MgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NRElDICAgICAweDAwMDIwICAvKiBNREkgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDQUwgICAgIDB4MDAwMjggIC8qIEZsb3cgQ29udHJvbCBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDQUggICAgIDB4MDAwMkMgIC8qIEZsb3cgQ29udHJvbCBBZGRyZXNzIEhpZ2ggLVJXICovCisjZGVmaW5lIEUxMDAwX0ZDVCAgICAgIDB4MDAwMzAgIC8qIEZsb3cgQ29udHJvbCBUeXBlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVkVUICAgICAgMHgwMDAzOCAgLyogVkxBTiBFdGhlciBUeXBlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSUNSICAgICAgMHgwMDBDMCAgLyogSW50ZXJydXB0IENhdXNlIFJlYWQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9JVFIgICAgICAweDAwMEM0ICAvKiBJbnRlcnJ1cHQgVGhyb3R0bGluZyBSYXRlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSUNTICAgICAgMHgwMDBDOCAgLyogSW50ZXJydXB0IENhdXNlIFNldCAtIFdPICovCisjZGVmaW5lIEUxMDAwX0lNUyAgICAgIDB4MDAwRDAgIC8qIEludGVycnVwdCBNYXNrIFNldCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lNQyAgICAgIDB4MDAwRDggIC8qIEludGVycnVwdCBNYXNrIENsZWFyIC0gV08gKi8KKyNkZWZpbmUgRTEwMDBfUkNUTCAgICAgMHgwMDEwMCAgLyogUlggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDVFRWICAgIDB4MDAxNzAgIC8qIEZsb3cgQ29udHJvbCBUcmFuc21pdCBUaW1lciBWYWx1ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYQ1cgICAgIDB4MDAxNzggIC8qIFRYIENvbmZpZ3VyYXRpb24gV29yZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JYQ1cgICAgIDB4MDAxODAgIC8qIFJYIENvbmZpZ3VyYXRpb24gV29yZCAtIFJPICovCisjZGVmaW5lIEUxMDAwX1RDVEwgICAgIDB4MDA0MDAgIC8qIFRYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9USVBHICAgICAweDAwNDEwICAvKiBUWCBJbnRlci1wYWNrZXQgZ2FwIC1SVyAqLworI2RlZmluZSBFMTAwMF9UQlQgICAgICAweDAwNDQ4ICAvKiBUWCBCdXJzdCBUaW1lciAtIFJXICovCisjZGVmaW5lIEUxMDAwX0FJVCAgICAgIDB4MDA0NTggIC8qIEFkYXB0aXZlIEludGVyZnJhbWUgU3BhY2luZyBUaHJvdHRsZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0xFRENUTCAgIDB4MDBFMDAgIC8qIExFRCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUEJBICAgICAgMHgwMTAwMCAgLyogUGFja2V0IEJ1ZmZlciBBbGxvY2F0aW9uIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEwgICAgMHgwMjE2MCAgLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIICAgIDB4MDIxNjggIC8qIEZsb3cgQ29udHJvbCBSZWNlaXZlIFRocmVzaG9sZCBIaWdoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUwgICAgMHgwMjgwMCAgLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUggICAgMHgwMjgwNCAgLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JETEVOICAgIDB4MDI4MDggIC8qIFJYIERlc2NyaXB0b3IgTGVuZ3RoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRIICAgICAgMHgwMjgxMCAgLyogUlggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRUICAgICAgMHgwMjgxOCAgLyogUlggRGVzY3JpcHRvciBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRUUiAgICAgMHgwMjgyMCAgLyogUlggRGVsYXkgVGltZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SWERDVEwgICAweDAyODI4ICAvKiBSWCBEZXNjcmlwdG9yIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SQURWICAgICAweDAyODJDICAvKiBSWCBJbnRlcnJ1cHQgQWJzb2x1dGUgRGVsYXkgVGltZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SU1JQRCAgICAweDAyQzAwICAvKiBSWCBTbWFsbCBQYWNrZXQgRGV0ZWN0IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhETUFDICAgMHgwMzAwMCAgLyogVFggRE1BIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZIICAgICAweDAzNDEwICAvKiBUWCBEYXRhIEZJRk8gSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERlQgICAgIDB4MDM0MTggIC8qIFRYIERhdGEgRklGTyBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGSFMgICAgMHgwMzQyMCAgLyogVFggRGF0YSBGSUZPIEhlYWQgU2F2ZWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZUUyAgICAweDAzNDI4ICAvKiBUWCBEYXRhIEZJRk8gVGFpbCBTYXZlZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERlBDICAgIDB4MDM0MzAgIC8qIFRYIERhdGEgRklGTyBQYWNrZXQgQ291bnQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREJBTCAgICAweDAzODAwICAvKiBUWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREJBSCAgICAweDAzODA0ICAvKiBUWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERMRU4gICAgMHgwMzgwOCAgLyogVFggRGVzY3JpcHRvciBMZW5ndGggLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREggICAgICAweDAzODEwICAvKiBUWCBEZXNjcmlwdG9yIEhlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9URFQgICAgICAweDAzODE4ICAvKiBUWCBEZXNjcmlwb3RyIFRhaWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9USURWICAgICAweDAzODIwICAvKiBUWCBJbnRlcnJ1cHQgRGVsYXkgVmFsdWUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWERDVEwgICAweDAzODI4ICAvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UQURWICAgICAweDAzODJDICAvKiBUWCBJbnRlcnJ1cHQgQWJzb2x1dGUgRGVsYXkgVmFsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFNQTVQgICAgMHgwMzgzMCAgLyogVENQIFNlZ21lbnRhdGlvbiBQQUQgJiBNaW4gVGhyZXNob2xkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1JDRVJSUyAgMHgwNDAwMCAgLyogQ1JDIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQUxHTkVSUkMgMHgwNDAwNCAgLyogQWxpZ25tZW50IEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU1lNRVJSUyAgMHgwNDAwOCAgLyogU3ltYm9sIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUlhFUlJDICAgMHgwNDAwQyAgLyogUmVjZWl2ZSBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QQyAgICAgIDB4MDQwMTAgIC8qIE1pc3NlZCBQYWNrZXQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9TQ0MgICAgICAweDA0MDE0ICAvKiBTaW5nbGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfRUNPTCAgICAgMHgwNDAxOCAgLyogRXhjZXNzaXZlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01DQyAgICAgIDB4MDQwMUMgIC8qIE11bHRpcGxlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0xBVEVDT0wgIDB4MDQwMjAgIC8qIExhdGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQ09MQyAgICAgMHgwNDAyOCAgLyogQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfREMgICAgICAgMHgwNDAzMCAgLyogRGVmZXIgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UTkNSUyAgICAweDA0MDM0ICAvKiBUWC1ObyBDUlMgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9TRUMgICAgICAweDA0MDM4ICAvKiBTZXF1ZW5jZSBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0NFWFRFUlIgIDB4MDQwM0MgIC8qIENhcnJpZXIgRXh0ZW5zaW9uIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkxFQyAgICAgMHgwNDA0MCAgLyogUmVjZWl2ZSBMZW5ndGggRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9YT05SWEMgICAweDA0MDQ4ICAvKiBYT04gUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9YT05UWEMgICAweDA0MDRDICAvKiBYT04gVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9YT0ZGUlhDICAweDA0MDUwICAvKiBYT0ZGIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlRYQyAgMHgwNDA1NCAgLyogWE9GRiBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0ZDUlVDICAgIDB4MDQwNTggIC8qIEZsb3cgQ29udHJvbCBSWCBVbnN1cHBvcnRlZCBDb3VudC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDNjQgICAgMHgwNDA1QyAgLyogUGFja2V0cyBSWCAoNjQgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTI3ICAgMHgwNDA2MCAgLyogUGFja2V0cyBSWCAoNjUtMTI3IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzI1NSAgIDB4MDQwNjQgIC8qIFBhY2tldHMgUlggKDEyOC0yNTUgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDNTExICAgMHgwNDA2OCAgLyogUGFja2V0cyBSWCAoMjU1LTUxMSBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMxMDIzICAweDA0MDZDICAvKiBQYWNrZXRzIFJYICg1MTItMTAyMyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMxNTIyICAweDA0MDcwICAvKiBQYWNrZXRzIFJYICgxMDI0LTE1MjIgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR1BSQyAgICAgMHgwNDA3NCAgLyogR29vZCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQlBSQyAgICAgMHgwNDA3OCAgLyogQnJvYWRjYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NUFJDICAgICAweDA0MDdDICAvKiBNdWx0aWNhc3QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dQVEMgICAgIDB4MDQwODAgIC8qIEdvb2QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dPUkNMICAgIDB4MDQwODggIC8qIEdvb2QgT2N0ZXRzIFJYIENvdW50IExvdyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dPUkNIICAgIDB4MDQwOEMgIC8qIEdvb2QgT2N0ZXRzIFJYIENvdW50IEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1RDTCAgICAweDA0MDkwICAvKiBHb29kIE9jdGV0cyBUWCBDb3VudCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1RDSCAgICAweDA0MDk0ICAvKiBHb29kIE9jdGV0cyBUWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUk5CQyAgICAgMHgwNDBBMCAgLyogUlggTm8gQnVmZmVycyBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JVQyAgICAgIDB4MDQwQTQgIC8qIFJYIFVuZGVyc2l6ZSBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JGQyAgICAgIDB4MDQwQTggIC8qIFJYIEZyYWdtZW50IENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUk9DICAgICAgMHgwNDBBQyAgLyogUlggT3ZlcnNpemUgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SSkMgICAgICAweDA0MEIwICAvKiBSWCBKYWJiZXIgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQUkMgICAweDA0MEI0ICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQREMgICAweDA0MEI4ICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgRHJvcHBlZCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01HVFBUQyAgIDB4MDQwQkMgIC8qIE1hbmFnZW1lbnQgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPUkwgICAgIDB4MDQwQzAgIC8qIFRvdGFsIE9jdGV0cyBSWCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1JIICAgICAweDA0MEM0ICAvKiBUb3RhbCBPY3RldHMgUlggSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPVEwgICAgIDB4MDQwQzggIC8qIFRvdGFsIE9jdGV0cyBUWCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RIICAgICAweDA0MENDICAvKiBUb3RhbCBPY3RldHMgVFggSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RQUiAgICAgIDB4MDQwRDAgIC8qIFRvdGFsIFBhY2tldHMgUlggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UUFQgICAgICAweDA0MEQ0ICAvKiBUb3RhbCBQYWNrZXRzIFRYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDNjQgICAgMHgwNDBEOCAgLyogUGFja2V0cyBUWCAoNjQgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTI3ICAgMHgwNDBEQyAgLyogUGFja2V0cyBUWCAoNjUtMTI3IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzI1NSAgIDB4MDQwRTAgIC8qIFBhY2tldHMgVFggKDEyOC0yNTUgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDNTExICAgMHgwNDBFNCAgLyogUGFja2V0cyBUWCAoMjU2LTUxMSBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMxMDIzICAweDA0MEU4ICAvKiBQYWNrZXRzIFRYICg1MTItMTAyMyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMxNTIyICAweDA0MEVDICAvKiBQYWNrZXRzIFRYICgxMDI0LTE1MjIgQnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBUQyAgICAgMHgwNDBGMCAgLyogTXVsdGljYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9CUFRDICAgICAweDA0MEY0ICAvKiBCcm9hZGNhc3QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RTQ1RDICAgIDB4MDQwRjggIC8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RTQ1RGQyAgIDB4MDQwRkMgIC8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUWCBGYWlsIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNICAgMHgwNTAwMCAgLyogUlggQ2hlY2tzdW0gQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX01UQSAgICAgIDB4MDUyMDAgIC8qIE11bHRpY2FzdCBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1JBICAgICAgIDB4MDU0MDAgIC8qIFJlY2VpdmUgQWRkcmVzcyAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1ZGVEEgICAgIDB4MDU2MDAgIC8qIFZMQU4gRmlsdGVyIFRhYmxlIEFycmF5IC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfV1VDICAgICAgMHgwNTgwMCAgLyogV2FrZXVwIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9XVUZDICAgICAweDA1ODA4ICAvKiBXYWtldXAgRmlsdGVyIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9XVVMgICAgICAweDA1ODEwICAvKiBXYWtldXAgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQyAgICAgMHgwNTgyMCAgLyogTWFuYWdlbWVudCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSVBBViAgICAgMHgwNTgzOCAgLyogSVAgQWRkcmVzcyBWYWxpZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lQNEFUICAgIDB4MDU4NDAgIC8qIElQdjQgQWRkcmVzcyBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX0lQNkFUICAgIDB4MDU4ODAgIC8qIElQdjYgQWRkcmVzcyBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVUEwgICAgIDB4MDU5MDAgIC8qIFdha2V1cCBQYWNrZXQgTGVuZ3RoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VQTSAgICAgMHgwNUEwMCAgLyogV2FrZXVwIFBhY2tldCBNZW1vcnkgLSBSTyBBICovCisjZGVmaW5lIEUxMDAwX0ZGTFQgICAgIDB4MDVGMDAgIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9GRk1UICAgICAweDA5MDAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX0ZGVlQgICAgIDB4MDk4MDAgIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSAtIFJXIEFycmF5ICovCisKKy8qIFJlZ2lzdGVyIFNldCAoODI1NDIpCisgKgorICogU29tZSBvZiB0aGUgODI1NDIgcmVnaXN0ZXJzIGFyZSBsb2NhdGVkIGF0IGRpZmZlcmVudCBvZmZzZXRzIHRoYW4gdGhleSBhcmUKKyAqIGluIG1vcmUgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgODI1NHguIERlc3BpdGUgdGhlIGRpZmZlcmVuY2UgaW4gbG9jYXRpb24sCisgKiB0aGUgcmVnaXN0ZXJzIGZ1bmN0aW9uIGluIHRoZSBzYW1lIG1hbm5lci4KKyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9DVFJMICAgICBFMTAwMF9DVFJMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NUUkxfRFVQIEUxMDAwX0NUUkxfRFVQCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NUQVRVUyAgIEUxMDAwX1NUQVRVUworI2RlZmluZSBFMTAwMF84MjU0Ml9FRUNEICAgICBFMTAwMF9FRUNECisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFUkQgICAgIEUxMDAwX0VFUkQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1RSTF9FWFQgRTEwMDBfQ1RSTF9FWFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkxBICAgICAgRTEwMDBfRkxBCisjZGVmaW5lIEUxMDAwXzgyNTQyX01ESUMgICAgIEUxMDAwX01ESUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNBTCAgICAgRTEwMDBfRkNBTAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ0FIICAgICBFMTAwMF9GQ0FICisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDVCAgICAgIEUxMDAwX0ZDVAorI2RlZmluZSBFMTAwMF84MjU0Ml9WRVQgICAgICBFMTAwMF9WRVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkEgICAgICAgMHgwMDA0MAorI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1IgICAgICBFMTAwMF9JQ1IKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVRSICAgICAgRTEwMDBfSVRSCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUyAgICAgIEUxMDAwX0lDUworI2RlZmluZSBFMTAwMF84MjU0Ml9JTVMgICAgICBFMTAwMF9JTVMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSU1DICAgICAgRTEwMDBfSU1DCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JDVEwgICAgIEUxMDAwX1JDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRUUiAgICAgMHgwMDEwOAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBTCAgICAweDAwMTEwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFIICAgIDB4MDAxMTQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRMRU4gICAgMHgwMDExOAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREggICAgICAweDAwMTIwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVCAgICAgIDB4MDAxMjgKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNSVEggICAgMHgwMDE2MAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1JUTCAgICAweDAwMTY4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDVFRWICAgIEUxMDAwX0ZDVFRWCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RYQ1cgICAgIEUxMDAwX1RYQ1cKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhDVyAgICAgRTEwMDBfUlhDVworI2RlZmluZSBFMTAwMF84MjU0Ml9NVEEgICAgICAweDAwMjAwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RDVEwgICAgIEUxMDAwX1RDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVElQRyAgICAgRTEwMDBfVElQRworI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBTCAgICAweDAwNDIwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REQkFIICAgIDB4MDA0MjQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERMRU4gICAgMHgwMDQyOAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREggICAgICAweDAwNDMwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REVCAgICAgIDB4MDA0MzgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVElEViAgICAgMHgwMDQ0MAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQlQgICAgICBFMTAwMF9UQlQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQUlUICAgICAgRTEwMDBfQUlUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1ZGVEEgICAgIDB4MDA2MDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfTEVEQ1RMICAgRTEwMDBfTEVEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BCQSAgICAgIEUxMDAwX1BCQQorI2RlZmluZSBFMTAwMF84MjU0Ml9SWERDVEwgICBFMTAwMF9SWERDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkFEViAgICAgRTEwMDBfUkFEVgorI2RlZmluZSBFMTAwMF84MjU0Ml9SU1JQRCAgICBFMTAwMF9SU1JQRAorI2RlZmluZSBFMTAwMF84MjU0Ml9UWERNQUMgICBFMTAwMF9UWERNQUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGSFMgICAgRTEwMDBfVERGSFMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGVFMgICAgRTEwMDBfVERGVFMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGUEMgICAgRTEwMDBfVERGUEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhEQ1RMICAgRTEwMDBfVFhEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBRFYgICAgIEUxMDAwX1RBRFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFNQTVQgICAgRTEwMDBfVFNQTVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1JDRVJSUyAgRTEwMDBfQ1JDRVJSUworI2RlZmluZSBFMTAwMF84MjU0Ml9BTEdORVJSQyBFMTAwMF9BTEdORVJSQworI2RlZmluZSBFMTAwMF84MjU0Ml9TWU1FUlJTICBFMTAwMF9TWU1FUlJTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYRVJSQyAgIEUxMDAwX1JYRVJSQworI2RlZmluZSBFMTAwMF84MjU0Ml9NUEMgICAgICBFMTAwMF9NUEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU0NDICAgICAgRTEwMDBfU0NDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VDT0wgICAgIEUxMDAwX0VDT0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUNDICAgICAgRTEwMDBfTUNDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0xBVEVDT0wgIEUxMDAwX0xBVEVDT0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ09MQyAgICAgRTEwMDBfQ09MQworI2RlZmluZSBFMTAwMF84MjU0Ml9EQyAgICAgICBFMTAwMF9EQworI2RlZmluZSBFMTAwMF84MjU0Ml9UTkNSUyAgICBFMTAwMF9UTkNSUworI2RlZmluZSBFMTAwMF84MjU0Ml9TRUMgICAgICBFMTAwMF9TRUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ0VYVEVSUiAgRTEwMDBfQ0VYVEVSUgorI2RlZmluZSBFMTAwMF84MjU0Ml9STEVDICAgICBFMTAwMF9STEVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPTlJYQyAgIEUxMDAwX1hPTlJYQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT05UWEMgICBFMTAwMF9YT05UWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9GRlJYQyAgRTEwMDBfWE9GRlJYQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT0ZGVFhDICBFMTAwMF9YT0ZGVFhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDUlVDICAgIEUxMDAwX0ZDUlVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzY0ICAgIEUxMDAwX1BSQzY0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzEyNyAgIEUxMDAwX1BSQzEyNworI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMyNTUgICBFMTAwMF9QUkMyNTUKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDNTExICAgRTEwMDBfUFJDNTExCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzEwMjMgIEUxMDAwX1BSQzEwMjMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMTUyMiAgRTEwMDBfUFJDMTUyMgorI2RlZmluZSBFMTAwMF84MjU0Ml9HUFJDICAgICBFMTAwMF9HUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0JQUkMgICAgIEUxMDAwX0JQUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBSQyAgICAgRTEwMDBfTVBSQworI2RlZmluZSBFMTAwMF84MjU0Ml9HUFRDICAgICBFMTAwMF9HUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPUkNMICAgIEUxMDAwX0dPUkNMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPUkNIICAgIEUxMDAwX0dPUkNICisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPVENMICAgIEUxMDAwX0dPVENMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPVENIICAgIEUxMDAwX0dPVENICisjZGVmaW5lIEUxMDAwXzgyNTQyX1JOQkMgICAgIEUxMDAwX1JOQkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlVDICAgICAgRTEwMDBfUlVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JGQyAgICAgIEUxMDAwX1JGQworI2RlZmluZSBFMTAwMF84MjU0Ml9ST0MgICAgICBFMTAwMF9ST0MKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkpDICAgICAgRTEwMDBfUkpDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01HVFBSQyAgIEUxMDAwX01HVFBSQworI2RlZmluZSBFMTAwMF84MjU0Ml9NR1RQREMgICBFMTAwMF9NR1RQREMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUdUUFRDICAgRTEwMDBfTUdUUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPUkwgICAgIEUxMDAwX1RPUkwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9SSCAgICAgRTEwMDBfVE9SSAorI2RlZmluZSBFMTAwMF84MjU0Ml9UT1RMICAgICBFMTAwMF9UT1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPVEggICAgIEUxMDAwX1RPVEgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFBSICAgICAgRTEwMDBfVFBSCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RQVCAgICAgIEUxMDAwX1RQVAorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEM2NCAgICBFMTAwMF9QVEM2NAorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxMjcgICBFMTAwMF9QVEMxMjcKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMjU1ICAgRTEwMDBfUFRDMjU1CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzUxMSAgIEUxMDAwX1BUQzUxMQorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxMDIzICBFMTAwMF9QVEMxMDIzCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzE1MjIgIEUxMDAwX1BUQzE1MjIKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBUQyAgICAgRTEwMDBfTVBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9CUFRDICAgICBFMTAwMF9CUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTQ1RDICAgIEUxMDAwX1RTQ1RDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTQ1RGQyAgIEUxMDAwX1RTQ1RGQworI2RlZmluZSBFMTAwMF84MjU0Ml9SWENTVU0gICBFMTAwMF9SWENTVU0KKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VDICAgICAgRTEwMDBfV1VDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVRkMgICAgIEUxMDAwX1dVRkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VTICAgICAgRTEwMDBfV1VTCisjZGVmaW5lIEUxMDAwXzgyNTQyX01BTkMgICAgIEUxMDAwX01BTkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVBBViAgICAgRTEwMDBfSVBBVgorI2RlZmluZSBFMTAwMF84MjU0Ml9JUDRBVCAgICBFMTAwMF9JUDRBVAorI2RlZmluZSBFMTAwMF84MjU0Ml9JUDZBVCAgICBFMTAwMF9JUDZBVAorI2RlZmluZSBFMTAwMF84MjU0Ml9XVVBMICAgICBFMTAwMF9XVVBMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVUE0gICAgIEUxMDAwX1dVUE0KKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZMVCAgICAgRTEwMDBfRkZMVAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREZIICAgICAweDA4MDEwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlQgICAgIDB4MDgwMTgKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZNVCAgICAgRTEwMDBfRkZNVAorI2RlZmluZSBFMTAwMF84MjU0Ml9GRlZUICAgICBFMTAwMF9GRlZUCisKKy8qIFN0YXRpc3RpY3MgY291bnRlcnMgY29sbGVjdGVkIGJ5IHRoZSBNQUMgKi8KK3N0cnVjdCBlMTAwMF9od19zdGF0cyB7CisgICAgdWludDY0X3QgY3JjZXJyczsKKyAgICB1aW50NjRfdCBhbGduZXJyYzsKKyAgICB1aW50NjRfdCBzeW1lcnJzOworICAgIHVpbnQ2NF90IHJ4ZXJyYzsKKyAgICB1aW50NjRfdCBtcGM7CisgICAgdWludDY0X3Qgc2NjOworICAgIHVpbnQ2NF90IGVjb2w7CisgICAgdWludDY0X3QgbWNjOworICAgIHVpbnQ2NF90IGxhdGVjb2w7CisgICAgdWludDY0X3QgY29sYzsKKyAgICB1aW50NjRfdCBkYzsKKyAgICB1aW50NjRfdCB0bmNyczsKKyAgICB1aW50NjRfdCBzZWM7CisgICAgdWludDY0X3QgY2V4dGVycjsKKyAgICB1aW50NjRfdCBybGVjOworICAgIHVpbnQ2NF90IHhvbnJ4YzsKKyAgICB1aW50NjRfdCB4b250eGM7CisgICAgdWludDY0X3QgeG9mZnJ4YzsKKyAgICB1aW50NjRfdCB4b2ZmdHhjOworICAgIHVpbnQ2NF90IGZjcnVjOworICAgIHVpbnQ2NF90IHByYzY0OworICAgIHVpbnQ2NF90IHByYzEyNzsKKyAgICB1aW50NjRfdCBwcmMyNTU7CisgICAgdWludDY0X3QgcHJjNTExOworICAgIHVpbnQ2NF90IHByYzEwMjM7CisgICAgdWludDY0X3QgcHJjMTUyMjsKKyAgICB1aW50NjRfdCBncHJjOworICAgIHVpbnQ2NF90IGJwcmM7CisgICAgdWludDY0X3QgbXByYzsKKyAgICB1aW50NjRfdCBncHRjOworICAgIHVpbnQ2NF90IGdvcmNsOworICAgIHVpbnQ2NF90IGdvcmNoOworICAgIHVpbnQ2NF90IGdvdGNsOworICAgIHVpbnQ2NF90IGdvdGNoOworICAgIHVpbnQ2NF90IHJuYmM7CisgICAgdWludDY0X3QgcnVjOworICAgIHVpbnQ2NF90IHJmYzsKKyAgICB1aW50NjRfdCByb2M7CisgICAgdWludDY0X3QgcmpjOworICAgIHVpbnQ2NF90IG1ncHJjOworICAgIHVpbnQ2NF90IG1ncGRjOworICAgIHVpbnQ2NF90IG1ncHRjOworICAgIHVpbnQ2NF90IHRvcmw7CisgICAgdWludDY0X3QgdG9yaDsKKyAgICB1aW50NjRfdCB0b3RsOworICAgIHVpbnQ2NF90IHRvdGg7CisgICAgdWludDY0X3QgdHByOworICAgIHVpbnQ2NF90IHRwdDsKKyAgICB1aW50NjRfdCBwdGM2NDsKKyAgICB1aW50NjRfdCBwdGMxMjc7CisgICAgdWludDY0X3QgcHRjMjU1OworICAgIHVpbnQ2NF90IHB0YzUxMTsKKyAgICB1aW50NjRfdCBwdGMxMDIzOworICAgIHVpbnQ2NF90IHB0YzE1MjI7CisgICAgdWludDY0X3QgbXB0YzsKKyAgICB1aW50NjRfdCBicHRjOworICAgIHVpbnQ2NF90IHRzY3RjOworICAgIHVpbnQ2NF90IHRzY3RmYzsKK307CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAoZTEwMDBfaHcuYykgKi8KK3N0cnVjdCBlMTAwMF9odyB7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXY7CisJdWludDhfdCAqaHdfYWRkcjsKKwllMTAwMF9tYWNfdHlwZSAgIG1hY190eXBlOworCWUxMDAwX3BoeV90eXBlIHBoeV90eXBlOworI2lmIDAKKwl1aW50MzJfdCBwaHlfaW5pdF9zY3JpcHQ7CisjZW5kaWYKKwllMTAwMF9tZWRpYV90eXBlIG1lZGlhX3R5cGU7CisJZTEwMDBfZmNfdHlwZSAgICBmYzsKKyNpZiAwCisJZTEwMDBfYnVzX3NwZWVkIGJ1c19zcGVlZDsKKwllMTAwMF9idXNfd2lkdGggYnVzX3dpZHRoOworCWUxMDAwX2J1c190eXBlICBidXNfdHlwZTsKKyNlbmRpZgorCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyBlZXByb207CisjaWYgMAorCWUxMDAwX21zX3R5cGUgbWFzdGVyX3NsYXZlOworCWUxMDAwX21zX3R5cGUgb3JpZ2luYWxfbWFzdGVyX3NsYXZlOworCWUxMDAwX2ZmZV9jb25maWcgZmZlX2NvbmZpZ19zdGF0ZTsKKyNlbmRpZgorCXVpbnQzMl90IGlvX2Jhc2U7CisJdWludDMyX3QgcGh5X2lkOworI2lmZGVmIExJTlVYX0RSSVZFUgorCXVpbnQzMl90IHBoeV9yZXZpc2lvbjsKKyNlbmRpZgorCXVpbnQzMl90IHBoeV9hZGRyOworI2lmIDAKKwl1aW50MzJfdCBvcmlnaW5hbF9mYzsKKyNlbmRpZgorCXVpbnQzMl90IHR4Y3c7CisJdWludDMyX3QgYXV0b25lZ19mYWlsZWQ7CisjaWYgMAorCXVpbnQzMl90IG1heF9mcmFtZV9zaXplOworCXVpbnQzMl90IG1pbl9mcmFtZV9zaXplOworCXVpbnQzMl90IG1jX2ZpbHRlcl90eXBlOworCXVpbnQzMl90IG51bV9tY19hZGRyczsKKwl1aW50MzJfdCBjb2xsaXNpb25fZGVsdGE7CisJdWludDMyX3QgdHhfcGFja2V0X2RlbHRhOworCXVpbnQzMl90IGxlZGN0bF9kZWZhdWx0OworCXVpbnQzMl90IGxlZGN0bF9tb2RlMTsKKwl1aW50MzJfdCBsZWRjdGxfbW9kZTI7CisJdWludDE2X3QgcGh5X3NwZF9kZWZhdWx0OworI2VuZGlmCisJdWludDE2X3QgYXV0b25lZ19hZHZlcnRpc2VkOworCXVpbnQxNl90IHBjaV9jbWRfd29yZDsKKyNpZiAwCisJdWludDE2X3QgZmNfaGlnaF93YXRlcjsKKwl1aW50MTZfdCBmY19sb3dfd2F0ZXI7CisJdWludDE2X3QgZmNfcGF1c2VfdGltZTsKKwl1aW50MTZfdCBjdXJyZW50X2lmc192YWw7CisJdWludDE2X3QgaWZzX21pbl92YWw7CisJdWludDE2X3QgaWZzX21heF92YWw7CisJdWludDE2X3QgaWZzX3N0ZXBfc2l6ZTsKKwl1aW50MTZfdCBpZnNfcmF0aW87CisjZW5kaWYKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdWludDE2X3QgdmVuZG9yX2lkOworI2lmIDAKKwl1aW50MTZfdCBzdWJzeXN0ZW1faWQ7CisJdWludDE2X3Qgc3Vic3lzdGVtX3ZlbmRvcl9pZDsKKyNlbmRpZgorCXVpbnQ4X3QgcmV2aXNpb25faWQ7CisjaWYgMAorCXVpbnQ4X3QgYXV0b25lZzsKKwl1aW50OF90IG1kaXg7CisJdWludDhfdCBmb3JjZWRfc3BlZWRfZHVwbGV4OworCXVpbnQ4X3Qgd2FpdF9hdXRvbmVnX2NvbXBsZXRlOworCXVpbnQ4X3QgZG1hX2ZhaXJuZXNzOworI2VuZGlmCisJdWludDhfdCBtYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07CisjaWYgMAorCXVpbnQ4X3QgcGVybV9tYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07CisJYm9vbGVhbl90IGRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbjsKKwlib29sZWFuX3Qgc3BlZWRfZG93bmdyYWRlZDsKKwllMTAwMF9kc3BfY29uZmlnIGRzcF9jb25maWdfc3RhdGU7CisJYm9vbGVhbl90IGdldF9saW5rX3N0YXR1czsKKwlib29sZWFuX3Qgc2VyZGVzX2xpbmtfZG93bjsKKyNlbmRpZgorCWJvb2xlYW5fdCB0YmlfY29tcGF0aWJpbGl0eV9lbjsKKwlib29sZWFuX3QgdGJpX2NvbXBhdGliaWxpdHlfb247CisjaWYgMAorCWJvb2xlYW5fdCBwaHlfcmVzZXRfZGlzYWJsZTsKKwlib29sZWFuX3QgZmNfc2VuZF94b247CisJYm9vbGVhbl90IGZjX3N0cmljdF9pZWVlOworCWJvb2xlYW5fdCByZXBvcnRfdHhfZWFybHk7CisJYm9vbGVhbl90IGFkYXB0aXZlX2lmczsKKwlib29sZWFuX3QgaWZzX3BhcmFtc19mb3JjZWQ7CisJYm9vbGVhbl90IGluX2lmc19tb2RlOworI2VuZGlmCit9OworCisKKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1NXRFBJTjAgICAweDAwMDEgICAvKiBTV0RQSU4gMCBFRVBST00gVmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX0xFRF9MT0dJQyAweDAwMjAgICAvKiBMZWQgTG9naWMgV29yZCAqLworCisvKiBSZWdpc3RlciBCaXQgTWFza3MgKi8KKy8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRkQgICAgICAgMHgwMDAwMDAwMSAgLyogRnVsbCBkdXBsZXguMD1oYWxmOyAxPWZ1bGwgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0gICAgICAweDAwMDAwMDAyICAvKiBFbmRpYW4gTW9kZS4wPWxpdHRsZSwxPWJpZyAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BSSU9SICAgIDB4MDAwMDAwMDQgIC8qIFByaW9yaXR5IG9uIFBDSS4gMD1yeCwxPWZhaXIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9MUlNUICAgICAweDAwMDAwMDA4ICAvKiBMaW5rIHJlc2V0LiAwPW5vcm1hbCwxPXJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVE1FICAgICAgMHgwMDAwMDAxMCAgLyogVGVzdCBtb2RlLiAwPW5vcm1hbCwxPXRlc3QgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TTEUgICAgICAweDAwMDAwMDIwICAvKiBTZXJpYWwgTGluayBvbiAwPWRpcywxPWVuICovCisjZGVmaW5lIEUxMDAwX0NUUkxfQVNERSAgICAgMHgwMDAwMDAyMCAgLyogQXV0by1zcGVlZCBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU0xVICAgICAgMHgwMDAwMDA0MCAgLyogU2V0IGxpbmsgdXAgKEZvcmNlIExpbmspICovCisjZGVmaW5lIEUxMDAwX0NUUkxfSUxPUyAgICAgMHgwMDAwMDA4MCAgLyogSW52ZXJ0IExvc3MtT2YgU2lnbmFsICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEX1NFTCAgMHgwMDAwMDMwMCAgLyogU3BlZWQgU2VsZWN0IE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAgICAweDAwMDAwMDAwICAvKiBGb3JjZSAxME1iICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwMCAgMHgwMDAwMDEwMCAgLyogRm9yY2UgMTAwTWIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwMCAweDAwMDAwMjAwICAvKiBGb3JjZSAxR2IgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0zMiAgICAweDAwMDAwNDAwICAvKiBCaWcgRW5kaWFuIDMyIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GUkNTUEQgICAweDAwMDAwODAwICAvKiBGb3JjZSBTcGVlZCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ0RQWCAgIDB4MDAwMDEwMDAgIC8qIEZvcmNlIER1cGxleCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjAgIDB4MDAwNDAwMDAgIC8qIFNXRFBJTiAwIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMSAgMHgwMDA4MDAwMCAgLyogU1dEUElOIDEgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4yICAweDAwMTAwMDAwICAvKiBTV0RQSU4gMiB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjMgIDB4MDAyMDAwMDAgIC8qIFNXRFBJTiAzIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMCAgMHgwMDQwMDAwMCAgLyogU1dEUElOIDAgSW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMSAgMHgwMDgwMDAwMCAgLyogU1dEUElOIDEgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMiAgMHgwMTAwMDAwMCAgLyogU1dEUElOIDIgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMyAgMHgwMjAwMDAwMCAgLyogU1dEUElOIDMgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUlNUICAgICAgMHgwNDAwMDAwMCAgLyogR2xvYmFsIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUkZDRSAgICAgMHgwODAwMDAwMCAgLyogUmVjZWl2ZSBGbG93IENvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVEZDRSAgICAgMHgxMDAwMDAwMCAgLyogVHJhbnNtaXQgZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JURSAgICAgIDB4MjAwMDAwMDAgIC8qIFJvdXRpbmcgdGFnIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1ZNRSAgICAgIDB4NDAwMDAwMDAgIC8qIElFRUUgVkxBTiBtb2RlIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SU1QgIDB4ODAwMDAwMDAgIC8qIFBIWSBSZXNldCAqLworCisvKiBEZXZpY2UgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GRCAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBGdWxsIGR1cGxleC4wPWhhbGYsMT1mdWxsICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19MVSAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBMaW5rIHVwLjA9bm8sMT1saW5rICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DX01BU0sgIDB4MDAwMDAwMEMgICAgICAvKiBQQ0kgRnVuY3Rpb24gTWFzayAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ18wICAgICAweDAwMDAwMDAwICAgICAgLyogRnVuY3Rpb24gMCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ18xICAgICAweDAwMDAwMDA0ICAgICAgLyogRnVuY3Rpb24gMSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfVFhPRkYgICAgICAweDAwMDAwMDEwICAgICAgLyogdHJhbnNtaXNzaW9uIHBhdXNlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfVEJJTU9ERSAgICAweDAwMDAwMDIwICAgICAgLyogVEJJIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEX01BU0sgMHgwMDAwMDBDMAorI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAgICAweDAwMDAwMDAwICAgICAgLyogU3BlZWQgMTBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAgIDB4MDAwMDAwNDAgICAgICAvKiBTcGVlZCAxMDBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwIDB4MDAwMDAwODAgICAgICAvKiBTcGVlZCAxMDAwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQVNEViAgICAgICAweDAwMDAwMzAwICAgICAgLyogQXV0byBzcGVlZCBkZXRlY3QgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX01UWENLT0sgICAgMHgwMDAwMDQwMCAgICAgIC8qIE1UWCBjbG9jayBydW5uaW5nIE9LICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0k2NiAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBJbiA2Nk1oeiBzbG90ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CVVM2NCAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBJbiA2NCBiaXQgc2xvdCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9NT0RFICAweDAwMDAyMDAwICAgICAgLyogUENJLVggbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRCAweDAwMDBDMDAwICAgICAgLyogUENJLVggYnVzIHNwZWVkICovCisKKy8qIENvbnN0YW50cyB1c2VkIHRvIGludHJlcHJldCB0aGUgbWFza2VkIFBDSS1YIGJ1cyBzcGVlZC4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfNjYgIDB4MDAwMDAwMDAgLyogUENJLVggYnVzIHNwZWVkICA1MC02NiBNSHogKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTAwIDB4MDAwMDQwMDAgLyogUENJLVggYnVzIHNwZWVkICA2Ni0xMDAgTUh6ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEzMyAweDAwMDA4MDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAxMDAtMTMzIE1IeiAqLworCisvKiBFRVBST00vRmxhc2ggQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NLICAgICAgICAweDAwMDAwMDAxIC8qIEVFUFJPTSBDbG9jayAqLworI2RlZmluZSBFMTAwMF9FRUNEX0NTICAgICAgICAweDAwMDAwMDAyIC8qIEVFUFJPTSBDaGlwIFNlbGVjdCAqLworI2RlZmluZSBFMTAwMF9FRUNEX0RJICAgICAgICAweDAwMDAwMDA0IC8qIEVFUFJPTSBEYXRhIEluICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRE8gICAgICAgIDB4MDAwMDAwMDggLyogRUVQUk9NIERhdGEgT3V0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX01BU0sgIDB4MDAwMDAwMzAgCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0RJUyAgIDB4MDAwMDAwMTAgLyogRGlzYWJsZSBGTEFTSCB3cml0ZXMgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfRU4gICAgMHgwMDAwMDAyMCAvKiBFbmFibGUgRkxBU0ggd3JpdGVzICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX1NISUZUIDQKKyNkZWZpbmUgRTEwMDBfRUVDRF9SRVEgICAgICAgMHgwMDAwMDA0MCAvKiBFRVBST00gQWNjZXNzIFJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9HTlQgICAgICAgMHgwMDAwMDA4MCAvKiBFRVBST00gQWNjZXNzIEdyYW50ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfUFJFUyAgICAgIDB4MDAwMDAxMDAgLyogRUVQUk9NIFByZXNlbnQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSVpFICAgICAgMHgwMDAwMDIwMCAvKiBFRVBST00gU2l6ZSAoMD02NCB3b3JkIDE9MjU2IHdvcmQpICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfQUREUl9CSVRTIDB4MDAwMDA0MDAgLyogRUVQUk9NIEFkZHJlc3NpbmcgYml0cyBiYXNlZCBvbiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKDAtc21hbGwsIDEtbGFyZ2UpICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfVFlQRSAgICAgIDB4MDAwMDIwMDAgLyogRUVQUk9NIFR5cGUgKDEtU1BJLCAwLU1pY3Jvd2lyZSkgKi8KKyNpZm5kZWYgRTEwMDBfRUVQUk9NX0dSQU5UX0FUVEVNUFRTCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUyAxMDAwIC8qIEVFUFJPTSAjIGF0dGVtcHRzIHRvIGdhaW4gZ3JhbnQgKi8KKyNlbmRpZgorCisvKiBFRVBST00gUmVhZCAqLworI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMSAvKiBTdGFydCBSZWFkICovCisjZGVmaW5lIEUxMDAwX0VFUkRfRE9ORSAgICAgICAweDAwMDAwMDEwIC8qIFJlYWQgRG9uZSAqLworI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfU0hJRlQgOAorI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfTUFTSyAgMHgwMDAwRkYwMCAvKiBSZWFkIEFkZHJlc3MgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9EQVRBX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX0VFUkRfREFUQV9NQVNLICAweEZGRkYwMDAwIC8qIFJlYWQgRGF0YSAqLworCisvKiBTUEkgRUVQUk9NIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fU1RBVFVTX1JEWV9TUEkgIDB4MDEKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19XRU5fU1BJICAweDAyCisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfQlAwX1NQSSAgMHgwNAorI2RlZmluZSBFRVBST01fU1RBVFVTX0JQMV9TUEkgIDB4MDgKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19XUEVOX1NQSSAweDgwCisKKy8qIEV4dGVuZGVkIERldmljZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTBfRU4gICAweDAwMDAwMDAxIC8qIE1hcHMgU0RQNCB0byBHUEkwICovIAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkxX0VOICAgMHgwMDAwMDAwMiAvKiBNYXBzIFNEUDUgdG8gR1BJMSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9QSFlJTlRfRU4gRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTgorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkyX0VOICAgMHgwMDAwMDAwNCAvKiBNYXBzIFNEUDYgdG8gR1BJMiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkzX0VOICAgMHgwMDAwMDAwOCAvKiBNYXBzIFNEUDcgdG8gR1BJMyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEEgMHgwMDAwMDAxMCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDVfREFUQSAweDAwMDAwMDIwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEhZX0lOVCAgIEUxMDAwX0NUUkxfRVhUX1NEUDVfREFUQQorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA2ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDdfREFUQSAweDAwMDAwMDgwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVIgIDB4MDAwMDAxMDAgLyogRGlyZWN0aW9uIG9mIFNEUDQgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA1X0RJUiAgMHgwMDAwMDIwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNSAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDZfRElSICAweDAwMDAwNDAwIC8qIERpcmVjdGlvbiBvZiBTRFA2IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQN19ESVIgIDB4MDAwMDA4MDAgLyogRGlyZWN0aW9uIG9mIFNEUDcgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9BU0RDSEsgICAgMHgwMDAwMTAwMCAvKiBJbml0aWF0ZSBhbiBBU0Qgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRUVfUlNUICAgIDB4MDAwMDIwMDAgLyogUmVpbml0aWFsaXplIGZyb20gRUVQUk9NICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lQUyAgICAgICAweDAwMDA0MDAwIC8qIEludmVydCBQb3dlciBTdGF0ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TUERfQllQUyAgMHgwMDAwODAwMCAvKiBTcGVlZCBTZWxlY3QgQnlwYXNzICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX0dNSUkgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfVEJJICAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLX01BU0sgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMjU2ICAgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zMjAgICAweDAxMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzM4NCAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfNDQ4ICAgMHgwMzAwMDAwMAorCisvKiBNREkgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9NRElDX0RBVEFfTUFTSyAweDAwMDBGRkZGCisjZGVmaW5lIEUxMDAwX01ESUNfUkVHX01BU0sgIDB4MDAxRjAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19SRUdfU0hJRlQgMTYKKyNkZWZpbmUgRTEwMDBfTURJQ19QSFlfTUFTSyAgMHgwM0UwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX1BIWV9TSElGVCAyMQorI2RlZmluZSBFMTAwMF9NRElDX09QX1dSSVRFICAweDA0MDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfT1BfUkVBRCAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19SRUFEWSAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX0lOVF9FTiAgICAweDIwMDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfRVJST1IgICAgIDB4NDAwMDAwMDAKKworLyogTEVEIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9NQVNLICAweDAwMDAwMDBGCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQgMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMF9JVlJUICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX01PREVfTUFTSyAgMHgwMDAwMEYwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9NT0RFX1NISUZUIDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfSVZSVCAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX0JMSU5LICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9NT0RFX01BU0sgIDB4MDAwRjAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9TSElGVCAxNgorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9JVlJUICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTksgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX01PREVfTUFTSyAgMHgwRjAwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19NT0RFX1NISUZUIDI0CisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX0lWUlQgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19CTElOSyAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwXzEwMDAgIDB4MAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMF8xMDAwIDB4MQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LX1VQICAgICAgIDB4MgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9BQ1RJVklUWSAgICAgIDB4MworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LX0FDVElWSVRZIDB4NAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwICAgICAgIDB4NQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMCAgICAgIDB4NgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMDAgICAgIDB4NworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9QQ0lYX01PREUgICAgIDB4OAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9GVUxMX0RVUExFWCAgIDB4OQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9DT0xMSVNJT04gICAgIDB4QQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9CVVNfU1BFRUQgICAgIDB4QgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9CVVNfU0laRSAgICAgIDB4QworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9QQVVTRUQgICAgICAgIDB4RAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MRURfT04gICAgICAgIDB4RQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGICAgICAgIDB4RgorCisvKiBSZWNlaXZlIEFkZHJlc3MgKi8KKyNkZWZpbmUgRTEwMDBfUkFIX0FWICAweDgwMDAwMDAwICAgICAgICAvKiBSZWNlaXZlIGRlc2NyaXB0b3IgdmFsaWQgKi8KKworLyogSW50ZXJydXB0IENhdXNlIFJlYWQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYRFcgICAgMHgwMDAwMDAwMSAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhRRSAgICAweDAwMDAwMDAyICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lDUl9MU0MgICAgIDB4MDAwMDAwMDQgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWFNFUSAgIDB4MDAwMDAwMDggICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYRE1UMCAgMHgwMDAwMDAxMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICgwKSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhPICAgICAweDAwMDAwMDQwICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYVDAgICAgMHgwMDAwMDA4MCAgICAvKiByeCB0aW1lciBpbnRyIChyaW5nIDApICovCisjZGVmaW5lIEUxMDAwX0lDUl9NREFDICAgIDB4MDAwMDAyMDAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYQ0ZHICAgMHgwMDAwMDQwMCAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjAgMHgwMDAwMDgwMCAgICAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMSAweDAwMDAxMDAwICAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4yIDB4MDAwMDIwMDAgICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjMgMHgwMDAwNDAwMCAgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEX0xPVyAweDAwMDA4MDAwCisjZGVmaW5lIEUxMDAwX0lDUl9TUlBEICAgIDB4MDAwMTAwMDAKKworLyogSW50ZXJydXB0IENhdXNlIFNldCAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEVyAgICBFMTAwMF9JQ1JfVFhEVyAgICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYUUUgICAgRTEwMDBfSUNSX1RYUUUgICAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lDU19MU0MgICAgIEUxMDAwX0lDUl9MU0MgICAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYU0VRICAgRTEwMDBfSUNSX1JYU0VRICAgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDU19SWERNVDAgIEUxMDAwX0lDUl9SWERNVDAgICAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0lDU19SWE8gICAgIEUxMDAwX0lDUl9SWE8gICAgICAgICAvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lDU19SWFQwICAgIEUxMDAwX0lDUl9SWFQwICAgICAgICAvKiByeCB0aW1lciBpbnRyICovCisjZGVmaW5lIEUxMDAwX0lDU19NREFDICAgIEUxMDAwX0lDUl9NREFDICAgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhDRkcgICBFMTAwMF9JQ1JfUlhDRkcgICAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4wIEUxMDAwX0lDUl9HUElfRU4wICAgICAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMSBFMTAwMF9JQ1JfR1BJX0VOMSAgICAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjIgRTEwMDBfSUNSX0dQSV9FTjIgICAgIC8qIEdQIEludCAyICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4zIEUxMDAwX0lDUl9HUElfRU4zICAgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEX0xPVyBFMTAwMF9JQ1JfVFhEX0xPVworI2RlZmluZSBFMTAwMF9JQ1NfU1JQRCAgICBFMTAwMF9JQ1JfU1JQRAorCisvKiBJbnRlcnJ1cHQgTWFzayBTZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRFcgICAgRTEwMDBfSUNSX1RYRFcgICAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lNU19UWFFFICAgIEUxMDAwX0lDUl9UWFFFICAgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JTVNfTFNDICAgICBFMTAwMF9JQ1JfTFNDICAgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFNFUSAgIEUxMDAwX0lDUl9SWFNFUSAgICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhETVQwICBFMTAwMF9JQ1JfUlhETVQwICAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhPICAgICBFMTAwMF9JQ1JfUlhPICAgICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhUMCAgICBFMTAwMF9JQ1JfUlhUMCAgICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JTVNfTURBQyAgICBFMTAwMF9JQ1JfTURBQyAgICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYQ0ZHICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMCBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjEgRTEwMDBfSUNSX0dQSV9FTjEgICAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4yIEUxMDAwX0lDUl9HUElfRU4yICAgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMyBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRF9MT1cgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSU1TX1NSUEQgICAgRTEwMDBfSUNSX1NSUEQKKworLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYRFcgICAgRTEwMDBfSUNSX1RYRFcgICAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWFFFICAgIEUxMDAwX0lDUl9UWFFFICAgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JTUNfTFNDICAgICBFMTAwMF9JQ1JfTFNDICAgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWFNFUSAgIEUxMDAwX0lDUl9SWFNFUSAgICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhETVQwICBFMTAwMF9JQ1JfUlhETVQwICAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhPICAgICBFMTAwMF9JQ1JfUlhPICAgICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhUMCAgICBFMTAwMF9JQ1JfUlhUMCAgICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JTUNfTURBQyAgICBFMTAwMF9JQ1JfTURBQyAgICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYQ0ZHICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMCBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjEgRTEwMDBfSUNSX0dQSV9FTjEgICAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4yIEUxMDAwX0lDUl9HUElfRU4yICAgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMyBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYRF9MT1cgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSU1DX1NSUEQgICAgRTEwMDBfSUNSX1NSUEQKKworLyogUmVjZWl2ZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JDVExfUlNUICAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBTb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0VOICAgICAgICAgICAweDAwMDAwMDAyICAgICAgLyogZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfU0JQICAgICAgICAgIDB4MDAwMDAwMDQgICAgICAvKiBzdG9yZSBiYWQgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfVVBFICAgICAgICAgIDB4MDAwMDAwMDggICAgICAvKiB1bmljYXN0IHByb21pc2N1b3VzIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01QRSAgICAgICAgICAweDAwMDAwMDEwICAgICAgLyogbXVsdGljYXN0IHByb21pc2N1b3VzIGVuYWIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MUEUgICAgICAgICAgMHgwMDAwMDAyMCAgICAgIC8qIGxvbmcgcGFja2V0IGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9OTyAgICAgICAweDAwMDAwMDAwICAgICAgLyogbm8gbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9NQUMgICAgICAweDAwMDAwMDQwICAgICAgLyogTUFDIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fU0xQICAgICAgMHgwMDAwMDA4MCAgICAgIC8qIHNlcmlhbCBsaW5rIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fVENWUiAgICAgMHgwMDAwMDBDMCAgICAgIC8qIHRjdnIgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAweDAwMDAwMDAwICAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19RVUFUICAgMHgwMDAwMDEwMCAgICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfRUlHVEggIDB4MDAwMDAyMDAgICAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PX1NISUZUICAgICAxMiAgICAgICAgICAgICAgLyogbXVsdGljYXN0IG9mZnNldCBzaGlmdCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzAgICAgICAgICAweDAwMDAwMDAwICAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMTowICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMSAgICAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDEyOjEgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18yICAgICAgICAgMHgwMDAwMjAwMCAgICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTM6MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzMgICAgICAgICAweDAwMDAzMDAwICAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxNTo0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfTURSICAgICAgICAgIDB4MDAwMDQwMDAgICAgICAvKiBtdWx0aWNhc3QgZGVzYyByaW5nIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9CQU0gICAgICAgICAgMHgwMDAwODAwMCAgICAgIC8qIGJyb2FkY2FzdCBlbmFibGUgKi8KKy8qIHRoZXNlIGJ1ZmZlciBzaXplcyBhcmUgdmFsaWQgaWYgRTEwMDBfUkNUTF9CU0VYIGlzIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8yMDQ4ICAgICAgMHgwMDAwMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDIwNDggKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8xMDI0ICAgICAgMHgwMDAxMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDEwMjQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl81MTIgICAgICAgMHgwMDAyMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDUxMiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzI1NiAgICAgICAweDAwMDMwMDAwICAgICAgLyogcnggYnVmZmVyIHNpemUgMjU2ICovCisvKiB0aGVzZSBidWZmZXIgc2l6ZXMgYXJlIHZhbGlkIGlmIEUxMDAwX1JDVExfQlNFWCBpcyAxICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMTYzODQgICAgIDB4MDAwMTAwMDAgICAgICAvKiByeCBidWZmZXIgc2l6ZSAxNjM4NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzgxOTIgICAgICAweDAwMDIwMDAwICAgICAgLyogcnggYnVmZmVyIHNpemUgODE5MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzQwOTYgICAgICAweDAwMDMwMDAwICAgICAgLyogcnggYnVmZmVyIHNpemUgNDA5NiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1ZGRSAgICAgICAgICAweDAwMDQwMDAwICAgICAgLyogdmxhbiBmaWx0ZXIgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfQ0ZJRU4gICAgICAgIDB4MDAwODAwMDAgICAgICAvKiBjYW5vbmljYWwgZm9ybSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9DRkkgICAgICAgICAgMHgwMDEwMDAwMCAgICAgIC8qIGNhbm9uaWNhbCBmb3JtIGluZGljYXRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0RQRiAgICAgICAgICAweDAwNDAwMDAwICAgICAgLyogZGlzY2FyZCBwYXVzZSBmcmFtZXMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9QTUNGICAgICAgICAgMHgwMDgwMDAwMCAgICAgIC8qIHBhc3MgTUFDIGNvbnRyb2wgZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX1JDVExfQlNFWCAgICAgICAgIDB4MDIwMDAwMDAgICAgICAvKiBCdWZmZXIgc2l6ZSBleHRlbnNpb24gKi8KKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX1JEVF9ERUxBWSAweDAwMDBmZmZmICAgICAgLyogRGVsYXkgdGltZXIgKDE9MTAyNHVzKSAqLworI2RlZmluZSBFMTAwMF9SRFRfRlBEQiAgMHg4MDAwMDAwMCAgICAgIC8qIEZsdXNoIGRlc2NyaXB0b3IgYmxvY2sgKi8KKyNkZWZpbmUgRTEwMDBfUkRMRU5fTEVOIDB4MDAwN2ZmODAgICAgICAvKiBkZXNjcmlwdG9yIGxlbmd0aCAqLworI2RlZmluZSBFMTAwMF9SREhfUkRIICAgMHgwMDAwZmZmZiAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciBoZWFkICovCisjZGVmaW5lIEUxMDAwX1JEVF9SRFQgICAweDAwMDBmZmZmICAgICAgLyogcmVjZWl2ZSBkZXNjcmlwdG9yIHRhaWwgKi8KKworLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIX1JUSCAgMHgwMDAwRkZGOCAgICAgLyogTWFzayBCaXRzWzE1OjNdIGZvciBSVEggKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEhfWEZDRSAweDgwMDAwMDAwICAgICAvKiBFeHRlcm5hbCBGbG93IENvbnRyb2wgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0ZDUlRMX1JUTCAgMHgwMDAwRkZGOCAgICAgLyogTWFzayBCaXRzWzE1OjNdIGZvciBSVEwgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVExfWE9ORSAweDgwMDAwMDAwICAgICAvKiBFbmFibGUgWE9OIGZyYW1lIHRyYW5zbWlzc2lvbiAqLworCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfUFRIUkVTSCAweDAwMDAwMDNGIC8qIFJYRENUTCBQcmVmZXRjaCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX0hUSFJFU0ggMHgwMDAwM0YwMCAvKiBSWERDVEwgSG9zdCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX1dUSFJFU0ggMHgwMDNGMDAwMCAvKiBSWERDVEwgV3JpdGViYWNrIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfR1JBTiAgICAweDAxMDAwMDAwIC8qIFJYRENUTCBHcmFudWxhcml0eSAqLworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX1BUSFJFU0ggMHgwMDAwMDBGRiAvKiBUWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9IVEhSRVNIIDB4MDAwMEZGMDAgLyogVFhEQ1RMIEhvc3QgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9XVEhSRVNIIDB4MDBGRjAwMDAgLyogVFhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBUWERDVEwgR3JhbnVsYXJpdHkgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0xXVEhSRVNIIDB4RkUwMDAwMDAgLyogVFhEQ1RMIExvdyBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQiAweDAxMDEwMDAwIC8qIEdSQU49MSwgV1RIUkVTSD0xICovCisKKy8qIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gV29yZCAqLworI2RlZmluZSBFMTAwMF9UWENXX0ZEICAgICAgICAgMHgwMDAwMDAyMCAgICAgICAgLyogVFhDVyBmdWxsIGR1cGxleCAqLworI2RlZmluZSBFMTAwMF9UWENXX0hEICAgICAgICAgMHgwMDAwMDA0MCAgICAgICAgLyogVFhDVyBoYWxmIGR1cGxleCAqLworI2RlZmluZSBFMTAwMF9UWENXX1BBVVNFICAgICAgMHgwMDAwMDA4MCAgICAgICAgLyogVFhDVyBzeW0gcGF1c2UgcmVxdWVzdCAqLworI2RlZmluZSBFMTAwMF9UWENXX0FTTV9ESVIgICAgMHgwMDAwMDEwMCAgICAgICAgLyogVFhDVyBhc3RtIHBhdXNlIGRpcmVjdGlvbiAqLworI2RlZmluZSBFMTAwMF9UWENXX1BBVVNFX01BU0sgMHgwMDAwMDE4MCAgICAgICAgLyogVFhDVyBwYXVzZSByZXF1ZXN0IG1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19SRiAgICAgICAgIDB4MDAwMDMwMDAgICAgICAgIC8qIFRYQ1cgcmVtb3RlIGZhdWx0ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfTlAgICAgICAgICAweDAwMDA4MDAwICAgICAgICAvKiBUWENXIG5leHQgcGFnZSAqLworI2RlZmluZSBFMTAwMF9UWENXX0NXICAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgLyogVHhDb25maWdXb3JkIG1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19UWEMgICAgICAgIDB4NDAwMDAwMDAgICAgICAgIC8qIFRyYW5zbWl0IENvbmZpZyBjb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfQU5FICAgICAgICAweDgwMDAwMDAwICAgICAgICAvKiBBdXRvLW5lZyBlbmFibGUgKi8KKworLyogUmVjZWl2ZSBDb25maWd1cmF0aW9uIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19DVyAgICAweDAwMDBmZmZmICAgICAvKiBSeENvbmZpZ1dvcmQgbWFzayAqLworI2RlZmluZSBFMTAwMF9SWENXX05DICAgIDB4MDQwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIG5vIGNhcnJpZXIgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19JViAgICAweDA4MDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBpbnZhbGlkICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQ0MgICAgMHgxMDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgY2hhbmdlICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQyAgICAgMHgyMDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19TWU5DSCAweDQwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBzeW5jaCAqLworI2RlZmluZSBFMTAwMF9SWENXX0FOQyAgIDB4ODAwMDAwMDAgICAgIC8qIEF1dG8tbmVnIGNvbXBsZXRlICovCisKKy8qIFRyYW5zbWl0IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9SU1QgICAgMHgwMDAwMDAwMSAgICAvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0VOICAgICAweDAwMDAwMDAyICAgIC8qIGVuYWJsZSB0eCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0JDRSAgICAweDAwMDAwMDA0ICAgIC8qIGJ1c3kgY2hlY2sgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1RDVExfUFNQICAgIDB4MDAwMDAwMDggICAgLyogcGFkIHNob3J0IHBhY2tldHMgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9DVCAgICAgMHgwMDAwMGZmMCAgICAvKiBjb2xsaXNpb24gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RDVExfQ09MRCAgIDB4MDAzZmYwMDAgICAgLyogY29sbGlzaW9uIGRpc3RhbmNlICovCisjZGVmaW5lIEUxMDAwX1RDVExfU1dYT0ZGIDB4MDA0MDAwMDAgICAgLyogU1cgWG9mZiB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9QQkUgICAgMHgwMDgwMDAwMCAgICAvKiBQYWNrZXQgQnVyc3QgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1RDVExfUlRMQyAgIDB4MDEwMDAwMDAgICAgLyogUmUtdHJhbnNtaXQgb24gbGF0ZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9OUlRVICAgMHgwMjAwMDAwMCAgICAvKiBObyBSZS10cmFuc21pdCBvbiB1bmRlcnJ1biAqLworCisvKiBSZWNlaXZlIENoZWNrc3VtIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX1BDU1NfTUFTSyAweDAwMDAwMEZGICAgLyogUGFja2V0IENoZWNrc3VtIFN0YXJ0ICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUE9GTCAgICAgMHgwMDAwMDEwMCAgIC8qIElQdjQgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fVFVPRkwgICAgIDB4MDAwMDAyMDAgICAvKiBUQ1AgLyBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fSVBWNk9GTCAgIDB4MDAwMDA0MDAgICAvKiBJUHY2IGNoZWNrc3VtIG9mZmxvYWQgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIHBvd2VyIG1hbmFnZW1lbnQgYW5kIHdha2V1cCByZWdpc3RlcnMgKi8KKy8qIFdha2UgVXAgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9XVUNfQVBNRSAgICAgICAweDAwMDAwMDAxIC8qIEFQTSBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1BNRV9FTiAgICAgMHgwMDAwMDAwMiAvKiBQTUUgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVQ19QTUVfU1RBVFVTIDB4MDAwMDAwMDQgLyogUE1FIFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9XVUNfQVBNUE1FICAgICAweDAwMDAwMDA4IC8qIEFzc2VydCBQTUUgb24gQVBNIFdha2V1cCAqLworI2RlZmluZSBFMTAwMF9XVUNfU1BNICAgICAgICAweDgwMDAwMDAwIC8qIEVuYWJsZSBTUE0gKi8KKworLyogV2FrZSBVcCBGaWx0ZXIgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9XVUZDX0xOS0MgMHgwMDAwMDAwMSAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX01BRyAgMHgwMDAwMDAwMiAvKiBNYWdpYyBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0VYICAgMHgwMDAwMDAwNCAvKiBEaXJlY3RlZCBFeGFjdCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTUMgICAweDAwMDAwMDA4IC8qIERpcmVjdGVkIE11bHRpY2FzdCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfQkMgICAweDAwMDAwMDEwIC8qIEJyb2FkY2FzdCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfQVJQICAweDAwMDAwMDIwIC8qIEFSUCBSZXF1ZXN0IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSVBWNCAweDAwMDAwMDQwIC8qIERpcmVjdGVkIElQdjQgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19JUFY2IDB4MDAwMDAwODAgLyogRGlyZWN0ZWQgSVB2NiBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgxIDB4MDAwMjAwMDAgLyogRmxleGlibGUgRmlsdGVyIDEgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMiAweDAwMDQwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAyIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDMgMHgwMDA4MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMyBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BTExfRklMVEVSUyAweDAwMEYwMEZGIC8qIE1hc2sgZm9yIGFsbCB3YWtldXAgZmlsdGVycyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWF9PRkZTRVQgMTYgICAgICAgLyogT2Zmc2V0IHRvIHRoZSBGbGV4aWJsZSBGaWx0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfRklMVEVSUyAweDAwMEYwMDAwIC8qIE1hc2sgZm9yIHRoZSA0IGZsZXhpYmxlIGZpbHRlcnMgKi8KKworLyogV2FrZSBVcCBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0xOS0MgMHgwMDAwMDAwMSAvKiBMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisjZGVmaW5lIEUxMDAwX1dVU19NQUcgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19FWCAgIDB4MDAwMDAwMDQgLyogRGlyZWN0ZWQgRXhhY3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX01DICAgMHgwMDAwMDAwOCAvKiBEaXJlY3RlZCBNdWx0aWNhc3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0JDICAgMHgwMDAwMDAxMCAvKiBCcm9hZGNhc3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0FSUCAgMHgwMDAwMDAyMCAvKiBBUlAgUmVxdWVzdCBQYWNrZXQgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0lQVjQgMHgwMDAwMDA0MCAvKiBEaXJlY3RlZCBJUHY0IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgyIDB4MDAwNDAwMDAgLyogRmxleGlibGUgRmlsdGVyIDIgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDMgMHgwMDA4MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMyBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisKKy8qIE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQlVTX0VOICAgICAgMHgwMDAwMDAwMSAvKiBTTUJ1cyBFbmFibGVkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19BU0ZfRU4gICAgICAgIDB4MDAwMDAwMDIgLyogQVNGIEVuYWJsZWQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JfT05fRk9SQ0UgICAgMHgwMDAwMDAwNCAvKiBSZXNldCBvbiBGb3JjZSBUQ08gLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JNQ1BfRU4gICAgICAgMHgwMDAwMDEwMCAvKiBFbmFibGUgUkNNUCAwMjZGaCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ18wMjk4X0VOICAgICAgIDB4MDAwMDAyMDAgLyogRW5hYmxlIFJDTVAgMDI5OGggRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfSVBWNF9FTiAgICAgICAweDAwMDAwNDAwIC8qIEVuYWJsZSBJUHY0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfSVBWNl9FTiAgICAgICAweDAwMDAwODAwIC8qIEVuYWJsZSBJUHY2ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU05BUF9FTiAgICAgICAweDAwMDAxMDAwIC8qIEFjY2VwdCBMTEMvU05BUCAqLworI2RlZmluZSBFMTAwMF9NQU5DX0FSUF9FTiAgICAgICAgMHgwMDAwMjAwMCAvKiBFbmFibGUgQVJQIFJlcXVlc3QgRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfTkVJR0hCT1JfRU4gICAweDAwMDA0MDAwIC8qIEVuYWJsZSBOZWlnaGJvciBEaXNjb3ZlcnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1RDT19SRVNFVCAgICAgMHgwMDAxMDAwMCAvKiBUQ08gUmVzZXQgT2NjdXJyZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SQ1ZfVENPX0VOICAgIDB4MDAwMjAwMDAgLyogUmVjZWl2ZSBUQ08gUGFja2V0cyBFbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkVQT1JUX1NUQVRVUyAweDAwMDQwMDAwIC8qIFN0YXR1cyBSZXBvcnRpbmcgRW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9SRVEgICAgICAgMHgwMTAwMDAwMCAvKiBTTUJ1cyBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0dOVCAgICAgICAweDAyMDAwMDAwIC8qIFNNQnVzIEdyYW50ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19JTiAgICAweDA0MDAwMDAwIC8qIFNNQnVzIENsb2NrIEluICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfSU4gICAweDA4MDAwMDAwIC8qIFNNQnVzIERhdGEgSW4gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9PVVQgIDB4MTAwMDAwMDAgLyogU01CdXMgRGF0YSBPdXQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVCAgIDB4MjAwMDAwMDAgLyogU01CdXMgQ2xvY2sgT3V0ICovCisKKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9PVVRfU0hJRlQgIDI4IC8qIFNNQnVzIERhdGEgT3V0IFNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19PVVRfU0hJRlQgICAyOSAvKiBTTUJ1cyBDbG9jayBPdXQgU2hpZnQgKi8KKworLyogV2FrZSBVcCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX1dVUExfTEVOR1RIX01BU0sgMHgwRkZGICAgLyogT25seSB0aGUgbG93ZXIgMTIgYml0cyBhcmUgdmFsaWQgKi8KKworI2RlZmluZSBFMTAwMF9NREFMSUdOICAgICAgICAgIDQwOTYKKworLyogRUVQUk9NIENvbW1hbmRzIC0gTWljcm93aXJlICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERV9NSUNST1dJUkUgIDB4NiAgLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfTUlDUk9XSVJFIDB4NSAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fRVJBU0VfT1BDT0RFX01JQ1JPV0lSRSAweDcgIC8qIEVFUFJPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSAgMHgxMyAvKiBFRVBST00gZXJhc2Uvd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERV9NSUNST1dJUkUgIDB4MTAgLyogRUVQUk9NIGVyYXN0L3dyaXRlIGRpc2FibGUgKi8KKworLyogRUVQUk9NIENvbW1hbmRzIC0gU1BJICovCisjZGVmaW5lIEVFUFJPTV9NQVhfUkVUUllfU1BJICAgIDUwMDAgLyogTWF4IHdhaXQgb2YgNW1zLCBmb3IgUkRZIHNpZ25hbCAqLworI2RlZmluZSBFRVBST01fUkVBRF9PUENPREVfU1BJICAweDMgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSSAweDIgIC8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0E4X09QQ09ERV9TUEkgICAgMHg4ICAvKiBvcGNvZGUgYml0LTMgPSBhZGRyZXNzIGJpdC04ICovCisjZGVmaW5lIEVFUFJPTV9XUkVOX09QQ09ERV9TUEkgIDB4NiAgLyogRUVQUk9NIHNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1dSRElfT1BDT0RFX1NQSSAgMHg0ICAvKiBFRVBST00gcmVzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCisjZGVmaW5lIEVFUFJPTV9SRFNSX09QQ09ERV9TUEkgIDB4NSAgLyogRUVQUk9NIHJlYWQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVFUFJPTV9XUlNSX09QQ09ERV9TUEkgIDB4MSAgLyogRUVQUk9NIHdyaXRlIFN0YXR1cyByZWdpc3RlciAqLworCisvKiBFRVBST00gU2l6ZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRVBST01fU0laRV8xNktCICAgICAgICAweDE4MDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfOEtCICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzRLQiAgICAgICAgIDB4MTAwMAorI2RlZmluZSBFRVBST01fU0laRV8yS0IgICAgICAgICAweDBDMDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfMUtCICAgICAgICAgMHgwODAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzUxMkIgICAgICAgIDB4MDQwMAorI2RlZmluZSBFRVBST01fU0laRV8xMjhCICAgICAgICAweDAwMDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfTUFTSyAgICAgICAgMHgxQzAwCisKKy8qIEVFUFJPTSBXb3JkIE9mZnNldHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NPTVBBVCAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEVFUFJPTV9JRF9MRURfU0VUVElOR1MgICAgIDB4MDAwNAorI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERSAgICAgICAweDAwMDYgLyogRm9yIFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGFkanVzdG1lbnQuICovCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wxX1JFRyAgIDB4MDAwQQorI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcgICAweDAwMEYKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9CICAgMHgwMDE0CisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQSAgIDB4MDAyNAorI2RlZmluZSBFRVBST01fQ0ZHICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgRUVQUk9NX0ZMQVNIX1ZFUlNJT04gICAgICAgMHgwMDMyCisjZGVmaW5lIEVFUFJPTV9DSEVDS1NVTV9SRUcgICAgICAgIDB4MDAzRgorCisvKiBXb3JkIGRlZmluaXRpb25zIGZvciBJRCBMRUQgU2V0dGluZ3MgKi8KKyNkZWZpbmUgSURfTEVEX1JFU0VSVkVEXzAwMDAgMHgwMDAwCisjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF9GRkZGIDB4RkZGRgorI2RlZmluZSBJRF9MRURfREVGQVVMVCAgICAgICAoKElEX0xFRF9PRkYxX09OMiA8PCAxMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX09GRjFfT0ZGMiA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyIDw8IDQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX0RFRjIpKQorI2RlZmluZSBJRF9MRURfREVGMV9ERUYyICAgICAweDEKKyNkZWZpbmUgSURfTEVEX0RFRjFfT04yICAgICAgMHgyCisjZGVmaW5lIElEX0xFRF9ERUYxX09GRjIgICAgIDB4MworI2RlZmluZSBJRF9MRURfT04xX0RFRjIgICAgICAweDQKKyNkZWZpbmUgSURfTEVEX09OMV9PTjIgICAgICAgMHg1CisjZGVmaW5lIElEX0xFRF9PTjFfT0ZGMiAgICAgIDB4NgorI2RlZmluZSBJRF9MRURfT0ZGMV9ERUYyICAgICAweDcKKyNkZWZpbmUgSURfTEVEX09GRjFfT04yICAgICAgMHg4CisjZGVmaW5lIElEX0xFRF9PRkYxX09GRjIgICAgIDB4OQorCisjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfTUFTSyAgIDB4RkZGRkYwRkYKKyNkZWZpbmUgSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgMHgwMzAwCisjZGVmaW5lIElHUF9MRUQzX01PREUgICAgICAgICAgIDB4MDcwMDAwMDAKKworCisvKiBNYXNrIGJpdHMgZm9yIFNFUkRFUyBhbXBsaXR1ZGUgYWRqdXN0bWVudCBpbiBXb3JkIDYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERV9NQVNLICAweDAwMEYKKworLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBhIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9JTE9TICAgMHgwMDEwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfU1dEUElPIDB4MDFFMAorI2RlZmluZSBFRVBST01fV09SRDBBX0xSU1QgICAweDAyMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9GRCAgICAgMHgwNDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfNjZNSFogIDB4MDgwMAorCisvKiBNYXNrIGJpdHMgZm9yIGZpZWxkcyBpbiBXb3JkIDB4MGYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fV09SRDBGX1BBVVNFX01BU0sgMHgzMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfUEFVU0UgICAgICAweDEwMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9BU01fRElSICAgIDB4MjAwMAorI2RlZmluZSBFRVBST01fV09SRDBGX0FORSAgICAgICAgMHgwODAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCAweDAwRjAKKworLyogRm9yIGNoZWNrc3VtbWluZywgdGhlIHN1bSBvZiBhbGwgd29yZHMgaW4gdGhlIEVFUFJPTSBzaG91bGQgZXF1YWwgMHhCQUJBLiAqLworI2RlZmluZSBFRVBST01fU1VNIDB4QkFCQQorCisvKiBFRVBST00gTWFwIGRlZmluZXMgKFdPUkQgT0ZGU0VUUykqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSRVNTX0JZVEVfMCAwCisjZGVmaW5lIEVFUFJPTV9QQkFfQllURV8xICAgICAgICAgIDgKKworI2RlZmluZSBFRVBST01fUkVTRVJWRURfV09SRCAgICAgICAgICAweEZGRkYKKworLyogRUVQUk9NIE1hcCBTaXplcyAoQnl0ZSBDb3VudHMpICovCisjZGVmaW5lIFBCQV9TSVpFIDQKKworLyogQ29sbGlzaW9uIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgICAgICAgMTYKKyNkZWZpbmUgRTEwMDBfQ1RfU0hJRlQgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRSAgICAgICAgNjQKKyNkZWZpbmUgRTEwMDBfRkRYX0NPTExJU0lPTl9ESVNUQU5DRSAgICBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UKKyNkZWZpbmUgRTEwMDBfSERYX0NPTExJU0lPTl9ESVNUQU5DRSAgICBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UKKyNkZWZpbmUgRTEwMDBfQ09MRF9TSElGVCAgICAgICAgICAgICAgICAxMgorCisvKiBOdW1iZXIgb2YgVHJhbnNtaXQgYW5kIFJlY2VpdmUgRGVzY3JpcHRvcnMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKi8KKyNkZWZpbmUgUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUgIDgKKyNkZWZpbmUgUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUgIDgKKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0cmFuc21pdCBJUEcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgREVGQVVMVF84MjU0Ml9USVBHX0lQR1QgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfODI1NDNfVElQR19JUEdUX0ZJQkVSICA5CisjZGVmaW5lIERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUiA4CisKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdUX01BU0sgIDB4MDAwMDAzRkYKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMV9NQVNLIDB4MDAwRkZDMDAKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMl9NQVNLIDB4M0ZGMDAwMDAKKworI2RlZmluZSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjEgMgorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjEgOAorI2RlZmluZSBFMTAwMF9USVBHX0lQR1IxX1NISUZUICAxMAorCisjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdSMiAxMAorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjIgNgorI2RlZmluZSBFMTAwMF9USVBHX0lQR1IyX1NISUZUICAyMAorCisjZGVmaW5lIEUxMDAwX1RYRE1BQ19EUFAgMHgwMDAwMDAwMQorCisvKiBBZGFwdGl2ZSBJRlMgZGVmaW5lcyAqLworI2RlZmluZSBUWF9USFJFU0hPTERfU1RBUlQgICAgIDgKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0lOQ1JFTUVOVCAxMAorI2RlZmluZSBUWF9USFJFU0hPTERfREVDUkVNRU5UIDEKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX1NUT1AgICAgICAxOTAKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0RJU0FCTEUgICAwCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9USU1FUl9NUyAgMTAwMDAKKyNkZWZpbmUgTUlOX05VTV9YTUlUUyAgICAgICAgICAxMDAwCisjZGVmaW5lIElGU19NQVggICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgSUZTX1NURVAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBJRlNfTUlOICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIElGU19SQVRJTyAgICAgICAgICAgICAgNAorCisvKiBQQkEgY29uc3RhbnRzICovCisjZGVmaW5lIEUxMDAwX1BCQV8xNksgMHgwMDEwICAgIC8qIDE2S0IsIGRlZmF1bHQgVFggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfMjJLIDB4MDAxNgorI2RlZmluZSBFMTAwMF9QQkFfMjRLIDB4MDAxOAorI2RlZmluZSBFMTAwMF9QQkFfMzBLIDB4MDAxRQorI2RlZmluZSBFMTAwMF9QQkFfNDBLIDB4MDAyOAorI2RlZmluZSBFMTAwMF9QQkFfNDhLIDB4MDAzMCAgICAvKiA0OEtCLCBkZWZhdWx0IFJYIGFsbG9jYXRpb24gKi8KKworLyogRmxvdyBDb250cm9sIENvbnN0YW50cyAqLworI2RlZmluZSBGTE9XX0NPTlRST0xfQUREUkVTU19MT1cgIDB4MDBDMjgwMDEKKyNkZWZpbmUgRkxPV19DT05UUk9MX0FERFJFU1NfSElHSCAweDAwMDAwMTAwCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9UWVBFICAgICAgICAgMHg4ODA4CisKKy8qIFRoZSBoaXN0b3JpY2FsIGRlZmF1bHRzIGZvciB0aGUgZmxvdyBjb250cm9sIHZhbHVlcyBhcmUgZ2l2ZW4gYmVsb3cuICovCisjZGVmaW5lIEZDX0RFRkFVTFRfSElfVEhSRVNIICAgICAgICAoMHg4MDAwKSAgICAvKiAzMktCICovCisjZGVmaW5lIEZDX0RFRkFVTFRfTE9fVEhSRVNIICAgICAgICAoMHg0MDAwKSAgICAvKiAxNktCICovCisjZGVmaW5lIEZDX0RFRkFVTFRfVFhfVElNRVIgICAgICAgICAoMHgxMDApICAgICAvKiB+MTMwIHVzICovCisKKy8qIFBDSVggQ29uZmlnIHNwYWNlICovCisjZGVmaW5lIFBDSVhfQ09NTUFORF9SRUdJU1RFUiAgICAweEU2CisjZGVmaW5lIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0xPICAweEU4CisjZGVmaW5lIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJICAweEVBCisKKyNkZWZpbmUgUENJWF9DT01NQU5EX01NUkJDX01BU0sgICAgICAweDAwMEMKKyNkZWZpbmUgUENJWF9DT01NQU5EX01NUkJDX1NISUZUICAgICAweDIKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfTUFTSyAgICAweDAwNjAKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfU0hJRlQgICAweDUKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfNEsgICAgICAweDMKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfMksgICAgICAweDIKKworCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCByaWdodCB0aGUgInBhdXNlIiBiaXRzIGZyb20gdGhlCisgKiBFRVBST00gKGJpdHMgMTM6MTIpIHRvIHRoZSAicGF1c2UiIChiaXRzIDg6NykgZmllbGQgaW4gdGhlIFRYQ1cgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEFVU0VfU0hJRlQgNQorCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiU1dEUElPIiBiaXRzIGZyb20gdGhlCisgKiBFRVBST00gKGJpdHMgODo1KSB0byB0aGUgIlNXRFBJTyIgKGJpdHMgMjU6MjIpIGZpZWxkIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNXRFBJT19TSElGVCAxNworCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiU1dEUElPX0VYVCIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIHdvcmQgRiAoYml0cyA3OjQpIHRvIHRoZSBiaXRzIDExOjggb2YgVGhlIEV4dGVuZGVkIENUUkwgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1dEUElPX19FWFRfU0hJRlQgNAorCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiSUxPUyIgYml0IGZyb20gdGhlIEVFUFJPTQorICogKGJpdCA0KSB0byB0aGUgIklMT1MiIChiaXQgNykgZmllbGQgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSUxPU19TSElGVCAgMworCisKKyNkZWZpbmUgUkVDRUlWRV9CVUZGRVJfQUxJR05fU0laRSAgKDI1NikKKworLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3ZSB3YWl0IGZvciBhdXRvLW5lZ290aWF0aW9uIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIExJTktfVVBfVElNRU9VVCAgICAgICAgICAgICA1MDAKKworI2RlZmluZSBFMTAwMF9UWF9CVUZGRVJfU0laRSAoKHVpbnQzMl90KTE1MTQpCisKKy8qIFRoZSBjYXJyaWVyIGV4dGVuc2lvbiBzeW1ib2wsIGFzIHJlY2VpdmVkIGJ5IHRoZSBOSUMuICovCisjZGVmaW5lIENBUlJJRVJfRVhURU5TSU9OICAgMHgwRgorCisvKiBUQklfQUNDRVBUIG1hY3JvIGRlZmluaXRpb246CisgKgorICogVGhpcyBtYWNybyByZXF1aXJlczoKKyAqICAgICAgYWRhcHRlciA9IGEgcG9pbnRlciB0byBzdHJ1Y3QgZTEwMDBfaHcgCisgKiAgICAgIHN0YXR1cyA9IHRoZSA4IGJpdCBzdGF0dXMgZmllbGQgb2YgdGhlIFJYIGRlc2NyaXB0b3Igd2l0aCBFT1Agc2V0CisgKiAgICAgIGVycm9yID0gdGhlIDggYml0IGVycm9yIGZpZWxkIG9mIHRoZSBSWCBkZXNjcmlwdG9yIHdpdGggRU9QIHNldAorICogICAgICBsZW5ndGggPSB0aGUgc3VtIG9mIGFsbCB0aGUgbGVuZ3RoIGZpZWxkcyBvZiB0aGUgUlggZGVzY3JpcHRvcnMgdGhhdAorICogICAgICAgICAgICAgICBtYWtlIHVwIHRoZSBjdXJyZW50IGZyYW1lCisgKiAgICAgIGxhc3RfYnl0ZSA9IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGZyYW1lIERNQWVkIGJ5IHRoZSBoYXJkd2FyZQorICogICAgICBtYXhfZnJhbWVfbGVuZ3RoID0gdGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICogICAgICBtaW5fZnJhbWVfbGVuZ3RoID0gdGhlIG1pbmltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICoKKyAqIFRoaXMgbWFjcm8gaXMgYSBjb25kaXRpb25hbCB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBpbnRlcnJ1cHQgCisgKiBoYW5kbGVyJ3MgUnggcHJvY2Vzc2luZyByb3V0aW5lIHdoZW4gUnhFcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkLgorICoKKyAqIFR5cGljYWwgdXNlOgorICogIC4uLgorICogIGlmIChUQklfQUNDRVBUKSB7CisgKiAgICAgIGFjY2VwdF9mcmFtZSA9IFRSVUU7CisgKiAgICAgIGUxMDAwX3RiaV9hZGp1c3Rfc3RhdHMoYWRhcHRlciwgTWFjQWRkcmVzcyk7CisgKiAgICAgIGZyYW1lX2xlbmd0aC0tOworICogIH0gZWxzZSB7CisgKiAgICAgIGFjY2VwdF9mcmFtZSA9IEZBTFNFOworICogIH0KKyAqICAuLi4KKyAqLworCisjZGVmaW5lIFRCSV9BQ0NFUFQoYWRhcHRlciwgc3RhdHVzLCBlcnJvcnMsIGxlbmd0aCwgbGFzdF9ieXRlKSBcCisgICAgKChhZGFwdGVyKS0+dGJpX2NvbXBhdGliaWxpdHlfb24gJiYgXAorICAgICAoKChlcnJvcnMpICYgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSykgPT0gRTEwMDBfUlhEX0VSUl9DRSkgJiYgXAorICAgICAoKGxhc3RfYnl0ZSkgPT0gQ0FSUklFUl9FWFRFTlNJT04pICYmIFwKKyAgICAgKCgoc3RhdHVzKSAmIEUxMDAwX1JYRF9TVEFUX1ZQKSA/IFwKKyAgICAgICAgICAoKChsZW5ndGgpID4gKChhZGFwdGVyKS0+bWluX2ZyYW1lX3NpemUgLSBWTEFOX1RBR19TSVpFKSkgJiYgXAorICAgICAgICAgICAoKGxlbmd0aCkgPD0gKChhZGFwdGVyKS0+bWF4X2ZyYW1lX3NpemUgKyAxKSkpIDogXAorICAgICAgICAgICgoKGxlbmd0aCkgPiAoYWRhcHRlciktPm1pbl9mcmFtZV9zaXplKSAmJiBcCisgICAgICAgICAgICgobGVuZ3RoKSA8PSAoKGFkYXB0ZXIpLT5tYXhfZnJhbWVfc2l6ZSArIFZMQU5fVEFHX1NJWkUgKyAxKSkpKSkKKworCisvKiBTdHJ1Y3R1cmVzLCBlbnVtcywgYW5kIG1hY3JvcyBmb3IgdGhlIFBIWSAqLworCisvKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBNYW5hZ2VtZW50IERhdGEgSU8gKE1ESU8pIGFuZCBNYW5hZ2VtZW50IERhdGEKKyAqIENsb2NrIChNREMpIHBpbnMgaW4gdGhlIERldmljZSBDb250cm9sIFJlZ2lzdGVyLgorICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JFU0VUX0RJUiAgRTEwMDBfQ1RSTF9TV0RQSU8wCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JFU0VUICAgICAgRTEwMDBfQ1RSTF9TV0RQSU4wCisjZGVmaW5lIEUxMDAwX0NUUkxfTURJT19ESVIgICAgICAgRTEwMDBfQ1RSTF9TV0RQSU8yCisjZGVmaW5lIEUxMDAwX0NUUkxfTURJTyAgICAgICAgICAgRTEwMDBfQ1RSTF9TV0RQSU4yCisjZGVmaW5lIEUxMDAwX0NUUkxfTURDX0RJUiAgICAgICAgRTEwMDBfQ1RSTF9TV0RQSU8zCisjZGVmaW5lIEUxMDAwX0NUUkxfTURDICAgICAgICAgICAgRTEwMDBfQ1RSTF9TV0RQSU4zCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JFU0VUX0RJUjQgRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVIKKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVQ0ICAgICBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEEKKworLyogUEhZIDEwMDAgTUlJIFJlZ2lzdGVyL0JpdCBEZWZpbml0aW9ucyAqLworLyogUEhZIFJlZ2lzdGVycyBkZWZpbmVkIGJ5IElFRUUgKi8KKyNkZWZpbmUgUEhZX0NUUkwgICAgICAgICAweDAwIC8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1NUQVRVUyAgICAgICAweDAxIC8qIFN0YXR1cyBSZWdpc2VyICovCisjZGVmaW5lIFBIWV9JRDEgICAgICAgICAgMHgwMiAvKiBQaHkgSWQgUmVnICh3b3JkIDEpICovCisjZGVmaW5lIFBIWV9JRDIgICAgICAgICAgMHgwMyAvKiBQaHkgSWQgUmVnICh3b3JkIDIpICovCisjZGVmaW5lIFBIWV9BVVRPTkVHX0FEViAgMHgwNCAvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX0xQX0FCSUxJVFkgICAweDA1IC8qIExpbmsgUGFydG5lciBBYmlsaXR5IChCYXNlIFBhZ2UpICovCisjZGVmaW5lIFBIWV9BVVRPTkVHX0VYUCAgMHgwNiAvKiBBdXRvbmVnIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX05FWFRfUEFHRV9UWCAweDA3IC8qIE5leHQgUGFnZSBUWCAqLworI2RlZmluZSBQSFlfTFBfTkVYVF9QQUdFIDB4MDggLyogTGluayBQYXJ0bmVyIE5leHQgUGFnZSAqLworI2RlZmluZSBQSFlfMTAwMFRfQ1RSTCAgIDB4MDkgLyogMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLworI2RlZmluZSBQSFlfMTAwMFRfU1RBVFVTIDB4MEEgLyogMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9FWFRfU1RBVFVTICAgMHgwRiAvKiBFeHRlbmRlZCBTdGF0dXMgUmVnICovCisKKy8qIE04OEUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMICAgICAweDEwICAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMgICAweDExICAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0lOVF9FTkFCTEUgICAgICAgIDB4MTIgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfSU5UX1NUQVRVUyAgICAgICAgMHgxMyAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCAweDE0ICAvKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLworI2RlZmluZSBNODhFMTAwMF9SWF9FUlJfQ05UUiAgICAgICAweDE1ICAvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKworI2RlZmluZSBNODhFMTAwMF9QSFlfRVhUX0NUUkwgICAgICAweDFBICAvKiBQSFkgZXh0ZW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNUICAgMHgxRCAgLyogUmVnIDI5IGZvciBwYWdlIG51bWJlciBzZXR0aW5nICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCAgIDB4MUUgIC8qIEl0cyBtZWFuaW5nIGRlcGVuZHMgb24gcmVnIDI5ICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDggIDB4MTAwIC8qIEJpdHMgOCAmIDExIGFyZSBhZGp1c3RlZCBmb3IgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTEgMHg4MDAgICAgLyogaW1wcm92ZWQgQkVSIHBlcmZvcm1hbmNlICovCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX1JFR1NfUEFHRSAgMHgwMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcgMHgzMzAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBICAgICAgMHgwMTQwCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUmVnaXN0ZXJzICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHIDB4MTAgLyogUEhZIFNwZWNpZmljIFBvcnQgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTIDB4MTEgLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwgICAweDEyIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRIIDB4MTMgLyogUEhZIExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GSUZPICAgICAgIDB4MTQgLyogR01JSSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfUVVBTElUWSAweDE1IC8qIFBIWSBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgICAgIDB4MUYgLyogUEhZIFBhZ2UgU2VsZWN0IENvcmUgUmVnaXN0ZXIgKi8KKworLyogSUdQMDFFMTAwMCBBR0MgUmVnaXN0ZXJzIC0gc3RvcmVzIHRoZSBjYWJsZSBsZW5ndGggdmFsdWVzKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0EgICAgICAgIDB4MTE3MgorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQiAgICAgICAgMHgxMjcyCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0NzIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MTg3MgorCisvKiBJR1AwMUUxMDAwIERTUCBSZXNldCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfUkVTRVQgICAweDFGMzMKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX1NFVCAgICAgMHgxRjcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUgICAgIDB4MUYzNQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICAgIDQKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0EgICAgMHgxMTcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9CICAgIDB4MTI3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQyAgICAweDE0NzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0QgICAgMHgxODcxCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWCAgICAgICAgMHhDMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0VEQUNfU0lHTl9FWFRfOV9CSVRTIDB4ODAwMAorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FOQUxPR19UWF9TVEFURSAgICAgIDB4Mjg5MAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BTkFMT0dfQ0xBU1NfQSAgICAgICAweDIwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRk9SQ0VfQU5BTE9HX0VOQUJMRSAgMHgwMDA0CisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfQ01fQ1AgICAgICAgIDB4MDA2OQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfREVGQVVMVCAgICAgIDB4MDAyQQorLyogSUdQMDFFMTAwMCBQQ1MgSW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgLSBzdG9yZXMgdGhlIHBvbGFyaXR5IHN0YXR1cyB3aGVuCisgKiBzcGVlZCA9IDEwMDAgTWJwcy4gKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHICAweDAwQjQKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUENTX0NUUkxfUkVHICAweDAwQjUKKworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19SRUdTX1BBR0UgIDB4MjBDMAorICAKKyNkZWZpbmUgTUFYX1BIWV9SRUdfQUREUkVTUyAweDFGICAgICAgICAvKiA1IGJpdCBhZGRyZXNzIGJ1cyAoMC0weDFGKSAqLworI2RlZmluZSBNQVhfUEhZX01VTFRJX1BBR0VfUkVHICAweEYgICAgIC8qUmVnaXN0ZXJzIHRoYXQgYXJlIGVxdWFsIG9uIGFsbCBwYWdlcyovCisvKiBQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQ1JfU1BFRURfU0VMRUNUX01TQiAweDAwNDAgIC8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfQ09MTF9URVNUX0VOQUJMRSAweDAwODAgIC8qIENvbGxpc2lvbiB0ZXN0IGVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfRlVMTF9EVVBMRVggICAgICAweDAxMDAgIC8qIEZEWCA9MSwgaGFsZiBkdXBsZXggPTAgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcgMHgwMjAwICAvKiBSZXN0YXJ0IGF1dG8gbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgTUlJX0NSX0lTT0xBVEUgICAgICAgICAgMHgwNDAwICAvKiBJc29sYXRlIFBIWSBmcm9tIE1JSSAqLworI2RlZmluZSBNSUlfQ1JfUE9XRVJfRE9XTiAgICAgICAweDA4MDAgIC8qIFBvd2VyIGRvd24gKi8KKyNkZWZpbmUgTUlJX0NSX0FVVE9fTkVHX0VOICAgICAgMHgxMDAwICAvKiBBdXRvIE5lZyBFbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9MU0IgMHgyMDAwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0xPT1BCQUNLICAgICAgICAgMHg0MDAwICAvKiAwID0gbm9ybWFsLCAxID0gbG9vcGJhY2sgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU0VUICAgICAgICAgICAgMHg4MDAwICAvKiAwID0gbm9ybWFsLCAxID0gUEhZIHJlc2V0ICovCisKKy8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX0NBUFMgICAgIDB4MDAwMSAvKiBFeHRlbmRlZCByZWdpc3RlciBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgTUlJX1NSX0pBQkJFUl9ERVRFQ1QgICAgIDB4MDAwMiAvKiBKYWJiZXIgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0xJTktfU1RBVFVTICAgICAgIDB4MDAwNCAvKiBMaW5rIFN0YXR1cyAxID0gbGluayAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DQVBTICAgICAgMHgwMDA4IC8qIEF1dG8gTmVnIENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1JFTU9URV9GQVVMVCAgICAgIDB4MDAxMCAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ICovCisjZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFICAweDAwMjAgLyogQXV0byBOZWcgQ29tcGxldGUgKi8KKyNkZWZpbmUgTUlJX1NSX1BSRUFNQkxFX1NVUFBSRVNTIDB4MDA0MCAvKiBQcmVhbWJsZSBtYXkgYmUgc3VwcHJlc3NlZCAqLworI2RlZmluZSBNSUlfU1JfRVhURU5ERURfU1RBVFVTICAgMHgwMTAwIC8qIEV4dC4gc3RhdHVzIGluZm8gaW4gUmVnIDB4MEYgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQyX0hEX0NBUFMgICAgIDB4MDIwMCAvKiAxMDBUMiBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9GRF9DQVBTICAgICAweDA0MDAgLyogMTAwVDIgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTBUX0hEX0NBUFMgICAgICAgMHgwODAwIC8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9GRF9DQVBTICAgICAgIDB4MTAwMCAvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0hEX0NBUFMgICAgICAweDIwMDAgLyogMTAwWCAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9GRF9DQVBTICAgICAgMHg0MDAwIC8qIDEwMFggIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQ0X0NBUFMgICAgICAgIDB4ODAwMCAvKiAxMDBUNCBDYXBhYmxlICovCisKKy8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworI2RlZmluZSBOV0FZX0FSX1NFTEVDVE9SX0ZJRUxEIDB4MDAwMSAgIC8qIGluZGljYXRlcyBJRUVFIDgwMi4zIENTTUEvQ0QgKi8KKyNkZWZpbmUgTldBWV9BUl8xMFRfSERfQ0FQUyAgICAweDAwMjAgICAvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwICAgLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MCAgIC8qIDEwMFRYIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUWF9GRF9DQVBTICAweDAxMDAgICAvKiAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwICAgLyogMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSX1BBVVNFICAgICAgICAgIDB4MDQwMCAgIC8qIFBhdXNlIG9wZXJhdGlvbiBkZXNpcmVkICovCisjZGVmaW5lIE5XQVlfQVJfQVNNX0RJUiAgICAgICAgMHgwODAwICAgLyogQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIE5XQVlfQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwICAgLyogUmVtb3RlIEZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIE5XQVlfQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwICAgLyogTmV4dCBQYWdlIGFiaWxpdHkgc3VwcG9ydGVkICovCisKKy8qIExpbmsgUGFydG5lciBBYmlsaXR5IFJlZ2lzdGVyIChCYXNlIFBhZ2UpICovCisjZGVmaW5lIE5XQVlfTFBBUl9TRUxFQ1RPUl9GSUVMRCAweDAwMDAgLyogTFAgcHJvdG9jb2wgc2VsZWN0b3IgZmllbGQgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwVF9IRF9DQVBTICAgIDB4MDAyMCAvKiBMUCBpcyAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMFRfRkRfQ0FQUyAgICAweDAwNDAgLyogTFAgaXMgMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVFhfSERfQ0FQUyAgMHgwMDgwIC8qIExQIGlzIDEwMFRYIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0ZEX0NBUFMgIDB4MDEwMCAvKiBMUCBpcyAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUNF9DQVBTICAgICAweDAyMDAgLyogTFAgaXMgMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfUEFVU0UgICAgICAgICAgMHgwNDAwIC8qIExQIFBhdXNlIG9wZXJhdGlvbiBkZXNpcmVkICovCisjZGVmaW5lIE5XQVlfTFBBUl9BU01fRElSICAgICAgICAweDA4MDAgLyogTFAgQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIE5XQVlfTFBBUl9SRU1PVEVfRkFVTFQgICAweDIwMDAgLyogTFAgaGFzIGRldGVjdGVkIFJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBOV0FZX0xQQVJfQUNLTk9XTEVER0UgICAgMHg0MDAwIC8qIExQIGhhcyByeCdkIGxpbmsgY29kZSB3b3JkICovCisjZGVmaW5lIE5XQVlfTFBBUl9ORVhUX1BBR0UgICAgICAweDgwMDAgLyogTmV4dCBQYWdlIGFiaWxpdHkgc3VwcG9ydGVkICovCisKKy8qIEF1dG9uZWcgRXhwYW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIE5XQVlfRVJfTFBfTldBWV9DQVBTICAgICAgMHgwMDAxIC8qIExQIGhhcyBBdXRvIE5lZyBDYXBhYmlsaXR5ICovCisjZGVmaW5lIE5XQVlfRVJfUEFHRV9SWEQgICAgICAgICAgMHgwMDAyIC8qIExQIGlzIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9ORVhUX1BBR0VfQ0FQUyAgICAweDAwMDQgLyogTFAgaXMgMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX0xQX05FWFRfUEFHRV9DQVBTIDB4MDAwOCAvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfUEFSX0RFVEVDVF9GQVVMVCAgMHgwMDEwIC8qIExQIGlzIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKworLyogTmV4dCBQYWdlIFRYIFJlZ2lzdGVyICovCisjZGVmaW5lIE5QVFhfTVNHX0NPREVfRklFTEQgMHgwMDAxIC8qIE5QIG1zZyBjb2RlIG9yIHVuZm9ybWF0dGVkIGRhdGEgKi8KKyNkZWZpbmUgTlBUWF9UT0dHTEUgICAgICAgICAweDA4MDAgLyogVG9nZ2xlcyBiZXR3ZWVuIGV4Y2hhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBkaWZmZXJlbnQgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5QVFhfQUNLTk9XTERHRTIgICAgMHgxMDAwIC8qIDEgPSB3aWxsIGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gY2Fubm90IGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlBUWF9NU0dfUEFHRSAgICAgICAweDIwMDAgLyogZm9ybWF0dGVkKDEpL3VuZm9ybWF0dGVkKDApIHBnICovCisjZGVmaW5lIE5QVFhfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIDEgPSBhZGRpdGlvbiBOUCB3aWxsIGZvbGxvdyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IHNlbmRpbmcgbGFzdCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTGluayBQYXJ0bmVyIE5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBMUF9STlBSX01TR19DT0RFX0ZJRUxEIDB4MDAwMSAvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIExQX1JOUFJfVE9HR0xFICAgICAgICAgMHgwODAwIC8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZGlmZmVyZW50IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UyICAgIDB4MTAwMCAvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBjYW5ub3QgY29tcGx5IHdpdGggbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUF9STlBSX01TR19QQUdFICAgICAgIDB4MjAwMCAgLyogZm9ybWF0dGVkKDEpL3VuZm9ybWF0dGVkKDApIHBnICovCisjZGVmaW5lIExQX1JOUFJfQUNLTk9XTERHRSAgICAgMHg0MDAwICAvKiAxID0gQUNLIC8gMCA9IE5PIEFDSyAqLworI2RlZmluZSBMUF9STlBSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAgLyogMSA9IGFkZGl0aW9uIE5QIHdpbGwgZm9sbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gc2VuZGluZyBsYXN0IE5QIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIDEwMDBCQVNFLVQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDUl8xMDAwVF9BU1lNX1BBVVNFICAgICAgMHgwMDgwIC8qIEFkdmVydGlzZSBhc3ltbWV0cmljIHBhdXNlIGJpdCAqLworI2RlZmluZSBDUl8xMDAwVF9IRF9DQVBTICAgICAgICAgMHgwMTAwIC8qIEFkdmVydGlzZSAxMDAwVCBIRCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIENSXzEwMDBUX0ZEX0NBUFMgICAgICAgICAweDAyMDAgLyogQWR2ZXJ0aXNlIDEwMDBUIEZEIGNhcGFiaWxpdHkgICovCisjZGVmaW5lIENSXzEwMDBUX1JFUEVBVEVSX0RURSAgICAweDA0MDAgLyogMT1SZXBlYXRlci9zd2l0Y2ggZGV2aWNlIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPURURSBkZXZpY2UgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfTVNfVkFMVUUgICAgICAgIDB4MDgwMCAvKiAxPUNvbmZpZ3VyZSBQSFkgYXMgTWFzdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1Db25maWd1cmUgUEhZIGFzIFNsYXZlICovCisjZGVmaW5lIENSXzEwMDBUX01TX0VOQUJMRSAgICAgICAweDEwMDAgLyogMT1NYXN0ZXIvU2xhdmUgbWFudWFsIGNvbmZpZyB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9QXV0b21hdGljIE1hc3Rlci9TbGF2ZSBjb25maWcgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFX05PUk1BTCAweDAwMDAgLyogTm9ybWFsIE9wZXJhdGlvbiAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMSAgICAgMHgyMDAwIC8qIFRyYW5zbWl0IFdhdmVmb3JtIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzIgICAgIDB4NDAwMCAvKiBNYXN0ZXIgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzMgICAgIDB4NjAwMCAvKiBTbGF2ZSBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfNCAgICAgMHg4MDAwIC8qIFRyYW5zbWl0dGVyIERpc3RvcnRpb24gdGVzdCAqLworCisvKiAxMDAwQkFTRS1UIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTUl8xMDAwVF9JRExFX0VSUk9SX0NOVCAgIDB4MDBGRiAvKiBOdW0gaWRsZSBlcnJvcnMgc2luY2UgbGFzdCByZWFkICovCisjZGVmaW5lIFNSXzEwMDBUX0FTWU1fUEFVU0VfRElSICAgMHgwMTAwIC8qIExQIGFzeW1tZXRyaWMgcGF1c2UgZGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBTUl8xMDAwVF9MUF9IRF9DQVBTICAgICAgIDB4MDQwMCAvKiBMUCBpcyAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIFNSXzEwMDBUX0xQX0ZEX0NBUFMgICAgICAgMHgwODAwIC8qIExQIGlzIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUyAweDEwMDAgLyogUmVtb3RlIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUyAgMHgyMDAwIC8qIExvY2FsIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19SRVMgICAgMHg0MDAwIC8qIDE9TG9jYWwgVFggaXMgTWFzdGVyLCAwPVNsYXZlICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCAgMHg4MDAwIC8qIE1hc3Rlci9TbGF2ZSBjb25maWcgZmF1bHQgKi8KKyNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCAxMgorI2RlZmluZSBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQgIDEzCisjZGVmaW5lIFNSXzEwMDBUX1BIWV9FWENFU1NJVkVfSURMRV9FUlJfQ09VTlQgICAgNQorI2RlZmluZSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8yMCAgICAgICAgICAgIDIwCisjZGVmaW5lIEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzEwMCAgICAgICAgICAgMTAwCisKKy8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9IRF9DQVBTIDB4MTAwMCAvKiAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBUX0ZEX0NBUFMgMHgyMDAwIC8qIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfSERfQ0FQUyAweDQwMDAgLyogMTAwMFggSEQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwWF9GRF9DQVBTIDB4ODAwMCAvKiAxMDAwWCBGRCBjYXBhYmxlICovCisKKyNkZWZpbmUgUEhZX1RYX1BPTEFSSVRZX01BU0sgICAweDAxMDAgLyogcmVnaXN0ZXIgMTBoIGJpdCA4IChwb2xhcml0eSBiaXQpICovCisjZGVmaW5lIFBIWV9UWF9OT1JNQUxfUE9MQVJJVFkgMCAgICAgIC8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAobm9ybWFsIHBvbGFyaXR5KSAqLworCisjZGVmaW5lIEFVVE9fUE9MQVJJVFlfRElTQUJMRSAgMHgwMDEwIC8qIHJlZ2lzdGVyIDExaCBiaXQgNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoMD1lbmFibGUsIDE9ZGlzYWJsZSkgKi8KKworLyogTTg4RTEwMDAgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9KQUJCRVJfRElTQUJMRSAgICAweDAwMDEgLyogMT1KYWJiZXIgRnVuY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTCAweDAwMDIgLyogMT1Qb2xhcml0eSBSZXZlcnNhbCBlbmFibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfU1FFX1RFU1QgICAgICAgICAgMHgwMDA0IC8qIDE9U1FFIFRlc3QgZW5hYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0NMSzEyNV9ESVNBQkxFICAgIDB4MDAxMCAvKiAxPUNMSzEyNSBsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPUNMSzEyNSB0b2dnbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREUgIDB4MDAwMCAgLyogTURJIENyb3Nzb3ZlciBNb2RlIGJpdHMgNjo1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREUgMHgwMDIwICAvKiBNYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUICAgICAweDAwNDAgIC8qIDEwMDBCQVNFLVQ6IEF1dG8gY3Jvc3NvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgMTAwQkFTRS1UWC8xMEJBU0UtVDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBNREkgTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERSAgICAgIDB4MDA2MCAgLyogQXV0byBjcm9zc292ZXIgZW5hYmxlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsIHNwZWVkcy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFIDB4MDA4MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPUVuYWJsZSBFeHRlbmRlZCAxMEJBU0UtVCBkaXN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChMb3dlciAxMEJBU0UtVCBSWCBUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1Ob3JtYWwgMTBCQVNFLVQgUlggVGhyZXNob2xkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfTUlJXzVCSVRfRU5BQkxFICAgICAgMHgwMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMT01LUJpdCBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9TUlJIGludGVyZmFjZSBpbiAxMDBCQVNFLVRYICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfU0NSQU1CTEVSX0RJU0FCTEUgICAgMHgwMjAwIC8qIDE9U2NyYW1ibGVyIGRpc2FibGUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9GT1JDRV9MSU5LX0dPT0QgICAgICAweDA0MDAgLyogMT1Gb3JjZSBsaW5rIGdvb2QgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYICAgICAweDA4MDAgLyogMT1Bc3NlcnQgQ1JTIG9uIFRyYW5zbWl0ICovCisKKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9TSElGVCAgICAxCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YX01PREVfU0hJRlQgICAgICAgICAgNQorI2RlZmluZSBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFX1NISUZUIDcKKworLyogTTg4RTEwMDAgUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0pBQkJFUiAgICAgICAgICAgICAweDAwMDEgLyogMT1KYWJiZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkgICAgICAgMHgwMDAyIC8qIDE9UG9sYXJpdHkgcmV2ZXJzZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlQgICAgICAgICAgMHgwMDIwIC8qIDE9RG93bnNoaWZ0ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9NRElYICAgICAgICAgICAgICAgMHgwMDQwIC8qIDE9TURJWDsgMD1NREkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEggICAgICAgMHgwMzgwIC8qIDA9PDUwTTsxPTUwLTgwTTsyPTgwLTExME07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMz0xMTAtMTQwTTs0PT4xNDBNICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTElOSyAgICAgICAgICAgICAgIDB4MDQwMCAvKiAxPUxpbmsgdXAsIDA9TGluayBkb3duICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfU1BEX0RQTFhfUkVTT0xWRUQgIDB4MDgwMCAvKiAxPVNwZWVkICYgRHVwbGV4IHJlc29sdmVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUEFHRV9SQ1ZEICAgICAgICAgIDB4MTAwMCAvKiAxPVBhZ2UgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9EUExYICAgICAgICAgICAgICAgMHgyMDAwIC8qIDE9RHVwbGV4IDA9SGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9TUEVFRCAgICAgICAgICAgICAgMHhDMDAwIC8qIFNwZWVkLCBiaXRzIDE0OjE1ICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTBNQlMgICAgICAgICAgICAgIDB4MDAwMCAvKiAwMD0xME1icyAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwME1CUyAgICAgICAgICAgICAweDQwMDAgLyogMDE9MTAwTWJzICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTAwME1CUyAgICAgICAgICAgIDB4ODAwMCAvKiAxMD0xMDAwTWJzICovCisKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFlfU0hJRlQgMQorI2RlZmluZSBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVCAgICA1CisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTURJWF9TSElGVCAgICAgICAgIDYKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQgNworCisvKiBNODhFMTAwMCBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9GSUJFUl9MT09QQkFDSyAweDQwMDAgLyogMT1GaWJlciBsb29wYmFjayAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9ET1dOX05PX0lETEUgICAweDgwMDAgLyogMT1Mb3N0IGxvY2sgZGV0ZWN0IGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBXaWxsIGFzc2VydCBsb3N0IGxvY2sgYW5kIGJyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIGRvd24gaWYgaWRsZSBub3Qgc2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aGluIDFtcyBpbiAxMDAwQkFTRS1UIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOdW1iZXIgb2YgdGltZXMgd2Ugd2lsbCBhdHRlbXB0IHRvIGF1dG9uZWdvdGlhdGUgYmVmb3JlIGRvd25zaGlmdGluZyBpZiB3ZQorICogYXJlIHRoZSBtYXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF9NQVNLIDB4MEMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYICAgMHgwMDAwICAgIAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzJYICAgMHgwNDAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfM1ggICAweDA4MDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF80WCAgIDB4MEMwMAorLyogTnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgYXR0ZW1wdCB0byBhdXRvbmVnb3RpYXRlIGJlZm9yZSBkb3duc2hpZnRpbmcgaWYgd2UKKyAqIGFyZSB0aGUgc2xhdmUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX01BU0sgIDB4MDMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfRElTICAgMHgwMDAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8xWCAgICAweDAxMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzJYICAgIDB4MDIwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfM1ggICAgMHgwMzAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18yXzUgICAgIDB4MDA2MCAvKiAyLjUgTUh6IFRYX0NMSyAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjUgICAgICAweDAwNzAgLyogMjUgIE1IeiBUWF9DTEsgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzAgICAgICAgMHgwMDAwIC8qIE5PICBUWF9DTEsgKi8KKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IENvbmZpZyBSZWdpc3RlciAtIFIvVyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0FVVE9fTURJWF9QQVJfREVURUNUICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9QUkVfRU4gICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0RJU0FCTEVfVFBMT09QQkFDSyAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX0pBQkJFUiAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfRElTQUJMRV9UUkFOU01JVCAgICAgIDB4MjAwMAorCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgU3RhdHVzIFJlZ2lzdGVyIC0gUi9PICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9BVVRPTkVHX0ZBSUxFRCAgICAgICAgIDB4MDAwMSAvKiBSTyBMSCBTQyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQgICAgICAweDAwMDIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCAgICAgICAgICAgMHgwMDdDCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9GVUxMX0RVUExFWCAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfTElOS19VUCAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVggICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLICAgICAgICAgICAgIDB4QzAwMCAvKiBzcGVlZCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwTUJQUyAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDBNQlBTICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMgICAgICAgICAweEMwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCAgICAgMHgwMDAyIC8qIHNoaWZ0IHJpZ2h0IDIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICAgICAgMHgwMDBCIC8qIHNoaWZ0IHJpZ2h0IDExICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb250cm9sIFJlZ2lzdGVyIC0gUi9XICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9UUF9MT09QQkFDSyAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQ09SUkVDVF9OQ19TQ01CTFIgICAgICAweDAyMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX1RFTl9DUlNfU0VMRUNUICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9GTElQX0NISVAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYICAgICAgICAgMHgyMDAwIC8qIDAtTURJLCAxLU1ESVggKi8KKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9TU19ET1dOR1JBREUgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfR0lHX1NDUkFNQkxFUl9FUlJPUiAgICAweDQwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0dJR19SRU1fUkNWUl9OT0sgICAgICAgMHgwODAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9JRExFX0VSUk9SX0NOVF9PRkxPVyAgIDB4MDQwMCAvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfREFUQV9FUlJfMSAgICAgICAgICAgICAweDAyMDAgLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0RBVEFfRVJSXzAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9BVVRPTkVHX0ZBVUxUICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfQVVUT05FR19BQ1RJVkUgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfRCAgICAgICAgMHgwMDA0CisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0MgICAgICAgIDB4MDAwMgorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9CICAgICAgICAweDAwMDEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfQSAgICAgICAgMHgwMDAwCisKKy8qIElHUDAxRTEwMDAgQ2hhbm5lbCBRdWFsaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfRCAgICAgICAgMHgwMDBGCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQyAgICAgICAgMHgwMEYwCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQiAgICAgICAgMHgwRjAwCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQSAgICAgICAgMHhGMDAwCisKKy8qIElHUDAxRTEwMDAgRFNQIHJlc2V0IG1hY3JvcyAqLworI2RlZmluZSBEU1BfUkVTRVRfRU5BQkxFICAgICAweDAKKyNkZWZpbmUgRFNQX1JFU0VUX0RJU0FCTEUgICAgMHgyCisjZGVmaW5lIEUxMDAwX01BWF9EU1BfUkVTRVRTIDEwCisKKy8qIElHUDAxRTEwMDAgQUdDIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3ICAgICAgICAgLyogQ29hcnNlIC0gMTM6MTEsIEZpbmUgLSAxMDo3ICovCisKKy8qIDcgYml0cyAoMyBDb2Fyc2UgKyA0IEZpbmUpIC0tPiAxMjggb3B0aW9uYWwgdmFsdWVzICovCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIDEyOAorCisvKiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBsZW5ndGggaXMgKy8tIDEwIG1ldGVycyAqLworI2RlZmluZSBJR1AwMUUxMDAwX0FHQ19SQU5HRSAgICAxMAorCisvKiBJR1AwMUUxMDAwIFBDUyBJbml0aWFsaXphdGlvbiByZWdpc3RlciAqLworLyogYml0cyAzOjYgaW4gdGhlIFBDUyByZWdpc3RlcnMgc3RvcmVzIHRoZSBjaGFubmVscyBwb2xhcml0eSAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT0xBUklUWV9NQVNLICAgIDB4MDA3OAorCisvKiBJR1AwMUUxMDAwIEdNSUkgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQgICAgICAgICAgICAgICAweDEwIC8qIEVuYWJsZSBmbGV4aWJsZSBzcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uIExpbmstVXAgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX1NQRCAgICAgICAgICAgICAgICAgICAgMHgyMCAvKiBFbmFibGUgU1BEICovCisKKy8qIElHUDAxRTEwMDAgQW5hbG9nIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfU1RBVFVTICAgICAgICAgMHgyMEQxCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTICAgICAgICAgICAgICAgMHgyMEQwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09OVFJPTCAgICAgICAgICAgICAgMHgyMERDCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQllQQVNTICAgICAgICAgICAgICAgMHgyMERFCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9QT0xZX01BU0sgICAgICAgICAgICAweEYwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0sgICAgICAgICAgICAweDBGODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfTUFTSyAgICAgICAgICAweDAwNzAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEICAgICAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9FTkFCTEVfU1dfQ09OVFJPTCAgICAweDAwMDIKKworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0ggICAgICAgIDB4MDA0MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTAgICAgICAgICAgICAgIDB4MDUwMAorCisvKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHZhbGlkIFBIWSBJRHMuICovCisjZGVmaW5lIE04OEUxMDAwX0VfUEhZX0lEICAweDAxNDEwQzUwCisjZGVmaW5lIE04OEUxMDAwX0lfUEhZX0lEICAweDAxNDEwQzMwCisjZGVmaW5lIE04OEUxMDExX0lfUEhZX0lEICAweDAxNDEwQzIwCisjZGVmaW5lIElHUDAxRTEwMDBfSV9QSFlfSUQgIDB4MDJBODAzODAKKyNkZWZpbmUgTTg4RTEwMDBfMTJfUEhZX0lEIE04OEUxMDAwX0VfUEhZX0lECisjZGVmaW5lIE04OEUxMDAwXzE0X1BIWV9JRCBNODhFMTAwMF9FX1BIWV9JRAorI2RlZmluZSBNODhFMTAxMV9JX1JFVl80ICAgMHgwNAorCisvKiBNaXNjZWxsYW5lb3VzIFBIWSBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIFBIWV9QUkVBTUJMRSAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBQSFlfU09GICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUEhZX09QX1JFQUQgICAgICAgICAweDAyCisjZGVmaW5lIFBIWV9PUF9XUklURSAgICAgICAgMHgwMQorI2RlZmluZSBQSFlfVFVSTkFST1VORCAgICAgIDB4MDIKKyNkZWZpbmUgUEhZX1BSRUFNQkxFX1NJWkUgICAzMgorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwMCAgIDB4MDA0MAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwICAgIDB4MjAwMAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAgICAgIDB4MDAwMAorI2RlZmluZSBFMTAwMF9QSFlfQUREUkVTUyAgIDB4MDEKKyNkZWZpbmUgUEhZX0FVVE9fTkVHX1RJTUUgICA0NSAgLyogNC41IFNlY29uZHMgKi8KKyNkZWZpbmUgUEhZX0ZPUkNFX1RJTUUgICAgICAyMCAgLyogMi4wIFNlY29uZHMgKi8KKyNkZWZpbmUgUEhZX1JFVklTSU9OX01BU0sgICAweEZGRkZGRkYwCisjZGVmaW5lIERFVklDRV9TUEVFRF9NQVNLICAgMHgwMDAwMDMwMCAgLyogRGV2aWNlIEN0cmwgUmVnIFNwZWVkIE1hc2sgKi8KKyNkZWZpbmUgUkVHNF9TUEVFRF9NQVNLICAgICAweDAxRTAKKyNkZWZpbmUgUkVHOV9TUEVFRF9NQVNLICAgICAweDAzMDAKKyNkZWZpbmUgQURWRVJUSVNFXzEwX0hBTEYgICAweDAwMDEKKyNkZWZpbmUgQURWRVJUSVNFXzEwX0ZVTEwgICAweDAwMDIKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9IQUxGICAweDAwMDQKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9GVUxMICAweDAwMDgKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfSEFMRiAweDAwMTAKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfRlVMTCAweDAwMjAKKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVCAweDAwMkYgIC8qIEV2ZXJ5dGhpbmcgYnV0IDEwMDAtSGFsZiAqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMICAgIDB4MDAwRgkvKiBBbGwgMTAvMTAwIHNwZWVkcyovCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFXzEwX0FMTCAgICAgICAgMHgwMDAzCS8qIDEwTWJwcyBGdWxsICYgSGFsZiBzcGVlZHMqLworCisjZW5kaWYgLyogX0UxMDAwX0hXX0hfICovCkluZGV4OiBiL25ldGJvb3QvZWVwcm8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvZWVwcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi1JbnRlbCBFRVBSTy8xMCBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKLUFkYXB0ZWQgZnJvbSBMaW51eCBlZXByby5jIGZyb20ga2VybmVsIDIuMi4xNwotCi1UaGlzIGJvYXJkIGFjY2VwdHMgYSAzMiBwaW4gRUVQUk9NICgyOUMyNTYpLCBob3dldmVyIGEgdGVzdCB3aXRoIGEKLTI3QzAxMCBzaG93cyB0aGF0IHRoaXMgRVBST00gYWxzbyB3b3JrcyBpbiB0aGUgc29ja2V0LCBidXQgaXQncyBub3QgY2xlYXIKLWhvdyByZXBlYXRhYmx5LiBUaGUgdHdvIHRvcCBhZGRyZXNzIHBpbnMgYXBwZWFyIHRvIGJlIGhlbGQgbG93LCB0aHVzCi10aGUgYm90dG9tIDMya0Igb2YgdGhlIDI3QzAxMCBpcyB2aXNpYmxlIGluIHRoZSBDUFUncyBhZGRyZXNzIHNwYWNlLgotVG8gYmUgc3VyZSB5b3UgY291bGQgcHV0IDQgY29waWVzIG9mIHRoZSBjb2RlIGluIHRoZSAyN0MwMTAsIHRoZW4KLWl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIGV4dHJhIGxpbmVzIGFyZSBoZWxkIGxvdyBvciBoaWdoLCBqdXN0Ci1ob3BlZnVsbHkgbm90IGZsb2F0aW5nIGFzIENNT1MgY2hpcHMgZG9uJ3QgbGlrZSBmbG9hdGluZyBpbnB1dHMuCi0KLUJlIGNhcmVmdWwgd2l0aCBzZWF0aW5nIHRoZSBFUFJPTSBhcyB0aGUgc29ja2V0IG9uIG15IGJvYXJkIGFjdHVhbGx5Ci1oYXMgMzQgcGlucywgdGhlIHRvcCByb3cgb2YgMiBhcmUgbm90IHVzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLwotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KLSNpbmNsdWRlICJuaWMuaCIKLS8qIHRvIGdldCBvdXIgb3duIHByb3RvdHlwZSAqLwotI2luY2x1ZGUgImNhcmRzLmgiCi0vKiB3ZSB1c2UgdGltZXIyIGZvciBtaWNyb3NlY29uZCB3YWl0cyAqLwotI2luY2x1ZGUgInRpbWVyLmgiCi0KLSN1bmRlZglERUJVRwkJLyogb25seSBhZnRlciBpbmNsdWRlIGZpbGVzICovCi0KLS8qIERpZmZlcmVudCA4MjU5NSBjaGlwcyAqLwotI2RlZmluZSBMQU41OTUJCTAKLSNkZWZpbmUgTEFONTk1VFgJMQotI2RlZmluZSBMQU41OTVGWAkyCi0jZGVmaW5lIExBTjU5NUZYXzEwSVNBCTMKLQotI2RlZmluZQlTTE9XX0RPV04JaW5iKDB4ODApOwotCi0vKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBJRGluZyB0aGUgYm9hcmQuICovCi0jZGVmaW5lIFNBX0FERFIwIDB4MDAJLyogRXRoZXJleHByZXNzIFByby8xMCAqLwotI2RlZmluZSBTQV9BRERSMSAweGFhCi0jZGVmaW5lIFNBX0FERFIyIDB4MDAKLQotI2RlZmluZSBHZXRCaXQoeCx5KSAoKHggJiAoMTw8eSkpPj55KQotCi0vKiBFRVBST00gV29yZCAwOiAqLwotI2RlZmluZSBlZV9QblAgICAgICAgMCAgLyogUGx1ZyAnbiBQbGF5IGVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgZWVfV29yZDEgICAgIDEgIC8qIFdvcmQgMT8gKi8KLSNkZWZpbmUgZWVfQnVzV2lkdGggIDIgIC8qIDgvMTYgYml0ICovCi0jZGVmaW5lIGVlX0ZsYXNoQWRkciAzICAvKiBGbGFzaCBBZGRyZXNzICovCi0jZGVmaW5lIGVlX0ZsYXNoTWFzayAweDcgICAvKiBNYXNrICovCi0jZGVmaW5lIGVlX0F1dG9JTyAgICA2ICAvKiAqLwotI2RlZmluZSBlZV9yZXNlcnZlZDAgNyAgLyogPTAhICovCi0jZGVmaW5lIGVlX0ZsYXNoICAgICA4ICAvKiBGbGFzaCB0aGVyZT8gKi8KLSNkZWZpbmUgZWVfQXV0b05lZyAgIDkgIC8qIEF1dG8gTmVnb3RpYXRpb24gZW5hYmxlZD8gKi8KLSNkZWZpbmUgZWVfSU8wICAgICAgIDEwIC8qIElPIEFkZHJlc3MgTFNCICovCi0jZGVmaW5lIGVlX0lPME1hc2sgICAweCAvKi4uLiovCi0jZGVmaW5lIGVlX0lPMSAgICAgICAxNSAvKiBJTyBNU0IgKi8KLQotLyogRUVQUk9NIFdvcmQgMTogKi8KLSNkZWZpbmUgZWVfSW50U2VsICAgIDAgICAvKiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgZWVfSW50TWFzayAgIDB4NwotI2RlZmluZSBlZV9MSSAgICAgICAgMyAgIC8qIExpbmsgSW50ZWdyaXR5IDA9IGVuYWJsZWQgKi8KLSNkZWZpbmUgZWVfUEMgICAgICAgIDQgICAvKiBQb2xhcml0eSBDb3JyZWN0aW9uIDA9IGVuYWJsZWQgKi8KLSNkZWZpbmUgZWVfVFBFX0FVSSAgIDUgICAvKiBQb3J0U2VsZWN0aW9uIDE9VFBFICovCi0jZGVmaW5lIGVlX0phYmJlciAgICA2ICAgLyogSmFiYmVyIHByZXZlbnRpb24gMD0gZW5hYmxlZCAqLwotI2RlZmluZSBlZV9BdXRvUG9ydCAgNyAgIC8qIEF1dG8gUG9ydCBTZWxlY3Rpb24gMT0gRGlzYWJsZWQgKi8KLSNkZWZpbmUgZWVfU01PVVQgICAgIDggICAvKiBTTW91dCBQaW4gQ29udHJvbCAwPSBJbnB1dCAqLwotI2RlZmluZSBlZV9QUk9NICAgICAgOSAgIC8qIEZsYXNoIEVQUk9NIC8gUFJPTSAwPUZsYXNoICovCi0jZGVmaW5lIGVlX3Jlc2VydmVkMSAxMCAgLyogLi4gMTIgPTAhICovCi0jZGVmaW5lIGVlX0FsdFJlYWR5ICAxMyAgLyogQWx0ZXJuYXRlIFJlYWR5LCAwPW5vcm1hbCAqLwotI2RlZmluZSBlZV9yZXNlcnZlZDIgMTQgIC8qID0wISAqLwotI2RlZmluZSBlZV9EdXBsZXggICAgMTUKLQotLyogV29yZDIsMyw0OiAqLwotI2RlZmluZSBlZV9JQTUgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotI2RlZmluZSBlZV9JQTQgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotI2RlZmluZSBlZV9JQTMgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotI2RlZmluZSBlZV9JQTIgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotI2RlZmluZSBlZV9JQTEgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotI2RlZmluZSBlZV9JQTAgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLwotCi0vKiBXb3JkIDU6ICovCi0jZGVmaW5lIGVlX0JOQ19UUEUgICAwIC8qIDA9VFBFICovCi0jZGVmaW5lIGVlX0Jvb3RUeXBlICAxIC8qIDAwPU5vbmUsIDAxPUlQWCwgMTA9T0RJLCAxMT1ORElTICovCi0jZGVmaW5lIGVlX0Jvb3RUeXBlTWFzayAweDMgCi0jZGVmaW5lIGVlX051bUNvbm4gICAzICAvKiBOdW1iZXIgb2YgQ29ubmVjdGlvbnMgMD0gT25lIG9yIFR3byAqLwotI2RlZmluZSBlZV9GbGFzaFNvY2sgNCAgLyogUHJlc2VuY2Ugb2YgRmxhc2ggU29ja2V0IDA9IFByZXNlbnQgKi8KLSNkZWZpbmUgZWVfUG9ydFRQRSAgIDUKLSNkZWZpbmUgZWVfUG9ydEJOQyAgIDYKLSNkZWZpbmUgZWVfUG9ydEFVSSAgIDcKLSNkZWZpbmUgZWVfUG93ZXJNZ3QgIDEwIC8qIDA9IGRpc2FibGVkICovCi0jZGVmaW5lIGVlX0NQICAgICAgICAxMyAvKiBDb25jdXJyZW50IFByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgZWVfQ1BNYXNrICAgIDB4NwotCi0vKiBXb3JkIDY6ICovCi0jZGVmaW5lIGVlX1N0ZXBwaW5nICAwIC8qIFN0ZXBwaW5nIGluZm8gKi8KLSNkZWZpbmUgZWVfU3RlcE1hc2sgIDB4MEYKLSNkZWZpbmUgZWVfQm9hcmRJRCAgIDQgLyogTWFudWNhdHVyZXIgQm9hcmQgSUQsIHJlc2VydmVkICovCi0jZGVmaW5lIGVlX0JvYXJkTWFzayAweDBGRkYKLQotLyogV29yZCA3OiAqLwotI2RlZmluZSBlZV9JTlRfVE9fSVJRIDAgLyogaW50IHRvIElSUSBNYXBwaW5nICA9IDB4MUVCOCBmb3IgUHJvLzEwKyAqLwotI2RlZmluZSBlZV9GWF9JTlQySVJRIDB4MUVCOCAvKiB0aGUgX29ubHlfIG1hcHBpbmcgYWxsb3dlZCBmb3IgRlggY2hpcHMgKi8KLQotLyouLiovCi0jZGVmaW5lIGVlX1NJWkUgMHg0MCAvKiB0b3RhbCBFRXByb20gU2l6ZSAqLwotI2RlZmluZSBlZV9DaGVja3N1bSAweEJBQkEgLyogaW5pdGlhbCBhbmQgZmluYWwgdmFsdWUgZm9yIGFkZGluZyBjaGVja3N1bSAqLwotCi0KLS8qIENhcmQgaWRlbnRpZmljYXRpb24gdmlhIEVFcHJvbTogICAqLwotI2RlZmluZSBlZV9hZGRyX3ZlbmRvciAweDEwICAvKiBXb3JkIG9mZnNldCBmb3IgRUlTQSBWZW5kb3IgSUQgKi8KLSNkZWZpbmUgZWVfYWRkcl9pZCAweDExICAgICAgLyogV29yZCBvZmZzZXQgZm9yIENhcmQgSUQgKi8KLSNkZWZpbmUgZWVfYWRkcl9TTiAweDEyICAgICAgLyogU2VyaWFsIE51bWJlciAqLwotI2RlZmluZSBlZV9hZGRyX0NSQ184IDB4MTQgICAvKiBDUkMgb3ZlciBsYXN0IHRoZWUgQnl0ZXMgKi8KLQotCi0jZGVmaW5lIGVlX3ZlbmRvcl9pbnRlbDAgMHgyNSAgLyogVmVuZG9yIElEIEludGVsICovCi0jZGVmaW5lIGVlX3ZlbmRvcl9pbnRlbDEgMHhENAotI2RlZmluZSBlZV9pZF9lZXBybzEwcDAgMHgxMCAgIC8qIElEIGZvciBlZXByby8xMCsgKi8KLSNkZWZpbmUgZWVfaWRfZWVwcm8xMHAxIDB4MzEKLQotLyogbm93IHRoaXMgc2VjdGlvbiBjb3VsZCBiZSB1c2VkIGJ5IGJvdGggYm9hcmRzOiB0aGUgb2xkaWVzIGFuZCB0aGUgZWUxMDoKLSAqIGVlMTAgdXNlcyB0eCBidWZmZXIgYmVmb3JlIG9mIHJ4IGJ1ZmZlciBhbmQgdGhlIG9sZGllcyB0aGUgaW52ZXJzZS4KLSAqIChhcmlzKQotICovCi0jZGVmaW5lCVJBTV9TSVpFCTB4ODAwMAotCi0jZGVmaW5lCVJDVl9IRUFERVIJOAotI2RlZmluZSBSQ1ZfREVGQVVMVF9SQU0JMHg2MDAwCi0jZGVmaW5lIFJDVl9SQU0gCXJjdl9yYW0KLQotc3RhdGljIHVuc2lnbmVkIHJjdl9yYW0gPSBSQ1ZfREVGQVVMVF9SQU07Ci0KLSNkZWZpbmUgWE1UX0hFQURFUgk4Ci0jZGVmaW5lIFhNVF9SQU0JCShSQU1fU0laRSAtIFJDVl9SQU0pCi0KLSNkZWZpbmUgWE1UX1NUQVJUCSgocmN2X3N0YXJ0ICsgUkNWX1JBTSkgJSBSQU1fU0laRSkKLQotI2RlZmluZSBSQ1ZfTE9XRVJfTElNSVQJKHJjdl9zdGFydCA+PiA4KQotI2RlZmluZSBSQ1ZfVVBQRVJfTElNSVQJKCgocmN2X3N0YXJ0ICsgUkNWX1JBTSkgLSAyKSA+PiA4KQotI2RlZmluZSBYTVRfTE9XRVJfTElNSVQJKFhNVF9TVEFSVCA+PiA4KQotI2RlZmluZSBYTVRfVVBQRVJfTElNSVQJKCgoWE1UX1NUQVJUICsgWE1UX1JBTSkgLSAyKSA+PiA4KQotCi0jZGVmaW5lIFJDVl9TVEFSVF9QUk8JMHgwMAotI2RlZmluZSBSQ1ZfU1RBUlRfMTAJWE1UX1JBTQotCQkJCQkvKiBieSBkZWZhdWx0IHRoZSBvbGQgZHJpdmVyICovCi1zdGF0aWMgdW5zaWduZWQgcmN2X3N0YXJ0ID0gUkNWX1NUQVJUX1BSTzsKLQotI2RlZmluZQlSQ1ZfRE9ORQkweDAwMDgKLSNkZWZpbmUJUlhfT0sJCTB4MjAwMAotI2RlZmluZQlSWF9FUlJPUgkweDBkODEKLQotI2RlZmluZQlUWF9ET05FX0JJVAkweDAwODAKLSNkZWZpbmUJQ0hBSU5fQklUCTB4ODAwMAotI2RlZmluZQlYTVRfU1RBVFVTCTB4MDIKLSNkZWZpbmUJWE1UX0NIQUlOCTB4MDQKLSNkZWZpbmUJWE1UX0NPVU5UCTB4MDYKLQotI2RlZmluZQlCQU5LMF9TRUxFQ1QJMHgwMAkJCi0jZGVmaW5lCUJBTksxX1NFTEVDVAkweDQwCQkKLSNkZWZpbmUJQkFOSzJfU0VMRUNUCTB4ODAJCQotCi0vKiBCYW5rIDAgcmVnaXN0ZXJzICovCi0jZGVmaW5lCUNPTU1BTkRfUkVHCTB4MDAJLyogUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlNQ19TRVRVUAkweDAzCi0jZGVmaW5lCVhNVF9DTUQJCTB4MDQKLSNkZWZpbmUJRElBR05PU0VfQ01ECTB4MDcKLSNkZWZpbmUJUkNWX0VOQUJMRV9DTUQJMHgwOAotI2RlZmluZQlSQ1ZfRElTQUJMRV9DTUQJMHgwYQotI2RlZmluZQlTVE9QX1JDVl9DTUQJMHgwYgotI2RlZmluZQlSRVNFVF9DTUQJMHgwZQotI2RlZmluZQlQT1dFUl9ET1dOX0NNRAkweDE4Ci0jZGVmaW5lCVJFU1VNRV9YTVRfQ01ECTB4MWMKLSNkZWZpbmUJU0VMX1JFU0VUX0NNRAkweDFlCi0jZGVmaW5lCVNUQVRVU19SRUcJMHgwMQkvKiBSZWdpc3RlciAxICovCi0jZGVmaW5lCVJYX0lOVAkJMHgwMgotI2RlZmluZQlUWF9JTlQJCTB4MDQKLSNkZWZpbmUJRVhFQ19TVEFUVVMJMHgzMAotI2RlZmluZQlJRF9SRUcJCTB4MDIJLyogUmVnaXN0ZXIgMgkqLwotI2RlZmluZQlSX1JPQklOX0JJVFMJMHhjMAkvKiByb3VuZCByb2JpbiBjb3VudGVyICovCi0jZGVmaW5lCUlEX1JFR19NQVNLCTB4MmMKLSNkZWZpbmUJSURfUkVHX1NJRwkweDI0Ci0jZGVmaW5lCUFVVE9fRU5BQkxFCTB4MTAKLSNkZWZpbmUJSU5UX01BU0tfUkVHCTB4MDMJLyogUmVnaXN0ZXIgMwkqLwotI2RlZmluZQlSWF9TVE9QX01BU0sJMHgwMQotI2RlZmluZQlSWF9NQVNLCQkweDAyCi0jZGVmaW5lCVRYX01BU0sJCTB4MDQKLSNkZWZpbmUJRVhFQ19NQVNLCTB4MDgKLSNkZWZpbmUJQUxMX01BU0sJMHgwZgotI2RlZmluZQlJT18zMl9CSVQJMHgxMAotI2RlZmluZQlSQ1ZfQkFSCQkweDA0CS8qIFRoZSBmb2xsb3dpbmcgYXJlIHdvcmQgKDE2LWJpdCkgcmVnaXN0ZXJzICovCi0jZGVmaW5lCVJDVl9TVE9QCTB4MDYKLQotI2RlZmluZQlYTVRfQkFSX1BSTwkweDBhCi0jZGVmaW5lCVhNVF9CQVJfMTAJMHgwYgotc3RhdGljIHVuc2lnbmVkIHhtdF9iYXIgPSBYTVRfQkFSX1BSTzsKLQotI2RlZmluZQlIT1NUX0FERFJFU1NfUkVHCTB4MGMKLSNkZWZpbmUJSU9fUE9SVAkJMHgwZQotI2RlZmluZQlJT19QT1JUXzMyX0JJVAkweDBjCi0KLS8qIEJhbmsgMSByZWdpc3RlcnMgKi8KLSNkZWZpbmUJUkVHMQkweDAxCi0jZGVmaW5lCVdPUkRfV0lEVEgJMHgwMgotI2RlZmluZQlJTlRfRU5BQkxFCTB4ODAKLSNkZWZpbmUgSU5UX05PX1JFRwkweDAyCi0jZGVmaW5lCVJDVl9MT1dFUl9MSU1JVF9SRUcJMHgwOAotI2RlZmluZQlSQ1ZfVVBQRVJfTElNSVRfUkVHCTB4MDkKLQotI2RlZmluZQlYTVRfTE9XRVJfTElNSVRfUkVHX1BSTwkweDBhCi0jZGVmaW5lCVhNVF9VUFBFUl9MSU1JVF9SRUdfUFJPCTB4MGIKLSNkZWZpbmUJWE1UX0xPV0VSX0xJTUlUX1JFR18xMAkweDBiCi0jZGVmaW5lCVhNVF9VUFBFUl9MSU1JVF9SRUdfMTAJMHgwYQotc3RhdGljIHVuc2lnbmVkIHhtdF9sb3dlcl9saW1pdF9yZWcgPSBYTVRfTE9XRVJfTElNSVRfUkVHX1BSTzsKLXN0YXRpYyB1bnNpZ25lZCB4bXRfdXBwZXJfbGltaXRfcmVnID0gWE1UX1VQUEVSX0xJTUlUX1JFR19QUk87Ci0KLS8qIEJhbmsgMiByZWdpc3RlcnMgKi8KLSNkZWZpbmUJWE1UX0NoYWluX0ludAkweDIwCS8qIEludGVycnVwdCBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc21pdCBjaGFpbiAqLwotI2RlZmluZQlYTVRfQ2hhaW5fRXJyU3RvcAkweDQwIC8qIEludGVycnVwdCBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbiBldmVuIGlmIHRoZXJlIGFyZSBlcnJvcnMgKi8KLSNkZWZpbmUJUkNWX0Rpc2NhcmRfQmFkRnJhbWUJMHg4MCAvKiBUaHJvdyBiYWQgZnJhbWVzIGF3YXksIGFuZCBjb250aW51ZSB0byByZWNlaXZlIG90aGVycyAqLwotI2RlZmluZQlSRUcyCQkweDAyCi0jZGVmaW5lCVBSTVNDX01vZGUJMHgwMQotI2RlZmluZQlNdWx0aV9JQQkweDIwCi0jZGVmaW5lCVJFRzMJCTB4MDMKLSNkZWZpbmUJVFBFX0JJVAkJMHgwNAotI2RlZmluZQlCTkNfQklUCQkweDIwCi0jZGVmaW5lCVJFRzEzCQkweDBkCi0jZGVmaW5lCUZEWAkJMHgwMAotI2RlZmluZQlBX05fRU5BQkxFCTB4MDIKLQkKLSNkZWZpbmUJSV9BRERfUkVHMAkweDA0Ci0jZGVmaW5lCUlfQUREX1JFRzEJMHgwNQotI2RlZmluZQlJX0FERF9SRUcyCTB4MDYKLSNkZWZpbmUJSV9BRERfUkVHMwkweDA3Ci0jZGVmaW5lCUlfQUREX1JFRzQJMHgwOAotI2RlZmluZQlJX0FERF9SRUc1CTB4MDkKLQotI2RlZmluZSBFRVBST01fUkVHX1BSTwkweDBhCi0jZGVmaW5lIEVFUFJPTV9SRUdfMTAJMHgwYgotc3RhdGljIHVuc2lnbmVkIGVlcHJvbV9yZWcgPSBFRVBST01fUkVHX1BSTzsKLQotI2RlZmluZSBFRVNLIDB4MDEKLSNkZWZpbmUgRUVDUyAweDAyCi0jZGVmaW5lIEVFREkgMHgwNAotI2RlZmluZSBFRURPIDB4MDgKLQotLyogVGhlIGhvcnJpYmxlIHJvdXRpbmUgdG8gcmVhZCBhIHdvcmQgZnJvbSB0aGUgc2VyaWFsIEVFUFJPTS4gKi8KLS8qIElNUE9SVEFOVCAtIHRoZSA4MjU5NSB3aWxsIGJlIHNldCB0byBCYW5rIDAgYWZ0ZXIgdGhlIGVlcHJvbSBpcyByZWFkICovCi0KLS8qIFRoZSBkZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4gKi8KLSNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgeyB1ZGVsYXkoNDApOyB9Ci0jZGVmaW5lIEVFX1JFQURfQ01EICg2IDw8IDYpCi0KLS8qIGRvIGEgZnVsbCByZXNldCAqLwotI2RlZmluZSBlZXByb19mdWxsX3Jlc2V0KGlvYWRkcikJb3V0YihSRVNFVF9DTUQsIGlvYWRkcik7IHVkZWxheSg0MCk7Ci0KLS8qIGRvIGEgbmljZSByZXNldCAqLwotI2RlZmluZSBlZXByb19zZWxfcmVzZXQoaW9hZGRyKSAJeyBcCi0JCQkJCW91dGIoU0VMX1JFU0VUX0NNRCwgaW9hZGRyKTsgXAotCQkJCQlTTE9XX0RPV047IFwKLQkJCQkJU0xPV19ET1dOOyBcCi0JCQkJCX0KLQotLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KLSNkZWZpbmUJZWVwcm9fY2xlYXJfaW50KGlvYWRkcikJb3V0YihBTExfTUFTSywgaW9hZGRyICsgU1RBVFVTX1JFRykKLQotLyogZW5hYmxlIHJ4ICovCi0jZGVmaW5lCWVlcHJvX2VuX3J4KGlvYWRkcikJb3V0YihSQ1ZfRU5BQkxFX0NNRCwgaW9hZGRyKQotCi0vKiBkaXNhYmxlIHJ4ICovCi0jZGVmaW5lCWVlcHJvX2Rpc19yeChpb2FkZHIpCW91dGIoUkNWX0RJU0FCTEVfQ01ELCBpb2FkZHIpCi0KLS8qIHN3aXRjaCBiYW5rICovCi0jZGVmaW5lIGVlcHJvX3N3MmJhbmswKGlvYWRkcikgb3V0YihCQU5LMF9TRUxFQ1QsIGlvYWRkcikKLSNkZWZpbmUgZWVwcm9fc3cyYmFuazEoaW9hZGRyKSBvdXRiKEJBTksxX1NFTEVDVCwgaW9hZGRyKQotI2RlZmluZSBlZXByb19zdzJiYW5rMihpb2FkZHIpIG91dGIoQkFOSzJfU0VMRUNULCBpb2FkZHIpCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQJcnhfc3RhcnQsIHR4X3N0YXJ0Owotc3RhdGljIGludAkJdHhfbGFzdDsKLXN0YXRpYyB1bnNpZ25lZAkJdHhfZW5kOwotc3RhdGljIGludAkJZWVwcm8gPSAwOwotc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYWRkciA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50CW1lbV9zdGFydCwgbWVtX2VuZCA9IFJDVl9ERUZBVUxUX1JBTSAvIDEwMjQ7Ci0KLSNkZWZpbmUJdWRlbGF5KG4pCXdhaXRvbl90aW1lcjIoKChuKSpUSUNLU19QRVJfTVMpLzEwMDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlZXByb19yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQl0ZW1wX3JlZywgaTsKLQotCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLwotCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7CS8qIGJlIGNhcmVmdWwsIGJhbmsyIG5vdyAqLwotCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIGVlcHJvbV9yZWcpOwotI2lmZGVmCURFQlVHCi0JcHJpbnRmKCJTdGVwcGluZyAlZFxuIiwgdGVtcF9yZWcgPj4gNSk7Ci0jZW5kaWYKLQlpZiAodGVtcF9yZWcgJiAweDEwKQkvKiBjaGVjayB0aGUgVHVybk9mZiBFbmFibGUgYml0ICovCi0JCW91dGIodGVtcF9yZWcgJiAweEVGLCBpb2FkZHIgKyBlZXByb21fcmVnKTsKLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykJLyogZmlsbCB0aGUgTUFDIGFkZHJlc3MgKi8KLQkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgaW9hZGRyICsgSV9BRERfUkVHMCArIGkpOwotCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzEpOwotCS8qIHNldHVwIFRyYW5zbWl0IENoYWluaW5nIGFuZCBkaXNjYXJkIGJhZCBSQ1YgZnJhbWVzICovCi0Jb3V0Yih0ZW1wX3JlZyB8IFhNVF9DaGFpbl9JbnQgfCBYTVRfQ2hhaW5fRXJyU3RvcAotCQl8IFJDVl9EaXNjYXJkX0JhZEZyYW1lLCBpb2FkZHIgKyBSRUcxKTsKLQl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBSRUcyKTsJCS8qIG1hdGNoIGJyb2FkY2FzdCAqLwotCW91dGIodGVtcF9yZWcgfCAweDE0LCBpb2FkZHIgKyBSRUcyKTsKLQl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBSRUczKTsKLQlvdXRiKHRlbXBfcmVnICYgMHgzRiwgaW9hZGRyICsgUkVHMyk7CS8qIGNsZWFyIHRlc3QgbW9kZSAqLwotCS8qIHNldCB0aGUgcmVjZWl2aW5nIG1vZGUgKi8KLQllZXByb19zdzJiYW5rMShpb2FkZHIpOwkvKiBiZSBjYXJlZnVsLCBiYW5rMSBub3cgKi8KLQkvKiBpbml0aWFsaXNlIHRoZSBSQ1YgYW5kIFhNVCB1cHBlciBhbmQgbG93ZXIgbGltaXRzICovCi0Jb3V0YihSQ1ZfTE9XRVJfTElNSVQsIGlvYWRkciArIFJDVl9MT1dFUl9MSU1JVF9SRUcpOwotCW91dGIoUkNWX1VQUEVSX0xJTUlULCBpb2FkZHIgKyBSQ1ZfVVBQRVJfTElNSVRfUkVHKTsKLQlvdXRiKFhNVF9MT1dFUl9MSU1JVCwgaW9hZGRyICsgeG10X2xvd2VyX2xpbWl0X3JlZyk7Ci0Jb3V0YihYTVRfVVBQRVJfTElNSVQsIGlvYWRkciArIHhtdF91cHBlcl9saW1pdF9yZWcpOwotCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CS8qIFN3aXRjaCBiYWNrIHRvIGJhbmsgMCAqLwotCWVlcHJvX2NsZWFyX2ludChpb2FkZHIpOwotCS8qIEluaXRpYWxpc2UgUkNWICovCi0Jb3V0dyhyeF9zdGFydCA9IChSQ1ZfTE9XRVJfTElNSVQgPDwgOCksIGlvYWRkciArIFJDVl9CQVIpOwotCW91dHcoKChSQ1ZfVVBQRVJfTElNSVQgPDwgOCkgfCAweEZFKSwgaW9hZGRyICsgUkNWX1NUT1ApOwotCS8qIEludGlhbGlzZSBYTVQgKi8KLQlvdXR3KChYTVRfTE9XRVJfTElNSVQgPDwgOCksIGlvYWRkciArIHhtdF9iYXIpOwotCWVlcHJvX3NlbF9yZXNldChpb2FkZHIpOwotCXR4X3N0YXJ0ID0gdHhfZW5kID0gKFhNVF9MT1dFUl9MSU1JVCA8PCA4KTsKLQl0eF9sYXN0ID0gMDsKLQllZXByb19lbl9yeChpb2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBPTEwgLSBXYWl0IGZvciBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGVlcHJvX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJaTsKLQl1bnNpZ25lZCBpbnQJcmN2X2NhciA9IHJ4X3N0YXJ0OwotCXVuc2lnbmVkIGludAlyY3ZfZXZlbnQsIHJjdl9zdGF0dXMsIHJjdl9uZXh0X2ZyYW1lLCByY3Zfc2l6ZTsKLQotCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KLQkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLwotCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCi0jaWYJMAotCWlmICgoaW5iKGlvYWRkciArIFNUQVRVU19SRUcpICYgMHg0MCkgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQlvdXRiKDB4NDAsIGlvYWRkciArIFNUQVRVU19SRUcpOwotI2VuZGlmCi0Jb3V0dyhyY3ZfY2FyLCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKLQlyY3ZfZXZlbnQgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7Ci0JaWYgKHJjdl9ldmVudCAhPSBSQ1ZfRE9ORSkKLQkJcmV0dXJuICgwKTsKLQlyY3Zfc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpOwotCXJjdl9uZXh0X2ZyYW1lID0gaW53KGlvYWRkciArIElPX1BPUlQpOwotCXJjdl9zaXplID0gaW53KGlvYWRkciArIElPX1BPUlQpOwotI2lmCTAKLQlwcmludGYoIiVoWCAlaFggJWQgJWhoWFxuIiwgcmN2X3N0YXR1cywgcmN2X25leHRfZnJhbWUsIHJjdl9zaXplLAotCQlpbmIoaW9hZGRyICsgU1RBVFVTX1JFRykpOwotI2VuZGlmCi0JaWYgKChyY3Zfc3RhdHVzICYgKFJYX09LfFJYX0VSUk9SKSkgIT0gUlhfT0spIHsKLQkJcHJpbnRmKCJSZWNlaXZlIGVycm9yICVoWFxuIiwgcmN2X3N0YXR1cyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCXJjdl9zaXplICY9IDB4M0ZGRjsKLQlpbnN3KGlvYWRkciArIElPX1BPUlQsIG5pYy0+cGFja2V0LCAoKHJjdl9zaXplICsgMykgPj4gMSkpOwotI2lmCTAKLQlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewotCQlwcmludGYoIiVoaFgiLCBuaWMtPnBhY2tldFtpXSk7Ci0JCXB1dGNoYXIoaSAlIDE2ID09IDE1ID8gJ1xuJyA6ICcgJyk7Ci0JfQotI2VuZGlmCi0JbmljLT5wYWNrZXRsZW4gPSByY3Zfc2l6ZTsKLQlyY3ZfY2FyID0gcnhfc3RhcnQgKyBSQ1ZfSEVBREVSICsgcmN2X3NpemU7Ci0Jcnhfc3RhcnQgPSByY3ZfbmV4dF9mcmFtZTsKLQlpZiAocmN2X2NhciA9PSAwKQotCQlyY3ZfY2FyID0gKChSQ1ZfVVBQRVJfTElNSVQgPDwgOCkgfCAweGZmKTsKLQlvdXR3KHJjdl9jYXIgLSAxLCBpb2FkZHIgKyBSQ1ZfU1RPUCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVlcHJvX3RyYW5zbWl0KAotCXN0cnVjdCBuaWMgKm5pYywKLQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwotCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCXVuc2lnbmVkIGludAlzdGF0dXMsIHR4X2F2YWlsYWJsZSwgbGFzdCwgZW5kLCBsZW5ndGg7Ci0JdW5zaWduZWQgc2hvcnQJdHlwZTsKLQlpbnQJCWJvZ3VzY291bnQgPSAyMDsKLQotCWxlbmd0aCA9IHMgKyBFVEhfSExFTjsKLQlpZiAodHhfZW5kID4gdHhfc3RhcnQpCi0JCXR4X2F2YWlsYWJsZSA9IFhNVF9SQU0gLSAodHhfZW5kIC0gdHhfc3RhcnQpOwotCWVsc2UgaWYgKHR4X2VuZCA8IHR4X3N0YXJ0KQotCQl0eF9hdmFpbGFibGUgPSB0eF9zdGFydCAtIHR4X2VuZDsKLQllbHNlCi0JCXR4X2F2YWlsYWJsZSA9IFhNVF9SQU07Ci0JbGFzdCA9IHR4X2VuZDsKLQllbmQgPSBsYXN0ICsgKCgobGVuZ3RoICsgMykgPj4gMSkgPDwgMSkgKyBYTVRfSEVBREVSOwotCWlmIChlbmQgPj0gKFhNVF9VUFBFUl9MSU1JVCA8PCA4KSkgewotCQlsYXN0ID0gKFhNVF9MT1dFUl9MSU1JVCA8PCA4KTsKLQkJZW5kID0gbGFzdCArICgoKGxlbmd0aCArIDMpID4+IDEpIDw8IDEpICsgWE1UX0hFQURFUjsKLQl9Ci0Jb3V0dyhsYXN0LCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKLQlvdXR3KFhNVF9DTUQsIGlvYWRkciArIElPX1BPUlQpOwotCW91dHcoMCwgaW9hZGRyICsgSU9fUE9SVCk7Ci0Jb3V0dyhlbmQsIGlvYWRkciArIElPX1BPUlQpOwotCW91dHcobGVuZ3RoLCBpb2FkZHIgKyBJT19QT1JUKTsKLQlvdXRzdyhpb2FkZHIgKyBJT19QT1JULCBkLCBFVEhfQUxFTiAvIDIpOwotCW91dHN3KGlvYWRkciArIElPX1BPUlQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiAvIDIpOwotCXR5cGUgPSBodG9ucyh0KTsKLQlvdXRzdyhpb2FkZHIgKyBJT19QT1JULCAmdHlwZSwgc2l6ZW9mKHR5cGUpIC8gMik7Ci0Jb3V0c3coaW9hZGRyICsgSU9fUE9SVCwgcCwgKHMgKyAzKSA+PiAxKTsKLQkvKiBBIGR1bW15IHJlYWQgdG8gZmx1c2ggdGhlIERSQU0gd3JpdGUgcGlwZWxpbmUgKi8KLQlzdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7Ci0Jb3V0dyhsYXN0LCBpb2FkZHIgKyB4bXRfYmFyKTsKLQlvdXRiKFhNVF9DTUQsIGlvYWRkcik7Ci0JdHhfc3RhcnQgPSBsYXN0OwotCXR4X2xhc3QgPSBsYXN0OwotCXR4X2VuZCA9IGVuZDsKLSNpZgkwCi0JcHJpbnRmKCIlZCAlZFxuIiwgdHhfc3RhcnQsIHR4X2VuZCk7Ci0jZW5kaWYKLQl3aGlsZSAoYm9ndXNjb3VudCA+IDApIHsKLQkJaWYgKCgoc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpKSAmIFRYX0RPTkVfQklUKSA9PSAwKSB7Ci0JCQl1ZGVsYXkoNDApOwotCQkJYm9ndXNjb3VudC0tOwotCQkJY29udGludWU7Ci0JCX0KLSNpZglERUJVRwotCQlpZiAoKHN0YXR1cyAmIDB4MjAwMCkgPT0gMCkKLQkJCXByaW50ZigiVHJhbnNtaXQgc3RhdHVzICVoWFxuIiwgc3RhdHVzKTsKLSNlbmRpZgotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlZXByb19kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQllZXByb19zdzJiYW5rMChpb2FkZHIpOwkvKiBTd2l0Y2ggdG8gYmFuayAwICovCi0JLyogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4ICovCi0Jb3V0YihTVE9QX1JDVl9DTUQsIGlvYWRkcik7Ci0JdHhfc3RhcnQgPSB0eF9lbmQgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOwotCXR4X2xhc3QgPSAwOwotCS8qIFJlc2V0IHRoZSA4MjU5NSAqLwotCWVlcHJvX2Z1bGxfcmVzZXQoaW9hZGRyKTsKLX0KLQotc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCi17Ci0JaW50CQlpOwotCXVuc2lnbmVkIHNob3J0CXJldHZhbCA9IDA7Ci0JaW50CQllZV9hZGRyID0gaW9hZGRyICsgZWVwcm9tX3JlZzsKLQlpbnQJCXJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SRUFEX0NNRDsKLQlpbnQJCWN0cmxfdmFsID0gRUVDUzsKLQotCWlmIChlZXBybyA9PSBMQU41OTVGWF8xMElTQSkgewotCQllZXByb19zdzJiYW5rMShpb2FkZHIpOwotCQlvdXRiKDB4MDAsIGlvYWRkciArIFNUQVRVU19SRUcpOwotCX0KLQllZXByb19zdzJiYW5rMihpb2FkZHIpOwotCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOwotCS8qIHNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQgKi8KLQlmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgewotCQlzaG9ydCBvdXR2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBjdHJsX3ZhbCB8IEVFREkgOiBjdHJsX3ZhbDsKLQkJb3V0YihvdXR2YWwsIGVlX2FkZHIpOwotCQlvdXRiKG91dHZhbCB8IEVFU0ssIGVlX2FkZHIpOwkvKiBFRVBST00gY2xvY2sgdGljayAqLwotCQllZXByb21fZGVsYXkoKTsKLQkJb3V0YihvdXR2YWwsIGVlX2FkZHIpOwkJLyogZmluaXNoIEVFUFJPTSBjbG9jayB0aWNrICovCi0JCWVlcHJvbV9kZWxheSgpOwotCX0KLQlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKLQlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgewotCQlvdXRiKGN0cmxfdmFsIHwgRUVTSywgZWVfYWRkcik7Ci0JCWVlcHJvbV9kZWxheSgpOwotCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoZWVfYWRkcikgJiBFRURPKSA/IDEgOiAwKTsKLQkJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7Ci0JCWVlcHJvbV9kZWxheSgpOwotCX0KLQkvKiB0ZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MgKi8KLQljdHJsX3ZhbCAmPSB+RUVDUzsKLQlvdXRiKGN0cmxfdmFsIHwgRUVTSywgZWVfYWRkcik7Ci0JZWVwcm9tX2RlbGF5KCk7Ci0Jb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7Ci0JZWVwcm9tX2RlbGF5KCk7Ci0JZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsKLQlyZXR1cm4gKHJldHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgZWVwcm9fcHJvYmUxKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCWksIGlkLCBjb3VudGVyLCBsX2VlcHJvID0gMDsKLQl1bmlvbiB7Ci0JCXVuc2lnbmVkIGNoYXIJY2FkZHJbRVRIX0FMRU5dOwotCQl1bnNpZ25lZCBzaG9ydAlzYWRkcltFVEhfQUxFTi8yXTsKLQl9IHN0YXRpb25fYWRkcjsKLQljaGFyCQkqbmFtZTsKLQotCWlkID0gaW5iKGlvYWRkciArIElEX1JFRyk7Ci0JaWYgKChpZCAmIElEX1JFR19NQVNLKSAhPSBJRF9SRUdfU0lHKQotCQlyZXR1cm4gKDApOwotCWNvdW50ZXIgPSBpZCAmIFJfUk9CSU5fQklUUzsKLQlpZiAoKChpZCA9IGluYihpb2FkZHIgKyBJRF9SRUcpKSAmIFJfUk9CSU5fQklUUykgIT0gKGNvdW50ZXIgKyAweDQwKSkKLQkJcmV0dXJuICgwKTsKLQkvKiB5ZXMgdGhlIDgyNTk1IGhhcyBiZWVuIGZvdW5kICovCi0Jc3RhdGlvbl9hZGRyLnNhZGRyWzJdID0gcmVhZF9lZXByb20oMik7Ci0JaWYgKHN0YXRpb25fYWRkci5zYWRkclsyXSA9PSAweDAwMDAgfHwgc3RhdGlvbl9hZGRyLnNhZGRyWzJdID09IDB4RkZGRikgewotCQlsX2VlcHJvID0gMzsKLQkJZWVwcm8gPSBMQU41OTVGWF8xMElTQTsKLQkJZWVwcm9tX3JlZz0gRUVQUk9NX1JFR18xMDsKLQkJcmN2X3N0YXJ0ID0gUkNWX1NUQVJUXzEwOwotCQl4bXRfbG93ZXJfbGltaXRfcmVnID0gWE1UX0xPV0VSX0xJTUlUX1JFR18xMDsKLQkJeG10X3VwcGVyX2xpbWl0X3JlZyA9IFhNVF9VUFBFUl9MSU1JVF9SRUdfMTA7Ci0JCXN0YXRpb25fYWRkci5zYWRkclsyXSA9IHJlYWRfZWVwcm9tKDIpOwotCX0KLQlzdGF0aW9uX2FkZHIuc2FkZHJbMV0gPSByZWFkX2VlcHJvbSgzKTsKLQlzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPSByZWFkX2VlcHJvbSg0KTsKLQlpZiAobF9lZXBybykKLQkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgMTAgSVNBIjsKLQllbHNlIGlmIChyZWFkX2VlcHJvbSg3KSA9PSBlZV9GWF9JTlQySVJRKSB7Ci0JCW5hbWUgPSAiSW50ZWwgRXRoZXJFeHByZXNzIFByby8xMCsgSVNBIjsKLQkJbF9lZXBybyA9IDI7Ci0JfSBlbHNlIGlmIChzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPT0gU0FfQUREUjEpIHsKLQkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwIElTQSI7Ci0JCWxfZWVwcm8gPSAxOwotCX0gZWxzZSB7Ci0JCWxfZWVwcm8gPSAwOwotCQluYW1lID0gIkludGVsIDgyNTk1LWJhc2VkIExBTiBjYXJkIjsKLQl9Ci0Jc3RhdGlvbl9hZGRyLnNhZGRyWzBdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclswXSk7Ci0Jc3RhdGlvbl9hZGRyLnNhZGRyWzFdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclsxXSk7Ci0Jc3RhdGlvbl9hZGRyLnNhZGRyWzJdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclsyXSk7Ci0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBzdGF0aW9uX2FkZHIuY2FkZHJbaV07Ci0JfQotCXByaW50ZigiXG4lcyBpb2FkZHIgJSNoWCwgYWRkciAlISIsIG5hbWUsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOwotCW1lbV9zdGFydCA9IFJDVl9MT1dFUl9MSU1JVCA8PCA4OwotCWlmICgobWVtX2VuZCAmIDB4M0YpIDwgMyB8fCAobWVtX2VuZCAmIDB4M0YpID4gMjkpCi0JCW1lbV9lbmQgPSBSQ1ZfVVBQRVJfTElNSVQgPDwgODsKLQllbHNlIHsKLQkJbWVtX2VuZCA9IG1lbV9lbmQgKiAxMDI0ICsgKFJDVl9MT1dFUl9MSU1JVCA8PCA4KTsKLQkJcmN2X3JhbSA9IG1lbV9lbmQgLSAoUkNWX0xPV0VSX0xJTUlUIDw8IDgpOwotCX0KLQlwcmludGYoIiwgUnggbWVtICVkSywgaWYgJXNcbiIsIChtZW1fZW5kIC0gbWVtX3N0YXJ0KSA+PiAxMCwKLQkJR2V0Qml0KHJlYWRfZWVwcm9tKDUpLCBlZV9CTkNfVFBFKSA/ICJCTkMiIDogIlRQIik7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKmVlcHJvX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQkvKiBzYW1lIHByb2JlIGxpc3QgYXMgdGhlIExpbnV4IGRyaXZlciAqLwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb2FkZHJzW10gPSB7Ci0JCTB4MzAwLCAweDIxMCwgMHgyNDAsIDB4MjgwLCAweDJDMCwgMHgyMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB9OwotCi0JaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBpb2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7IHArKykgewotCQlpZiAoZWVwcm9fcHJvYmUxKG5pYykpCi0JCQlicmVhazsKLQl9Ci0JaWYgKCpwID09IDApCi0JCXJldHVybiAoMCk7Ci0JZWVwcm9fcmVzZXQobmljKTsKLQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQluaWMtPnJlc2V0ID0gZWVwcm9fcmVzZXQ7Ci0JbmljLT5wb2xsID0gZWVwcm9fcG9sbDsKLQluaWMtPnRyYW5zbWl0ID0gZWVwcm9fdHJhbnNtaXQ7Ci0JbmljLT5kaXNhYmxlID0gZWVwcm9fZGlzYWJsZTsKLQlyZXR1cm4gKG5pYyk7Ci19CkluZGV4OiBiL25ldGJvb3QvZWVwcm8xMDAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvZWVwcm8xMDAuYworKysgYi9uZXRib290L2VlcHJvMTAwLmMKQEAgLTgwLDggKzgwLDggQEAKICAqCiAgKiBDYXZlYXRzOgogICoKLSAqIFRoZSBldGhlcmJvb3QgZnJhbWV3b3JrIG1vdmVzIHRoZSBjb2RlIHRvIHRoZSAzMmsgc2VnbWVudCBmcm9tCi0gKiAweDk4MDAwIHRvIDB4YTAwMDAuIFRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgcm9vbSBiZXR3ZWVuIHRoZSBlbmQgb2YKKyAqIFRoZSBFdGhlcmJvb3QgZnJhbWV3b3JrIG1vdmVzIHRoZSBjb2RlIHRvIHRoZSA0OGsgc2VnbWVudCBmcm9tCisgKiAweDk0MDAwIHRvIDB4YTAwMDAuIFRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgcm9vbSBiZXR3ZWVuIHRoZSBlbmQgb2YKICAqIHRoaXMgZHJpdmVyIGFuZCB0aGUgMHhhMDAwMCBhZGRyZXNzLiBJZiB5b3UgY29tcGlsZSBpbiB0b28gbWFueQogICogZmVhdHVyZXMsIHRoaXMgd2lsbCBvdmVyZmxvdy4KICAqIFRoZSBudW1iZXIgdW5kZXIgImhleCIgaW4gdGhlIG91dHB1dCBvZiBzaXplIHRoYXQgc2Nyb2xscyBieSB3aGlsZQpAQCAtOTIsMTcgKzkyLDEzIEBACiAvKiBUaGUgZXRoZXJib290IGF1dGhvcnMgc2VlbSB0byBkaXNsaWtlIHRoZSBhcmd1bWVudCBvcmRlcmluZyBpbgogICogb3V0YiBtYWNyb3MgdGhhdCBMaW51eCB1c2VzLiBJIGRpc2tsaWtlIHRoZSBjb25mdXNpb24gdGhhdCB0aGlzCiAgKiBoYXMgY2F1c2VkIGV2ZW4gbW9yZS4uLi4gVGhpcyBmaWxlIHVzZXMgdGhlIExpbnV4IGFyZ3VtZW50IG9yZGVyaW5nLiAgKi8KLS8qIFNvcnJ5IG5vdCB1cy4gSXQncyBpbmhlcnRlZCBjb2RlIGZyb20gRnJlZUJTRC4gW1RoZSBhdXRob3JzXSAqLworLyogU29ycnkgbm90IHVzLiBJdCdzIGluaGVyaXRlZCBjb2RlIGZyb20gRnJlZUJTRC4gW1RoZSBhdXRob3JzXSAqLwogCiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCi0jdW5kZWYJdmlydF90b19idXMKLSNkZWZpbmUJdmlydF90b19idXMoeCkJKCh1bnNpZ25lZCBsb25nKXgpCi0KIHN0YXRpYyBpbnQgaW9hZGRyOwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHU4OwpAQCAtMTIxLDYgKzExNywxOCBAQAogICBTQ0JFYXJseVJ4ID0gMjAsICAgICAgICAgICAgICAgIC8qIEVhcmx5IHJlY2VpdmUgYnl0ZSBjb3VudC4gKi8KIH07CiAKK2VudW0gU0NCQ21kQml0cyB7CisJU0NCTWFza0NtZERvbmU9MHg4MDAwLCBTQ0JNYXNrUnhEb25lPTB4NDAwMCwgU0NCTWFza0NtZElkbGU9MHgyMDAwLAorCVNDQk1hc2tSeFN1c3BlbmQ9MHgxMDAwLCBTQ0JNYXNrRWFybHlSeD0weDA4MDAsIFNDQk1hc2tGbG93Q3RsPTB4MDQwMCwKKwlTQ0JUcmlnZ2VySW50cj0weDAyMDAsIFNDQk1hc2tBbGw9MHgwMTAwLAorCS8qIFRoZSByZXN0IGFyZSBSeCBhbmQgVHggY29tbWFuZHMuICovCisJQ1VTdGFydD0weDAwMTAsIENVUmVzdW1lPTB4MDAyMCwgQ1VTdGF0c0FkZHI9MHgwMDQwLCBDVVNob3dTdGF0cz0weDAwNTAsCisJQ1VDbWRCYXNlPTB4MDA2MCwJLyogQ1UgQmFzZSBhZGRyZXNzIChzZXQgdG8gemVybykgLiAqLworCUNVRHVtcFN0YXRzPTB4MDA3MCwgLyogRHVtcCB0aGVuIHJlc2V0IHN0YXRzIGNvdW50ZXJzLiAqLworCVJ4U3RhcnQ9MHgwMDAxLCBSeFJlc3VtZT0weDAwMDIsIFJ4QWJvcnQ9MHgwMDA0LCBSeEFkZHJMb2FkPTB4MDAwNiwKKwlSeFJlc3VtZU5vUmVzb3VyY2VzPTB4MDAwNywKK307CisKIHN0YXRpYyBpbnQgZG9fZWVwcm9tX2NtZChpbnQgY21kLCBpbnQgY21kX2xlbik7CiB2b2lkIGhkKHZvaWQgKndoZXJlLCBpbnQgbik7CiAKQEAgLTEzOSw4ICsxNDcsNiBAQAogI2RlZmluZSBFRV9XUklURV8xICAgICAgMHg0ODA2CiAjZGVmaW5lIEVFX0VOQiAgICAgICAgICAoMHg0ODAwIHwgRUVfQ1MpCiAKLSNkZWZpbmUgdWRlbGF5KG4pICAgICAgIHdhaXRvbl90aW1lcjIoKChuKSpUSUNLU19QRVJfTVMpLzEwMDApCi0KIC8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLwogI2RlZmluZSBFRV9SRUFEX0NNRCAgICAgNgogCkBAIC0xODQsOSArMTkwLDE4IEBACiAgICBUeXBpY2FsbHkgdGhpcyB0YWtlcyAwIHRpY2tzLiAqLwogc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2NtZF9kb25lKGludCBjbWRfaW9hZGRyKQogewotICBzaG9ydCB3YWl0ID0gMTAwOwotICBkbyAgIDsKLSAgd2hpbGUoaW5iKGNtZF9pb2FkZHIpICYmIC0td2FpdCA+PSAwKTsKKyAgaW50IHdhaXQgPSAwOworICBpbnQgZGVsYXllZF9jbWQ7CisKKyAgZG8KKyAgICBpZiAoaW5iKGNtZF9pb2FkZHIpID09IDApIHJldHVybjsKKyAgd2hpbGUoKyt3YWl0IDw9IDEwMCk7CisgIGRlbGF5ZWRfY21kID0gaW5iKGNtZF9pb2FkZHIpOworICBkbworICAgIGlmIChpbmIoY21kX2lvYWRkcikgPT0gMCkgYnJlYWs7CisgIHdoaWxlKCsrd2FpdCA8PSAxMDAwMCk7CisgIHByaW50ZigiQ29tbWFuZCAlMi4yeCB3YXMgbm90IGltbWVkaWF0ZWx5IGFjY2VwdGVkLCAlZCB0aWNrcyFcbiIsCisgICAgICBkZWxheWVkX2NtZCwgd2FpdCk7CiB9CiAKIC8qIEVsZW1lbnRzIG9mIHRoZSBkdW1wX3N0YXRpc3RpY3MgYmxvY2suIFRoaXMgYmxvY2sgbXVzdCBiZSBsd29yZCBhbGlnbmVkLiAqLwpAQCAtMjEyLDM1ICsyMjcsMzAgQEAKIAogLyogQSBzcGVlZG8zIFRYIGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGggdHdvIGJ1ZmZlcnMuLi4gKi8KIHN0YXRpYyBzdHJ1Y3QgVHhGRCB7Ci0gIHZvbGF0aWxlIHMxNiBzdGF0dXM7Ci0gIHMxNiBjb21tYW5kOwotICB1MzIgbGluazsgICAgICAgICAgLyogdm9pZCAqICovCi0gIHUzMiB0eF9kZXNjX2FkZHI7ICAvKiAoYWxtb3N0KSBBbHdheXMgcG9pbnRzIHRvIHRoZSB0eF9idWZfYWRkciBlbGVtZW50LiAqLwotICBzMzIgY291bnQ7ICAgICAgICAgLyogIyBvZiBUQkQgKD0yKSwgVHggc3RhcnQgdGhyZXNoLiwgZXRjLiAqLwotICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBjb25zdGl0dXRlcyB0d28gIlRCRCIgZW50cmllczogaGRyIGFuZCBkYXRhICovCi0gIHUzMiB0eF9idWZfYWRkcjA7ICAvKiB2b2lkICosIGhlYWRlciBvZiBmcmFtZSB0byBiZSB0cmFuc21pdHRlZC4gICovCi0gIHMzMiB0eF9idWZfc2l6ZTA7ICAvKiBMZW5ndGggb2YgVHggaGRyLiAqLwotICB1MzIgdHhfYnVmX2FkZHIxOyAgLyogdm9pZCAqLCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLiAgKi8KLSAgczMyIHR4X2J1Zl9zaXplMTsgIC8qIExlbmd0aCBvZiBUeCBkYXRhLiAqLworCXZvbGF0aWxlIHMxNiBzdGF0dXM7CisJczE2IGNvbW1hbmQ7CisJdTMyIGxpbms7ICAgICAgICAgIC8qIHZvaWQgKiAqLworCXUzMiB0eF9kZXNjX2FkZHI7ICAvKiAoYWxtb3N0KSBBbHdheXMgcG9pbnRzIHRvIHRoZSB0eF9idWZfYWRkciBlbGVtZW50LiAqLworCXMzMiBjb3VudDsgICAgICAgICAvKiAjIG9mIFRCRCAoPTIpLCBUeCBzdGFydCB0aHJlc2guLCBldGMuICovCisJLyogVGhpcyBjb25zdGl0dXRlcyB0d28gIlRCRCIgZW50cmllczogaGRyIGFuZCBkYXRhICovCisJdTMyIHR4X2J1Zl9hZGRyMDsgIC8qIHZvaWQgKiwgaGVhZGVyIG9mIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLiAgKi8KKwlzMzIgdHhfYnVmX3NpemUwOyAgLyogTGVuZ3RoIG9mIFR4IGhkci4gKi8KKwl1MzIgdHhfYnVmX2FkZHIxOyAgLyogdm9pZCAqLCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLiAgKi8KKwlzMzIgdHhfYnVmX3NpemUxOyAgLyogTGVuZ3RoIG9mIFR4IGRhdGEuICovCiB9IHR4ZmQ7CiAKIHN0cnVjdCBSeEZEIHsgICAgICAgICAgICAgICAvKiBSZWNlaXZlIGZyYW1lIGRlc2NyaXB0b3IuICovCi0gIHZvbGF0aWxlIHMxNiBzdGF0dXM7Ci0gIHMxNiBjb21tYW5kOwotICB1MzIgbGluazsgICAgICAgICAgICAgICAgIC8qIHN0cnVjdCBSeEZEICogKi8KLSAgdTMyIHJ4X2J1Zl9hZGRyOyAgICAgICAgICAvKiB2b2lkICogKi8KLSAgdTE2IGNvdW50OwotICB1MTYgc2l6ZTsKLSAgY2hhciBwYWNrZXRbMTUxOF07CisJdm9sYXRpbGUgczE2IHN0YXR1czsKKwlzMTYgY29tbWFuZDsKKwl1MzIgbGluazsgICAgICAgICAgICAgICAgIC8qIHN0cnVjdCBSeEZEICogKi8KKwl1MzIgcnhfYnVmX2FkZHI7ICAgICAgICAgIC8qIHZvaWQgKiAqLworCXUxNiBjb3VudDsKKwl1MTYgc2l6ZTsKKwljaGFyIHBhY2tldFsxNTE4XTsKIH07CiAKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSByeGZkICgoc3RydWN0IFJ4RkQgKikoMHgxMDAwMCAtIHNpemVvZihzdHJ1Y3QgUnhGRCkpKQotI2RlZmluZSBBQ0NFU1MoeCkgeC0+Ci0jZWxzZQogc3RhdGljIHN0cnVjdCBSeEZEIHJ4ZmQ7CiAjZGVmaW5lIEFDQ0VTUyh4KSB4LgotI2VuZGlmCiAKIHN0YXRpYyBpbnQgY29uZ2VuYiA9IDA7ICAgICAgICAgLyogRW5hYmxlIGNvbmdlc3Rpb24gY29udHJvbCBpbiB0aGUgRFA4Mzg0MC4gKi8KIHN0YXRpYyBpbnQgdHhmaWZvID0gODsgICAgICAgICAgLyogVHggRklGTyB0aHJlc2hvbGQgaW4gNCBieXRlIHVuaXRzLCAwLTE1ICovCkBAIC0yNTYsOCArMjY2LDcgQEAKICAgdTMyIGxpbms7CiAgIHVuc2lnbmVkIGNoYXIgZGF0YVsyMl07CiB9IGNvbmZjbWQgPSB7Ci0gIDAsIENtZENvbmZpZ3VyZSwKLSAgKHUzMikgJiB0eGZkLAorICAwLCAwLCAwLCAvKiBmaWxsZWQgaW4gbGF0ZXIgKi8KICAgezIyLCAweDA4LCAwLCAwLCAgMCwgMHg4MCwgMHgzMiwgMHgwMywgIDEsIC8qIDE9VXNlIE1JSSAgMD1Vc2UgQVVJICovCiAgICAwLCAweDJFLCAwLCAgMHg2MCwgMCwKICAgIDB4ZjIsIDB4NDgsICAgMCwgMHg0MCwgMHhmMiwgMHg4MCwgICAgICAgIC8qIDB4NDA9Rm9yY2UgZnVsbC1kdXBsZXggKi8KQEAgLTI3NiwxOSArMjg1LDIwIEBACiAKIHN0YXRpYyBpbnQgbWRpb193cml0ZShpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKLSAgaW50IHZhbCwgYm9ndXNjbnQgPSA2NCo0OyAgICAgICAgIC8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCisJaW50IHZhbCwgYm9ndXNjbnQgPSA2NCo0OyAgICAgICAgIC8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCiAKLSAgb3V0bCgweDA0MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSkgfCB2YWx1ZSwKLSAgICAgICBpb2FkZHIgKyBTQ0JDdHJsTURJKTsKLSAgZG8gewotICAgIHVkZWxheSgxNik7Ci0KLSAgICB2YWwgPSBpbmwoaW9hZGRyICsgU0NCQ3RybE1ESSk7Ci0gICAgaWYgKC0tYm9ndXNjbnQgPCAwKSB7Ci0gICAgICBwcmludGYoIiBtZGlvX3dyaXRlKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJVguXG4iLCB2YWwpOwotICAgIH0KLSAgfSB3aGlsZSAoISAodmFsICYgMHgxMDAwMDAwMCkpOwotICByZXR1cm4gdmFsICYgMHhmZmZmOworCW91dGwoMHgwNDAwMDAwMCB8IChsb2NhdGlvbjw8MTYpIHwgKHBoeV9pZDw8MjEpIHwgdmFsdWUsCisJICAgICBpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCQorCQl2YWwgPSBpbmwoaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRmKCIgbWRpb193cml0ZSgpIHRpbWVkIG91dCB3aXRoIHZhbCA9ICVYLlxuIiwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoISAodmFsICYgMHgxMDAwMDAwMCkpOworCXJldHVybiB2YWwgJiAweGZmZmY7CiB9CiAKIC8qIFN1cHBvcnQgZnVuY3Rpb246IG1kaW9fcmVhZApAQCAtMjk4LDE3ICszMDgsMTkgQEAKICAqLwogc3RhdGljIGludCBtZGlvX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQogewotICBpbnQgdmFsLCBib2d1c2NudCA9IDY0KjQ7ICAgICAgICAgICAgICAgLyogPDY0IHVzZWMuIHRvIGNvbXBsZXRlLCB0eXAgMjcgdGlja3MgKi8KLSAgb3V0bCgweDA4MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSksIGlvYWRkciArIFNDQkN0cmxNREkpOwotICBkbyB7Ci0gICAgdWRlbGF5KDE2KTsKLQotICAgIHZhbCA9IGlubChpb2FkZHIgKyBTQ0JDdHJsTURJKTsKLSAgICBpZiAoLS1ib2d1c2NudCA8IDApIHsKLSAgICAgIHByaW50ZiggIiBtZGlvX3JlYWQoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlWC5cbiIsIHZhbCk7Ci0gICAgfQotICB9IHdoaWxlICghICh2YWwgJiAweDEwMDAwMDAwKSk7Ci0gIHJldHVybiB2YWwgJiAweGZmZmY7CisJaW50IHZhbCwgYm9ndXNjbnQgPSA2NCo0OyAgICAgICAgICAgICAgIC8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCisJb3V0bCgweDA4MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSksIGlvYWRkciArIFNDQkN0cmxNREkpOworCWRvIHsKKwkJdWRlbGF5KDE2KTsKKwkJCisJCXZhbCA9IGlubChpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ZiggIiBtZGlvX3JlYWQoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlWC5cbiIsIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgKHZhbCAmIDB4MTAwMDAwMDApKTsKKwlyZXR1cm4gdmFsICYgMHhmZmZmOwogfQogCiAvKiBUaGUgZml4ZXMgZm9yIHRoZSBjb2RlIHdlcmUga2luZGx5IHByb3ZpZGVkIGJ5IERyYWdhbiBTdGFuY2V2aWMKQEAgLTM0MCwyNSArMzUyLDI2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3aGVyZWFtaSAoY29uc3QgY2hhciAqc3RyKQogewotI2lmCTAKICAgcHJpbnRmICgiJXNcbiIsIHN0cik7CiAgIHNsZWVwICgyKTsKLSNlbmRpZgogfQorI2Vsc2UKKyNkZWZpbmUgd2hlcmVhbWkocykKKyNlbmRpZgogCi0vKiBmdW5jdGlvbjogZWVwcm8xMDBfcmVzZXQKLSAqIHJlc2V0cyB0aGUgY2FyZC4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IEV0aGVyYm9vdCB0byBwcm9iZSB0aGUgY2FyZCBhZ2FpbgotICogZnJvbSBhICJ2aXJnaW5hbCIgc3RhdGUuLi4uCi0gKiBBcmd1bWVudHM6IG5vbmUKLSAqCi0gKiByZXR1cm5zOiAgIHZvaWQuCi0gKi8KLQotc3RhdGljIHZvaWQgZWVwcm8xMDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgZWVwcm8xMDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKIHsKLSAgb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb3J0KTsKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9CiB9CiAKIC8qIGZ1bmN0aW9uOiBlZXBybzEwMF90cmFuc21pdApAQCAtMzczLDYxICszODYsODcgQEAKIAogc3RhdGljIHZvaWQgZWVwcm8xMDBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApCiB7Ci0gIHN0cnVjdCBldGhfaGRyIHsKLSAgICB1bnNpZ25lZCBjaGFyIGRzdF9hZGRyW0VUSF9BTEVOXTsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19hZGRyW0VUSF9BTEVOXTsKLSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotICB9IGhkcjsKLSAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotICBpbnQgdG87Ci0gIGludCBzMSwgczI7Ci0KLSAgc3RhdHVzID0gaW53KGlvYWRkciArIFNDQlN0YXR1cyk7Ci0gIC8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLwotICBvdXR3KHN0YXR1cyAmIDB4ZmMwMCwgaW9hZGRyICsgU0NCU3RhdHVzKTsKKwlzdHJ1Y3QgZXRoX2hkciB7CisJCXVuc2lnbmVkIGNoYXIgZHN0X2FkZHJbRVRIX0FMRU5dOworCQl1bnNpZ25lZCBjaGFyIHNyY19hZGRyW0VUSF9BTEVOXTsKKwkJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl9IGhkcjsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJaW50IHMxLCBzMjsKKworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBTQ0JTdGF0dXMpOworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCW91dHcoc3RhdHVzICYgMHhmYzAwLCBpb2FkZHIgKyBTQ0JTdGF0dXMpOwogCiAjaWZkZWYJREVCVUcKLSAgcHJpbnRmICgidHJhbnNtaXR0aW5nIHR5cGUgJWhYIHBhY2tldCAoJWQgYnl0ZXMpLiBzdGF0dXMgPSAlaFgsIGNtZD0laFhcbiIsCi0JICB0LCBzLCBzdGF0dXMsIGludyAoaW9hZGRyICsgU0NCQ21kKSk7CisJcHJpbnRmICgidHJhbnNtaXR0aW5nIHR5cGUgJWhYIHBhY2tldCAoJWQgYnl0ZXMpLiBzdGF0dXMgPSAlaFgsIGNtZD0laFhcbiIsCisJCXQsIHMsIHN0YXR1cywgaW53IChpb2FkZHIgKyBTQ0JDbWQpKTsKICNlbmRpZgogCi0gIG1lbWNweSAoJmhkci5kc3RfYWRkciwgZCwgRVRIX0FMRU4pOwotICBtZW1jcHkgKCZoZHIuc3JjX2FkZHIsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5ICgmaGRyLmRzdF9hZGRyLCBkLCBFVEhfQUxFTik7CisJbWVtY3B5ICgmaGRyLnNyY19hZGRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwogCi0gIGhkci50eXBlID0gaHRvbnMgKHQpOworCWhkci50eXBlID0gaHRvbnMgKHQpOwogCi0gIHR4ZmQuc3RhdHVzID0gMDsKLSAgdHhmZC5jb21tYW5kID0gQ21kU3VzcGVuZCB8IENtZFR4IHwgQ21kVHhGbGV4OwotICB0eGZkLmxpbmsgICA9IHZpcnRfdG9fYnVzICgmdHhmZCk7Ci0gIHR4ZmQuY291bnQgICA9IDB4MDIyMDgwMDA7Ci0gIHR4ZmQudHhfZGVzY19hZGRyID0gKHUzMikmdHhmZC50eF9idWZfYWRkcjA7CisJdHhmZC5zdGF0dXMgPSAwOworCXR4ZmQuY29tbWFuZCA9IENtZFN1c3BlbmQgfCBDbWRUeCB8IENtZFR4RmxleDsKKwl0eGZkLmxpbmsgICA9IHZpcnRfdG9fYnVzICgmdHhmZCk7CisJdHhmZC5jb3VudCAgID0gMHgwMjIwODAwMDsKKwl0eGZkLnR4X2Rlc2NfYWRkciA9IHZpcnRfdG9fYnVzKCZ0eGZkLnR4X2J1Zl9hZGRyMCk7CiAKLSAgdHhmZC50eF9idWZfYWRkcjAgPSB2aXJ0X3RvX2J1cyAoJmhkcik7Ci0gIHR4ZmQudHhfYnVmX3NpemUwID0gc2l6ZW9mIChoZHIpOworCXR4ZmQudHhfYnVmX2FkZHIwID0gdmlydF90b19idXMgKCZoZHIpOworCXR4ZmQudHhfYnVmX3NpemUwID0gc2l6ZW9mIChoZHIpOwogCi0gIHR4ZmQudHhfYnVmX2FkZHIxID0gdmlydF90b19idXMgKHApOwotICB0eGZkLnR4X2J1Zl9zaXplMSA9IHM7CisJdHhmZC50eF9idWZfYWRkcjEgPSB2aXJ0X3RvX2J1cyAocCk7CisJdHhmZC50eF9idWZfc2l6ZTEgPSBzOwogCiAjaWZkZWYJREVCVUcKLSAgcHJpbnRmICgidHhmZDogXG4iKTsKLSAgaGQgKCZ0eGZkLCBzaXplb2YgKHR4ZmQpKTsKKwlwcmludGYgKCJ0eGZkOiBcbiIpOworCWhkICgmdHhmZCwgc2l6ZW9mICh0eGZkKSk7CiAjZW5kaWYKIAotICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGZkKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBDVV9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKLQotICBzMSA9IGludyAoaW9hZGRyICsgU0NCU3RhdHVzKTsKLSAgbG9hZF90aW1lcjIoMTAqVElDS1NfUEVSX01TKTsJCS8qIHRpbWVvdXQgMTAgbXMgZm9yIHRyYW5zbWl0ICovCi0gIHdoaWxlICghdHhmZC5zdGF0dXMgJiYgdGltZXIyX3J1bm5pbmcoKSkKLSAgICAvKiBXYWl0ICovOwotICBzMiA9IGludyAoaW9hZGRyICsgU0NCU3RhdHVzKTsKKwlvdXRsKHZpcnRfdG9fYnVzKCZ0eGZkKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IENVX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworCXdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisKKwlzMSA9IGludyAoaW9hZGRyICsgU0NCU3RhdHVzKTsKKwlsb2FkX3RpbWVyMigxMCpUSUNLU19QRVJfTVMpOwkJLyogdGltZW91dCAxMCBtcyBmb3IgdHJhbnNtaXQgKi8KKwl3aGlsZSAoIXR4ZmQuc3RhdHVzICYmIHRpbWVyMl9ydW5uaW5nKCkpCisJCS8qIFdhaXQgKi87CisJczIgPSBpbncgKGlvYWRkciArIFNDQlN0YXR1cyk7CiAKICNpZmRlZglERUJVRwotICBwcmludGYgKCJzMSA9ICVoWCwgczIgPSAlaFguXG4iLCBzMSwgczIpOworCXByaW50ZiAoInMxID0gJWhYLCBzMiA9ICVoWC5cbiIsIHMxLCBzMik7CiAjZW5kaWYKIH0KIAorLyoKKyAqIFNvbWV0aW1lcyB0aGUgcmVjZWl2ZXIgc3RvcHMgbWFraW5nIHByb2dyZXNzLiAgVGhpcyByb3V0aW5lIGtub3dzIGhvdyB0bworICogZ2V0IGl0IGdvaW5nIGFnYWluLCB3aXRob3V0IGxvc2luZyBwYWNrZXRzIG9yIGJlaW5nIG90aGVyd2lzZSBuYXN0eSBsaWtlCisgKiBhIGNoaXAgcmVzZXQgd291bGQgYmUuICBQcmV2aW91c2x5IHRoZSBkcml2ZXIgaGFkIGEgd2hvbGUgc2VxdWVuY2UKKyAqIG9mIGlmIFJ4U3VzcGVuZGVkLCBpZiBpdCdzIG5vIGJ1ZmZlcnMgZG8gb25lIHRoaW5nLCBpZiBpdCdzIG5vIHJlc291cmNlcywKKyAqIGRvIGFub3RoZXIsIGV0Yy4gIEJ1dCB0aG9zZSB0aGluZ3MgZG9uJ3QgcmVhbGx5IG1hdHRlci4gIFNlcGFyYXRlIGxvZ2ljCisgKiBpbiB0aGUgSVNSIHByb3ZpZGVzIGZvciBhbGxvY2F0aW5nIGJ1ZmZlcnMtLXRoZSBvdGhlciBoYWxmIG9mIG9wZXJhdGlvbgorICogaXMganVzdCBtYWtpbmcgc3VyZSB0aGUgcmVjZWl2ZXIgaXMgYWN0aXZlLiAgc3BlZWRvX3J4X3NvZnRfcmVzZXQgZG9lcyB0aGF0LgorICogVGhpcyBwcm9ibGVtIHdpdGggdGhlIG9sZCwgbW9yZSBpbnZvbHZlZCBhbGdvcml0aG0gaXMgc2hvd24gdXAgdW5kZXIKKyAqIHBpbmcgZmxvb2RzIG9uIHRoZSBvcmRlciBvZiA2MEsgcGFja2V0cy9zZWNvbmQgb24gYSAxMDBNYnBzIGZkeCBuZXR3b3JrLgorICovCitzdGF0aWMgdm9pZAorc3BlZWRvX3J4X3NvZnRfcmVzZXQodm9pZCkKK3sKKyAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKwkvKgorCSogUHV0IHRoZSBoYXJkd2FyZSBpbnRvIGEga25vd24gc3RhdGUuCisJKi8KKwlvdXRiKFJYX0FCT1JULCBpb2FkZHIgKyBTQ0JDbWQpOworCisJQUNDRVNTKHJ4ZmQpcnhfYnVmX2FkZHIgPSAweGZmZmZmZmZmOworCisgIHdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisKKwlvdXRiKFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworfQorCiAvKiBmdW5jdGlvbjogZWVwcm8xMDBfcG9sbCAvIGV0aF9wb2xsCiAgKiBUaGlzIHJlY2lldmVzIGEgcGFja2V0IGZyb20gdGhlIG5ldHdvcmsuCiAgKgpAQCAtNDQwLDM0ICs0NzksODcgQEAKICAqICAgICAgICAgICAgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaW4gbmljLT5wYWNrZXRsZW4uCiAgKi8KIAotc3RhdGljIGludCBlZXBybzEwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgZWVwcm8xMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKLSAgaWYgKCFBQ0NFU1MocnhmZClzdGF0dXMpCi0gICAgcmV0dXJuIDA7CisgIHVuc2lnbmVkIGludCBzdGF0dXM7CisgIHN0YXR1cyA9IGludyhpb2FkZHIgKyBTQ0JTdGF0dXMpOwogCi0gIC8qIE9rLiBXZSBnb3QgYSBwYWNrZXQuIE5vdyByZXN0YXJ0IHRoZSByZWNpZXZlci4uLi4gKi8KLSAgQUNDRVNTKHJ4ZmQpc3RhdHVzID0gMDsKLSAgQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4YzAwMDsKLSAgb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOwotICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCWlmICghQUNDRVNTKHJ4ZmQpc3RhdHVzKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZXJlIGlzIGEgcGFja2V0IHJlYWR5ICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKyAgLyoKKyAgICogVGhlIGNoaXAgbWF5IGhhdmUgc3VzcGVuZGVkIHJlY2VwdGlvbiBmb3IgdmFyaW91cyByZWFzb25zLgorICAgKiBDaGVjayBmb3IgdGhhdCwgYW5kIHJlLXByaW1lIGl0IHNob3VsZCB0aGlzIGJlIHRoZSBjYXNlLgorICAgKi8KKyAgc3dpdGNoICgoc3RhdHVzID4+IDIpICYgMHhmKSB7CisgIGNhc2UgMDogLyogSWRsZSAqLworICAgIGJyZWFrOworICBjYXNlIDE6CS8qIFN1c3BlbmRlZCAqLworICBjYXNlIDI6CS8qIE5vIHJlc291cmNlcyAoUnhGRHMpICovCisgIGNhc2UgOToJLyogU3VzcGVuZGVkIHdpdGggbm8gbW9yZSBSQkRzICovCisgIGNhc2UgMTA6IC8qIE5vIHJlc291cmNlcyBkdWUgdG8gbm8gUkJEcyAqLworICBjYXNlIDEyOiAvKiBSZWFkeSB3aXRoIG5vIFJCRHMgKi8KKyAgICBzcGVlZG9fcnhfc29mdF9yZXNldCgpOworICAgIGJyZWFrOworICBjYXNlIDM6ICBjYXNlIDU6ICBjYXNlIDY6ICBjYXNlIDc6ICBjYXNlIDg6CisgIGNhc2UgMTE6ICBjYXNlIDEzOiAgY2FzZSAxNDogIGNhc2UgMTU6CisgICAgLyogdGhlc2UgYXJlIGFsbCByZXNlcnZlZCB2YWx1ZXMgKi8KKyAgICBicmVhazsKKyAgfQorCisJLyogT2suIFdlIGdvdCBhIHBhY2tldC4gTm93IHJlc3RhcnQgdGhlIHJlY2lldmVyLi4uLiAqLworCUFDQ0VTUyhyeGZkKXN0YXR1cyA9IDA7CisJQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4YzAwMDsKKwlvdXRsKHZpcnRfdG9fYnVzKCYoQUNDRVNTKHJ4ZmQpc3RhdHVzKSksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOwogCiAjaWZkZWYJREVCVUcKLSAgcHJpbnRmICgiR290IGEgcGFja2V0OiBMZW4gPSAlZC5cbiIsIEFDQ0VTUyhyeGZkKWNvdW50ICYgMHgzZmZmKTsKKwlwcmludGYgKCJHb3QgYSBwYWNrZXQ6IExlbiA9ICVkLlxuIiwgQUNDRVNTKHJ4ZmQpY291bnQgJiAweDNmZmYpOwogI2VuZGlmCi0gIG5pYy0+cGFja2V0bGVuID0gIEFDQ0VTUyhyeGZkKWNvdW50ICYgMHgzZmZmOwotICBtZW1jcHkgKG5pYy0+cGFja2V0LCBBQ0NFU1MocnhmZClwYWNrZXQsIG5pYy0+cGFja2V0bGVuKTsKKwluaWMtPnBhY2tldGxlbiA9ICBBQ0NFU1MocnhmZCljb3VudCAmIDB4M2ZmZjsKKwltZW1jcHkgKG5pYy0+cGFja2V0LCBBQ0NFU1MocnhmZClwYWNrZXQsIG5pYy0+cGFja2V0bGVuKTsKICNpZmRlZglERUJVRwotICBoZCAobmljLT5wYWNrZXQsIDB4MzApOworCWhkIChuaWMtPnBhY2tldCwgMHgzMCk7CiAjZW5kaWYKLSAgcmV0dXJuIDE7CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGVlcHJvMTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorLyogZnVuY3Rpb246IGVlcHJvMTAwX2Rpc2FibGUKKyAqIHJlc2V0cyB0aGUgY2FyZC4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IEV0aGVyYm9vdCBvciBMaW51eAorICogdG8gcHJvYmUgdGhlIGNhcmQgYWdhaW4gZnJvbSBhICJ2aXJnaW5hbCIgc3RhdGUuLi4uCisgKiBBcmd1bWVudHM6IG5vbmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KK3N0YXRpYyB2b2lkIGVlcHJvMTAwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2IF9fdW51c2VkKQogewotICAgIC8qIFNlZSBpZiB0aGlzIFBhcnRpYWxSZXNldCBzb2x2ZXMgdGhlIHByb2JsZW0gd2l0aCBpbnRlcmZlcmluZyB3aXRoCi0gICAgICAga2VybmVsIG9wZXJhdGlvbiBhZnRlciBFdGhlcmJvb3QgaGFuZHMgb3Zlci4gLSBLZW4gMjAwMDExMDIgKi8KLSAgICBvdXRsKDIsIGlvYWRkciArIFNDQlBvcnQpOworLyogZnJvbSBlZXBybzEwMF9yZXNldCAqLworCW91dGwoMCwgaW9hZGRyICsgU0NCUG9ydCk7CisvKiBmcm9tIGVlcHJvMTAwX2Rpc2FibGUgKi8KKwkvKiBTZWUgaWYgdGhpcyBQYXJ0aWFsUmVzZXQgc29sdmVzIHRoZSBwcm9ibGVtIHdpdGggaW50ZXJmZXJpbmcgd2l0aAorCSAgIGtlcm5lbCBvcGVyYXRpb24gYWZ0ZXIgRXRoZXJib290IGhhbmRzIG92ZXIuIC0gS2VuIDIwMDAxMTAyICovCisJb3V0bCgyLCBpb2FkZHIgKyBTQ0JQb3J0KTsKKworCS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSB0aGUgSW50ZWwgZTEwMCBkcml2ZXIuCisJICogVGhpcyBob3BlZnVsbHkgc29sdmVzIHRoZSBwcm9ibGVtIHdpdGggaGFuZ2luZyBoYXJkIERPUyBpbWFnZXMuICovCisKKwkvKiB3YWl0IGZvciB0aGUgcmVzZXQgdG8gdGFrZSBlZmZlY3QgKi8KKwl1ZGVsYXkoMjApOworCisJLyogTWFzayBvZmYgb3VyIGludGVycnVwdCBsaW5lIC0tIGl0IGlzIHVubWFza2VkIGFmdGVyIHJlc2V0ICovCisJeworCQl1MTYgaW50cl9zdGF0dXM7CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBvdXIgUENJIGJvYXJkIGJ5IHNldHRpbmcgdGhlIG1hc2sgYml0ICovCisJCW91dHcoSU5UX01BU0ssIGlvYWRkciArIFNDQkNtZCk7CisJCWludHJfc3RhdHVzID0gaW53KGlvYWRkciArIFNDQlN0YXR1cyk7CisJCS8qIGFjayBhbmQgY2xlYXIgaW50cnMgKi8KKwkJb3V0dyhpbnRyX3N0YXR1cywgaW9hZGRyICsgU0NCU3RhdHVzKTsKKwkJaW53KGlvYWRkciArIFNDQlN0YXR1cyk7CisJfQogfQogCiAvKiBleHBvcnRlZCBmdW5jdGlvbjogZWVwcm8xMDBfcHJvYmUgLyBldGhfcHJvYmUKQEAgLTQ3OCwyNSArNTcwLDMwIEBACiAgKiAgICAgICAgICAgIGxlYXZlcyB0aGUgODI1NTcgaW5pdGlhbGl6ZWQsIGFuZCByZWFkeSB0byByZWNpZXZlIHBhY2tldHMuCiAgKi8KIAotc3RydWN0IG5pYyAqZWVwcm8xMDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnApCitzdGF0aWMgaW50IGVlcHJvMTAwX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnApCiB7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAJdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKIAlpbnQgaTsKIAlpbnQgcmVhZF9jbWQsIGVlX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7CiAJaW50IG9wdGlvbnM7Ci0JaW50IHByb21pc2M7CisJaW50IHJ4X21vZGU7CiAKIAkvKiB3ZSBjYWNoZSBvbmx5IHRoZSBmaXJzdCBmZXcgd29yZHMgb2YgdGhlIEVFUFJPTSBkYXRhCiAJICAgYmUgY2FyZWZ1bCBub3QgdG8gYWNjZXNzIGJleW9uZCB0aGlzIGFycmF5ICovCiAJdW5zaWduZWQgc2hvcnQgZWVwcm9tWzE2XTsKIAotCWlmIChwcm9iZWFkZHJzID09IDAgfHwgcHJvYmVhZGRyc1swXSA9PSAwKQorCWlmIChwLT5pb2FkZHIgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JaW9hZGRyID0gcHJvYmVhZGRyc1swXSAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisJaW9hZGRyID0gcC0+aW9hZGRyICYgfjM7IC8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKwluaWMtPmlvYWRkciA9IGlvYWRkcjsKIAogCWFkanVzdF9wY2lfZGV2aWNlKHApOwogCisJLyogQ29weSBJUlEgZnJvbSBQQ0kgaW5mb3JtYXRpb24gKi8KKwkvKiBuaWMtPmlycW5vID0gcGNpLT5pcnE7ICovCisJbmljLT5pcnFubyA9IDA7CisKIAlpZiAoKGRvX2VlcHJvbV9jbWQoRUVfUkVBRF9DTUQgPDwgMjQsIDI3KSAmIDB4ZmZlMDAwMCkKIAkJPT0gMHhmZmUwMDAwKSB7CiAJCWVlX3NpemUgPSAweDEwMDsKQEAgLTUxMywxMjMgKzYxMCwxMzggQEAKIAkJc3VtICs9IHZhbHVlOwogCX0KIAotICBmb3IgKGk9MDtpPEVUSF9BTEVOO2krKykgewotCW5pYy0+bm9kZV9hZGRyW2ldID0gIChlZXByb21baS8yXSA+PiAoOCooaSYxKSkpICYgMHhmZjsKLSAgfQotICBwcmludGYgKCJFdGhlcm5ldCBhZGRyOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOwotCi0gIGlmIChzdW0gIT0gMHhCQUJBKQotCXByaW50ZigiZWVwcm8xMDA6IEludmFsaWQgRUVQUk9NIGNoZWNrc3VtICUjaFgsICIKLQkgICAgICAgImNoZWNrIHNldHRpbmdzIGJlZm9yZSBhY3RpdmF0aW5nIHRoaXMgZGV2aWNlIVxuIiwgc3VtKTsKLSAgb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb3J0KTsKLSAgdWRlbGF5ICgxMDAwMCk7Ci0KLSAgd2hlcmVhbWkgKCJHb3QgZWVwcm9tLiIpOwotCi0gIG91dGwodmlydF90b19idXMoJmxzdGF0cyksIGlvYWRkciArIFNDQlBvaW50ZXIpOwotICBvdXR3KElOVF9NQVNLIHwgQ1VfU1RBVFNBRERSLCBpb2FkZHIgKyBTQ0JDbWQpOwotICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOwotCi0gIHdoZXJlYW1pICgic2V0IHN0YXRzIGFkZHIuIik7Ci0gIC8qIElOSVQgUlggc3R1ZmYuICovCi0KLSAgLyogQmFzZSA9IDAgKi8KLSAgb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IFJYX0FERFJfTE9BRCwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKLQotICB3aGVyZWFtaSAoInNldCByeCBiYXNlIGFkZHIuIik7Ci0KLSAgQUNDRVNTKHJ4ZmQpc3RhdHVzICA9IDB4MDAwMTsKLSAgQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4MDAwMDsKLSAgQUNDRVNTKHJ4ZmQpbGluayAgICA9IHZpcnRfdG9fYnVzKCYoQUNDRVNTKHJ4ZmQpc3RhdHVzKSk7Ci0gIEFDQ0VTUyhyeGZkKXJ4X2J1Zl9hZGRyID0gKGludCkgJm5pYy0+cGFja2V0OwotICBBQ0NFU1MocnhmZCljb3VudCAgID0gMDsKLSAgQUNDRVNTKHJ4ZmQpc2l6ZSAgICA9IDE1Mjg7Ci0KLSAgb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOwotICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOwotCi0gIHdoZXJlYW1pICgic3RhcnRlZCBSWCBwcm9jZXNzLiIpOwotCi0gIC8qIFN0YXJ0IHRoZSByZWNpZXZlci4uLi4gKi8KLSAgQUNDRVNTKHJ4ZmQpc3RhdHVzID0gMDsKLSAgQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4YzAwMDsKLSAgb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOwotCi0gIC8qIElOSVQgVFggc3R1ZmYuICovCi0KLSAgLyogQmFzZSA9IDAgKi8KLSAgb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IENVX0NNRF9CQVNFLCBpb2FkZHIgKyBTQ0JDbWQpOwotICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOwotCi0gIHdoZXJlYW1pICgic2V0IFRYIGJhc2UgYWRkci4iKTsKLQotICB0eGZkLmNvbW1hbmQgICAgICA9IChDbWRJQVNldHVwKTsKLSAgdHhmZC5zdGF0dXMgICAgICAgPSAweDAwMDA7Ci0gIHR4ZmQubGluayAgICAgICAgID0gdmlydF90b19idXMgKCZjb25mY21kKTsKLQotICB7Ci0JY2hhciAqdCA9IChjaGFyICopJnR4ZmQudHhfZGVzY19hZGRyOworCWZvciAoaT0wO2k8RVRIX0FMRU47aSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gIChlZXByb21baS8yXSA+PiAoOCooaSYxKSkpICYgMHhmZjsKKwl9CisJcHJpbnRmICgiRXRoZXJuZXQgYWRkcjogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKIAotCWZvciAoaT0wO2k8RVRIX0FMRU47aSsrKQotCQl0W2ldID0gbmljLT5ub2RlX2FkZHJbaV07Ci0gIH0KKwlpZiAoc3VtICE9IDB4QkFCQSkKKwkJcHJpbnRmKCJlZXBybzEwMDogSW52YWxpZCBFRVBST00gY2hlY2tzdW0gJSNoWCwgIgorCQkgICAgICAgImNoZWNrIHNldHRpbmdzIGJlZm9yZSBhY3RpdmF0aW5nIHRoaXMgZGV2aWNlIVxuIiwgc3VtKTsKKwlvdXRsKDAsIGlvYWRkciArIFNDQlBvcnQpOworCXVkZWxheSAoMTAwMDApOworCXdoZXJlYW1pICgiR290IGVlcHJvbS4iKTsKKworCS8qIEJhc2UgPSAwICovCisJb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlvdXR3KElOVF9NQVNLIHwgUlhfQUREUl9MT0FELCBpb2FkZHIgKyBTQ0JDbWQpOworCXdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisJd2hlcmVhbWkgKCJzZXQgcnggYmFzZSBhZGRyLiIpOworCisJb3V0bCh2aXJ0X3RvX2J1cygmbHN0YXRzKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IENVX1NUQVRTQUREUiwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCXdoZXJlYW1pICgic2V0IHN0YXRzIGFkZHIuIik7CisKKwkvKiBJTklUIFJYIHN0dWZmLiAqLworCUFDQ0VTUyhyeGZkKXN0YXR1cyAgPSAweDAwMDE7CisJQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4MDAwMDsKKwlBQ0NFU1MocnhmZClsaW5rICAgID0gdmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKTsKKwlBQ0NFU1MocnhmZClyeF9idWZfYWRkciA9IHZpcnRfdG9fYnVzKCZuaWMtPnBhY2tldCk7CisJQUNDRVNTKHJ4ZmQpY291bnQgICA9IDA7CisJQUNDRVNTKHJ4ZmQpc2l6ZSAgICA9IDE1Mjg7CisKKwlvdXRsKHZpcnRfdG9fYnVzKCYoQUNDRVNTKHJ4ZmQpc3RhdHVzKSksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisJd2hlcmVhbWkgKCJzdGFydGVkIFJYIHByb2Nlc3MuIik7CisKKwkvKiBTdGFydCB0aGUgcmVjaWV2ZXIuLi4uICovCisJQUNDRVNTKHJ4ZmQpc3RhdHVzID0gMDsKKwlBQ0NFU1MocnhmZCljb21tYW5kID0gMHhjMDAwOworCW91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworCisJLyogSU5JVCBUWCBzdHVmZi4gKi8KKworCS8qIEJhc2UgPSAwICovCisJb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlvdXR3KElOVF9NQVNLIHwgQ1VfQ01EX0JBU0UsIGlvYWRkciArIFNDQkNtZCk7CisJd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworCXdoZXJlYW1pICgic2V0IFRYIGJhc2UgYWRkci4iKTsKKworCXR4ZmQuY29tbWFuZCAgICAgID0gKENtZElBU2V0dXApOworCXR4ZmQuc3RhdHVzICAgICAgID0gMHgwMDAwOworCXR4ZmQubGluayAgICAgICAgID0gdmlydF90b19idXMgKCZjb25mY21kKTsKKworCXsKKwkJY2hhciAqdCA9IChjaGFyICopJnR4ZmQudHhfZGVzY19hZGRyOworCQkKKwkJZm9yIChpPTA7aTxFVEhfQUxFTjtpKyspCisJCQl0W2ldID0gbmljLT5ub2RlX2FkZHJbaV07CisJfQogCiAjaWZkZWYJREVCVUcKLSAgcHJpbnRmICgiU2V0dXBfZWFkZHI6XG4iKTsKLSAgaGQgKCZ0eGZkLCAweDIwKTsKKwlwcmludGYgKCJTZXR1cF9lYWRkcjpcbiIpOworCWhkICgmdHhmZCwgMHgyMCk7CiAjZW5kaWYKLSAgLyogICAgICBvcHRpb25zID0gMHg0MDsgKi8gLyogMTBtYnBzIGhhbGYgZHVwbGV4Li4uICovCi0gIG9wdGlvbnMgPSAweDAwOyAgICAgICAgICAgIC8qIEF1dG9zZW5zZSAqLwotCi0gIHByb21pc2MgPSAwOwotCi0gIGlmICggICAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwCi0JICB8fCAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwQSkgewotCWludCBtZGlfcmVnMjMgPSBtZGlvX3JlYWQoZWVwcm9tWzZdICYgMHgxZiwgMjMpIHwgMHgwNDIyOwotCWlmIChjb25nZW5iKQotCSAgbWRpX3JlZzIzIHw9IDB4MDEwMDsKLQlwcmludGYoIiAgRFA4Mzg0MCBzcGVjaWZpYyBzZXR1cCwgc2V0dGluZyByZWdpc3RlciAyMyB0byAlaFguXG4iLAotCSAgICAgICBtZGlfcmVnMjMpOwotCW1kaW9fd3JpdGUoZWVwcm9tWzZdICYgMHgxZiwgMjMsIG1kaV9yZWcyMyk7Ci0gIH0KLSAgd2hlcmVhbWkgKCJEb25lIERQODM0MCBzcGVjaWFsIHNldHVwLiIpOwotICBpZiAob3B0aW9ucyAhPSAwKSB7Ci0JbWRpb193cml0ZShlZXByb21bNl0gJiAweDFmLCAwLAotCQkgICAoKG9wdGlvbnMgJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgICAgLyogMTAwbWJwcz8gKi8KLQkJICAgKChvcHRpb25zICYgMHgxMCkgPyAweDAxMDAgOiAwKSk7IC8qIEZ1bGwgZHVwbGV4PyAqLwotCXdoZXJlYW1pICgic2V0IG1kaW9fcmVnaXN0ZXIuIik7Ci0gIH0KKwkvKiAgICAgIG9wdGlvbnMgPSAweDQwOyAqLyAvKiAxMG1icHMgaGFsZiBkdXBsZXguLi4gKi8KKwlvcHRpb25zID0gMHgwMDsgICAgICAgICAgICAvKiBBdXRvc2Vuc2UgKi8KIAotICBjb25mY21kLmNvbW1hbmQgID0gQ21kU3VzcGVuZCB8IENtZENvbmZpZ3VyZTsKLSAgY29uZmNtZC5zdGF0dXMgICA9IDB4MDAwMDsKLSAgY29uZmNtZC5saW5rICAgICA9IHZpcnRfdG9fYnVzICgmdHhmZCk7Ci0gIGNvbmZjbWQuZGF0YVsxXSAgPSAodHhmaWZvIDw8IDQpIHwgcnhmaWZvOwotICBjb25mY21kLmRhdGFbNF0gID0gcnhkbWFjb3VudDsKLSAgY29uZmNtZC5kYXRhWzVdICA9IHR4ZG1hY291bnQgKyAweDgwOwotICBjb25mY21kLmRhdGFbMTVdID0gcHJvbWlzYyA/IDB4NDk6IDB4NDg7Ci0gIGNvbmZjbWQuZGF0YVsxOV0gPSAob3B0aW9ucyAmIDB4MTApID8gMHhDMCA6IDB4ODA7Ci0gIGNvbmZjbWQuZGF0YVsyMV0gPSBwcm9taXNjID8gMHgwRDogMHgwNTsKKyNpZmRlZiBQUk9NSVNDCisJcnhfbW9kZSA9IDM7CisjZWxpZiBBTExNVUxUSQorCXJ4X21vZGUgPSAxOworI2Vsc2UKKwlyeF9tb2RlID0gMDsKKyNlbmRpZgogCi0gIG91dGwodmlydF90b19idXMoJnR4ZmQpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IENVX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOwotICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCWlmICggICAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwCisJICAgICAgIHx8ICgoZWVwcm9tWzZdPj44KSAmIDB4M2YpID09IERQODM4NDBBKSB7CisJCWludCBtZGlfcmVnMjMgPSBtZGlvX3JlYWQoZWVwcm9tWzZdICYgMHgxZiwgMjMpIHwgMHgwNDIyOworCQlpZiAoY29uZ2VuYikKKwkJCW1kaV9yZWcyMyB8PSAweDAxMDA7CisJCXByaW50ZigiICBEUDgzODQwIHNwZWNpZmljIHNldHVwLCBzZXR0aW5nIHJlZ2lzdGVyIDIzIHRvICVoWC5cbiIsCisJCSAgICAgICBtZGlfcmVnMjMpOworCQltZGlvX3dyaXRlKGVlcHJvbVs2XSAmIDB4MWYsIDIzLCBtZGlfcmVnMjMpOworCX0KKwl3aGVyZWFtaSAoIkRvbmUgRFA4MzQwIHNwZWNpYWwgc2V0dXAuIik7CisJaWYgKG9wdGlvbnMgIT0gMCkgeworCQltZGlvX3dyaXRlKGVlcHJvbVs2XSAmIDB4MWYsIDAsCisJCQkgICAoKG9wdGlvbnMgJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgICAgLyogMTAwbWJwcz8gKi8KKwkJCSAgICgob3B0aW9ucyAmIDB4MTApID8gMHgwMTAwIDogMCkpOyAvKiBGdWxsIGR1cGxleD8gKi8KKwkJd2hlcmVhbWkgKCJzZXQgbWRpb19yZWdpc3Rlci4iKTsKKwl9CiAKLSAgd2hlcmVhbWkgKCJzdGFydGVkIFRYIHRoaW5neSAoY29uZmlnLCBpYXNldHVwKS4iKTsKKwljb25mY21kLmNvbW1hbmQgID0gQ21kU3VzcGVuZCB8IENtZENvbmZpZ3VyZTsKKwljb25mY21kLnN0YXR1cyAgID0gMHgwMDAwOworCWNvbmZjbWQubGluayAgICAgPSB2aXJ0X3RvX2J1cyAoJnR4ZmQpOworCWNvbmZjbWQuZGF0YVsxXSAgPSAodHhmaWZvIDw8IDQpIHwgcnhmaWZvOworCWNvbmZjbWQuZGF0YVs0XSAgPSByeGRtYWNvdW50OworCWNvbmZjbWQuZGF0YVs1XSAgPSB0eGRtYWNvdW50ICsgMHg4MDsKKwljb25mY21kLmRhdGFbMTVdID0gKHJ4X21vZGUgJiAyKSA/IDB4NDk6IDB4NDg7CisJY29uZmNtZC5kYXRhWzE5XSA9IChvcHRpb25zICYgMHgxMCkgPyAweEMwIDogMHg4MDsKKwljb25mY21kLmRhdGFbMjFdID0gKHJ4X21vZGUgJiAxKSA/IDB4MEQ6IDB4MDU7CisKKwlvdXRsKHZpcnRfdG9fYnVzKCZ0eGZkKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IENVX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworCXdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisKKwl3aGVyZWFtaSAoInN0YXJ0ZWQgVFggdGhpbmd5IChjb25maWcsIGlhc2V0dXApLiIpOworCisJbG9hZF90aW1lcjIoMTAqVElDS1NfUEVSX01TKTsKKwl3aGlsZSAoIXR4ZmQuc3RhdHVzICYmIHRpbWVyMl9ydW5uaW5nKCkpCisJCS8qIFdhaXQgKi87CisKKwkvKiBSZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIgb25jZSB0byBkaXNnYXJkIHN0YWxlIGRhdGEgKi8KKwltZGlvX3JlYWQoZWVwcm9tWzZdICYgMHgxZiwgMSk7CisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBuZXR3b3JrIGNhYmxlIGlzIHBsdWdnZWQgaW4uCisJICogVGhpcyBhbGxvd3MgZm9yIGZhc3RlciBmYWlsdXJlIGlmIHRoZXJlIGlzIG5vdGhpbmcKKwkgKiB3ZSBjYW4gZG8uCisJICovCisJaWYgKCEobWRpb19yZWFkKGVlcHJvbVs2XSAmIDB4MWYsIDEpICYgKDEgPDwgMikpKSB7CisJCXByaW50ZigiVmFsaWQgbGluayBub3QgZXN0YWJsaXNoZWRcbiIpOworCQllZXBybzEwMF9kaXNhYmxlKGRldik7CisJCXJldHVybiAwOworCX0KIAotICBsb2FkX3RpbWVyMigxMCpUSUNLU19QRVJfTVMpOwotICB3aGlsZSAoIXR4ZmQuc3RhdHVzICYmIHRpbWVyMl9ydW5uaW5nKCkpCi0JLyogV2FpdCAqLzsKLQotICBuaWMtPnJlc2V0ID0gZWVwcm8xMDBfcmVzZXQ7Ci0gIG5pYy0+cG9sbCA9IGVlcHJvMTAwX3BvbGw7Ci0gIG5pYy0+dHJhbnNtaXQgPSBlZXBybzEwMF90cmFuc21pdDsKLSAgbmljLT5kaXNhYmxlID0gZWVwcm8xMDBfZGlzYWJsZTsKLSAgcmV0dXJuIG5pYzsKKwlkZXYtPmRpc2FibGUgID0gZWVwcm8xMDBfZGlzYWJsZTsKKwluaWMtPnBvbGwgICAgID0gZWVwcm8xMDBfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gZWVwcm8xMDBfdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgICA9IGVlcHJvMTAwX2lycTsKKwlyZXR1cm4gMTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYzOSwxNiArNzUxLDU5IEBACiAvKiBIZXhkdW1wIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gbWVtb3J5Li4uICovCiB2b2lkIGhkICh2b2lkICp3aGVyZSwgaW50IG4pCiB7Ci0gIGludCBpOworCWludCBpOwogCi0gIHdoaWxlIChuID4gMCkgewotICAgIHByaW50ZiAoIiVYICIsIHdoZXJlKTsKLSAgICBmb3IgKGk9MDtpIDwgKCAobj4xNik/MTY6bik7aSsrKQotICAgICAgcHJpbnRmICgiICVoaFgiLCAoKGNoYXIgKil3aGVyZSlbaV0pOwotICAgIHByaW50ZiAoIlxuIik7Ci0gICAgbiAtPSAxNjsKLSAgICB3aGVyZSArPSAxNjsKLSAgfQorCXdoaWxlIChuID4gMCkgeworCQlwcmludGYgKCIlWCAiLCB3aGVyZSk7CisJCWZvciAoaT0wO2kgPCAoIChuPjE2KT8xNjpuKTtpKyspCisJCQlwcmludGYgKCIgJWhoWCIsICgoY2hhciAqKXdoZXJlKVtpXSk7CisJCXByaW50ZiAoIlxuIik7CisJCW4gLT0gMTY7CisJCXdoZXJlICs9IDE2OworCX0KIH0KICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHBjaV9pZCBlZXBybzEwMF9uaWNzW10gPSB7CitQQ0lfUk9NKDB4ODA4NiwgMHgxMDI5LCAiaWQxMDI5IiwgICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgSUQxMDI5IiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDMwLCAiaWQxMDMwIiwgICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgSUQxMDMwIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDMxLCAiODI4MDFjYW0iLCAgICAgICJJbnRlbCA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDMyLCAiZWVwcm8xMDAtMTAzMiIsICJJbnRlbCBQUk8vMTAwIFZFIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzMywgImVlcHJvMTAwLTEwMzMiLCAiSW50ZWwgUFJPLzEwMCBWTSBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMzQsICJlZXBybzEwMC0xMDM0IiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM1LCAiZWVwcm8xMDAtMTAzNSIsICJJbnRlbCA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM2LCAiZWVwcm8xMDAtMTAzNiIsICJJbnRlbCA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM3LCAiZWVwcm8xMDAtMTAzNyIsICJJbnRlbCA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM4LCAiaWQxMDM4IiwgICAgICAgICJJbnRlbCBQUk8vMTAwIFZNIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzOSwgIjgyNTYyZXQiLCAgICAgICAiSW50ZWwgUFJPMTAwIFZFIDgyNTYyRVQiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwM2EsICJpZDEwM2EiLCAgICAgICAgIkludGVsIENvcnBvcmF0aW9uIDgyNTU5IEluQnVzaW5lc3MgMTAvMTAwIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNiLCAiODI1NjJldGIiLCAgICAgICJJbnRlbCBQUk8xMDAgVkUgODI1NjJFVEIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwM2MsICJlZXBybzEwMC0xMDNjIiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNkLCAiZWVwcm8xMDAtMTAzZCIsICJJbnRlbCBQUk8vMTAwIFZFIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzZSwgImVlcHJvMTAwLTEwM2UiLCAiSW50ZWwgUFJPLzEwMCBWTSBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNTksICI4MjU1MXFtIiwgICAgICAgIkludGVsIFBSTy8xMDAgTSBNb2JpbGUgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTIwOSwgIjgyNTU5ZXIiLCAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIDgyNTU5RVIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEyMjcsICI4Mjg2NSIsICAgICAgICAgIkludGVsIDgyODY1IEV0aGVyRXhwcmVzcyBQUk8vMTAwQSIpLAorUENJX1JPTSgweDgwODYsIDB4MTIyOCwgIjgyNTU2IiwgICAgICAgICAiSW50ZWwgODI1NTYgRXRoZXJFeHByZXNzIFBSTy8xMDAgU21hcnQiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEyMjksICJlZXBybzEwMCIsICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCIpLAorUENJX1JPTSgweDgwODYsIDB4MjQ0OSwgIjgyNTYyZW0iLCAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIDgyNTYyRU0iKSwKK1BDSV9ST00oMHg4MDg2LCAweDI0NTksICI4MjU2Mi0xIiwgICAgICAgIkludGVsIDgyNTYyIGJhc2VkIEZhc3QgRXRoZXJuZXQgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MjQ1ZCwgIjgyNTYyLTIiLCAgICAgICAiSW50ZWwgODI1NjIgYmFzZWQgRmFzdCBFdGhlcm5ldCBDb25uZWN0aW9uIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDUwLCAiODI1NjJleiIsICAgICAgICJJbnRlbCA4MjU2MkVaIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4NTIwMCwgImVlcHJvMTAwLTUyMDAiLCAiSW50ZWwgRXRoZXJFeHByZXNzIFBSTy8xMDAgSW50ZWxsaWdlbnQgU2VydmVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHg1MjAxLCAiZWVwcm8xMDAtNTIwMSIsICJJbnRlbCBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIiKSwKK307CisKKy8qIENhcmRzIHdpdGggZGV2aWNlIGlkcyAweDEwMzAgdG8gMHgxMDNGLCAweDI0NDksIDB4MjQ1OSBvciAweDI0NUQgbWlnaHQgbmVlZAorICogYSB3b3JrYXJvdW5kIGZvciBoYXJkd2FyZSBidWcgb24gMTAgbWJpdCBoYWxmIGR1cGxleCAoc2VlIGxpbnV4IGRyaXZlciBlZXBybzEwMC5jKQorICogMjAwMy8wMy8xNyBnYmF1bSAqLworCisKK3N0cnVjdCBwY2lfZHJpdmVyIGVlcHJvMTAwX2RyaXZlciA9IHsKKwkudHlwZSAgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgID0gIkVFUFJPMTAwIiwKKwkucHJvYmUgICAgID0gZWVwcm8xMDBfcHJvYmUsCisJLmlkcyAgICAgICA9IGVlcHJvMTAwX25pY3MsCisJLmlkX2NvdW50ICA9IHNpemVvZihlZXBybzEwMF9uaWNzKS9zaXplb2YoZWVwcm8xMDBfbmljc1swXSksCisJLmNsYXNzICAgICA9IDAKK307CkluZGV4OiBiL25ldGJvb3QvZWxmLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvZWxmLmgKQEAgLTAsMCArMSwyMzQgQEAKKyNpZm5kZWYgRUxGX0gKKyNkZWZpbmUgRUxGX0gKKworI2RlZmluZSBFSV9OSURFTlQJMTYJLyogU2l6ZSBvZiBlX2lkZW50IGFycmF5LiAqLworCisvKiBWYWx1ZXMgZm9yIGVfdHlwZS4gKi8KKyNkZWZpbmUgRVRfTk9ORQkJMAkvKiBObyBmaWxlIHR5cGUgKi8KKyNkZWZpbmUgRVRfUkVMCQkxCS8qIFJlbG9jYXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVRfRVhFQwkJMgkvKiBFeGVjdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVRfRFlOCQkzCS8qIFNoYXJlZCBvYmplY3QgZmlsZSAqLworI2RlZmluZSBFVF9DT1JFCQk0CS8qIENvcmUgZmlsZSAqLworCisvKiBWYWx1ZXMgZm9yIGVfbWFjaGluZSAoYXJjaGl0ZWN1dGUpLiAqLworI2RlZmluZSBFTV9OT05FCQkgMAkJLyogTm8gbWFjaGluZSAqLworI2RlZmluZSBFTV9NMzIJCSAxCQkvKiBBVCZUIFdFIDMyMTAwICovCisjZGVmaW5lIEVNX1NQQVJDCSAyCQkvKiBTVU4gU1BBUkMgKi8KKyNkZWZpbmUgRU1fMzg2CQkgMwkJLyogSW50ZWwgODAzODYrICovCisjZGVmaW5lIEVNXzY4SwkJIDQJCS8qIE1vdG9yb2xhIG02OGsgZmFtaWx5ICovCisjZGVmaW5lIEVNXzg4SwkJIDUJCS8qIE1vdG9yb2xhIG04OGsgZmFtaWx5ICovCisjZGVmaW5lIEVNXzQ4NgkJIDYJCS8qIFBlcmhhcHMgZGlzdXNlZCAqLworI2RlZmluZSBFTV84NjAJCSA3CQkvKiBJbnRlbCA4MDg2MCAqLworI2RlZmluZSBFTV9NSVBTCQkgOAkJLyogTUlQUyBSMzAwMCBiaWctZW5kaWFuICovCisjZGVmaW5lIEVNX1MzNzAJCSA5CQkvKiBJQk0gU3lzdGVtLzM3MCAqLworI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAkJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDCTE1CQkvKiBIUFBBICovCisjZGVmaW5lIEVNX1ZQUDUwMAkxNwkJLyogRnVqaXRzdSBWUFA1MDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJCS8qIFN1bidzICJ2OHBsdXMiICovCisjZGVmaW5lIEVNXzk2MAkJMTkJCS8qIEludGVsIDgwOTYwICovCisjZGVmaW5lIEVNX1BQQwkJMjAJCS8qIFBvd2VyUEMgKi8KKyNkZWZpbmUgRU1fUFBDNjQJMjEJCS8qIFBvd2VyUEMgNjQtYml0ICovCisjZGVmaW5lIEVNX1MzOTAJCTIyCQkvKiBJQk0gUzM5MCAqLworCisjZGVmaW5lIEVNX1Y4MDAJCTM2CQkvKiBORUMgVjgwMCBzZXJpZXMgKi8KKyNkZWZpbmUgRU1fRlIyMAkJMzcJCS8qIEZ1aml0c3UgRlIyMCAqLworI2RlZmluZSBFTV9SSDMyCQkzOAkJLyogVFJXIFJILTMyICovCisjZGVmaW5lIEVNX1JDRQkJMzkJCS8qIE1vdG9yb2xhIFJDRSAqLworI2RlZmluZSBFTV9BUk0JCTQwCQkvKiBBUk0gKi8KKyNkZWZpbmUgRU1fRkFLRV9BTFBIQQk0MQkJLyogRGlnaXRhbCBBbHBoYSAqLworI2RlZmluZSBFTV9TSAkJNDIJCS8qIEhpdGFjaGkgU0ggKi8KKyNkZWZpbmUgRU1fU1BBUkNWOQk0MwkJLyogU1BBUkMgdjkgNjQtYml0ICovCisjZGVmaW5lIEVNX1RSSUNPUkUJNDQJCS8qIFNpZW1lbnMgVHJpY29yZSAqLworI2RlZmluZSBFTV9BUkMJCTQ1CQkvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KKyNkZWZpbmUgRU1fSDhfMzAwCTQ2CQkvKiBIaXRhY2hpIEg4LzMwMCAqLworI2RlZmluZSBFTV9IOF8zMDBICTQ3CQkvKiBIaXRhY2hpIEg4LzMwMEggKi8KKyNkZWZpbmUgRU1fSDhTCQk0OAkJLyogSGl0YWNoaSBIOFMgKi8KKyNkZWZpbmUgRU1fSDhfNTAwCTQ5CQkvKiBIaXRhY2hpIEg4LzUwMCAqLworI2RlZmluZSBFTV9JQV82NAk1MAkJLyogSW50ZWwgTWVyY2VkICovCisjZGVmaW5lIEVNX01JUFNfWAk1MQkJLyogU3RhbmZvcmQgTUlQUy1YICovCisjZGVmaW5lIEVNX0NPTERGSVJFCTUyCQkvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLworI2RlZmluZSBFTV82OEhDMTIJNTMJCS8qIE1vdG9yb2xhIE02OEhDMTIgKi8KKyNkZWZpbmUgRU1fTU1BCQk1NAkJLyogRnVqaXRzdSBNTUEgTXVsdGltZWRpYSBBY2NlbGVyYXRvciovCisjZGVmaW5lIEVNX1BDUAkJNTUJCS8qIFNpZW1lbnMgUENQICovCisjZGVmaW5lIEVNX05DUFUJCTU2CQkvKiBTb255IG5DUFUgZW1iZWVkZWQgUklTQyAqLworI2RlZmluZSBFTV9ORFIxCQk1NwkJLyogRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVEFSQ09SRQk1OAkJLyogTW90b3JvbGEgU3RhcnQqQ29yZSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fTUUxNgkJNTkJCS8qIFRveW90YSBNRTE2IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVDEwMAk2MAkJLyogU1RNaWNyb2VsZWN0cm9uaWMgU1QxMDAgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1RJTllKCTYxCQkvKiBBZHZhbmNlZCBMb2dpYyBDb3JwLiBUaW55aiBlbWIuZmFtKi8KKyNkZWZpbmUgRU1fWDg2XzY0CTYyCQkvKiBBTUQgeDg2LTY0IGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9QRFNQCQk2MwkJLyogU29ueSBEU1AgUHJvY2Vzc29yICovCisKKyNkZWZpbmUgRU1fRlg2NgkJNjYJCS8qIFNpZW1lbnMgRlg2NiBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fU1Q5UExVUwk2NwkJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUOSsgOC8xNiBtYyAqLworI2RlZmluZSBFTV9TVDcJCTY4CQkvKiBTVG1pY3JvZWxlY3Ryb25pY3MgU1Q3IDggYml0IG1jICovCisjZGVmaW5lIEVNXzY4SEMxNgk2OQkJLyogTW90b3JvbGEgTUM2OEhDMTYgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMxMQk3MAkJLyogTW90b3JvbGEgTUM2OEhDMTEgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwOAk3MQkJLyogTW90b3JvbGEgTUM2OEhDMDggbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwNQk3MgkJLyogTW90b3JvbGEgTUM2OEhDMDUgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX1NWWAkJNzMJCS8qIFNpbGljb24gR3JhcGhpY3MgU1Z4ICovCisjZGVmaW5lIEVNX0FUMTkJCTc0CQkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1QxOSA4IGJpdCBtYyAqLworI2RlZmluZSBFTV9WQVgJCTc1CQkvKiBEaWdpdGFsIFZBWCAqLworI2RlZmluZSBFTV9DUklTCQk3NgkJLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0pBVkVMSU4JNzcJCS8qIEluZmluZW9uIFRlY2hub2xvZ2llcyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0ZJUkVQQVRICTc4CQkvKiBFbGVtZW50IDE0IDY0LWJpdCBEU1AgUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1pTUAkJNzkJCS8qIExTSSBMb2dpYyAxNi1iaXQgRFNQIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NTUlYCQk4MAkJLyogRG9uYWxkIEtudXRoJ3MgZWR1Y2F0aW9uYWwgNjQtYml0IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9IVUFOWQk4MQkJLyogSGFydmFyZCBVbml2ZXJzaXR5IG1hY2hpbmUtaW5kZXBlbmRlbnQgb2JqZWN0IGZpbGVzICovCisjZGVmaW5lIEVNX1BSSVNNCTgyCQkvKiBTaVRlcmEgUHJpc20gKi8KKyNkZWZpbmUgRU1fQVZSCQk4MwkJLyogQXRtZWwgQVZSIDgtYml0IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9GUjMwCQk4NAkJLyogRnVqaXRzdSBGUjMwICovCisjZGVmaW5lIEVNX0QxMFYJCTg1CQkvKiBNaXRzdWJpc2hpIEQxMFYgKi8KKyNkZWZpbmUgRU1fRDMwVgkJODYJCS8qIE1pdHN1YmlzaGkgRDMwViAqLworI2RlZmluZSBFTV9WODUwCQk4NwkJLyogTkVDIHY4NTAgKi8KKyNkZWZpbmUgRU1fTTMyUgkJODgJCS8qIE1pdHN1YmlzaGkgTTMyUiAqLworI2RlZmluZSBFTV9NTjEwMzAwCTg5CQkvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KKyNkZWZpbmUgRU1fTU4xMDIwMAk5MAkJLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCisjZGVmaW5lIEVNX1BKCQk5MQkJLyogcGljb0phdmEgKi8KKyNkZWZpbmUgRU1fT1BFTlJJU0MJOTIJCS8qIE9wZW5SSVNDIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fQVJDX0E1CTkzCQkvKiBBUkMgQ29yZXMgVGFuZ2VudC1BNSAqLworI2RlZmluZSBFTV9YVEVOU0EJOTQJCS8qIFRlbnNpbGljYSBYdGVuc2EgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX05VTQkJOTUKKworLyogVmFsdWVzIGZvciBwX3R5cGUuICovCisjZGVmaW5lIFBUX05VTEwJCTAJLyogVW51c2VkIGVudHJ5LiAqLworI2RlZmluZSBQVF9MT0FECQkxCS8qIExvYWRhYmxlIHNlZ21lbnQuICovCisjZGVmaW5lIFBUX0RZTkFNSUMJMgkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gc2VnbWVudC4gKi8KKyNkZWZpbmUgUFRfSU5URVJQCTMJLyogUGF0aG5hbWUgb2YgaW50ZXJwcmV0ZXIuICovCisjZGVmaW5lIFBUX05PVEUJCTQJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAqLworI2RlZmluZSBQVF9TSExJQgk1CS8qIFJlc2VydmVkIChub3QgdXNlZCkuICovCisjZGVmaW5lIFBUX1BIRFIJCTYJLyogTG9jYXRpb24gb2YgcHJvZ3JhbSBoZWFkZXIgaXRzZWxmLiAqLworCisvKiBWYWx1ZXMgZm9yIHBfZmxhZ3MuICovCisjZGVmaW5lIFBGX1gJCTB4MQkvKiBFeGVjdXRhYmxlLiAqLworI2RlZmluZSBQRl9XCQkweDIJLyogV3JpdGFibGUuICovCisjZGVmaW5lIFBGX1IJCTB4NAkvKiBSZWFkYWJsZS4gKi8KKworCisjZGVmaW5lCUVMRl9QUk9HUkFNX1JFVFVSTlNfQklUCTB4ODAwMDAwMAkvKiBlX2ZsYWdzIGJpdCAzMSAqLworCisjZGVmaW5lIEVJX01BRzAJCTAKKyNkZWZpbmUgRUxGTUFHMAkJMHg3ZgorCisjZGVmaW5lIEVJX01BRzEJCTEKKyNkZWZpbmUgRUxGTUFHMQkJJ0UnCisKKyNkZWZpbmUgRUlfTUFHMgkJMgorI2RlZmluZSBFTEZNQUcyCQknTCcKKworI2RlZmluZSBFSV9NQUczCQkzCisjZGVmaW5lIEVMRk1BRzMJCSdGJworCisjZGVmaW5lIEVMRk1BRwkJIlwxNzdFTEYiCisKKyNkZWZpbmUgRUlfQ0xBU1MJNAkvKiBGaWxlIGNsYXNzIGJ5dGUgaW5kZXggKi8KKyNkZWZpbmUgRUxGQ0xBU1NOT05FCTAJLyogSW52YWxpZCBjbGFzcyAqLworI2RlZmluZSBFTEZDTEFTUzMyCTEJLyogMzItYml0IG9iamVjdHMgKi8KKyNkZWZpbmUgRUxGQ0xBU1M2NAkyCS8qIDY0LWJpdCBvYmplY3RzICovCisKKyNkZWZpbmUgRUlfREFUQQkJNQkvKiBEYXRhIGVuY29kZWluZyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkRBVEFOT05FCTAJLyogSW52YWxpZCBkYXRhIGVuY29kaW5nICovCisjZGVmaW5lIEVMRkRBVEEyTFNCCTEJLyogMidzIGNvbXBsZW1lbnQgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBMk1TQgkyCS8qIDIncyBjb21wbGVtZW50IGJpZyBlbmRpYW4gKi8KKworI2RlZmluZSBFSV9WRVJTSU9OCTYJLyogRmlsZSB2ZXJzaW9uIGJ5dGUgaW5kZXggKi8KKwkJCQkvKiBWYWx1ZSBtdXN0IGJlIEVWX0NVUlJFTlQgKi8KKworI2RlZmluZSBFVl9OT05FCQkwCS8qIEludmFsaWQgRUxGIFZlcnNpb24gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVAkxCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworCisjZGVmaW5lIEVMRjMyX1BIRFJfU0laRSAoOCo0KQkvKiBTaXplIG9mIGFuIGVsZiBwcm9ncmFtIGhlYWRlciAqLworCisjaWZuZGVmIEFTU0VNQkxZCisvKgorICogRUxGIGRlZmluaXRpb25zIGNvbW1vbiB0byBhbGwgMzItYml0IGFyY2hpdGVjdHVyZXMuCisgKi8KKwordHlwZWRlZiB1aW50MzJfdAlFbGYzMl9BZGRyOwordHlwZWRlZiB1aW50MTZfdAlFbGYzMl9IYWxmOwordHlwZWRlZiB1aW50MzJfdAlFbGYzMl9PZmY7Cit0eXBlZGVmIGludDMyX3QJCUVsZjMyX1N3b3JkOwordHlwZWRlZiB1aW50MzJfdAlFbGYzMl9Xb3JkOwordHlwZWRlZiB1aW50MzJfdAlFbGYzMl9TaXplOworCit0eXBlZGVmIHVpbnQ2NF90CUVsZjY0X0FkZHI7Cit0eXBlZGVmIHVpbnQxNl90CUVsZjY0X0hhbGY7Cit0eXBlZGVmIHVpbnQ2NF90CUVsZjY0X09mZjsKK3R5cGVkZWYgaW50MzJfdAkJRWxmNjRfU3dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90CUVsZjY0X1dvcmQ7Cit0eXBlZGVmIHVpbnQ2NF90CUVsZjY0X1NpemU7CisKKy8qCisgKiBFTEYgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIEZpbGUgaWRlbnRpZmljYXRpb24uICovCisJRWxmMzJfSGFsZgllX3R5cGU7CQkvKiBGaWxlIHR5cGUuICovCisJRWxmMzJfSGFsZgllX21hY2hpbmU7CS8qIE1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAqLworCUVsZjMyX1dvcmQJZV92ZXJzaW9uOwkvKiBFTEYgZm9ybWF0IHZlcnNpb24uICovCisJRWxmMzJfQWRkcgllX2VudHJ5OwkvKiBFbnRyeSBwb2ludC4gKi8KKwlFbGYzMl9PZmYJZV9waG9mZjsJLyogUHJvZ3JhbSBoZWFkZXIgZmlsZSBvZmZzZXQuICovCisJRWxmMzJfT2ZmCWVfc2hvZmY7CS8qIFNlY3Rpb24gaGVhZGVyIGZpbGUgb2Zmc2V0LiAqLworCUVsZjMyX1dvcmQJZV9mbGFnczsJLyogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzLiAqLworCUVsZjMyX0hhbGYJZV9laHNpemU7CS8qIFNpemUgb2YgRUxGIGhlYWRlciBpbiBieXRlcy4gKi8KKwlFbGYzMl9IYWxmCWVfcGhlbnRzaXplOwkvKiBTaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5LiAqLworCUVsZjMyX0hhbGYJZV9waG51bTsJLyogTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXMuICovCisJRWxmMzJfSGFsZgllX3NoZW50c2l6ZTsJLyogU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyeS4gKi8KKwlFbGYzMl9IYWxmCWVfc2hudW07CS8qIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzLiAqLworCUVsZjMyX0hhbGYJZV9zaHN0cm5keDsJLyogU2VjdGlvbiBuYW1lIHN0cmluZ3Mgc2VjdGlvbi4gKi8KK30gRWxmMzJfRWhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uLiAqLworCUVsZjY0X0hhbGYJZV90eXBlOwkJLyogRmlsZSB0eXBlLiAqLworCUVsZjY0X0hhbGYJZV9tYWNoaW5lOwkvKiBNYWNoaW5lIGFyY2hpdGVjdHVyZS4gKi8KKwlFbGY2NF9Xb3JkCWVfdmVyc2lvbjsJLyogRUxGIGZvcm1hdCB2ZXJzaW9uLiAqLworCUVsZjY0X0FkZHIJZV9lbnRyeTsJLyogRW50cnkgcG9pbnQuICovCisJRWxmNjRfT2ZmCWVfcGhvZmY7CS8qIFByb2dyYW0gaGVhZGVyIGZpbGUgb2Zmc2V0LiAqLworCUVsZjY0X09mZgllX3Nob2ZmOwkvKiBTZWN0aW9uIGhlYWRlciBmaWxlIG9mZnNldC4gKi8KKwlFbGY2NF9Xb3JkCWVfZmxhZ3M7CS8qIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncy4gKi8KKwlFbGY2NF9IYWxmCWVfZWhzaXplOwkvKiBTaXplIG9mIEVMRiBoZWFkZXIgaW4gYnl0ZXMuICovCisJRWxmNjRfSGFsZgllX3BoZW50c2l6ZTsJLyogU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeS4gKi8KKwlFbGY2NF9IYWxmCWVfcGhudW07CS8qIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzLiAqLworCUVsZjY0X0hhbGYJZV9zaGVudHNpemU7CS8qIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cnkuICovCisJRWxmNjRfSGFsZgllX3NobnVtOwkvKiBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllcy4gKi8KKwlFbGY2NF9IYWxmCWVfc2hzdHJuZHg7CS8qIFNlY3Rpb24gbmFtZSBzdHJpbmdzIHNlY3Rpb24uICovCit9IEVsZjY0X0VoZHI7CisKKy8qCisgKiBQcm9ncmFtIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUVsZjMyX1dvcmQJcF90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwlFbGYzMl9PZmYJcF9vZmZzZXQ7CS8qIEZpbGUgb2Zmc2V0IG9mIGNvbnRlbnRzLiAqLworCUVsZjMyX0FkZHIJcF92YWRkcjsJLyogVmlydHVhbCBhZGRyZXNzIChub3QgdXNlZCkuICovCisJRWxmMzJfQWRkcglwX3BhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzLiAqLworCUVsZjMyX1NpemUJcF9maWxlc3o7CS8qIFNpemUgb2YgY29udGVudHMgaW4gZmlsZS4gKi8KKwlFbGYzMl9TaXplCXBfbWVtc3o7CS8qIFNpemUgb2YgY29udGVudHMgaW4gbWVtb3J5LiAqLworCUVsZjMyX1dvcmQJcF9mbGFnczsJLyogQWNjZXNzIHBlcm1pc3Npb24gZmxhZ3MuICovCisJRWxmMzJfU2l6ZQlwX2FsaWduOwkvKiBBbGlnbm1lbnQgaW4gbWVtb3J5IGFuZCBmaWxlLiAqLworfSBFbGYzMl9QaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisJRWxmNjRfV29yZAlwX3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCUVsZjY0X1dvcmQJcF9mbGFnczsJLyogQWNjZXNzIHBlcm1pc3Npb24gZmxhZ3MuICovCisJRWxmNjRfT2ZmCXBfb2Zmc2V0OwkvKiBGaWxlIG9mZnNldCBvZiBjb250ZW50cy4gKi8KKwlFbGY2NF9BZGRyCXBfdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyAobm90IHVzZWQpLiAqLworCUVsZjY0X0FkZHIJcF9wYWRkcjsJLyogUGh5c2ljYWwgYWRkcmVzcy4gKi8KKwlFbGY2NF9TaXplCXBfZmlsZXN6OwkvKiBTaXplIG9mIGNvbnRlbnRzIGluIGZpbGUuICovCisJRWxmNjRfU2l6ZQlwX21lbXN6OwkvKiBTaXplIG9mIGNvbnRlbnRzIGluIG1lbW9yeS4gKi8KKwlFbGY2NF9TaXplCXBfYWxpZ247CS8qIEFsaWdubWVudCBpbiBtZW1vcnkgYW5kIGZpbGUuICovCit9IEVsZjY0X1BoZHI7CisKKy8qIFN0YW5kYXJkaXplZCBFbGYgaW1hZ2Ugbm90ZXMgZm9yIGJvb3RpbmcuLi4gVGhlIG5hbWUgZm9yIGFsbCBvZiB0aGVzZSBpcyBFTEZCb290ICovCisKKworLyogRUxGIERlZmluZXMgZm9yIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSAqLworI2luY2x1ZGUgImkzODZfZWxmLmgiCisKKyNlbmRpZiAvKiBBU1NFTUJMWSAqLworCisvLyNpbmNsdWRlICJlbGZfYm9vdC5oIgorCisjZW5kaWYgLyogRUxGX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9lbmRpYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9lbmRpYW4uaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIEVUSEVSQk9PVF9FTkRJQU5fSAorI2RlZmluZSBFVEhFUkJPT1RfRU5ESUFOX0gKKworLyogRGVmaW5pdGlvbnMgZm9yIGJ5dGUgb3JkZXIsIGFjY29yZGluZyB0byBzaWduaWZpY2FuY2Ugb2YgYnl0ZXMsCisgICBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuICBUaGUgdmFsdWUgaXMgd2hhdCB5b3UgZ2V0IGJ5CisgICBwdXR0aW5nICc0JyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCAnMycgaW4gdGhlIHNlY29uZCBtb3N0CisgICBzaWduaWZpY2FudCBieXRlLCAnMicgaW4gdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgJzEnCisgICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kIHRoZW4gd3JpdGluZyBkb3duIG9uZSBkaWdpdCBmb3IKKyAgIGVhY2ggYnl0ZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MgYXQgdGhlIGxlZnQsCisgICBhbmQgcHJvY2VlZGluZyB0byB0aGUgYnl0ZSB3aXRoIHRoZSBoaWdoZXN0IGFkZHJlc3MgYXQgdGhlIHJpZ2h0LiAgKi8KKworI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorI2RlZmluZSBfX0JJR19FTkRJQU4gICAgNDMyMQorI2RlZmluZSBfX1BEUF9FTkRJQU4gICAgMzQxMgorCisjaW5jbHVkZSAiaTM4Nl9lbmRpYW4uaCIKKworCisjZW5kaWYgLyogRVRIRVJCT09UX0VORElBTl9IICovCkluZGV4OiBiL25ldGJvb3QvZXBpYzEwMC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9lcGljMTAwLmMKKysrIGIvbmV0Ym9vdC9lcGljMTAwLmMKQEAgLTEsMTUgKzEsMTggQEAKKwogLyogZXBpYzEwMC5jOiBBIFNNQyA4M2MxNzAgRVBJQy8xMDAgZmFzdCBldGhlcm5ldCBkcml2ZXIgZm9yIEV0aGVyYm9vdCAqLwogCisvKiAwNS8wNi8yMDAzCXRpbWxlZ2dlCUZpeGVkIHJlbG9jYXRpb24gYW5kIGltcGxlbWVudGVkIE11bHRpY2FzdCAqLwogI2RlZmluZSBMSU5VWF9PVVRfTUFDUk9TCiAKICNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJwY2kuaCIKICNpbmNsdWRlICJuaWMuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgogI2luY2x1ZGUgInRpbWVyLmgiCiAjaW5jbHVkZSAiZXBpYzEwMC5oIgogCi0jdW5kZWYJdmlydF90b19idXMKLSNkZWZpbmUJdmlydF90b19idXMoeCkJKCh1bnNpZ25lZCBsb25nKXgpCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkgKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKQljcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKQlidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKIAogI2RlZmluZSBUWF9SSU5HX1NJWkUJMgkvKiB1c2UgYXQgbGVhc3QgMiBidWZmZXJzIGZvciBUWCAqLwogI2RlZmluZSBSWF9SSU5HX1NJWkUJMgpAQCAtMjYsMjMgKzI5LDE4IEBACiAKIC8qIFRoZSBFUElDMTAwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCiBzdHJ1Y3QgZXBpY19yeF9kZXNjIHsKLSAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Ci0gICAgdW5zaWduZWQgc2hvcnQgcnhsZW5ndGg7Ci0gICAgdW5zaWduZWQgbG9uZyAgYnVmYWRkcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBidWZsZW5ndGg7Ci0gICAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKLSAgICB1bnNpZ25lZCBsb25nICBuZXh0OworICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzOworICAgIHVuc2lnbmVkIGxvbmcgYnVmYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIG5leHQ7CiB9OwotCiAvKiBkZXNjcmlwdGlvbiBvZiB0aGUgdHggZGVzY3JpcHRvcnMgY29udHJvbCBiaXRzIGNvbW1vbmx5IHVzZWQgKi8KICNkZWZpbmUgVERfU1RERkxBR1MJVERfTEFTVERFU0MKIAogc3RydWN0IGVwaWNfdHhfZGVzYyB7Ci0gICAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotICAgIHVuc2lnbmVkIHNob3J0IHR4bGVuZ3RoOwotICAgIHVuc2lnbmVkIGxvbmcgIGJ1ZmFkZHI7Ci0gICAgdW5zaWduZWQgc2hvcnQgYnVmbGVuZ3RoOwotICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyb2w7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0dXM7CisgICAgdW5zaWduZWQgbG9uZyBidWZhZGRyOworICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuZ3RoOwogICAgIHVuc2lnbmVkIGxvbmcgIG5leHQ7CiB9OwogCkBAIC01MSwxMiArNDksMTUgQEAKIAogc3RhdGljIHZvaWQJZXBpYzEwMF9vcGVuKHZvaWQpOwogc3RhdGljIHZvaWQJZXBpYzEwMF9pbml0X3Jpbmcodm9pZCk7Ci1zdGF0aWMgdm9pZAllcGljMTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyBpbnQJZXBpYzEwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZAllcGljMTAwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KTsKK3N0YXRpYyBpbnQJZXBpYzEwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKIHN0YXRpYyB2b2lkCWVwaWMxMDBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkZXN0YWRkciwKIAkJCQkgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpOworI2lmZGVmCURFQlVHX0VFUFJPTQogc3RhdGljIGludAlyZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pOworI2VuZGlmCiBzdGF0aWMgaW50CW1paV9yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCAgICAgZXBpYzEwMF9pcnEoc3RydWN0IG5pYyAqbmljLCBpcnFfYWN0aW9uX3QgYWN0aW9uKTsKIAogc3RhdGljIGludAlpb2FkZHI7CiAKQEAgLTY5LDYgKzcwLDcgQEAKIHN0YXRpYyBpbnQJbW1jdGwgIDsKIHN0YXRpYyBpbnQJbW1kYXRhIDsKIHN0YXRpYyBpbnQJbGFuMCAgIDsKK3N0YXRpYyBpbnQJbWMwICAgIDsKIHN0YXRpYyBpbnQJcnhjb24gIDsKIHN0YXRpYyBpbnQJdHhjb24gIDsKIHN0YXRpYyBpbnQJcHJjZGFyIDsKQEAgLTgwLDM3ICs4MiwyNyBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0CWVlcHJvbVs2NF07CiAjZW5kaWYKIHN0YXRpYyBzaWduZWQgY2hhcglwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCi1zdGF0aWMgc3RydWN0IGVwaWNfcnhfZGVzYwlyeF9yaW5nW1JYX1JJTkdfU0laRV07Ci1zdGF0aWMgc3RydWN0IGVwaWNfdHhfZGVzYwl0eF9yaW5nW1RYX1JJTkdfU0laRV07Ci0jaWZkZWYJVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgcnhfcGFja2V0ICgoY2hhciAqKTB4MTAwMDAgLSBQS1RfQlVGX1NaICogUlhfUklOR19TSVpFKQotI2RlZmluZSB0eF9wYWNrZXQgKChjaGFyICopMHgxMDAwMCAtIFBLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkUgLSBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFKQotI2Vsc2UKLXN0YXRpYyBjaGFyCQlyeF9wYWNrZXRbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV07Ci1zdGF0aWMgY2hhcgkJdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkVdOwotI2VuZGlmCitzdGF0aWMgc3RydWN0IGVwaWNfcnhfZGVzYwlyeF9yaW5nW1JYX1JJTkdfU0laRV0KKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworc3RhdGljIHN0cnVjdCBlcGljX3R4X2Rlc2MJdHhfcmluZ1tUWF9SSU5HX1NJWkVdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCSAJcnhfcGFja2V0W1BLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkVdOworc3RhdGljIHVuc2lnbmVkIGNoYXIJCXR4X3BhY2tldFtQS1RfQlVGX1NaICogVFhfUklOR19TSVpFXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgc3RhdGljIHZvaWQKLWVwaWMxMDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotICAgIC8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCi0gICAgb3V0bChHQ19TT0ZUX1JFU0VULCBnZW5jdGwpOwotfQogCi0gICAgc3RydWN0IG5pYyoKLWVwaWMxMDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycykKKyAgICBzdGF0aWMgaW50CitlcGljMTAwX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKLSAgICB1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOwotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogICAgIGludCBpOwogICAgIHVuc2lnbmVkIHNob3J0KiBhcDsKICAgICB1bnNpZ25lZCBpbnQgcGh5LCBwaHlfaWR4OwogCi0gICAgaWYgKHByb2JlYWRkcnMgPT0gMCB8fCBwcm9iZWFkZHJzWzBdID09IDApCisgICAgaWYgKHBjaS0+aW9hZGRyID09IDApCiAJcmV0dXJuIDA7CiAKICAgICAvKiBJZGVhbGx5IHdlIHdvdWxkIGRldGVjdCBhbGwgbmV0d29yayBjYXJkcyBpbiBzbG90IG9yZGVyLiAgVGhhdCB3b3VsZApAQCAtMTE4LDcgKzExMCw5IEBACiAgICAgICAgd2VsbCB3aXRoIHRoZSBjdXJyZW50IHN0cnVjdHVyZS4gIFNvIGluc3RlYWQgd2UgZGV0ZWN0IGp1c3QgdGhlCiAgICAgICAgRXBpYyBjYXJkcyBpbiBzbG90IG9yZGVyLiAqLwogCi0gICAgaW9hZGRyID0gcHJvYmVhZGRyc1swXSAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisgICAgaW9hZGRyID0gcGNpLT5pb2FkZHI7CisgICAgbmljLT5pcnFubyAgPSAwOworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKIAogICAgIC8qIGNvbXB1dGUgYWxsIHVzZWQgc3RhdGljIGVwaWMxMDAgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KICAgICBjb21tYW5kID0gaW9hZGRyICsgQ09NTUFORDsJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KQEAgLTEzMCw2ICsxMjQsNyBAQAogICAgIG1tY3RsICAgPSBpb2FkZHIgKyBNTUNUTDsJCS8qIE1JSSBNYW5hZ2VtZW50IEludGVyZmFjZSBDb250cm9sICovCiAgICAgbW1kYXRhICA9IGlvYWRkciArIE1NREFUQTsJCS8qIE1JSSBNYW5hZ2VtZW50IEludGVyZmFjZSBEYXRhICovCiAgICAgbGFuMCAgICA9IGlvYWRkciArIExBTjA7CQkvKiBNQUMgYWRkcmVzcy4gKDB4NDAtMHg0OCkgKi8KKyAgICBtYzAgICAgID0gaW9hZGRyICsgTUMwOyAJCS8qIE11bHRpY2FzdCBDb250cm9sICovCiAgICAgcnhjb24gICA9IGlvYWRkciArIFJYQ09OOwkJLyogUmVjZWl2ZSBDb250cm9sICovCiAgICAgdHhjb24gICA9IGlvYWRkciArIFRYQ09OOwkJLyogVHJhbnNtaXQgQ29udHJvbCAqLwogICAgIHByY2RhciAgPSBpb2FkZHIgKyBQUkNEQVI7CQkvKiBQQ0kgUmVjZWl2ZSBDdXJyZW50IERlc2NyIEFkZHJlc3MgKi8KQEAgLTE2MCwxMSArMTU1LDE1IEBACiAgICAgfQogCiAjaWZkZWYJREVCVUdfRUVQUk9NCit7CisgICAgdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogCXZhbHVlID0gcmVhZF9lZXByb20oaSk7CiAJZWVwcm9tW2ldID0gdmFsdWU7CiAJc3VtICs9IHZhbHVlOwogICAgIH0KK30KIAogI2lmCShFUElDX0RFQlVHID4gMSkKICAgICBwcmludGYoIkVFUFJPTSBjb250ZW50c1xuIik7CkBAIC0yMDIsMTUgKzIwMSwyNiBAQAogCiAgICAgZXBpYzEwMF9vcGVuKCk7CiAKLSAgICBuaWMtPnJlc2V0ICAgID0gZXBpYzEwMF9yZXNldDsKKyAgICBkZXYtPmRpc2FibGUgID0gZXBpYzEwMF9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSBlcGljMTAwX3BvbGw7CiAgICAgbmljLT50cmFuc21pdCA9IGVwaWMxMDBfdHJhbnNtaXQ7Ci0gICAgbmljLT5kaXNhYmxlICA9IGVwaWMxMDBfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gZXBpYzEwMF9pcnE7CiAKLSAgICByZXR1cm4gbmljOworICAgIHJldHVybiAxOwogfQogCi0gICAgc3RhdGljIHZvaWQKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBtY19maWx0ZXJbOF07CisJaW50IGk7CisJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCW91dGwoMHgwQywgcnhjb24pOworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwkJb3V0dygoKHVuc2lnbmVkIHNob3J0ICopbWNfZmlsdGVyKVtpXSwgbWMwICsgaSo0KTsKKwlyZXR1cm47Cit9CisJCisgICBzdGF0aWMgdm9pZAogZXBpYzEwMF9vcGVuKHZvaWQpCiB7CiAgICAgaW50IG1paV9yZWc1OwpAQCAtMjM3LDExICsyNDcsMTEgQEAKICAgICBvdXRsKHRtcCwgdHhjb24pOwogCiAgICAgLyogR2l2ZSBhZHJlc3Mgb2YgUlggYW5kIFRYIHJpbmcgdG8gdGhlIGNoaXAgKi8KLSAgICBvdXRsKHZpcnRfdG9fYnVzKCZyeF9yaW5nKSwgcHJjZGFyKTsKLSAgICBvdXRsKHZpcnRfdG9fYnVzKCZ0eF9yaW5nKSwgcHRjZGFyKTsKKyAgICBvdXRsKHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmcpLCBwcmNkYXIpOworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmdHhfcmluZyksIHB0Y2Rhcik7CiAKICAgICAvKiBTdGFydCB0aGUgY2hpcCdzIFJ4IHByb2Nlc3M6IHJlY2VpdmUgdW5pY2FzdCBhbmQgYnJvYWRjYXN0ICovCi0gICAgb3V0bCgweDA0LCByeGNvbik7CisgICAgc2V0X3J4X21vZGUoKTsKICAgICBvdXRsKENSX1NUQVJUX1JYIHwgQ1JfUVVFVUVfUlgsIGNvbW1hbmQpOwogCiAgICAgcHV0Y2hhcignXG4nKTsKQEAgLTI1MiwzNCArMjYyLDMwIEBACiBlcGljMTAwX2luaXRfcmluZyh2b2lkKQogewogICAgIGludCBpOwotICAgIGNoYXIqIHA7CiAKICAgICBjdXJfcnggPSBjdXJfdHggPSAwOwogCi0gICAgcCA9ICZyeF9wYWNrZXRbMF07CiAgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7Ci0JcnhfcmluZ1tpXS5zdGF0dXMgICAgPSBSUklOR19PV047CS8qIE93bmVkIGJ5IEVwaWMgY2hpcCAqLwotCXJ4X3JpbmdbaV0uYnVmbGVuZ3RoID0gUEtUX0JVRl9TWjsKLQlyeF9yaW5nW2ldLmJ1ZmFkZHIgICA9IHZpcnRfdG9fYnVzKHAgKyAoUEtUX0JVRl9TWiAqIGkpKTsKLQlyeF9yaW5nW2ldLmNvbnRyb2wgICA9IDA7Ci0JcnhfcmluZ1tpXS5uZXh0ICAgICAgPSB2aXJ0X3RvX2J1cygmKHJ4X3JpbmdbaSArIDFdKSApOworCXJ4X3JpbmdbaV0uc3RhdHVzICAgID0gY3B1X3RvX2xlMzIoUlJJTkdfT1dOKTsJLyogT3duZWQgYnkgRXBpYyBjaGlwICovCisJcnhfcmluZ1tpXS5idWZsZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaKTsKKwlyeF9yaW5nW2ldLmJ1ZmFkZHIgICA9IHZpcnRfdG9fYnVzKCZyeF9wYWNrZXRbaSAqIFBLVF9CVUZfU1pdKTsKKwlyeF9yaW5nW2ldLm5leHQgICAgICA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSArIDFdKSA7CiAgICAgfQogICAgIC8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCi0gICAgcnhfcmluZ1tpLTFdLm5leHQgPSB2aXJ0X3RvX2J1cygmcnhfcmluZ1swXSk7CisgICAgcnhfcmluZ1tpLTFdLm5leHQgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKIAogICAgIC8qCiAgICAgICpUaGUgVHggYnVmZmVyIGRlc2NyaXB0b3IgaXMgZmlsbGVkIGluIGFzIG5lZWRlZCwKICAgICAgKiBidXQgd2UgZG8gbmVlZCB0byBjbGVhciB0aGUgb3duZXJzaGlwIGJpdC4KICAgICAgKi8KLSAgICBwID0gJnR4X3BhY2tldFswXTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgewotCXR4X3JpbmdbaV0uc3RhdHVzICA9IDA7CQkJLyogT3duZWQgYnkgQ1BVICovCi0JdHhfcmluZ1tpXS5idWZhZGRyID0gdmlydF90b19idXMocCArIChQS1RfQlVGX1NaICogaSkpOwotCXR4X3JpbmdbaV0uY29udHJvbCA9IFREX1NUREZMQUdTOwotCXR4X3JpbmdbaV0ubmV4dCAgICA9IHZpcnRfdG9fYnVzKCYodHhfcmluZ1tpICsgMV0pICk7CisJdHhfcmluZ1tpXS5zdGF0dXMgID0gMHgwMDAwOwkJCS8qIE93bmVkIGJ5IENQVSAqLworICAgIAl0eF9yaW5nW2ldLmJ1Zmxlbmd0aCA9IDB4MDAwMCB8IGNwdV90b19sZTMyKFREX1NUREZMQUdTIDw8IDE2KTsKKwl0eF9yaW5nW2ldLmJ1ZmFkZHIgPSB2aXJ0X3RvX2J1cygmdHhfcGFja2V0W2kgKiBQS1RfQlVGX1NaXSk7CisJdHhfcmluZ1tpXS5uZXh0ICAgID0gdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1tpICsgMV0pOwogICAgIH0KLSAgICB0eF9yaW5nW2ktMV0ubmV4dCA9IHZpcnRfdG9fYnVzKCZ0eF9yaW5nWzBdKTsKKwl0eF9yaW5nW2ktMV0ubmV4dCAgICA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pOwogfQogCiAvKiBmdW5jdGlvbjogZXBpYzEwMF90cmFuc21pdApAQCAtMjk2LDcgKzMwMiw3IEBACiAJCSB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpkYXRhKQogewogICAgIHVuc2lnbmVkIHNob3J0IG5zdHlwZTsKLSAgICBjaGFyKiB0eHA7CisgICAgdW5zaWduZWQgY2hhciAqdHhwOwogICAgIGludCBlbnRyeTsKIAogICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLwpAQCAtMzEwLDcgKzMxNiw3IEBACiAJcmV0dXJuOwogICAgIH0KIAotICAgIHR4cCA9IChjaGFyKil0eF9yaW5nW2VudHJ5XS5idWZhZGRyOworICAgIHR4cCA9IHR4X3BhY2tldCArIChlbnRyeSAqIFBLVF9CVUZfU1opOwogCiAgICAgbWVtY3B5KHR4cCwgZGVzdGFkZHIsIEVUSF9BTEVOKTsKICAgICBtZW1jcHkodHhwICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CkBAIC0zMTksMjYgKzMyNSwyOSBAQAogICAgIG1lbWNweSh0eHAgKyBFVEhfSExFTiwgZGF0YSwgbGVuKTsKIAogICAgIGxlbiArPSBFVEhfSExFTjsKLQorCWxlbiAmPSAweDBGRkY7CisJd2hpbGUobGVuIDwgRVRIX1pMRU4pCisJCXR4cFtsZW4rK10gPSAnXDAnOwogICAgIC8qCiAgICAgICogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLAogICAgICAqIHNldCB0aGUgYmFzZSBhZGRyZXNzIHdpdGggdGhlICJvd25lcnNoaXAiCiAgICAgICogYml0cyBsYXN0LgogICAgICAqLwotICAgIHR4X3JpbmdbZW50cnldLnR4bGVuZ3RoICA9IChsZW4gPj0gNjAgPyBsZW4gOiA2MCk7Ci0gICAgdHhfcmluZ1tlbnRyeV0uYnVmbGVuZ3RoID0gbGVuOwotICAgIHR4X3JpbmdbZW50cnldLnN0YXR1cyAgICA9IFRSSU5HX09XTjsJLyogUGFzcyBvd25lcnNoaXAgdG8gdGhlIGNoaXAuICovCisgICAgCisgICAgdHhfcmluZ1tlbnRyeV0uYnVmbGVuZ3RoIHw9IGNwdV90b19sZTMyKGxlbik7CisgICAgdHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIobGVuIDw8IDE2KSB8IAorCSAgICBjcHVfdG9fbGUzMihUUklOR19PV04pOwkvKiBQYXNzIG93bmVyc2hpcCB0byB0aGUgY2hpcC4gKi8KIAogICAgIGN1cl90eCsrOwogCiAgICAgLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLwotICAgIG91dGwoQ1JfUVVFVUVfVFgsIGNvbW1hbmQpOwotCisgICAgb3V0bChDUl9RVUVVRV9UWCwgY29tbWFuZCk7IAorICAgIAogICAgIGxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7ICAgICAgICAgLyogdGltZW91dCAxMCBtcyBmb3IgdHJhbnNtaXQgKi8KLSAgICB3aGlsZSAoKHR4X3JpbmdbZW50cnldLnN0YXR1cyAmIFRSSU5HX09XTikgJiYgdGltZXIyX3J1bm5pbmcoKSkKKyAgICB3aGlsZSAoKGxlMzJfdG9fY3B1KHR4X3JpbmdbZW50cnldLnN0YXR1cykgJiAoVFJJTkdfT1dOKSkgJiYgdGltZXIyX3J1bm5pbmcoKSkKIAkvKiBXYWl0ICovOwogCi0gICAgaWYgKCh0eF9yaW5nW2VudHJ5XS5zdGF0dXMgJiBUUklOR19PV04pICE9IDApCisgICAgaWYgKChsZTMyX3RvX2NwdSh0eF9yaW5nW2VudHJ5XS5zdGF0dXMpICYgVFJJTkdfT1dOKSAhPSAwKQogCXByaW50ZigiT29wcywgdHJhbnNtaXR0ZXIgdGltZW91dCwgc3RhdHVzPSVoWFxuIiwKIAkgICAgdHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKIH0KQEAgLTM1NiwxNyArMzY1LDE5IEBACiAgKi8KIAogICAgIHN0YXRpYyBpbnQKLWVwaWMxMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitlcGljMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAgICAgaW50IGVudHJ5OwotICAgIGludCBzdGF0dXM7CiAgICAgaW50IHJldGNvZGU7Ci0KKyAgICBpbnQgc3RhdHVzOwogICAgIGVudHJ5ID0gY3VyX3J4ICUgUlhfUklOR19TSVpFOwogCi0gICAgaWYgKChzdGF0dXMgPSByeF9yaW5nW2VudHJ5XS5zdGF0dXMgJiBSUklOR19PV04pID09IFJSSU5HX09XTikKKyAgICBpZiAoKHJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIGNwdV90b19sZTMyKFJSSU5HX09XTikpID09IFJSSU5HX09XTikKIAlyZXR1cm4gKDApOwogCisgICAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKyAgICBzdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9yaW5nW2VudHJ5XS5zdGF0dXMpOwogICAgIC8qIFdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCiAKICNpZgkoRVBJQ19ERUJVRyA+IDQpCkBAIC0zODMsOCArMzk0LDggQEAKIAlyZXRjb2RlID0gMDsKICAgICB9IGVsc2UgewogCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KLQluaWMtPnBhY2tldGxlbiA9IHJ4X3JpbmdbZW50cnldLnJ4bGVuZ3RoIC0gNDsKLQltZW1jcHkobmljLT5wYWNrZXQsIChjaGFyKilyeF9yaW5nW2VudHJ5XS5idWZhZGRyLCBuaWMtPnBhY2tldGxlbik7CisJbmljLT5wYWNrZXRsZW4gPSBsZTMyX3RvX2NwdSgocnhfcmluZ1tlbnRyeV0uYnVmbGVuZ3RoKSktIDQ7CisJbWVtY3B5KG5pYy0+cGFja2V0LCAmcnhfcGFja2V0W2VudHJ5ICogUEtUX0JVRl9TWl0sIG5pYy0+cGFja2V0bGVuKTsKIAlyZXRjb2RlID0gMTsKICAgICB9CiAKQEAgLTM5NSwxNyArNDA2LDMwIEBACiAgICAgcnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gUlJJTkdfT1dOOwogCiAgICAgLyogUmVzdGFydCBSZWNlaXZlciAqLwotICAgIG91dGwoQ1JfU1RBUlRfUlggfCBDUl9RVUVVRV9SWCwgY29tbWFuZCk7CisgICAgb3V0bChDUl9TVEFSVF9SWCB8IENSX1FVRVVFX1JYLCBjb21tYW5kKTsgCiAKICAgICByZXR1cm4gcmV0Y29kZTsKIH0KIAogCiAgICAgc3RhdGljIHZvaWQKLWVwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitlcGljMTAwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2IF9fdW51c2VkKQogeworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJb3V0bChHQ19TT0ZUX1JFU0VULCBnZW5jdGwpOwogfQogCitzdGF0aWMgdm9pZCBlcGljMTAwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQogCiAjaWZkZWYJREVCVUdfRUVQUk9NCiAvKiBTZXJpYWwgRUVQUk9NIHNlY3Rpb24uICovCkBAIC00NzksMyArNTAzLDE4IEBACiAJICAgIGJyZWFrOwogICAgIHJldHVybiBpbncobW1kYXRhKTsKIH0KKworCitzdGF0aWMgc3RydWN0IHBjaV9pZCBlcGljMTAwX25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMGI4LCAweDAwMDUsICJlcGljMTAwIiwgICAgIlNNQyBFdGhlclBvd2VySUkiKSwJCS8qIFNNQyA4M2MxNzAgRVBJQy8xMDAgKi8KK1BDSV9ST00oMHgxMGI4LCAweDAwMDYsICJzbWMtODNjMTc1IiwgIlNNQyBFUElDL0MgODNjMTc1IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBlcGljMTAwX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJFUElDMTAwIiwKKwkucHJvYmUgICAgPSBlcGljMTAwX3Byb2JlLAorCS5pZHMgICAgICA9IGVwaWMxMDBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YoZXBpYzEwMF9uaWNzKS9zaXplb2YoZXBpYzEwMF9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKSW5kZXg6IGIvbmV0Ym9vdC9ldGhlcmJvb3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvZXRoZXJib290LmgKKysrIGIvbmV0Ym9vdC9ldGhlcmJvb3QuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgotICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNyw1MjggKzE3LDQwIEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotLyogUlVMRTogWW91IG11c3QgZGVmaW5lIHRoZSBtYWNybyBgYEdSVUInJyB3aGVuIGluY2x1ZGluZyB0aGlzIGhlYWRlcgotICAgZmlsZSBpbiBHUlVCIGNvZGUuICAqLworI2lmbmRlZiBFVEhFUkJPT1RfSAorI2RlZmluZSBFVEhFUkJPT1RfSAogCi0vKiBCYXNlZCBvbiAic3JjL2V0aGVyYm9vdC5oIiBpbiBldGhlcmJvb3QtNS4wLjUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSEVSQk9PVCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi0KLUF1dGhvcjogTWFydGluIFJlbnRlcnMKLSAgRGF0ZTogRGVjLzkzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbmNsdWRlIEdSVUItc3BlY2lmaWMgbWFjcm9zIGFuZCBwcm90b3R5cGVzIGhlcmUuICAqLwotI2luY2x1ZGUgPHNoYXJlZC5oPgotCi0vKiBGSVhNRTogRm9yIG5vdywgZW5hYmxlIHRoZSBESENQIHN1cHBvcnQuIFBlcmhhcHMgSSBzaG91bGQgc2VncmVnYXRlCi0gICB0aGUgREhDUCBzdXBwb3J0IGZyb20gdGhlIEJPT1RQIHN1cHBvcnQsIGFuZCBwZXJtaXQgYm90aCB0bwotICAgY28tZXhpc3QuICAqLwotI3VuZGVmIE5PX0RIQ1BfU1VQUE9SVAotCi0vKiBJbiBHUlVCLCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgaW4gRXRoZXJib290IGRvZXNuJ3QgaGF2ZSBhbnkgc2Vuc2UuCi0gICBKdXN0IGRlZmluZSBpdCBhcyBhIGJvZ3VzIHZhbHVlLiAgKi8KLSNkZWZpbmUgUkVMT0MJMAotCi0vKiBGSVhNRTogU2hvdWxkIGJlIGFuIG9wdGlvbi4gICovCi0jZGVmaW5lIEJBQ0tPRkZfTElNSVQJNwotCi0jaW5jbHVkZSA8b3NkZXAuaD4KLQotI2RlZmluZSBDVFJMX0MJCTMKLQotI2lmbmRlZglNQVhfVEZUUF9SRVRSSUVTCi0jIGRlZmluZSBNQVhfVEZUUF9SRVRSSUVTCTIwCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAib3NkZXAuaCIKKyNpbmNsdWRlICJpZl9ldGhlci5oIgorI2luY2x1ZGUgImluLmgiCisKKy8qIExpbmsgY29uZmlndXJhdGlvbiB0aW1lIGluIHRlbnRocyBvZiBhIHNlY29uZCAqLworI2lmbmRlZiBWQUxJRF9MSU5LX1RJTUVPVVQKKyNkZWZpbmUgVkFMSURfTElOS19USU1FT1VUCTEwMCAvKiAxMC4wIHNlY29uZHMgKi8KICNlbmRpZgogCi0jaWZuZGVmCU1BWF9CT09UUF9SRVRSSUVTCi0jIGRlZmluZSBNQVhfQk9PVFBfUkVUUklFUwkyMAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0JPT1RQX0VYVExFTgkoRVRIX0ZSQU1FX0xFTiAtIEVUSF9ITEVOIC0gXAotCQkJCSBzaXplb2YgKHN0cnVjdCBib290cF90KSkKLQotI2lmbmRlZglNQVhfQVJQX1JFVFJJRVMKLSMgZGVmaW5lIE1BWF9BUlBfUkVUUklFUwkyMAotI2VuZGlmCi0KLSNpZm5kZWYJTUFYX1JQQ19SRVRSSUVTCi0jIGRlZmluZSBNQVhfUlBDX1JFVFJJRVMJMjAKLSNlbmRpZgotCi0jZGVmaW5lCVRJQ0tTX1BFUl9TRUMJCTE4Ci0KLS8qIEludGVyLXBhY2tldCByZXRyeSBpbiB0aWNrcyAqLwotI2RlZmluZSBUSU1FT1VUCQkJKDEwICogVElDS1NfUEVSX1NFQykKLQotLyogVGhlc2Ugc2V0dGluZ3MgaGF2ZSBzZW5zZSBvbmx5IGlmIGNvbXBpbGVkIHdpdGggLURDT05HRVNURUQgKi8KLS8qIHRvdGFsIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgaW4gdGlja3MgKi8KLSNkZWZpbmUgVEZUUF9USU1FT1VUCQkoMzAgKiBUSUNLU19QRVJfU0VDKQotLyogcGFja2V0IHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgaW4gdGlja3MgKi8KLSNkZWZpbmUgVEZUUF9SRVhNVAkJKDMgKiBUSUNLU19QRVJfU0VDKQotCiAjaWZuZGVmCU5VTEwKICMgZGVmaW5lIE5VTEwJCQkoKHZvaWQgKikgMCkKICNlbmRpZgogCi0vKgotICAgSSdtIG1vdmluZyB0b3dhcmRzIHRoZSBkZWZpbmVkIG5hbWVzIGluIGxpbnV4L2lmX2V0aGVyLmggZm9yIGNsYXJpdHkuCi0gICBUaGUgY29uZnVzaW9uIGJldHdlZW4gNjAvNjQgYW5kIDE1MTQvMTUxOCBhcm9zZSBiZWNhdXNlIHRoZSBOUzgzOTAKLSAgIGNvdW50cyB0aGUgNCBieXRlIGZyYW1lIGNoZWNrc3VtIGluIHRoZSBpbmNvbWluZyBwYWNrZXQsIGJ1dCBub3QKLSAgIGluIHRoZSBvdXRnb2luZyBwYWNrZXQuIDYwLzE1MTQgYXJlIHRoZSBjb3JyZWN0IG51bWJlcnMgZm9yIG1vc3QKLSAgIGlmIG5vdCBhbGwgb2YgdGhlIG90aGVyIE5JQyBjb250cm9sbGVycy4gSSB3aWxsIGJlIHJldGlyaW5nIHRoZQotICAgNjQvMTUxOCBkZWZpbmVzIGluIHRoZSBsZWFkLXVwIHRvIDUuMC4KLSovCi0KLSNkZWZpbmUgRVRIX0FMRU4JCTYJLyogU2l6ZSBvZiBFdGhlcm5ldCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSF9ITEVOCQkxNAkvKiBTaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLwotI2RlZmluZQlFVEhfWkxFTgkJNjAJLyogTWluaW11bSBwYWNrZXQgKi8KLS8qI2RlZmluZSBFVEhfTUlOX1BBQ0tFVAkJNjQqLwotI2RlZmluZQlFVEhfRlJBTUVfTEVOCQkxNTE0CS8qIE1heGltdW0gcGFja2V0ICovCi0vKiNkZWZpbmUgRVRIX01BWF9QQUNLRVQJCTE1MTgqLwotLyogQmVjYXVzZSBzb21lIERIQ1AvQk9PVFAgc2VydmVycyBkb24ndCB0cmVhdCB0aGUgbWF4aW11bSBsZW5ndGggdGhlIHNhbWUKLSAgIGFzIEV0aGVyYm9vdCwgc3VidHJhY3QgdGhlIHNpemUgb2YgYW4gSVAgaGVhZGVyIGFuZCB0aGF0IG9mIGFuIFVEUAotICAgaGVhZGVyLiAgKi8KLSNkZWZpbmUJRVRIX01BWF9NVFUJCShFVEhfRlJBTUVfTEVOIC0gRVRIX0hMRU4gXAotCQkJCS0gc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpIFwKLQkJCQktIHNpemVvZiAoc3RydWN0IHVkcGhkcikpCi0KLSNkZWZpbmUgQVJQX0NMSUVOVAkwCi0jZGVmaW5lIEFSUF9TRVJWRVIJMQotI2RlZmluZSBBUlBfR0FURVdBWQkyCi0jZGVmaW5lIEFSUF9ST09UU0VSVkVSCTMKLSNkZWZpbmUgQVJQX1NXQVBTRVJWRVIJNAotI2RlZmluZSBNQVhfQVJQCQlBUlBfU1dBUFNFUlZFUisxCi0KLSNkZWZpbmUJUkFSUF9SRVFVRVNUCTMKLSNkZWZpbmUJUkFSUF9SRVBMWQk0Ci0KLSNkZWZpbmUgSVAJCTB4MDgwMAotI2RlZmluZSBBUlAJCTB4MDgwNgotI2RlZmluZQlSQVJQCQkweDgwMzUKLQotI2RlZmluZSBCT09UUF9TRVJWRVIJNjcKLSNkZWZpbmUgQk9PVFBfQ0xJRU5UCTY4Ci0jZGVmaW5lIFRGVFBfUE9SVAk2OQotI2RlZmluZSBTVU5SUENfUE9SVAkxMTEKLQotI2RlZmluZSBJUF9VRFAJCTE3Ci0vKiBTYW1lIGFmdGVyIGdvaW5nIHRocm91Z2ggaHRvbmwgKi8KLSNkZWZpbmUgSVBfQlJPQURDQVNUCTB4RkZGRkZGRkYKLQotI2RlZmluZSBBUlBfUkVRVUVTVAkxCi0jZGVmaW5lIEFSUF9SRVBMWQkyCi0KLSNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCi0jZGVmaW5lIEJPT1RQX1JFUExZCTIKLQotI2RlZmluZSBUQUdfTEVOKHApCQkoKigocCkgKyAxKSkKLSNkZWZpbmUgUkZDMTUzM19DT09LSUUJCTk5LCAxMzAsIDgzLCA5OQotI2RlZmluZSBSRkMxNTMzX1BBRAkJMAotI2RlZmluZSBSRkMxNTMzX05FVE1BU0sJCTEKLSNkZWZpbmUgUkZDMTUzM19USU1FT0ZGU0VUCTIKLSNkZWZpbmUgUkZDMTUzM19HQVRFV0FZCQkzCi0jZGVmaW5lIFJGQzE1MzNfVElNRVNFUlZFUgk0Ci0jZGVmaW5lIFJGQzE1MzNfSUVOMTE2TlMJNQotI2RlZmluZSBSRkMxNTMzX0ROUwkJNgotI2RlZmluZSBSRkMxNTMzX0xPR1NFUlZFUgk3Ci0jZGVmaW5lIFJGQzE1MzNfQ09PS0lFU0VSVkVSCTgKLSNkZWZpbmUgUkZDMTUzM19MUFJTRVJWRVIJOQotI2RlZmluZSBSRkMxNTMzX0lNUFJFU1NTRVJWRVIJMTAKLSNkZWZpbmUgUkZDMTUzM19SRVNPVVJDRVNFUlZFUgkxMQotI2RlZmluZSBSRkMxNTMzX0hPU1ROQU1FCTEyCi0jZGVmaW5lIFJGQzE1MzNfQk9PVEZJTEVTSVpFCTEzCi0jZGVmaW5lIFJGQzE1MzNfTUVSSVREVU1QRklMRQkxNAotI2RlZmluZSBSRkMxNTMzX0RPTUFJTk5BTUUJMTUKLSNkZWZpbmUgUkZDMTUzM19TV0FQU0VSVkVSCTE2Ci0jZGVmaW5lIFJGQzE1MzNfUk9PVFBBVEgJMTcKLSNkZWZpbmUgUkZDMTUzM19FWFRFTlNJT05QQVRICTE4Ci0jZGVmaW5lIFJGQzE1MzNfSVBGT1JXQVJESU5HCTE5Ci0jZGVmaW5lIFJGQzE1MzNfSVBTT1VSQ0VST1VUSU5HCTIwCi0jZGVmaW5lIFJGQzE1MzNfSVBQT0xJQ1lGSUxURVIJMjEKLSNkZWZpbmUgUkZDMTUzM19JUE1BWFJFQVNTRU1CTFkJMjIKLSNkZWZpbmUgUkZDMTUzM19JUFRUTAkJMjMKLSNkZWZpbmUgUkZDMTUzM19JUE1UVQkJMjQKLSNkZWZpbmUgUkZDMTUzM19JUE1UVVBMQVRFQVUJMjUKLSNkZWZpbmUgUkZDMTUzM19JTlRNVFUJCTI2Ci0jZGVmaW5lIFJGQzE1MzNfSU5UTE9DQUxTVUJORVRTCTI3Ci0jZGVmaW5lIFJGQzE1MzNfSU5UQlJPQURDQVNUCTI4Ci0jZGVmaW5lIFJGQzE1MzNfSU5USUNNUERJU0NPVkVSCTI5Ci0jZGVmaW5lIFJGQzE1MzNfSU5USUNNUFJFU1BPTkQJMzAKLSNkZWZpbmUgUkZDMTUzM19JTlRST1VURURJU0NPVkVSIDMxCi0jZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVTT0xJQ0lUCTMyCi0jZGVmaW5lIFJGQzE1MzNfSU5UU1RBVElDUk9VVEVTCTMzCi0jZGVmaW5lIFJGQzE1MzNfTExUUkFJTEVSRU5DQVAJMzQKLSNkZWZpbmUgUkZDMTUzM19MTEFSUENBQ0hFVE1PCTM1Ci0jZGVmaW5lIFJGQzE1MzNfTExFVEhFUk5FVEVOQ0FQCTM2Ci0jZGVmaW5lIFJGQzE1MzNfVENQVFRMCQkzNwotI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRVRNTwkzOAotI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRUdCCTM5Ci0jZGVmaW5lIFJGQzE1MzNfTklTRE9NQUlOCTQwCi0jZGVmaW5lIFJGQzE1MzNfTklTU0VSVkVSCTQxCi0jZGVmaW5lIFJGQzE1MzNfTlRQU0VSVkVSCTQyCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SCQk0MwotI2RlZmluZSBSRkMxNTMzX05CTlMJCTQ0Ci0jZGVmaW5lIFJGQzE1MzNfTkJERAkJNDUKLSNkZWZpbmUgUkZDMTUzM19OQk5UCQk0NgotI2RlZmluZSBSRkMxNTMzX05CU0NPUEUJCTQ3Ci0jZGVmaW5lIFJGQzE1MzNfWEZTCQk0OAotI2RlZmluZSBSRkMxNTMzX1hETQkJNDkKLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0jZGVmaW5lIFJGQzIxMzJfUkVRX0FERFIJNTAKLSNkZWZpbmUgUkZDMjEzMl9NU0dfVFlQRQk1MwotI2RlZmluZSBSRkMyMTMyX1NSVl9JRAkJNTQKLSNkZWZpbmUgUkZDMjEzMl9QQVJBTV9MSVNUCTU1Ci0jZGVmaW5lIFJGQzIxMzJfTUFYX1NJWkUJNTcKLSNkZWZpbmUgUkZDMjEzMl9WRU5ET1JfQ0xBU1NfSUQJNjAKLQotI2RlZmluZSBESENQRElTQ09WRVIJCTEKLSNkZWZpbmUgREhDUE9GRkVSCQkyCi0jZGVmaW5lIERIQ1BSRVFVRVNUCQkzCi0jZGVmaW5lIERIQ1BBQ0sJCQk1Ci0jZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCi0KLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFKT1IJMAotI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NSU5PUgkwCi0KLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFHSUMJMTI4Ci0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FERFBBUk0JMTI5Ci0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX01OVU9QVFMJMTYwCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX1NFTEVDVElPTiAxNzYKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTU9URAkxODQKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTlVNT0ZNT1REIDgKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfSU1HCTE5MgotI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OVU1PRklNRwkxNgotCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX0NPTkZJR0ZJTEUJMTUwCi0KLSNkZWZpbmUgUkZDMTUzM19FTkQJCTI1NQotCi0jZGVmaW5lIEJPT1RQX1ZFTkRPUl9MRU4JNjQKLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0jZGVmaW5lIERIQ1BfT1BUX0xFTgkJMzEyCi0jZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCi0KLSNkZWZpbmUJVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQJNTEyCi0jZGVmaW5lCVRGVFBfTUFYX1BBQ0tFVAkJMTQzMiAvKiA1MTIgKi8KLQotI2RlZmluZSBURlRQX1JSUQkxCi0jZGVmaW5lIFRGVFBfV1JRCTIKLSNkZWZpbmUgVEZUUF9EQVRBCTMKLSNkZWZpbmUgVEZUUF9BQ0sJNAotI2RlZmluZSBURlRQX0VSUk9SCTUKLSNkZWZpbmUgVEZUUF9PQUNLCTYKLQotI2RlZmluZSBURlRQX0NPREVfRU9GCTEKLSNkZWZpbmUgVEZUUF9DT0RFX01PUkUJMgotI2RlZmluZSBURlRQX0NPREVfRVJST1IJMwotI2RlZmluZSBURlRQX0NPREVfQk9PVAk0Ci0jZGVmaW5lIFRGVFBfQ09ERV9DRkcJNQotCi0jZGVmaW5lIEFXQUlUX0FSUAkwCi0jZGVmaW5lIEFXQUlUX0JPT1RQCTEKLSNkZWZpbmUgQVdBSVRfVEZUUAkyCi0jZGVmaW5lIEFXQUlUX1JBUlAJMwotI2RlZmluZSBBV0FJVF9SUEMJNAotI2RlZmluZSBBV0FJVF9RRFJBSU4JNQkvKiBkcmFpbiBxdWV1ZSwgcHJvY2VzcyBBUlAgcmVxdWVzdHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZwlzX2FkZHI7Ci19Ci1pbl9hZGRyOwotCi1zdHJ1Y3QgYXJwdGFibGVfdAotewotICBpbl9hZGRyIGlwYWRkcjsKLSAgdW5zaWduZWQgY2hhciBub2RlWzZdOwotfTsKLQotLyoKLSAqIEEgcGl0eSBzaXBhZGRyIGFuZCB0aXBhZGRyIGFyZSBub3QgbG9uZ3dvcmQgYWxpZ25lZCBvciB3ZSBjb3VsZCB1c2UKLSAqIGluX2FkZHIuIE5vLCBJIGRvbid0IHdhbnQgdG8gdXNlICNwcmFnbWEgcGFja2VkLgotICovCi1zdHJ1Y3QgYXJwcmVxdWVzdAotewotICB1bnNpZ25lZCBzaG9ydCBod3R5cGU7Ci0gIHVuc2lnbmVkIHNob3J0IHByb3RvY29sOwotICBjaGFyIGh3bGVuOwotICBjaGFyIHByb3RvbGVuOwotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIGNoYXIgc2h3YWRkcls2XTsKLSAgY2hhciBzaXBhZGRyWzRdOwotICBjaGFyIHRod2FkZHJbNl07Ci0gIGNoYXIgdGlwYWRkcls0XTsKLX07Ci0KLXN0cnVjdCBpcGhkcgotewotICBjaGFyIHZlcmhkcmxlbjsKLSAgY2hhciBzZXJ2aWNlOwotICB1bnNpZ25lZCBzaG9ydCBsZW47Ci0gIHVuc2lnbmVkIHNob3J0IGlkZW50OwotICB1bnNpZ25lZCBzaG9ydCBmcmFnczsKLSAgY2hhciB0dGw7Ci0gIGNoYXIgcHJvdG9jb2w7Ci0gIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKLSAgaW5fYWRkciBzcmM7Ci0gIGluX2FkZHIgZGVzdDsKLX07Ci0KLXN0cnVjdCB1ZHBoZHIKLXsKLSAgdW5zaWduZWQgc2hvcnQgc3JjOwotICB1bnNpZ25lZCBzaG9ydCBkZXN0OwotICB1bnNpZ25lZCBzaG9ydCBsZW47Ci0gIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKLX07Ci0KLS8qIEZvcm1hdCBvZiBhIGJvb3RwIHBhY2tldC4gICovCi1zdHJ1Y3QgYm9vdHBfdAotewotICBjaGFyIGJwX29wOwotICBjaGFyIGJwX2h0eXBlOwotICBjaGFyIGJwX2hsZW47Ci0gIGNoYXIgYnBfaG9wczsKLSAgdW5zaWduZWQgbG9uZyBicF94aWQ7Ci0gIHVuc2lnbmVkIHNob3J0IGJwX3NlY3M7Ci0gIHVuc2lnbmVkIHNob3J0IHVudXNlZDsKLSAgaW5fYWRkciBicF9jaWFkZHI7Ci0gIGluX2FkZHIgYnBfeWlhZGRyOwotICBpbl9hZGRyIGJwX3NpYWRkcjsKLSAgaW5fYWRkciBicF9naWFkZHI7Ci0gIGNoYXIgYnBfaHdhZGRyWzE2XTsKLSAgY2hhciBicF9zbmFtZVs2NF07Ci0gIGNoYXIgYnBfZmlsZVsxMjhdOwotI2lmZGVmCU5PX0RIQ1BfU1VQUE9SVAotICBjaGFyIGJwX3ZlbmRbQk9PVFBfVkVORE9SX0xFTl07Ci0jZWxzZQotICBjaGFyIGJwX3ZlbmRbREhDUF9PUFRfTEVOXTsKLSNlbmRpZgkvKiBOT19ESENQX1NVUFBPUlQgKi8KLX07Ci0KLS8qIEZvcm1hdCBvZiBhIGJvb3RwIElQIHBhY2tldC4gICovCi1zdHJ1Y3QgYm9vdHBpcF90Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHN0cnVjdCBib290cF90IGJwOwotfTsKLQotLyogRm9ybWF0IG9mIGJvb3RwIHBhY2tldCB3aXRoIGV4dGVuc2lvbnMuICAqLwotc3RydWN0IGJvb3RwZF90Ci17Ci0gIHN0cnVjdCBib290cF90IGJvb3RwX3JlcGx5OwotICB1bnNpZ25lZCBjaGFyICBib290cF9leHRlbnNpb25bTUFYX0JPT1RQX0VYVExFTl07Ci19OwotCi1zdHJ1Y3QgdGZ0cF90Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgcnJxW1RGVFBfREVGQVVMVFNJWkVfUEFDS0VUXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICAgIGNoYXIgZG93bmxvYWRbVEZUUF9NQVhfUEFDS0VUXTsKLSAgICB9Ci0gICAgZGF0YTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICB9Ci0gICAgYWNrOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7Ci0gICAgICBjaGFyIGVycm1zZ1tURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVF07Ci0gICAgfQotICAgIGVycjsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGRhdGFbVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQrMl07Ci0gICAgfQotICAgIG9hY2s7Ci0gIH0KLSAgdTsKLX07Ci0KLS8qIERlZmluZSBhIHNtYWxsZXIgdGZ0cCBwYWNrZXQgc29sZWx5IGZvciBtYWtpbmcgcmVxdWVzdHMgdG8gY29uc2VydmUgc3RhY2sKLSAgIDUxMiBieXRlcyBzaG91bGQgYmUgZW5vdWdoLiAgKi8KLXN0cnVjdCB0ZnRwcmVxX3QKLXsKLSAgc3RydWN0IGlwaGRyIGlwOwotICBzdHJ1Y3QgdWRwaGRyIHVkcDsKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICB1bmlvbgotICB7Ci0gICAgY2hhciBycnFbNTEyXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICB9Ci0gICAgYWNrOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7Ci0gICAgICBjaGFyIGVycm1zZ1s1MTItMl07Ci0gICAgfQotICAgIGVycjsKLSAgfQotICB1OwotfTsKLQotI2RlZmluZSBURlRQX01JTl9QQUNLRVQJKHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgNCkKLQotc3RydWN0IHJwY190Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGRhdGFbMzAwXTsJCS8qIGxvbmdlc3QgUlBDIGNhbGwgbXVzdCBmaXQhISEhICovCi0gICAgCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyBpZDsKLSAgICAgIGxvbmcgdHlwZTsKLSAgICAgIGxvbmcgcnBjdmVyczsKLSAgICAgIGxvbmcgcHJvZzsKLSAgICAgIGxvbmcgdmVyczsKLSAgICAgIGxvbmcgcHJvYzsKLSAgICAgIGxvbmcgZGF0YVsxXTsKLSAgICB9Ci0gICAgY2FsbDsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIGlkOwotICAgICAgbG9uZyB0eXBlOwotICAgICAgbG9uZyByc3RhdHVzOwotICAgICAgbG9uZyB2ZXJpZmllcjsKLSAgICAgIGxvbmcgdjI7Ci0gICAgICBsb25nIGFzdGF0dXM7Ci0gICAgICBsb25nIGRhdGFbMV07Ci0gICAgfQotICAgIHJlcGx5OwotICB9Ci0gIHU7Ci19OwotCi0jZGVmaW5lIFBST0dfUE9SVE1BUAkxMDAwMDAKLSNkZWZpbmUgUFJPR19ORlMJMTAwMDAzCi0jZGVmaW5lIFBST0dfTU9VTlQJMTAwMDA1Ci0KLSNkZWZpbmUgTVNHX0NBTEwJMAotI2RlZmluZSBNU0dfUkVQTFkJMQotCi0jZGVmaW5lIFBPUlRNQVBfR0VUUE9SVAkzCi0KLSNkZWZpbmUgTU9VTlRfQURERU5UUlkJMQotI2RlZmluZSBNT1VOVF9VTU9VTlRBTEwJNAotCi0jZGVmaW5lIE5GU19MT09LVVAJNAotI2RlZmluZSBORlNfUkVBRAk2Ci0KLSNkZWZpbmUgTkZTX0ZIU0laRQkzMgotCi0jZGVmaW5lIE5GU0VSUl9QRVJNCTEKLSNkZWZpbmUgTkZTRVJSX05PRU5UCTIKLSNkZWZpbmUgTkZTRVJSX0FDQ0VTCTEzCi0KLS8qIEJsb2NrIHNpemUgdXNlZCBmb3IgTkZTIHJlYWQgYWNjZXNzZXMuICBBIFJQQyByZXBseSBwYWNrZXQgKGluY2x1ZGluZyAgYWxsCi0gKiBoZWFkZXJzKSBtdXN0IGZpdCB3aXRoaW4gYSBzaW5nbGUgRXRoZXJuZXQgZnJhbWUgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4KLSAqIENob3NlbiB0byBiZSBhIHBvd2VyIG9mIHR3bywgYXMgbW9zdCBORlMgc2VydmVycyBhcmUgb3B0aW1pemVkIGZvciB0aGlzLiAgKi8KLSNkZWZpbmUgTkZTX1JFQURfU0laRQkxMDI0Ci0KLSNkZWZpbmUJRkxPUFBZX0JPT1RfTE9DQVRJT04JMHg3YzAwCi0vKiBNdXN0IG1hdGNoIG9mZnNldHMgaW4gbG9hZGVyLlMgKi8KLSNkZWZpbmUgUk9NX1NFR01FTlQJCTB4MWZhCi0jZGVmaW5lIFJPTV9MRU5HVEgJCTB4MWZjCi0KLSNkZWZpbmUJUk9NX0lORk9fTE9DQVRJT04JKEZMT1BQWV9CT09UX0xPQ0FUSU9OICsgUk9NX1NFR01FTlQpCi0vKiBhdCBlbmQgb2YgZmxvcHB5IGJvb3QgYmxvY2sgKi8KLQotc3RydWN0IHJvbV9pbmZvCi17Ci0gIHVuc2lnbmVkIHNob3J0CXJvbV9zZWdtZW50OwotICB1bnNpZ25lZCBzaG9ydAlyb21fbGVuZ3RoOwotfTsKLQotc3RhdGljIGlubGluZSBpbnQKLXJvbV9hZGRyZXNzX29rIChzdHJ1Y3Qgcm9tX2luZm8gKnJvbSwgaW50IGFzc2lnbmVkX3JvbV9zZWdtZW50KQotewotICByZXR1cm4gKGFzc2lnbmVkX3JvbV9zZWdtZW50IDwgMHhDMDAwCi0JICB8fCBhc3NpZ25lZF9yb21fc2VnbWVudCA9PSByb20tPnJvbV9zZWdtZW50KTsKLX0KLQotLyogRGVmaW5lIGEgdHlwZSBmb3IgcGFzc2luZyBpbmZvIHRvIGEgbG9hZGVkIHByb2dyYW0uICAqLwotc3RydWN0IGViaW5mbwotewotICB1bnNpZ25lZCBjaGFyCW1ham9yLCBtaW5vcjsJLyogVmVyc2lvbiAqLwotICB1bnNpZ25lZCBzaG9ydAlmbGFnczsJCS8qIEJpdCBmbGFncyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXh0ZXJuYWwgcHJvdG90eXBlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbWFpbi5jICovCi1leHRlcm4gdm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpOwotZXh0ZXJuIGludCBpZmNvbmZpZyAoY2hhciAqaXAsIGNoYXIgKnNtLCBjaGFyICpndywgY2hhciAqc3ZyKTsKLWV4dGVybiBpbnQgdWRwX3RyYW5zbWl0ICh1bnNpZ25lZCBsb25nIGRlc3RpcCwgdW5zaWduZWQgaW50IHNyY3NvY2ssCi0JCQkgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIGludCBhd2FpdF9yZXBseSAoaW50IHR5cGUsIGludCBpdmFsLCB2b2lkICpwdHIsIGludCB0aW1lb3V0KTsKLWV4dGVybiBpbnQgZGVjb2RlX3JmYzE1MzMgKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCk7Ci1leHRlcm4gbG9uZyByZmMyMTMxX3NsZWVwX2ludGVydmFsIChpbnQgYmFzZSwgaW50IGV4cCk7Ci1leHRlcm4gdm9pZCBjbGVhbnVwICh2b2lkKTsKLWV4dGVybiBpbnQgcmFycCAodm9pZCk7Ci1leHRlcm4gaW50IGJvb3RwICh2b2lkKTsKLWV4dGVybiB2b2lkIGNsZWFudXBfbmV0ICh2b2lkKTsKLQotLyogY29uZmlnLmMgKi8KLWV4dGVybiB2b2lkIHByaW50X2NvbmZpZyAodm9pZCk7Ci1leHRlcm4gdm9pZCBldGhfcmVzZXQgKHZvaWQpOwotZXh0ZXJuIGludCBldGhfcHJvYmUgKHZvaWQpOwotZXh0ZXJuIGludCBldGhfcG9sbCAodm9pZCk7Ci1leHRlcm4gdm9pZCBldGhfdHJhbnNtaXQgKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAotCQkJICB1bnNpZ25lZCBpbnQgcywgY29uc3Qgdm9pZCAqcCk7Ci1leHRlcm4gdm9pZCBldGhfZGlzYWJsZSAodm9pZCk7Ci0KLS8qIG1pc2MuYyAqLwotZXh0ZXJuIHZvaWQgdHdpZGRsZSAodm9pZCk7Ci1leHRlcm4gdm9pZCBzbGVlcCAoaW50IHNlY3MpOwotZXh0ZXJuIGludCBnZXRkZWMgKGNoYXIgKipzKTsKLWV4dGVybiB2b2lkIGV0aGVyYm9vdF9wcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKLWV4dGVybiBpbnQgZXRoZXJib290X3NwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotZXh0ZXJuIGludCBpbmV0X2F0b24gKGNoYXIgKnAsIGluX2FkZHIgKmkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FeHRlcm5hbCB2YXJpYWJsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIG1haW4uYyAqLwotZXh0ZXJuIGludCBpcF9hYm9ydDsKLWV4dGVybiBpbnQgbmV0d29ya19yZWFkeTsKLWV4dGVybiBzdHJ1Y3Qgcm9tX2luZm8gcm9tOwotZXh0ZXJuIHN0cnVjdCBhcnB0YWJsZV90IGFycHRhYmxlW01BWF9BUlBdOwotCi0vKiBjb25maWcuYyAqLwotZXh0ZXJuIHN0cnVjdCBuaWMgbmljOworI2RlZmluZSBnYXRlQTIwX3NldCgpIGdhdGVBMjAoMSkKKyNkZWZpbmUgZ2F0ZUEyMF91bnNldCgpIGdhdGVBMjAoMCkKKyNkZWZpbmUgRUJERUJVRyAwCisvKiBUaGUgJ3JvbV9pbmZvJyBtYXliZSBhcmNoIGRlcGVuZGVkLiBJdCBtdXN0IGJlIG1vdmVkIHRvIHNvbWUgb3RoZXIKKyAqIHBsYWNlICovCitzdHJ1Y3Qgcm9tX2luZm8geworCXVuc2lnbmVkIHNob3J0CXJvbV9zZWdtZW50OworCXVuc2lnbmVkIHNob3J0CXJvbV9sZW5ndGg7Cit9OworCitleHRlcm4gdm9pZCBwb2xsX2ludGVycnVwdGlvbnMgUCgodm9pZCkpOworCisvKiBGb3IgVU5ESSBkcml2ZXJzICovCitleHRlcm4gdm9pZCBmYWtlX2lycSAoIHVpbnQ4X3QgaXJxICk7CitleHRlcm4gdm9pZCBfdHJpdmlhbF9pcnFfaGFuZGxlcl9zdGFydDsKK2V4dGVybiB1aW50MzJfdCBnZXRfZnJlZV9iYXNlX21lbW9yeSAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIGZvcmdldF9iYXNlX21lbW9yeSAoIHZvaWQqLCBzaXplX3QgKTsKK2V4dGVybiB2b2lkIGZyZWVfdW51c2VkX2Jhc2VfbWVtb3J5ICggdm9pZCApOwogCi0vKiBMb2NhbCBoYWNrIC0gZGVmaW5lIHNvbWUgbWFjcm9zIHRvIHVzZSBldGhlcmJvb3Qgc291cmNlIGZpbGVzICJhcyBpcyIuICAqLwotI2lmbmRlZiBHUlVCCi0jIHVuZGVmIHByaW50ZgotIyBkZWZpbmUgcHJpbnRmCWV0aGVyYm9vdF9wcmludGYKLSMgdW5kZWYgc3ByaW50ZgotIyBkZWZpbmUgc3ByaW50ZiBldGhlcmJvb3Rfc3ByaW50ZgotI2VuZGlmIC8qIEdSVUIgKi8KKyNlbmRpZiAvKiBFVEhFUkJPT1RfSCAqLwpJbmRleDogYi9uZXRib290L2ZhMzExLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2ZhMzExLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoKLSAgICAgICAgRHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODEwIEV0aGVybmV0IGNvbnRyb2xsZXIuCi0gICAgICAgIAotICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEgSW5wcmltaXMgVGVjaG5vbG9naWVzLCBJbmMuCi0gICAgICAgIGh0dHA6Ly93d3cuaW5wcmltaXMuY29tLwotICAgICAgICAKLSAgICAgICAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgKGhlYXZpbHkpIG9uIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoaXMgY2hpcCAKLSAgICAgICAgd2hpY2ggaXMgY29weXJpZ2h0IDE5OTktMjAwMSBieSBEb25hbGQgQmVja2VyLgotCi0gICAgICAgIFRoaXMgc29mdHdhcmUgaGFzIG5vIHdhcnJhbnRpZXMgZXhwcmVzc2VkIG9yIGltcGxpZWQgZm9yIGFueQotICAgICAgICBwdXJwb3NlLgotCi0gICAgICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKLSAgICAgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAgICAgICAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAotICAgICAgICByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90Ci0gICAgICAgIGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCi0gICAgICAgIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgTGljZW5zZSBmb3IgdW5kZXIgb3RoZXIgdGVybXMgbWF5IGJlCi0gICAgICAgIGF2YWlsYWJsZS4gIENvbnRhY3QgdGhlIG9yaWdpbmFsIGF1dGhvciBmb3IgZGV0YWlscy4KLQotICAgICAgICBUaGUgb3JpZ2luYWwgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIGF0Ci0gICAgICAgIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgotICAgICAgICA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAotICAgICAgICBBbm5hcG9saXMgTUQgMjE0MDMKLSovCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKLXR5cGVkZWYgICBzaWduZWQgY2hhciAgczg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKLXR5cGVkZWYgICBzaWduZWQgc2hvcnQgczE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1MzI7Ci10eXBlZGVmICAgc2lnbmVkIGludCAgIHMzMjsKLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgInBjaS5oIgotCi0jdW5kZWYJdmlydF90b19idXMKLSNkZWZpbmUJdmlydF90b19idXMoeCkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKXgpCi0jZGVmaW5lIGNwdV90b19sZTMyKHZhbCkgICAgICAgICh2YWwpCi0jZGVmaW5lIGxlMzJfdG9fY3B1KHZhbCkgICAgICAgICh2YWwpCi0jZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQotI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpICBidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKLQotI2RlZmluZSBUWF9SSU5HX1NJWkUgMQotI2RlZmluZSBSWF9SSU5HX1NJWkUgNAotI2RlZmluZSBUSU1FX09VVCAgICAgMTAwMDAwMAotI2RlZmluZSBQS1RfQlVGX1NaICAgMTUzNgotCi0vKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLwotZW51bSByZWdpc3Rlcl9vZmZzZXRzIHsKLSAgICBDaGlwQ21kPTB4MDAsIENoaXBDb25maWc9MHgwNCwgRUVDdHJsPTB4MDgsIFBDSUJ1c0NmZz0weDBDLAotICAgIEludHJTdGF0dXM9MHgxMCwgSW50ck1hc2s9MHgxNCwgSW50ckVuYWJsZT0weDE4LAotICAgIFR4UmluZ1B0cj0weDIwLCBUeENvbmZpZz0weDI0LAotICAgIFJ4UmluZ1B0cj0weDMwLCBSeENvbmZpZz0weDM0LAotICAgIFdPTENtZD0weDQwLCBQYXVzZUNtZD0weDQ0LCBSeEZpbHRlckFkZHI9MHg0OCwgUnhGaWx0ZXJEYXRhPTB4NEMsCi0gICAgQm9vdFJvbUFkZHI9MHg1MCwgQm9vdFJvbURhdGE9MHg1NCwgU3RhdHNDdHJsPTB4NUMsIFN0YXRzRGF0YT0weDYwLAotICAgIFJ4UGt0RXJycz0weDYwLCBSeE1pc3NlZD0weDY4LCBSeENSQ0VycnM9MHg2NCwKLX07Ci0KLS8qIEJpdCBpbiBDaGlwQ21kLiAqLwotZW51bSBDaGlwQ21kQml0cyB7Ci0gICAgQ2hpcFJlc2V0PTB4MTAwLCBSeFJlc2V0PTB4MjAsIFR4UmVzZXQ9MHgxMCwgUnhPZmY9MHgwOCwgUnhPbj0weDA0LAotICAgIFR4T2ZmPTB4MDIsIFR4T249MHgwMSwKLX07Ci0KLS8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCi1lbnVtIGludHJfc3RhdHVzX2JpdHMgewotICAgIEludHJSeERvbmU9MHgwMDAxLCBJbnRyUnhJbnRyPTB4MDAwMiwgSW50clJ4RXJyPTB4MDAwNCwgSW50clJ4RWFybHk9MHgwMDA4LAotICAgIEludHJSeElkbGU9MHgwMDEwLCBJbnRyUnhPdmVycnVuPTB4MDAyMCwKLSAgICBJbnRyVHhEb25lPTB4MDA0MCwgSW50clR4SW50cj0weDAwODAsIEludHJUeEVycj0weDAxMDAsCi0gICAgSW50clR4SWRsZT0weDAyMDAsIEludHJUeFVuZGVycnVuPTB4MDQwMCwKLSAgICBTdGF0c01heD0weDA4MDAsIExpbmtDaGFuZ2U9MHg0MDAwLAlXT0xQa3Q9MHgyMDAwLAotICAgIFJ4UmVzZXREb25lPTB4MTAwMDAwMCwgVHhSZXNldERvbmU9MHgyMDAwMDAwLAotICAgIEludHJQQ0lFcnI9MHgwMGYwMDAwMCwgSW50ck5vcm1hbFN1bW1hcnk9MHgwMjUxLCBJbnRyQWJub3JtYWxTdW1tYXJ5PTB4RUQyMCwKLX07Ci0KLS8qIEJpdHMgaW4gdGhlIFJ4TW9kZSByZWdpc3Rlci4gKi8KLWVudW0gcnhfbW9kZV9iaXRzIHsKLSAgICBBY2NlcHRFcnI9MHgyMCwgQWNjZXB0UnVudD0weDEwLCBBY2NlcHRCcm9hZGNhc3Q9MHhDMDAwMDAwMCwKLSAgICBBY2NlcHRNdWx0aWNhc3Q9MHgwMDIwMDAwMCwgQWNjZXB0QWxsTXVsdGljYXN0PTB4MjAwMDAwMDAsCi0gICAgQWNjZXB0QWxsUGh5cz0weDEwMDAwMDAwLCBBY2NlcHRNeVBoeXM9MHgwODAwMDAwMCwKLX07Ci0KLS8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLwotZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKLSAgICBEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NNb3JlPTB4NDAwMDAwMDAsIERlc2NJbnRyPTB4MjAwMDAwMDAsCi0gICAgRGVzY05vQ1JDPTB4MTAwMDAwMDAsCi0gICAgRGVzY1BrdE9LPTB4MDgwMDAwMDAsIFJ4VG9vTG9uZz0weDAwNDAwMDAwLAotfTsKLQotLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCi1zdHJ1Y3QgbmV0ZGV2X2Rlc2MgewotICAgIHUzMiBuZXh0X2Rlc2M7Ci0gICAgczMyIGNtZF9zdGF0dXM7Ci0gICAgdTMyIGFkZHI7Ci19OwotCi1zdGF0aWMgc3RydWN0IEZBMzExX0RFViB7Ci0gICAgdW5zaWduZWQgaW50ICAgIGlvYWRkcjsKLSAgICB1bnNpZ25lZCBzaG9ydCAgdmVuZG9yOwotICAgIHVuc2lnbmVkIHNob3J0ICBkZXZpY2U7Ci0gICAgdW5zaWduZWQgaW50ICAgIGN1cl9yeDsKLSAgICB1bnNpZ25lZCBpbnQgICAgY3VyX3R4OwotICAgIHVuc2lnbmVkIGludCAgICByeF9idWZfc3o7Ci0gICAgdm9sYXRpbGUgc3RydWN0IG5ldGRldl9kZXNjICpyeF9oZWFkX2Rlc2M7Ci0gICAgdm9sYXRpbGUgc3RydWN0IG5ldGRldl9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgbmV0ZGV2X2Rlc2MgdHhfcmluZ1tUWF9SSU5HX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwotfSBmYTMxMV9kZXY7Ci0KLXN0YXRpYyBpbnQgIGVlcHJvbV9yZWFkKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pOwotc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBGQTMxMV9ERVYgKmRldik7Ci1zdGF0aWMgdm9pZCBmYTMxMV9yZXNldChzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIGludCAgZmEzMTFfcG9sbChzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIHZvaWQgZmEzMTFfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOwotc3RhdGljIHZvaWQgZmEzMTFfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOwotCi1zdGF0aWMgY2hhciByeF9wYWNrZXRbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci1zdGF0aWMgY2hhciB0eF9wYWNrZXRbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci0KLXN0cnVjdCBuaWMgKiBmYTMxMV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKLXsKLWludCAgICAgICAgICAgIHByZXZfZWVkYXRhOwotaW50ICAgICAgICAgICAgaTsKLWludCAgICAgICAgICAgIGR1cGxleDsKLWludCAgICAgICAgICAgIHR4X2NvbmZpZzsKLWludCAgICAgICAgICAgIHJ4X2NvbmZpZzsKLXVuc2lnbmVkIGNoYXIgIG1hY2FkZHJbNl07Ci11bnNpZ25lZCBjaGFyICBtYWN0ZXN0OwotdW5zaWduZWQgY2hhciAgcGNpX2J1cyA9IDA7Ci1zdHJ1Y3QgRkEzMTFfREVWKiBkZXYgPSAmZmEzMTFfZGV2OwotCQotICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQotICAgICAgICByZXR1cm4gKDApOwotICAgIG1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7Ci0gICAgZGV2LT52ZW5kb3IgPSBwY2ktPnZlbmRvcjsKLSAgICBkZXYtPmRldmljZSA9IHBjaS0+ZGV2X2lkOwotICAgIGRldi0+aW9hZGRyID0gcGNpLT5tZW1iYXNlOwotCi0gICAgLyogV29yayBhcm91bmQgdGhlIGRyb3BwZWQgc2VyaWFsIGJpdC4gKi8KLSAgICBwcmV2X2VlZGF0YSA9IGVlcHJvbV9yZWFkKGRldi0+aW9hZGRyLCA2KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIGludCBlZWRhdGEgPSBlZXByb21fcmVhZChkZXYtPmlvYWRkciwgaSArIDcpOwotICAgICAgICBtYWNhZGRyW2kqMl0gPSAoZWVkYXRhIDw8IDEpICsgKHByZXZfZWVkYXRhID4+IDE1KTsKLSAgICAgICAgbWFjYWRkcltpKjIrMV0gPSBlZWRhdGEgPj4gNzsKLSAgICAgICAgcHJldl9lZWRhdGEgPSBlZWRhdGE7Ci0gICAgfQotICAgIG1hY3Rlc3QgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgICAgIG1hY3Rlc3QgfD0gbWFjYWRkcltpXTsKLSAgICBpZiAobWFjdGVzdCA9PSAwKQotICAgICAgICByZXR1cm4gKDApOwotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gbWFjYWRkcltpXTsKLSAgICBwcmludGYoIiUhICIsIG5pYy0+bm9kZV9hZGRyKTsKLQotICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7Ci0KLSAgICBmYTMxMV9yZXNldChuaWMpOwotCi0gICAgbmljLT5yZXNldCA9IGZhMzExX3Jlc2V0OwotICAgIG5pYy0+ZGlzYWJsZSA9IGZhMzExX2Rpc2FibGU7Ci0gICAgbmljLT5wb2xsID0gZmEzMTFfcG9sbDsKLSAgICBuaWMtPnRyYW5zbWl0ID0gZmEzMTFfdHJhbnNtaXQ7Ci0KLSAgICBpbml0X3JpbmcoZGV2KTsKLQotICAgIHdyaXRlbCh2aXJ0X3RvX2J1cyhkZXYtPnJ4X3JpbmcpLCBkZXYtPmlvYWRkciArIFJ4UmluZ1B0cik7Ci0gICAgd3JpdGVsKHZpcnRfdG9fYnVzKGRldi0+dHhfcmluZyksIGRldi0+aW9hZGRyICsgVHhSaW5nUHRyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpCi0gICAgewotICAgICAgICB3cml0ZWwoaSwgZGV2LT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOwotICAgICAgICB3cml0ZXcobWFjYWRkcltpXSArIChtYWNhZGRyW2krMV0gPDwgOCksCi0gICAgICAgICAgICAgICBkZXYtPmlvYWRkciArIFJ4RmlsdGVyRGF0YSk7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSBvdGhlciByZWdpc3RlcnMuICovCi0gICAgLyogQ29uZmlndXJlIGZvciBzdGFuZGFyZCwgaW4tc3BlYyBFdGhlcm5ldC4gKi8KLSAgICBpZiAocmVhZGwoZGV2LT5pb2FkZHIgKyBDaGlwQ29uZmlnKSAmIDB4MjAwMDAwMDApCi0gICAgeyAgICAvKiBGdWxsIGR1cGxleCAqLwotICAgICAgICB0eF9jb25maWcgPSAweEQwODAxMDAyOwotICAgICAgICByeF9jb25maWcgPSAweDEwMDAwMDIwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0eF9jb25maWcgPSAweDEwODAxMDAyOwotICAgICAgICByeF9jb25maWcgPSAweDAwMjA7Ci0gICAgfQotICAgIHdyaXRlbCh0eF9jb25maWcsIGRldi0+aW9hZGRyICsgVHhDb25maWcpOwotICAgIHdyaXRlbChyeF9jb25maWcsIGRldi0+aW9hZGRyICsgUnhDb25maWcpOwotCi0gICAgZHVwbGV4ID0gcmVhZGwoZGV2LT5pb2FkZHIgKyBDaGlwQ29uZmlnKSAmIDB4MjAwMDAwMDAgPyAxIDogMDsKLSAgICBpZiAoZHVwbGV4KSB7Ci0gICAgICAgIHJ4X2NvbmZpZyB8PSAweDEwMDAwMDAwOwotICAgICAgICB0eF9jb25maWcgfD0gMHhDMDAwMDAwMDsKLSAgICB9IGVsc2UgewotICAgICAgICByeF9jb25maWcgJj0gfjB4MTAwMDAwMDA7Ci0gICAgICAgIHR4X2NvbmZpZyAmPSB+MHhDMDAwMDAwMDsKLSAgICB9Ci0gICAgd3JpdGV3KHR4X2NvbmZpZywgZGV2LT5pb2FkZHIgKyBUeENvbmZpZyk7Ci0gICAgd3JpdGV3KHJ4X2NvbmZpZywgZGV2LT5pb2FkZHIgKyBSeENvbmZpZyk7Ci0KLSAgICB3cml0ZWwoQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzLCAKLSAgICAgICAgICAgZGV2LT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOwotCi0gICAgd3JpdGVsKFJ4T24gfCBUeE9uLCBkZXYtPmlvYWRkciArIENoaXBDbWQpOwotICAgIHdyaXRlbCg0LCBkZXYtPmlvYWRkciArIFN0YXRzQ3RybCk7ICAgICAgICAgICAgICAvKiBDbGVhciBTdGF0cyAqLwotICAgIHJldHVybiBuaWM7CQotCi19Ci0KLXN0YXRpYyB2b2lkIGZhMzExX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLXUzMiBjaGlwX2NvbmZpZzsKLXN0cnVjdCBGQTMxMV9ERVYqIGRldiA9ICZmYTMxMV9kZXY7Ci0KLSAgICAvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLwotICAgIG91dGwoQ2hpcFJlc2V0LCBkZXYtPmlvYWRkciArIENoaXBDbWQpOwotCi0gICAgaWYgKChyZWFkbChkZXYtPmlvYWRkciArIENoaXBDb25maWcpICYgMHhlMDAwKSAhPSAweGUwMDApCi0gICAgewotICAgICAgICBjaGlwX2NvbmZpZyA9IHJlYWRsKGRldi0+aW9hZGRyICsgQ2hpcENvbmZpZyk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGZhMzExX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotczMyIGRlc2Nfc3RhdHVzOwotaW50IHRvOwotaW50IGVudHJ5OwotaW50IHJldGNvZGU7Ci1zdHJ1Y3QgRkEzMTFfREVWKiBkZXYgPSAmZmEzMTFfZGV2OwotCi0gICAgcmV0Y29kZSA9IDA7Ci0gICAgZW50cnkgPSBkZXYtPmN1cl9yeDsKLSAgICB0byA9IFRJTUVfT1VUOwotICAgIHdoaWxlICh0byAhPSAwKQotICAgIHsKLSAgICAgICAgZGVzY19zdGF0dXMgPSBkZXYtPnJ4X3JpbmdbZW50cnldLmNtZF9zdGF0dXM7Ci0gICAgICAgIGlmICgoZGVzY19zdGF0dXMgJiBEZXNjT3duKSAhPSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC0tdG87Ci0gICAgfQotICAgIGlmICh0byAhPSAwKQotICAgIHsKLSAgICAgICAgcmVhZGwoZGV2LT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsgICAgICAgICAvKiBjbGVhciBpbnRlcnJydXB0IGJpdHMgKi8KLSAgICAgICAgLyogZHJpdmVyIG93bnMgdGhlIG5leHQgZW50cnkgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCi0gICAgICAgIGlmICgoZGVzY19zdGF0dXMgJiAoRGVzY01vcmV8RGVzY1BrdE9LfFJ4VG9vTG9uZykpID09IERlc2NQa3RPSykKLSAgICAgICAgewotICAgICAgICAgICAgbmljLT5wYWNrZXRsZW4gPSAoZGVzY19zdGF0dXMgJiAweDBmZmYpIC0gNDsgICAgLyogT21pdCBDUkMgc2l6ZS4gKi8KLSAgICAgICAgICAgIG1lbWNweShuaWMtPnBhY2tldCwgKGNoYXIqKShkZXYtPnJ4X3JpbmdbZW50cnldLmFkZHIpLCBuaWMtPnBhY2tldGxlbik7Ci0gICAgICAgICAgICByZXRjb2RlID0gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIGNoaXAgKi8KLSAgICAgICAgZGV2LT5yeF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoZGV2LT5yeF9idWZfc3opOwotICAgICAgICBkZXYtPmN1cl9yeCsrOwotICAgICAgICBpZiAoZGV2LT5jdXJfcnggPj0gUlhfUklOR19TSVpFKQotICAgICAgICAgICAgZGV2LT5jdXJfcnggPSAwOwotICAgICAgICBkZXYtPnJ4X2hlYWRfZGVzYyA9ICZkZXYtPnJ4X3JpbmdbZGV2LT5jdXJfcnhdOwotICAgIH0KLSAgICAvKiBSZXN0YXJ0IFJ4IGVuZ2luZSBpZiBzdG9wcGVkLiAqLwotICAgIHdyaXRlbChSeE9uLCBkZXYtPmlvYWRkciArIENoaXBDbWQpOwotICAgIHJldHVybiByZXRjb2RlOwotfQotCi1zdGF0aWMgdm9pZCBmYTMxMV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSkKLXsKLXVuc2lnbmVkIHNob3J0IG5zdHlwZTsKLXMzMiAgICAgICAgICAgIGRlc2Nfc3RhdHVzOwotaW50ICAgICAgICAgICAgdG87Ci1pbnQgICAgICAgICAgICBlbnRyeTsKLWNoYXIqICAgICAgICAgIHR4cDsKLXVuc2lnbmVkIGNoYXIqIHM7Ci1zdHJ1Y3QgRkEzMTFfREVWKiBkZXYgPSAmZmEzMTFfZGV2OwotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCi0gICAgZW50cnkgPSBkZXYtPmN1cl90eDsKLSAgICB0eHAgPSAoY2hhciopKGRldi0+dHhfcmluZ1tlbnRyeV0uYWRkcik7Ci0KLSAgICBtZW1jcHkodHhwLCBkZXN0YWRkciwgRVRIX0FMRU4pOwotICAgIG1lbWNweSh0eHAgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKLSAgICBuc3R5cGUgPSBodG9ucyh0eXBlKTsKLSAgICBtZW1jcHkodHhwICsgMTIsIChjaGFyKikmbnN0eXBlLCAyKTsKLSAgICBtZW1jcHkodHhwICsgRVRIX0hMRU4sIGRhdGEsIGxlbik7Ci0gICAgbGVuICs9IEVUSF9ITEVOOwotICAgIC8qIHBhZCBmcmFtZSAqLwotICAgIGlmIChsZW4gPCAgRVRIX1pMRU4pCi0gICAgewotICAgICAgICBzID0gKHVuc2lnbmVkIGNoYXIqKSh0eHArbGVuKTsKLSAgICAgICAgd2hpbGUgKHMgPCAodW5zaWduZWQgY2hhciopKHR4cCtFVEhfWkxFTikpCi0gICAgICAgICAgICAqcysrID0gMDsKLSAgICAgICAgbGVuID0gRVRIX1pMRU47Ci0gICAgfQotICAgIGRldi0+dHhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24gfCBsZW4pOwotICAgIGRldi0+Y3VyX3R4Kys7Ci0gICAgaWYgKGRldi0+Y3VyX3R4ID49IFRYX1JJTkdfU0laRSkKLSAgICAgICAgZGV2LT5jdXJfdHggPSAwOwotCi0gICAgLyogV2FrZSB0aGUgcG90ZW50aWFsbHktaWRsZSB0cmFuc21pdCBjaGFubmVsLiAqLwotICAgIHdyaXRlbChUeE9uLCBkZXYtPmlvYWRkciArIENoaXBDbWQpOwotCi0gICAgLyogd2FpdCBmb3IgdHJhbm1pc3Npb24gdG8gY29tcGxldGUgKi8KLSAgICB0byA9IFRJTUVfT1VUOwotICAgIHdoaWxlICh0byAhPSAwKQotICAgIHsKLSAgICAgICAgZGVzY19zdGF0dXMgPSBkZXYtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXM7Ci0gICAgICAgIGlmICgoZGVzY19zdGF0dXMgJiBEZXNjT3duKSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC0tdG87Ci0gICAgfQotCi0gICAgcmVhZGwoZGV2LT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsgICAgICAgICAvKiBjbGVhciBpbnRlcnJydXB0IGJpdHMgKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGZhMzExX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotc3RydWN0IEZBMzExX0RFViogZGV2ID0gJmZhMzExX2RldjsKLQotICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLwotICAgIHdyaXRlbChSeE9mZiB8IFR4T2ZmLCBkZXYtPmlvYWRkciArIENoaXBDbWQpOwotfQotCi0KLS8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuCi0gICBUaGUgRUVQUk9NIGNvZGUgaXMgZm9yIHRoZSBjb21tb24gOTNjMDYvNDYgRUVQUk9NcyB3aXRoIDYgYml0IGFkZHJlc3Nlcy4gKi8KLQotLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCi0gICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCBmdXR1cmUgNjZNaHogYWNjZXNzIG1heSBuZWVkCi0gICBhIGRlbGF5LiAgTm90ZSB0aGF0IHByZS0yLjAuMzQga2VybmVscyBoYWQgYSBjYWNoZS1hbGlnbm1lbnQgYnVnIHRoYXQKLSAgIG1hZGUgdWRlbGF5KCkgdW5yZWxpYWJsZS4KLSAgIFRoZSBvbGQgbWV0aG9kIG9mIHVzaW5nIGFuIElTQSBhY2Nlc3MgYXMgYSBkZWxheSwgX19TTE9XX0RPV05fSU9fXywgaXMKLSAgIGRlcHJpY2F0ZWQuCi0qLwotI2RlZmluZSBlZXByb21fZGVsYXkoZWVfYWRkcikJaW5sKGVlX2FkZHIpCi0KLWVudW0gRUVQUk9NX0N0cmxfQml0cyB7Ci0JRUVfU2hpZnRDbGs9MHgwNCwgRUVfRGF0YUluPTB4MDEsIEVFX0NoaXBTZWxlY3Q9MHgwOCwgRUVfRGF0YU91dD0weDAyLAotfTsKLSNkZWZpbmUgRUVfV3JpdGUwIChFRV9DaGlwU2VsZWN0KQotI2RlZmluZSBFRV9Xcml0ZTEgKEVFX0NoaXBTZWxlY3QgfCBFRV9EYXRhSW4pCi0KLS8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLwotZW51bSBFRVBST01fQ21kcyB7Ci0JRUVfV3JpdGVDbWQ9KDUgPDwgNiksIEVFX1JlYWRDbWQ9KDYgPDwgNiksIEVFX0VyYXNlQ21kPSg3IDw8IDYpLAotfTsKLQotCi1zdGF0aWMgaW50IGVlcHJvbV9yZWFkKGxvbmcgYWRkciwgaW50IGxvY2F0aW9uKQotewotCWludCBpOwotCWludCByZXR2YWwgPSAwOwotCWludCBlZV9hZGRyID0gYWRkciArIEVFQ3RybDsKLQlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JlYWRDbWQ7Ci0Jd3JpdGVsKEVFX1dyaXRlMCwgZWVfYWRkcik7Ci0KLQkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLwotCWZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgewotCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfV3JpdGUxIDogRUVfV3JpdGUwOwotCQl3cml0ZWwoZGF0YXZhbCwgZWVfYWRkcik7Ci0JCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKLQkJd3JpdGVsKGRhdGF2YWwgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7Ci0JCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKLQl9Ci0Jd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOwotCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXdyaXRlbChFRV9DaGlwU2VsZWN0IHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOwotCQllZXByb21fZGVsYXkoZWVfYWRkcik7Ci0JCXJldHZhbCB8PSAocmVhZGwoZWVfYWRkcikgJiBFRV9EYXRhT3V0KSA/IDEgPDwgaSA6IDA7Ci0JCXdyaXRlbChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKLQkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOwotCX0KLQotCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KLQl3cml0ZWwoRUVfV3JpdGUwLCBlZV9hZGRyKTsKLQl3cml0ZWwoMCwgZWVfYWRkcik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KLXN0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgRkEzMTFfREVWICpkZXYpCi17Ci0JaW50IGk7Ci0KLQlkZXYtPmN1cl9yeCA9IDA7Ci0gICAgZGV2LT5jdXJfdHggPSAwOwotCi0JZGV2LT5yeF9idWZfc3ogPSBQS1RfQlVGX1NaOwotCWRldi0+cnhfaGVhZF9kZXNjID0gJmRldi0+cnhfcmluZ1swXTsKLQotCS8qIEluaXRpYWxpemUgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgewotCQlkZXYtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmZGV2LT5yeF9yaW5nW2krMV0pOwotCQlkZXYtPnJ4X3JpbmdbaV0uY21kX3N0YXR1cyA9IERlc2NPd247Ci0JfQotCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCi0JZGV2LT5yeF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmZGV2LT5yeF9yaW5nWzBdKTsKLQotCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCi0JZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7Ci0JCWRldi0+cnhfcmluZ1tpXS5hZGRyID0gKHUzMikoJnJ4X3BhY2tldFtQS1RfQlVGX1NaICogaV0pOwotCSAgICBkZXYtPnJ4X3JpbmdbaV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKGRldi0+cnhfYnVmX3N6KTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKLQkJZGV2LT50eF9yaW5nW2ldLm5leHRfZGVzYyA9IHZpcnRfdG9fbGUzMmRlc2MoJmRldi0+dHhfcmluZ1tpKzFdKTsKLQkJZGV2LT50eF9yaW5nW2ldLmNtZF9zdGF0dXMgPSAwOwotCX0KLQlkZXYtPnR4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZkZXYtPnR4X3JpbmdbMF0pOwotCi0JZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQotCQlkZXYtPnR4X3JpbmdbaV0uYWRkciA9ICh1MzIpKCZ0eF9wYWNrZXRbUEtUX0JVRl9TWiAqIGldKTsKLQlyZXR1cm47Ci19Ci0KSW5kZXg6IGIvbmV0Ym9vdC9mb3JjZWRldGguYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9mb3JjZWRldGguYwpAQCAtMCwwICsxLDEwMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICBmb3JjZWRldGguYyAtLSBFdGhlcmJvb3QgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5WSURJQSBuRm9yY2UgCisqCQkJbWVkaWEgYWNjZXNzIGNvbnRyb2xsZXJzLgorKgorKiBOb3RlOiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgTGludXggZHJpdmVyIHRoYXQgd2FzIGJhc2VkIG9uCisqICAgICAgYSBjbGVhbnJvb20gcmVpbXBsZW1lbnRhdGlvbiB3aGljaCB3YXMgYmFzZWQgb24gcmV2ZXJzZQorKiAgICAgIGVuZ2luZWVyZWQgZG9jdW1lbnRhdGlvbiB3cml0dGVuIGJ5IENhcmwtRGFuaWVsIEhhaWxmaW5nZXIKKyogICAgICBhbmQgQW5kcmV3IGRlIFF1aW5jZXkuIEl0J3MgbmVpdGhlciBzdXBwb3J0ZWQgbm9yIGVuZG9yc2VkCisqICAgICAgYnkgTlZJRElBIENvcnAuIFVzZSBhdCB5b3VyIG93biByaXNrLgorKgorKiAgICBXcml0dGVuIDIwMDQgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCQlmb3JjZWRldGg6IEV0aGVybmV0IGRyaXZlciBmb3IgTlZJRElBIG5Gb3JjZSBtZWRpYSBhY2Nlc3MgY29udHJvbGxlcnM6CisqCisqCShDKSAyMDAzIE1hbmZyZWQgU3ByYXVsCisqCQlTZWUgTGludXggRHJpdmVyIGZvciBmdWxsIGluZm9ybWF0aW9uCisqCQorKglMaW51eCBEcml2ZXIgVmVyc2lvbiAwLjIyLCAxOSBKYW4gMjAwNAorKiAKKyogCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwMS0zMS0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuMQkwMi0wMy0yMDA0CXRpbWxlZ2dlCUxhcmdlIENsZWFuIHVwLCBmaXJzdCByZWxlYXNlIAorKiAgICAKKyogICAgSW5kZW50IE9wdGlvbnM6IGluZGVudCAta3IgLWk4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKy8qIHRvIGdldCB0aGUgUENJIHN1cHBvcnQgZnVuY3Rpb25zLCBpZiB0aGlzIGlzIGEgUENJIE5JQyAqLworI2luY2x1ZGUgInBjaS5oIgorLyogSW5jbHVkZSB0aW1lciBzdXBwb3J0IGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgInRpbWVyLmgiCisKKyNkZWZpbmUgZHJ2X3ZlcnNpb24gInYxLjEiCisjZGVmaW5lIGRydl9kYXRlICIwMi0wMy0yMDA0IgorCisvLyNkZWZpbmUgVEZUTV9ERUJVRworI2lmZGVmIFRGVE1fREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCit1bnNpZ25lZCBsb25nIEJBU0U7CisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisKKworLyoKKyAqIEhhcmR3YXJlIGFjY2VzczoKKyAqLworCisjZGVmaW5lIERFVl9ORUVEX0xBU1RQQUNLRVQxCTB4MDAwMQorI2RlZmluZSBERVZfSVJRTUFTS18xCQkweDAwMDIKKyNkZWZpbmUgREVWX0lSUU1BU0tfMgkJMHgwMDA0CisjZGVmaW5lIERFVl9ORUVEX1RJTUVSSVJRCTB4MDAwOAorCitlbnVtIHsKKwlOdlJlZ0lycVN0YXR1cyA9IDB4MDAwLAorI2RlZmluZSBOVlJFR19JUlFTVEFUX01JSUVWRU5UCTAwNDAKKyNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NQVNLCQkweDFmZgorCU52UmVnSXJxTWFzayA9IDB4MDA0LAorI2RlZmluZSBOVlJFR19JUlFfUlgJCQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfSVJRX1JYX05PQlVGCQkweDAwMDQKKyNkZWZpbmUgTlZSRUdfSVJRX1RYX0VSUgkJMHgwMDA4CisjZGVmaW5lIE5WUkVHX0lSUV9UWDIJCQkweDAwMTAKKyNkZWZpbmUgTlZSRUdfSVJRX1RJTUVSCQkJMHgwMDIwCisjZGVmaW5lIE5WUkVHX0lSUV9MSU5LCQkJMHgwMDQwCisjZGVmaW5lIE5WUkVHX0lSUV9UWDEJCQkweDAxMDAKKyNkZWZpbmUgTlZSRUdfSVJRTUFTS19XQU5URURfMQkJMHgwMDVmCisjZGVmaW5lIE5WUkVHX0lSUU1BU0tfV0FOVEVEXzIJCTB4MDE0NworI2RlZmluZSBOVlJFR19JUlFfVU5LTk9XTgkJKH4oTlZSRUdfSVJRX1JYfE5WUkVHX0lSUV9SWF9OT0JVRnxOVlJFR19JUlFfVFhfRVJSfE5WUkVHX0lSUV9UWDJ8TlZSRUdfSVJRX1RJTUVSfE5WUkVHX0lSUV9MSU5LfE5WUkVHX0lSUV9UWDEpKQorCisJTnZSZWdVbmtub3duU2V0dXBSZWc2ID0gMHgwMDgsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNl9WQUwJCTMKKworLyoKKyAqIE5WUkVHX1BPTExfREVGQVVMVCBpcyB0aGUgaW50ZXJ2YWwgbGVuZ3RoIG9mIHRoZSB0aW1lciBzb3VyY2Ugb24gdGhlIG5pYworICogTlZSRUdfUE9MTF9ERUZBVUxUPTk3IHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlcnZhbCBsZW5ndGggb2YgMSBtcworICovCisJTnZSZWdQb2xsaW5nSW50ZXJ2YWwgPSAweDAwYywKKyNkZWZpbmUgTlZSRUdfUE9MTF9ERUZBVUxUCTk3MAorCU52UmVnTWlzYzEgPSAweDA4MCwKKyNkZWZpbmUgTlZSRUdfTUlTQzFfSEQJCTB4MDIKKyNkZWZpbmUgTlZSRUdfTUlTQzFfRk9SQ0UJMHgzYjBmM2MKKworCU52UmVnVHJhbnNtaXR0ZXJDb250cm9sID0gMHgwODQsCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfU1RBUlQJMHgwMQorCU52UmVnVHJhbnNtaXR0ZXJTdGF0dXMgPSAweDA4OCwKKyNkZWZpbmUgTlZSRUdfWE1JVFNUQVRfQlVTWQkweDAxCisKKwlOdlJlZ1BhY2tldEZpbHRlckZsYWdzID0gMHg4YywKKyNkZWZpbmUgTlZSRUdfUEZGX0FMV0FZUwkweDdGMDAwOAorI2RlZmluZSBOVlJFR19QRkZfUFJPTUlTQwkweDgwCisjZGVmaW5lIE5WUkVHX1BGRl9NWUFERFIJMHgyMAorCisJTnZSZWdPZmZsb2FkQ29uZmlnID0gMHg5MCwKKyNkZWZpbmUgTlZSRUdfT0ZGTE9BRF9IT01FUEhZCTB4NjAxCisjZGVmaW5lIE5WUkVHX09GRkxPQURfTk9STUFMCTB4NWVlCisJTnZSZWdSZWNlaXZlckNvbnRyb2wgPSAweDA5NCwKKyNkZWZpbmUgTlZSRUdfUkNWQ1RMX1NUQVJUCTB4MDEKKwlOdlJlZ1JlY2VpdmVyU3RhdHVzID0gMHg5OCwKKyNkZWZpbmUgTlZSRUdfUkNWU1RBVF9CVVNZCTB4MDEKKworCU52UmVnUmFuZG9tU2VlZCA9IDB4OWMsCisjZGVmaW5lIE5WUkVHX1JORFNFRURfTUFTSwkweDAwZmYKKyNkZWZpbmUgTlZSRUdfUk5EU0VFRF9GT1JDRQkweDdmMDAKKworCU52UmVnVW5rbm93blNldHVwUmVnMSA9IDB4QTAsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQMV9WQUwJMHgxNjA3MGYKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzIgPSAweEE0LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDJfVkFMCTB4MTYKKwlOdlJlZ01hY0FkZHJBID0gMHhBOCwKKwlOdlJlZ01hY0FkZHJCID0gMHhBQywKKwlOdlJlZ011bHRpY2FzdEFkZHJBID0gMHhCMCwKKyNkZWZpbmUgTlZSRUdfTUNBU1RBRERSQV9GT1JDRQkweDAxCisJTnZSZWdNdWx0aWNhc3RBZGRyQiA9IDB4QjQsCisJTnZSZWdNdWx0aWNhc3RNYXNrQSA9IDB4QjgsCisJTnZSZWdNdWx0aWNhc3RNYXNrQiA9IDB4QkMsCisKKwlOdlJlZ1R4UmluZ1BoeXNBZGRyID0gMHgxMDAsCisJTnZSZWdSeFJpbmdQaHlzQWRkciA9IDB4MTA0LAorCU52UmVnUmluZ1NpemVzID0gMHgxMDgsCisjZGVmaW5lIE5WUkVHX1JJTkdTWl9UWFNISUZUIDAKKyNkZWZpbmUgTlZSRUdfUklOR1NaX1JYU0hJRlQgMTYKKwlOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyA9IDB4MTBjLAorCU52UmVnTGlua1NwZWVkID0gMHgxMTAsCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF9GT1JDRSAweDEwMDAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMAkxMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAwCTEwMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAwMAkxMDAwCisJTnZSZWdVbmtub3duU2V0dXBSZWc1ID0gMHgxMzAsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNV9CSVQzMQkoMTw8MzEpCisJTnZSZWdVbmtub3duU2V0dXBSZWczID0gMHgxMzQsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQM19WQUwxCTB4MjAwMDEwCisJTnZSZWdUeFJ4Q29udHJvbCA9IDB4MTQ0LAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0tJQ0sJMHgwMDAxCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfQklUMQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9CSVQyCTB4MDAwNAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0lETEUJMHgwMDA4CisjZGVmaW5lIE5WUkVHX1RYUlhDVExfUkVTRVQJMHgwMDEwCisJTnZSZWdNSUlTdGF0dXMgPSAweDE4MCwKKyNkZWZpbmUgTlZSRUdfTUlJU1RBVF9FUlJPUgkJMHgwMDAxCisjZGVmaW5lIE5WUkVHX01JSVNUQVRfTElOS0NIQU5HRQkweDAwMDgKKyNkZWZpbmUgTlZSRUdfTUlJU1RBVF9NQVNLCQkweDAwMGYKKyNkZWZpbmUgTlZSRUdfTUlJU1RBVF9NQVNLMgkJMHgwMDBmCisJTnZSZWdVbmtub3duU2V0dXBSZWc0ID0gMHgxODQsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNF9WQUwJOAorCisJTnZSZWdBZGFwdGVyQ29udHJvbCA9IDB4MTg4LAorI2RlZmluZSBOVlJFR19BREFQVENUTF9TVEFSVAkweDAyCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX0xJTktVUAkweDA0CisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1BIWVZBTElECTB4NDAwMAorI2RlZmluZSBOVlJFR19BREFQVENUTF9SVU5OSU5HCTB4MTAwMDAwCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUCTI0CisJTnZSZWdNSUlTcGVlZCA9IDB4MThjLAorI2RlZmluZSBOVlJFR19NSUlTUEVFRF9CSVQ4CSgxPDw4KQorI2RlZmluZSBOVlJFR19NSUlERUxBWQk1CisJTnZSZWdNSUlDb250cm9sID0gMHgxOTAsCisjZGVmaW5lIE5WUkVHX01JSUNUTF9JTlVTRQkweDEwMDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9XUklURQkweDA4MDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9BRERSU0hJRlQJNQorCU52UmVnTUlJRGF0YSA9IDB4MTk0LAorCU52UmVnV2FrZVVwRmxhZ3MgPSAweDIwMCwKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfVkFMCQkweDc3NzAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQlVTWVNISUZUCTI0CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0VOQUJMRVNISUZUCTE2CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QzU0hJRlQJMTIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDJTSElGVAk4CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QxU0hJRlQJNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EMFNISUZUCTAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX01BR1BBVAkJMHgwMQorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19BQ0NFUFRfV0FLRVVQUEFUCTB4MDIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX0xJTktDSEFOR0UJMHgwNAorCisJTnZSZWdQYXR0ZXJuQ1JDID0gMHgyMDQsCisJTnZSZWdQYXR0ZXJuTWFzayA9IDB4MjA4LAorCU52UmVnUG93ZXJDYXAgPSAweDI2OCwKKyNkZWZpbmUgTlZSRUdfUE9XRVJDQVBfRDNTVVBQCSgxPDwzMCkKKyNkZWZpbmUgTlZSRUdfUE9XRVJDQVBfRDJTVVBQCSgxPDwyNikKKyNkZWZpbmUgTlZSRUdfUE9XRVJDQVBfRDFTVVBQCSgxPDwyNSkKKwlOdlJlZ1Bvd2VyU3RhdGUgPSAweDI2YywKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9QT1dFUkVEVVAJMHg4MDAwCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfVkFMSUQJCTB4MDEwMAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX01BU0sJCTB4MDAwMworI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QwCQkweDAwMDAKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMQkJMHgwMDAxCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDIJCTB4MDAwMgorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QzCQkweDAwMDMKK307CisKKworCisjZGVmaW5lIE5WX1RYX0xBU1RQQUNLRVQJKDE8PDApCisjZGVmaW5lIE5WX1RYX1JFVFJZRVJST1IJKDE8PDMpCisjZGVmaW5lIE5WX1RYX0xBU1RQQUNLRVQxCSgxPDw4KQorI2RlZmluZSBOVl9UWF9ERUZFUlJFRAkJKDE8PDEwKQorI2RlZmluZSBOVl9UWF9DQVJSSUVSTE9TVAkoMTw8MTEpCisjZGVmaW5lIE5WX1RYX0xBVEVDT0xMSVNJT04JKDE8PDEyKQorI2RlZmluZSBOVl9UWF9VTkRFUkZMT1cJCSgxPDwxMykKKyNkZWZpbmUgTlZfVFhfRVJST1IJCSgxPDwxNCkKKyNkZWZpbmUgTlZfVFhfVkFMSUQJCSgxPDwxNSkKKworI2RlZmluZSBOVl9SWF9ERVNDUklQVE9SVkFMSUQJKDE8PDApCisjZGVmaW5lIE5WX1JYX01JU1NFREZSQU1FCSgxPDwxKQorI2RlZmluZSBOVl9SWF9TVUJTVFJBQ1QxCSgxPDwzKQorI2RlZmluZSBOVl9SWF9FUlJPUjEJCSgxPDw3KQorI2RlZmluZSBOVl9SWF9FUlJPUjIJCSgxPDw4KQorI2RlZmluZSBOVl9SWF9FUlJPUjMJCSgxPDw5KQorI2RlZmluZSBOVl9SWF9FUlJPUjQJCSgxPDwxMCkKKyNkZWZpbmUgTlZfUlhfQ1JDRVJSCQkoMTw8MTEpCisjZGVmaW5lIE5WX1JYX09WRVJGTE9XCQkoMTw8MTIpCisjZGVmaW5lIE5WX1JYX0ZSQU1JTkdFUlIJKDE8PDEzKQorI2RlZmluZSBOVl9SWF9FUlJPUgkJKDE8PDE0KQorI2RlZmluZSBOVl9SWF9BVkFJTAkJKDE8PDE1KQorCisvKiBNaXNjZWxhbmVvdXMgaGFyZHdhcmUgcmVsYXRlZCBkZWZpbmVzOiAqLworI2RlZmluZSBOVl9QQ0lfUkVHU1oJCTB4MjcwCisKKy8qIHZhcmlvdXMgdGltZW91dCBkZWxheXM6IGFsbCBpbiB1c2VjICovCisjZGVmaW5lIE5WX1RYUlhfUkVTRVRfREVMQVkJNAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkxCTEwCisjZGVmaW5lIE5WX1RYU1RPUF9ERUxBWTFNQVgJNTAwMDAwCisjZGVmaW5lIE5WX1RYU1RPUF9ERUxBWTIJMTAwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTEJMTAKKyNkZWZpbmUgTlZfUlhTVE9QX0RFTEFZMU1BWAk1MDAwMDAKKyNkZWZpbmUgTlZfUlhTVE9QX0RFTEFZMgkxMDAKKyNkZWZpbmUgTlZfU0VUVVA1X0RFTEFZCQk1CisjZGVmaW5lIE5WX1NFVFVQNV9ERUxBWU1BWAk1MDAwMAorI2RlZmluZSBOVl9QT1dFUlVQX0RFTEFZCTUKKyNkZWZpbmUgTlZfUE9XRVJVUF9ERUxBWU1BWAk1MDAwCisjZGVmaW5lIE5WX01JSUJVU1lfREVMQVkJNTAKKyNkZWZpbmUgTlZfTUlJUEhZX0RFTEFZCTEwCisjZGVmaW5lIE5WX01JSVBIWV9ERUxBWU1BWAkxMDAwMAorCisjZGVmaW5lIE5WX1dBS0VVUFBBVFRFUk5TCTUKKyNkZWZpbmUgTlZfV0FLRVVQTUFTS0VOVFJJRVMJNAorCisvKiBHZW5lcmFsIGRyaXZlciBkZWZhdWx0cyAqLworI2RlZmluZSBOVl9XQVRDSERPR19USU1FTwkoMipIWikKKyNkZWZpbmUgREVGQVVMVF9NVFUJCTE1MDAJLyogYWxzbyBtYXhpbXVtIHN1cHBvcnRlZCwgYXQgbGVhc3QgZm9yIG5vdyAqLworCisjZGVmaW5lIFJYX1JJTkcJCTQKKyNkZWZpbmUgVFhfUklORwkJMgorLyogbGltaXRlZCB0byAxIHBhY2tldCB1bnRpbCB3ZSB1bmRlcnN0YW5kIE5WX1RYX0xBU1RQQUNLRVQgKi8KKyNkZWZpbmUgVFhfTElNSVRfU1RPUAkxMAorI2RlZmluZSBUWF9MSU1JVF9TVEFSVAk1CisKKy8qIHJ4L3R4IG1hYyBhZGRyICsgdHlwZSArIHZsYW4gKyBhbGlnbiArIHNsYWNrKi8KKyNkZWZpbmUgUlhfTklDX0JVRlNJWkUJCShERUZBVUxUX01UVSArIDY0KQorLyogZXZlbiBtb3JlIHNsYWNrICovCisjZGVmaW5lIFJYX0FMTE9DX0JVRlNJWkUJKERFRkFVTFRfTVRVICsgMTI4KQorCisjZGVmaW5lIE9PTV9SRUZJTEwJKDErSFovMjApCisjZGVmaW5lIFBPTExfV0FJVAkoMStIWi8xMDApCisKK3N0cnVjdCByaW5nX2Rlc2MgeworCXUzMiBQYWNrZXRCdWZmZXI7CisJdTE2IExlbmd0aDsKKwl1MTYgRmxhZ3M7Cit9OworCisKKy8qIERlZmluZSB0aGUgVFggRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCByaW5nX2Rlc2MgdHhfcmluZ1tUWF9SSU5HXTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFJYX0JVRl9TWiBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbVFhfUklORyAqIFJYX05JQ19CVUZTSVpFXTsKKworLyogRGVmaW5lIHRoZSBUWCBEZXNjcmlwdG9yICovCitzdGF0aWMgc3RydWN0IHJpbmdfZGVzYyByeF9yaW5nW1JYX1JJTkddOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUlhfQlVGX1NaIGZvciBlYWNoCitSWCBEZXNjcmlwdG9yICAgQWxsIGRlc2NyaXB0b3JzIHBvaW50IHRvIGEKK3BhcnQgb2YgdGhpcyBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltSWF9SSU5HICogUlhfTklDX0JVRlNJWkVdOworCisvKiBQcml2YXRlIFN0b3JhZ2UgZm9yIHRoZSBOSUMgKi8KK3N0cnVjdCBmb3JjZWRldGhfcHJpdmF0ZSB7CisJLyogR2VuZXJhbCBkYXRhOgorCSAqIExvY2tpbmc6IHNwaW5fbG9jaygmbnAtPmxvY2spOyAqLworCWludCBpbl9zaHV0ZG93bjsKKwl1MzIgbGlua3NwZWVkOworCWludCBkdXBsZXg7CisJaW50IHBoeWFkZHI7CisKKwkvKiBHZW5lcmFsIGRhdGE6IFJPIGZpZWxkcyAqLworCXU4ICpyaW5nX2FkZHI7CisJdTMyIG9yaWdfbWFjWzJdOworCXUzMiBpcnFtYXNrOworCS8qIHJ4IHNwZWNpZmljIGZpZWxkcy4KKwkgKiBMb2NraW5nOiBXaXRoaW4gaXJxIGhhbmRlciBvciBkaXNhYmxlX2lycStzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkgKi8KKwlzdHJ1Y3QgcmluZ19kZXNjICpyeF9yaW5nOworCXVuc2lnbmVkIGludCBjdXJfcngsIHJlZmlsbF9yeDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkddOworCXUzMiByeF9kbWFbUlhfUklOR107CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsKKworCS8qCisJICogdHggc3BlY2lmaWMgZmllbGRzLgorCSAqLworCXN0cnVjdCByaW5nX2Rlc2MgKnR4X3Jpbmc7CisJdW5zaWduZWQgaW50IG5leHRfdHgsIG5pY190eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkddOworCXUzMiB0eF9kbWFbVFhfUklOR107CisJdTE2IHR4X2ZsYWdzOworfSBucHg7CisKK3N0YXRpYyBzdHJ1Y3QgZm9yY2VkZXRoX3ByaXZhdGUgKm5wOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3B1c2godTggKiBiYXNlKQoreworCS8qIGZvcmNlIG91dCBwZW5kaW5nIHBvc3RlZCB3cml0ZXMgKi8KKwlyZWFkbChiYXNlKTsKK30KK3N0YXRpYyBpbnQgcmVnX2RlbGF5KGludCBvZmZzZXQsIHUzMiBtYXNrLAorCQkgICAgIHUzMiB0YXJnZXQsIGludCBkZWxheSwgaW50IGRlbGF5bWF4LCBjb25zdCBjaGFyICptc2cpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCXBjaV9wdXNoKGJhc2UpOworCWRvIHsKKwkJdWRlbGF5KGRlbGF5KTsKKwkJZGVsYXltYXggLT0gZGVsYXk7CisJCWlmIChkZWxheW1heCA8IDApIHsKKwkJCWlmIChtc2cpCisJCQkJcHJpbnRmKG1zZyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKChyZWFkbChiYXNlICsgb2Zmc2V0KSAmIG1hc2spICE9IHRhcmdldCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUlJX1JFQUQJKC0xKQorI2RlZmluZSBNSUlfUEhZU0lEMSAgICAgICAgIDB4MDIJLyogUEhZUyBJRCAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9QSFlTSUQyICAgICAgICAgMHgwMwkvKiBQSFlTIElEIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAweDAwCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQk1TUiAgICAgICAgICAgIDB4MDEJLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgICovCisjZGVmaW5lIE1JSV9BRFZFUlRJU0UgICAgICAgMHgwNAkvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICAgKi8KKyNkZWZpbmUgTUlJX0xQQSAgICAgICAgICAgICAweDA1CS8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZyAgICAqLworCisjZGVmaW5lIEJNU1JfQU5FR0NPTVBMRVRFICAgICAgIDB4MDAyMAkvKiBBdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICAgKi8KKworLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIuICovCisjZGVmaW5lIExQQV9TTENUICAgICAgICAgICAgICAgIDB4MDAxZgkvKiBTYW1lIGFzIGFkdmVydGlzZSBzZWxlY3RvciAgKi8KKyNkZWZpbmUgTFBBXzEwSEFMRiAgICAgICAgICAgICAgMHgwMDIwCS8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTBGVUxMICAgICAgICAgICAgICAweDAwNDAJLyogQ2FuIGRvIDEwbWJwcyBmdWxsLWR1cGxleCAgICovCisjZGVmaW5lIExQQV8xMDBIQUxGICAgICAgICAgICAgIDB4MDA4MAkvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwgICAgICAgICAgICAgMHgwMTAwCS8qIENhbiBkbyAxMDBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBMUEFfMTAwQkFTRTQgICAgICAgICAgICAweDAyMDAJLyogQ2FuIGRvIDEwMG1icHMgNGsgcGFja2V0cyAgICovCisjZGVmaW5lIExQQV9SRVNWICAgICAgICAgICAgICAgIDB4MWMwMAkvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1JGQVVMVCAgICAgICAgICAgICAgMHgyMDAwCS8qIExpbmsgcGFydG5lciBmYXVsdGVkICAgICAgICAqLworI2RlZmluZSBMUEFfTFBBQ0sgICAgICAgICAgICAgICAweDQwMDAJLyogTGluayBwYXJ0bmVyIGFja2VkIHVzICAgICAgICovCisjZGVmaW5lIExQQV9OUEFHRSAgICAgICAgICAgICAgIDB4ODAwMAkvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworLyogbWlpX3J3OiByZWFkL3dyaXRlIGEgcmVnaXN0ZXIgb24gdGhlIFBIWS4KKyAqCisgKiBDYWxsZXIgbXVzdCBndWFyYW50ZWUgc2VyaWFsaXphdGlvbgorICovCitzdGF0aWMgaW50IG1paV9ydyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBhZGRyLCBpbnQgbWlpcmVnLAorCQkgIGludCB2YWx1ZSkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCWludCB3YXNfcnVubmluZzsKKwl1MzIgcmVnOworCWludCByZXR2YWw7CisKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdNSUlTdGF0dXMpOworCXdhc19ydW5uaW5nID0gMDsKKwlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJaWYgKHJlZyAmIE5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcpIHsKKwkJd2FzX3J1bm5pbmcgPSAxOworCQl3cml0ZWwocmVnICYgfk5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcsCisJCSAgICAgICBiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJfQorCXJlZyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSUNvbnRyb2wpOworCWlmIChyZWcgJiBOVlJFR19NSUlDVExfSU5VU0UpIHsKKwkJd3JpdGVsKE5WUkVHX01JSUNUTF9JTlVTRSwgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisJCXVkZWxheShOVl9NSUlCVVNZX0RFTEFZKTsKKwl9CisKKwlyZWcgPQorCSAgICBOVlJFR19NSUlDVExfSU5VU0UgfCAoYWRkciA8PCBOVlJFR19NSUlDVExfQUREUlNISUZUKSB8IG1paXJlZzsKKwlpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJd3JpdGVsKHZhbHVlLCBiYXNlICsgTnZSZWdNSUlEYXRhKTsKKwkJcmVnIHw9IE5WUkVHX01JSUNUTF9XUklURTsKKwl9CisJd3JpdGVsKHJlZywgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisKKwlpZiAocmVnX2RlbGF5KE52UmVnTUlJQ29udHJvbCwgTlZSRUdfTUlJQ1RMX0lOVVNFLCAwLAorCQkgICAgICBOVl9NSUlQSFlfREVMQVksIE5WX01JSVBIWV9ERUxBWU1BWCwgTlVMTCkpIHsKKwkJZHByaW50ZigoIm1paV9ydyBvZiByZWcgJWQgYXQgUEhZICVkIHRpbWVkIG91dC5cbiIsCisJCQkgbWlpcmVnLCBhZGRyKSk7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSBpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJLyogaXQgd2FzIGEgd3JpdGUgb3BlcmF0aW9uIC0gZmV3ZXIgZmFpbHVyZXMgYXJlIGRldGVjdGFibGUgKi8KKwkJZHByaW50ZigoIm1paV9ydyB3cm90ZSAweCV4IHRvIHJlZyAlZCBhdCBQSFkgJWRcbiIsCisJCQkgdmFsdWUsIG1paXJlZywgYWRkcikpOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSBpZiAocmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKSAmIE5WUkVHX01JSVNUQVRfRVJST1IpIHsKKwkJZHByaW50ZigoIm1paV9ydyBvZiByZWcgJWQgYXQgUEhZICVkIGZhaWxlZC5cbiIsCisJCQkgbWlpcmVnLCBhZGRyKSk7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSB7CisJCS8qIEZJWE1FOiB3aHkgaXMgdGhhdCByZXF1aXJlZD8gKi8KKwkJdWRlbGF5KDUwKTsKKwkJcmV0dmFsID0gcmVhZGwoYmFzZSArIE52UmVnTUlJRGF0YSk7CisJCWRwcmludGYoKCJtaWlfcncgcmVhZCBmcm9tIHJlZyAlZCBhdCBQSFkgJWQ6IDB4JXguXG4iLAorCQkJIG1paXJlZywgYWRkciwgcmV0dmFsKSk7CisJfQorCWlmICh3YXNfcnVubmluZykgeworCQlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJCXdyaXRlbChyZWcgfCBOVlJFR19BREFQVENUTF9SVU5OSU5HLAorCQkgICAgICAgYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9yeChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCWRwcmludGYoKCJzdGFydF9yeFxuIikpOworCS8qIEFscmVhZHkgcnVubmluZz8gU3RvcCBpdC4gKi8KKwlpZiAocmVhZGwoYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKSAmIE5WUkVHX1JDVkNUTF9TVEFSVCkgeworCQl3cml0ZWwoMCwgYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKTsKKwkJcGNpX3B1c2goYmFzZSk7CisJfQorCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChOVlJFR19SQ1ZDVExfU1RBUlQsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3Bfcngodm9pZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInN0b3BfcnhcbiIpKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKTsKKwlyZWdfZGVsYXkoTnZSZWdSZWNlaXZlclN0YXR1cywgTlZSRUdfUkNWU1RBVF9CVVNZLCAwLAorCQkgIE5WX1JYU1RPUF9ERUxBWTEsIE5WX1JYU1RPUF9ERUxBWTFNQVgsCisJCSAgInN0b3Bfcng6IFJlY2VpdmVyU3RhdHVzIHJlbWFpbmVkIGJ1c3kiKTsKKworCXVkZWxheShOVl9SWFNUT1BfREVMQVkyKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfdHgoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisKKwlkcHJpbnRmKCgic3RhcnRfdHhcbiIpKTsKKwl3cml0ZWwoTlZSRUdfWE1JVENUTF9TVEFSVCwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF90eCh2b2lkKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisKKwlkcHJpbnRmKCgic3RvcF90eFxuIikpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCXJlZ19kZWxheShOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzLCBOVlJFR19YTUlUU1RBVF9CVVNZLCAwLAorCQkgIE5WX1RYU1RPUF9ERUxBWTEsIE5WX1RYU1RPUF9ERUxBWTFNQVgsCisJCSAgInN0b3BfdHg6IFRyYW5zbWl0dGVyU3RhdHVzIHJlbWFpbmVkIGJ1c3kiKTsKKworCXVkZWxheShOVl9UWFNUT1BfREVMQVkyKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blRyYW5zbWl0dGVyUmVnKTsKK30KKworCitzdGF0aWMgdm9pZCB0eHJ4X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInR4cnhfcmVzZXRcbiIpKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQyIHwgTlZSRUdfVFhSWENUTF9SRVNFVCwKKwkgICAgICAgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheShOVl9UWFJYX1JFU0VUX0RFTEFZKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQyLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKKy8qCisgKiBhbGxvY19yeDogZmlsbCByeCByaW5nIGVudHJpZXMuCisgKiBSZXR1cm4gMSBpZiB0aGUgYWxsb2NhdGlvbnMgZm9yIHRoZSBza2JzIGZhaWxlZCBhbmQgdGhlCisgKiByeCBlbmdpbmUgaXMgd2l0aG91dCBBdmFpbGFibGUgZGVzY3JpcHRvcnMKKyAqLworc3RhdGljIGludCBhbGxvY19yeChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdW5zaWduZWQgaW50IHJlZmlsbF9yeCA9IG5wLT5yZWZpbGxfcng7CisJaW50IGk7CisJLy93aGlsZSAobnAtPmN1cl9yeCAhPSByZWZpbGxfcngpIHsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklORzsgaSsrKSB7CisJCS8vaW50IG5yID0gcmVmaWxsX3J4ICUgUlhfUklORzsKKwkJcnhfcmluZ1tpXS5QYWNrZXRCdWZmZXIgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBSWF9OSUNfQlVGU0laRV0pOworCQlyeF9yaW5nW2ldLkxlbmd0aCA9IGNwdV90b19sZTE2KFJYX05JQ19CVUZTSVpFKTsKKwkJd21iKCk7CisJCXJ4X3JpbmdbaV0uRmxhZ3MgPSBjcHVfdG9fbGUxNihOVl9SWF9BVkFJTCk7CisJCS8qICAgICAgcHJpbnRmKCJhbGxvY19yeDogUGFja2V0ICAlZCBtYXJrZWQgYXMgQXZhaWxhYmxlXG4iLAorCQkgICByZWZpbGxfcngpOyAqLworCQlyZWZpbGxfcngrKzsKKwl9CisJbnAtPnJlZmlsbF9yeCA9IHJlZmlsbF9yeDsKKwlpZiAobnAtPmN1cl9yeCAtIHJlZmlsbF9yeCA9PSBSWF9SSU5HKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfbGlua3NwZWVkKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgYWR2LCBscGEsIG5ld2R1cDsKKwl1MzIgbmV3bHM7CisJYWR2ID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIE1JSV9SRUFEKTsKKwlscGEgPSBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX0xQQSwgTUlJX1JFQUQpOworCWRwcmludGYoKCJ1cGRhdGVfbGlua3NwZWVkOiBQSFkgYWR2ZXJ0aXNlcyAweCVoWCwgbHBhIDB4JWhYLlxuIiwKKwkJIGFkdiwgbHBhKSk7CisKKwkvKiBGSVhNRTogaGFuZGxlIHBhcmFsbGVsIGRldGVjdGlvbiBwcm9wZXJseSwgaGFuZGxlIGdpZ2FiaXQgZXRoZXJuZXQgKi8KKwlscGEgPSBscGEgJiBhZHY7CisJaWYgKGxwYSAmIExQQV8xMDBGVUxMKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMTsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMDBIQUxGKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMDsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMEZVTEwpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgfCBOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDE7CisJfSBlbHNlIGlmIChscGEgJiBMUEFfMTBIQUxGKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAwOworCX0gZWxzZSB7CisJCXByaW50ZigiYmFkIGFiaWxpdHkgJWhYIC0gZmFsbGluZyBiYWNrIHRvIDEwSEQuXG4iLCBscGEpOworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMDsKKwl9CisJaWYgKG5wLT5kdXBsZXggIT0gbmV3ZHVwIHx8IG5wLT5saW5rc3BlZWQgIT0gbmV3bHMpIHsKKwkJbnAtPmR1cGxleCA9IG5ld2R1cDsKKwkJbnAtPmxpbmtzcGVlZCA9IG5ld2xzOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGluaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGk7CisKKwlucC0+bmV4dF90eCA9IG5wLT5uaWNfdHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HOyBpKyspIHsKKwkJdHhfcmluZ1tpXS5GbGFncyA9IDA7CisJfQorCisJbnAtPmN1cl9yeCA9IDA7CisJbnAtPnJlZmlsbF9yeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkc7IGkrKykgeworCQlyeF9yaW5nW2ldLkZsYWdzID0gMDsKKwl9CisJcmV0dXJuIGFsbG9jX3J4KG5pYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3Qoc3RydWN0IG5pYyAqbmljKQoreworCisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwl1MzIgYWRkclsyXTsKKwl1MzIgbWFza1syXTsKKwl1MzIgcGZmOworCXUzMiBhbHdheXNPZmZbMl07CisJdTMyIGFsd2F5c09uWzJdOworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJbWVtc2V0KG1hc2ssIDAsIHNpemVvZihtYXNrKSk7CisKKwlwZmYgPSBOVlJFR19QRkZfTVlBRERSOworCisJYWx3YXlzT25bMF0gPSBhbHdheXNPblsxXSA9IGFsd2F5c09mZlswXSA9IGFsd2F5c09mZlsxXSA9IDA7CisKKwlhZGRyWzBdID0gYWx3YXlzT25bMF07CisJYWRkclsxXSA9IGFsd2F5c09uWzFdOworCW1hc2tbMF0gPSBhbHdheXNPblswXSB8IGFsd2F5c09mZlswXTsKKwltYXNrWzFdID0gYWx3YXlzT25bMV0gfCBhbHdheXNPZmZbMV07CisKKwlhZGRyWzBdIHw9IE5WUkVHX01DQVNUQUREUkFfRk9SQ0U7CisJcGZmIHw9IE5WUkVHX1BGRl9BTFdBWVM7CisJc3RvcF9yeCgpOworCXdyaXRlbChhZGRyWzBdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKGFkZHJbMV0sIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwobWFza1swXSwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbChtYXNrWzFdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKHBmZiwgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCXN0YXJ0X3J4KG5pYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCB0aGUgTklDIHRvIHByZXBhcmUgZm9yIHVzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmb3JjZWRldGhfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisJaW50IHJldCwgb29tLCBpOworCXJldCA9IDA7CisJZHByaW50ZigoImZvcmNlZGV0aDogb3BlblxuIikpOworCisJLyogMSkgZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbiAqLworCS8qIDQuMS0xOiBzdG9wIGFkYXB0ZXI6IGlnbm9yZWQsIDQuMyBzZWVtcyB0byBiZSBvdmVya2lsbCAqLworCXdyaXRlbChOVlJFR19NQ0FTVEFERFJBX0ZPUkNFLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdVbmtub3duVHJhbnNtaXR0ZXJSZWcpOworCXR4cnhfcmVzZXQobmljKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNik7CisKKwkvKiAyKSBpbml0aWFsaXplIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwlucC0+aW5fc2h1dGRvd24gPSAwOworCW9vbSA9IGluaXRfcmluZyhuaWMpOworCisJLyogMykgc2V0IG1hYyBhZGRyZXNzICovCisJeworCQl1MzIgbWFjWzJdOworCisJCW1hY1swXSA9CisJCSAgICAobmljLT5ub2RlX2FkZHJbMF0gPDwgMCkgKyAobmljLT5ub2RlX2FkZHJbMV0gPDwgOCkgKworCQkgICAgKG5pYy0+bm9kZV9hZGRyWzJdIDw8IDE2KSArIChuaWMtPm5vZGVfYWRkclszXSA8PCAyNCk7CisJCW1hY1sxXSA9CisJCSAgICAobmljLT5ub2RlX2FkZHJbNF0gPDwgMCkgKyAobmljLT5ub2RlX2FkZHJbNV0gPDwgOCk7CisKKwkJd3JpdGVsKG1hY1swXSwgYmFzZSArIE52UmVnTWFjQWRkckEpOworCQl3cml0ZWwobWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7CisJfQorCisJLyogNCkgY29udGludWUgc2V0dXAgKi8KKwlucC0+bGlua3NwZWVkID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCW5wLT5kdXBsZXggPSAwOworCXdyaXRlbChOVlJFR19VTktTRVRVUDNfVkFMMSwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMyk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQxLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisKKwlyZWdfZGVsYXkoTnZSZWdVbmtub3duU2V0dXBSZWc1LCBOVlJFR19VTktTRVRVUDVfQklUMzEsCisJCSAgTlZSRUdfVU5LU0VUVVA1X0JJVDMxLCBOVl9TRVRVUDVfREVMQVksCisJCSAgTlZfU0VUVVA1X0RFTEFZTUFYLAorCQkgICJvcGVuOiBTZXR1cFJlZzUsIEJpdCAzMSByZW1haW5lZCBvZmZcbiIpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc0KTsKKworCS8qIDUpIEZpbmQgYSBzdWl0YWJsZSBQSFkgKi8KKwl3cml0ZWwoTlZSRUdfTUlJU1BFRURfQklUOCB8IE5WUkVHX01JSURFTEFZLCBiYXNlICsgTnZSZWdNSUlTcGVlZCk7CisJZm9yIChpID0gMTsgaSA8IDMyOyBpKyspIHsKKwkJaW50IGlkMSwgaWQyOworCisJCWlkMSA9IG1paV9ydyhuaWMsIGksIE1JSV9QSFlTSUQxLCBNSUlfUkVBRCk7CisJCWlmIChpZDEgPCAwKQorCQkJY29udGludWU7CisJCWlkMiA9IG1paV9ydyhuaWMsIGksIE1JSV9QSFlTSUQyLCBNSUlfUkVBRCk7CisJCWlmIChpZDIgPCAwKQorCQkJY29udGludWU7CisJCWRwcmludGYoKCJvcGVuOiBGb3VuZCBQSFkgJTA0eDolMDR4IGF0IGFkZHJlc3MgJWQuXG4iLAorCQkJIGlkMSwgaWQyLCBpKSk7CisJCW5wLT5waHlhZGRyID0gaTsKKworCQl1cGRhdGVfbGlua3NwZWVkKG5pYyk7CisKKwkJYnJlYWs7CisJfQorCWlmIChpID09IDMyKSB7CisJCXByaW50Zigib3BlbjogZmFpbGluZyBkdWUgdG8gbGFjayBvZiBzdWl0YWJsZSBQSFkuXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0X2RyYWluOworCX0KKworCXByaW50ZigiJWQtTWJzIExpbmssICVzLUR1cGxleFxuIiwKKwkgICAgICAgbnAtPmxpbmtzcGVlZCAmIE5WUkVHX0xJTktTUEVFRF8xMCA/IDEwIDogMTAwLAorCSAgICAgICBucC0+ZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKwkvKiA2KSBjb250aW51ZSBzZXR1cCAqLworCXdyaXRlbChOVlJFR19NSVNDMV9GT1JDRSB8IChucC0+ZHVwbGV4ID8gMCA6IE5WUkVHX01JU0MxX0hEKSwKKwkgICAgICAgYmFzZSArIE52UmVnTWlzYzEpOworCXdyaXRlbChyZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlclN0YXR1cyksCisJICAgICAgIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfUEZGX0FMV0FZUywgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCXdyaXRlbChOVlJFR19PRkZMT0FEX05PUk1BTCwgYmFzZSArIE52UmVnT2ZmbG9hZENvbmZpZyk7CisKKwl3cml0ZWwocmVhZGwoYmFzZSArIE52UmVnUmVjZWl2ZXJTdGF0dXMpLAorCSAgICAgICBiYXNlICsgTnZSZWdSZWNlaXZlclN0YXR1cyk7CisKKwkvKiBGSVhNRTogSSBjaGVhdGVkIGFuZCB1c2VkIHRoZSBjYWxjdWxhdG9yIHRvIGdldCBhIHJhbmRvbSBudW1iZXIgKi8KKwlpID0gNzU5NjMwODE7CisJd3JpdGVsKE5WUkVHX1JORFNFRURfRk9SQ0UgfCAoaSAmIE5WUkVHX1JORFNFRURfTUFTSyksCisJICAgICAgIGJhc2UgKyBOdlJlZ1JhbmRvbVNlZWQpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDFfVkFMLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWcxKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVAyX1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMik7CisJd3JpdGVsKE5WUkVHX1BPTExfREVGQVVMVCwgYmFzZSArIE52UmVnUG9sbGluZ0ludGVydmFsKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVA2X1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNik7CisJd3JpdGVsKChucC0+CisJCXBoeWFkZHIgPDwgTlZSRUdfQURBUFRDVExfUEhZU0hJRlQpIHwKKwkgICAgICAgTlZSRUdfQURBUFRDVExfUEhZVkFMSUQsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVA0X1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNCk7CisJd3JpdGVsKE5WUkVHX1dBS0VVUEZMQUdTX1ZBTCwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOworCisJLyogNykgc3RhcnQgcGFja2V0IHByb2Nlc3NpbmcgKi8KKwl3cml0ZWwoKHUzMikgdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1swXSksCisJICAgICAgIGJhc2UgKyBOdlJlZ1J4UmluZ1BoeXNBZGRyKTsKKwl3cml0ZWwoKHUzMikgdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSksCisJICAgICAgIGJhc2UgKyBOdlJlZ1R4UmluZ1BoeXNBZGRyKTsKKworCisJd3JpdGVsKCgoUlhfUklORyAtIDEpIDw8IE5WUkVHX1JJTkdTWl9SWFNISUZUKSArCisJICAgICAgICgoVFhfUklORyAtIDEpIDw8IE5WUkVHX1JJTkdTWl9UWFNISUZUKSwKKwkgICAgICAgYmFzZSArIE52UmVnUmluZ1NpemVzKTsKKworCWkgPSByZWFkbChiYXNlICsgTnZSZWdQb3dlclN0YXRlKTsKKwlpZiAoKGkgJiBOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUCkgPT0gMCkgeworCQl3cml0ZWwoTlZSRUdfUE9XRVJTVEFURV9QT1dFUkVEVVAgfCBpLAorCQkgICAgICAgYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisJfQorCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheSgxMCk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpIHwgTlZSRUdfUE9XRVJTVEFURV9WQUxJRCwKKwkgICAgICAgYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisJd3JpdGVsKE5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfSVJRU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChOVlJFR19NSUlTVEFUX01BU0syLCBiYXNlICsgTnZSZWdNSUlTdGF0dXMpOworCXdyaXRlbChOVlJFR19JUlFTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ0lycVN0YXR1cyk7CisJcGNpX3B1c2goYmFzZSk7CisvKgorCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7CisqLworCXdyaXRlbChOVlJFR19NQ0FTVEFERFJBX0ZPUkNFLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKE5WUkVHX1BGRl9BTFdBWVMgfCBOVlJFR19QRkZfTVlBRERSLAorCSAgICAgICBiYXNlICsgTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyk7CisKKwlzZXRfbXVsdGljYXN0KG5pYyk7CisJLy9zdGFydF9yeChuaWMpOworCXN0YXJ0X3R4KG5pYyk7CisKKwlpZiAoIQorCSAgICAobWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9CTVNSLCBNSUlfUkVBRCkgJgorCSAgICAgQk1TUl9BTkVHQ09NUExFVEUpKSB7CisJCXByaW50Zigibm8gbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4iKTsKKwl9CisKKwl1ZGVsYXkoMTAwMDApOworICAgICAgb3V0X2RyYWluOgorCXJldHVybiByZXQ7Cit9CisKKy8vZXh0ZXJuIHZvaWQgaGV4X2R1bXAoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZm9yY2VkZXRoX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKworCXN0cnVjdCByaW5nX2Rlc2MgKnByZDsKKwlpbnQgbGVuOworCWludCBpOworCisJaSA9IG5wLT5jdXJfcnggJSBSWF9SSU5HOworCXByZCA9ICZyeF9yaW5nW2ldOworCisJaWYgKCAhIChwcmQtPkZsYWdzICYgY3B1X3RvX2xlMTYoTlZfUlhfREVTQ1JJUFRPUlZBTElEKSkgKSB7CisJICByZXR1cm4gMDsKKwl9CisKKwlpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworCS8qIGdvdCBhIHZhbGlkIHBhY2tldCAtIGZvcndhcmQgaXQgdG8gdGhlIG5ldHdvcmsgY29yZSAqLworCWxlbiA9IGNwdV90b19sZTE2KHByZC0+TGVuZ3RoKTsKKwluaWMtPnBhY2tldGxlbiA9IGxlbjsKKwkvL2hleF9kdW1wKHJ4YiArIChpICogUlhfTklDX0JVRlNJWkUpLCBsZW4pOworCW1lbWNweShuaWMtPnBhY2tldCwgcnhiICsKKwkgICAgICAgKGkgKiBSWF9OSUNfQlVGU0laRSksIG5pYy0+cGFja2V0bGVuKTsKKworCXdtYigpOworCW5wLT5jdXJfcngrKzsKKwlhbGxvY19yeChuaWMpOworCXJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmb3JjZWRldGhfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLAkvKiBEZXN0aW5hdGlvbiAqLworCQkJICAgICAgIHVuc2lnbmVkIGludCB0LAkvKiBUeXBlICovCisJCQkgICAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgICBjb25zdCBjaGFyICpwKQorewkJCQkvKiBQYWNrZXQgKi8KKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwl1OCAqcHR4YjsKKwl1MTYgbnN0eXBlOworCS8vdTE2IHN0YXR1czsKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCWludCBuciA9IG5wLT5uZXh0X3R4ICUgVFhfUklORzsKKworCS8qIHBvaW50IHRvIHRoZSBjdXJyZW50IHR4YiBpbmNhc2UgbXVsdGlwbGUgdHhfcmluZ3MgYXJlIHVzZWQgKi8KKwlwdHhiID0gdHhiICsgKG5yICogUlhfTklDX0JVRlNJWkUpOworCS8vbnAtPnR4X3NrYnVmZltucl0gPSBwdHhiOworCisJLyogY29weSB0aGUgcGFja2V0IHRvIHJpbmcgYnVmZmVyICovCisJbWVtY3B5KHB0eGIsIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCisJbWVtY3B5KHB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsJLyogc3JjICovCisJbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CS8qIHR5cGUgKi8KKwltZW1jcHkocHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsJLyogdHlwZSAqLworCW1lbWNweShwdHhiICsgRVRIX0hMRU4sIHAsIHMpOworCisJcyArPSBFVEhfSExFTjsKKwl3aGlsZSAocyA8IEVUSF9aTEVOKQkvKiBwYWQgdG8gbWluIGxlbmd0aCAqLworCQlwdHhiW3MrK10gPSAnXDAnOworCisJdHhfcmluZ1tucl0uUGFja2V0QnVmZmVyID0gKHUzMikgdmlydF90b19sZTMyZGVzYyhwdHhiKTsKKwl0eF9yaW5nW25yXS5MZW5ndGggPSBjcHVfdG9fbGUxNihzIC0gMSk7CisKKwl3bWIoKTsKKwl0eF9yaW5nW25yXS5GbGFncyA9IG5wLT50eF9mbGFnczsKKworCXdyaXRlbChOVlJFR19UWFJYQ1RMX0tJQ0ssIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl0eF9yaW5nW25yXS5GbGFncyA9IG5wLT50eF9mbGFnczsKKwlucC0+bmV4dF90eCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGZvcmNlZGV0aF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwkvKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyAzIHB1cnBvc2VzLgorCSAqIFRoaXMgZGlzYWJsZXMgRE1BIGFuZCBpbnRlcnJ1cHRzIHNvIHdlIGRvbid0IHJlY2VpdmUKKwkgKiAgdW5leHBlY3RlZCBwYWNrZXRzIG9yIGludGVycnVwdHMgZnJvbSB0aGUgY2FyZCBhZnRlcgorCSAqICBldGhlcmJvb3QgaGFzIGZpbmlzaGVkLiAKKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICovCisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwlucC0+aW5fc2h1dGRvd24gPSAxOworCXN0b3BfdHgoKTsKKwlzdG9wX3J4KCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgb24gdGhlIG5pYyBvciB3ZSB3aWxsIGxvY2sgdXAgKi8KKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJZHByaW50ZigoIklycW1hc2sgaXMgemVybyBhZ2FpblxuIikpOworCisJLyogc3BlY2lhIG9wOm8gd3JpdGUgYmFjayB0aGUgbWlzb3JkZXJlZCBNQUMgYWRkcmVzcyAtIG90aGVyd2lzZQorCSAqIHRoZSBuZXh0IHByb2JlX25pYyB3b3VsZCBzZWUgYSB3cm9uZyBhZGRyZXNzLgorCSAqLworCXdyaXRlbChucC0+b3JpZ19tYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwl3cml0ZWwobnAtPm9yaWdfbWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmb3JjZWRldGhfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElPUkVTT1VSQ0VfTUVNIDB4MDAwMDAyMDAKKyNkZWZpbmUgYm9hcmRfZm91bmQgMQorI2RlZmluZSB2YWxpZF9saW5rIDAKK3N0YXRpYyBpbnQgZm9yY2VkZXRoX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKSBkZXY7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCBzejsKKwl1OCAqYmFzZTsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigiZm9yY2VkZXRoLmM6IEZvdW5kICVzLCB2ZW5kb3I9MHglaFgsIGRldmljZT0weCVoWFxuIiwKKwkgICAgICAgcGNpLT5uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZfaWQpOworCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCW5wID0gJm5weDsKKworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwlhZGRyID0gcGNpX2Jhcl9zdGFydChwY2ksIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJc3ogPSBwY2lfYmFyX3NpemUocGNpLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCisJLyogQkFTRSBpcyB1c2VkIHRocm91Z2hvdXQgdG8gYWRkcmVzcyB0aGUgY2FyZCAqLworCUJBU0UgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChhZGRyLCBzeik7CisJaWYgKCFCQVNFKQorCQlyZXR1cm4gMDsKKwkvL3J4X3JpbmdbMF0gPSByeF9yaW5nOworCS8vdHhfcmluZ1swXSA9IHR4X3Jpbmc7IAorCisJLyogcmVhZCB0aGUgbWFjIGFkZHJlc3MgKi8KKwliYXNlID0gKHU4ICopIEJBU0U7CisJbnAtPm9yaWdfbWFjWzBdID0gcmVhZGwoYmFzZSArIE52UmVnTWFjQWRkckEpOworCW5wLT5vcmlnX21hY1sxXSA9IHJlYWRsKGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKKworCW5pYy0+bm9kZV9hZGRyWzBdID0gKG5wLT5vcmlnX21hY1sxXSA+PiA4KSAmIDB4ZmY7CisJbmljLT5ub2RlX2FkZHJbMV0gPSAobnAtPm9yaWdfbWFjWzFdID4+IDApICYgMHhmZjsKKwluaWMtPm5vZGVfYWRkclsyXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMjQpICYgMHhmZjsKKwluaWMtPm5vZGVfYWRkclszXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMTYpICYgMHhmZjsKKwluaWMtPm5vZGVfYWRkcls0XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gOCkgJiAweGZmOworCW5pYy0+bm9kZV9hZGRyWzVdID0gKG5wLT5vcmlnX21hY1swXSA+PiAwKSAmIDB4ZmY7CisjaWZkZWYgTElOVVgKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJLyoKKwkJICogQmFkIG1hYyBhZGRyZXNzLiBBdCBsZWFzdCBvbmUgYmlvcyBzZXRzIHRoZSBtYWMgYWRkcmVzcworCQkgKiB0byAwMToyMzo0NTo2Nzo4OTphYgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEludmFsaWQgTWFjIGFkZHJlc3MgZGV0ZWN0ZWQ6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgcGNpX25hbWUocGNpX2RldiksIGRldi0+ZGV2X2FkZHJbMF0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbNV0pOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQbGVhc2UgY29tcGxhaW4gdG8geW91ciBoYXJkd2FyZSB2ZW5kb3IuIFN3aXRjaGluZyB0byBhIHJhbmRvbSBNQUMuXG4iKTsKKwkJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzJdID0gMHg2YzsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZGV2LT5kZXZfYWRkclszXSwgMyk7CisJfQorI2VuZGlmCisJcHJpbnRmKCIlczogTUFDIEFkZHJlc3MgJSEsICIsIHBjaS0+bmFtZSwgbmljLT5ub2RlX2FkZHIpOworCisJbnAtPnR4X2ZsYWdzID0KKwkgICAgY3B1X3RvX2xlMTYoTlZfVFhfTEFTVFBBQ0tFVCB8IE5WX1RYX0xBU1RQQUNLRVQxIHwKKwkJCU5WX1RYX1ZBTElEKTsKKwlzd2l0Y2ggKHBjaS0+ZGV2X2lkKSB7CisJY2FzZSAweDAxQzM6CQkvLyBuZm9yY2UKKwkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yOworCQlucC0+aXJxbWFzayB8PSBOVlJFR19JUlFfVElNRVI7CisJCWJyZWFrOworCWNhc2UgMHgwMDY2OgkJLy8gbmZvcmNlMgorCQlucC0+dHhfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoTlZfVFhfTEFTVFBBQ0tFVDEpOworCQlucC0+aXJxbWFzayA9IE5WUkVHX0lSUU1BU0tfV0FOVEVEXzI7CisJCW5wLT5pcnFtYXNrIHw9IE5WUkVHX0lSUV9USU1FUjsKKwkJYnJlYWs7CisJY2FzZSAweDAwRDY6CQkvLyBuZm9yY2UzCisJCW5wLT50eF9mbGFncyB8PSBjcHVfdG9fbGUxNihOVl9UWF9MQVNUUEFDS0VUMSk7CisJCW5wLT5pcnFtYXNrID0gTlZSRUdfSVJRTUFTS19XQU5URURfMjsKKwkJbnAtPmlycW1hc2sgfD0gTlZSRUdfSVJRX1RJTUVSOworCisJfQorCWRwcmludGYoKCIlczogZm9yY2VkZXRoLmM6IHN1YnN5c3RlbTogJWhYOiVoWCBib3VuZCB0byAlc1xuIiwKKwkJIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkLCBwY2ktPm5hbWUpKTsKKworCWZvcmNlZGV0aF9yZXNldChuaWMpOworLy8gICAgICBpZiAoYm9hcmRfZm91bmQgJiYgdmFsaWRfbGluaykKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwlkZXYtPmRpc2FibGUgPSBmb3JjZWRldGhfZGlzYWJsZTsKKwluaWMtPnBvbGwgPSBmb3JjZWRldGhfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gZm9yY2VkZXRoX3RyYW5zbWl0OworCW5pYy0+aXJxICAgID0gZm9yY2VkZXRoX2lycTsKKwlyZXR1cm4gMTsKKy8vICAgICAgfQorCS8qIGVsc2UgKi8KK30KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgZm9yY2VkZXRoX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTBkZSwgMHgwMUMzLCAibmZvcmNlIiwgIm5Gb3JjZSBFdGhlcm5ldCBDb250cm9sbGVyIiksCisJUENJX1JPTSgweDEwZGUsIDB4MDA2NiwgIm5mb3JjZTIiLCAibkZvcmNlMiBFdGhlcm5ldCBDb250cm9sbGVyIiksCisJUENJX1JPTSgweDEwZGUsIDB4MDBENiwgIm5mb3JjZTMiLCAibkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyIiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBmb3JjZWRldGhfZHJpdmVyID0geworCS50eXBlID0gTklDX0RSSVZFUiwKKwkubmFtZSA9ICJmb3JjZWRldGgiLAorCS5wcm9iZSA9IGZvcmNlZGV0aF9wcm9iZSwKKwkuaWRzID0gZm9yY2VkZXRoX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKGZvcmNlZGV0aF9uaWNzKSAvIHNpemVvZihmb3JjZWRldGhfbmljc1swXSksCisJLmNsYXNzID0gMCwKK307CkluZGV4OiBiL25ldGJvb3QvZnN5c190ZnRwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2ZzeXNfdGZ0cC5jCisrKyBiL25ldGJvb3QvZnN5c190ZnRwLmMKQEAgLTI5LDE0ICsyOSwxNSBAQAogLyogI2RlZmluZSBURlRQX0RFQlVHCTEgKi8KIAogI2luY2x1ZGUgPGZpbGVzeXMuaD4KKyNpbmNsdWRlIDxzaGFyZWQuaD4KIAotI2RlZmluZSBHUlVCCTEKLSNpbmNsdWRlIDxldGhlcmJvb3QuaD4KLSNpbmNsdWRlIDxuaWMuaD4KKyNpbmNsdWRlICJncnViLmgiCisjaW5jbHVkZSAidGZ0cC5oIgorI2luY2x1ZGUgIm5pYy5oIgogCiBzdGF0aWMgaW50IHJldHJ5Owogc3RhdGljIHVuc2lnbmVkIHNob3J0IGlwb3J0ID0gMjAwMDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvcG9ydDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBvcG9ydCA9IDA7CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmxvY2ssIHByZXZibG9jazsKIHN0YXRpYyBpbnQgYmNvdW50ZXI7CiBzdGF0aWMgc3RydWN0IHRmdHBfdCB0cCwgc2F2ZWRfdHA7CkBAIC00Niw2ICs0NywxNzIgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBsZW4sIHNhdmVkX2xlbjsKIHN0YXRpYyBjaGFyICpidWY7CiAKKy8qKgorICogdGZ0cF9yZWFkCisgKgorICogUmVhZCBmaWxlIHdpdGggX25hbWVfLCBkYXRhIGhhbmRsZWQgYnkgX2ZuY18uIEluIGZhY3QsIGdydWIgbmV2ZXIKKyAqIHVzZSBpdCwgd2UganVzdCB1c2UgaXQgdG8gcmVhZCBkaGNwIGNvbmZpZyBmaWxlLgorICovCitzdGF0aWMgaW50IGF3YWl0X3RmdHAoaW50IGl2YWwsIHZvaWQgKnB0ciBfX3VudXNlZCwgCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IHB0eXBlIF9fdW51c2VkLCBzdHJ1Y3QgaXBoZHIgKmlwLCAKKwkJICAgICAgc3RydWN0IHVkcGhkciAqdWRwKQoreworCWlmICghdWRwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkciAhPSBpcC0+ZGVzdC5zX2FkZHIpCisJCXJldHVybiAwOworCWlmIChudG9ocyh1ZHAtPmRlc3QpICE9IGl2YWwpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgdGZ0cF9maWxlX3JlYWQoY29uc3QgY2hhciAqbmFtZSwgaW50ICgqZm5jKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQpKQoreworCXN0cnVjdCB0ZnRwcmVxX3QgdHA7CisJc3RydWN0IHRmdHBfdCAgKnRyOworCWludAkJcmM7CisKKwlyZXRyeSA9IDA7CisJYmxvY2sgPSAwOworCXByZXZibG9jayA9IDA7CisJYmNvdW50ZXIgPSAwOworCQorCisJcnhfcWRyYWluKCk7CisKKwl0cC5vcGNvZGUgPSBodG9ucyhURlRQX1JSUSk7CisJLyogV2FybmluZzogdGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoZSBsYXlvdXQgb2YgYm9vdHBfdC4KKwkgICBCdXQgdGhhdCdzIGZpeGVkIGJ5IHRoZSBJUCwgVURQIGFuZCBCT09UUCBzcGVjcy4gKi8KKwlsZW4gPSBzaXplb2YodHAuaXApICsgc2l6ZW9mKHRwLnVkcCkgKyBzaXplb2YodHAub3Bjb2RlKSArCisJCXNwcmludGYoKGNoYXIgKil0cC51LnJycSwgIiVzJWNvY3RldCVjYmxrc2l6ZSVjJWQiLAorCQluYW1lLCAwLCAwLCAwLCBURlRQX01BWF9QQUNLRVQpICsgMTsKKwlpZiAoIXVkcF90cmFuc21pdChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLCArK2lwb3J0LAorCQkJICBURlRQX1BPUlQsIGxlbiwgJnRwKSkKKwkJcmV0dXJuICgwKTsKKwlmb3IgKDs7KQorCXsKKwkJbG9uZyB0aW1lb3V0OworI2lmZGVmCUNPTkdFU1RFRAorCQl0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChibG9jaz9URlRQX1JFWE1UOiBUSU1FT1VULCByZXRyeSk7CisjZWxzZQorCQl0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChUSU1FT1VULCByZXRyeSk7CisjZW5kaWYKKwkJaWYgKCFhd2FpdF9yZXBseShhd2FpdF90ZnRwLCBpcG9ydCwgTlVMTCwgdGltZW91dCkpCisJCXsKKwkJCWlmICghYmxvY2sgJiYgcmV0cnkrKyA8IE1BWF9URlRQX1JFVFJJRVMpCisJCQl7CS8qIG1heWJlIGluaXRpYWwgcmVxdWVzdCB3YXMgbG9zdCAqLworCQkJCWlmICghdWRwX3RyYW5zbWl0KGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCisJCQkJCQkgICsraXBvcnQsIFRGVFBfUE9SVCwgbGVuLCAmdHApKQorCQkJCQlyZXR1cm4gKDApOworCQkJCWNvbnRpbnVlOworCQkJfQorI2lmZGVmCUNPTkdFU1RFRAorCQkJaWYgKGJsb2NrICYmICgocmV0cnkgKz0gVEZUUF9SRVhNVCkgPCBURlRQX1RJTUVPVVQpKQorCQkJewkvKiB3ZSByZXNlbmQgb3VyIGxhc3QgYWNrICovCisjaWZkZWYJTURFQlVHCisJCQkJcHJpbnRmKCI8UkVYTVQ+XG4iKTsKKyNlbmRpZgorCQkJCXVkcF90cmFuc21pdChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLAorCQkJCQkgICAgIGlwb3J0LCBvcG9ydCwKKwkJCQkJICAgICBURlRQX01JTl9QQUNLRVQsICZ0cCk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOwkvKiB0aW1lb3V0ICovCisJCX0KKwkJdHIgPSAoc3RydWN0IHRmdHBfdCAqKSZuaWMucGFja2V0W0VUSF9ITEVOXTsKKwkJaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMoVEZUUF9FUlJPUikpCisJCXsKKwkJCXByaW50ZigiVEZUUCBlcnJvciAlZCAoJXMpXG4iLAorCQkJICAgICAgIG50b2hzKHRyLT51LmVyci5lcnJjb2RlKSwKKwkJCSAgICAgICB0ci0+dS5lcnIuZXJybXNnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMoVEZUUF9PQUNLKSkgeworCQkJY2hhciAqcCA9IHRyLT51Lm9hY2suZGF0YSwgKmU7CisKKwkJCWlmIChwcmV2YmxvY2spCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCQkJY29udGludWU7CS8qIGlnbm9yZSBpdCAqLworCQkJbGVuID0gbnRvaHModHItPnVkcC5sZW4pIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpIC0gMjsKKwkJCWlmIChsZW4gPiBURlRQX01BWF9QQUNLRVQpCisJCQkJZ290byBub2FrOworCQkJZSA9IHAgKyBsZW47CisJCQl3aGlsZSAoKnAgIT0gJ1wwJyAmJiBwIDwgZSkgeworLyogCQkJCWlmICghc3RyY2FzZWNtcCgiYmxrc2l6ZSIsIHApKSB7ICovCisJCQkJaWYgKCFncnViX3N0cmNtcCgiYmxrc2l6ZSIsIHApKSB7CisJCQkJCXAgKz0gODsKKy8qIAkJCQkJaWYgKChwYWNrZXRzaXplID0gc3RydG91bChwLCAmcCwgMTApKSA8ICovCisJCQkJCWlmICgocGFja2V0c2l6ZSA9IGdldGRlYygmcCkpIDwgVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQpCisJCQkJCQlnb3RvIG5vYWs7CisJCQkJCXdoaWxlIChwIDwgZSAmJiAqcCkgcCsrOworCQkJCQlpZiAocCA8IGUpCisJCQkJCQlwKys7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCW5vYWs6CisJCQkJCXRwLm9wY29kZSA9IGh0b25zKFRGVFBfRVJST1IpOworCQkJCQl0cC51LmVyci5lcnJjb2RlID0gODsKKy8qCisgKglXYXJuaW5nOiB0aGUgZm9sbG93aW5nIGFzc3VtZXMgdGhlIGxheW91dCBvZiBib290cF90LgorICoJQnV0IHRoYXQncyBmaXhlZCBieSB0aGUgSVAsIFVEUCBhbmQgQk9PVFAgc3BlY3MuCisgKi8KKwkJCQkJbGVuID0gc2l6ZW9mKHRwLmlwKSArIHNpemVvZih0cC51ZHApICsgc2l6ZW9mKHRwLm9wY29kZSkgKyBzaXplb2YodHAudS5lcnIuZXJyY29kZSkgKworLyoKKyAqCU5vcm1hbGx5IGJhZCBmb3JtIHRvIG9taXQgdGhlIGZvcm1hdCBzdHJpbmcsIGJ1dCBpbiB0aGlzIGNhc2UKKyAqCXRoZSBzdHJpbmcgd2UgYXJlIGNvcHlpbmcgZnJvbSBpcyBmaXhlZC4gc3ByaW50ZiBpcyBqdXN0IGJlaW5nCisgKgl1c2VkIGFzIGEgc3RyY3B5IGFuZCBzdHJsZW4uCisgKi8KKwkJCQkJCXNwcmludGYoKGNoYXIgKil0cC51LmVyci5lcnJtc2csCisJCQkJCQkiUkZDMTc4MiBlcnJvciIpICsgMTsKKwkJCQkJdWRwX3RyYW5zbWl0KGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCisJCQkJCQkgICAgIGlwb3J0LCBudG9ocyh0ci0+dWRwLnNyYyksCisJCQkJCQkgICAgIGxlbiwgJnRwKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQl9CisJCQlpZiAocCA+IGUpCisJCQkJZ290byBub2FrOworCQkJYmxvY2sgPSB0cC51LmFjay5ibG9jayA9IDA7IC8qIHRoaXMgZW5zdXJlcywgdGhhdCAqLworCQkJCQkJLyogdGhlIHBhY2tldCBkb2VzIG5vdCBnZXQgKi8KKwkJCQkJCS8qIHByb2Nlc3NlZCBhcyBkYXRhISAqLworCQl9CisJCWVsc2UgaWYgKHRyLT5vcGNvZGUgPT0gaHRvbnMoVEZUUF9EQVRBKSkgeworCQkJbGVuID0gbnRvaHModHItPnVkcC5sZW4pIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpIC0gNDsKKwkJCWlmIChsZW4gPiBwYWNrZXRzaXplKQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCQkJY29udGludWU7CS8qIGlnbm9yZSBpdCAqLworCQkJYmxvY2sgPSBudG9ocyh0cC51LmFjay5ibG9jayA9IHRyLT51LmRhdGEuYmxvY2spOyB9CisJCWVsc2Ugey8qIG5laXRoZXIgVEZUUF9PQUNLIG5vciBURlRQX0RBVEEgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChibG9jayB8fCBiY291bnRlcikgJiYgKGJsb2NrICE9ICh1bnNpZ25lZCBzaG9ydCkocHJldmJsb2NrKzEpKSkgeworCQkJLyogQmxvY2sgb3JkZXIgc2hvdWxkIGJlIGNvbnRpbnVvdXMgKi8KKwkJCXRwLnUuYWNrLmJsb2NrID0gaHRvbnMoYmxvY2sgPSBwcmV2YmxvY2spOworCQl9CisJCXRwLm9wY29kZSA9IGh0b25zKFRGVFBfQUNLKTsKKwkJb3BvcnQgPSBudG9ocyh0ci0+dWRwLnNyYyk7CisJCXVkcF90cmFuc21pdChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLCBpcG9ydCwKKwkJCSAgICAgb3BvcnQsIFRGVFBfTUlOX1BBQ0tFVCwgJnRwKTsJLyogYWNrICovCisJCWlmICgodW5zaWduZWQgc2hvcnQpKGJsb2NrLXByZXZibG9jaykgIT0gMSkgeworCQkJLyogUmV0cmFuc21pc3Npb24gb3IgT0FDSywgZG9uJ3QgcHJvY2VzcyB2aWEgY2FsbGJhY2sKKwkJCSAqIGFuZCBkb24ndCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHByZXZibG9jay4gICovCisJCQljb250aW51ZTsKKwkJfQorCQlwcmV2YmxvY2sgPSBibG9jazsKKwkJcmV0cnkgPSAwOwkvKiBJdCdzIHRoZSByaWdodCBwbGFjZSB0byB6ZXJvIHRoZSB0aW1lcj8gKi8KKwkJaWYgKChyYyA9IGZuYyh0ci0+dS5kYXRhLmRvd25sb2FkLAorCQkJICAgICAgKytiY291bnRlciwgbGVuLCBsZW4gPCBwYWNrZXRzaXplKSkgPD0gMCkKKwkJCXJldHVybihyYyk7CisJCWlmIChsZW4gPCBwYWNrZXRzaXplKSB7CS8qIEVuZCBvZiBkYXRhIC0tLSBmbmMgc2hvdWxkIG5vdCBoYXZlIHJldHVybmVkICovCisJCQlwcmludGYoInRmdHAgZG93bmxvYWQgY29tcGxldGUsIGJ1dFxuIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKIC8qIEZpbGwgdGhlIGJ1ZmZlciBieSByZWNlaXZpbmcgdGhlIGRhdGEgdmlhIHRoZSBURlRQIHByb3RvY29sLiAgKi8KIHN0YXRpYyBpbnQKIGJ1Zl9maWxsIChpbnQgYWJvcnQpCkBAIC02NSw5ICsyMzIsOSBAQAogICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KTsKICNlbmRpZgogICAKLSAgICAgIGlmICghIGF3YWl0X3JlcGx5IChBV0FJVF9URlRQLCBpcG9ydCwgTlVMTCwgdGltZW91dCkpCisgICAgICBpZiAoISBhd2FpdF9yZXBseSAoYXdhaXRfdGZ0cCwgaXBvcnQsIE5VTEwsIHRpbWVvdXQpKQogCXsKLQkgIGlmIChpcF9hYm9ydCkKKwkgIGlmICh1c2VyX2Fib3J0KQogCSAgICByZXR1cm4gMDsKIAogCSAgaWYgKCEgYmxvY2sgJiYgcmV0cnkrKyA8IE1BWF9URlRQX1JFVFJJRVMpCkBAIC0yNzAsMTMgKzQzNyw3IEBACiAgIGJ1Zl9yZWFkID0gMDsKICAgc2F2ZWRfZmlsZXBvcyA9IDA7CiAKLSAgLyogQ2xlYXIgb3V0IHRoZSBSeCBxdWV1ZSBmaXJzdC4gIEl0IGNvbnRhaW5zIG5vdGhpbmcgb2YgaW50ZXJlc3QsCi0gICAqIGV4Y2VwdCBwb3NzaWJseSBBUlAgcmVxdWVzdHMgZnJvbSB0aGUgREhDUC9URlRQIHNlcnZlci4gIFdlIHVzZQotICAgKiBwb2xsaW5nIHRocm91Z2hvdXQgRXRoZXJib290LCBzbyBzb21lIHRpbWUgbWF5IGhhdmUgcGFzc2VkIHNpbmNlIHdlCi0gICAqIGxhc3QgcG9sbGVkIHRoZSByZWNlaXZlIHF1ZXVlLCB3aGljaCBtYXkgbm93IGJlIGZpbGxlZCB3aXRoCi0gICAqIGJyb2FkY2FzdCBwYWNrZXRzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSByZXBseSB0byB0aGUgcGFja2V0cyB3ZSBhcmUKLSAgICogYWJvdXQgdG8gc2VuZCB0byBiZSBsb3N0IGltbWVkaWF0ZWx5LiAgTm90IHZlcnkgY2xldmVyLiAgKi8KLSAgYXdhaXRfcmVwbHkgKEFXQUlUX1FEUkFJTiwgMCwgTlVMTCwgMCk7CisgIHJ4X3FkcmFpbigpOwogICAKICNpZmRlZiBURlRQX0RFQlVHCiAgIGdydWJfcHJpbnRmICgic2VuZF9ycnEgKClcbiIpOwpJbmRleDogYi9uZXRib290L2dydWIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9ncnViLmgKQEAgLTAsMCArMSwxNzEgQEAKKyNpZm5kZWYgR1JVQl9ICisjZGVmaW5lIEdSVUJfSAorCisjaW5jbHVkZSAib3NkZXAuaCIKKyNpbmNsdWRlICJieXRlc3dhcC5oIgorI2luY2x1ZGUgImluLmgiCisjaW5jbHVkZSAiaXAuaCIKKyNpbmNsdWRlICJ1ZHAuaCIKKyNpbmNsdWRlICJpZl9ldGhlci5oIgorI2luY2x1ZGUgImxhdGNoLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKworI2RlZmluZSBLX0VTQwkJJ1wwMzMnCisjZGVmaW5lIEtfRU9GCQknXDA0JyAgLyogQ3RybC1EICovCisjZGVmaW5lIEtfSU5UUgkJJ1wwMycgIC8qIEN0cmwtQyAqLworCisjaWZuZGVmCU1BWF9SUENfUkVUUklFUworI2RlZmluZSBNQVhfUlBDX1JFVFJJRVMJCTIwCisjZW5kaWYKKworCisvKiBJbnRlci1wYWNrZXQgcmV0cnkgaW4gdGlja3MgKi8KKyNpZm5kZWYgVElNRU9VVAorI2RlZmluZSBUSU1FT1VUCQkJKDEwKlRJQ0tTX1BFUl9TRUMpCisjZW5kaWYKKworI2lmbmRlZglOVUxMCisjZGVmaW5lIE5VTEwJKCh2b2lkICopMCkKKyNlbmRpZgorCisKKyNkZWZpbmUgQVJQX0NMSUVOVAkwCisjZGVmaW5lIEFSUF9TRVJWRVIJMQorI2RlZmluZSBBUlBfR0FURVdBWQkyCisjZGVmaW5lIE1BWF9BUlAJCUFSUF9HQVRFV0FZKzEKKworI2RlZmluZSBJR01QX1NFUlZFUgkwCisjZGVmaW5lIE1BWF9JR01QCUlHTVBfU0VSVkVSKzEKKworI2RlZmluZQlSQVJQX1JFUVVFU1QJMworI2RlZmluZQlSQVJQX1JFUExZCTQKKworCisjZGVmaW5lIE1VTFRJQ0FTVF9NQVNLICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgTVVMVElDQVNUX05FVFdPUksgMHhFMDAwMDAwMAorCitzdHJ1Y3QgYXJwdGFibGVfdCB7CisJaW5fYWRkciBpcGFkZHI7CisJdWludDhfdCBub2RlWzZdOworfTsKKworc3RydWN0IGlnbXB0YWJsZV90IHsKKwlpbl9hZGRyIGdyb3VwOworCXVuc2lnbmVkIGxvbmcgdGltZTsKK307CisKKyNkZWZpbmUJS0VSTkVMX0JVRgkoQk9PVFBfREFUQV9BRERSLT5ib290cF9yZXBseS5icF9maWxlKQorCisjZGVmaW5lCUZMT1BQWV9CT09UX0xPQ0FUSU9OCTB4N2MwMAorLyogTXVzdCBtYXRjaCBvZmZzZXRzIGluIGxvYWRlci5TICovCisjZGVmaW5lIFJPTV9TRUdNRU5UCQkweDFmYQorI2RlZmluZSBST01fTEVOR1RICQkweDFmYworCisjZGVmaW5lCVJPTV9JTkZPX0xPQ0FUSU9OCShGTE9QUFlfQk9PVF9MT0NBVElPTitST01fU0VHTUVOVCkKKy8qIGF0IGVuZCBvZiBmbG9wcHkgYm9vdCBibG9jayAqLworCisKKworLyogRGVmaW5lIGEgdHlwZSBmb3IgcGFzc2luZyBpbmZvIHRvIGEgbG9hZGVkIHByb2dyYW0gKi8KK3N0cnVjdCBlYmluZm8geworCXVpbnQ4X3QgIG1ham9yLCBtaW5vcjsJLyogVmVyc2lvbiAqLworCXVpbnQxNl90IGZsYWdzOwkJLyogQml0IGZsYWdzICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFeHRlcm5hbCBwcm90b3R5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCByeF9xZHJhaW4gUCgodm9pZCkpOworZXh0ZXJuIGludCB0ZnRwIFAoKGNvbnN0IGNoYXIgKm5hbWUsIGludCAoKikodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KSkpOworZXh0ZXJuIGludCBpcF90cmFuc21pdCBQKChpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpKTsKK2V4dGVybiB2b2lkIGJ1aWxkX2lwX2hkciBQKCh1bnNpZ25lZCBsb25nIGRlc3RpcCwgaW50IHR0bCwgaW50IHByb3RvY29sLCAKKwlpbnQgb3B0aW9uX2xlbiwgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKSk7CitleHRlcm4gdm9pZCBidWlsZF91ZHBfaGRyIFAoKHVuc2lnbmVkIGxvbmcgZGVzdGlwLCAKKwl1bnNpZ25lZCBpbnQgc3Jjc29jaywgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgdHRsLAorCWludCBsZW4sIGNvbnN0IHZvaWQgKmJ1ZikpOworZXh0ZXJuIGludCB1ZHBfdHJhbnNtaXQgUCgodW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBzcmNzb2NrLAorCXVuc2lnbmVkIGludCBkZXN0c29jaywgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKSk7Cit0eXBlZGVmIGludCAoKnJlcGx5X3QpKGludCBpdmFsLCB2b2lkICpwdHIsIHVuc2lnbmVkIHNob3J0IHB0eXBlLCBzdHJ1Y3QgaXBoZHIgKmlwLCBzdHJ1Y3QgdWRwaGRyICp1ZHApOworZXh0ZXJuIGludCBhd2FpdF9yZXBseSBQKChyZXBseV90IHJlcGx5LAlpbnQgaXZhbCwgdm9pZCAqcHRyLCBsb25nIHRpbWVvdXQpKTsKK2V4dGVybiBpbnQgZGVjb2RlX3JmYzE1MzMgUCgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KSk7CitleHRlcm4gdm9pZCBqb2luX2dyb3VwKGludCBzbG90LCB1bnNpZ25lZCBsb25nIGdyb3VwKTsKK2V4dGVybiB2b2lkIGxlYXZlX2dyb3VwKGludCBzbG90KTsKKyNkZWZpbmUgUkFORF9NQVggMjE0NzQ4MzY0N0wKK2V4dGVybiB1aW50MTZfdCBpcGNoa3N1bSBQKChjb25zdCB2b2lkICppcCwgdW5zaWduZWQgbG9uZyBsZW4pKTsKK2V4dGVybiB1aW50MTZfdCBhZGRfaXBjaGtzdW1zIFAoKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1aW50MTZfdCBzdW0sIHVpbnQxNl90IG5ldykpOworZXh0ZXJuIGludDMyX3QgcmFuZG9tIFAoKHZvaWQpKTsKK2V4dGVybiBsb25nIHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgUCgobG9uZyBiYXNlLCBpbnQgZXhwKSk7CitleHRlcm4gbG9uZyByZmMxMTEyX3NsZWVwX2ludGVydmFsIFAoKGxvbmcgYmFzZSwgaW50IGV4cCkpOworI2lmbmRlZiBET1dOTE9BRF9QUk9UT19URlRQCisjZGVmaW5lCXRmdHAoZm5hbWUsIGxvYWRfYmxvY2spIDAKKyNlbmRpZgorZXh0ZXJuIHZvaWQgY2xlYW51cCBQKCh2b2lkKSk7CisKKy8qIG1pc2MuYyAqLworZXh0ZXJuIHZvaWQgdHdpZGRsZSBQKCh2b2lkKSk7CitleHRlcm4gdm9pZCBzbGVlcCBQKChpbnQgc2VjcykpOworZXh0ZXJuIHZvaWQgaW50ZXJydXB0aWJsZV9zbGVlcCBQKChpbnQgc2VjcykpOworZXh0ZXJuIHZvaWQgcG9sbF9pbnRlcnJ1cHRpb25zIFAoKHZvaWQpKTsKK2V4dGVybiBpbnQgc3RyY2FzZWNtcCBQKChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKSk7CitleHRlcm4gY2hhciAqc3Vic3RyIFAoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN0cnRvdWwgUCgoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqKiwgaW50IGJhc2UpKTsKK2V4dGVybiB2b2lkIHByaW50ZiBQKChjb25zdCBjaGFyICosIC4uLikpOworZXh0ZXJuIGludCBzcHJpbnRmIFAoKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKK2V4dGVybiBpbnQgaW5ldF9hdG9uIFAoKGNoYXIgKnAsIGluX2FkZHIgKmkpKTsKK2V4dGVybiB2b2lkIHB1dGNoYXIgUCgoaW50KSk7CitleHRlcm4gaW50IGdldGNoYXIgUCgodm9pZCkpOworZXh0ZXJuIGludCBpc2tleSBQKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGdydWJfcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBjaGFyIGNvbmZpZ19maWxlWzEyOF07CitleHRlcm4gdm9pZCBldGhlcmJvb3RfcHJpbnRmKGNvbnN0IGNoYXIgKiwgIC4uLik7CitleHRlcm4gaW50IGV0aGVyYm9vdF9zcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIGludCBnZXRkZWMoY2hhciAqKnMpOworZXh0ZXJuIHZvaWQgY2xlYW51cF9uZXQodm9pZCk7CitleHRlcm4gdm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpOworZXh0ZXJuIGludCBpZmNvbmZpZyAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgYXJwdGFibGVfdCBhcnB0YWJsZVtNQVhfQVJQXTsKKworI3VuZGVmIHByaW50ZgorI3VuZGVmIHNwcmludGYKKyNkZWZpbmUgcHJpbnRmIGV0aGVyYm9vdF9wcmludGYKKyNkZWZpbmUgc3ByaW50ZiBldGhlcmJvb3Rfc3ByaW50ZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRW50ZXJGdW5jdGlvbihmdW5jKSBwcmludGYoIkVudGVyOiAiIGZ1bmMgIlxuIik7CisjZGVmaW5lIExlYXZlRnVuY3Rpb24oZnVuYykgcHJpbnRmKCJMZWF2ZTogIiBmdW5jICJcbiIpOworI2Vsc2UKKyNkZWZpbmUgRW50ZXJGdW5jdGlvbihmdW5jKQorI2RlZmluZSBMZWF2ZUZ1bmN0aW9uKGZ1bmMpCisjZW5kaWYKKworLyoKKyAqIFNvbWUgY29kZXMgZnJvbSBldGhlcmJvb3QgdXNlIGEgbGV2ZWwgaW4gREVCVUcuIERlZmluZSBpdCB0byBiZQorICogemVybyBtZWFucyBubyBkZWJ1ZyBpbmZvIG91dHB1dCwgdGhhdCB3aWxsIG1ha2UgdGhlbSBzaWxlbmNlIGluCisgKiBjb21waWxpbmcuIFVwIGl0IGFzIHlvdSB3YW50LgorICovCisjaWZuZGVmIERFQlVHCisjICBkZWZpbmUgREVCVUcgMAorI2VuZGlmCisKKy8qI2RlZmluZSBSUENfREVCVUcqLworCitleHRlcm4gY2hhciAqaG9zdG5hbWU7CisKK2V4dGVybiBpbnQgaG9zdG5hbWVsZW47CisvKiBXaGV0aGVyIG5ldHdvcmsgaXMgcmVhZHkgKi8KK2V4dGVybiBpbnQgbmV0d29ya19yZWFkeTsKKworLyogVXNlciBhYm9ydGVkIGluIGF3YWl0X3JlcGx5IGlmIG5vdCB6ZXJvICovCitleHRlcm4gaW50IHVzZXJfYWJvcnQ7CisKK2V4dGVybiBpbnQgcmFycCh2b2lkKTsKK2V4dGVybiBpbnQgZ3J1Yl9ldGhfcHJvYmUodm9pZCk7CitleHRlcm4gaW50IGJvb3RwKHZvaWQpOworCitleHRlcm4gaW50IGRoY3Aodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgbmljIG5pYzsKKyNlbmRpZiAvKiBHUlVCX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9pMzg2X2J5dGVzd2FwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvaTM4Nl9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JJVFNfQllURVNXQVBfSAorI2RlZmluZSBFVEhFUkJPT1RfQklUU19CWVRFU1dBUF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorc3RhdGljIGlubGluZSB1aW50MTZfdCBfX2kzODZfYnN3YXBfMTYodWludDE2X3QgeCkKK3sKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIKKwkJOiAiPXEiICh4KQorCQk6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9faTM4Nl9ic3dhcF8zMih1aW50MzJfdCB4KQoreworCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgorCQkicm9ybCAkMTYsJTBcblx0IgorCQkieGNoZ2IgJWIwLCVoMCIKKwkJOiAiPXEiICh4KQorCQk6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorCisKKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8xNih4KSBcCisJKCh1aW50MTZfdCkoKCgodWludDE2X3QpKHgpICYgMHgwMGZmKSA8PCA4KSB8IFwKKwkJKCgodWludDE2X3QpKHgpICYgMHhmZjAwKSA+PiA4KSkpCisKKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8zMih4KSBcCisJKCh1aW50MzJfdCkoKCgodWludDMyX3QpKHgpICYgMHgwMDAwMDBmZlUpIDw8IDI0KSB8IFwKKwkJKCgodWludDMyX3QpKHgpICYgMHgwMDAwZmYwMFUpIDw8ICA4KSB8IFwKKwkJKCgodWludDMyX3QpKHgpICYgMHgwMGZmMDAwMFUpID4+ICA4KSB8IFwKKwkJKCgodWludDMyX3QpKHgpICYgMHhmZjAwMDAwMFUpID4+IDI0KSkpCisKKyNkZWZpbmUgX19ic3dhcF8xNih4KSBcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAorCV9fYnN3YXBfY29uc3RhbnRfMTYoeCkgOiBcCisJX19pMzg2X2Jzd2FwXzE2KHgpKQorCisKKyNkZWZpbmUgX19ic3dhcF8zMih4KSBcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAorCV9fYnN3YXBfY29uc3RhbnRfMzIoeCkgOiBcCisJX19pMzg2X2Jzd2FwXzMyKHgpKQorCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfQklUU19CWVRFU1dBUF9IICovCkluZGV4OiBiL25ldGJvb3QvaTM4Nl9lbGYuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9pMzg2X2VsZi5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgSTM4Nl9CSVRTX0VMRl9ICisjZGVmaW5lIEkzODZfQklUU19FTEZfSAorCisjaW5jbHVkZSAiY3B1LmgiCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvKiBFTEYgRGVmaW5lcyBmb3IgdGhlIDY0Yml0IHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX0NVUlJFTlRfNjQJRU1fWDg2XzY0CisjZGVmaW5lIEVNX0NVUlJFTlRfNjRfUFJFU0VOVCAoIFwKKwlDUFVfRkVBVFVSRV9QKGNwdV9pbmZvLng4Nl9jYXBhYmlsaXR5LCBMTSkgJiYgXAorCUNQVV9GRUFUVVJFX1AoY3B1X2luZm8ueDg2X2NhcGFiaWxpdHksIFBBRSkgJiYgXAorCUNQVV9GRUFUVVJFX1AoY3B1X2luZm8ueDg2X2NhcGFiaWxpdHksIFBTRSkpCisJCQkKKyNkZWZpbmUgRUxGX0NIRUNLX1g4Nl82NF9BUkNIKHgpIFwKKwkoRU1fQ1VSUkVOVF82NF9QUkVTRU5UICYmICgoeCkuZV9tYWNoaW5lID09IEVNX1g4Nl82NCkpCisjZGVmaW5lIF9fdW51c2VkX2kzODYKKyNlbHNlCisjZGVmaW5lIEVMRl9DSEVDS19YODZfNjRfQVJDSCh4KSAwCisjZGVmaW5lIF9fdW51c2VkX2kzODYgX191bnVzZWQKKyNlbmRpZgorCisKKy8qIEVMRiBEZWZpbmVzIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUJRU1fQ1VSUkVOVAlFTV8zODYKKyNkZWZpbmUgRUxGREFUQV9DVVJSRU5UCUVMRkRBVEEyTFNCCisKKyNkZWZpbmUgRUxGX0NIRUNLX0kzODZfQVJDSCh4KSBcCisJKCgoeCkuZV9tYWNoaW5lID09IEVNXzM4NikgfHwgKCh4KS5lX21hY2hpbmUgPT0gRU1fNDg2KSkKKworI2RlZmluZSBFTEZfQ0hFQ0tfQVJDSCh4KSBcCisJKChFTEZfQ0hFQ0tfSTM4Nl9BUkNIKHgpIHx8IEVMRl9DSEVDS19YODZfNjRfQVJDSCh4KSkgJiYgXAorCQkoKHgpLmVfZW50cnkgPD0gMHhmZmZmZmZmZlVMKSkKKworI2lmZGVmICBJTUFHRV9GUkVFQlNECisvKgorICogRnJlZUJTRCBoYXMgdGhpcyByYXRoZXIgc3RyYW5nZSAiZmVhdHVyZSIgb2YgaXRzIGRlc2lnbi4KKyAqIEF0IHNvbWUgcG9pbnQgaW4gaXRzIGV2b2x1dGlvbiwgRnJlZUJTRCBzdGFydGVkIHRvIHJlbHkKKyAqIGV4dGVybmFsbHkgb24gcHJpdmF0ZS9zdGF0aWMvZGVidWcgaW50ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLgorICogVGhhdCBpcywgc29tZSBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHNvZnR3YXJlIHVzZXMgdG8gYWNjZXNzCisgKiBhbmQgd29yayB3aXRoIHRoZSBGcmVlQlNEIGtlcm5lbCBhcmUgbWFkZSBhdmFpbGFibGUgbm90CisgKiB2aWEgdGhlIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiAodGhlIC5EWU5BTUlDIHNlY3Rpb24pCisgKiBidXQgcmF0aGVyIHRoZSBkZWJ1ZyBzeW1ib2xzLiAgVGhpcyBtZWFucyB0aGF0IGFueSBzeW1ib2wsIG5vdAorICoganVzdCBwdWJsaWNseSBkZWZpbmVkIHN5bWJvbHMgY2FuIGJlIChhbmQgYXJlKSB1c2VkIGJ5IHN5c3RlbQorICogdG9vbHMgdG8gbWFrZSB0aGUgc3lzdGVtIHdvcmsuICAoc3VjaCBhcyB0b3AsIHN3YXBpbmZvLCBzd2Fwb24sCisgKiBldGMpCisgKgorICogRXZlbiB3b3JzZSwgaG93ZXZlciwgaXMgdGhlIGZhY3QgdGhhdCBzdGFuZGFyZCBFTEYgbG9hZGVycyBkbworICogbm90IGtub3cgaG93IHRvIGxvYWQgdGhlIHN5bWJvbHMgc2luY2UgdGhleSBhcmUgbm90IHdpdGhpbgorICogYW4gRUxGIFBUX0xPQUQgc2VjdGlvbi4gIFRoZSBrZXJuZWwgbmVlZHMgdGhlc2Ugc3ltYm9scyB0bworICogb3BlcmF0ZSBzbyB0aGUgZm9sbG93aW5nIGNoYW5nZXMvYWRkaXRpb25zIHRvIHRoZSBib290CisgKiBsb2FkaW5nIG9mIEV0aGVyQm9vdCBoYXZlIGJlZW4gbWFkZSB0byBnZXQgdGhlIGtlcm5lbCB0byBsb2FkLgorICogQWxsIG9mIHRoZSBjaGFuZ2VzIGFyZSB3aXRoaW4gSU1BR0VfRlJFRUJTRCBzdWNoIHRoYXQgdGhlCisgKiBleHRyYS9jaGFuZ2VkIGNvZGUgb25seSBjb21waWxlcyB3aGVuIEZSRUVCU0Qgc3VwcG9ydCBpcworICogZW5hYmxlZC4KKyAqLworCisvKgorICogU2VjdGlvbiBoZWFkZXIgZm9yIEZyZWVCU0QgKGRlYnVnIHN5bWJvbCBrbHVkZ2UhKSBzdXBwb3J0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlFbGYzMl9Xb3JkCXNoX25hbWU7CS8qIFNlY3Rpb24gbmFtZSAoaW5kZXggaW50byB0aGUKKwkJCQkJICAgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlKS4gKi8KKwlFbGYzMl9Xb3JkCXNoX3R5cGU7CS8qIFNlY3Rpb24gdHlwZS4gKi8KKwlFbGYzMl9Xb3JkCXNoX2ZsYWdzOwkvKiBTZWN0aW9uIGZsYWdzLiAqLworCUVsZjMyX0FkZHIJc2hfYWRkcjsJLyogQWRkcmVzcyBpbiBtZW1vcnkgaW1hZ2UuICovCisJRWxmMzJfT2ZmCXNoX29mZnNldDsJLyogT2Zmc2V0IGluIGZpbGUuICovCisJRWxmMzJfU2l6ZQlzaF9zaXplOwkvKiBTaXplIGluIGJ5dGVzLiAqLworCUVsZjMyX1dvcmQJc2hfbGluazsJLyogSW5kZXggb2YgYSByZWxhdGVkIHNlY3Rpb24uICovCisJRWxmMzJfV29yZAlzaF9pbmZvOwkvKiBEZXBlbmRzIG9uIHNlY3Rpb24gdHlwZS4gKi8KKwlFbGYzMl9TaXplCXNoX2FkZHJhbGlnbjsJLyogQWxpZ25tZW50IGluIGJ5dGVzLiAqLworCUVsZjMyX1NpemUJc2hfZW50c2l6ZTsJLyogU2l6ZSBvZiBlYWNoIGVudHJ5IGluIHNlY3Rpb24uICovCit9IEVsZjMyX1NoZHI7CisKKy8qIHNoX3R5cGUgKi8KKyNkZWZpbmUgU0hUX1NZTVRBQgkyCQkvKiBzeW1ib2wgdGFibGUgc2VjdGlvbiAqLworI2RlZmluZSBTSFRfU1RSVEFCCTMJCS8qIHN0cmluZyB0YWJsZSBzZWN0aW9uICovCisKKy8qCisgKiBNb2R1bGUgaW5mb3JtYXRpb24gc3VidHlwZXMgKGZvciB0aGUgbWV0YWRhdGEgdGhhdCB3ZSBuZWVkIHRvIGJ1aWxkKQorICovCisjZGVmaW5lIE1PRElORk9fRU5ECQkweDAwMDAJCS8qIEVuZCBvZiBsaXN0ICovCisjZGVmaW5lIE1PRElORk9fTkFNRQkJMHgwMDAxCQkvKiBOYW1lIG9mIG1vZHVsZSAoc3RyaW5nKSAqLworI2RlZmluZSBNT0RJTkZPX1RZUEUJCTB4MDAwMgkJLyogVHlwZSBvZiBtb2R1bGUgKHN0cmluZykgKi8KKyNkZWZpbmUgTU9ESU5GT19NRVRBREFUQQkweDgwMDAJCS8qIE1vZHVsZS1zcGVjZmljICovCisKKyNkZWZpbmUgTU9ESU5GT01EX1NTWU0JCTB4MDAwMwkJLyogc3RhcnQgb2Ygc3ltYm9scyAqLworI2RlZmluZSBNT0RJTkZPTURfRVNZTQkJMHgwMDA0CQkvKiBlbmQgb2Ygc3ltYm9scyAqLworCisjZW5kaWYJLyogSU1BR0VfRlJFRUJTRCAqLworCisjZW5kaWYgLyogSTM4Nl9CSVRTX0VMRl9IICovCkluZGV4OiBiL25ldGJvb3QvaTM4Nl9lbmRpYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9pMzg2X2VuZGlhbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBFVEhFUkJPT1RfQklUU19FTkRJQU5fSAorI2RlZmluZSBFVEhFUkJPT1RfQklUU19FTkRJQU5fSAorCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKworI2VuZGlmIC8qIEVUSEVSQk9PVF9CSVRTX0VORElBTl9IICovCkluZGV4OiBiL25ldGJvb3QvaTM4Nl90aW1lci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2kzODZfdGltZXIuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogQSBjb3VwbGUgb2Ygcm91dGluZXMgdG8gaW1wbGVtZW50IGEgbG93LW92ZXJoZWFkIHRpbWVyIGZvciBkcml2ZXJzICovCisKKyAvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgImdydWIuaCIKKyNpbmNsdWRlICJvc2RlcC5oIgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJsYXRjaC5oIgorCit2b2lkIF9fbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQoreworCS8qCisJICogTm93IGxldCdzIHRha2UgY2FyZSBvZiBQUEMgY2hhbm5lbCAyCisJICoKKwkgKiBTZXQgdGhlIEdhdGUgaGlnaCwgcHJvZ3JhbSBQUEMgY2hhbm5lbCAyIGZvciBtb2RlIDAsCisJICogKGludGVycnVwdCBvbiB0ZXJtaW5hbCBjb3VudCBtb2RlKSwgYmluYXJ5IGNvdW50LAorCSAqIGxvYWQgNSAqIExBVENIIGNvdW50LCAoTFNCIGFuZCBNU0IpIHRvIGJlZ2luIGNvdW50ZG93bi4KKwkgKgorCSAqIE5vdGUgc29tZSBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBhIGJ1ZyB3aGVyZSB0aGUgaGlnaCBiaXRzIGJ5dGUKKwkgKiBvZiBjaGFubmVsIDIgaXMgaWdub3JlZC4KKwkgKi8KKwkvKiBTZXQgdXAgdGhlIHRpbWVyIGdhdGUsIHR1cm4gb2ZmIHRoZSBzcGVha2VyICovCisJLyogU2V0IHRoZSBHYXRlIGhpZ2gsIGRpc2FibGUgc3BlYWtlciAqLworCW91dGIoKGluYihQUENfUE9SVEIpICYgflBQQ0JfU1BLUikgfCBQUENCX1QyR0FURSwgUFBDX1BPUlRCKTsKKwkvKiBiaW5hcnksIG1vZGUgMCwgTFNCL01TQiwgQ2ggMiAqLworCW91dGIoVElNRVIyX1NFTHxXT1JEX0FDQ0VTU3xNT0RFMHxCSU5BUllfQ09VTlQsIFRJTUVSX01PREVfUE9SVCk7CisJLyogTFNCIG9mIHRpY2tzICovCisJb3V0Yih0aWNrcyAmIDB4RkYsIFRJTUVSMl9QT1JUKTsKKwkvKiBNU0Igb2YgdGlja3MgKi8KKwlvdXRiKHRpY2tzID4+IDgsIFRJTUVSMl9QT1JUKTsKK30KKworc3RhdGljIGludCBfX3RpbWVyMl9ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuICgoaW5iKFBQQ19QT1JUQikgJiBQUENCX1QyT1VUKSA9PSAwKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19UU0NfQ1VSUlRJQ0tTKQordm9pZCBzZXR1cF90aW1lcnModm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQoreworCXJldHVybiBfX2xvYWRfdGltZXIyKHRpY2tzKTsKK30KKworaW50IHRpbWVyMl9ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuIF9fdGltZXIyX3J1bm5pbmcoKTsKK30KKwordm9pZCBuZGVsYXkodW5zaWduZWQgaW50IG5zZWNzKQoreworCXdhaXRvbl90aW1lcjIoKG5zZWNzICogQ0xPQ0tfVElDS19SQVRFKS8xMDAwMDAwMDAwKTsKK30KK3ZvaWQgdWRlbGF5KHVuc2lnbmVkIGludCB1c2VjcykKK3sKKwl3YWl0b25fdGltZXIyKCh1c2VjcyAqIFRJQ0tTX1BFUl9NUykvMTAwMCk7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1RTQ19DVVJSVElDS1MpICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0NfQ1VSUlRJQ0tTKQorCisjZGVmaW5lIHJkdHNjKGxvdyxoaWdoKSBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzYyIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSkKKworI2RlZmluZSByZHRzY2xsKHZhbCkgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJkdHNjIiA6ICI9QSIgKHZhbCkpCisKKworLyogTnVtYmVyIG9mIGNsb2NrIHRpY2tzIHRvIHRpbWUgd2l0aCB0aGUgcnRjICovCisjZGVmaW5lIExBVENIIDB4RkYKKworI2RlZmluZSBMQVRDSEVTX1BFUl9TRUMgKChDTE9DS19USUNLX1JBVEUgKyAoTEFUQ0gvMikpL0xBVENIKQorI2RlZmluZSBUSUNLU19QRVJfTEFUQ0ggKChMQVRDSEVTX1BFUl9TRUMgKyAoVElDS1NfUEVSX1NFQy8yKSkvVElDS1NfUEVSX1NFQykKKworc3RhdGljIHZvaWQgc2xlZXBfbGF0Y2godm9pZCkKK3sKKwlfX2xvYWRfdGltZXIyKExBVENIKTsKKwl3aGlsZShfX3RpbWVyMl9ydW5uaW5nKCkpOworfQorCisvKiAtLS0tLS0gQ2FsaWJyYXRlIHRoZSBUU0MgLS0tLS0tLSAKKyAqIFRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gZXhjdXRlIGEgbG9vcCB0aGF0IHJ1bnMgaW4ga25vd24gdGltZS4KKyAqIEFuZCBmaW5kIHRoZSBjb252ZXJ0aW9uIG5lZWRlZCB0byBnZXQgdG8gQ0xPQ0tfVElDS19SQVRFCisgKi8KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGNhbGlicmF0ZV90c2Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0bG93LCBzdGFydGhpZ2g7CisJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCisJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwlzbGVlcF9sYXRjaCgpOworCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJInNiYmwgJTMsJTEiCisJCToiPWEiIChlbmRsb3cpLCAiPWQiIChlbmRoaWdoKQorCQk6ImciIChzdGFydGxvdyksICJnIiAoc3RhcnRoaWdoKSwKKwkJIjAiIChlbmRsb3cpLCAiMSIgKGVuZGhpZ2gpKTsKKwkKKwkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwlpZiAoZW5kaGlnaCkKKwkJZ290byBiYWRfY3RjOworCQorCWVuZGxvdyAqPSBUSUNLU19QRVJfTEFUQ0g7CisJcmV0dXJuIGVuZGxvdzsKKworCS8qCisJICogVGhlIENUQyB3YXNuJ3QgcmVsaWFibGU6IHdlIGdvdCBhIGhpdCBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLAorCSAqIG9yIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KK2JhZF9jdGM6CisJcHJpbnRmKCJiYWRfY3RjXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tzX3Blcl90aWNrOwordm9pZCBzZXR1cF90aW1lcnModm9pZCkKK3sKKwlpZiAoIWNsb2Nrc19wZXJfdGljaykgeworCQljbG9ja3NfcGVyX3RpY2sgPSBjYWxpYnJhdGVfdHNjKCk7CisJCS8qIERpc3BsYXkgdGhlIENQVSBNaHogdG8gZWFzaWx5IHRlc3QgaWYgdGhlIGNhbGlicmF0aW9uIHdhcyBiYWQgKi8KKwkJcHJpbnRmKCJDUFUgJWxkIE1oelxuIiwgKGNsb2Nrc19wZXJfdGljay8xMDAwICogVElDS1NfUEVSX1NFQykvMTAwMCk7CisJfQorfQorCit1bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2xvY2tzX2hpZ2gsIGNsb2Nrc19sb3c7CisJdW5zaWduZWQgbG9uZyBjdXJydGlja3M7CisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2MoY2xvY2tzX2xvdywgY2xvY2tzX2hpZ2gpOworCisJLyogY3VycnRpY2tzID0gY2xvY2tzIC8gY2xvY2tzX3Blcl90aWNrOyAqLworCV9fYXNtX18oImRpdmwgJTEiCisJCToiPWEiIChjdXJydGlja3MpCisJCToiciIgKGNsb2Nrc19wZXJfdGljayksICIwIiAoY2xvY2tzX2xvdyksICJkIiAoY2xvY2tzX2hpZ2gpKTsKKworCisJcmV0dXJuIGN1cnJ0aWNrczsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lcl90aW1lb3V0Oworc3RhdGljIGludCBfX3RpbWVyX3J1bm5pbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93OworCXJkdHNjbGwobm93KTsKKwlyZXR1cm4gbm93IDwgdGltZXJfdGltZW91dDsKK30KKwordm9pZCB1ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CisJcmR0c2NsbChub3cpOworCXRpbWVyX3RpbWVvdXQgPSBub3cgKyB1c2VjcyAqICgoY2xvY2tzX3Blcl90aWNrICogVElDS1NfUEVSX1NFQykvKDEwMDAqMTAwMCkpOworCXdoaWxlKF9fdGltZXJfcnVubmluZygpKTsKK30KK3ZvaWQgbmRlbGF5KHVuc2lnbmVkIGludCBuc2VjcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93OworCXJkdHNjbGwobm93KTsKKwl0aW1lcl90aW1lb3V0ID0gbm93ICsgbnNlY3MgKiAoKGNsb2Nrc19wZXJfdGljayAqIFRJQ0tTX1BFUl9TRUMpLygxMDAwKjEwMDAqMTAwMCkpOworCXdoaWxlKF9fdGltZXJfcnVubmluZygpKTsKK30KKwordm9pZCBsb2FkX3RpbWVyMih1bnNpZ25lZCBpbnQgdGltZXIyX3RpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CisJdW5zaWduZWQgbG9uZyBjbG9ja3M7CisJcmR0c2NsbChub3cpOworCWNsb2NrcyA9IHRpbWVyMl90aWNrcyAqICgoY2xvY2tzX3Blcl90aWNrICogVElDS1NfUEVSX1NFQykvQ0xPQ0tfVElDS19SQVRFKTsKKwl0aW1lcl90aW1lb3V0ID0gbm93ICsgY2xvY2tzOworfQorCitpbnQgdGltZXIyX3J1bm5pbmcodm9pZCkKK3sKKwlyZXR1cm4gX190aW1lcl9ydW5uaW5nKCk7Cit9CisKKyNlbmRpZiAvKiBSVENfQ1VSUlRJQ0tTICovCkluZGV4OiBiL25ldGJvb3QvaTgyNTg2LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2k4MjU4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsODI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KLWk4MjU4NiBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKLUtlbiBZYXAsIEphbnVhcnkgMTk5OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0jaW5jbHVkZSAibmljLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi0jZGVmaW5lCXVkZWxheShuKQl3YWl0b25fdGltZXIyKCgobikqVElDS1NfUEVSX01TKS8xMDAwKQotCi0vKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgotCi0gICBEb25hbGQgQmVja2VyJ3MgZXhjZWxsZW50IDNjNTA3IGRyaXZlciBpbiBMaW51eAotICAgSW50ZWwgODI1OTYgZGF0YSBzaGVldCAoeWVzLCA4MjU5NjsgaXQgaGFzIGEgNTg2IGNvbXBhdGliaWxpdHkgbW9kZSkKLSovCi0KLS8qIENvZGUgYmVsb3cgbW9zdGx5IHN0b2xlbiB3aG9sZXNhbGUgZnJvbSAzYzUwNy5jIGRyaXZlciBpbiBMaW51eCAqLwotCi0vKgotCQlEZXRhaWxzIG9mIHRoZSBpODI1ODYuCi0KLSAgIFlvdSdsbCByZWFsbHkgbmVlZCB0aGUgZGF0YWJvb2sgdG8gdW5kZXJzdGFuZCB0aGUgZGV0YWlscyBvZiB0aGlzIHBhcnQsCi0gICBidXQgdGhlIG91dGxpbmUgaXMgdGhhdCB0aGUgaTgyNTg2IGhhcyB0d28gc2VwYXJhdGUgcHJvY2Vzc2luZyB1bml0cy4KLSAgIEJvdGggYXJlIHN0YXJ0ZWQgZnJvbSBhIGxpc3Qgb2YgdGhyZWUgY29uZmlndXJhdGlvbiB0YWJsZXMsIG9mIHdoaWNoIG9ubHkKLSAgIHRoZSBsYXN0LCB0aGUgU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQiksIGlzIHVzZWQgYWZ0ZXIgcmVzZXQtdGltZS4gIFRoZSBTQ0IKLSAgIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQkJU3RhdHVzIHdvcmQKLQkJQ29tbWFuZCB3b3JkCi0JCVR4L0NvbW1hbmQgYmxvY2sgYWRkci4KLQkJUnggYmxvY2sgYWRkci4KLSAgIFRoZSBjb21tYW5kIHdvcmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbnRyb2xzIGZvciB0aGUgVHggYW5kIFJ4IHVuaXRzOgotICAqLwotCi0jZGVmaW5lCUNVQ19TVEFSVAkweDAxMDAKLSNkZWZpbmUJQ1VDX1JFU1VNRQkweDAyMDAKLSNkZWZpbmUJQ1VDX1NVU1BFTkQJMHgwMzAwCi0jZGVmaW5lCVJYX1NUQVJUCTB4MDAxMAotI2RlZmluZQlSWF9SRVNVTUUJMHgwMDIwCi0jZGVmaW5lCVJYX1NVU1BFTkQJMHgwMDMwCi0KLS8qIFRoZSBSeCB1bml0IHVzZXMgYSBsaXN0IG9mIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBhIGxpc3Qgb2YgZGF0YSBidWZmZXIKLSAgIGRlc2NyaXB0b3JzLiAgV2UgdXNlIGZ1bGwtc2l6ZWQgKDE1MTggYnl0ZSkgZGF0YSBidWZmZXJzLCBzbyB0aGVyZSBpcwotICAgYSBvbmUtdG8tb25lIHBhaXJpbmcgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gYnVmZmVyIGRlc2NyaXB0b3JzLgotCi0gICBUaGUgVHggKCJjb21tYW5kIikgdW5pdCBleGVjdXRlcyBhIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBsb29rIGxpa2U6Ci0JU3RhdHVzIHdvcmQJV3JpdHRlbiBieSB0aGUgODI1ODYgd2hlbiB0aGUgY29tbWFuZCBpcyBkb25lLgotCUNvbW1hbmQgd29yZAlDb21tYW5kIGluIGxvd2VyIDMgYml0cywgcG9zdC1jb21tYW5kIGFjdGlvbiBpbiB1cHBlciAzCi0JTGluayB3b3JkCVRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGNvbW1hbmQuCi0JUGFyYW1ldGVycwkoYXMgbmVlZGVkKS4KLQotCVNvbWUgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgQ29tbWFuZCBXb3JkIGFyZToKLSAqLwotI2RlZmluZSBDTURfRU9MCQkweDgwMDAJCS8qIFRoZSBsYXN0IGNvbW1hbmQgb2YgdGhlIGxpc3QsIHN0b3AuICovCi0jZGVmaW5lIENNRF9TVVNQCTB4NDAwMAkJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCi0jZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkJLyogSW50ZXJydXB0IGFmdGVyIGRvaW5nIGNtZC4gKi8KLQotZW51bSBjb21tYW5kcyB7Ci0JQ21kTk9wID0gMCwgQ21kU0FTZXR1cCA9IDEsIENtZENvbmZpZ3VyZSA9IDIsIENtZE11bHRpY2FzdExpc3QgPSAzLAotCUNtZFR4ID0gNCwgQ21kVERSID0gNSwgQ21kRHVtcCA9IDYsIENtZERpYWdub3NlID0gN307Ci0KLS8qCi0JCURldGFpbHMgb2YgdGhlIEV0aGVyTGluazE2IEltcGxlbWVudGF0aW9uCi0KLSAgVGhlIDNjNTA3IGFuZCBOSTUyMTAgYXJlIGdlbmVyaWMgc2hhcmVkLW1lbW9yeSBpODI1ODYgaW1wbGVtZW50YXRpb25zLgotICAzYzUwNzogVGhlIGhvc3QgY2FuIG1hcCAxNkssIDMySywgNDhLLCBvciA2NEsgb2YgdGhlIDY0SyBtZW1vcnkgaW50bwotICAweDBbQ0RdWzA4XTAwMDAsIG9yIGFsbCA2NEsgaW50byAweEZbMDI0NjhdMDAwMC4KLSAgTkk1MjEwOiBUaGUgaG9zdCBjYW4gbWFwIDhrIG9yIDE2ayBhdCAweFtDREVdWzA0OENdMDAwIGJ1dCB3ZQotICBhc3N1bWUgOGsgYmVjYXVzZSB0byBoYXZlIDE2ayB5b3UgY2Fubm90IHB1dCBhIFJPTSBvbiB0aGUgTklDLgotICAqLwotCi0vKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgSS9PIGFkZHJlc3MuICovCi0KLSNpZmRlZglJTkNMVURFXzNDNTA3Ci0KLSNkZWZpbmUJU0FfREFUQQkJMAkvKiBTdGF0aW9uIGFkZHJlc3MgZGF0YSwgb3IgM0NvbSBzaWduYXR1cmUuICovCi0jZGVmaW5lIE1JU0NfQ1RSTAk2CS8qIFN3aXRjaCB0aGUgU0FfREFUQSBiYW5rcywgYW5kIGJ1cyBjb25maWcgYml0cy4gKi8KLSNkZWZpbmUgUkVTRVRfSVJRCTEwCS8qIFJlc2V0IHRoZSBsYXRjaGVkIElSUSBsaW5lLiAqLwotI2RlZmluZSBJODI1ODZfQVRUTgkxMQkvKiBGcm9iIHRoZSA4MjU4NiBDaGFubmVsIEF0dGVudGlvbiBsaW5lLiAqLwotI2RlZmluZSBST01fQ09ORklHCTEzCi0jZGVmaW5lIE1FTV9DT05GSUcJMTQKLSNkZWZpbmUgSVJRX0NPTkZJRwkxNQotI2RlZmluZSBFTDE2X0lPX0VYVEVOVAkxNgotCi0vKiBUaGUgSUQgcG9ydCBpcyB1c2VkIGF0IGJvb3QtdGltZSB0byBsb2NhdGUgdGhlIGV0aGVyY2FyZC4gKi8KLSNkZWZpbmUgSURfUE9SVAkJMHgxMDAKLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05JNTIxMAotCi0jZGVmaW5lCU5JNTJfUkVTRVQJMCAgLyogd3JpdGluZyB0byB0aGlzIGFkZHJlc3MsIHJlc2V0cyB0aGUgaTgyNTg2ICovCi0jZGVmaW5lCUk4MjU4Nl9BVFROCTEgIC8qIGNoYW5uZWwgYXR0ZW50aW9uLCBraWNrIHRoZSA1ODYgKi8KLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0VYT1MyMDUKLQotI2RlZmluZQlFWE9TMjA1X1JFU0VUCTAgIC8qIHdyaXRpbmcgdG8gdGhpcyBhZGRyZXNzLCByZXNldHMgdGhlIGk4MjU4NiAqLwotI2RlZmluZQlJODI1ODZfQVRUTgkxICAvKiBjaGFubmVsIGF0dGVudGlvbiwga2ljayB0aGUgNTg2ICovCi0KLSNlbmRpZgotCi0vKiBPZmZzZXRzIHRvIHJlZ2lzdGVycyBpbiB0aGUgbWFpbGJveCAoU0NCKS4gKi8KLSNkZWZpbmUgaVNDQl9TVEFUVVMJMHg4Ci0jZGVmaW5lIGlTQ0JfQ01ECTB4QQotI2RlZmluZSBpU0NCX0NCTAkweEMJLyogQ29tbWFuZCBCTG9jayBvZmZzZXQuICovCi0jZGVmaW5lIGlTQ0JfUkZBCTB4RQkvKiBSeCBGcmFtZSBBcmVhIG9mZnNldC4gKi8KLQotLyogIFNpbmNlIHRoZSAzYzUwNyBtYXBzIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBzbyB0aGF0IHRoZSBsYXN0IGJ5dGUgaXMKLWF0IDgyNTg2IGFkZHJlc3MgRkZGRiwgdGhlIGZpcnN0IGJ5dGUgaXMgYXQgODI1ODYgYWRkcmVzcyAwLCAxNkssIDMySywgb3IKLTQ4SyBjb3JyZXNwb25kaW5nIHRvIHdpbmRvdyBzaXplcyBvZiA2NEssIDQ4SywgMzJLIGFuZCAxNksgcmVzcGVjdGl2ZWx5LgotV2UgY2FuIGFjY291bnQgZm9yIHRoaXMgYmUgc2V0dGluZyB0aGUgJ1NCQyBCYXNlJyBlbnRyeSBpbiB0aGUgSVNDUCB0YWJsZQotYmVsb3cgZm9yIGFsbCB0aGUgMTYgYml0IG9mZnNldCBhZGRyZXNzZXMsIGFuZCBhbHNvIGFkZGluZyB0aGUgJ1NDQiBCYXNlJwotdmFsdWUgdG8gYWxsIDI0IGJpdCBwaHlzaWNhbCBhZGRyZXNzZXMgKGluIHRoZSBTQ1AgdGFibGUgYW5kIHRoZSBUWCBhbmQgUlgKLUJ1ZmZlciBEZXNjcmlwdG9ycykuCi0JCQkJLU1hcmsKLSovCi0KLS8qCi0gIFdoYXQgZm9sbG93cyBpbiAnaW5pdF93b3Jkc1tdJyBpcyB0aGUgInByb2dyYW0iIHRoYXQgaXMgZG93bmxvYWRlZCB0byB0aGUKLSAgODI1ODYgbWVtb3J5LiAgSXQncyBtb3N0bHkgdGFibGVzIGFuZCBjb21tYW5kIGJsb2NrcywgYW5kIHN0YXJ0cyBhdCB0aGUKLSAgcmVzZXQgYWRkcmVzcyAweGZmZmZmNi4gIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgc2ltaWxhciB0byB0aGUgRXRoZXJFeHByZXNzLAotICB0aHVzIHRoZSB1bnVzdWFsIGxvY2F0aW9uIG9mIHRoZSBTQ0IgYXQgMHgwMDA4LgotCi0gIEV2ZW4gd2l0aCB0aGUgYWRkaXRpb25hbCAiZG9uJ3QgY2FyZSIgdmFsdWVzLCBkb2luZyBpdCB0aGlzIHdheSB0YWtlcyBsZXNzCi0gIHByb2dyYW0gc3BhY2UgdGhhbiBpbml0aWFsaXppbmcgdGhlIGluZGl2aWR1YWwgdGFibGVzLCBhbmQgSSBmZWVsIGl0J3MgbXVjaAotICBjbGVhbmVyLgotCi0gIFRoZSBkYXRhYm9vayBpcyBwYXJ0aWN1bGFybHkgdXNlbGVzcyBmb3IgdGhlIGZpcnN0IHR3byBzdHJ1Y3R1cmVzLCBJIGhhZAotICB0byB1c2UgdGhlIENyeW53ciBkcml2ZXIgYXMgYW4gZXhhbXBsZS4KLQotICBUaGUgbWVtb3J5IHNldHVwIGlzIGFzIGZvbGxvd3M6Ci0qLwotCi0jZGVmaW5lIENPTkZJR19DTUQJMHgxOAotI2RlZmluZSBTRVRfU0FfQ01ECTB4MjQKLSNkZWZpbmUgU0FfT0ZGU0VUCTB4MkEKLSNkZWZpbmUgSURMRUxPT1AJMHgzMAotI2RlZmluZSBURFJfQ01ECQkweDM4Ci0jZGVmaW5lIFREUl9USU1FCTB4M0MKLSNkZWZpbmUgRFVNUF9DTUQJMHg0MAotI2RlZmluZSBESUFHX0NNRAkweDQ4Ci0jZGVmaW5lIFNFVF9NQ19DTUQJMHg0RQotI2RlZmluZSBEVU1QX0RBVEEJMHg1NgkvKiBBIDE3MCBieXRlIGJ1ZmZlciBmb3IgZHVtcCBhbmQgU2V0LU1DIGludG8uICovCi0KLSNkZWZpbmUgVFhfQlVGX1NUQVJUCTB4MDEwMAotI2RlZmluZSBUWF9CVUZfU0laRQkoMTUxOCsxNCsyMCsxNikgLyogcGFja2V0K2hlYWRlcitUQkQgKi8KLQotI2RlZmluZSBSWF9CVUZfU1RBUlQJMHgxMDAwCi0jZGVmaW5lIFJYX0JVRl9TSVpFCSgxNTE4KzE0KzE4KQkvKiBwYWNrZXQraGVhZGVyK1JCRCAqLwotI2RlZmluZSBSWF9CVUZfRU5ECShtZW1fZW5kIC0gbWVtX3N0YXJ0IC0gMjApCi0KLS8qCi0gIFRoYXQncyBpdDogb25seSA4NiBieXRlcyB0byBzZXQgdXAgdGhlIGJlYXN0LCBpbmNsdWRpbmcgZXZlcnkgZXh0cmEKLSAgY29tbWFuZCBhdmFpbGFibGUuICBUaGUgMTcwIGJ5dGUgYnVmZmVyIGF0IERVTVBfREFUQSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUKLSAgRHVtcCBjb21tYW5kIChjYWxsZWQgb25seSBieSB0aGUgZGlhZ25vc3RpYyBwcm9ncmFtKSBhbmQgdGhlIFNldE11bHRpY2FzdExpc3QKLSAgY29tbWFuZC4KLQotICBUbyBjb21wbGV0ZSB0aGUgbWVtb3J5IHNldHVwIHlvdSBvbmx5IGhhdmUgdG8gd3JpdGUgdGhlIHN0YXRpb24gYWRkcmVzcyBhdAotICBTQV9PRkZTRVQgYW5kIGNyZWF0ZSB0aGUgVHggJiBSeCBidWZmZXIgbGlzdHMuCi0KLSAgVGhlIFR4IGNvbW1hbmQgY2hhaW4gYW5kIGJ1ZmZlciBsaXN0IGlzIHNldHVwIGFzIGZvbGxvd3M6Ci0gIEEgVHggY29tbWFuZCB0YWJsZSwgd2l0aCB0aGUgZGF0YSBidWZmZXIgcG9pbnRpbmcgdG8uLi4KLSAgQSBUeCBkYXRhIGJ1ZmZlciBkZXNjcmlwdG9yLiAgVGhlIHBhY2tldCBpcyBpbiBhIHNpbmdsZSBidWZmZXIsIHJhdGhlciB0aGFuCi0JY2hhaW5pbmcgdG9nZXRoZXIgc2V2ZXJhbCBzbWFsbGVyIGJ1ZmZlcnMuCi0gIEEgTm9PcCBjb21tYW5kLCB3aGljaCBpbml0aWFsbHkgcG9pbnRzIHRvIGl0c2VsZiwKLSAgQW5kIHRoZSBwYWNrZXQgZGF0YS4KLQotICBBIHRyYW5zbWl0IGlzIGRvbmUgYnkgZmlsbGluZyBpbiB0aGUgVHggY29tbWFuZCB0YWJsZSBhbmQgZGF0YSBidWZmZXIsCi0gIHJlLXdyaXRpbmcgdGhlIE5vT3AgY29tbWFuZCwgYW5kIGZpbmFsbHkgY2hhbmdpbmcgdGhlIG9mZnNldCBvZiB0aGUgbGFzdAotICBjb21tYW5kIHRvIHBvaW50IHRvIHRoZSBjdXJyZW50IFR4IGNvbW1hbmQuICBXaGVuIHRoZSBUeCBjb21tYW5kIGlzIGZpbmlzaGVkLAotICBpdCBqdW1wcyB0byB0aGUgTm9PcCwgd2hlbiBpdCBsb29wcyB1bnRpbCB0aGUgbmV4dCBUeCBjb21tYW5kIGNoYW5nZXMgdGhlCi0gICJsaW5rIG9mZnNldCIgaW4gdGhlIE5vT3AuICBUaGlzIHdheSB0aGUgODI1ODYgbmV2ZXIgaGFzIHRvIGdvIHRocm91Z2ggdGhlCi0gIHNsb3cgcmVzdGFydCBzZXF1ZW5jZS4KLQotICBUaGUgUnggYnVmZmVyIGxpc3QgaXMgc2V0IHVwIGluIHRoZSBvYnZpb3VzIHJpbmcgc3RydWN0dXJlLiAgV2UgaGF2ZSBlbm91Z2gKLSAgbWVtb3J5IChhbmQgbG93IGVub3VnaCBpbnRlcnJ1cHQgbGF0ZW5jeSkgdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIGNvbXBsaWNhdGVkCi0gIFJ4IGJ1ZmZlciBsaW5rZWQgbGlzdHMgYnkgYWx3YXkgYXNzb2NpYXRpbmcgYSBmdWxsLXNpemUgUnggZGF0YSBidWZmZXIgd2l0aAotICBlYWNoIFJ4IGRhdGEgZnJhbWUuCi0KLSAgSSBjdXJyZW50bHkgdXNlIG9uZSB0cmFuc21pdCBidWZmZXIgc3RhcnRpbmcgYXQgVFhfQlVGX1NUQVJUICgweDAxMDApLCBhbmQKLSAgdXNlIHRoZSByZXN0IG9mIG1lbW9yeSwgZnJvbSBSWF9CVUZfU1RBUlQgdG8gUlhfQlVGX0VORCwgZm9yIFJ4IGJ1ZmZlcnMuCi0KLSAgKi8KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGluaXRfd29yZHNbXSA9IHsKLQkvKglTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApLiAqLwotI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwNykKLQkweDAwMDAsCQkJCQkvKiBTZXQgYnVzIHNpemUgdG8gMTYgYml0cy4gKi8KLSNlbHNlCi0JMHgwMDAxLAkJCQkJLyogU2V0IGJ1cyBzaXplIHRvIDggYml0cyAqLwotI2VuZGlmCi0JMCwwLAkJCQkJLyogcGFkIHdvcmRzLiAqLwotCTB4MDAwMCwweDAwMDAsCQkJCS8qIElTQ1AgcGh5cyBhZGRyLCBzZXQgaW4gaW5pdF84MjU4Nl9tZW0oKS4gKi8KLQotCS8qCUludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKS4gKi8KLQkweDAwMDEsCQkJCQkvKiBTdGF0dXMgd29yZCB0aGF0J3MgY2xlYXJlZCB3aGVuIGluaXQgaXMgZG9uZS4gKi8KLQkweDAwMDgsMCwwLAkJCQkvKiBTQ0Igb2Zmc2V0LCAoc2tpcCwgc2tpcCkgKi8KLQotCS8qIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLiAqLwotCTAsMHhmMDAwfFJYX1NUQVJUfENVQ19TVEFSVCwJCS8qIFNDQiBzdGF0dXMgYW5kIGNtZC4gKi8KLQlDT05GSUdfQ01ELAkJCQkvKiBDb21tYW5kIGxpc3QgcG9pbnRlciwgcG9pbnRzIHRvIENvbmZpZ3VyZS4gKi8KLQlSWF9CVUZfU1RBUlQsCQkJCS8qIFJ4IGJsb2NrIGxpc3QuICovCi0JMCwwLDAsMCwJCQkJLyogRXJyb3IgY291bnQ6IENSQywgYWxpZ24sIGJ1ZmZlciwgb3ZlcnJ1bi4gKi8KLQotCS8qIDB4MDAxODogQ29uZmlndXJlIGNvbW1hbmQuICBDaGFuZ2UgdG8gcHV0IE1BQyBkYXRhIHdpdGggcGFja2V0LiAqLwotCTAsIENtZENvbmZpZ3VyZSwJCQkvKiBTdGF0dXMsIGNvbW1hbmQuICovCi0JU0VUX1NBX0NNRCwJCQkJLyogTmV4dCBjb21tYW5kIGlzIFNldCBTdGF0aW9uIEFkZHIuICovCi0JMHgwODA0LAkJCQkJLyogIjQiIGJ5dGVzIG9mIGNvbmZpZyBkYXRhLCA4IGJ5dGUgRklGTy4gKi8KLQkweDJlNDAsCQkJCQkvKiBNYWdpYyB2YWx1ZXMsIGluY2x1ZGluZyBNQUMgZGF0YSBsb2NhdGlvbi4gKi8KLQkwLAkJCQkJLyogVW51c2VkIHBhZCB3b3JkLiAqLwotCi0JLyogMHgwMDI0OiBTZXR1cCBzdGF0aW9uIGFkZHJlc3MgY29tbWFuZC4gKi8KLQkwLCBDbWRTQVNldHVwLAotCVNFVF9NQ19DTUQsCQkJCS8qIE5leHQgY29tbWFuZC4gKi8KLQkweGFhMDAsMHhiMDAwLDB4MGJhZCwJLyogU3RhdGlvbiBhZGRyZXNzICh0byBiZSBmaWxsZWQgaW4pICovCi0KLQkvKiAweDAwMzA6IE5PUCwgbG9vcGluZyBiYWNrIHRvIGl0c2VsZi4gIFBvaW50IHRvIGZpcnN0IFR4IGJ1ZmZlciB0byBUeC4gKi8KLQkwLCBDbWROT3AsIElETEVMT09QLCAwIC8qIHBhZCAqLywKLQotCS8qIDB4MDAzODogQSB1bnVzZWQgVGltZS1Eb21haW4gUmVmbGVjdG9tZXRlciBjb21tYW5kLiAqLwotCTAsIENtZFREUiwgSURMRUxPT1AsIDAsCi0KLQkvKiAweDAwNDA6IEFuIHVudXNlZCBEdW1wIFN0YXRlIGNvbW1hbmQuICovCi0JMCwgQ21kRHVtcCwgSURMRUxPT1AsIERVTVBfREFUQSwKLQotCS8qIDB4MDA0ODogQW4gdW51c2VkIERpYWdub3NlIGNvbW1hbmQuICovCi0JMCwgQ21kRGlhZ25vc2UsIElETEVMT09QLAotCi0JLyogMHgwMDRFOiBBbiBlbXB0eSBzZXQtbXVsdGljYXN0LWxpc3QgY29tbWFuZC4gKi8KLQkwLCBDbWRNdWx0aWNhc3RMaXN0LCBJRExFTE9PUCwgMCwKLX07Ci0KLS8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0CQlpb2FkZHIsIGlycSwgc2NiX2Jhc2U7Ci1zdGF0aWMgQWRkcmVzcwkJCW1lbV9zdGFydCwgbWVtX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAkJcnhfaGVhZCwgcnhfdGFpbDsKLQotI2RlZmluZQlyZWFkX21lbShtLHMpCWZtZW1jcHkoKGNoYXIgKilzLCBtLCBzaXplb2YocykpCi0KLXN0YXRpYyB2b2lkIHNldHVwX3J4X2J1ZmZlcnMoc3RydWN0IG5pYyAqbmljKQotewotCUFkZHJlc3MJCQl3cml0ZV9wdHI7Ci0JdW5zaWduZWQgc2hvcnQJCWN1cl9yeF9idWY7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0CXJ4X2NtZFsxNl0gPSB7Ci0JCTB4MDAwMCwJCQkvKiBSeCBzdGF0dXMgKi8KLQkJMHgwMDAwLAkJCS8qIFJ4IGNvbW1hbmQsIG9ubHkgYW5kIGxhc3QgKi8KLQkJUlhfQlVGX1NUQVJULAkJLyogTGluayAod2lsbCBiZSBhZGp1c3RlZCkgKi8KLQkJUlhfQlVGX1NUQVJUICsgMjIsCS8qIEJ1ZmZlciBvZmZzZXQgKHdpbGwgYmUgYWRqdXN0ZWQpICovCi0JCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3IgZGVzdCBhZGRyICovCi0JCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3Igc291cmNlIGFkZHIgKi8KLQkJMHgwMDAwLAkJCS8qIFBhZCBmb3IgcHJvdG9jb2wgKi8KLQkJMHgwMDAwLAkJCS8qIEJ1ZmZlcjogQWN0dWFsIGNvdW50ICovCi0JCS0xLAkJCS8qIEJ1ZmZlcjogTmV4dCAobm9uZSkgKi8KLQkJUlhfQlVGX1NUQVJUICsgMHgyMCwJLyogQnVmZmVyOiBBZGRyZXNzIGxvdyAoKyBzY2JfYmFzZSkgKHdpbGwgYmUgYWRqdXN0ZWQpICovCi0JCTB4MDAwMCwJCQkvKiBCdWZmZXI6IEFkZHJlc3MgaGlnaCAqLwotCQkweDgwMDAgfCAoUlhfQlVGX1NJWkUgLSAweDIwKQotCX07Ci0KLQljdXJfcnhfYnVmID0gcnhfaGVhZCA9IFJYX0JVRl9TVEFSVDsKLQlkbyB7CQkvKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBidWZmZXIgKi8KLQkJd3JpdGVfcHRyID0gbWVtX3N0YXJ0ICsgY3VyX3J4X2J1ZjsKLQkJLyogYWRqdXN0IHNvbWUgY29udGVudHMgKi8KLQkJcnhfY21kWzFdID0gMHgwMDAwOwotCQlyeF9jbWRbMl0gPSBjdXJfcnhfYnVmICsgUlhfQlVGX1NJWkU7Ci0JCXJ4X2NtZFszXSA9IGN1cl9yeF9idWYgKyAyMjsKLQkJcnhfY21kWzEzXSA9IGN1cl9yeF9idWYgKyAweDIwICsgc2NiX2Jhc2U7Ci0JCW1lbWNweSgoY2hhciAqKXdyaXRlX3B0ciwgKGNoYXIgKilyeF9jbWQsIHNpemVvZihyeF9jbWQpKTsKLQkJcnhfdGFpbCA9IGN1cl9yeF9idWY7Ci0JCWN1cl9yeF9idWYgKz0gUlhfQlVGX1NJWkU7Ci0JfSB3aGlsZSAoY3VyX3J4X2J1ZiA8PSBSWF9CVUZfRU5EIC0gUlhfQlVGX1NJWkUpOwotCS8qIFRlcm1pbmF0ZSB0aGUgbGlzdCBieSBzZXR0aW5nIHRoZSBFT0wgYml0IGFuZCB3cmFwIHRoZXIgcG9pbnRlcgotCSAgIHRvIG1ha2UgdGhlIGxpc3QgYSByaW5nLiAqLwotCXdyaXRlX3B0ciA9IG1lbV9zdGFydCArIHJ4X3RhaWw7Ci0JcnhfY21kWzFdID0gMHhDMDAwOwotCXJ4X2NtZFsyXSA9IHJ4X2hlYWQ7Ci0JbWVtY3B5KChjaGFyICopd3JpdGVfcHRyLCAoY2hhciAqKXJ4X2NtZCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIDMpOwotfQotCi1zdGF0aWMgdm9pZCBhY2tfc3RhdHVzKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQJY21kLCBzdGF0dXM7Ci0JdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OwotCi0JY21kID0gKHN0YXR1cyA9IHNobWVtW2lTQ0JfU1RBVFVTPj4xXSkgJiAweGYwMDA7Ci0JaWYgKHN0YXR1cyAmIDB4MTAwKQkJLyogQ1Ugc3VzcGVuZGVkPyAqLwotCQljbWQgfD0gQ1VDX1JFU1VNRTsKLQlpZiAoKHN0YXR1cyAmIDB4MjAwKSA9PSAwKQkvKiBDVSBub3QgYWN0aXZlPyAqLwotCQljbWQgfD0gQ1VDX1NUQVJUOwotCWlmIChzdGF0dXMgJiAweDAxMCkJCS8qIFJVIHN1c3BlbmRlZD8gKi8KLQkJY21kIHw9IFJYX1JFU1VNRTsKLQllbHNlIGlmICgoc3RhdHVzICYgMHgwNDApID09IDApCS8qIFJVIG5vdCBhY3RpdmU/ICovCi0JCWNtZCB8PSBSWF9TVEFSVDsKLQlpZiAoY21kID09IDApCQkJLyogTm90aGluZyB0byBkbyAqLwotCQlyZXR1cm47Ci0Jc2htZW1baVNDQl9DTUQ+PjFdID0gY21kOwotI2lmCWRlZmluZWQoREVCVUcpCi0JcHJpbnRmKCJTdGF0dXMgJWhYIENvbW1hbmQgJWhYXG4iLCBzdGF0dXMsIGNtZCk7Ci0jZW5kaWYKLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaTgyNTg2X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQl1bnNpZ25lZCBsb25nCXRpbWU7Ci0JdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OwotCi0JLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCi0KLSNpZmRlZglJTkNMVURFXzNDNTA3Ci0JLyogRW5hYmxlIGxvb3BiYWNrIHRvIHByb3RlY3QgdGhlIHdpcmUgd2hpbGUgc3RhcnRpbmcgdXAsCi0JICAgYW5kIGhvbGQgdGhlIDU4NiBpbiByZXNldCBkdXJpbmcgdGhlIG1lbW9yeSBpbml0aWFsaXNhdGlvbi4gKi8KLQlvdXRiKDB4MjAsIGlvYWRkciArIE1JU0NfQ1RSTCk7Ci0jZW5kaWYKLQotCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLwotCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKLQlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7Ci0KLQkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLwotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCi0JLyogRmlsbCBpbiB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLwotCW1lbWNweSgoY2hhciAqKShtZW1fZW5kIC0gMTApLCAoY2hhciAqKWluaXRfd29yZHMsIDEwKTsKLQltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQsIChjaGFyICopJmluaXRfd29yZHNbNV0sIHNpemVvZihpbml0X3dvcmRzKSAtIDEwKTsKLQltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQgKyBTQV9PRkZTRVQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0Jc2V0dXBfcnhfYnVmZmVycyhuaWMpOwotCi0jaWZkZWYJSU5DTFVERV8zQzUwNwotCS8qIFN0YXJ0IHRoZSA1ODYgYnkgcmVsZWFzaW5nIHRoZSByZXNldCBsaW5lLCBidXQgbGVhdmUgbG9vcGJhY2suICovCi0Jb3V0YigweEEwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotI2VuZGlmCi0KLQkvKiBUaGlzIHdhcyB0aW1lIGNvbnN1bWluZyB0byB0cmFjayBkb3duOyB5b3UgbmVlZCB0byBnaXZlIHR3byBjaGFubmVsCi0JICAgYXR0ZW50aW9uIHNpZ25hbHMgdG8gcmVsaWFibHkgc3RhcnQgdXAgdGhlIGk4MjU4Ni4gKi8KLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQl0aW1lID0gY3VycnRpY2tzKCkgKyBUSUNLU19QRVJfU0VDOwkvKiBhbGxvdyAxIHNlY29uZCB0byBpbml0ICovCi0Jd2hpbGUgKAotCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCi0JewotCQlpZiAoY3VycnRpY2tzKCkgPiB0aW1lKQotCQl7Ci0JCQlwcmludGYoImk4MjU4NiBpbml0aWFsaXNhdGlvbiB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAotCQkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCi0jaWZkZWYJSU5DTFVERV8zQzUwNwotCS8qIERpc2FibGUgbG9vcGJhY2suICovCi0Jb3V0YigweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotI2VuZGlmCi0jaWYJZGVmaW5lZChERUJVRykKLQlwcmludGYoImk4MjU4NiBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAotCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgaTgyNTg2X3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJc3RhdHVzOwotCXVuc2lnbmVkIHNob3J0CXJmZF9jbWQsIG5leHRfcnhfZnJhbWUsIGRhdGFfYnVmZmVyX2FkZHIsCi0JZnJhbWVfc3RhdHVzLCBwa3RfbGVuOwotCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydCArIHJ4X2hlYWQ7Ci0KLQkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCi0JaWYgKAotCQkJKChmcmFtZV9zdGF0dXMgPSBzaG1lbVswXSkgJiAweDgwMDApID09IDApCi0JCXJldHVybiAoMCk7CQkvKiBub3BlICovCi0JcmZkX2NtZCA9IHNobWVtWzFdOwotCW5leHRfcnhfZnJhbWUgPSBzaG1lbVsyXTsKLQlkYXRhX2J1ZmZlcl9hZGRyID0gc2htZW1bM107Ci0JcGt0X2xlbiA9IHNobWVtWzExXTsKLQlzdGF0dXMgPSAwOwotCWlmIChyZmRfY21kICE9IDAgfHwgZGF0YV9idWZmZXJfYWRkciAhPSByeF9oZWFkICsgMjIKLQkJCXx8IChwa3RfbGVuICYgMHhDMDAwKSAhPSAweEMwMDApCi0JCXByaW50ZigiXG5SeCBmcmFtZSBjb3JydXB0LCBkaXNjYXJkZWQiKTsKLQllbHNlIGlmICgoZnJhbWVfc3RhdHVzICYgMHgyMDAwKSA9PSAwKQotCQlwcmludGYoIlxuUnggZnJhbWUgaGFkIGVycm9yIik7Ci0JZWxzZQotCXsKLQkJLyogV2UgaGF2ZSBhIGZyYW1lLCBjb3B5IGl0IHRvIG91ciBidWZmZXIgKi8KLQkJcGt0X2xlbiAmPSAweDNGRkY7Ci0JCW1lbWNweShuaWMtPnBhY2tldCwgKGNoYXIgKiltZW1fc3RhcnQgKyByeF9oZWFkICsgMHgyMCwgcGt0X2xlbik7Ci0JCS8qIE9ubHkgcGFja2V0cyBub3QgZnJvbSBvdXJzZWxmICovCi0JCWlmIChtZW1jbXAobmljLT5wYWNrZXQgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKSAhPSAwKQotCQl7Ci0JCQluaWMtPnBhY2tldGxlbiA9IHBrdF9sZW47Ci0JCQlzdGF0dXMgPSAxOwotCQl9Ci0JfQotCS8qIENsZWFyIHRoZSBzdGF0dXMgd29yZCBhbmQgc2V0IEVPTCBvbiBSeCBmcmFtZSAqLwotCXNobWVtWzBdID0gMDsKLQlzaG1lbVsxXSA9IDB4QzAwMDsKLQkqKHNob3J0ICopKG1lbV9zdGFydCArIHJ4X3RhaWwgKyAyKSA9IDA7Ci0JcnhfdGFpbCA9IHJ4X2hlYWQ7Ci0JcnhfaGVhZCA9IG5leHRfcnhfZnJhbWU7Ci0JYWNrX3N0YXR1cygpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIFRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGk4MjU4Nl90cmFuc21pdCgKLQkJc3RydWN0IG5pYyAqbmljLAotCQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQkJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwotCQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCUFkZHJlc3MJCQlicHRyOwotCXVuc2lnbmVkIHNob3J0CQl0eXBlLCB6OwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAl0eF9jbWRbMTFdID0gewotCQkweDAsCQkJLyogVHggc3RhdHVzICovCi0JCUNtZFR4LAkJCS8qIFR4IGNvbW1hbmQgKi8KLQkJVFhfQlVGX1NUQVJUKzE2LAkvKiBOZXh0IGNvbW1hbmQgaXMgYSBOb09wICovCi0JCVRYX0JVRl9TVEFSVCs4LAkJLyogRGF0YSBCdWZmZXIgb2Zmc2V0ICovCi0JCTB4ODAwMCwJCQkvKiB8IHdpdGggc2l6ZSAqLwotCQkweGZmZmYsCQkJLyogTm8gbmV4dCBkYXRhIGJ1ZmZlciAqLwotCQlUWF9CVUZfU1RBUlQrMjIsCS8qICsgc2NiX2Jhc2UgKi8KLQkJMHgwLAkJCS8qIEJ1ZmZlciBhZGRyZXNzIGhpZ2ggYml0cyAoYWx3YXlzIHplcm8pICovCi0JCTB4MCwJCQkvKiBOb3Agc3RhdHVzICovCi0JCUNtZE5PcCwJCQkvKiBOb3AgY29tbWFuZCAqLwotCQlUWF9CVUZfU1RBUlQrMTYJCS8qIE5leHQgaXMgbXlzZWxmICovCi0JfTsKLQl1bnNpZ25lZCBzaG9ydAkqc2htZW0gPSAoc2hvcnQgKiltZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQ7Ci0KLQkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KLQkvKiBhZGp1c3Qgc29tZSBjb250ZW50cyAqLwotCXR5cGUgPSBodG9ucyh0KTsKLQlpZiAocyA8IEVUSF9aTEVOKQotCQlzID0gRVRIX1pMRU47Ci0JdHhfY21kWzRdID0gKHMgKyBFVEhfSExFTikgfCAweDgwMDA7Ci0JdHhfY21kWzZdID0gVFhfQlVGX1NUQVJUICsgMjIgKyBzY2JfYmFzZTsKLQlicHRyID0gbWVtX3N0YXJ0ICsgVFhfQlVGX1NUQVJUOwotCW1lbWNweSgoY2hhciAqKWJwdHIsIChjaGFyICopdHhfY21kLCBzaXplb2YodHhfY21kKSk7Ci0JYnB0ciArPSBzaXplb2YodHhfY21kKTsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBkLCBFVEhfQUxFTik7Ci0JYnB0ciArPSBFVEhfQUxFTjsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCWJwdHIgKz0gRVRIX0FMRU47Ci0JbWVtY3B5KChjaGFyICopYnB0ciwgKGNoYXIgKikmdHlwZSwgc2l6ZW9mKHR5cGUpKTsKLQlicHRyICs9IHNpemVvZih0eXBlKTsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBwLCBzKTsKLQkvKiBDaGFuZ2UgdGhlIG9mZnNldCBpbiB0aGUgSURMRUxPT1AgKi8KLQkqKHVuc2lnbmVkIHNob3J0ICopKG1lbV9zdGFydCArIElETEVMT09QICsgNCkgPSBUWF9CVUZfU1RBUlQ7Ci0JLyogV2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGlvbiAqLwotCXdoaWxlICgKLQkJCShzaG1lbVswXSAmIDB4MjAwMCkgPT0gMCkKLQkJOwotCS8qIENoYW5nZSB0aGUgb2Zmc2V0IGluIHRoZSBJRExFTE9PUCBiYWNrIGFuZAotCSAgIGNoYW5nZSB0aGUgZmluYWwgbG9vcCB0byBwb2ludCBoZXJlICovCi0JKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBJRExFTE9PUCArIDQpID0gSURMRUxPT1A7Ci0JKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQgKyAyMCkgPSBJRExFTE9PUDsKLQlhY2tfc3RhdHVzKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaTgyNTg2X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydDsKLQotI2lmCTAKLQkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnguICovCi0Jc2htZW1baVNDQl9DTUQ+PjFdID0gUlhfU1VTUEVORCB8IENVQ19TVVNQRU5EOwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotI2lmZGVmCUlOQ0xVREVfTkk1MjEwCi0Jb3V0YigwLCBpb2FkZHIgKyBOSTUyX1JFU0VUKTsKLSNlbmRpZgotI2VuZGlmCS8qIDAgKi8KLX0KLQotI2lmZGVmCUlOQ0xVREVfM0M1MDcKLQotc3RhdGljIGludCB0NTA3X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0IGlvYWRkcikKLXsKLQlpbnQJCQlpOwotCUFkZHJlc3MJCQlzaXplOwotCWNoYXIJCQltZW1fY29uZmlnOwotCWNoYXIJCQlpZl9wb3J0OwotCi0JaWYgKGluYihpb2FkZHIpICE9ICcqJyB8fCBpbmIoaW9hZGRyKzEpICE9ICczJwotCQl8fCBpbmIoaW9hZGRyKzIpICE9ICdDJyB8fCBpbmIoaW9hZGRyKzMpICE9ICdPJykKLQkJcmV0dXJuICgwKTsKLQlpcnEgPSBpbmIoaW9hZGRyICsgSVJRX0NPTkZJRykgJiAweDBmOwotCW1lbV9jb25maWcgPSBpbmIoaW9hZGRyICsgTUVNX0NPTkZJRyk7Ci0JaWYgKG1lbV9jb25maWcgJiAweDIwKQotCXsKLQkJc2l6ZSA9IDY1NTM2TDsKLQkJbWVtX3N0YXJ0ID0gMHhmMDAwMDBMICsgKG1lbV9jb25maWcgJiAweDA4ID8gMHgwODAwMDBMCi0JCQk6ICgoKEFkZHJlc3MpbWVtX2NvbmZpZyAmIDB4MykgPDwgMTcpKTsKLQl9Ci0JZWxzZQotCXsKLQkJc2l6ZSA9ICgoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDMpICsgMSkgPDwgMTQpOwotCQltZW1fc3RhcnQgPSAweDBjMDAwMEwgKyAoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDE4KSA8PCAxMik7Ci0JfQotCW1lbV9lbmQgPSBtZW1fc3RhcnQgKyBzaXplOwotCXNjYl9iYXNlID0gNjU1MzZMIC0gc2l6ZTsKLQlpZl9wb3J0ID0gaW5iKGlvYWRkciArIFJPTV9DT05GSUcpICYgMHg4MDsKLQkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCi0Jb3V0YigweDAxLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCXsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOwotCX0KLQlwcmludGYoIlxuM2M1MDcgaW9hZGRyICUjaFgsIElSUSAlZCwgbWVtIFslI1gtJSNYXSwgJXN0ZXJuYWwgeGN2ciwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBpcnEsIG1lbV9zdGFydCwgbWVtX2VuZCwgaWZfcG9ydCA/ICJpbiIgOiAiZXgiLCBuaWMtPm5vZGVfYWRkcik7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IG5pYyAqdDUwN19wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLXsKLQlzdGF0aWMgdW5zaWduZWQgY2hhcglpbml0X0lEX2RvbmUgPSAwOwotCXVuc2lnbmVkIHNob3J0CQlscnNfc3RhdGUgPSAweGZmOwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMCB9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQlpbnQJCQlpOwotCi0JaWYgKGluaXRfSURfZG9uZSA9PSAwKQotCXsKLQkJLyogU2VuZCB0aGUgSUQgc2VxdWVuY2UgdG8gdGhlIElEX1BPUlQgdG8gZW5hYmxlIHRoZSBib2FyZCAqLwotCQlvdXRiKDB4MDAsIElEX1BPUlQpOwotCQlmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpCi0JCXsKLQkJCW91dGIobHJzX3N0YXRlLCBJRF9QT1JUKTsKLQkJCWxyc19zdGF0ZSA8PD0gMTsKLQkJCWlmIChscnNfc3RhdGUgJiAweDEwMCkKLQkJCQlscnNfc3RhdGUgXj0gMHhlNzsKLQkJfQotCQlvdXRiKDB4MDAsIElEX1BPUlQpOwotCQlpbml0X0lEX2RvbmUgPSAxOwotCX0KLQkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0JaWYgKHByb2JlX2FkZHJzID09IDApCi0JCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7Ci0JZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQotCQlpZiAodDUwN19wcm9iZTEobmljLCBpb2FkZHIpKQotCQkJYnJlYWs7Ci0JaWYgKGlvYWRkciAhPSAwKQotCXsKLQkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JCWk4MjU4Nl9yZXNldChuaWMpOwotCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OwotCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCS8qIGVsc2UgKi8KLQl7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05JNTIxMAotCi1zdGF0aWMgaW50IG5pNTIxMF9wcm9iZTIodm9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydAkJaTsKLQl1bnNpZ25lZCBzaG9ydAkJc2htZW1bMTBdOwotCi0JLyogRml4IHRoZSBJU0NQIGFkZHJlc3MgYW5kIGJhc2UuICovCi0JaW5pdF93b3Jkc1szXSA9IHNjYl9iYXNlOwotCWluaXRfd29yZHNbN10gPSBzY2JfYmFzZTsKLQotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweGZmZjYuICovCi0JLyogV3JpdGUgdGhlIHdvcmRzIGF0IDB4MDAwMC4gKi8KLQltZW1jcHkoKGNoYXIgKikobWVtX2VuZCAtIDEwKSwgKGNoYXIgKilpbml0X3dvcmRzLCAxMCk7Ci0JbWVtY3B5KChjaGFyICopbWVtX3N0YXJ0LCAoY2hhciAqKSZpbml0X3dvcmRzWzVdLCBzaXplb2YoaW5pdF93b3JkcykgLSAxMCk7Ci0JaWYgKCoodW5zaWduZWQgc2hvcnQgKiltZW1fc3RhcnQgIT0gMSkKLQkJcmV0dXJuICgwKTsKLQlvdXRiKDAsIGlvYWRkciArIE5JNTJfUkVTRVQpOwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCXVkZWxheSgzMik7Ci0JaSA9IDUwOwotCXdoaWxlICgKLQkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCi0JewotCQlpZiAoLS1pID09IDApCi0JCXsKLQkJCXByaW50ZigiaTgyNTg2IGluaXRpYWxpc2F0aW9uIHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlaFgsIGNtZCAlaFhcbiIsCi0JCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogSXNzdWUgY2hhbm5lbC1hdHRuIC0tIHRoZSA4MjU4NiB3b24ndCBzdGFydC4gKi8KLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKW1lbV9zdGFydCAhPSAwKQotCQlyZXR1cm4gKDApOwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgbmk1MjEwX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQkJaTsKLQlzdGF0aWMgQWRkcmVzcwkJbWVtX2FkZHJzW10gPSB7Ci0JCTB4YzAwMDAsIDB4YzQwMDAsIDB4YzgwMDAsIDB4Y2MwMDAsCi0JCTB4ZDAwMDAsIDB4ZDQwMDAsIDB4ZDgwMDAsIDB4ZGMwMDAsCi0JCTB4ZTAwMDAsIDB4ZTQwMDAsIDB4ZTgwMDAsIDB4ZWMwMDAsCi0JCTAgfTsKLQlBZGRyZXNzCQkJKnA7Ci0KLQlpZiAoaW5iKGlvYWRkciArIDYpICE9IDB4MCB8fCBpbmIoaW9hZGRyICsgNykgIT0gMHg1NSkKLQkJcmV0dXJuICgwKTsKLQlzY2JfYmFzZSA9IC04MTkyOwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLwotCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgODE5Miwgbmk1MjEwX3Byb2JlMigpKQotCQkJYnJlYWs7Ci0JaWYgKG1lbV9zdGFydCA9PSAwKQotCQlyZXR1cm4gKDApOwotCS8qIEdldCBzdGF0aW9uIGFkZHJlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKLQl7Ci0JCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGlvYWRkcitpKTsKLQl9Ci0JcHJpbnRmKCJcbk5JNTIxMCBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdHJ1Y3QgbmljICpuaTUyMTBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi17Ci0JLyogbWlzc2luZyBlbnRyaWVzIGFyZSBhZGRyZXNzZXMgdXN1YWxseSBhbHJlYWR5IHVzZWQgKi8KLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsKLQkJMHgyMDAsIDB4MjA4LCAweDIxMCwgMHgyMTgsIDB4MjIwLCAweDIyOCwgMHgyMzAsIDB4MjM4LAotCQkweDI0MCwgMHgyNDgsIDB4MjUwLCAweDI1OCwgMHgyNjAsIDB4MjY4LCAweDI3MCwgLypQYXIqLwotCQkweDI4MCwgMHgyODgsIDB4MjkwLCAweDI5OCwgMHgyQTAsIDB4MkE4LCAweDJCMCwgMHgyQjgsCi0JCTB4MkMwLCAweDJDOCwgMHgyRDAsIDB4MkQ4LCAweDJFMCwgMHgyRTgsIDB4MkYwLCAvKlNlciovCi0JCTB4MzAwLCAweDMwOCwgMHgzMTAsIDB4MzE4LCAweDMyMCwgMHgzMjgsIDB4MzMwLCAweDMzOCwKLQkJMHgzNDAsIDB4MzQ4LCAweDM1MCwgMHgzNTgsIDB4MzYwLCAweDM2OCwgMHgzNzAsIC8qUGFyKi8KLQkJMHgzODAsIDB4Mzg4LCAweDM5MCwgMHgzOTgsIDB4M0EwLCAweDNBOCwgLypWaWQsUGFyKi8KLQkJMHgzQzAsIDB4M0M4LCAweDNEMCwgMHgzRDgsIDB4M0UwLCAweDNFOCwgLypTZXIqLwotCQkweDAKLQl9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQlpbnQJCQlpOwotCi0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCWlmIChwcm9iZV9hZGRycyA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKLQkJaWYgKG5pNTIxMF9wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCWlmIChpb2FkZHIgIT0gMCkKLQl7Ci0JCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLwotCQlpODI1ODZfcmVzZXQobmljKTsKLQkJbmljLT5yZXNldCA9IGk4MjU4Nl9yZXNldDsKLQkJbmljLT5wb2xsID0gaTgyNTg2X3BvbGw7Ci0JCW5pYy0+dHJhbnNtaXQgPSBpODI1ODZfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IGk4MjU4Nl9kaXNhYmxlOwotCQlyZXR1cm4gbmljOwotCX0KLQkvKiBlbHNlICovCi0JewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfRVhPUzIwNQotCi0vKgotICogQ29kZSB0byBkb3dubG9hZCB0byBJMTg2IGluIEVYT1MyMDUKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBleG9zX2kxODZfaW5pdFtdID0KLXsKLTB4MDgsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4YWEsMHhmYSwweDMzLDB4YzAsMHhiYSwweGZlLDB4ZmYsMHhlZiwweGI4LDB4ZjgsCi0weGZmLDB4ZTcsMHhhMCwweGI4LDB4N2MsMHgwMCwweGU3LDB4YTQsMHhiOCwweGJjLDB4ODAsMHhlNywweGE4LDB4OGMsMHhjOCwweDhlLAotMHhkOCwweGJiLDB4MmYsMHgwZSwweGM2LDB4MDcsMHhhNSwweDMzLDB4YzksMHhlYiwweDAwLDB4ZWIsMHgwMCwweGViLDB4MDAsMHhlMiwKLTB4ZjgsMHhiZSwweDJjLDB4MGUsMHhiYSwweDAyLDB4MDUsMHgzMywweGRiLDB4YjksMHgwMywweDAwLDB4ZWMsMHgyNCwweDBmLDB4OGEsCi0weGUwLDB4MDIsMHhkOCwweDQyLDB4NDIsMHhlYywweDAyLDB4ZDgsMHhkMCwweGUwLDB4ZDAsMHhlMCwweGQwLDB4ZTAsMHhkMCwweGUwLAotMHgwYSwweGM0LDB4ODgsMHgwNCwweDQyLDB4NDIsMHg0NiwweGUyLDB4ZTMsMHg4YSwweGUzLDB4ZDAsMHhlYywweGQwLDB4ZWMsMHhkMCwKLTB4ZWMsMHhkMCwweGVjLDB4ODAsMHhlMywweDBmLDB4MDIsMHhlMywweDgwLDB4ZjQsMHgwNSwweGVjLDB4M2EsMHhlMCwweDc0LDB4MDUsCi0weGM2LDB4MDQsMHg1YSwweGViLDB4ZmUsMHhjNiwweDA0LDB4NTUsMHgzMywweGMwLDB4OGUsMHhkOCwweGJlLDB4MzgsMHgwMCwweGM3LAotMHgwNCwweGNlLDB4MGUsMHg0NiwweDQ2LDB4YzcsMHgwNCwweDAwLDB4ZmYsMHhmYiwweGJhLDB4M2MsMHgwMCwweGI4LDB4MDMsMHgwMCwKLTB4ZWYsMHgzMywweGRiLDB4MzMsMHhjOSwweGJkLDB4MDQsMHgwZiwweDkwLDB4OTAsMHg5MCwweDkwLDB4ZTIsMHhmYSwweDQzLDB4MmUsCi0weDg5LDB4NWUsMHgwMCwweGViLDB4ZjMsMHg1MiwweGJhLDB4MDAsMHgwNiwweGVmLDB4NTAsMHg1MywweDU1LDB4YmQsMHhmOCwweDBlLAotMHgyZSwweDhiLDB4NWUsMHgwMCwweDQzLDB4MmUsMHg4OSwweDVlLDB4MDAsMHhiYSwweDIyLDB4MDAsMHhiOCwweDAwLDB4ODAsMHhlZiwKLTB4NWQsMHg1YiwweDU4LDB4NWEsMHhjZiwweDQ5LDB4NGUsMHg1NCwweDUyLDB4MjAsMHg2MywweDZlLDB4NzQsMHgyZCwweDNlLDB4MDAsCi0weDAwLDB4NGMsMHg0ZiwweDRmLDB4NTAsMHgyMCwweDYzLDB4NmUsMHg3NCwweDJkLDB4M2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZWEsMHgzMCwweDBlLDB4MDAsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMDAKLX07Ci0KLS8qIFRoZXNlIG9mZnNldHMgYXJlIGZyb20gdGhlIGVuZCBvZiB0aGUgaTE4NiBkb3dubG9hZCBjb2RlICovCi0KLSNkZWZpbmUJT0ZGU0VUX1NFTUEJCTB4MUQxCi0jZGVmaW5lCU9GRlNFVF9BRERSCQkweDFENwotCi1zdGF0aWMgaW50IGV4b3MyMDVfcHJvYmUyKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQJCWk7Ci0JdW5zaWduZWQgc2hvcnQJCXNobWVtWzEwXTsKLQotCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLwotCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKLQlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7Ci0KLQkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLwotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCi0JbWVtY3B5KChjaGFyICopKG1lbV9lbmQgLSAxMCksIChjaGFyICopaW5pdF93b3JkcywgMTApOwotCW1lbWNweSgoY2hhciAqKW1lbV9zdGFydCwgKGNoYXIgKikmaW5pdF93b3Jkc1s1XSwgc2l6ZW9mKGluaXRfd29yZHMpIC0gMTApOwotCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDEpCi0JCXJldHVybiAoMCk7Ci0Jb3V0YigwLCBpb2FkZHIgKyBFWE9TMjA1X1JFU0VUKTsKLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQlpID0gNTA7Ci0Jd2hpbGUgKAotCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0gPT0gMCkKLQl7Ci0JCWlmICgtLWkgPT0gMCkKLQkJewotCQkJcHJpbnRmKCJpODI1ODYgaW5pdGlhbGlzYXRpb24gdGltZWQgb3V0IHdpdGggc3RhdHVzICVoWCwgY21kICVoWFxuIiwKLQkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDApCi0JCXJldHVybiAoMCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludCBleG9zMjA1X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQkJaTsKLQkvKiBJZiB5b3Uga25vdyB0aGUgb3RoZXIgYWRkcmVzc2VzIHBsZWFzZSBsZXQgbWUga25vdyAqLwotCXN0YXRpYyBBZGRyZXNzCQltZW1fYWRkcnNbXSA9IHsKLQkJMHhjYzAwMCwgMCB9OwotCUFkZHJlc3MJCQkqcDsKLQotCXNjYl9iYXNlID0gLTE2Mzg0OwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLwotCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgMTYzODQsIGV4b3MyMDVfcHJvYmUyKCkpCi0JCQlicmVhazsKLQlpZiAobWVtX3N0YXJ0ID09IDApCi0JCXJldHVybiAoMCk7Ci0JLyogR2V0IHN0YXRpb24gYWRkcmVzcyAqLwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCXsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOwotCX0KLQlwcmludGYoIlxuRVhPUzIwNSBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdHJ1Y3QgbmljICpleG9zMjA1X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCS8qIElmIHlvdSBrbm93IHRoZSBvdGhlciBhZGRyZXNzZXMsIHBsZWFzZSBsZXQgbWUga25vdyAqLwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0gewotCQkweDMxMCwgMHgwCi0JfTsKLQl1bnNpZ25lZCBzaG9ydAkJKnA7Ci0JaW50CQkJaTsKLQotCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gcm91dGluZSBjYW4gdXNlIGEgaGFyZHdpcmVkIGRlZmF1bHQgKi8KLQlpZiAocHJvYmVfYWRkcnMgPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKLQlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChleG9zMjA1X3Byb2JlMShuaWMpKQotCQkJYnJlYWs7Ci0JaWYgKGlvYWRkciAhPSAwKQotCXsKLQkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JCWk4MjU4Nl9yZXNldChuaWMpOwotCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OwotCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCS8qIGVsc2UgKi8KLQl7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotI2VuZGlmCkluZGV4OiBiL25ldGJvb3QvaWZfYXJwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvaWZfYXJwLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZglfSUZfQVJQX0gKKyNkZWZpbmUJX0lGX0FSUF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjZGVmaW5lIEFSUF9SRVFVRVNUCTEKKyNkZWZpbmUgQVJQX1JFUExZCTIKKworI2lmbmRlZglNQVhfQVJQX1JFVFJJRVMKKyNkZWZpbmUgTUFYX0FSUF9SRVRSSUVTCQkyMAorI2VuZGlmCisKKy8qCisgKiBBIHBpdHkgc2lwYWRkciBhbmQgdGlwYWRkciBhcmUgbm90IGxvbmd3b3JkIGFsaWduZWQgb3Igd2UgY291bGQgdXNlCisgKiBpbl9hZGRyLiBObywgSSBkb24ndCB3YW50IHRvIHVzZSAjcHJhZ21hIHBhY2tlZC4KKyAqLworc3RydWN0IGFycHJlcXVlc3QgeworCXVpbnQxNl90IGh3dHlwZTsKKwl1aW50MTZfdCBwcm90b2NvbDsKKwl1aW50OF90ICBod2xlbjsKKwl1aW50OF90ICBwcm90b2xlbjsKKwl1aW50MTZfdCBvcGNvZGU7CisJdWludDhfdCAgc2h3YWRkcls2XTsKKwl1aW50OF90ICBzaXBhZGRyWzRdOworCXVpbnQ4X3QgIHRod2FkZHJbNl07CisJdWludDhfdCAgdGlwYWRkcls0XTsKK307CisKKyNlbmRpZgkvKiBfSUZfQVJQX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9pZl9ldGhlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2lmX2V0aGVyLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZglfSUZfRVRIRVJfSAorI2RlZmluZQlfSUZfRVRIRVJfSAorCisvKgorICAgSSdtIG1vdmluZyB0b3dhcmRzIHRoZSBkZWZpbmVkIG5hbWVzIGluIGxpbnV4L2lmX2V0aGVyLmggZm9yIGNsYXJpdHkuCisgICBUaGUgY29uZnVzaW9uIGJldHdlZW4gNjAvNjQgYW5kIDE1MTQvMTUxOCBhcm9zZSBiZWNhdXNlIHRoZSBOUzgzOTAKKyAgIGNvdW50cyB0aGUgNCBieXRlIGZyYW1lIGNoZWNrc3VtIGluIHRoZSBpbmNvbWluZyBwYWNrZXQsIGJ1dCBub3QKKyAgIGluIHRoZSBvdXRnb2luZyBwYWNrZXQuIDYwLzE1MTQgYXJlIHRoZSBjb3JyZWN0IG51bWJlcnMgZm9yIG1vc3QKKyAgIGlmIG5vdCBhbGwgb2YgdGhlIG90aGVyIE5JQyBjb250cm9sbGVycy4KKyovCisKKyNkZWZpbmUgRVRIX0FMRU4JCTYJLyogU2l6ZSBvZiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSF9ITEVOCQkxNAkvKiBTaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLworI2RlZmluZQlFVEhfWkxFTgkJNjAJLyogTWluaW11bSBwYWNrZXQgKi8KKyNkZWZpbmUJRVRIX0ZSQU1FX0xFTgkJMTUxNAkvKiBNYXhpbXVtIHBhY2tldCAqLworI2RlZmluZSBFVEhfREFUQV9BTElHTgkJMgkvKiBBbW91bnQgbmVlZGVkIHRvIGFsaWduIHRoZSBkYXRhIGFmdGVyIGFuIGV0aGVybmV0IGhlYWRlciAqLworI2lmbmRlZglFVEhfTUFYX01UVQorI2RlZmluZQlFVEhfTUFYX01UVQkJKEVUSF9GUkFNRV9MRU4tRVRIX0hMRU4pCisjZW5kaWYKKworI2VuZGlmCS8qIF9JRl9FVEhFUl9IICovCkluZGV4OiBiL25ldGJvb3QvaWdtcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2lnbXAuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmCV9JR01QX0gKKyNkZWZpbmUJX0lHTVBfSAorCisvKiBNYXggaW50ZXJ2YWwgYmV0d2VlbiBJR01QIHBhY2tldHMgKi8KKyNkZWZpbmUgSUdNUF9JTlRFUlZBTAkJCSgxMCpUSUNLU19QRVJfU0VDKQorI2RlZmluZSBJR01QdjFfUk9VVEVSX1BSRVNFTlRfVElNRU9VVAkoNDAwKlRJQ0tTX1BFUl9TRUMpCisKKyNkZWZpbmUgSUdNUF9RVUVSWQkweDExCisjZGVmaW5lIElHTVB2MV9SRVBPUlQJMHgxMgorI2RlZmluZSBJR01QdjJfUkVQT1JUCTB4MTYKKyNkZWZpbmUgSUdNUF9MRUFWRQkweDE3CisjZGVmaW5lIEdST1VQX0FMTF9IT1NUUyAweGUwMDAwMDAxIC8qIDIyNC4wLjAuMSBIb3N0IGJ5dGUgb3JkZXIgKi8KKworc3RydWN0IGlnbXAgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgcmVzcG9uc2VfdGltZTsKKwl1aW50MTZfdCBjaGtzdW07CisJaW5fYWRkciBncm91cDsKK307CisKK3N0cnVjdCBpZ21wX2lwX3QgeyAvKiBGb3JtYXQgb2YgYW4gaWdtcCBpcCBwYWNrZXQgKi8KKwlzdHJ1Y3QgaXBoZHIgaXA7CisJdWludDhfdCByb3V0ZXJfYWxlcnRbNF07IC8qIFJvdXRlciBhbGVydCBvcHRpb24gKi8KKwlzdHJ1Y3QgaWdtcCBpZ21wOworfTsKKworI2VuZGlmCS8qIF9JR01QX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9pbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2luLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZglfSU5fSAorI2RlZmluZQlfSU5fSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKworI2RlZmluZSBJUAkJMHgwODAwCisjZGVmaW5lIEFSUAkJMHgwODA2CisjZGVmaW5lCVJBUlAJCTB4ODAzNQorCisjZGVmaW5lIElQX0lDTVAJCTEKKyNkZWZpbmUgSVBfSUdNUAkJMgorI2RlZmluZSBJUF9VRFAJCTE3CisKKy8qIFNhbWUgYWZ0ZXIgZ29pbmcgdGhyb3VnaCBodG9ubCAqLworI2RlZmluZSBJUF9CUk9BRENBU1QJMHhGRkZGRkZGRgorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJc19hZGRyOworfSBpbl9hZGRyOworCisjZW5kaWYJLyogX0lOX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9pby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2lvLmgKQEAgLTAsMCArMSwyMzkgQEAKKyNpZm5kZWYJSU9fSAorI2RlZmluZSBJT19ICisKKworLyogQW1vdW50IG9mIHJlbG9jYXRpb24gZXRoZXJib290IGlzIGV4cGVyaWVuY2luZyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmlydF9vZmZzZXQ7CisKKy8qIERvbid0IHJlcXVpcmUgaWRlbnRpdHkgbWFwcGVkIHBoeXNpY2FsIG1lbW9yeSwKKyAqIG9zbG9hZGVyLmMgaXMgdGhlIG9ubHkgdmFsaWQgdXNlciBhdCB0aGUgbW9tZW50LgorICovCit1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSBjb25zdCB2b2lkICp2aXJ0X2FkZHIpOwordm9pZCAqcGh5c190b192aXJ0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKTsKKworLyogdmlydF90b19idXMgY29udmVydHMgYW4gYWRkcmVzc3MgaW5zaWRlIG9mIGV0aGVyYm9vdCBbX3N0YXJ0LCBfZW5kXQorICogaW50byBhIG1lbW9yeSBhY2Nlc3MgY2FyZHMgY2FuIHVzZS4KKyAqLworI2RlZmluZSB2aXJ0X3RvX2J1cyB2aXJ0X3RvX3BoeXMKKworCisvKiBidXNfdG9fdmlydCByZXZlcnNlcyB2aXJ0X3RvX2J1cywgdGhlIGFkZHJlc3MgbXVzdCBiZSBvdXRwdXQKKyAqIGZyb20gdmlydF90b19idXMgdG8gYmUgdmFsaWQuICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdvcmsgb24KKyAqIGFsbCBidXMgYWRkcmVzc2VzLgorICovCisjZGVmaW5lIGJ1c190b192aXJ0IHBoeXNfdG9fdmlydAorCisvKiBpb3JlbWFwIGNvbnZlcnRzIGEgcmFuZG9tIDMyYml0IGJ1cyBhZGRyZXNzIGludG8gc29tZXRoaW5nCisgKiBldGhlcmJvb3QgY2FuIGFjY2Vzcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoIF9fdW51c2VkKQoreworCXJldHVybiBidXNfdG9fdmlydChidXNfYWRkcik7Cit9CisKKy8qIGlvdW5tYXAgY2xlYW5zIHVwIGFueXRoaW5nIGlvcmVtYXAgaGFkIHRvIHNldHVwICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcCh2b2lkICp2aXJ0X2FkZHIgX191bnVzZWQpCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHg4NiBJTyBpbnN0cnVjdGlvbnMKKyAqIGluYi9pbncvaW5sL291dGIvb3V0dy9vdXRsIGFuZCB0aGUgInN0cmluZyB2ZXJzaW9ucyIgb2YgdGhlIHNhbWUKKyAqIChpbnNiL2luc3cvaW5zbC9vdXRzYi9vdXRzdy9vdXRzbCkuIFlvdSBjYW4gYWxzbyB1c2UgInBhdXNpbmciCisgKiB2ZXJzaW9ucyBvZiB0aGUgc2luZ2xlLUlPIGluc3RydWN0aW9ucyAoaW5iX3AvaW53X3AvLi4pLgorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgbWVhbnQgdG8gYmUgb2JmdXNjYXRpbmc6IGl0J3MganVzdCBjb21wbGljYXRlZAorICogdG8gKGEpIGhhbmRsZSBpdCBhbGwgaW4gYSB3YXkgdGhhdCBtYWtlcyBnY2MgYWJsZSB0byBvcHRpbWl6ZSBpdAorICogYXMgd2VsbCBhcyBwb3NzaWJsZSBhbmQgKGIpIHRyeWluZyB0byBhdm9pZCB3cml0aW5nIHRoZSBzYW1lIHRoaW5nCisgKiBvdmVyIGFuZCBvdmVyIGFnYWluIHdpdGggc2xpZ2h0IHZhcmlhdGlvbnMgYW5kIHBvc3NpYmx5IG1ha2luZyBhCisgKiBtaXN0YWtlIHNvbWV3aGVyZS4KKyAqLworCisvKgorICogVGhhbmtzIHRvIEphbWVzIHZhbiBBcnRzZGFsZW4gZm9yIGEgYmV0dGVyIHRpbWluZy1maXggdGhhbgorICogdGhlIHR3byBzaG9ydCBqdW1wczogdXNpbmcgb3V0YidzIHRvIGEgbm9uZXhpc3RlbnQgcG9ydCBzZWVtcworICogdG8gZ3VhcmFudGVlIGJldHRlciB0aW1pbmdzIGV2ZW4gb24gZmFzdCBtYWNoaW5lcy4KKyAqCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgSSdkIGxpa2UgdG8gYmUgc3VyZSBvZiBhIG5vbi1leGlzdGVudCBwb3J0OgorICogSSBmZWVsIGEgYml0IHVuc2FmZSBhYm91dCB1c2luZyAweDgwIChzaG91bGQgYmUgc2FmZSwgdGhvdWdoKQorICoKKyAqCQlMaW51cworICovCisKKyNpZmRlZglTTE9XX0lPX0JZX0pVTVBJTkcKKyNkZWZpbmUgX19TTE9XX0RPV05fSU8gX19hc21fXyBfX3ZvbGF0aWxlX18oImptcCAxZlxuMTpcdGptcCAxZlxuMToiKQorI2Vsc2UKKyNkZWZpbmUgX19TTE9XX0RPV05fSU8gX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dGIgJWFsLCQweDgwIikKKyNlbmRpZgorCisjaWZkZWYJUkVBTExZX1NMT1dfSU8KKyNkZWZpbmUgU0xPV19ET1dOX0lPIHsgX19TTE9XX0RPV05fSU87IF9fU0xPV19ET1dOX0lPOyBfX1NMT1dfRE9XTl9JTzsgX19TTE9XX0RPV05fSU87IH0KKyNlbHNlCisjZGVmaW5lIFNMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTworI2VuZGlmCisKKy8qCisgKiByZWFkWC93cml0ZVgoKSBhcmUgdXNlZCB0byBhY2Nlc3MgbWVtb3J5IG1hcHBlZCBkZXZpY2VzLiBPbiBzb21lCisgKiBhcmNoaXRlY3R1cmVzIHRoZSBtZW1vcnkgbWFwcGVkIElPIHN0dWZmIG5lZWRzIHRvIGJlIGFjY2Vzc2VkCisgKiBkaWZmZXJlbnRseS4gT24gdGhlIHg4NiBhcmNoaXRlY3R1cmUsIHdlIGp1c3QgcmVhZC93cml0ZSB0aGUKKyAqIG1lbW9yeSBsb2NhdGlvbiBkaXJlY3RseS4KKyAqLworI2RlZmluZSByZWFkYihhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChhZGRyKSkKKyNkZWZpbmUgcmVhZHcoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKGFkZHIpKQorI2RlZmluZSByZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKQorCisjZGVmaW5lIHdyaXRlYihiLGFkZHIpICgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChhZGRyKSkgPSAoYikpCisjZGVmaW5lIHdyaXRldyhiLGFkZHIpICgoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoYWRkcikpID0gKGIpKQorI2RlZmluZSB3cml0ZWwoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCisKKyNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGIsYykJbWVtY3B5KChhKSwodm9pZCAqKShiKSwoYykpCisjZGVmaW5lIG1lbWNweV90b2lvKGEsYixjKQltZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKKworLyoKKyAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCisgKiBBbmQgeWVzLCB0aGlzIGlzIHJlcXVpcmVkIG9uIFVQIHRvbyB3aGVuIHdlJ3JlIHRhbGtpbmcKKyAqIHRvIGRldmljZXMuCisgKgorICogRm9yIG5vdywgIndtYigpIiBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLCBhcyBhbGwKKyAqIEludGVsIENQVSdzIGZvbGxvdyB3aGF0IEludGVsIGNhbGxzIGEgKlByb2Nlc3NvciBPcmRlciosCisgKiBpbiB3aGljaCBhbGwgd3JpdGVzIGFyZSBzZWVuIGluIHRoZSBwcm9ncmFtIG9yZGVyIGV2ZW4KKyAqIG91dHNpZGUgdGhlIENQVS4KKyAqCisgKiBJIGV4cGVjdCBmdXR1cmUgSW50ZWwgQ1BVJ3MgdG8gaGF2ZSBhIHdlYWtlciBvcmRlcmluZywKKyAqIGJ1dCBJJ2QgYWxzbyBleHBlY3QgdGhlbSB0byBmaW5hbGx5IGdldCB0aGVpciBhY3QgdG9nZXRoZXIKKyAqIGFuZCBhZGQgc29tZSByZWFsIG1lbW9yeSBiYXJyaWVycyBpZiBzby4KKyAqCisgKiBTb21lIG5vbiBpbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCisgKiBub3AgZm9yIHRoZXNlLgorICovCisgCisjZGVmaW5lIG1iKCkgCV9fYXNtX18gX192b2xhdGlsZV9fICgibG9jazsgYWRkbCAkMCwwKCUlZXNwKSI6IDogOiJtZW1vcnkiKQorI2RlZmluZSBybWIoKQltYigpCisjZGVmaW5lIHdtYigpCW1iKCk7CisKKworLyoKKyAqIFRhbGsgYWJvdXQgbWlzdXNpbmcgbWFjcm9zLi4KKyAqLworCisjZGVmaW5lIF9fT1VUMShzLHgpIFwKK2V4dGVybiB2b2lkIF9fb3V0IyNzKHVuc2lnbmVkIHggdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpOyBcCitleHRlcm4gaW5saW5lIHZvaWQgX19vdXQjI3ModW5zaWduZWQgeCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgcG9ydCkgeworCisjZGVmaW5lIF9fT1VUMihzLHMxLHMyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dCIgI3MgIiAlIiBzMSAiMCwlIiBzMiAiMSIKKworI2RlZmluZSBfX09VVChzLHMxLHgpIFwKK19fT1VUMShzLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgfSBcCitfX09VVDEocyMjYyx4KSBfX09VVDIocyxzMSwiIikgOiA6ICJhIiAodmFsdWUpLCAiaWQiIChwb3J0KSk7IH0gXAorX19PVVQxKHMjI19wLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgU0xPV19ET1dOX0lPOyB9IFwKK19fT1VUMShzIyNjX3AseCkgX19PVVQyKHMsczEsIiIpIDogOiAiYSIgKHZhbHVlKSwgImlkIiAocG9ydCkpOyBTTE9XX0RPV05fSU87IH0KKworI2RlZmluZSBfX0lOMShzLHgpIFwKK2V4dGVybiB1bnNpZ25lZCB4IF9faW4jI3ModW5zaWduZWQgc2hvcnQgcG9ydCk7IFwKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgeCBfX2luIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQpIHsgdW5zaWduZWQgeCBfdjsKKworI2RlZmluZSBfX0lOMihzLHMxLHMyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluIiAjcyAiICUiIHMyICIxLCUiIHMxICIwIgorCisjZGVmaW5lIF9fSU4ocyxzMSx4LGkuLi4pIFwKK19fSU4xKHMseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSBcCitfX0lOMShzIyNjLHgpIF9fSU4yKHMsczEsIiIpIDogIj1hIiAoX3YpIDogImlkIiAocG9ydCkgLCMjaSApOyByZXR1cm4gX3Y7IH0gXAorX19JTjEocyMjX3AseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IFNMT1dfRE9XTl9JTzsgcmV0dXJuIF92OyB9IFwKK19fSU4xKHMjI2NfcCx4KSBfX0lOMihzLHMxLCIiKSA6ICI9YSIgKF92KSA6ICJpZCIgKHBvcnQpICwjI2kgKTsgU0xPV19ET1dOX0lPOyByZXR1cm4gX3Y7IH0KKworI2RlZmluZSBfX0lOUyhzKSBcCitleHRlcm4gdm9pZCBpbnMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOyBcCitleHRlcm4gaW5saW5lIHZvaWQgaW5zIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCit7IF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zIiAjcyBcCis6ICI9RCIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9CisKKyNkZWZpbmUgX19PVVRTKHMpIFwKK2V4dGVybiB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgIGNvdW50KTsgXAorZXh0ZXJuIGlubGluZSB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpIFwKK3sgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzIiAjcyBcCis6ICI9UyIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9CisKK19fSU4oYiwiIiwgY2hhcikKK19fSU4odywiIixzaG9ydCkKK19fSU4obCwiIiwgbG9uZykKKworX19PVVQoYiwiYiIsY2hhcikKK19fT1VUKHcsInciLHNob3J0KQorX19PVVQobCwsaW50KQorCitfX0lOUyhiKQorX19JTlModykKK19fSU5TKGwpCisKK19fT1VUUyhiKQorX19PVVRTKHcpCitfX09VVFMobCkKKworLyoKKyAqIE5vdGUgdGhhdCBkdWUgdG8gdGhlIHdheSBfX2J1aWx0aW5fY29uc3RhbnRfcCgpIHdvcmtzLCB5b3UKKyAqICAtIGNhbid0IHVzZSBpdCBpbnNpZGUgYSBpbmxpbmUgZnVuY3Rpb24gKGl0IHdpbGwgbmV2ZXIgYmUgdHJ1ZSkKKyAqICAtIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNpZGUgZWZmZWN0cyB3aXRoaW4gdGhlIF9fYnVpbHRpbi4uCisgKi8KKyNkZWZpbmUgb3V0Yih2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXRiYygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0YigodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGluYihwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2luYmMocG9ydCkgOiBcCisJX19pbmIocG9ydCkpCisKKyNkZWZpbmUgb3V0Yl9wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGJjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dGJfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGluYl9wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5iY19wKHBvcnQpIDogXAorCV9faW5iX3AocG9ydCkpCisKKyNkZWZpbmUgb3V0dyh2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXR3YygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0dygodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGludyhwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2lud2MocG9ydCkgOiBcCisJX19pbncocG9ydCkpCisKKyNkZWZpbmUgb3V0d19wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dHdjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dHdfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlud19wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW53Y19wKHBvcnQpIDogXAorCV9faW53X3AocG9ydCkpCisKKyNkZWZpbmUgb3V0bCh2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXRsYygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0bCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlubChwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2lubGMocG9ydCkgOiBcCisJX19pbmwocG9ydCkpCisKKyNkZWZpbmUgb3V0bF9wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGxjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dGxfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlubF9wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5sY19wKHBvcnQpIDogXAorCV9faW5sX3AocG9ydCkpCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfSU9fSCAqLwpJbmRleDogYi9uZXRib290L2lwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvaXAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmCV9JUF9ICisjZGVmaW5lCV9JUF9ICisKKy8qIFdlIG5lZWQgJ3VpbnQxNl90JyAqLworI2luY2x1ZGUgInR5cGVzLmgiCisvKiBXZSBuZWVkICdpbl9hZGRyJyAqLworI2luY2x1ZGUgImluLmgiCisKK3N0cnVjdCBpcGhkciB7CisJdWludDhfdCAgdmVyaGRybGVuOworCXVpbnQ4X3QgIHNlcnZpY2U7CisJdWludDE2X3QgbGVuOworCXVpbnQxNl90IGlkZW50OworCXVpbnQxNl90IGZyYWdzOworCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICBwcm90b2NvbDsKKwl1aW50MTZfdCBjaGtzdW07CisJaW5fYWRkciBzcmM7CisJaW5fYWRkciBkZXN0OworfTsKKworZXh0ZXJuIHZvaWQgYnVpbGRfaXBfaGRyKHVuc2lnbmVkIGxvbmcgX19kZXN0aXAsIGludCBfX3R0bCwgaW50IF9fcHJvdG9jb2wsIAorCQkJIGludCBfX29wdGlvbl9sZW4sIGludCBfX2xlbiwgY29uc3Qgdm9pZCAqIF9fYnVmKTsKKworZXh0ZXJuIGludCBpcF90cmFuc21pdChpbnQgX19sZW4sIGNvbnN0IHZvaWQgKiBfX2J1Zik7CisKK2V4dGVybiB1aW50MTZfdCBpcGNoa3N1bShjb25zdCB2b2lkICogX19kYXRhLCB1bnNpZ25lZCBsb25nIF9fbGVuZ3RoKTsKKworZXh0ZXJuIHVpbnQxNl90IGFkZF9pcGNoa3N1bXModW5zaWduZWQgbG9uZyBfX29mZnNldCwgdWludDE2X3QgX19zdW0sIAorCQkJICAgICAgdWludDE2X3QgX19uZXcpOworCisKKworCisKKyNlbmRpZgkvKiBfSVBfSCAqLwpJbmRleDogYi9uZXRib290L2lzYS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2lzYS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZiAhZGVmaW5lZChJU0FfSCkgJiYgZGVmaW5lZChDT05GSUdfSVNBKQorI2RlZmluZSBJU0FfSAorCitzdHJ1Y3QgZGV2OworCisjZGVmaW5lIElTQVBOUF9WRU5ET1IoYSxiLGMpCSgoKCgoYSktJ0EnKzEpJjB4M2YpPDwyKXxcCisJCQkJKCgoKGIpLSdBJysxKSYweDE4KT4+Myl8KCgoKGIpLSdBJysxKSY3KTw8MTMpfFwKKwkJCQkoKCgoYyktJ0EnKzEpJjB4MWYpPDw4KSkKKworI2RlZmluZQlHRU5FUklDX0lTQVBOUF9WRU5ET1IJSVNBUE5QX1ZFTkRPUignUCcsJ04nLCdQJykKKworc3RydWN0IGlzYV9kcml2ZXIKK3sKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnByb2JlKShzdHJ1Y3QgZGV2ICosIHVuc2lnbmVkIHNob3J0ICopOworCXVuc2lnbmVkIHNob3J0ICppb2FkZHJzOworfTsKKworI2RlZmluZSBfX2lzYV9kcml2ZXIJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxfX3NlY3Rpb25fXygiLmRyaXZlcnMuaXNhIikpKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpc2FfZHJpdmVyIGlzYV9kcml2ZXJzW107CitleHRlcm4gY29uc3Qgc3RydWN0IGlzYV9kcml2ZXIgaXNhX2RyaXZlcnNfZW5kW107CisKKyNkZWZpbmUgSVNBX1JPTShJTUFHRSwgREVTQ1JJUFRJT04pCisKKyNlbmRpZiAvKiBJU0FfSCAqLworCkluZGV4OiBiL25ldGJvb3QvbGFuY2UuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvbGFuY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi1MQU5DRSBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKLUxhcmdlIHBvcnRpb25zIGJvcnJvd2VkIGZyb20gdGhlIExpbnV4IExBTkNFIGRyaXZlciBieSBEb25hbGQgQmVja2VyCi1LZW4gWWFwLCBKdWx5IDE5OTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0vKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLwotI2luY2x1ZGUgIm5pYy5oIgotI2lmZGVmCUlOQ0xVREVfTEFOQ0UKLSNpbmNsdWRlICJwY2kuaCIKLSNlbmRpZgotI2luY2x1ZGUgImNhcmRzLmgiCi0KLS8qIE9mZnNldHMgZnJvbSBiYXNlIEkvTyBhZGRyZXNzICovCi0jaWYJZGVmaW5lZChJTkNMVURFX05FMjEwMCkgfHwgZGVmaW5lZChJTkNMVURFX0xBTkNFKQotI2RlZmluZQlMQU5DRV9FVEhfQUREUgkweDAKLSNkZWZpbmUJTEFOQ0VfREFUQQkweDEwCi0jZGVmaW5lCUxBTkNFX0FERFIJMHgxMgotI2RlZmluZQlMQU5DRV9SRVNFVAkweDE0Ci0jZGVmaW5lCUxBTkNFX0JVU19JRgkweDE2Ci0jZGVmaW5lCUxBTkNFX1RPVEFMX1NJWkUJMHgxOAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9OSTY1MTAKLSNkZWZpbmUJTEFOQ0VfRVRIX0FERFIJMHg4Ci0jZGVmaW5lCUxBTkNFX0RBVEEJMHgwCi0jZGVmaW5lCUxBTkNFX0FERFIJMHgyCi0jZGVmaW5lCUxBTkNFX1JFU0VUCTB4NAotI2RlZmluZQlMQU5DRV9CVVNfSUYJMHg2Ci0jZGVmaW5lCUxBTkNFX1RPVEFMX1NJWkUJMHgxMAotI2VuZGlmCi0KLS8qIGxhbmNlX3BvbGwoKSBub3cgY2FuIHVzZSBtdWx0aXBsZSBSeCBidWZmZXJzIHRvIHByZXZlbnQgcGFja2V0IGxvc3MuIFNldAotICogU2V0IExBTkNFX0xPR19SWF9CVUZGRVJTIHRvIDAuLjcgZm9yIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQgb3IgMTI4IFJ4Ci0gKiBidWZmZXJzLiBVc3VhbGx5IDQgKD0xNiBSeCBidWZmZXJzKSBpcyBhIGdvb2QgdmFsdWUuIChBbmRyZWFzIE5ldWhhdXMpCi0gKiBEZWNyZWFzZWQgdG8gMiAoPTQgUnggYnVmZmVycykgKEtlbiBZYXAsIDIwMDEwMzA1KSAqLwotCi0jZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTCTIJCS8qIFVzZSAyXjI9NCBSeCBidWZmZXJzICovCi0KLSNkZWZpbmUgUlhfUklOR19TSVpFCQkoMSA8PCAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMpKQotI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLCShSWF9SSU5HX1NJWkUgLSAxKQotI2RlZmluZSBSWF9SSU5HX0xFTl9CSVRTCSgoTEFOQ0VfTE9HX1JYX0JVRkZFUlMpIDw8IDI5KQotCi1zdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jawotewotCXVuc2lnbmVkIHNob3J0CW1vZGU7Ci0JdW5zaWduZWQgY2hhcglwaHlzX2FkZHJbRVRIX0FMRU5dOwotCXVuc2lnbmVkIGxvbmcJZmlsdGVyWzJdOwotCUFkZHJlc3MJCXJ4X3Jpbmc7Ci0JQWRkcmVzcwkJdHhfcmluZzsKLX07Ci0KLXN0cnVjdCBsYW5jZV9yeF9oZWFkCi17Ci0JdW5pb24gewotCQlBZGRyZXNzCQliYXNlOwotCQl1bnNpZ25lZCBjaGFyCWFkZHJbNF07Ci0JfSB1OwotCXNob3J0CQlidWZfbGVuZ3RoOwkvKiAycyBjb21wbGVtZW50ICovCi0Jc2hvcnQJCW1zZ19sZW5ndGg7Ci19OwotCi1zdHJ1Y3QgbGFuY2VfdHhfaGVhZAotewotCXVuaW9uIHsKLQkJQWRkcmVzcwkJYmFzZTsKLQkJdW5zaWduZWQgY2hhcglhZGRyWzRdOwotCX0gdTsKLQlzaG9ydAkJYnVmX2xlbmd0aDsJLyogMnMgY29tcGxlbWVudCAqLwotCXNob3J0CQltaXNjOwotfTsKLQotc3RydWN0IGxhbmNlX2ludGVyZmFjZQotewotCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrCWluaXRfYmxvY2s7Ci0Jc3RydWN0IGxhbmNlX3J4X2hlYWQJcnhfcmluZ1tSWF9SSU5HX1NJWkVdOwotCXN0cnVjdCBsYW5jZV90eF9oZWFkCXR4X3Jpbmc7Ci0JdW5zaWduZWQgY2hhcgkJcmJ1ZltSWF9SSU5HX1NJWkVdW0VUSF9GUkFNRV9MRU4rNF07Ci0JdW5zaWduZWQgY2hhcgkJdGJ1ZltFVEhfRlJBTUVfTEVOXTsKLQkvKgotCSAqIERvIG5vdCBhbHRlciB0aGUgb3JkZXIgb2YgdGhlIHN0cnVjdCBtZW1iZXJzIGFib3ZlOwotCSAqIHRoZSBoYXJkd2FyZSBkZXBlbmRzIG9uIHRoZSBjb3JyZWN0IGFsaWdubWVudC4KLQkgKi8KLQlpbnQJCQlyeF9pZHg7Ci19OwotCi0jZGVmaW5lCUxBTkNFX01VU1RfUEFECQkweDAwMDAwMDAxCi0jZGVmaW5lCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUCTB4MDAwMDAwMDIKLSNkZWZpbmUJTEFOQ0VfU0VMRUNUX1BIT05FTElORQkweDAwMDAwMDA0Ci0jZGVmaW5lCUxBTkNFX01VU1RfVU5SRVNFVAkweDAwMDAwMDA4Ci0KLS8qIEEgbWFwcGluZyBmcm9tIHRoZSBjaGlwIElEIG51bWJlciB0byB0aGUgcGFydCBudW1iZXIgYW5kIGZlYXR1cmVzLgotICAgVGhlc2UgYXJlIGZyb20gdGhlIGRhdGFzaGVldHMgLS0gaW4gcmVhbCBsaWZlIHRoZSAnOTcwIHZlcnNpb24KLSAgIHJlcG9ydGVkbHkgaGFzIHRoZSBzYW1lIElEIGFzIHRoZSAnOTY1LiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBsYW5jZV9jaGlwX3R5cGUKLXsKLQlpbnQJaWRfbnVtYmVyOwotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JaW50CWZsYWdzOwotfSBjaGlwX3RhYmxlW10gPSB7Ci0JezB4MDAwMCwgIkxBTkNFIDc5OTAiLAkJCS8qIEFuY2llbnQgbGFuY2UgY2hpcC4gICovCi0JCUxBTkNFX01VU1RfUEFEICsgTEFOQ0VfTVVTVF9VTlJFU0VUfSwKLQl7MHgwMDAzLCAiUENuZXQvSVNBIDc5Qzk2MCIsCQkvKiA3OUM5NjAgUENuZXQvSVNBLiAgKi8KLQkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotCXsweDIyNjAsICJQQ25ldC9JU0ErIDc5Qzk2MSIsCQkvKiA3OUM5NjEgUENuZXQvSVNBKywgUGx1Zy1uLVBsYXkuICAqLwotCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVH0sCi0JezB4MjQyMCwgIlBDbmV0L1BDSSA3OUM5NzAiLAkJLyogNzlDOTcwIG9yIDc5Qzk3NCBQQ25ldC1TQ1NJLCBQQ0kuICovCi0JCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKLQkvKiBCdWc6IHRoZSBQQ25ldC9QQ0kgYWN0dWFsbHkgdXNlcyB0aGUgUENuZXQvVkxCIElEIG51bWJlciwgc28ganVzdCBjYWxsCi0JCWl0IHRoZSBQQ25ldDMyLiAqLwotCXsweDI0MzAsICJQQ25ldDMyIiwJCQkvKiA3OUM5NjUgUENuZXQgZm9yIFZMIGJ1cy4gKi8KLQkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotICAgICAgICB7MHgyNjIxLCAiUENuZXQvUENJLUlJIDc5Qzk3MEEiLCAgICAgICAgLyogNzlDOTcwQSBQQ0luZXRQQ0kgSUkuICovCi0gICAgICAgICAgICAgICAgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotCXsweDI2MjUsICJQQ25ldC1GQVNUIElJSSA3OUM5NzMiLAkvKiA3OUM5NzMgUENJbmV0LUZBU1QgSUlJLiAqLwotCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVH0sCi0gICAgICAgIHsweDI2MjYsICJQQ25ldC9Ib21lUE5BIDc5Qzk3OCIsICAgICAgICAKLSAgICAgICAgICAgICAgICBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVHxMQU5DRV9TRUxFQ1RfUEhPTkVMSU5FfSwKLQl7MHgwLCAiUENuZXQgKHVua25vd24pIiwKLQkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotfTsKLQotLyogRGVmaW5lIGEgbWFjcm8gZm9yIGNvbnZlcnRpbmcgcHJvZ3JhbSBhZGRyZXNzZXMgdG8gcmVhbCBhZGRyZXNzZXMgKi8KLSN1bmRlZgl2aXJ0X3RvX2J1cwotI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkJKCh1bnNpZ25lZCBsb25nKXgpCi0KLXN0YXRpYyBpbnQJCQljaGlwX3ZlcnNpb247Ci1zdGF0aWMgaW50CQkJbGFuY2VfdmVyc2lvbjsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAkJaW9hZGRyOwotI2lmbmRlZglJTkNMVURFX0xBTkNFCi1zdGF0aWMgaW50CQkJZG1hOwotI2VuZGlmCi1zdGF0aWMgc3RydWN0IGxhbmNlX2ludGVyZmFjZQkqbHA7Ci0KLS8qIGFkZGl0aW9uYWwgOCBieXRlcyBmb3IgOC1ieXRlIGFsaWdubWVudCBzcGFjZSAqLwotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIGxhbmNlICgoY2hhciAqKTB4MTAwMDAgLSAoc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbnRlcmZhY2UpKzgpKQotI2Vsc2UKLXN0YXRpYyBjaGFyCQkJbGFuY2Vbc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbnRlcmZhY2UpKzhdOwotI2VuZGlmCi0KLSNpZm5kZWYJSU5DTFVERV9MQU5DRQotLyogRE1BIGRlZmluZXMgYW5kIGhlbHBlciByb3V0aW5lcyAqLwotCi0vKiBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BMV9DTURfUkVHCQkweDA4CS8qIGNvbW1hbmQgcmVnaXN0ZXIgKHcpICovCi0jZGVmaW5lIERNQTFfU1RBVF9SRUcJCTB4MDgJLyogc3RhdHVzIHJlZ2lzdGVyIChyKSAqLwotI2RlZmluZSBETUExX1JFUV9SRUcgICAgICAgICAgICAweDA5ICAgIC8qIHJlcXVlc3QgcmVnaXN0ZXIgKHcpICovCi0jZGVmaW5lIERNQTFfTUFTS19SRUcJCTB4MEEJLyogc2luZ2xlLWNoYW5uZWwgbWFzayAodykgKi8KLSNkZWZpbmUgRE1BMV9NT0RFX1JFRwkJMHgwQgkvKiBtb2RlIHJlZ2lzdGVyICh3KSAqLwotI2RlZmluZSBETUExX0NMRUFSX0ZGX1JFRwkweDBDCS8qIGNsZWFyIHBvaW50ZXIgZmxpcC1mbG9wICh3KSAqLwotI2RlZmluZSBETUExX1RFTVBfUkVHICAgICAgICAgICAweDBEICAgIC8qIFRlbXBvcmFyeSBSZWdpc3RlciAocikgKi8KLSNkZWZpbmUgRE1BMV9SRVNFVF9SRUcJCTB4MEQJLyogTWFzdGVyIENsZWFyICh3KSAqLwotI2RlZmluZSBETUExX0NMUl9NQVNLX1JFRyAgICAgICAweDBFICAgIC8qIENsZWFyIE1hc2sgKi8KLSNkZWZpbmUgRE1BMV9NQVNLX0FMTF9SRUcgICAgICAgMHgwRiAgICAvKiBhbGwtY2hhbm5lbHMgbWFzayAodykgKi8KLQotI2RlZmluZSBETUEyX0NNRF9SRUcJCTB4RDAJLyogY29tbWFuZCByZWdpc3RlciAodykgKi8KLSNkZWZpbmUgRE1BMl9TVEFUX1JFRwkJMHhEMAkvKiBzdGF0dXMgcmVnaXN0ZXIgKHIpICovCi0jZGVmaW5lIERNQTJfUkVRX1JFRyAgICAgICAgICAgIDB4RDIgICAgLyogcmVxdWVzdCByZWdpc3RlciAodykgKi8KLSNkZWZpbmUgRE1BMl9NQVNLX1JFRwkJMHhENAkvKiBzaW5nbGUtY2hhbm5lbCBtYXNrICh3KSAqLwotI2RlZmluZSBETUEyX01PREVfUkVHCQkweEQ2CS8qIG1vZGUgcmVnaXN0ZXIgKHcpICovCi0jZGVmaW5lIERNQTJfQ0xFQVJfRkZfUkVHCTB4RDgJLyogY2xlYXIgcG9pbnRlciBmbGlwLWZsb3AgKHcpICovCi0jZGVmaW5lIERNQTJfVEVNUF9SRUcgICAgICAgICAgIDB4REEgICAgLyogVGVtcG9yYXJ5IFJlZ2lzdGVyIChyKSAqLwotI2RlZmluZSBETUEyX1JFU0VUX1JFRwkJMHhEQQkvKiBNYXN0ZXIgQ2xlYXIgKHcpICovCi0jZGVmaW5lIERNQTJfQ0xSX01BU0tfUkVHICAgICAgIDB4REMgICAgLyogQ2xlYXIgTWFzayAqLwotI2RlZmluZSBETUEyX01BU0tfQUxMX1JFRyAgICAgICAweERFICAgIC8qIGFsbC1jaGFubmVscyBtYXNrICh3KSAqLwotCi0KLSNkZWZpbmUgRE1BX01PREVfUkVBRAkweDQ0CS8qIEkvTyB0byBtZW1vcnksIG5vIGF1dG9pbml0LCBpbmNyZW1lbnQsIHNpbmdsZSBtb2RlICovCi0jZGVmaW5lIERNQV9NT0RFX1dSSVRFCTB4NDgJLyogbWVtb3J5IHRvIEkvTywgbm8gYXV0b2luaXQsIGluY3JlbWVudCwgc2luZ2xlIG1vZGUgKi8KLSNkZWZpbmUgRE1BX01PREVfQ0FTQ0FERSAweEMwICAgLyogcGFzcyB0aHJ1IERSRVEtPkhSUSwgREFDSzwtSExEQSBvbmx5ICovCi0KLS8qIGVuYWJsZS9kaXNhYmxlIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQotewotCWlmIChkbWFuciA8PSAzKQotCQlvdXRiX3AoZG1hbnIsIERNQTFfTUFTS19SRUcpOwotCWVsc2UKLQkJb3V0Yl9wKGRtYW5yICYgMywgRE1BMl9NQVNLX1JFRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKLXsKLQlpZiAoZG1hbnIgPD0gMykKLQkJb3V0Yl9wKGRtYW5yIHwgNCwgRE1BMV9NQVNLX1JFRyk7Ci0JZWxzZQotCQlvdXRiX3AoKGRtYW5yICYgMykgfCA0LCBETUEyX01BU0tfUkVHKTsKLX0KLQotLyogc2V0IG1vZGUgKGFib3ZlKSBmb3IgYSBzcGVjaWZpYyBETUEgY2hhbm5lbCAqLwotc3RhdGljIHZvaWQgc2V0X2RtYV9tb2RlKHVuc2lnbmVkIGludCBkbWFuciwgY2hhciBtb2RlKQotewotCWlmIChkbWFuciA8PSAzKQotCQlvdXRiX3AobW9kZSB8IGRtYW5yLCBETUExX01PREVfUkVHKTsKLQllbHNlCi0JCW91dGJfcChtb2RlIHwgKGRtYW5yJjMpLCBETUEyX01PREVfUkVHKTsKLX0KLSNlbmRpZgkvKiAhSU5DTFVERV9MQU5DRSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFU0VUIC0gUmVzZXQgYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbGFuY2VfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJaTsKLQlBZGRyZXNzCQlsOwotCi0JLyogUmVzZXQgdGhlIExBTkNFICovCi0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9SRVNFVCk7Ci0JLyogVW4tUmVzZXQgdGhlIExBTkNFLCBuZWVkZWQgb25seSBmb3IgdGhlIE5FMjEwMCAqLwotCWlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfTVVTVF9VTlJFU0VUKQotCQlvdXR3KDAsIGlvYWRkcitMQU5DRV9SRVNFVCk7Ci0JaWYgKGNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCkKLQl7Ci0JCS8qIFRoaXMgaXMgNzlDOTYwIHNwZWNpZmljOyBUdXJuIG9uIGF1dG8tc2VsZWN0IG9mIG1lZGlhCi0JCSAgIChBVUksIEJOQykuICovCi0JCW91dHcoMHgyLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JCS8qIERvbid0IHRvdWNoIDEwYmFzZTIgcG93ZXIgYml0LiAqLwotCQlvdXR3KGludyhpb2FkZHIrTEFOQ0VfQlVTX0lGKSB8IDB4MiwgaW9hZGRyK0xBTkNFX0JVU19JRik7Ci0JfQotCS8qIEhvbWVQTkEgY2FyZHMgbmVlZCB0byBleHBsaWNpdGx5IHBpY2sgdGhlIHBob25lbGluZSBpbnRlcmZhY2UuCi0JICogU29tZSBvZiB0aGVzZSBjYXJkcyBoYXZlIGV0aGVybmV0IGludGVyZmFjZXMgYXMgd2VsbCwgdGhpcwotCSAqIGNvZGUgbWlnaHQgcmVxdWlyZSBzb21lIG1vZGlmaWNhdGlvbiBmb3IgdGhvc2UuCi0gIAkgKi8KLSAgICAgICAgaWYgKGNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9TRUxFQ1RfUEhPTkVMSU5FKSB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgbWVkaWEsIGNoZWNrIDsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHNwZWNpZmljIHRvIEhvbWVQTkEgY2FyZHMuLi4gKi8KLSAgICAgICAgICAgICAgICBvdXR3KDQ5LCBpb2FkZHIrMHgxMikgOwotICAgICAgICAgICAgICAgIG1lZGlhID0gaW53KGlvYWRkcisweDE2KSA7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgICAgICAgICBwcmludGYoIm1lZGlhIHdhcyAlZFxuIiwgbWVkaWEpIDsKLSNlbmRpZgotICAgICAgICAgICAgICAgIG1lZGlhICY9IH4zIDsKLSAgICAgICAgICAgICAgICBtZWRpYSB8PSAxIDsKLSNpZmRlZiBERUJVRwotICAgICAgICAgICAgICAgIHByaW50ZigibWVkaWEgY2hhbmdlZCB0byAlZFxuIiwgbWVkaWEpIDsKLSNlbmRpZgotICAgICAgICAgICAgICAgIG1lZGlhICY9IH4zIDsKLSAgICAgICAgICAgICAgICBtZWRpYSB8PSAxIDsKLSAgICAgICAgICAgICAgICBvdXR3KDQ5LCBpb2FkZHIrMHgxMikgOwotICAgICAgICAgICAgICAgIG91dHcobWVkaWEsIGlvYWRkcisweDE2KSA7Ci0gICAgICAgICAgICAgICAgb3V0dyg0OSwgaW9hZGRyKzB4MTIpIDsKLSAgICAgICAgICAgICAgICBjaGVjayA9IGludyhpb2FkZHIrMHgxNikgOwotI2lmZGVmIERFQlVHCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJjaGVjayAlcywgbWVkaWEgd2FzIHNldCBwcm9wZXJseVxuIiwgCi0JCQljaGVjayA9PSAgbWVkaWEgPyAicGFzc2VkIiA6ICJGQUlMRUQiICkgOyAKLSNlbmRpZgotCX0KLSAKLQkvKiBSZS1pbml0aWFsaXNlIHRoZSBMQU5DRSwgYW5kIHN0YXJ0IGl0IHdoZW4gZG9uZS4gKi8KLQkvKiBTZXQgc3RhdGlvbiBhZGRyZXNzICovCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyArK2kpCi0JCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOwotCS8qIFByZXNldCB0aGUgcmVjZWl2ZSByaW5nIGhlYWRlcnMgKi8KLQlmb3IgKGk9MDsgaTxSWF9SSU5HX1NJWkU7IGkrKykgewotCQlscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gLUVUSF9GUkFNRV9MRU4tNDsKLQkJLyogT1dOICovCi0JCWxwLT5yeF9yaW5nW2ldLnUuYmFzZSA9IHZpcnRfdG9fYnVzKGxwLT5yYnVmW2ldKSAmIDB4ZmZmZmZmOwotCQkvKiB3ZSBzZXQgdGhlIHRvcCBieXRlIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgKi8KLQkJbHAtPnJ4X3JpbmdbaV0udS5hZGRyWzNdID0gMHg4MDsKLQl9Ci0JbHAtPnJ4X2lkeCA9IDA7Ci0JbHAtPmluaXRfYmxvY2subW9kZSA9IDB4MDsJLyogZW5hYmxlIFJ4IGFuZCBUeCAqLwotCWwgPSAoQWRkcmVzcyl2aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spOwotCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KChzaG9ydClsLCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci0Jb3V0dygweDIsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCW91dHcoKHNob3J0KShsID4+IDE2KSwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHg0LCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4OTE1LCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci0Jb3V0dygweDAsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCW91dHcoMHg0LCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBzdG9wICovCi0Jb3V0dygweDEsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIGluaXQgKi8KLQlmb3IgKGkgPSAxMDAwMDsgaSA+IDA7IC0taSkKLQkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDEwMCkKLQkJCWJyZWFrOwotI2lmZGVmCURFQlVHCi0JaWYgKGkgPD0gMCkKLQkJcHJpbnRmKCJJbml0IHRpbWVkIG91dFxuIik7Ci0jZW5kaWYKLQkvKiBBcHBhcmVudGx5IGNsZWFyaW5nIHRoZSBJbml0RG9uZSBiaXQgaGVyZSB0cmlnZ2VycyBhIGJ1ZwotCSAgIGluIHRoZSAnOTc0LiAoTWFyayBTdG9ja3RvbikgKi8KLQlvdXR3KDB4MiwgaW9hZGRyK0xBTkNFX0RBVEEpOwkJLyogc3RhcnQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBsYW5jZV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCXN0YXR1czsKLQotCXN0YXR1cyA9IGxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLnUuYmFzZSA+PiAyNDsKLQlpZiAoc3RhdHVzICYgMHg4MCkKLQkJcmV0dXJuICgwKTsKLSNpZmRlZglERUJVRwotCXByaW50ZigiTEFOQ0UgcGFja2V0IHJlY2VpdmVkIHJ4X3JpbmcudS5iYXNlICVYIG1jbnQgJWhYIGNzcjAgJWhYXG4iLAotCQlscC0+cnhfcmluZ1tscC0+cnhfaWR4XS51LmJhc2UsIGxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLm1zZ19sZW5ndGgsCi0JCWludyhpb2FkZHIrTEFOQ0VfREFUQSkpOwotI2VuZGlmCi0JaWYgKHN0YXR1cyA9PSAweDMpCi0JCW1lbWNweShuaWMtPnBhY2tldCwgbHAtPnJidWZbbHAtPnJ4X2lkeF0sIG5pYy0+cGFja2V0bGVuID0gbHAtPnJ4X3JpbmdbbHAtPnJ4X2lkeF0ubXNnX2xlbmd0aCk7Ci0JLyogQW5kcmV3IEJveWQgb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzc2NQotCSAgIGNsZWFyIHRoZSBidWZmZXIgbGVuZ3RoICovCi0JbHAtPnJ4X3JpbmdbbHAtPnJ4X2lkeF0uYnVmX2xlbmd0aCA9IC1FVEhfRlJBTUVfTEVOLTQ7Ci0JbHAtPnJ4X3JpbmdbbHAtPnJ4X2lkeF0udS5hZGRyWzNdIHw9IDB4ODA7CS8qIHByaW1lIGZvciBuZXh0IHJlY2VpdmUgKi8KLQotCS8qIEknbSBub3Qgc3VyZSBpZiB0aGUgZm9sbG93aW5nIGlzIHN0aWxsIG9rIHdpdGggbXVsdGlwbGUgUnggYnVmZmVycywgYnV0IGl0IHdvcmtzICovCi0Jb3V0dygweDAsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCW91dHcoMHg1MDAsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIGNsZWFyIHJlY2VpdmUgKyBJbml0RG9uZSAqLwotCi0JLyogU3dpdGNoIHRvIHRoZSBuZXh0IFJ4IHJpbmcgYnVmZmVyICovCi0JbHAtPnJ4X2lkeCA9IChscC0+cnhfaWR4ICsgMSkgJiBSWF9SSU5HX01PRF9NQVNLOwotCi0JcmV0dXJuIChzdGF0dXMgPT0gMHgzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGxhbmNlX3RyYW5zbWl0KAotCXN0cnVjdCBuaWMgKm5pYywKLQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwotCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCXVuc2lnbmVkIGxvbmcJCXRpbWU7Ci0KLQkvKiBjb3B5IHRoZSBwYWNrZXQgdG8gcmluZyBidWZmZXIgKi8KLQltZW1jcHkobHAtPnRidWYsIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCi0JbWVtY3B5KCZscC0+dGJ1ZltFVEhfQUxFTl0sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotCWxwLT50YnVmW0VUSF9BTEVOK0VUSF9BTEVOXSA9IHQgPj4gODsJLyogdHlwZSAqLwotCWxwLT50YnVmW0VUSF9BTEVOK0VUSF9BTEVOKzFdID0gdDsJLyogdHlwZSAqLwotCW1lbWNweSgmbHAtPnRidWZbRVRIX0hMRU5dLCBwLCBzKTsKLQlzICs9IEVUSF9ITEVOOwotCWlmIChjaGlwX3RhYmxlW2NoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9NVVNUX1BBRCkKLQkJd2hpbGUgKHMgPCBFVEhfWkxFTikJLyogcGFkIHRvIG1pbiBsZW5ndGggKi8KLQkJCWxwLT50YnVmW3MrK10gPSAwOwotCWxwLT50eF9yaW5nLmJ1Zl9sZW5ndGggPSAtczsKLQlscC0+dHhfcmluZy5taXNjID0gMHgwOwotCS8qIE9XTiwgU1RQLCBFTlAgKi8KLQlscC0+dHhfcmluZy51LmJhc2UgPSB2aXJ0X3RvX2J1cyhscC0+dGJ1ZikgJiAweGZmZmZmZjsKLQkvKiB3ZSBzZXQgdGhlIHRvcCBieXRlIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgKi8KLQlscC0+dHhfcmluZy51LmFkZHJbM10gPSAweDgzOwotCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbCAqLwotCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsJLyogYXMgaW4gdGhlIGRhdGFzaGVldHMuLi4gKi8KLQkvKiBLbGF1cyBFc3BlbmxhdWI6IHRoZSB2YWx1ZSBiZWxvdyB3YXMgMHg0OCwgYnV0IHRoYXQgZW5hYmxlZCB0aGUKLQkgKiBpbnRlcnJ1cHQgbGluZSwgY2F1c2luZyBhIGhhbmcgaWYgZm9yIHNvbWUgcmVhc29uZSB0aGUgaW50ZXJydXB0Ci0JICogY29udHJvbGxlciBoYWQgdGhlIExBTkNFIGludGVycnVwdCBlbmFibGVkLiAgSSBoYXZlIG5vIGlkZWEgd2h5Ci0JICogbm9ib2R5IHJhbiBpbnRvIHRoaXMgYmVmb3JlLi4uICAqLwotCW91dHcoMHgwOCwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRlICovCi0JdGltZSA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsJCS8qIHdhaXQgb25lIHNlY29uZCAqLwotCXdoaWxlIChjdXJydGlja3MoKSA8IHRpbWUgJiYgKGxwLT50eF9yaW5nLnUuYmFzZSAmIDB4ODAwMDAwMDApICE9IDApCi0JCTsKLQlpZiAoKGxwLT50eF9yaW5nLnUuYmFzZSAmIDB4ODAwMDAwMDApICE9IDApCi0JCXByaW50ZigiTEFOQ0UgdGltZWQgb3V0IG9uIHRyYW5zbWl0XG4iKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCW91dHcoMHgyMDAsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIGNsZWFyIHRyYW5zbWl0ICsgSW5pdERvbmUgKi8KLSNpZmRlZglERUJVRwotCXByaW50ZigidHhfcmluZy51LmJhc2UgJVggdHhfcmluZy5idWZfbGVuZ3RoICVoWCB0eF9yaW5nLm1pc2MgJWhYIGNzcjAgJWhYXG4iLAotCQlscC0+dHhfcmluZy51LmJhc2UsIGxwLT50eF9yaW5nLmJ1Zl9sZW5ndGgsIGxwLT50eF9yaW5nLm1pc2MsCi0JCWludyhpb2FkZHIrTEFOQ0VfREFUQSkpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGxhbmNlX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOwotCWlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfTVVTVF9VTlJFU0VUKQotCQlvdXR3KDAsIGlvYWRkcitMQU5DRV9SRVNFVCk7Ci0KLQlvdXR3KDAsIGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4MDAwNCwgaW9hZGRyK0xBTkNFX0RBVEEpOwkvKiBzdG9wIHRoZSBMQU5DRSAqLwotCi0jaWZuZGVmCUlOQ0xVREVfTEFOQ0UKLQlkaXNhYmxlX2RtYShkbWEpOwotI2VuZGlmCi19Ci0KLSNpZmRlZglJTkNMVURFX0xBTkNFCi1zdGF0aWMgaW50IGxhbmNlX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCi0jZWxzZQotc3RhdGljIGludCBsYW5jZV9wcm9iZTEoc3RydWN0IG5pYyAqbmljKQotI2VuZGlmCi17Ci0JaW50CQkJcmVzZXRfdmFsIDsKLQl1bnNpZ25lZCBpbnQJCWk7Ci0JQWRkcmVzcwkJCWw7Ci0Jc2hvcnQJCQlkbWFfY2hhbm5lbHM7Ci0jaWZuZGVmCUlOQ0xVREVfTEFOQ0UKLQlzdGF0aWMgY29uc3QgY2hhcglkbWFzW10gPSB7IDUsIDYsIDcsIDMgfTsKLSNlbmRpZgotCi0JcmVzZXRfdmFsID0gaW53KGlvYWRkcitMQU5DRV9SRVNFVCk7Ci0Jb3V0dyhyZXNldF92YWwsIGlvYWRkcitMQU5DRV9SRVNFVCk7Ci0jaWYJMSAgLyogS2xhdXMgRXNwZW5sYXViIC0tIHdhcyAjaWZkZWYJSU5DTFVERV9ORTIxMDAqLwotCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7CS8qIFN3aXRjaCB0byB3aW5kb3cgMCAqLwotCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICE9IDB4NCkKLQkJcmV0dXJuICgtMSk7Ci0jZW5kaWYKLQlvdXR3KDg4LCBpb2FkZHIrTEFOQ0VfQUREUik7CS8qIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY2hpcCAqLwotCWlmIChpbncoaW9hZGRyK0xBTkNFX0FERFIpICE9IDg4KQotCQlsYW5jZV92ZXJzaW9uID0gMDsKLQllbHNlCi0JewotCQljaGlwX3ZlcnNpb24gPSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpOwotCQlvdXR3KDg5LCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JCWNoaXBfdmVyc2lvbiB8PSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpIDw8IDE2OwotCQlpZiAoKGNoaXBfdmVyc2lvbiAmIDB4ZmZmKSAhPSAweDMpCi0JCQlyZXR1cm4gKC0xKTsKLQkJY2hpcF92ZXJzaW9uID0gKGNoaXBfdmVyc2lvbiA+PiAxMikgJiAweGZmZmY7Ci0JCWZvciAobGFuY2VfdmVyc2lvbiA9IDE7IGNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0uaWRfbnVtYmVyICE9IDA7ICsrbGFuY2VfdmVyc2lvbikKLQkJCWlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmlkX251bWJlciA9PSBjaGlwX3ZlcnNpb24pCi0JCQkJYnJlYWs7Ci0JfQotCS8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZSBpcyA4LWJ5dGUgYWxpZ25lZCAqLwotCWwgPSAoKEFkZHJlc3MpbGFuY2UgKyA3KSAmIH43OwotCWxwID0gKHN0cnVjdCBsYW5jZV9pbnRlcmZhY2UgKilsOwotCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDM7CS8qIGRpc2FibGUgUnggYW5kIFR4ICovCi0JbHAtPmluaXRfYmxvY2suZmlsdGVyWzBdID0gbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMHgwOwotCS8qIHVzaW5nIG11bHRpcGxlIFJ4IGJ1ZmZlciBhbmQgYSBzaW5nbGUgVHggYnVmZmVyICovCi0JbHAtPmluaXRfYmxvY2sucnhfcmluZyA9ICh2aXJ0X3RvX2J1cygmbHAtPnJ4X3JpbmcpICYgMHhmZmZmZmYpIHwgUlhfUklOR19MRU5fQklUUzsKLQlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gdmlydF90b19idXMoJmxwLT50eF9yaW5nKSAmIDB4ZmZmZmZmOwotCWwgPSB2aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spOwotCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KCh1bnNpZ25lZCBzaG9ydClsLCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci0Jb3V0dygweDIsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCW91dHcoKHVuc2lnbmVkIHNob3J0KShsID4+IDE2KSwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHg0LCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4OTE1LCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci0Jb3V0dygweDAsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX0FERFIpOwotCS8qIEdldCBzdGF0aW9uIGFkZHJlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkgewotCQluaWMtPm5vZGVfYWRkcltpXSA9IGluYihpb2FkZHIrTEFOQ0VfRVRIX0FERFIraSk7Ci0JfQotI2lmbmRlZglJTkNMVURFX0xBTkNFCi0JLyogbm93IHByb2JlIGZvciBETUEgY2hhbm5lbCAqLwotCWRtYV9jaGFubmVscyA9ICgoaW5iKERNQTFfU1RBVF9SRUcpID4+IDQpICYgMHhmKSB8Ci0JCShpbmIoRE1BMl9TVEFUX1JFRykgJiAweGYwKTsKLQkvKiBuZWVkIHRvIGZpeCB3aGVuIFBDSSBwcm92aWRlcyBETUEgaW5mbyAqLwotCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGRtYXMpL3NpemVvZihkbWFzWzBdKSk7ICsraSkKLQl7Ci0JCWludAkJajsKLQotCQlkbWEgPSBkbWFzW2ldOwotCQkvKiBEb24ndCBlbmFibGUgYSBwZXJtYW5lbnRseSBidXN5IERNQSBjaGFubmVsLAotCQkgICBvciB0aGUgbWFjaGluZSB3aWxsIGhhbmcgKi8KLQkJaWYgKGRtYV9jaGFubmVscyAmICgxIDw8IGRtYSkpCi0JCQljb250aW51ZTsKLQkJb3V0dygweDdmMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsJLyogY2xlYXIgbWVtb3J5IGVycm9yIGJpdHMgKi8KLQkJc2V0X2RtYV9tb2RlKGRtYSwgRE1BX01PREVfQ0FTQ0FERSk7Ci0JCWVuYWJsZV9kbWEoZG1hKTsKLQkJb3V0dygweDEsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIGluaXQgKi8KLQkJZm9yIChqID0gMTAwOyBqID4gMDsgLS1qKQotCQkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDkwMCkKLQkJCQlicmVhazsKLQkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDEwMCkKLQkJCWJyZWFrOwotCQllbHNlCi0JCQlkaXNhYmxlX2RtYShkbWEpOwotCX0KLQlpZiAoaSA+PSAoc2l6ZW9mKGRtYXMpL3NpemVvZihkbWFzWzBdKSkpCi0JCWRtYSA9IDA7Ci0JcHJpbnRmKCJcbiVzIGJhc2UgJSNYLCBETUEgJWQsIGFkZHIgJSFcbiIsCi0JCWNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0ubmFtZSwgaW9hZGRyLCBkbWEsIG5pYy0+bm9kZV9hZGRyKTsKLSNlbHNlCi0JcHJpbnRmKCIgJXMgYmFzZSAlI2hYLCBhZGRyICUhXG4iLCBjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLm5hbWUsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOwotI2VuZGlmCi0JaWYgKGNoaXBfdGFibGVbY2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUKSB7Ci0JCS8qIFR1cm4gb24gYXV0by1zZWxlY3Qgb2YgbWVkaWEgKDEwYmFzZVQgb3IgQk5DKSBzbyB0aGF0IHRoZQotCQkgKiB1c2VyIHdhdGNoIHRoZSBMRURzLiAqLwotCQlvdXR3KDB4MDAwMiwgaW9hZGRyK0xBTkNFX0FERFIpOwotCQkvKiBEb24ndCB0b3VjaCAxMGJhc2UyIHBvd2VyIGJpdC4gKi8KLQkJb3V0dyhpbncoaW9hZGRyK0xBTkNFX0JVU19JRikgfCAweDAwMDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOwotCX0KLQlyZXR1cm4gKGxhbmNlX3ZlcnNpb24pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotc3RydWN0IG5pYyAqbGFuY2VwY2lfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05FMjEwMAotc3RydWN0IG5pYyAqbmUyMTAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9OSTY1MTAKLXN0cnVjdCBuaWMgKm5pNjUxMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLSNlbmRpZgotewotCXVuc2lnbmVkIHNob3J0CQkqcDsKLSNpZm5kZWYJSU5DTFVERV9MQU5DRQotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMCB9OwotI2VuZGlmCi0KLQkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0JaWYgKHByb2JlX2FkZHJzID09IDApIHsKLSNpZmRlZglJTkNMVURFX0xBTkNFCi0JCXJldHVybiAwOwotI2Vsc2UKLQkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKLSNlbmRpZgotCX0KLQlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyArK3ApCi0JewotCQljaGFyCW9mZnNldDE1LCBvZmZzZXQxNCA9IGluYihpb2FkZHIgKyAxNCk7Ci0JCXVuc2lnbmVkIHNob3J0CXBjaV9jbWQ7Ci0KLSNpZmRlZglJTkNMVURFX05FMjEwMAotCQlpZiAoKG9mZnNldDE0ID09IDB4NTIgfHwgb2Zmc2V0MTQgPT0gMHg1NykgJiYKLQkJICgob2Zmc2V0MTUgPSBpbmIoaW9hZGRyICsgMTUpKSA9PSAweDU3IHx8IG9mZnNldDE1ID09IDB4NDQpKQotCQkJaWYgKGxhbmNlX3Byb2JlMShuaWMpID49IDApCi0JCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05JNjUxMAotCQlpZiAoKG9mZnNldDE0ID09IDB4MDAgfHwgb2Zmc2V0MTQgPT0gMHg1MikgJiYKLQkJICgob2Zmc2V0MTUgPSBpbmIoaW9hZGRyICsgMTUpKSA9PSAweDU1IHx8IG9mZnNldDE1ID09IDB4NDQpKQotCQkJaWYgKGxhbmNlX3Byb2JlMShuaWMpID49IDApCi0JCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZglJTkNMVURFX0xBTkNFCi0JCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7Ci0JCWlmIChsYW5jZV9wcm9iZTEobmljLCBwY2kpID49IDApCi0JCQlicmVhazsKLSNlbmRpZgotCX0KLQkvKiBpZiBib2FyZCBmb3VuZCAqLwotCWlmIChpb2FkZHIgIT0gMCkKLQl7Ci0JCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLwotCQlsYW5jZV9yZXNldChuaWMpOwotCQluaWMtPnJlc2V0ID0gbGFuY2VfcmVzZXQ7Ci0JCW5pYy0+cG9sbCA9IGxhbmNlX3BvbGw7Ci0JCW5pYy0+dHJhbnNtaXQgPSBsYW5jZV90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gbGFuY2VfZGlzYWJsZTsKLQkJcmV0dXJuIG5pYzsKLQl9Ci0KLQkvKiBubyBib2FyZCBmb3VuZCAqLwotCXJldHVybiAwOwotfQpJbmRleDogYi9uZXRib290L2xhdGNoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvbGF0Y2guaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIExBVENIX0gKKyNkZWZpbmUgTEFUQ0hfSAorCisjZGVmaW5lCVRJQ0tTX1BFUl9TRUMJCTE4CisKKy8qIEZvciBkaWZmZXJlbnQgY2FsaWJyYXRvcnMgb2YgdGhlIFRTQyBtb3ZlIHRoZSBkZWNsYXJhdGlvbiBvZgorICogc2xlZXBfbGF0Y2ggYW5kIHRoZSBkZWZpbml0aW9ucyBvZiBpdCdzIGxlbmd0aCBoZXJlLi4uCisgKi8KKworI2VuZGlmIC8qIExBVENIX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9saW51eC1hc20taW8uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvbGludXgtYXNtLWlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotI2lmbmRlZglfQVNNX0lPX0gKLSNkZWZpbmUgX0FTTV9JT19ICi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgeDg2IElPIGluc3RydWN0aW9ucwotICogaW5iL2ludy9pbmwvb3V0Yi9vdXR3L291dGwgYW5kIHRoZSAic3RyaW5nIHZlcnNpb25zIiBvZiB0aGUgc2FtZQotICogKGluc2IvaW5zdy9pbnNsL291dHNiL291dHN3L291dHNsKS4gWW91IGNhbiBhbHNvIHVzZSAicGF1c2luZyIKLSAqIHZlcnNpb25zIG9mIHRoZSBzaW5nbGUtSU8gaW5zdHJ1Y3Rpb25zIChpbmJfcC9pbndfcC8uLikuCi0gKgotICogVGhpcyBmaWxlIGlzIG5vdCBtZWFudCB0byBiZSBvYmZ1c2NhdGluZzogaXQncyBqdXN0IGNvbXBsaWNhdGVkCi0gKiB0byAoYSkgaGFuZGxlIGl0IGFsbCBpbiBhIHdheSB0aGF0IG1ha2VzIGdjYyBhYmxlIHRvIG9wdGltaXplIGl0Ci0gKiBhcyB3ZWxsIGFzIHBvc3NpYmxlIGFuZCAoYikgdHJ5aW5nIHRvIGF2b2lkIHdyaXRpbmcgdGhlIHNhbWUgdGhpbmcKLSAqIG92ZXIgYW5kIG92ZXIgYWdhaW4gd2l0aCBzbGlnaHQgdmFyaWF0aW9ucyBhbmQgcG9zc2libHkgbWFraW5nIGEKLSAqIG1pc3Rha2Ugc29tZXdoZXJlLgotICovCi0KLS8qCi0gKiBUaGFua3MgdG8gSmFtZXMgdmFuIEFydHNkYWxlbiBmb3IgYSBiZXR0ZXIgdGltaW5nLWZpeCB0aGFuCi0gKiB0aGUgdHdvIHNob3J0IGp1bXBzOiB1c2luZyBvdXRiJ3MgdG8gYSBub25leGlzdGVudCBwb3J0IHNlZW1zCi0gKiB0byBndWFyYW50ZWUgYmV0dGVyIHRpbWluZ3MgZXZlbiBvbiBmYXN0IG1hY2hpbmVzLgotICoKLSAqIE9uIHRoZSBvdGhlciBoYW5kLCBJJ2QgbGlrZSB0byBiZSBzdXJlIG9mIGEgbm9uLWV4aXN0ZW50IHBvcnQ6Ci0gKiBJIGZlZWwgYSBiaXQgdW5zYWZlIGFib3V0IHVzaW5nIDB4ODAgKHNob3VsZCBiZSBzYWZlLCB0aG91Z2gpCi0gKgotICoJCUxpbnVzCi0gKi8KLQotI2lmZGVmCVNMT1dfSU9fQllfSlVNUElORwotI2RlZmluZSBfX1NMT1dfRE9XTl9JTyBfX2FzbV9fIF9fdm9sYXRpbGVfXygiam1wIDFmXG4xOlx0am1wIDFmXG4xOiIpCi0jZWxzZQotI2RlZmluZSBfX1NMT1dfRE9XTl9JTyBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0YiAlYWwsJDB4ODAiKQotI2VuZGlmCi0KLSNpZmRlZglSRUFMTFlfU0xPV19JTwotI2RlZmluZSBTTE9XX0RPV05fSU8geyBfX1NMT1dfRE9XTl9JTzsgX19TTE9XX0RPV05fSU87IF9fU0xPV19ET1dOX0lPOyBfX1NMT1dfRE9XTl9JTzsgfQotI2Vsc2UKLSNkZWZpbmUgU0xPV19ET1dOX0lPIF9fU0xPV19ET1dOX0lPCi0jZW5kaWYKLQotLyoKLSAqIHJlYWRYL3dyaXRlWCgpIGFyZSB1c2VkIHRvIGFjY2VzcyBtZW1vcnkgbWFwcGVkIGRldmljZXMuIE9uIHNvbWUKLSAqIGFyY2hpdGVjdHVyZXMgdGhlIG1lbW9yeSBtYXBwZWQgSU8gc3R1ZmYgbmVlZHMgdG8gYmUgYWNjZXNzZWQKLSAqIGRpZmZlcmVudGx5LiBPbiB0aGUgeDg2IGFyY2hpdGVjdHVyZSwgd2UganVzdCByZWFkL3dyaXRlIHRoZQotICogbWVtb3J5IGxvY2F0aW9uIGRpcmVjdGx5LgotICovCi0jZGVmaW5lIHJlYWRiKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGFkZHIpKQotI2RlZmluZSByZWFkdyhhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoYWRkcikpCi0jZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpCi0KLSNkZWZpbmUgd3JpdGViKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGFkZHIpKSA9IChiKSkKLSNkZWZpbmUgd3JpdGV3KGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSkgPSAoYikpCi0jZGVmaW5lIHdyaXRlbChiLGFkZHIpICgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKSA9IChiKSkKLQotI2RlZmluZSBtZW1zZXRfaW8oYSxiLGMpCW1lbXNldCgodm9pZCAqKShhKSwoYiksKGMpKQotI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYixjKQltZW1jcHkoKGEpLCh2b2lkICopKGIpLChjKSkKLSNkZWZpbmUgbWVtY3B5X3RvaW8oYSxiLGMpCW1lbWNweSgodm9pZCAqKShhKSwoYiksKGMpKQotCi0vKgotICogQWdhaW4sIGkzODYgZG9lcyBub3QgcmVxdWlyZSBtZW0gSU8gc3BlY2lmaWMgZnVuY3Rpb24uCi0gKi8KLQotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCWV0aF9jb3B5X2FuZF9zdW0oKGEpLCh2b2lkICopKGIpLChjKSwoZCkpCi0KLS8qCi0gKiBUYWxrIGFib3V0IG1pc3VzaW5nIG1hY3Jvcy4uCi0gKi8KLQotI2RlZmluZSBfX09VVDEocyx4KSBcCi1leHRlcm4gdm9pZCBfX291dCMjcyh1bnNpZ25lZCB4IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBwb3J0KTsgXAotZXh0ZXJuIGlubGluZSB2b2lkIF9fb3V0IyNzKHVuc2lnbmVkIHggdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpIHsKLQotI2RlZmluZSBfX09VVDIocyxzMSxzMikgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXQiICNzICIgJSIgczEgIjAsJSIgczIgIjEiCi0KLSNkZWZpbmUgX19PVVQocyxzMSx4KSBcCi1fX09VVDEocyx4KSBfX09VVDIocyxzMSwidyIpIDogOiAiYSIgKHZhbHVlKSwgImQiIChwb3J0KSk7IH0gXAotX19PVVQxKHMjI2MseCkgX19PVVQyKHMsczEsIiIpIDogOiAiYSIgKHZhbHVlKSwgImlkIiAocG9ydCkpOyB9IFwKLV9fT1VUMShzIyNfcCx4KSBfX09VVDIocyxzMSwidyIpIDogOiAiYSIgKHZhbHVlKSwgImQiIChwb3J0KSk7IFNMT1dfRE9XTl9JTzsgfSBcCi1fX09VVDEocyMjY19wLHgpIF9fT1VUMihzLHMxLCIiKSA6IDogImEiICh2YWx1ZSksICJpZCIgKHBvcnQpKTsgU0xPV19ET1dOX0lPOyB9Ci0KLSNkZWZpbmUgX19JTjEocyx4KSBcCi1leHRlcm4gdW5zaWduZWQgeCBfX2luIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQpOyBcCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIHggX19pbiMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0KSB7IHVuc2lnbmVkIHggX3Y7Ci0KLSNkZWZpbmUgX19JTjIocyxzMSxzMikgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbiIgI3MgIiAlIiBzMiAiMSwlIiBzMSAiMCIKLQotI2RlZmluZSBfX0lOKHMsczEseCxpLi4uKSBcCi1fX0lOMShzLHgpIF9fSU4yKHMsczEsInciKSA6ICI9YSIgKF92KSA6ICJkIiAocG9ydCkgLCMjaSApOyByZXR1cm4gX3Y7IH0gXAotX19JTjEocyMjYyx4KSBfX0lOMihzLHMxLCIiKSA6ICI9YSIgKF92KSA6ICJpZCIgKHBvcnQpICwjI2kgKTsgcmV0dXJuIF92OyB9IFwKLV9fSU4xKHMjI19wLHgpIF9fSU4yKHMsczEsInciKSA6ICI9YSIgKF92KSA6ICJkIiAocG9ydCkgLCMjaSApOyBTTE9XX0RPV05fSU87IHJldHVybiBfdjsgfSBcCi1fX0lOMShzIyNjX3AseCkgX19JTjIocyxzMSwiIikgOiAiPWEiIChfdikgOiAiaWQiIChwb3J0KSAsIyNpICk7IFNMT1dfRE9XTl9JTzsgcmV0dXJuIF92OyB9Ci0KLSNkZWZpbmUgX19JTlMocykgXAotZXh0ZXJuIHZvaWQgaW5zIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsgXAotZXh0ZXJuIGlubGluZSB2b2lkIGlucyMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0LCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkgXAoteyBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IGlucyIgI3MgXAotOiAiPUQiIChhZGRyKSwgIj1jIiAoY291bnQpIDogImQiIChwb3J0KSwiMCIgKGFkZHIpLCIxIiAoY291bnQpKTsgfQotCi0jZGVmaW5lIF9fT1VUUyhzKSBcCi1leHRlcm4gdm9pZCBvdXRzIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nICBjb3VudCk7IFwKLWV4dGVybiBpbmxpbmUgdm9pZCBvdXRzIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCi17IF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0cyIgI3MgXAotOiAiPVMiIChhZGRyKSwgIj1jIiAoY291bnQpIDogImQiIChwb3J0KSwiMCIgKGFkZHIpLCIxIiAoY291bnQpKTsgfQotCi1fX0lOKGIsIiIsIGNoYXIpCi1fX0lOKHcsIiIsc2hvcnQpCi1fX0lOKGwsIiIsIGxvbmcpCi0KLV9fT1VUKGIsImIiLGNoYXIpCi1fX09VVCh3LCJ3IixzaG9ydCkKLV9fT1VUKGwsLGludCkKLQotX19JTlMoYikKLV9fSU5TKHcpCi1fX0lOUyhsKQotCi1fX09VVFMoYikKLV9fT1VUUyh3KQotX19PVVRTKGwpCi0KLS8qCi0gKiBOb3RlIHRoYXQgZHVlIHRvIHRoZSB3YXkgX19idWlsdGluX2NvbnN0YW50X3AoKSB3b3JrcywgeW91Ci0gKiAgLSBjYW4ndCB1c2UgaXQgaW5zaWRlIGEgaW5saW5lIGZ1bmN0aW9uIChpdCB3aWxsIG5ldmVyIGJlIHRydWUpCi0gKiAgLSB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzaWRlIGVmZmVjdHMgd2l0aGluIHRoZSBfX2J1aWx0aW4uLgotICovCi0jZGVmaW5lIG91dGIodmFsLHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9fb3V0YmMoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dGIoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbmIocG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19pbmJjKHBvcnQpIDogXAotCV9faW5iKHBvcnQpKQotCi0jZGVmaW5lIG91dGJfcCh2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXRiY19wKCh2YWwpLChwb3J0KSkgOiBcCi0JX19vdXRiX3AoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbmJfcChwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2luYmNfcChwb3J0KSA6IFwKLQlfX2luYl9wKHBvcnQpKQotCi0jZGVmaW5lIG91dHcodmFsLHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9fb3V0d2MoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dHcoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbncocG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19pbndjKHBvcnQpIDogXAotCV9faW53KHBvcnQpKQotCi0jZGVmaW5lIG91dHdfcCh2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXR3Y19wKCh2YWwpLChwb3J0KSkgOiBcCi0JX19vdXR3X3AoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbndfcChwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2lud2NfcChwb3J0KSA6IFwKLQlfX2lud19wKHBvcnQpKQotCi0jZGVmaW5lIG91dGwodmFsLHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9fb3V0bGMoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dGwoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbmwocG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19pbmxjKHBvcnQpIDogXAotCV9faW5sKHBvcnQpKQotCi0jZGVmaW5lIG91dGxfcCh2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXRsY19wKCh2YWwpLChwb3J0KSkgOiBcCi0JX19vdXRsX3AoKHZhbCksKHBvcnQpKSkKLQotI2RlZmluZSBpbmxfcChwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2lubGNfcChwb3J0KSA6IFwKLQlfX2lubF9wKHBvcnQpKQotCi0jZW5kaWYKSW5kZXg6IGIvbmV0Ym9vdC9saW51eC1hc20tc3RyaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L2xpbnV4LWFzbS1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogVGFrZW4gZnJvbSBMaW51eCAvdXNyL2luY2x1ZGUvYXNtL3N0cmluZy5oCi0gKiBBbGwgZXhjZXB0IG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0IGFuZCBtZW1jbXAgcmVtb3ZlZC4KLSAqLwotCi0jaWZuZGVmCV9JMzg2X1NUUklOR19IXwotI2RlZmluZSBfSTM4Nl9TVFJJTkdfSF8KLQotLyoKLSAqIFRoaXMgc3RyaW5nLWluY2x1ZGUgZGVmaW5lcyBhbGwgc3RyaW5nIGZ1bmN0aW9ucyBhcyBpbmxpbmUKLSAqIGZ1bmN0aW9ucy4gVXNlIGdjYy4gSXQgYWxzbyBhc3N1bWVzIGRzPWVzPWRhdGEgc3BhY2UsIHRoaXMgc2hvdWxkIGJlCi0gKiBub3JtYWwuIE1vc3Qgb2YgdGhlIHN0cmluZy1mdW5jdGlvbnMgYXJlIHJhdGhlciBoZWF2aWx5IGhhbmQtb3B0aW1pemVkLAotICogc2VlIGVzcGVjaWFsbHkgc3RydG9rLHN0cnN0cixzdHJbY11zcG4uIFRoZXkgc2hvdWxkIHdvcmssIGJ1dCBhcmUgbm90Ci0gKiB2ZXJ5IGVhc3kgdG8gdW5kZXJzdGFuZC4gRXZlcnl0aGluZyBpcyBkb25lIGVudGlyZWx5IHdpdGhpbiB0aGUgcmVnaXN0ZXIKLSAqIHNldCwgbWFraW5nIHRoZSBmdW5jdGlvbnMgZmFzdCBhbmQgY2xlYW4uIFN0cmluZyBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuCi0gKiB1c2VkIHRocm91Z2gtb3V0LCBtYWtpbmcgZm9yICJzbGlnaHRseSIgdW5jbGVhciBjb2RlIDotKQotICoKLSAqCQlOTyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMsCi0gKgkJY29uc2lkZXIgdGhlc2UgdHJpdmlhbCBmdW5jdGlvbnMgdG8gYmUgUEQuCi0gKi8KLQotdHlwZWRlZiBpbnQJc2l6ZV90OwotCi1leHRlcm4gdm9pZCAqX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKl9fY29uc3RhbnRfbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKTsKLWV4dGVybiB2b2lkICptZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKiBzcmMsIHNpemVfdCBuKTsKLWV4dGVybiB2b2lkICpfX21lbXNldF9nZW5lcmljKHZvaWQgKiBzLCBjaGFyIGMsc2l6ZV90IGNvdW50KTsKLWV4dGVybiB2b2lkICpfX2NvbnN0YW50X2NfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIGMsIHNpemVfdCBjb3VudCk7Ci1leHRlcm4gdm9pZCAqX19jb25zdGFudF9jX2FuZF9jb3VudF9tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgcGF0dGVybiwgc2l6ZV90IGNvdW50KTsKLQotCi1leHRlcm4gaW5saW5lIHZvaWQgKiBfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKLXsKLWludCBkMCwgZDEsIGQyOwotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JImNsZFxuXHQiCi0JInJlcCA7IG1vdnNsXG5cdCIKLQkidGVzdGIgJDIsJWI0XG5cdCIKLQkiamUgMWZcblx0IgotCSJtb3Zzd1xuIgotCSIxOlx0dGVzdGIgJDEsJWI0XG5cdCIKLQkiamUgMmZcblx0IgotCSJtb3ZzYlxuIgotCSIyOiIKLQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKLQk6IjAiIChuLzQpLCAicSIgKG4pLCIxIiAoKGxvbmcpIHRvKSwiMiIgKChsb25nKSBmcm9tKQotCTogIm1lbW9yeSIpOwotcmV0dXJuICh0byk7Ci19Ci0KLS8qCi0gKiBUaGlzIGxvb2tzIGhvcnJpYmx5IHVnbHksIGJ1dCB0aGUgY29tcGlsZXIgY2FuIG9wdGltaXplIGl0IHRvdGFsbHksCi0gKiBhcyB0aGUgY291bnQgaXMgY29uc3RhbnQuCi0gKi8KLWV4dGVybiBpbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQotewotCXN3aXRjaCAobikgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMToKLQkJCSoodW5zaWduZWQgY2hhciAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBjaGFyICopZnJvbTsKLQkJCXJldHVybiB0bzsKLQkJY2FzZSAyOgotCQkJKih1bnNpZ25lZCBzaG9ydCAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBzaG9ydCAqKWZyb207Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMzoKLQkJCSoodW5zaWduZWQgc2hvcnQgKil0byA9ICooY29uc3QgdW5zaWduZWQgc2hvcnQgKilmcm9tOwotCQkJKigyKyh1bnNpZ25lZCBjaGFyICopdG8pID0gKigyKyhjb25zdCB1bnNpZ25lZCBjaGFyICopZnJvbSk7Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgNDoKLQkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKLQkJCXJldHVybiB0bzsKLQkJY2FzZSA2OgkvKiBmb3IgRXRoZXJuZXQgYWRkcmVzc2VzICovCi0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQkqKDIrKHVuc2lnbmVkIHNob3J0ICopdG8pID0gKigyKyhjb25zdCB1bnNpZ25lZCBzaG9ydCAqKWZyb20pOwotCQkJcmV0dXJuIHRvOwotCQljYXNlIDg6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQkqKDErKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDErKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCXJldHVybiB0bzsKLQkJY2FzZSAxMjoKLQkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKLQkJCSooMSsodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMSsoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJKigyKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigyKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMTY6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQkqKDErKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDErKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCSooMisodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMisoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJKigzKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigzKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMjA6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQkqKDErKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDErKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCSooMisodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMisoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJKigzKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigzKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQkqKDQrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDQrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCXJldHVybiB0bzsKLQl9Ci0jZGVmaW5lIENPTU1PTih4KSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCSJjbGRcblx0IiBcCi0JInJlcCA7IG1vdnNsIiBcCi0JeCBcCi0JOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpIFwKLQk6ICIwIiAobi80KSwiMSIgKChsb25nKSB0byksIjIiICgobG9uZykgZnJvbSkgXAotCTogIm1lbW9yeSIpOwotewotCWludCBkMCwgZDEsIGQyOwotCXN3aXRjaCAobiAlIDQpIHsKLQkJY2FzZSAwOiBDT01NT04oIiIpOyByZXR1cm4gdG87Ci0JCWNhc2UgMTogQ09NTU9OKCJcblx0bW92c2IiKTsgcmV0dXJuIHRvOwotCQljYXNlIDI6IENPTU1PTigiXG5cdG1vdnN3Iik7IHJldHVybiB0bzsKLQkJZGVmYXVsdDogQ09NTU9OKCJcblx0bW92c3dcblx0bW92c2IiKTsgcmV0dXJuIHRvOwotCX0KLX0KLQotI3VuZGVmIENPTU1PTgotfQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNQWQotI2RlZmluZSBtZW1jcHkodCwgZiwgbikgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotIF9fY29uc3RhbnRfbWVtY3B5KCh0KSwoZiksKG4pKSA6IFwKLSBfX21lbWNweSgodCksKGYpLChuKSkpCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNTU9WRQotZXh0ZXJuIGlubGluZSB2b2lkICogbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICogc3JjLCBzaXplX3QgbikKLXsKLWludCBkMCwgZDEsIGQyOwotaWYgKGRlc3Q8c3JjKQotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JImNsZFxuXHQiCi0JInJlcFxuXHQiCi0JIm1vdnNiIgotCTogIj0mYyIgKGQwKSwgIj0mUyIgKGQxKSwgIj0mRCIgKGQyKQotCToiMCIgKG4pLCIxIiAoc3JjKSwiMiIgKGRlc3QpCi0JOiAibWVtb3J5Iik7Ci1lbHNlCi1fX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkic3RkXG5cdCIKLQkicmVwXG5cdCIKLQkibW92c2Jcblx0IgotCSJjbGQiCi0JOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpCi0JOiIwIiAobiksCi0JICIxIiAobi0xKyhjb25zdCBjaGFyICopc3JjKSwKLQkgIjIiIChuLTErKGNoYXIgKilkZXN0KQotCToibWVtb3J5Iik7Ci1yZXR1cm4gZGVzdDsKLX0KLQotI2RlZmluZSBtZW1jbXAgX19idWlsdGluX21lbWNtcAotCi1leHRlcm4gaW5saW5lIHZvaWQgKiBfX21lbXNldF9nZW5lcmljKHZvaWQgKiBzLCBjaGFyIGMsc2l6ZV90IGNvdW50KQotewotaW50IGQwLCBkMTsKLV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJjbGRcblx0IgotCSJyZXBcblx0IgotCSJzdG9zYiIKLQk6ICI9JmMiIChkMCksICI9JkQiIChkMSkKLQk6ImEiIChjKSwiMSIgKHMpLCIwIiAoY291bnQpCi0JOiJtZW1vcnkiKTsKLXJldHVybiBzOwotfQotCi0vKiB3ZSBtaWdodCB3YW50IHRvIHdyaXRlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiB0aGVzZSBsYXRlciAqLwotI2RlZmluZSBfX2NvbnN0YW50X2NvdW50X21lbXNldChzLGMsY291bnQpIF9fbWVtc2V0X2dlbmVyaWMoKHMpLChjKSwoY291bnQpKQotCi0vKgotICogbWVtc2V0KHgsMCx5KSBpcyBhIHJlYXNvbmFibHkgY29tbW9uIHRoaW5nIHRvIGRvLCBzbyB3ZSB3YW50IHRvIGZpbGwKLSAqIHRoaW5ncyAzMiBiaXRzIGF0IGEgdGltZSBldmVuIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUKLSAqIGFyZWEgYXQgY29tcGlsZS10aW1lLi4KLSAqLwotZXh0ZXJuIGlubGluZSB2b2lkICogX19jb25zdGFudF9jX21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBjLCBzaXplX3QgY291bnQpCi17Ci1pbnQgZDAsIGQxOwotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JImNsZFxuXHQiCi0JInJlcCA7IHN0b3NsXG5cdCIKLQkidGVzdGIgJDIsJWIzXG5cdCIKLQkiamUgMWZcblx0IgotCSJzdG9zd1xuIgotCSIxOlx0dGVzdGIgJDEsJWIzXG5cdCIKLQkiamUgMmZcblx0IgotCSJzdG9zYlxuIgotCSIyOiIKLQk6ICI9JmMiIChkMCksICI9JkQiIChkMSkKLQk6ImEiIChjKSwgInEiIChjb3VudCksICIwIiAoY291bnQvNCksICIxIiAoKGxvbmcpIHMpCi0JOiJtZW1vcnkiKTsKLXJldHVybiAocyk7Ci19Ci0KLS8qCi0gKiBUaGlzIGxvb2tzIGhvcnJpYmx5IHVnbHksIGJ1dCB0aGUgY29tcGlsZXIgY2FuIG9wdGltaXplIGl0IHRvdGFsbHksCi0gKiBhcyB3ZSBieSBub3cga25vdyB0aGF0IGJvdGggcGF0dGVybiBhbmQgY291bnQgaXMgY29uc3RhbnQuLgotICovCi1leHRlcm4gaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X2NfYW5kX2NvdW50X21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBwYXR0ZXJuLCBzaXplX3QgY291bnQpCi17Ci0Jc3dpdGNoIChjb3VudCkgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gczsKLQkJY2FzZSAxOgotCQkJKih1bnNpZ25lZCBjaGFyICopcyA9IHBhdHRlcm47Ci0JCQlyZXR1cm4gczsKLQkJY2FzZSAyOgotCQkJKih1bnNpZ25lZCBzaG9ydCAqKXMgPSBwYXR0ZXJuOwotCQkJcmV0dXJuIHM7Ci0JCWNhc2UgMzoKLQkJCSoodW5zaWduZWQgc2hvcnQgKilzID0gcGF0dGVybjsKLQkJCSooMisodW5zaWduZWQgY2hhciAqKXMpID0gcGF0dGVybjsKLQkJCXJldHVybiBzOwotCQljYXNlIDQ6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKilzID0gcGF0dGVybjsKLQkJCXJldHVybiBzOwotCX0KLSNkZWZpbmUgQ09NTU9OKHgpIFwKLV9fYXNtX18gIF9fdm9sYXRpbGVfXygiY2xkXG5cdCIgXAotCSJyZXAgOyBzdG9zbCIgXAotCXggXAotCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSBcCi0JOiAiYSIgKHBhdHRlcm4pLCIwIiAoY291bnQvNCksIjEiICgobG9uZykgcykgXAotCTogIm1lbW9yeSIpCi17Ci0JaW50IGQwLCBkMTsKLQlzd2l0Y2ggKGNvdW50ICUgNCkgewotCQljYXNlIDA6IENPTU1PTigiIik7IHJldHVybiBzOwotCQljYXNlIDE6IENPTU1PTigiXG5cdHN0b3NiIik7IHJldHVybiBzOwotCQljYXNlIDI6IENPTU1PTigiXG5cdHN0b3N3Iik7IHJldHVybiBzOwotCQlkZWZhdWx0OiBDT01NT04oIlxuXHRzdG9zd1xuXHRzdG9zYiIpOyByZXR1cm4gczsKLQl9Ci19Ci0KLSN1bmRlZiBDT01NT04KLX0KLQotI2RlZmluZSBfX2NvbnN0YW50X2NfeF9tZW1zZXQocywgYywgY291bnQpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChjb3VudCkgPyBcCi0gX19jb25zdGFudF9jX2FuZF9jb3VudF9tZW1zZXQoKHMpLChjKSwoY291bnQpKSA6IFwKLSBfX2NvbnN0YW50X2NfbWVtc2V0KChzKSwoYyksKGNvdW50KSkpCi0KLSNkZWZpbmUgX19tZW1zZXQocywgYywgY291bnQpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChjb3VudCkgPyBcCi0gX19jb25zdGFudF9jb3VudF9tZW1zZXQoKHMpLChjKSwoY291bnQpKSA6IFwKLSBfX21lbXNldF9nZW5lcmljKChzKSwoYyksKGNvdW50KSkpCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0VUCi0jZGVmaW5lIG1lbXNldChzLCBjLCBjb3VudCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKGMpID8gXAotIF9fY29uc3RhbnRfY194X21lbXNldCgocyksKGMpLChjb3VudCkpIDogXAotIF9fbWVtc2V0KChzKSwoYyksKGNvdW50KSkpCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSTkNNUAotc3RhdGljIGlubGluZSBpbnQgc3RybmNtcChjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0LHNpemVfdCBjb3VudCkKLXsKLXJlZ2lzdGVyIGludCBfX3JlczsKLWludCBkMCwgZDEsIGQyOwotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIjE6XHRkZWNsICUzXG5cdCIKLQkianMgMmZcblx0IgotCSJsb2RzYlxuXHQiCi0JInNjYXNiXG5cdCIKLQkiam5lIDNmXG5cdCIKLQkidGVzdGIgJSVhbCwlJWFsXG5cdCIKLQkiam5lIDFiXG4iCi0JIjI6XHR4b3JsICUlZWF4LCUlZWF4XG5cdCIKLQkiam1wIDRmXG4iCi0JIjM6XHRzYmJsICUlZWF4LCUlZWF4XG5cdCIKLQkib3JiICQxLCUlYWxcbiIKLQkiNDoiCi0JCSAgICAgOiI9YSIgKF9fcmVzKSwgIj0mUyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mYyIgKGQyKQotCQkgICAgIDoiMSIgKGNzKSwiMiIgKGN0KSwiMyIgKGNvdW50KSk7Ci1yZXR1cm4gX19yZXM7Ci19Ci0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSTEVOCi1zdGF0aWMgaW5saW5lIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqIHMpCi17Ci1pbnQgZDA7Ci1yZWdpc3RlciBpbnQgX19yZXM7Ci1fX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkicmVwbmVcblx0IgotCSJzY2FzYlxuXHQiCi0JIm5vdGwgJTBcblx0IgotCSJkZWNsICUwIgotCToiPWMiIChfX3JlcyksICI9JkQiIChkMCkgOiIxIiAocyksImEiICgwKSwgIjAiICgweGZmZmZmZmZmKSk7Ci1yZXR1cm4gX19yZXM7Ci19Ci0KLSNlbmRpZgpJbmRleDogYi9uZXRib290L2xpdHRsZV9ic3dhcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2xpdHRsZV9ic3dhcC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0xJVFRMRV9CU1dBUF9ICisjZGVmaW5lIEVUSEVSQk9PVF9MSVRUTEVfQlNXQVBfSAorCisjZGVmaW5lIG50b2hsKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgaHRvbmwoeCkgCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgbnRvaHMoeCkgCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgaHRvbnMoeCkgCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkJKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpCSh4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkJKHgpCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpCSh4KQorI2RlZmluZSBiZTMyX3RvX2NwdSh4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpCV9fYnN3YXBfMTYoeCkKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9MSVRUTEVfQlNXQVBfSCAqLwpJbmRleDogYi9uZXRib290L21paS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L21paS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogbGludXgvbWlpLmg6IGRlZmluaXRpb25zIGZvciBNSUktY29tcGF0aWJsZSB0cmFuc2NlaXZlcnMKKyAqIE9yaWdpbmFsbHkgZHJpdmVycy9uZXQvc3VuaG1lLmguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKiBDb3BpZWQgRm9ybSBMaW51eCAyLjQuMjUgYW4gdW5uZWVkZWQgaXRlbXMgcmVtb3ZlZCBieToKKyAqIFRpbW90aHkgTGVnZ2UgKHRpbWxlZ2dlIGF0IGV0aGVyYm9vdCBkb3Qgb3JnKQorICoKKyAqIDAzLzI2LzIwMDQKKyAqLworCisvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAweDAwCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQk1TUiAgICAgICAgICAgIDB4MDEJLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgICovCisjZGVmaW5lIE1JSV9QSFlTSUQxICAgICAgICAgMHgwMiAgICAgICAgLyogUEhZUyBJRCAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9QSFlTSUQyICAgICAgICAgMHgwMyAgICAgICAgLyogUEhZUyBJRCAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BRFZFUlRJU0UgICAgICAgMHgwNAkvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICAgKi8KKyNkZWZpbmUgTUlJX0xQQSAgICAgICAgICAgICAweDA1CS8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZyAgICAqLworI2RlZmluZSBNSUlfRVhQQU5TSU9OICAgICAgIDB4MDYgICAgICAgIC8qIEV4cGFuc2lvbiByZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBNSUlfRENPVU5URVIgICAgICAgIDB4MTIgICAgICAgIC8qIERpc2Nvbm5lY3QgY291bnRlciAgICAgICAgICAqLworI2RlZmluZSBNSUlfRkNTQ09VTlRFUiAgICAgIDB4MTMgICAgICAgIC8qIEZhbHNlIGNhcnJpZXIgY291bnRlciAgICAgICAqLworI2RlZmluZSBNSUlfTldBWVRFU1QgICAgICAgIDB4MTQgICAgICAgIC8qIE4td2F5IGF1dG8tbmVnIHRlc3QgcmVnICAgICAqLworI2RlZmluZSBNSUlfUkVSUkNPVU5URVIgICAgIDB4MTUgICAgICAgIC8qIFJlY2VpdmUgZXJyb3IgY291bnRlciAgICAgICAqLworI2RlZmluZSBNSUlfU1JFVklTSU9OICAgICAgIDB4MTYgICAgICAgIC8qIFNpbGljb24gcmV2aXNpb24gICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVTVjEgICAgICAgICAgIDB4MTcgICAgICAgIC8qIFJlc2VydmVkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfTEJSRVJST1IgICAgICAgIDB4MTggICAgICAgIC8qIExwYmFjaywgcngsIGJ5cGFzcyBlcnJvciAgICAqLworI2RlZmluZSBNSUlfUEhZQUREUiAgICAgICAgIDB4MTkgICAgICAgIC8qIFBIWSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVTVjIgICAgICAgICAgIDB4MWEgICAgICAgIC8qIFJlc2VydmVkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfVFBJU1RBVFVTICAgICAgIDB4MWIgICAgICAgIC8qIFRQSSBzdGF0dXMgZm9yIDEwbWJwcyAgICAgICAqLworI2RlZmluZSBNSUlfTkNPTkZJRyAgICAgICAgIDB4MWMgICAgICAgIC8qIE5ldHdvcmsgaW50ZXJmYWNlIGNvbmZpZyAgICAqLworCisvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJNQ1JfUkVTViAgICAgICAgICAgICAgIDB4MDA3ZiAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfQ1RTVCAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQ29sbGlzaW9uIHRlc3QgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfRlVMTERQTFggICAgICAgICAgIDB4MDEwMAkvKiBGdWxsIGR1cGxleCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9BTlJFU1RBUlQgICAgICAgICAgMHgwMjAwCS8qIEF1dG8gbmVnb3RpYXRpb24gcmVzdGFydCAgICAqLworI2RlZmluZSBCTUNSX0lTT0xBVEUgICAgICAgICAgICAweDA0MDAgIC8qIERpc2Nvbm5lY3QgRFA4Mzg0MCBmcm9tIE1JSSAqLworI2RlZmluZSBCTUNSX1BET1dOICAgICAgICAgICAgICAweDA4MDAgIC8qIFBvd2VyZG93biB0aGUgRFA4Mzg0MCAgICAgICAqLworI2RlZmluZSBCTUNSX0FORU5BQkxFICAgICAgICAgICAweDEwMDAJLyogRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAgICAgICAgICAgIDB4MjAwMAkvKiBTZWxlY3QgMTAwTWJwcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9MT09QQkFDSyAgICAgICAgICAgMHg0MDAwICAvKiBUWEQgbG9vcGJhY2sgYml0cyAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgICAgICAgICAgMHg4MDAwCS8qIFJlc2V0IHRoZSBEUDgzODQwICAgICAgICAgICAqLworCisvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1TUl9FUkNBUCAgICAgICAgICAgICAgMHgwMDAxICAvKiBFeHQtcmVnIGNhcGFiaWxpdHkgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9KQ0QgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBKYWJiZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9MU1RBVFVTICAgICAgICAgICAgMHgwMDA0ICAvKiBMaW5rIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9BTkVHQ0FQQUJMRSAgICAgICAgMHgwMDA4ICAvKiBBYmxlIHRvIGRvIGF1dG8tbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgQk1TUl9SRkFVTFQgICAgICAgICAgICAgMHgwMDEwICAvKiBSZW1vdGUgZmF1bHQgZGV0ZWN0ZWQgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9BTkVHQ09NUExFVEUgICAgICAgMHgwMDIwICAvKiBBdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICAgKi8KKyNkZWZpbmUgQk1TUl9SRVNWICAgICAgICAgICAgICAgMHgwN2MwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl8xMEhBTEYgICAgICAgICAgICAgMHgwODAwICAvKiBDYW4gZG8gMTBtYnBzLCBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMEZVTEwgICAgICAgICAgICAgMHgxMDAwICAvKiBDYW4gZG8gMTBtYnBzLCBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMDBIQUxGICAgICAgICAgICAgMHgyMDAwICAvKiBDYW4gZG8gMTAwbWJwcywgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMICAgICAgICAgICAgMHg0MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBCQVNFNCAgICAgICAgICAgMHg4MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgNGsgcGFja2V0cyAgKi8KKworLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBRFZFUlRJU0VfU0xDVCAgICAgICAgICAweDAwMWYgIC8qIFNlbGVjdG9yIGJpdHMgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfQ1NNQSAgICAgICAgICAweDAwMDEgIC8qIE9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTBIQUxGICAgICAgICAweDAwMjAJLyogVHJ5IGZvciAxMG1icHMgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIEFEVkVSVElTRV8xMEZVTEwgICAgICAgIDB4MDA0MAkvKiBUcnkgZm9yIDEwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEhBTEYgICAgICAgMHgwMDgwCS8qIFRyeSBmb3IgMTAwbWJwcyBoYWxmLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwRlVMTCAgICAgICAweDAxMDAJLyogVHJ5IGZvciAxMDBtYnBzIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDBCQVNFNCAgICAgIDB4MDIwMCAgLyogVHJ5IGZvciAxMDBtYnBzIDRrIHBhY2tldHMgICovCisjZGVmaW5lIEFEVkVSVElTRV9SRVNWICAgICAgICAgIDB4MWMwMCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9SRkFVTFQgICAgICAgIDB4MjAwMCAgLyogU2F5IHdlIGNhbiBkZXRlY3QgZmF1bHRzICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9MUEFDSyAgICAgICAgIDB4NDAwMCAgLyogQWNrIGxpbmsgcGFydG5lcnMgcmVzcG9uc2UgICovCisjZGVmaW5lIEFEVkVSVElTRV9OUEFHRSAgICAgICAgIDB4ODAwMCAgLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQURWRVJUSVNFX0ZVTEwgKEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwRlVMTCB8IFwKKwkJCUFEVkVSVElTRV9DU01BKQorI2RlZmluZSBBRFZFUlRJU0VfQUxMIChBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKQorCisvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTFBBX1NMQ1QgICAgICAgICAgICAgICAgMHgwMDFmICAvKiBTYW1lIGFzIGFkdmVydGlzZSBzZWxlY3RvciAgKi8KKyNkZWZpbmUgTFBBXzEwSEFMRiAgICAgICAgICAgICAgMHgwMDIwICAvKiBDYW4gZG8gMTBtYnBzIGhhbGYtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwRlVMTCAgICAgICAgICAgICAgMHgwMDQwICAvKiBDYW4gZG8gMTBtYnBzIGZ1bGwtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwMEhBTEYgICAgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwgICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEJBU0U0ICAgICAgICAgICAgMHgwMjAwICAvKiBDYW4gZG8gMTAwbWJwcyA0ayBwYWNrZXRzICAgKi8KKyNkZWZpbmUgTFBBX1JFU1YgICAgICAgICAgICAgICAgMHgxYzAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1JGQVVMVCAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMaW5rIHBhcnRuZXIgYWNrZWQgdXMgICAgICAgKi8KKyNkZWZpbmUgTFBBX05QQUdFICAgICAgICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMUEFfRFVQTEVYICAgICAgICAgICAgKExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCkKKyNkZWZpbmUgTFBBXzEwMCAgICAgICAgICAgICAgICAgICAgICAgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisKKy8qIEV4cGFuc2lvbiByZWdpc3RlciBmb3IgYXV0by1uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05XQVkgICAgICAgICAgMHgwMDAxICAvKiBDYW4gZG8gTi13YXkgYXV0by1uZWdvICAgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AgICAgICAgICAgMHgwMDAyICAvKiBHb3QgbmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0VOQUJMRU5QQUdFICAgMHgwMDA0ICAvKiBUaGlzIGVuYWJsZXMgbnBhZ2Ugd29yZHMgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05QQ0FQQUJMRSAgICAgMHgwMDA4ICAvKiBMaW5rIHBhcnRuZXIgc3VwcG9ydHMgbnBhZ2UgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMgICAgICAgMHgwMDEwICAvKiBNdWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX1JFU1YgICAgICAgICAgMHhmZmUwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworLyogTi13YXkgdGVzdCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTldBWVRFU1RfUkVTVjEgICAgICAgICAgMHgwMGZmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTldBWVRFU1RfTE9PUEJBQ0sgICAgICAgMHgwMTAwICAvKiBFbmFibGUgbG9vcGJhY2sgZm9yIE4td2F5ICAgKi8KKyNkZWZpbmUgTldBWVRFU1RfUkVTVjIgICAgICAgICAgMHhmZTAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKwpJbmRleDogYi9uZXRib290L21pc2MuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvbWlzYy5jCisrKyBiL25ldGJvb3QvbWlzYy5jCkBAIC0xOSwzNyArMTksOTAgQEAKIAogLyogQmFzZWQgb24gInNyYy9taXNjLmMiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCiAKLSNkZWZpbmUgR1JVQgkxCi0jaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjaW5jbHVkZSAiZ3J1Yi5oIgorI2luY2x1ZGUgInRpbWVyLmgiCiAKLXZvaWQKLXNsZWVwIChpbnQgc2VjcykKKyNpbmNsdWRlICJuaWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSQU5ET00gLSBjb21wdXRlIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDIxNDc0ODM2NDdMIG9yIDIxNDc0ODM1NjI/CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgcmFuZG9tKHZvaWQpCiB7Ci0gIHVuc2lnbmVkIGxvbmcgdG1vID0gY3VycnRpY2tzICgpICsgc2VjczsKKwlzdGF0aWMgaW50MzJfdCBzZWVkID0gMDsKKwlpbnQzMl90IHE7CisJaWYgKCFzZWVkKSAvKiBJbml0aWFsaXplIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yICovCisJCXNlZWQgPSBjdXJydGlja3MoKSArICooaW50MzJfdCAqKSZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlCisJCSAgICAgICArICgoaW50MTZfdCAqKWFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUpWzJdOworCS8qIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgTENHIGdpdmVuIGluIEJydWNlIFNjaG5laWVyJ3MKKwkgICAiQXBwbGllZCBDcnlwdG9ncmFwaHkiICovCisJcSA9IHNlZWQvNTM2Njg7CisJaWYgKChzZWVkID0gNDAwMTQqKHNlZWQtNTM2NjgqcSkgLSAxMjIxMSpxKSA8IDApIHNlZWQgKz0gMjE0NzQ4MzU2M0w7CisJcmV0dXJuIHNlZWQ7Cit9CiAKLSAgd2hpbGUgKGN1cnJ0aWNrcyAoKSA8IHRtbykKLSAgICA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgSU5URVJSVVBUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBvbGxfaW50ZXJydXB0aW9ucyh2b2lkKQoreworCWlmIChjaGVja2tleSgpICE9IC0xICYmIEFTQ0lJX0NIQVIoZ2V0a2V5KCkpID09IEtfSU5UUikgeworCQl1c2VyX2Fib3J0Kys7CisJfQogfQogCi12b2lkCi10d2lkZGxlICh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitTTEVFUAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNsZWVwKGludCBzZWNzKQogewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0dGlja3MgPSAwOwotICBzdGF0aWMgaW50IGNvdW50ID0gMDsKLSAgc3RhdGljIGNvbnN0IGNoYXIgdGlkZGxlc1tdPSItXFx8LyI7Ci0gIHVuc2lnbmVkIGxvbmcgdGlja3M7CisJdW5zaWduZWQgbG9uZyB0bW87CiAKLSAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIGlmICgodGlja3MgPSBjdXJydGlja3MgKCkpID09IGxhc3R0aWNrcykKLQlyZXR1cm47Ci0gICAgICAKLSAgICAgIGxhc3R0aWNrcyA9IHRpY2tzOwotICAgICAgZ3J1Yl9wdXRjaGFyICh0aWRkbGVzWyhjb3VudCsrKSAmIDNdKTsKLSAgICAgIGdydWJfcHV0Y2hhciAoJ1xiJyk7Ci0gICAgfQorCWZvciAodG1vID0gY3VycnRpY2tzKCkrc2VjcypUSUNLU19QRVJfU0VDOyBjdXJydGlja3MoKSA8IHRtbzsgKSB7CisJCXBvbGxfaW50ZXJydXB0aW9ucygpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTlRFUlJVUFRJQkxFIFNMRUVQCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW50ZXJydXB0aWJsZV9zbGVlcChpbnQgc2VjcykKK3sKKwlwcmludGYoIjxzbGVlcD5cbiIpOworCXJldHVybiBzbGVlcChzZWNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUV0lERExFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHdpZGRsZSh2b2lkKQoreworI2lmZGVmIEJBUl9QUk9HUkVTUworCXN0YXRpYyBpbnQgY291bnQ9MDsKKwlzdGF0aWMgY29uc3QgY2hhciB0aWRkbGVzW109Ii1cXHwvIjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0dGlja3MgPSAwOworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisjZW5kaWYKKyNpZmRlZiBGUkVFQlNEX1BYRUVNVQorCWV4dGVybiBjaGFyIHB4ZWVtdV9uYnBfYWN0aXZlOworCWlmKHB4ZWVtdV9uYnBfYWN0aXZlICE9IDApCisJCXJldHVybjsKKyNlbmRpZgorI2lmZGVmCUJBUl9QUk9HUkVTUworCS8qIExpbWl0IHRoZSBtYXhpbXVtIHJhdGUgYXQgd2hpY2ggY2hhcmFjdGVycyBhcmUgcHJpbnRlZCAqLworCXRpY2tzID0gY3VycnRpY2tzKCk7CisJaWYgKChsYXN0dGlja3MgKyAoVElDS1NfUEVSX1NFQy8xOCkpID4gdGlja3MpCisJCXJldHVybjsKKwlsYXN0dGlja3MgPSB0aWNrczsKKworCXB1dGNoYXIodGlkZGxlc1soY291bnQrKykmM10pOworCXB1dGNoYXIoJ1xiJyk7CisjZWxzZQorCS8vcHV0Y2hhcignLicpOworI2VuZGlmCS8qIEJBUl9QUk9HUkVTUyAqLwogfQogCisKIC8qIEJlY2F1c2UgRXRoZXJib290IHVzZXMgaXRzIG93biBmb3JtYXRzIGZvciB0aGUgcHJpbnRmIGZhbWlseSwKICAgIGRlZmluZSBzZXBhcmF0ZSBkZWZpbml0aW9ucyBmcm9tIEdSVUIuICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjQsMyArMzE3LDUgQEAKICAgCiAgIHJldHVybiByZXQ7CiB9CisKKwpJbmRleDogYi9uZXRib290L25hdHNlbWkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvbmF0c2VtaS5jCisrKyBiL25ldGJvb3QvbmF0c2VtaS5jCkBAIC00NywxNSArNDcsMTUgQEAKIC8qIFJldmlzaW9uIEhpc3RvcnkgKi8KIAogLyoKKyAgMTMgRGVjIDIwMDMgdGltbGVnZ2UgMS4xIEVuYWJsZWQgTXVsdGljYXN0IFN1cHBvcnQKICAgMjkgTWF5IDIwMDEgIG1kYyAgICAgMS4wCiAgICAgIEluaXRpYWwgUmVsZWFzZS4gIFRlc3RlZCB3aXRoIE5ldGdlYXIgRkEzMTEgYW5kIEZBMzEyIGJvYXJkcwotKi8MCisqLwogLyogSW5jbHVkZXMgKi8KIAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogI2luY2x1ZGUgIm5pYy5oIgogI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCiAKIC8qIGRlZmluZXMgKi8KIApAQCAtNzEsMjEgKzcxLDE4IEBACiAKICNkZWZpbmUgTlVNX1JYX0RFU0MgICAgNCAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHU4OwotdHlwZWRlZiAgIHNpZ25lZCBjaGFyICBzODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwotdHlwZWRlZiAgIHNpZ25lZCBzaG9ydCBzMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIHUzMjsKLXR5cGVkZWYgICBzaWduZWQgaW50ICAgczMyOwordHlwZWRlZiB1aW50OF90ICAgIHU4OwordHlwZWRlZiBpbnQ4X3QgICAgIHM4OwordHlwZWRlZiB1aW50MTZfdCAgIHUxNjsKK3R5cGVkZWYgaW50MTZfdCAgICBzMTY7Cit0eXBlZGVmIHVpbnQzMl90ICAgdTMyOwordHlwZWRlZiBpbnQzMl90ICAgIHMzMjsKIAogLyogaGVscGZ1bCBtYWNyb2VzIGlmIG9uIGEgYmlnX2VuZGlhbiBtYWNoaW5lIGZvciBjaGFuZ2luZyBieXRlIG9yZGVyLgogICAgbm90IHN0cmljdGx5IG5lZWRlZCBvbiBJbnRlbCAqLwotI2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpICh2YWwpCi0jZGVmaW5lIGNwdV90b19sZTMyKHZhbCkgKHZhbCkKICNkZWZpbmUgZ2V0X3VuYWxpZ25lZChwdHIpICgqKHB0cikpCiAjZGVmaW5lIHB1dF91bmFsaWduZWQodmFsLCBwdHIpICgodm9pZCkoICoocHRyKSA9ICh2YWwpICkpCiAjZGVmaW5lIGdldF91MTYocHRyKSAoKih1MTYgKikocHRyKSkKLSNkZWZpbmUgdmlydF90b19idXMoeCkgKCh1bnNpZ25lZCBsb25nKXgpCiAjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIHZpcnRfdG9fYnVzKGFkZHIpCiAKIGVudW0gcGNpc3R1ZmYgewpAQCAtMTYxLDcgKzE1OCw4IEBACiAgICAgQWNjZXB0TXVsdGljYXN0ICAgID0gMHgwMDIwMDAwMCwgCiAgICAgQWNjZXB0QWxsTXVsdGljYXN0ID0gMHgyMDAwMDAwMCwKICAgICBBY2NlcHRBbGxQaHlzICAgICAgPSAweDEwMDAwMDAwLCAKLSAgICBBY2NlcHRNeVBoeXMgICAgICAgPSAweDA4MDAwMDAwCisgICAgQWNjZXB0TXlQaHlzICAgICAgID0gMHgwODAwMDAwMCwKKyAgICBSeEZpbHRlckVuYWJsZSAgICAgPSAweDgwMDAwMDAwCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfQnVmZmVyRGVzYyB7CkBAIC0yMDcsMTcgKzIwNSwxMiBAQAogc3RhdGljIEJ1ZmZlckRlc2MgdHhkICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwogc3RhdGljIEJ1ZmZlckRlc2MgcnhkW05VTV9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwogCi0jaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBUWF9CVUZfU0laRSkKLSNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBOVU1fUlhfREVTQypSWF9CVUZfU0laRSAtIFRYX0JVRl9TSVpFKQotI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltUWF9CVUZfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOVU1fUlhfREVTQyAqIFJYX0JVRl9TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotI2VuZGlmCiAKIC8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KIAotc3RydWN0IG5pYyAqbmF0c2VtaV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IG5hdHNlbWlfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKIHN0YXRpYyBpbnQgZWVwcm9tX3JlYWQobG9uZyBhZGRyLCBpbnQgbG9jYXRpb24pOwogc3RhdGljIGludCBtZGlvX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyB2b2lkIG5hdHNlbWlfaW5pdChzdHJ1Y3QgbmljICpuaWMpOwpAQCAtMjI4LDggKzIyMSw5IEBACiBzdGF0aWMgdm9pZCBuYXRzZW1pX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCBuYXRzZW1pX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmljICpuaWMpOwogc3RhdGljIHZvaWQgbmF0c2VtaV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7Ci1zdGF0aWMgaW50ICBuYXRzZW1pX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyB2b2lkIG5hdHNlbWlfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCAgbmF0c2VtaV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOworc3RhdGljIHZvaWQgbmF0c2VtaV9pcnEoc3RydWN0IG5pYyAqbmljLCBpcnFfYWN0aW9uX3QgYWN0aW9uKTsKIAogLyogCiAgKiBGdW5jdGlvbjogbmF0c2VtaV9wcm9iZQpAQCAtMjQ1LDI0ICsyMzksMjggQEAKICAqIFJldHVybnM6ICAgc3RydWN0IG5pYyAqOiAgICAgICAgICBwb2ludGVyIHRvIE5JQyBkYXRhIHN0cnVjdHVyZQogICovCiAKLXN0cnVjdCBuaWMgKgotbmF0c2VtaV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3N0YXRpYyBpbnQKK25hdHNlbWlfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogICAgIGludCBpOwogICAgIGludCBwcmV2X2VlZGF0YTsKICAgICB1MzIgdG1wOwogCi0gICAgaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwY2ktPmlvYWRkciA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAKICAgICAvKiBpbml0aWFsaXplIHNvbWUgY29tbW9ubHkgdXNlZCBnbG9iYWxzICovCiAJCi0gICAgaW9hZGRyICAgICA9ICppb19hZGRycyAmIH4zOworICAgIG5pYy0+aXJxbm8gID0gMDsKKyAgICBuaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKyAgICBpb2FkZHIgICAgID0gcGNpLT5pb2FkZHIgJiB+MzsKICAgICB2ZW5kb3IgICAgID0gcGNpLT52ZW5kb3I7CiAgICAgZGV2X2lkICAgICA9IHBjaS0+ZGV2X2lkOwogICAgIG5pY19uYW1lICAgPSBwY2ktPm5hbWU7Ci0gICAgCi0gICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKIAogICAgIC8qIG5hdHNlbWkgaGFzIGEgbm9uLXN0YW5kYXJkIFBNIGNvbnRyb2wgcmVnaXN0ZXIKICAgICAgKiBpbiBQQ0kgY29uZmlnIHNwYWNlLiAgU29tZSBib2FyZHMgYXBwYXJlbnRseSBuZWVkCkBAIC0zMTcsMTIgKzMxNSwxMiBAQAogICAgIC8qIGluaXRpYWxpemUgZGV2aWNlICovCiAgICAgbmF0c2VtaV9pbml0KG5pYyk7CiAKLSAgICBuaWMtPnJlc2V0ICAgID0gbmF0c2VtaV9pbml0OworICAgIGRldi0+ZGlzYWJsZSAgPSBuYXRzZW1pX2Rpc2FibGU7CiAgICAgbmljLT5wb2xsICAgICA9IG5hdHNlbWlfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gbmF0c2VtaV90cmFuc21pdDsKLSAgICBuaWMtPmRpc2FibGUgID0gbmF0c2VtaV9kaXNhYmxlOworICAgIG5pYy0+aXJxICAgICAgPSBuYXRzZW1pX2lycTsKIAotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuCkBAIC00NTIsNyArNDUwLDcgQEAKICAqIFJldHVybnM6ICAgdm9pZC4KICAqLwogc3RhdGljIHZvaWQgCi1uYXRzZW1pX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK25hdHNlbWlfcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIG91dGwoQ2hpcFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKIAkKQEAgLTUwNCwxNCArNTAyLDE0IEBACiAgKi8KIAogc3RhdGljIHZvaWQKLW5hdHNlbWlfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljKQorbmF0c2VtaV9pbml0X3R4ZChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCiB7CiAgICAgdHhkLmxpbmsgICA9ICh1MzIpIDA7CiAgICAgdHhkLmNtZHN0cyA9ICh1MzIpIDA7Ci0gICAgdHhkLmJ1ZnB0ciA9ICh1MzIpICZ0eGJbMF07CisgICAgdHhkLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZ0eGJbMF0pOwogCiAgICAgLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCi0gICAgb3V0bCgodTMyKSAmdHhkLCBpb2FkZHIgKyBUeFJpbmdQdHIpOyAKKyAgICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGQpLCBpb2FkZHIgKyBUeFJpbmdQdHIpOyAKICAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCiAgICAgICAgIHByaW50ZigibmF0c2VtaV9pbml0X3R4ZDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAogICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIFR4UmluZ1B0cikpOwpAQCAtNTI3LDcgKzUyNSw3IEBACiAgKi8KICAKIHN0YXRpYyB2b2lkIAotbmF0c2VtaV9pbml0X3J4ZChzdHJ1Y3QgbmljICpuaWMpIAorbmF0c2VtaV9pbml0X3J4ZChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpIAogeyAKICAgICBpbnQgaTsKIApAQCAtNTM1LDE2ICs1MzMsMTYgQEAKIAogICAgIC8qIGluaXQgUlggZGVzY3JpcHRvciAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7Ci0gICAgICAgIHJ4ZFtpXS5saW5rICAgPSAoaSsxIDwgTlVNX1JYX0RFU0MpID8gKHUzMikgJnJ4ZFtpKzFdIDogKHUzMikgJnJ4ZFswXTsKKyAgICAgICAgcnhkW2ldLmxpbmsgICA9IHZpcnRfdG9fYnVzKChpKzEgPCBOVU1fUlhfREVTQykgPyAmcnhkW2krMV0gOiAmcnhkWzBdKTsKICAgICAgICAgcnhkW2ldLmNtZHN0cyA9ICh1MzIpIFJYX0JVRl9TSVpFOwotICAgICAgICByeGRbaV0uYnVmcHRyID0gKHUzMikgJnJ4YltpKlJYX0JVRl9TSVpFXTsKKyAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZyeGJbaSpSWF9CVUZfU0laRV0pOwogICAgICAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCiAgICAgICAgICAgICBwcmludGYoIm5hdHNlbWlfaW5pdF9yeGQ6IHJ4ZFslZF09JVggbGluaz0lWCBjbWRzdHM9JVggYnVmcHRyPSVYXG4iLCAKICAgICAgICAgICAgICAgICAgICBpLCAmcnhkW2ldLCByeGRbaV0ubGluaywgcnhkW2ldLmNtZHN0cywgcnhkW2ldLmJ1ZnB0cik7CiAgICAgfQogCiAgICAgLyogbG9hZCBSZWNlaXZlIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KLSAgICBvdXRsKCh1MzIpICZyeGRbMF0sIGlvYWRkciArIFJ4UmluZ1B0cik7CisgICAgb3V0bCh2aXJ0X3RvX2J1cygmcnhkWzBdKSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKIAogICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKICAgICAgICAgcHJpbnRmKCJuYXRzZW1pX2luaXRfcnhkOiBSWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCkBAIC01NjIsMTQgKzU2MCwxNSBAQAogICogUmV0dXJuczogICB2b2lkLgogICovCiAKLXN0YXRpYyB2b2lkIG5hdHNlbWlfc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgbmF0c2VtaV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCiB7Ci0gICAgdTMyIHJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXM7CisgICAgdTMyIHJ4X21vZGUgPSBSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdCB8CisJICAgIEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKIAkKICAgICBvdXRsKHJ4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CiB9CiAKLXN0YXRpYyB2b2lkIG5hdHNlbWlfY2hlY2tfZHVwbGV4KHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIG5hdHNlbWlfY2hlY2tfZHVwbGV4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICBpbnQgZHVwbGV4ID0gaW5sKGlvYWRkciArIENoaXBDb25maWcpICYgMHgyMDAwMDAwMCA/IDEgOiAwOwogCQpAQCAtNjA3LDE0ICs2MDYsMTQgQEAKIAkJIHVuc2lnbmVkIGludCBzLCAgICAgLyogc2l6ZSAqLwogCQkgY29uc3QgY2hhciAgKnApICAgICAvKiBQYWNrZXQgKi8KIHsKLSAgICB1MzIgc3RhdHVzLCB0bywgbnN0eXBlOworICAgIHUzMiB0bywgbnN0eXBlOwogICAgIHZvbGF0aWxlIHUzMiB0eF9zdGF0dXM7CiAgICAgCiAgICAgLyogU3RvcCB0aGUgdHJhbnNtaXR0ZXIgKi8KICAgICBvdXRsKFR4T2ZmLCBpb2FkZHIgKyBDaGlwQ21kKTsKIAogICAgIC8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLwotICAgIG91dGwoKHUzMikgJnR4ZCwgaW9hZGRyICsgVHhSaW5nUHRyKTsKKyAgICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGQpLCBpb2FkZHIgKyBUeFJpbmdQdHIpOwogICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKICAgICAgICAgcHJpbnRmKCJuYXRzZW1pX3RyYW5zbWl0OiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCiAgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgVHhSaW5nUHRyKSk7CkBAIC02MzYsNyArNjM1LDcgQEAKICAgICAgICAgdHhiW3MrK10gPSAnXDAnOwogCiAgICAgLyogc2V0IHRoZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciBhbmQgZW5hYmxlIFRyYW5zbWl0IFN0YXRlIE1hY2hpbmUgKi8KLSAgICB0eGQuYnVmcHRyID0gKHUzMikgJnR4YlswXTsKKyAgICB0eGQuYnVmcHRyID0gdmlydF90b19idXMoJnR4YlswXSk7CiAgICAgdHhkLmNtZHN0cyA9ICh1MzIpIE9XTiB8IHM7CiAKICAgICAvKiByZXN0YXJ0IHRoZSB0cmFuc21pdHRlciAqLwpAQCAtNjQ3LDcgKzY0Niw3IEBACiAKICAgICB0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRU9VVDsKIAotICAgIHdoaWxlICgoKHR4X3N0YXR1cz10eGQuY21kc3RzKSAmIE9XTikgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQorICAgIHdoaWxlICgoKHR4X3N0YXR1cz10eGQuY21kc3RzICYgT1dOKSAmJiAoY3VycnRpY2tzKCkgPCB0bykpCiAgICAgICAgIC8qIHdhaXQgKi8gOwogCiAgICAgaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CkBAIC02NzQsNyArNjczLDcgQEAKICAqLwogCiBzdGF0aWMgaW50Ci1uYXRzZW1pX3BvbGwoc3RydWN0IG5pYyAqbmljKQorbmF0c2VtaV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogewogICAgIHUzMiByeF9zdGF0dXMgPSByeGRbY3VyX3J4XS5jbWRzdHM7CiAgICAgaW50IHJldHN0YXQgPSAwOwpAQCAtNjg1LDYgKzY4NCw4IEBACiAgICAgaWYgKCEocnhfc3RhdHVzICYgT1dOKSkKICAgICAgICAgcmV0dXJuIHJldHN0YXQ7CiAKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKwogICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKICAgICAgICAgcHJpbnRmKCJuYXRzZW1pX3BvbGw6IGdvdCBhIHBhY2tldDogY3VyX3J4OiVkLCBzdGF0dXM6JVhcbiIsCiAgICAgICAgICAgICAgICBjdXJfcngsIHJ4X3N0YXR1cyk7CkBAIC03MDQsNyArNzA1LDcgQEAKIAogICAgIC8qIHJldHVybiB0aGUgZGVzY3JpcHRvciBhbmQgYnVmZmVyIHRvIHJlY2VpdmUgcmluZyAqLwogICAgIHJ4ZFtjdXJfcnhdLmNtZHN0cyA9IFJYX0JVRl9TSVpFOwotICAgIHJ4ZFtjdXJfcnhdLmJ1ZnB0ciA9ICh1MzIpICZyeGJbY3VyX3J4KlJYX0JVRl9TSVpFXTsKKyAgICByeGRbY3VyX3J4XS5idWZwdHIgPSB2aXJ0X3RvX2J1cygmcnhiW2N1cl9yeCpSWF9CVUZfU0laRV0pOwogICAgICAgICAKICAgICBpZiAoKytjdXJfcnggPT0gTlVNX1JYX0RFU0MpCiAgICAgICAgIGN1cl9yeCA9IDA7CkBAIC03MjUsOCArNzI2LDEyIEBACiAgKi8KIAogc3RhdGljIHZvaWQKLW5hdHNlbWlfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCituYXRzZW1pX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgbmF0c2VtaV9pbml0KG5pYyk7CisKICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgdXNpbmcgdGhlIG1hc2suICovCiAgICAgb3V0bCgwLCBpb2FkZHIgKyBJbnRyTWFzayk7CiAgICAgb3V0bCgwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKQEAgLTczNywzICs3NDIsMzkgQEAKICAgICAvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0ICovCiAgICAgb3V0bChTYXZlZENsa1J1biwgaW9hZGRyICsgQ2xrUnVuKTsKIH0KKworLyogRnVuY3Rpb246IG5hdHNlbWlfaXJxCisgKgorICogRGVzY3JpcHRpb246IEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgICAgIGlycV9hY3Rpb25fdCBhY3Rpb246ICAgICAgcmVxdWVzdGVkIGFjdGlvbiB0byBwZXJmb3JtCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIAorbmF0c2VtaV9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgbmF0c2VtaV9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTAwYiwgMHgwMDIwLCAiZHA4MzgxNSIsICJEUDgzODE1IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBuYXRzZW1pX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJOQVRTRU1JIiwKKwkucHJvYmUgICAgPSBuYXRzZW1pX3Byb2JlLAorCS5pZHMgICAgICA9IG5hdHNlbWlfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YobmF0c2VtaV9uaWNzKS9zaXplb2YobmF0c2VtaV9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKSW5kZXg6IGIvbmV0Ym9vdC9uZnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9uZnMuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmCV9ORlNfSAorI2RlZmluZQlfTkZTX0gKKworI2RlZmluZSBTVU5SUENfUE9SVAkxMTEKKworI2RlZmluZSBQUk9HX1BPUlRNQVAJMTAwMDAwCisjZGVmaW5lIFBST0dfTkZTCTEwMDAwMworI2RlZmluZSBQUk9HX01PVU5UCTEwMDAwNQorCisjZGVmaW5lIE1TR19DQUxMCTAKKyNkZWZpbmUgTVNHX1JFUExZCTEKKworI2RlZmluZSBQT1JUTUFQX0dFVFBPUlQJMworCisjZGVmaW5lIE1PVU5UX0FEREVOVFJZCTEKKyNkZWZpbmUgTU9VTlRfVU1PVU5UQUxMCTQKKworI2RlZmluZSBORlNfTE9PS1VQCTQKKyNkZWZpbmUJTkZTX1JFQURMSU5LCTUKKyNkZWZpbmUgTkZTX1JFQUQJNgorCisjZGVmaW5lIE5GU19GSFNJWkUJMzIKKworI2RlZmluZSBORlNFUlJfUEVSTQkxCisjZGVmaW5lIE5GU0VSUl9OT0VOVAkyCisjZGVmaW5lIE5GU0VSUl9BQ0NFUwkxMworI2RlZmluZQlORlNFUlJfSVNESVIJMjEKKyNkZWZpbmUJTkZTRVJSX0lOVkFMCTIyCisKKy8qIEJsb2NrIHNpemUgdXNlZCBmb3IgTkZTIHJlYWQgYWNjZXNzZXMuICBBIFJQQyByZXBseSBwYWNrZXQgKGluY2x1ZGluZyAgYWxsCisgKiBoZWFkZXJzKSBtdXN0IGZpdCB3aXRoaW4gYSBzaW5nbGUgRXRoZXJuZXQgZnJhbWUgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4KKyAqIENob3NlbiB0byBiZSBhIHBvd2VyIG9mIHR3bywgYXMgbW9zdCBORlMgc2VydmVycyBhcmUgb3B0aW1pemVkIGZvciB0aGlzLiAgKi8KKyNkZWZpbmUgTkZTX1JFQURfU0laRQkxMDI0CisKKyNkZWZpbmUgTkZTX01BWExJTktERVBUSCAxNgorCitzdHJ1Y3QgcnBjX3QgeworCXN0cnVjdCBpcGhkciBpcDsKKwlzdHJ1Y3QgdWRwaGRyIHVkcDsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgIGRhdGFbMzAwXTsJCS8qIGxvbmdlc3QgUlBDIGNhbGwgbXVzdCBmaXQhISEhICovCisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBpZDsKKwkJCXVpbnQzMl90IHR5cGU7CisJCQl1aW50MzJfdCBycGN2ZXJzOworCQkJdWludDMyX3QgcHJvZzsKKwkJCXVpbnQzMl90IHZlcnM7CisJCQl1aW50MzJfdCBwcm9jOworCQkJdWludDMyX3QgZGF0YVsxXTsKKwkJfSBjYWxsOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgaWQ7CisJCQl1aW50MzJfdCB0eXBlOworCQkJdWludDMyX3QgcnN0YXR1czsKKwkJCXVpbnQzMl90IHZlcmlmaWVyOworCQkJdWludDMyX3QgdjI7CisJCQl1aW50MzJfdCBhc3RhdHVzOworCQkJdWludDMyX3QgZGF0YVsxXTsKKwkJfSByZXBseTsKKwl9IHU7Cit9OworCisjZW5kaWYJLyogX05GU19IICovCkluZGV4OiBiL25ldGJvb3Qvbmk1MDEwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L25pNTAxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KLURyaXZlciBmb3IgTkk1MDEwLgotQ29kZSBmcmVlbHkgdGFrZW4gZnJvbSBKYW4tUGFzY2FsIHZhbiBCZXN0IGFuZCBBbmRyZWFzIE1vaHIncwotTGludXggTkk1MDEwIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0vKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLwotI2luY2x1ZGUgIm5pYy5oIgotLyogdG8gZ2V0IG91ciBvd24gcHJvdG90eXBlICovCi0jaW5jbHVkZSAiY2FyZHMuaCIKLQotLyogbmk1MDEwLmggZmlsZSBpbmNsdWRlZCB2ZXJiYXRpbSAqLwotLyoKLSAqIFJhY2FsLUludGVybGFuIG5pNTAxMCBFdGhlcm5ldCBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKLSAqIHNhbWUgR251IFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KLSAqCi0gKiBjb3B5cmlnaHRzIChjKSAxOTk2IGJ5IEphbi1QYXNjYWwgdmFuIEJlc3QgKGp2YmVzdEB3aS5sZWlkZW51bml2Lm5sKQotICoKLSAqIEkgaGF2ZSBkb25lIGEgbG9vayBpbiB0aGUgZm9sbG93aW5nIHNvdXJjZXM6Ci0gKiAgIGNyeW53ci1wYWNrZXQtZHJpdmVyIGJ5IFJ1c3MgTmVsc29uCi0gKi8KLQotI2RlZmluZSBOSTUwMTBfQlVGU0laRQkyMDQ4CS8qIG51bWJlciBvZiBieXRlcyBpbiBhIGJ1ZmZlciAqLwotCi0jZGVmaW5lIE5JNTAxMF9NQUdJQ1ZBTDAgMHgwMCAgLyogbWFnaWMtdmFsdWVzIGZvciBuaTUwMTAgY2FyZCAqLwotI2RlZmluZSBOSTUwMTBfTUFHSUNWQUwxIDB4NTUKLSNkZWZpbmUgTkk1MDEwX01BR0lDVkFMMiAweEFBCi0KLSNkZWZpbmUgU0FfQUREUjAgMHgwMgotI2RlZmluZSBTQV9BRERSMSAweDA3Ci0jZGVmaW5lIFNBX0FERFIyIDB4MDEKLQotLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIG5pNTAxMCBldGhlcmNhcmQuICovCi0jZGVmaW5lIE5JNTAxMF9JT19FWFRFTlQgICAgICAgMzIKLQotI2RlZmluZSBQUklOVEsoeCkgaWYgKE5JNTAxMF9ERUJVRykgcHJpbnRrIHgKLSNkZWZpbmUgUFJJTlRLMih4KSBpZiAoTkk1MDEwX0RFQlVHPj0yKSBwcmludGsgeAotI2RlZmluZSBQUklOVEszKHgpIGlmIChOSTUwMTBfREVCVUc+PTMpIHByaW50ayB4Ci0KLS8qIFRoZSB2YXJpb3VzIElFIGNvbW1hbmQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEVETENfWFNUQVQJKGlvYWRkciArIDB4MDApCS8qIEVETEMgdHJhbnNtaXQgY3NyICovCi0jZGVmaW5lIEVETENfWENMUgkoaW9hZGRyICsgMHgwMCkJLyogRURMQyB0cmFuc21pdCAiQ2xlYXIgSVJRIiAqLwotI2RlZmluZSBFRExDX1hNQVNLCShpb2FkZHIgKyAweDAxKQkvKiBFRExDIHRyYW5zbWl0ICJJUlEgTWFza3MiICovCi0jZGVmaW5lIEVETENfUlNUQVQJKGlvYWRkciArIDB4MDIpCS8qIEVETEMgcmVjZWl2ZSBjc3IgKi8KLSNkZWZpbmUgRURMQ19SQ0xSCShpb2FkZHIgKyAweDAyKQkvKiBFRExDIHJlY2VpdmUgIkNsZWFyIElSUSIgKi8KLSNkZWZpbmUgRURMQ19STUFTSwkoaW9hZGRyICsgMHgwMykJLyogRURMQyByZWNlaXZlICJJUlEgTWFza3MiICovCi0jZGVmaW5lIEVETENfWE1PREUJKGlvYWRkciArIDB4MDQpCS8qIEVETEMgdHJhbnNtaXQgTW9kZSAqLwotI2RlZmluZSBFRExDX1JNT0RFCShpb2FkZHIgKyAweDA1KQkvKiBFRExDIHJlY2VpdmUgTW9kZSAqLwotI2RlZmluZSBFRExDX1JFU0VUCShpb2FkZHIgKyAweDA2KQkvKiBFRExDIFJFU0VUIHJlZ2lzdGVyICovCi0jZGVmaW5lIEVETENfVERSMQkoaW9hZGRyICsgMHgwNykJLyogIlRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkiIHJlZzEgKi8KLSNkZWZpbmUgRURMQ19BRERSCShpb2FkZHIgKyAweDA4KQkvKiBFRExDIHN0YXRpb24gYWRkcmVzcywgNiBieXRlcyAqLwotCSAJCQkvKiAweDBFIGRvZXNuJ3QgZXhpc3QgZm9yIHIvdyAqLwotI2RlZmluZSBFRExDX1REUjIJKGlvYWRkciArIDB4MGYpCS8qICJUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IiByZWcyICovCi0jZGVmaW5lIElFX0dQCQkoaW9hZGRyICsgMHgxMCkJLyogR1AgcG9pbnRlciAod29yZCByZWdpc3RlcikgKi8KLQkJCQkvKiAweDExIGlzIDJuZCBieXRlIG9mIEdQIFBvaW50ZXIgKi8KLSNkZWZpbmUgSUVfUkNOVAkJKGlvYWRkciArIDB4MTApCS8qIENvdW50IG9mIGJ5dGVzIGluIHJjdidkIHBhY2tldCAqLwotIAkJCQkvKiAweDExIGlzIDJuZCBieXRlIG9mICJCeXRlIENvdW50IiAqLwotI2RlZmluZSBJRV9NTU9ERQkoaW9hZGRyICsgMHgxMikJLyogTWVtb3J5IE1vZGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUVfRE1BX1JTVAkoaW9hZGRyICsgMHgxMykJLyogSUUgRE1BIFJlc2V0LiAgd3JpdGUgb25seSAqLwotI2RlZmluZSBJRV9JU1RBVAkoaW9hZGRyICsgMHgxMykJLyogSUUgSW50ZXJydXB0IFN0YXR1cy4gIHJlYWQgb25seSAqLwotI2RlZmluZSBJRV9SQlVGCQkoaW9hZGRyICsgMHgxNCkJLyogSUUgUmVjZWl2ZSBCdWZmZXIgcG9ydCAqLwotI2RlZmluZSBJRV9YQlVGCQkoaW9hZGRyICsgMHgxNSkJLyogSUUgVHJhbnNtaXQgQnVmZmVyIHBvcnQgKi8KLSNkZWZpbmUgSUVfU0FQUk9NCShpb2FkZHIgKyAweDE2KQkvKiB3aW5kb3cgb24gc3RhdGlvbiBhZGRyIHByb20gKi8KLSNkZWZpbmUgSUVfUkVTRVQJKGlvYWRkciArIDB4MTcpCS8qIGFueSB3cml0ZSBjYXVzZXMgQm9hcmQgUmVzZXQgKi8KLQotLyogYml0cyBpbiBFRExDX1hTVEFULCBpbnRlcnJ1cHQgY2xlYXIgb24gd3JpdGUsIHN0YXR1cyB3aGVuIHJlYWQgKi8KLSNkZWZpbmUgWFNfVFBPSwkJMHg4MAkvKiB0cmFuc21pdCBwYWNrZXQgc3VjY2Vzc2Z1bCAqLwotI2RlZmluZSBYU19DUwkJMHg0MAkvKiBjYXJyaWVyIHNlbnNlICovCi0jZGVmaW5lIFhTX1JDVkQJCTB4MjAJLyogdHJhbnNtaXR0ZWQgcGFja2V0IHJlY2VpdmVkICovCi0jZGVmaW5lIFhTX1NIT1JUCTB4MTAJLyogdHJhbnNtaXNzaW9uIG1lZGlhIGlzIHNob3J0ZWQgKi8KLSNkZWZpbmUgWFNfVUZMVwkJMHgwOAkvKiB1bmRlcmZsb3cuICBpZmYgZmFpbGVkIGJvYXJkICovCi0jZGVmaW5lIFhTX0NPTEwJCTB4MDQJLyogY29sbGlzaW9uIG9jY3VycmVkICovCi0jZGVmaW5lIFhTXzE2Q09MTAkweDAyCS8qIDE2dGggY29sbGlzaW9uIG9jY3VycmVkICovCi0jZGVmaW5lIFhTX1BFUlIJCTB4MDEJLyogcGFyaXR5IGVycm9yICovCi0KLSNkZWZpbmUgWFNfQ0xSX1VGTFcJMHgwOAkvKiBjbGVhciB1bmRlcmZsb3cgKi8KLSNkZWZpbmUgWFNfQ0xSX0NPTEwJMHgwNAkvKiBjbGVhciBjb2xsaXNpb24gKi8KLSNkZWZpbmUgWFNfQ0xSXzE2Q09MTAkweDAyCS8qIGNsZWFyIDE2dGggY29sbGlzaW9uICovCi0jZGVmaW5lIFhTX0NMUl9QRVJSCTB4MDEJLyogY2xlYXIgcGFyaXR5IGVycm9yICovCi0KLS8qIGJpdHMgaW4gRURMQ19YTUFTSywgbWFzay9lbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cy4gIHJlZ2lzdGVyIGlzIHIvdyAqLwotI2RlZmluZSBYTV9UUE9LCQkweDgwCS8qID0xIHRvIGVuYWJsZSBYbXQgUGt0IE9LIGludGVycnVwdHMgKi8KLSNkZWZpbmUgWE1fUkNWRAkJMHgyMAkvKiA9MSB0byBlbmFibGUgWG10IFBrdCBSY3ZkIGludHMgKi8KLSNkZWZpbmUgWE1fVUZMVwkJMHgwOAkvKiA9MSB0byBlbmFibGUgWG10IFVuZGVyZmxvdyBpbnRzICovCi0jZGVmaW5lIFhNX0NPTEwJCTB4MDQJLyogPTEgdG8gZW5hYmxlIFhtdCBDb2xsaXNpb24gaW50cyAqLwotI2RlZmluZSBYTV9DT0xMMTYJMHgwMgkvKiA9MSB0byBlbmFibGUgWG10IDE2dGggQ29sbCBpbnRzICovCi0jZGVmaW5lIFhNX1BFUlIJCTB4MDEJLyogPTEgdG8gZW5hYmxlIFhtdCBQYXJpdHkgRXJyb3IgaW50cyAqLwotIAkJCQkvKiBub3RlOiBhbHdheXMgY2xlYXIgdGhpcyBiaXQgKi8KLSNkZWZpbmUgWE1fQUxMCQkoWE1fVFBPSyB8IFhNX1JDVkQgfCBYTV9VRkxXIHwgWE1fQ09MTCB8IFhNX0NPTEwxNikKLQotLyogYml0cyBpbiBFRExDX1JTVEFULCBpbnRlcnJ1cHQgY2xlYXIgb24gd3JpdGUsIHN0YXR1cyB3aGVuIHJlYWQgKi8KLSNkZWZpbmUgUlNfUEtUX09LCTB4ODAJLyogcmVjZWl2ZWQgZ29vZCBwYWNrZXQgKi8KLSNkZWZpbmUgUlNfUlNUX1BLVAkweDEwCS8qIFJFU0VUIHBhY2tldCByZWNlaXZlZCAqLwotI2RlZmluZSBSU19SVU5UCQkweDA4CS8qIFJ1bnQgUGt0IHJjdmQuICBMZW4gPCA2NCBCeXRlcyAqLwotI2RlZmluZSBSU19BTElHTgkweDA0CS8qIEFsaWdubWVudCBlcnJvci4gbm90IDggYml0IGFsaWduZWQgKi8KLSNkZWZpbmUgUlNfQ1JDX0VSUgkweDAyCS8qIEJhZCBDUkMgb24gcmN2ZCBwa3QgKi8KLSNkZWZpbmUgUlNfT0ZMVwkJMHgwMQkvKiBvdmVyZmxvdyBmb3IgcmN2IEZJRk8gKi8KLSNkZWZpbmUgUlNfVkFMSURfQklUUwkoIFJTX1BLVF9PSyB8IFJTX1JTVF9QS1QgfCBSU19SVU5UIHwgUlNfQUxJR04gfCBSU19DUkNfRVJSIHwgUlNfT0ZMVyApCi0gCQkJCS8qIGFsbCB2YWxpZCBSU1RBVCBiaXRzICovCi0KLSNkZWZpbmUgUlNfQ0xSX1BLVF9PSwkweDgwCS8qIGNsZWFyIHJjdmQgcGFja2V0IGludGVycnVwdCAqLwotI2RlZmluZSBSU19DTFJfUlNUX1BLVAkweDEwCS8qIGNsZWFyIFJFU0VUIHBhY2tldCByZWNlaXZlZCAqLwotI2RlZmluZSBSU19DTFJfUlVOVAkweDA4CS8qIGNsZWFyIFJ1bnQgUGNrdCByZWNlaXZlZCAqLwotI2RlZmluZSBSU19DTFJfQUxJR04JMHgwNAkvKiBjbGVhciBBbGlnbm1lbnQgZXJyb3IgKi8KLSNkZWZpbmUgUlNfQ0xSX0NSQ19FUlIJMHgwMgkvKiBjbGVhciBDUkMgZXJyb3IgKi8KLSNkZWZpbmUgUlNfQ0xSX09GTFcJMHgwMQkvKiBjbGVhciByY3YgRklGTyBPdmVyZmxvdyAqLwotCi0vKiBiaXRzIGluIEVETENfUk1BU0ssIG1hc2svZW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cy4gIHJlZ2lzdGVyIGlzIHIvdyAqLwotI2RlZmluZSBSTV9QS1RfT0sJMHg4MAkvKiA9MSB0byBlbmFibGUgcmN2ZCBnb29kIHBhY2tldCBpbnRzICovCi0jZGVmaW5lIFJNX1JTVF9QS1QJMHgxMAkvKiA9MSB0byBlbmFibGUgUkVTRVQgcGFja2V0IGludHMgKi8KLSNkZWZpbmUgUk1fUlVOVAkJMHgwOAkvKiA9MSB0byBlbmFibGUgUnVudCBQa3QgcmN2ZCBpbnRzICovCi0jZGVmaW5lIFJNX0FMSUdOCTB4MDQJLyogPTEgdG8gZW5hYmxlIEFsaWdubWVudCBlcnJvciBpbnRzICovCi0jZGVmaW5lIFJNX0NSQ19FUlIJMHgwMgkvKiA9MSB0byBlbmFibGUgQmFkIENSQyBlcnJvciBpbnRzICovCi0jZGVmaW5lIFJNX09GTFcJCTB4MDEJLyogPTEgdG8gZW5hYmxlIG92ZXJmbG93IGVycm9yIGludHMgKi8KLQotLyogYml0cyBpbiBFRExDX1JNT0RFLCBzZXQgUmVjZWl2ZSBQYWNrZXQgbW9kZS4gIHJlZ2lzdGVyIGlzIHIvdyAqLwotI2RlZmluZSBSTURfVEVTVAkweDgwCS8qID0xIGZvciBDaGlwIHRlc3RpbmcuICBub3JtYWxseSAwICovCi0jZGVmaW5lIFJNRF9BRERfU0laCTB4MTAJLyogPTEgNS1ieXRlIGFkZHIgbWF0Y2guICBub3JtYWxseSAwICovCi0jZGVmaW5lIFJNRF9FTl9SVU5UCTB4MDgJLyogPTEgZW5hYmxlIHJ1bnQgcmN2LiAgbm9ybWFsbHkgMCAqLwotI2RlZmluZSBSTURfRU5fUlNUCTB4MDQJLyogPTEgdG8gcmN2IFJFU0VUIHBrdC4gIG5vcm1hbGx5IDAgKi8KLQotI2RlZmluZSBSTURfUFJPTUlTQwkweDAzCS8qIHJlY2VpdmUgKmFsbCogcGFja2V0cy4gIHVudXN1YWwgKi8KLSNkZWZpbmUgUk1EX01VTFRJQ0FTVAkweDAyCS8qIHJlY2VpdmUgbXVsdGljYXN0cyB0b28uICB1bnVzdWFsICovCi0jZGVmaW5lIFJNRF9CUk9BRENBU1QJMHgwMQkvKiByZWNlaXZlIGJyb2FkY2FzdHMgJiBub3JtYWwuIHVzdWFsICovCi0jZGVmaW5lIFJNRF9OT19QQUNLRVRTCTB4MDAJLyogZG9uJ3QgcmVjZWl2ZSBhbnkgcGFja2V0cy4gdW51c3VhbCAqLwotCi0vKiBiaXRzIGluIEVETENfWE1PREUsIHNldCBUcmFuc21pdCBQYWNrZXQgbW9kZS4gIHJlZ2lzdGVyIGlzIHIvdyAqLwotI2RlZmluZSBYTURfQ09MTF9DTlQJMHhmMAkvKiBjb2xsJ3Mgc2luY2Ugc3VjY2Vzcy4gIHJlYWQtb25seSAqLwotI2RlZmluZSBYTURfSUdfUEFSCTB4MDgJLyogPTEgdG8gaWdub3JlIHBhcml0eS4gIEFMV0FZUyBzZXQgKi8KLSNkZWZpbmUgWE1EX1RfTU9ERQkweDA0CS8qID0xIHRvIHBvd2VyIHhjdnIuIEFMV0FZUyBzZXQgdGhpcyAqLwotI2RlZmluZSBYTURfTEJDCQkweDAyCS8qID0xIGZvciBsb29wYmFjay4gIG5vcm1hbGx5IHNldCAqLwotI2RlZmluZSBYTURfRElTX0MJMHgwMQkvKiA9MSBkaXNhYmxlcyBjb250ZW50aW9uLiBub3JtYWxseSAwICovCi0KLS8qIGJpdHMgaW4gRURMQ19SRVNFVCwgd3JpdGUgb25seSAqLwotI2RlZmluZSBSU19SRVNFVAkweDgwCS8qID0xIHRvIGhvbGQgRURMQyBpbiByZXNldCBzdGF0ZSAqLwotCi0vKiBiaXRzIGluIElFX01NT0RFLCB3cml0ZSBvbmx5ICovCi0jZGVmaW5lIE1NX0VOX0RNQQkweDgwCS8qID0xIGJlZ2luIERNQSB4ZmVyLCBDcGx0IGNscnMgaXQgKi8KLSNkZWZpbmUgTU1fRU5fUkNWCTB4NDAJLyogPTEgYWxsb3dzIFBrdCByY3YuICBjbHInZCBieSByY3YgKi8KLSNkZWZpbmUgTU1fRU5fWE1UCTB4MjAJLyogPTEgYmVnaW4gWG10IHBrdC4gIENwbHQgY2xycyBpdCAqLwotI2RlZmluZSBNTV9CVVNfUEFHRQkweDE4CS8qID0wMCBBTFdBWVMuICBVc2VkIHdoZW4gTVVYPTEgKi8KLSNkZWZpbmUgTU1fTkVUX1BBR0UJMHgwNgkvKiA9MDAgQUxXQVlTLiAgVXNlZCB3aGVuIE1VWD0wICovCi0jZGVmaW5lIE1NX01VWAkJMHgwMQkvKiA9MSBtZWFucyBSY3YgQnVmZiBvbiBzeXN0ZW0gYnVzICovCi0JCQkJLyogPTAgbWVhbnMgWG10IEJ1ZmYgb24gc3lzdGVtIGJ1cyAqLwotCi0vKiBiaXRzIGluIElFX0lTVEFULCByZWFkIG9ubHkgKi8KLSNkZWZpbmUgSVNfVERJQUcJMHg4MAkvKiA9MSBpZiBEaWFnbm9zdGljIHByb2JsZW0gKi8KLSNkZWZpbmUgSVNfRU5fUkNWCTB4MjAJLyogPTEgdW50aWwgZnJhbWUgaXMgcmN2J2QgY3BsdCAqLwotI2RlZmluZSBJU19FTl9YTVQJMHgxMAkvKiA9MSB1bnRpbCBmcmFtZSBpcyB4bXQnZCBjcGx0ICovCi0jZGVmaW5lIElTX0VOX0RNQQkweDA4CS8qID0xIHVudGlsIERNQSBpcyBjcGx0IG9yIGFib3J0ZWQgKi8KLSNkZWZpbmUgSVNfRE1BX0lOVAkweDA0CS8qID0wIGlmZiBETUEgZG9uZSBpbnRlcnJ1cHQuICovCi0jZGVmaW5lIElTX1JfSU5UCTB4MDIJLyogPTAgaWZmIHVubWFza2VkIFJjdiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVNfWF9JTlQJMHgwMQkvKiA9MCBpZmYgdW5tYXNrZWQgWG10IGludGVycnVwdCAqLwotCi0vKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAkJaW9hZGRyID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJCWJ1ZnNpemVfcmN2ID0gMDsKLQotI2lmCTAKLXN0YXRpYyB2b2lkIHNob3dfcmVnaXN0ZXJzKHZvaWQpCi17Ci0JcHJpbnRmKCJYU1RBVCAlaGhYICIsIGluYihFRExDX1hTVEFUKSk7Ci0JcHJpbnRmKCJYTUFTSyAlaGhYICIsIGluYihFRExDX1hNQVNLKSk7Ci0JcHJpbnRmKCJSU1RBVCAlaGhYICIsIGluYihFRExDX1JTVEFUKSk7Ci0JcHJpbnRmKCJSTUFTSyAlaGhYICIsIGluYihFRExDX1JNQVNLKSk7Ci0JcHJpbnRmKCJSTU9ERSAlaGhYICIsIGluYihFRExDX1JNT0RFKSk7Ci0JcHJpbnRmKCJYTU9ERSAlaGhYICIsIGluYihFRExDX1hNT0RFKSk7Ci0JcHJpbnRmKCJJU1RBVCAlaGhYXG4iLCBpbmIoSUVfSVNUQVQpKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCByZXNldF9yZWNlaXZlcih2b2lkKQotewotCW91dHcoMCwgSUVfR1ApOwkJLyogUmVjZWl2ZSBwYWNrZXQgYXQgc3RhcnQgb2YgYnVmZmVyICovCi0Jb3V0YihSU19WQUxJRF9CSVRTLCBFRExDX1JDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyBSY3YgaW50ZXJydXB0cyAqLwotCW91dGIoTU1fRU5fUkNWLCBJRV9NTU9ERSk7IC8qIEVuYWJsZSByY3YgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG5pNTAxMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQlpOwotCi0JLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuICBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCi0Jb3V0YihSU19SRVNFVCwgRURMQ19SRVNFVCk7CS8qIEhvbGQgdXAgRURMQ19SRVNFVCB3aGlsZSBjb25maWdpbmcgYm9hcmQgKi8KLQlvdXRiKDAsIElFX1JFU0VUKTsJLyogSGFyZHdhcmUgcmVzZXQgb2Ygbmk1MDEwIGJvYXJkICovCi0Jb3V0YigwLCBFRExDX1hNQVNLKTsJLyogRGlzYWJsZSBhbGwgWG10IGludGVycnVwdHMgKi8KLQlvdXRiKDAsIEVETENfUk1BU0spOwkvKiBEaXNhYmxlIGFsbCBSY3YgaW50ZXJydXB0ICovCi0Jb3V0YigweEZGLCBFRExDX1hDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyBYbXQgaW50ZXJydXB0cyAqLwotCW91dGIoMHhGRiwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgUmN2IGludGVycnVwdHMgKi8KLQlvdXRiKFhNRF9MQkMsIEVETENfWE1PREUpOwkvKiBPbmx5IGxvb3BiYWNrIHhtaXRzICovCi0JLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgKi8KLQlmb3IoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBFRExDX0FERFIgKyBpKTsKLQlvdXRiKFhNRF9JR19QQVIgfCBYTURfVF9NT0RFIHwgWE1EX0xCQywgRURMQ19YTU9ERSk7IAotCQkJCS8qIE5vcm1hbCBwYWNrZXQgeG1pdCBtb2RlICovCi0Jb3V0YihSTURfQlJPQURDQVNULCBFRExDX1JNT0RFKTsKLQkJCQkvKiBSZWNlaXZlIGJyb2FkY2FzdCBhbmQgbm9ybWFsIHBhY2tldHMgKi8KLQlyZXNldF9yZWNlaXZlcigpOwotCW91dGIoMHgwMCwgRURMQ19SRVNFVCk7CS8qIFVuLXJlc2V0IHRoZSBuaTUwMTAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuaTUwMTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQlyY3Zfc3RhdDsKLQotCWlmICgoKHJjdl9zdGF0ID0gaW5iKEVETENfUlNUQVQpKSAmIFJTX1ZBTElEX0JJVFMpICE9IFJTX1BLVF9PSykgewotCQlvdXRiKHJjdl9zdGF0LCBFRExDX1JTVEFUKTsJLyogQ2xlYXIgdGhlIHN0YXR1cyAqLwotCQlyZXR1cm4gKDApOwotCX0KLSAgICAgICAgb3V0YihyY3Zfc3RhdCwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgdGhlIHN0YXR1cyAqLwotCW5pYy0+cGFja2V0bGVuID0gaW53KElFX1JDTlQpOwotCS8qIFJlYWQgcGFja2V0IGludG8gYnVmZmVyICovCi0gICAgICAgIG91dGIoTU1fTVVYLCBJRV9NTU9ERSk7CS8qIFJjdiBidWZmZXIgdG8gc3lzdGVtIGJ1cyAqLwotCW91dHcoMCwgSUVfR1ApOwkJLyogU2VlayB0byBiZWdpbm5pbmcgb2YgcGFja2V0ICovCi0JaW5zYihJRV9SQlVGLCBuaWMtPnBhY2tldCwgbmljLT5wYWNrZXRsZW4pOyAKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbmk1MDEwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywKLQljb25zdCBjaGFyICpkLAkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkvKiBUeXBlICovCi0JdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KLQljb25zdCBjaGFyICpwKQkvKiBQYWNrZXQgKi8KLXsKLQl1bnNpZ25lZCBpbnQJbGVuOwotCWludAkJYnVmX29mZnMsIHhtdF9zdGF0OwotCXVuc2lnbmVkIGxvbmcJdGltZTsKLQotCWxlbiA9IHMgKyBFVEhfSExFTjsKLQlpZiAobGVuIDwgRVRIX1pMRU4pCi0JCWxlbiA9IEVUSF9aTEVOOwotCWJ1Zl9vZmZzID0gTkk1MDEwX0JVRlNJWkUgLSBsZW47Ci0Jb3V0YigwLCBFRExDX1JNQVNLKTsJLyogTWFzayBhbGwgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCi0Jb3V0YigwLCBJRV9NTU9ERSk7CS8qIFB1dCBYbWl0IGJ1ZmZlciBvbiBzeXN0ZW0gYnVzICovCi0Jb3V0YigweEZGLCBFRExDX1JDTFIpOwkvKiBDbGVhciBvdXQgcGVuZGluZyByY3YgaW50ZXJydXB0cyAqLwotCW91dHcoYnVmX29mZnMsIElFX0dQKTsJLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCi0Jb3V0c2IoSUVfWEJVRiwgZCwgRVRIX0FMRU4pOwkvKiBQdXQgZHN0IGluIGJ1ZmZlciAqLwotCW91dHNiKElFX1hCVUYsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7LyogUHV0IHNyYyBpbiBidWZmZXIgKi8KLQlvdXRiKHQgPj4gOCwgSUVfWEJVRik7Ci0Jb3V0Yih0LCBJRV9YQlVGKTsKLQlvdXRzYihJRV9YQlVGLCBwLCBzKTsJLyogUHV0IGRhdGEgaW4gYnVmZmVyICovCi0Jd2hpbGUgKHMrKyA8IEVUSF9aTEVOIC0gRVRIX0hMRU4pCS8qIFBhZCB0byBtaW4gc2l6ZSAqLwotCQlvdXRiKDAsIElFX1hCVUYpOwotCW91dHcoYnVmX29mZnMsIElFX0dQKTsJLyogUmV3cml0ZSB3aGVyZSBwYWNrZXQgc3RhcnRzICovCi0JLyogc2hvdWxkIHdvcmsgd2l0aG91dCB0aGF0IG91dGIoKSAoQ3J5bndyIHVzZWQgaXQpICovCi0JLypvdXRiKE1NX01VWCwgSUVfTU1PREUpOyovCi0JLyogWG10IGJ1ZmZlciB0byBFRExDIGJ1cyAqLwotCW91dGIoTU1fRU5fWE1UIHwgTU1fTVVYLCBJRV9NTU9ERSk7CS8qIEJlZ2luIHRyYW5zbWlzc2lvbiAqLwotCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRlICovCi0Jd2hpbGUgKCgoeG10X3N0YXQgPSBpbmIoSUVfSVNUQVQpKSAmIElTX0VOX1hNVCkgIT0gMCkKLQkJOwotCXJlc2V0X3JlY2VpdmVyKCk7CS8qIEltbWVkaWF0ZWx5IHN3aXRjaCB0byByZWNlaXZlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbmk1MDEwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCW91dGIoMCwgSUVfTU1PREUpOwotCW91dGIoUlNfUkVTRVQsIEVETENfUkVTRVQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCByZF9wb3J0KHZvaWQpCi17Ci0JaW5iKElFX1JCVUYpOwotCXJldHVybiBpbmIoSUVfU0FQUk9NKTsKLX0KLQotc3RhdGljIGludCBuaTUwMTBfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCWksIGJvZ3VzY291bnQgPSA0MCwgZGF0YTsKLQotCS8qIFRoZSB0ZXN0cyBhcmUgZnJvbSB0aGUgTGludXggTkk1MDEwIGRyaXZlcgotCSAgIEkgZG9uJ3QgdW5kZXJzdGFuZCBpdCBhbGwsIGJ1dCBpZiBpdCB3b3JrcyBmb3IgdGhlbS4uLiAgKi8KLQlpZiAoaW5iKGlvYWRkcikgPT0gMHhGRikKLQkJcmV0dXJuICgwKTsKLQl3aGlsZSAoKHJkX3BvcnQoKSAmIHJkX3BvcnQoKSAmIHJkX3BvcnQoKQotCQkmIHJkX3BvcnQoKSAmIHJkX3BvcnQoKSAmIHJkX3BvcnQoKSkgIT0gMHhGRikKLQl7Ci0JCWlmIChib2d1c2NvdW50LS0gPD0gMCkKLQkJCXJldHVybiAoMCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlpZiAoKGRhdGEgPSByZF9wb3J0KCkpICE9IDB4RkYpCi0JCQlicmVhazsKLQlpZiAoZGF0YSA9PSAweEZGKQotCQlyZXR1cm4gKDApOwotCWlmIChkYXRhID09IFNBX0FERFIwICYmIHJkX3BvcnQoKSA9PSBTQV9BRERSMSAmJiByZF9wb3J0KCkgPT0gU0FfQUREUjIpIHsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJCXJkX3BvcnQoKTsKLQkJaWYgKHJkX3BvcnQoKSAhPSBOSTUwMTBfTUFHSUNWQUwxIHx8IHJkX3BvcnQoKSAhPSBOSTUwMTBfTUFHSUNWQUwyKQotCQkJcmV0dXJuICgwKTsKLQl9IGVsc2UKLQkJcmV0dXJuICgwKTsKLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotCQlvdXR3KGksIElFX0dQKTsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoSUVfU0FQUk9NKTsKLQl9Ci0JcHJpbnRmKCJcbk5JNTAxMCBpb2FkZHIgJSNoWCwgYWRkciAlIVxuIiwgaW9hZGRyLCBuaWMtPm5vZGVfYWRkcik7Ci0vKiBnZXQgdGhlIHNpemUgb2YgdGhlIG9uYm9hcmQgcmVjZWl2ZSBidWZmZXIKLSAqIGhpZ2hlciBhZGRyZXNzZXMgdGhhbiBidWZzaXplIGFyZSB3cmFwcGVkIGludG8gcmVhbCBidWZmZXIKLSAqIGkuZS4gZGF0YSBmb3Igb2Zmcy4gMHg4MDEgaXMgd3JpdHRlbiB0byAweDEgd2l0aCBhIDJLIG9uYm9hcmQgYnVmZmVyCi0gKi8KLQlpZiAoYnVmc2l6ZV9yY3YgPT0gMCkgewotICAgICAgICAJb3V0YigxLCBJRV9NTU9ERSk7ICAgICAgLyogUHV0IFJjdiBidWZmZXIgb24gc3lzdGVtIGJ1cyAqLwotICAgICAgICAJb3V0dygwLCBJRV9HUCk7CQkvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KLSAgICAgICAgCW91dGIoMCwgSUVfUkJVRik7CS8qIHNldCBidWZmZXIgYnl0ZSAwIHRvIDAgKi8KLSAgICAgICAgCWZvciAoaSA9IDE7IGkgPCAweEZGOyBpKyspIHsKLSAgICAgICAgICAgICAgICAJb3V0dyhpIDw8IDgsIElFX0dQKTsgLyogUG9pbnQgR1AgYXQgcGFja2V0IHNpemUgdG8gYmUgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgCW91dGIoaSwgSUVfUkJVRik7Ci0gICAgICAgICAgICAgICAgCW91dHcoMHgwLCBJRV9HUCk7IC8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLwotICAgICAgICAgICAgICAgIAlkYXRhID0gaW5iKElFX1JCVUYpOwotICAgICAgICAgICAgICAgIAlpZiAoZGF0YSA9PSBpKSBicmVhazsKLSAgICAgICAgCX0KLQkJYnVmc2l6ZV9yY3YgPSBpIDw8IDg7Ci0gICAgICAgIAlvdXR3KDAsIElFX0dQKTsJCS8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLwotICAgICAgICAJb3V0YigwLCBJRV9SQlVGKTsJLyogc2V0IGJ1ZmZlciBieXRlIDAgdG8gMCBhZ2FpbiAqLwotCX0KLQlwcmludGYoIkJ1ZnNpemUgcmN2L3htdD0lZC8lZFxuIiwgYnVmc2l6ZV9yY3YsIE5JNTAxMF9CVUZTSVpFKTsKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqbmk1MDEwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0gewotCQkweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M2EwLCAwIH07Ci0JdW5zaWduZWQgc2hvcnQJCSpwOwotCi0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiB1c2UgbGlzdCBhYm92ZSAqLwotCWlmIChwcm9iZV9hZGRycyA9PSAwIHx8ICpwcm9iZV9hZGRycyA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7IHArKykgewotCQlpZiAobmk1MDEwX3Byb2JlMShuaWMpKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpb2FkZHIgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQluaTUwMTBfcmVzZXQobmljKTsKLQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQluaWMtPnJlc2V0ID0gbmk1MDEwX3Jlc2V0OwotCW5pYy0+cG9sbCA9IG5pNTAxMF9wb2xsOwotCW5pYy0+dHJhbnNtaXQgPSBuaTUwMTBfdHJhbnNtaXQ7Ci0JbmljLT5kaXNhYmxlID0gbmk1MDEwX2Rpc2FibGU7Ci0JcmV0dXJuIChuaWMpOwotfQpJbmRleDogYi9uZXRib290L25pYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L25pYy5jCkBAIC0wLDAgKzEsMTE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgTmV0d29yayBCb290c3RyYXAgUHJvZ3JhbQorCitMaXRlcmF0dXJlIGRlYWxpbmcgd2l0aCB0aGUgbmV0d29yayBwcm90b2NvbHM6CisJQVJQIC0gUkZDODI2CisJUkFSUCAtIFJGQzkwMworICAgICAgICBJUCAtIFJGQzc5MQorCVVEUCAtIFJGQzc2OAorCUJPT1RQIC0gUkZDOTUxLCBSRkMyMTMyICh2ZW5kb3IgZXh0ZW5zaW9ucykKKwlESENQIC0gUkZDMjEzMSwgUkZDMjEzMiAob3B0aW9ucykKKwlURlRQIC0gUkZDMTM1MCwgUkZDMjM0NyAob3B0aW9ucyksIFJGQzIzNDggKGJsb2Nrc2l6ZSksIFJGQzIzNDkgKHRzaXplKQorCVJQQyAtIFJGQzE4MzEsIFJGQzE4MzIgKFhEUiksIFJGQzE4MzMgKHJwY2JpbmQvcG9ydG1hcHBlcikKKwlORlMgLSBSRkMxMDk0LCBSRkMxODEzICh2MywgdXNlZnVsIGZvciBjbGFyaWZpY2F0aW9ucywgbm90IGltcGxlbWVudGVkKQorCUlHTVAgLSBSRkMxMTEyLCBSRkMyMTEzLCBSRkMyMzY1LCBSRkMyMjM2LCBSRkMzMTcxCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgImdydWIuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJlbGYuaCIgLyogRk9SIEVNX0NVUlJFTlQgKi8KKyNpbmNsdWRlICJib290cC5oIgorI2luY2x1ZGUgImlmX2FycC5oIgorI2luY2x1ZGUgInRmdHAuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorI2luY2x1ZGUgImlwLmgiCisjaW5jbHVkZSAidWRwLmgiCisKKy8qIEN1cnJlbnRseSBubyBvdGhlciBtb2R1bGUgdXNlcyByb20sIGJ1dCBpdCBpcyBhdmFpbGFibGUgKi8KK3N0cnVjdCByb21faW5mbwkJcm9tOworc3RydWN0IGFycHRhYmxlX3QJYXJwdGFibGVbTUFYX0FSUF07CisjaWYgTVVMVElDQVNUX0xFVkVMMgordW5zaWduZWQgbG9uZyBsYXN0X2lnbXB2MSA9IDA7CitzdHJ1Y3QgaWdtcHRhYmxlX3QJaWdtcHRhYmxlW01BWF9JR01QXTsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGxvbmcJbmV0bWFzazsKKy8qIFVzZWQgYnkgbmZzLmMgKi8KK2NoYXIgKmhvc3RuYW1lID0gIiI7CitpbnQgaG9zdG5hbWVsZW4gPSAwOworc3RhdGljIHVpbnQzMl90IHhpZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICplbmRfb2ZfcmZjMTUzMyA9IE5VTEw7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBicm9hZGNhc3RbXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9Oworc3RhdGljIGNvbnN0IGluX2FkZHIgemVyb0lQID0geyAwTCB9Oworc3RhdGljIGNoYXIgcmZjMTUzM192ZW5kZGF0YVtNQVhfUkZDMTUzM19WRU5ETEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llWzRdID0geyBSRkMxNTMzX0NPT0tJRSB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTUzM19jb29raWVfYm9vdHBbNV0gPSB7IFJGQzE1MzNfQ09PS0lFLCBSRkMxNTMzX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTUzM19jb29raWVfZGhjcFtdID0geyBSRkMxNTMzX0NPT0tJRSB9Oworc3RhdGljIGludCBkaGNwX3JlcGx5Oworc3RhdGljIGluX2FkZHIgZGhjcF9zZXJ2ZXIgPSB7IDBMIH07CitzdGF0aWMgaW5fYWRkciBkaGNwX2FkZHIgPSB7IDBMIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRoY3BkaXNjb3ZlcltdID0geworCVJGQzIxMzJfTVNHX1RZUEUsIDEsIERIQ1BESVNDT1ZFUiwKKwlSRkMyMTMyX01BWF9TSVpFLCAyLAkvKiByZXF1ZXN0IGFzIG11Y2ggYXMgd2UgY2FuICovCisJRVRIX01BWF9NVFUgLyAyNTYsIEVUSF9NQVhfTVRVICUgMjU2LAorCS8qIFZlbmRvciBjbGFzcyBpZGVudGlmaWVyICovCisJUkZDMjEzMl9WRU5ET1JfQ0xBU1NfSUQsIDEwLCAnRycsICdSJywgJ1UnLCAnQicsICdDJywgJ2wnLCAnaScsICdlJywgJ24nLCAndCcsCisJUkZDMjEzMl9QQVJBTV9MSVNULCA0LCBSRkMxNTMzX05FVE1BU0ssIFJGQzE1MzNfR0FURVdBWSwKKwlSRkMxNTMzX0hPU1ROQU1FLCBSRkMxNTMzX0VYVEVOU0lPTlBBVEgsIFJGQzE1MzNfRU5ECit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGhjcHJlcXVlc3QgW10gPSB7CisJUkZDMjEzMl9NU0dfVFlQRSwxLERIQ1BSRVFVRVNULAorCVJGQzIxMzJfU1JWX0lELDQsMCwwLDAsMCwKKwlSRkMyMTMyX1JFUV9BRERSLDQsMCwwLDAsMCwKKwlSRkMyMTMyX01BWF9TSVpFLDIsCS8qIHJlcXVlc3QgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKwlFVEhfTUFYX01UVSAvIDI1NiwgRVRIX01BWF9NVFUgJSAyNTYsCisJLyogVmVuZG9yIGNsYXNzIGlkZW50aWZpZXIgKi8KKwlSRkMyMTMyX1ZFTkRPUl9DTEFTU19JRCwgMTAsICdHJywgJ1InLCAnVScsICdCJywgJ0MnLCAnbCcsICdpJywgJ2UnLCAnbicsICd0JywKKwlSRkMyMTMyX1BBUkFNX0xJU1QsCisJLyogNCBzdGFuZGFyZCArIDIgdmVuZG9ydGFncyAqLworCTQgKyAyLAorCS8qIFN0YW5kYXJkIHBhcmFtZXRlcnMgKi8KKwlSRkMxNTMzX05FVE1BU0ssIFJGQzE1MzNfR0FURVdBWSwKKwlSRkMxNTMzX0hPU1ROQU1FLCBSRkMxNTMzX0VYVEVOU0lPTlBBVEgsCisJLyogRXRoZXJib290IHZlbmRvcnRhZ3MgKi8KKwlSRkMxNTMzX1ZFTkRPUl9NQUdJQywKKwlSRkMxNTMzX1ZFTkRPUl9DT05GSUdGSUxFLAorCVJGQzE1MzNfRU5ECit9OworCisvKiBTZWUgbmljLmggKi8KK2ludCB1c2VyX2Fib3J0ID0gMDsKK2ludCBuZXR3b3JrX3JlYWR5ID0gMDsKKworI2lmZGVmCVJFUVVJUkVfVkNJX0VUSEVSQk9PVAoraW50CXZjaV9ldGhlcmJvb3Q7CisjZW5kaWYKKworc3RhdGljIGludCBkdW1teSh2b2lkICp1bnVzZWQgX191bnVzZWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyogQ2FyZWZ1bC4gIFdlIG5lZWQgYW4gYWxpZ25lZCBidWZmZXIgdG8gYXZvaWQgcHJvYmxlbXMgb24gbWFjaGluZXMKKyAqIHRoYXQgY2FyZSBhYm91dCBhbGlnbm1lbnQuICBUbyB0cml2YWxseSBhbGlnbiB0aGUgZXRoZXJuZXQgZGF0YQorICogKHRoZSBpcCBoZHIgYW5kIGFycCByZXF1ZXN0cykgd2Ugb2Zmc2V0IHRoZSBwYWNrZXQgYnkgMiBieXRlcy4KKyAqIGxlYXZpbmcgdGhlIGV0aGVybmV0IGRhdGEgMTYgYnl0ZSBhbGlnbmVkLiAgQmV5b25kIHRoaXMKKyAqIHdlIHVzZSBtZW1tb3ZlIGJ1dCB0aGlzIG1ha2VzIHRoZSBjb21tb24gY2FzdCBzaW1wbGUgYW5kIGZhc3QuCisgKi8KK3N0YXRpYyBjaGFyCXBhY2tldFtFVEhfRlJBTUVfTEVOICsgRVRIX0RBVEFfQUxJR05dIF9fYWxpZ25lZDsKKworc3RydWN0IG5pYwluaWMgPQoreworCXsKKwkJMCwJCQkJLyogZGV2LmRpc2FibGUgKi8KKwkJeworCQkJMCwKKwkJCTAsCisJCQlQQ0lfQlVTX1RZUEUsCisJCX0sCQkJCS8qIGRldi5kZXZpZCAqLworCQkwLAkJCQkvKiBpbmRleCAqLworCQkwLAkJCQkvKiB0eXBlICovCisJCVBST0JFX0ZJUlNULAkJCS8qIGhvd19wb2JlICovCisJCVBST0JFX05PTkUsCQkJLyogdG9fcHJvYmUgKi8KKwkJMCwJCQkJLyogZmFpbHNhZmUgKi8KKwkJMCwJCQkJLyogdHlwZV9pbmRleCAqLworCQl7fSwJCQkJLyogc3RhdGUgKi8KKwl9LAorCShpbnQgKCopKHN0cnVjdCBuaWMgKiwgaW50KSlkdW1teSwgICAgICAvKiBwb2xsICovCisJKHZvaWQgKCopKHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqLAorCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkJY29uc3QgY2hhciAqKSlkdW1teSwJCS8qIHRyYW5zbWl0ICovCisJKHZvaWQgKCopKHN0cnVjdCBuaWMgKiwgaXJxX2FjdGlvbl90KSlkdW1teSwgLyogaXJxICovCisJMCwJCQkJCS8qIGZsYWdzICovCisJJnJvbSwJCQkJCS8qIHJvbV9pbmZvICovCisJYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwJCS8qIG5vZGVfYWRkciAqLworCXBhY2tldCArIEVUSF9EQVRBX0FMSUdOLAkJLyogcGFja2V0ICovCisJMCwJCQkJCS8qIHBhY2tldGxlbiAqLworCTAsCQkJLyogaW9hZGRyICovCisJMCwJCQkvKiBpcnFubyAqLworCU5VTEwsCQkJCQkvKiBwcml2X2RhdGEgKi8KK307CisKKworCitpbnQgZ3J1Yl9ldGhfcHJvYmUodm9pZCkKK3sKKwlzdGF0aWMgaW50IHByb2JlZCA9IDA7CisJc3RydWN0IGRldiAqZGV2OworCisJRW50ZXJGdW5jdGlvbigiZ3J1Yl9ldGhfcHJvYmUiKTsKKworCWlmIChwcm9iZWQpCisJCXJldHVybiAxOworCisJbmV0d29ya19yZWFkeSA9IDA7CisJZ3J1Yl9tZW1zZXQoKGNoYXIgKilhcnB0YWJsZSwgMCwgTUFYX0FSUCAqIHNpemVvZihzdHJ1Y3QgYXJwdGFibGVfdCkpOworCWRldiA9ICZuaWMuZGV2OworCWRldi0+aG93X3Byb2JlID0gLTE7CisJZGV2LT50eXBlID0gTklDX0RSSVZFUjsKKwlkZXYtPmZhaWxzYWZlID0gMTsKKwlyb20gPSAqKChzdHJ1Y3Qgcm9tX2luZm8gKilST01fSU5GT19MT0NBVElPTik7CisKKwlwcm9iZWQgPSAoZXRoX3Byb2JlKGRldikgPT0gUFJPQkVfV09SS0VEKTsKKworCUxlYXZlRnVuY3Rpb24oImdydWJfZXRoX3Byb2JlIik7CisJcmV0dXJuIHByb2JlZDsKK30KKworaW50IGV0aF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYpCit7CisJcmV0dXJuIHByb2JlKGRldik7Cit9CisKK2ludCBldGhfcG9sbChpbnQgcmV0cmlldmUpCit7CisJcmV0dXJuICgoKm5pYy5wb2xsKSgmbmljLCByZXRyaWV2ZSkpOworfQorCit2b2lkIGV0aF90cmFuc21pdChjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IHZvaWQgKnApCit7CisJKCpuaWMudHJhbnNtaXQpKCZuaWMsIGQsIHQsIHMsIHApOworCWlmICh0ID09IElQKSB0d2lkZGxlKCk7Cit9CisKK3ZvaWQgZXRoX2Rpc2FibGUodm9pZCkKK3sKKyNpZmRlZiBNVUxUSUNBU1RfTEVWRUwyCisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgTUFYX0lHTVA7IGkrKykgeworCQlsZWF2ZV9ncm91cChpKTsKKwl9CisjZW5kaWYKKwlkaXNhYmxlKCZuaWMuZGV2KTsKK30KKwordm9pZCBldGhfaXJxIChpcnFfYWN0aW9uX3QgYWN0aW9uKQoreworCSgqbmljLmlycSkoJm5pYyxhY3Rpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lQQ0hLU1VNIC0gQ2hlY2tzdW0gSVAgSGVhZGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90IGlwY2hrc3VtKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgc3VtOworCXVuc2lnbmVkIGxvbmcgaTsKKwljb25zdCB1aW50OF90ICpwdHI7CisKKwkvKiBJbiB0aGUgbW9zdCBzdHJhaWdodCBmb3J3YXJkIHdheSBwb3NzaWJsZSwKKwkgKiBjb21wdXRlIGFuIGlwIHN0eWxlIGNoZWNrc3VtLgorCSAqLworCXN1bSA9IDA7CisJcHRyID0gZGF0YTsKKwlmb3IoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHZhbHVlOworCQl2YWx1ZSA9IHB0cltpXTsKKwkJaWYgKGkgJiAxKSB7CisJCQl2YWx1ZSA8PD0gODsKKwkJfQorCQkvKiBBZGQgdGhlIG5ldyB2YWx1ZSAqLworCQlzdW0gKz0gdmFsdWU7CisJCS8qIFdyYXAgYXJvdW5kIHRoZSBjYXJyeSAqLworCQlpZiAoc3VtID4gMHhGRkZGKSB7CisJCQlzdW0gPSAoc3VtICsgKHN1bSA+PiAxNikpICYgMHhGRkZGOworCQl9CisJfQorCXJldHVybiAofmNwdV90b19sZTE2KHN1bSkpICYgMHhGRkZGOworfQorCit1aW50MTZfdCBhZGRfaXBjaGtzdW1zKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1aW50MTZfdCBzdW0sIHVpbnQxNl90IG5ldykKK3sKKwl1bnNpZ25lZCBsb25nIGNoZWNrc3VtOworCXN1bSA9IH5zdW0gJiAweEZGRkY7CisJbmV3ID0gfm5ldyAmIDB4RkZGRjsKKwlpZiAob2Zmc2V0ICYgMSkgeworCQkvKiBieXRlIHN3YXAgdGhlIHN1bSBpZiBpdCBjYW1lIGZyb20gYW4gb2RkIG9mZnNldCAKKwkJICogc2luY2UgdGhlIGNvbXB1dGF0aW9uIGlzIGVuZGlhbiBpbmRlcGVuZGFudCB0aGlzCisJCSAqIHdvcmtzLgorCQkgKi8KKwkJbmV3ID0gYnN3YXBfMTYobmV3KTsKKwl9CisJY2hlY2tzdW0gPSBzdW0gKyBuZXc7CisJaWYgKGNoZWNrc3VtID4gMHhGRkZGKSB7CisJCWNoZWNrc3VtIC09IDB4RkZGRjsKKwl9CisJcmV0dXJuICh+Y2hlY2tzdW0pICYgMHhGRkZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFRkFVTFRfTkVUTUFTSyAtIFJldHVybiBkZWZhdWx0IG5ldG1hc2sgZm9yIElQIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRlZmF1bHRfbmV0bWFzayh2b2lkKQoreworCWludCBuZXQgPSBudG9obChhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyKSA+PiAyNDsKKwlpZiAobmV0IDw9IDEyNykKKwkJcmV0dXJuKGh0b25sKDB4ZmYwMDAwMDApKTsKKwllbHNlIGlmIChuZXQgPCAxOTIpCisJCXJldHVybihodG9ubCgweGZmZmYwMDAwKSk7CisJZWxzZQorCQlyZXR1cm4oaHRvbmwoMHhmZmZmZmYwMCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lQX1RSQU5TTUlUIC0gU2VuZCBhbiBJUCBkYXRhZ3JhbQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGF3YWl0X2FycChpbnQgaXZhbCwgdm9pZCAqcHRyLAorCXVuc2lnbmVkIHNob3J0IHB0eXBlLCBzdHJ1Y3QgaXBoZHIgKmlwIF9fdW51c2VkLCBzdHJ1Y3QgdWRwaGRyICp1ZHAgX191bnVzZWQpCit7CisJc3RydWN0CWFycHJlcXVlc3QgKmFycHJlcGx5OworCWlmIChwdHlwZSAhPSBBUlApCisJCXJldHVybiAwOworCWlmIChuaWMucGFja2V0bGVuIDwgRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGFycHJlcXVlc3QpKQorCQlyZXR1cm4gMDsKKwlhcnByZXBseSA9IChzdHJ1Y3QgYXJwcmVxdWVzdCAqKSZuaWMucGFja2V0W0VUSF9ITEVOXTsKKworCWlmIChhcnByZXBseS0+b3Bjb2RlICE9IGh0b25zKEFSUF9SRVBMWSkpIAorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKGFycHJlcGx5LT5zaXBhZGRyLCBwdHIsIHNpemVvZihpbl9hZGRyKSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGFycHRhYmxlW2l2YWxdLm5vZGUsIGFycHJlcGx5LT5zaHdhZGRyLCBFVEhfQUxFTik7CisJcmV0dXJuIDE7Cit9CisKK2ludCBpcF90cmFuc21pdChpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBkZXN0aXA7CisJc3RydWN0IGlwaGRyICppcDsKKwlzdHJ1Y3QgYXJwcmVxdWVzdCBhcnByZXE7CisJaW50IGFycGVudHJ5LCBpOworCWludCByZXRyeTsKKworCWlwID0gKHN0cnVjdCBpcGhkciAqKWJ1ZjsKKwlkZXN0aXAgPSBpcC0+ZGVzdC5zX2FkZHI7CisJaWYgKGRlc3RpcCA9PSBJUF9CUk9BRENBU1QpIHsKKwkJZXRoX3RyYW5zbWl0KGJyb2FkY2FzdCwgSVAsIGxlbiwgYnVmKTsKKyNpZmRlZiBNVUxUSUNBU1RfTEVWRUwxIAorCX0gZWxzZSBpZiAoKGRlc3RpcCAmIGh0b25sKE1VTFRJQ0FTVF9NQVNLKSkgPT0gaHRvbmwoTVVMVElDQVNUX05FVFdPUkspKSB7CisJCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0WzZdOworCQl1bnNpZ25lZCBsb25nIGhkZXN0aXA7CisJCWhkZXN0aXAgPSBudG9obChkZXN0aXApOworCQltdWx0aWNhc3RbMF0gPSAweDAxOworCQltdWx0aWNhc3RbMV0gPSAweDAwOworCQltdWx0aWNhc3RbMl0gPSAweDVlOworCQltdWx0aWNhc3RbM10gPSAoaGRlc3RpcCA+PiAxNikgJiAweDc7CisJCW11bHRpY2FzdFs0XSA9IChoZGVzdGlwID4+IDgpICYgMHhmZjsKKwkJbXVsdGljYXN0WzVdID0gaGRlc3RpcCAmIDB4ZmY7CisJCWV0aF90cmFuc21pdChtdWx0aWNhc3QsIElQLCBsZW4sIGJ1Zik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAoKChkZXN0aXAgJiBuZXRtYXNrKSAhPQorCQkgICAgIChhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyICYgbmV0bWFzaykpICYmCisJCSAgICBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcikKKwkJCWRlc3RpcCA9IGFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyOworCQlmb3IoYXJwZW50cnkgPSAwOyBhcnBlbnRyeTxNQVhfQVJQOyBhcnBlbnRyeSsrKQorCQkJaWYgKGFycHRhYmxlW2FycGVudHJ5XS5pcGFkZHIuc19hZGRyID09IGRlc3RpcCkgYnJlYWs7CisJCWlmIChhcnBlbnRyeSA9PSBNQVhfQVJQKSB7CisJCQlwcmludGYoIiVAIGlzIG5vdCBpbiBteSBhcnAgdGFibGUhXG4iLCBkZXN0aXApOworCQkJcmV0dXJuKDApOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQkJaWYgKGFycHRhYmxlW2FycGVudHJ5XS5ub2RlW2ldKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBFVEhfQUxFTikgewkvKiBOZWVkIHRvIGRvIGFycCByZXF1ZXN0ICovCisJCQlhcnByZXEuaHd0eXBlID0gaHRvbnMoMSk7CisJCQlhcnByZXEucHJvdG9jb2wgPSBodG9ucyhJUCk7CisJCQlhcnByZXEuaHdsZW4gPSBFVEhfQUxFTjsKKwkJCWFycHJlcS5wcm90b2xlbiA9IDQ7CisJCQlhcnByZXEub3Bjb2RlID0gaHRvbnMoQVJQX1JFUVVFU1QpOworCQkJbWVtY3B5KGFycHJlcS5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLCBFVEhfQUxFTik7CisJCQltZW1jcHkoYXJwcmVxLnNpcGFkZHIsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCQltZW1zZXQoYXJwcmVxLnRod2FkZHIsIDAsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShhcnByZXEudGlwYWRkciwgJmRlc3RpcCwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJCWZvciAocmV0cnkgPSAxOyByZXRyeSA8PSBNQVhfQVJQX1JFVFJJRVM7IHJldHJ5KyspIHsKKwkJCQlsb25nIHRpbWVvdXQ7CisJCQkJZXRoX3RyYW5zbWl0KGJyb2FkY2FzdCwgQVJQLCBzaXplb2YoYXJwcmVxKSwKKwkJCQkJJmFycHJlcSk7CisJCQkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoVElNRU9VVCwgcmV0cnkpOworCQkJCWlmIChhd2FpdF9yZXBseShhd2FpdF9hcnAsIGFycGVudHJ5LAorCQkJCQlhcnByZXEudGlwYWRkciwgdGltZW91dCkpIGdvdG8geG1pdDsKKwkJCX0KKwkJCXJldHVybigwKTsKKwkJfQoreG1pdDoKKwkJZXRoX3RyYW5zbWl0KGFycHRhYmxlW2FycGVudHJ5XS5ub2RlLCBJUCwgbGVuLCBidWYpOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBidWlsZF9pcF9oZHIodW5zaWduZWQgbG9uZyBkZXN0aXAsIGludCB0dGwsIGludCBwcm90b2NvbCwgaW50IG9wdGlvbl9sZW4sCisJaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpcGhkciAqaXA7CisJaXAgPSAoc3RydWN0IGlwaGRyICopYnVmOworCWlwLT52ZXJoZHJsZW4gPSAweDQ1OworCWlwLT52ZXJoZHJsZW4gKz0gKG9wdGlvbl9sZW4vNCk7CisJaXAtPnNlcnZpY2UgPSAwOworCWlwLT5sZW4gPSBodG9ucyhsZW4pOworCWlwLT5pZGVudCA9IDA7CisJaXAtPmZyYWdzID0gMDsgLyogU2hvdWxkIHdlIHNldCBkb24ndCBmcmFnbWVudD8gKi8KKwlpcC0+dHRsID0gdHRsOworCWlwLT5wcm90b2NvbCA9IHByb3RvY29sOworCWlwLT5jaGtzdW0gPSAwOworCWlwLT5zcmMuc19hZGRyID0gYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcjsKKwlpcC0+ZGVzdC5zX2FkZHIgPSBkZXN0aXA7CisJaXAtPmNoa3N1bSA9IGlwY2hrc3VtKGJ1Ziwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBvcHRpb25fbGVuKTsKK30KKworc3RhdGljIHVpbnQxNl90IHVkcGNoa3N1bShzdHJ1Y3QgaXBoZHIgKmlwLCBzdHJ1Y3QgdWRwaGRyICp1ZHApCit7CisJc3RydWN0IHVkcF9wc2V1ZG9faGRyIHBzZXVkbzsKKwl1aW50MTZfdCBjaGVja3N1bTsKKworCS8qIENvbXB1dGUgdGhlIHBzZXVkbyBoZWFkZXIgKi8KKwlwc2V1ZG8uc3JjLnNfYWRkciAgPSBpcC0+c3JjLnNfYWRkcjsKKwlwc2V1ZG8uZGVzdC5zX2FkZHIgPSBpcC0+ZGVzdC5zX2FkZHI7CisJcHNldWRvLnVudXNlZCAgICAgID0gMDsKKwlwc2V1ZG8ucHJvdG9jb2wgICAgPSBJUF9VRFA7CisJcHNldWRvLmxlbiAgICAgICAgID0gdWRwLT5sZW47CisKKwkvKiBTdW0gdGhlIHBzZXVkbyBoZWFkZXIgKi8KKwljaGVja3N1bSA9IGlwY2hrc3VtKCZwc2V1ZG8sIDEyKTsKKworCS8qIFN1bSB0aGUgcmVzdCBvZiB0aGUgdWRwIHBhY2tldCAqLworCWNoZWNrc3VtID0gYWRkX2lwY2hrc3VtcygxMiwgY2hlY2tzdW0sIGlwY2hrc3VtKHVkcCwgbnRvaHModWRwLT5sZW4pKSk7CisJcmV0dXJuIGNoZWNrc3VtOworfQorCisKK3ZvaWQgYnVpbGRfdWRwX2hkcih1bnNpZ25lZCBsb25nIGRlc3RpcCwgCisJdW5zaWduZWQgaW50IHNyY3NvY2ssIHVuc2lnbmVkIGludCBkZXN0c29jaywgaW50IHR0bCwKKwlpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpCit7CisJc3RydWN0IGlwaGRyICppcDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHA7CisJaXAgPSAoc3RydWN0IGlwaGRyICopYnVmOworCWJ1aWxkX2lwX2hkcihkZXN0aXAsIHR0bCwgSVBfVURQLCAwLCBsZW4sIGJ1Zik7CisJdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKilidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJdWRwLT5zcmMgPSBodG9ucyhzcmNzb2NrKTsKKwl1ZHAtPmRlc3QgPSBodG9ucyhkZXN0c29jayk7CisJdWRwLT5sZW4gPSBodG9ucyhsZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJdWRwLT5jaGtzdW0gPSAwOworCWlmICgodWRwLT5jaGtzdW0gPSB1ZHBjaGtzdW0oaXAsIHVkcCkpID09IDApCisJCXVkcC0+Y2hrc3VtID0gMHhmZmZmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVURQX1RSQU5TTUlUIC0gU2VuZCBhbiBVRFAgZGF0YWdyYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHVkcF90cmFuc21pdCh1bnNpZ25lZCBsb25nIGRlc3RpcCwgdW5zaWduZWQgaW50IHNyY3NvY2ssCisJdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpCit7CisJYnVpbGRfdWRwX2hkcihkZXN0aXAsIHNyY3NvY2ssIGRlc3Rzb2NrLCA2MCwgbGVuLCBidWYpOworCXJldHVybiBpcF90cmFuc21pdChsZW4sIGJ1Zik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUURSQUlOIC0gY2xlYXIgdGhlIG5pYydzIHJlY2VpdmUgcXVldWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBhd2FpdF9xZHJhaW4oaW50IGl2YWwgX191bnVzZWQsIHZvaWQgKnB0ciBfX3VudXNlZCwKKwl1bnNpZ25lZCBzaG9ydCBwdHlwZSBfX3VudXNlZCwgCisJc3RydWN0IGlwaGRyICppcCBfX3VudXNlZCwgc3RydWN0IHVkcGhkciAqdWRwIF9fdW51c2VkKQoreworCXJldHVybiAwOworfQorCit2b2lkIHJ4X3FkcmFpbih2b2lkKQoreworCS8qIENsZWFyIG91dCB0aGUgUnggcXVldWUgZmlyc3QuICBJdCBjb250YWlucyBub3RoaW5nIG9mIGludGVyZXN0LAorCSAqIGV4Y2VwdCBwb3NzaWJseSBBUlAgcmVxdWVzdHMgZnJvbSB0aGUgREhDUC9URlRQIHNlcnZlci4gIFdlIHVzZQorCSAqIHBvbGxpbmcgdGhyb3VnaG91dCBFdGhlcmJvb3QsIHNvIHNvbWUgdGltZSBtYXkgaGF2ZSBwYXNzZWQgc2luY2Ugd2UKKwkgKiBsYXN0IHBvbGxlZCB0aGUgcmVjZWl2ZSBxdWV1ZSwgd2hpY2ggbWF5IG5vdyBiZSBmaWxsZWQgd2l0aAorCSAqIGJyb2FkY2FzdCBwYWNrZXRzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSByZXBseSB0byB0aGUgcGFja2V0cyB3ZSBhcmUKKwkgKiBhYm91dCB0byBzZW5kIHRvIGJlIGxvc3QgaW1tZWRpYXRlbHkuICBOb3QgdmVyeSBjbGV2ZXIuICAqLworCWF3YWl0X3JlcGx5KGF3YWl0X3FkcmFpbiwgMCwgTlVMTCwgMCk7Cit9CisKKy8qKgorICogcmFycAorICoKKyAqIEdldCBJUCBhZGRyZXNzIGJ5IHJhcnAuIEp1c3QgY29weSBmcm9tIGV0aGVyYm9vdAorICoqLworc3RhdGljIGludCBhd2FpdF9yYXJwKGludCBpdmFsLCB2b2lkICpwdHIsIHVuc2lnbmVkIHNob3J0IHB0eXBlLCAKKwkJICAgICAgc3RydWN0IGlwaGRyICppcCwgc3RydWN0IHVkcGhkciAqdWRwKQoreworCXN0cnVjdCBhcnByZXF1ZXN0ICphcnByZXBseTsKKwlpZiAocHR5cGUgIT0gUkFSUCkKKwkJcmV0dXJuIDA7CisJaWYgKG5pYy5wYWNrZXRsZW4gPCBFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgYXJwcmVxdWVzdCkpCisJCXJldHVybiAwOworCWFycHJlcGx5ID0gKHN0cnVjdCBhcnByZXF1ZXN0ICopJm5pYy5wYWNrZXRbRVRIX0hMRU5dOworCWlmIChhcnByZXBseS0+b3Bjb2RlICE9IGh0b25zKFJBUlBfUkVQTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKGFycHJlcGx5LT50aHdhZGRyLCBwdHIsIEVUSF9BTEVOKSA9PSAwKXsKKwkJbWVtY3B5KGFycHRhYmxlW0FSUF9TRVJWRVJdLm5vZGUsIGFycHJlcGx5LT5zaHdhZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweSgmYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLCBhcnByZXBseS0+c2lwYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJbWVtY3B5KCZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsIGFycHJlcGx5LT50aXBhZGRyLCBzaXplb2YoaW5fYWRkcikpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByYXJwKHZvaWQpCit7CisJaW50IHJldHJ5OworCisJLyogYXJwIGFuZCByYXJwIHJlcXVlc3RzIHNoYXJlIHRoZSBzYW1lIHBhY2tldCBzdHJ1Y3R1cmUuICovCisJc3RydWN0IGFycHJlcXVlc3QgcmFycHJlcTsKKworCWlmKCFncnViX2V0aF9wcm9iZSgpKQorCQlyZXR1cm4gMDsKKwluZXR3b3JrX3JlYWR5ID0gMDsKKworCW1lbXNldCgmcmFycHJlcSwgMCwgc2l6ZW9mKHJhcnByZXEpKTsKKworCXJhcnByZXEuaHd0eXBlID0gaHRvbnMoMSk7CisJcmFycHJlcS5wcm90b2NvbCA9IGh0b25zKElQKTsKKwlyYXJwcmVxLmh3bGVuID0gRVRIX0FMRU47CisJcmFycHJlcS5wcm90b2xlbiA9IDQ7CisJcmFycHJlcS5vcGNvZGUgPSBodG9ucyhSQVJQX1JFUVVFU1QpOworCW1lbWNweSgmcmFycHJlcS5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLCBFVEhfQUxFTik7CisJLyogc2lwYWRkciBpcyBhbHJlYWR5IHplcm9lZCBvdXQgKi8KKwltZW1jcHkoJnJhcnByZXEudGh3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCS8qIHRpcGFkZHIgaXMgYWxyZWFkeSB6ZXJvZWQgb3V0ICovCisKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCBNQVhfQVJQX1JFVFJJRVM7ICsrcmV0cnkpIHsKKwkJbG9uZyB0aW1lb3V0OworCQlldGhfdHJhbnNtaXQoYnJvYWRjYXN0LCBSQVJQLCBzaXplb2YocmFycHJlcSksICZyYXJwcmVxKTsKKworCQl0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChUSU1FT1VULCByZXRyeSk7CisJCWlmIChhd2FpdF9yZXBseShhd2FpdF9yYXJwLCAwLCByYXJwcmVxLnNod2FkZHIsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJCWlmICh1c2VyX2Fib3J0KQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJldHJ5IDwgTUFYX0FSUF9SRVRSSUVTKSB7CisJCW5ldHdvcmtfcmVhZHkgPSAxOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKioKKyAqIGJvb3RwCisgKgorICogR2V0IElQIGFkZHJlc3MgYnkgYm9vdHAsIHNlZ3JlZ2F0ZSBmcm9tIGJvb3RwIGluIGV0aGVyYm9vdC4KKyAqKi8KK3N0YXRpYyBpbnQgYXdhaXRfYm9vdHAoaW50IGl2YWwgX191bnVzZWQsIHZvaWQgKnB0ciBfX3VudXNlZCwKKwl1bnNpZ25lZCBzaG9ydCBwdHlwZSBfX3VudXNlZCwgc3RydWN0IGlwaGRyICppcCBfX3VudXNlZCwgCisJc3RydWN0IHVkcGhkciAqdWRwKQoreworCXN0cnVjdAlib290cF90ICpib290cHJlcGx5OworCWludCBsZW47CQkvKiBMZW5ndGggb2YgdmVuZG9yICovCisKKwlpZiAoIXVkcCkgeworCQlyZXR1cm4gMDsKKwl9CisJYm9vdHByZXBseSA9IChzdHJ1Y3QgYm9vdHBfdCAqKQorCQkmbmljLnBhY2tldFtFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpXTsKKwlsZW4gPSBuaWMucGFja2V0bGVuIC0gKEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAKKwkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgc2l6ZW9mKHN0cnVjdCBib290cF90KSAtIEJPT1RQX1ZFTkRPUl9MRU4pOworCWlmIChsZW4gPCAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAodWRwLT5kZXN0ICE9IGh0b25zKEJPT1RQX0NMSUVOVCkpCisJCXJldHVybiAwOworCWlmIChib290cHJlcGx5LT5icF9vcCAhPSBCT09UUF9SRVBMWSkKKwkJcmV0dXJuIDA7CisJaWYgKGJvb3RwcmVwbHktPmJwX3hpZCAhPSB4aWQpCisJCXJldHVybiAwOworCWlmIChtZW1jbXAoKGNoYXIgKikmYm9vdHByZXBseS0+YnBfc2lhZGRyLCAoY2hhciAqKSZ6ZXJvSVAsIHNpemVvZihpbl9hZGRyKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChtZW1jbXAoYnJvYWRjYXN0LCBib290cHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKSAhPSAwKSAmJgorCSAgICAobWVtY21wKGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIGJvb3RwcmVwbHktPmJwX2h3YWRkciwgRVRIX0FMRU4pICE9IDApKSB7CisJCXJldHVybiAwOworCX0KKwlhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyID0gYm9vdHByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKKwluZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrKCk7CisJYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciA9IGJvb3RwcmVwbHktPmJwX3NpYWRkci5zX2FkZHI7CisJbWVtc2V0KGFycHRhYmxlW0FSUF9TRVJWRVJdLm5vZGUsIDAsIEVUSF9BTEVOKTsgIC8qIEtpbGwgYXJwICovCisJYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIgPSBib290cHJlcGx5LT5icF9naWFkZHIuc19hZGRyOworCW1lbXNldChhcnB0YWJsZVtBUlBfR0FURVdBWV0ubm9kZSwgMCwgRVRIX0FMRU4pOyAgLyogS2lsbCBhcnAgKi8KKwkvKiBXZSBkb24ndCBjYXJlIGJvb3RwcmVwbHktPmJwX2ZpbGUsIGl0IG11c3QgYmUgJ3B4ZWdydWInOi0pICovCisJbWVtY3B5KChjaGFyICopcmZjMTUzM192ZW5kZGF0YSwgKGNoYXIgKikoYm9vdHByZXBseS0+YnBfdmVuZCksIGxlbik7CisJZGVjb2RlX3JmYzE1MzMocmZjMTUzM192ZW5kZGF0YSwgMCwgbGVuLCAxKTsKKwlyZXR1cm4oMSk7Cit9CisKK2ludCBib290cCh2b2lkKQoreworCWludCByZXRyeTsKKwlzdHJ1Y3QgYm9vdHBpcF90IGlwOworCXVuc2lnbmVkIGxvbmcgIHN0YXJ0dGltZTsKKwkKKwlFbnRlckZ1bmN0aW9uKCJib290cCIpOworCisJaWYoIWdydWJfZXRoX3Byb2JlKCkpCisJCXJldHVybiAwOworCW5ldHdvcmtfcmVhZHkgPSAwOworCisJbWVtc2V0KCZpcCwgMCwgc2l6ZW9mKHN0cnVjdCBib290cGlwX3QpKTsKKwlpcC5icC5icF9vcCA9IEJPT1RQX1JFUVVFU1Q7CisJaXAuYnAuYnBfaHR5cGUgPSAxOworCWlwLmJwLmJwX2hsZW4gPSBFVEhfQUxFTjsKKwlzdGFydHRpbWUgPSBjdXJydGlja3MoKTsKKwkvKiBVc2UgbG93ZXIgMzIgYml0cyBvZiBub2RlIGFkZHJlc3MsIG1vcmUgbGlrZWx5IHRvIGJlCisJICAgZGlzdGluY3QgdGhhbiB0aGUgdGltZSBzaW5jZSBib290aW5nICovCisJbWVtY3B5KCZ4aWQsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlWzJdLCBzaXplb2YoeGlkKSk7CisJaXAuYnAuYnBfeGlkID0geGlkICs9IGh0b25sKHN0YXJ0dGltZSk7CisJLyogYnBfc2VjcyBkZWZhdWx0cyB0byB6ZXJvICovCisJbWVtY3B5KGlwLmJwLmJwX2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCW1lbWNweShpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZV9ib290cCwgc2l6ZW9mKHJmYzE1MzNfY29va2llX2Jvb3RwKSk7IC8qIHJlcXVlc3QgUkZDLXN0eWxlIG9wdGlvbnMgKi8KKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IE1BWF9CT09UUF9SRVRSSUVTOyApIHsKKwkJbG9uZyB0aW1lb3V0OworCisJCXJ4X3FkcmFpbigpOworCisJCXVkcF90cmFuc21pdChJUF9CUk9BRENBU1QsIEJPT1RQX0NMSUVOVCwgQk9PVFBfU0VSVkVSLAorCQkJc2l6ZW9mKHN0cnVjdCBib290cGlwX3QpLCAmaXApOworCQl0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChUSU1FT1VULCByZXRyeSsrKTsKKwkJaWYgKGF3YWl0X3JlcGx5KGF3YWl0X2Jvb3RwLCAwLCBOVUxMLCB0aW1lb3V0KSl7CisJCQluZXR3b3JrX3JlYWR5ID0gMTsKKwkJCXJldHVybigxKTsKKwkJfQorCQlpZiAodXNlcl9hYm9ydCkKKwkJCXJldHVybiAwOworCQlpcC5icC5icF9zZWNzID0gaHRvbnMoKGN1cnJ0aWNrcygpLXN0YXJ0dGltZSkvVElDS1NfUEVSX1NFQyk7CisJfQorCXJldHVybigwKTsKK30KKworLyoqCisgKiBkaGNwCisgKgorICogR2V0IElQIGFkZHJlc3MgYnkgZGhjcCwgc2VncmVnYXRlIGZyb20gYm9vdHAgaW4gZXRoZXJib290LgorICoqLworc3RhdGljIGludCBhd2FpdF9kaGNwKGludCBpdmFsIF9fdW51c2VkLCB2b2lkICpwdHIgX191bnVzZWQsCisJdW5zaWduZWQgc2hvcnQgcHR5cGUgX191bnVzZWQsIHN0cnVjdCBpcGhkciAqaXAgX191bnVzZWQsIAorCXN0cnVjdCB1ZHBoZHIgKnVkcCkKK3sKKwlzdHJ1Y3QJZGhjcF90ICpkaGNwcmVwbHk7CisJaW50IGxlbjsKKworCWlmICghdWRwKSB7CisJCXJldHVybiAwOworCX0KKwlkaGNwcmVwbHkgPSAoc3RydWN0IGRoY3BfdCAqKQorCQkmbmljLnBhY2tldFtFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpXTsKKwlsZW4gPSBuaWMucGFja2V0bGVuIC0gKEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAKKwkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgc2l6ZW9mKHN0cnVjdCBkaGNwX3QpIC0gREhDUF9PUFRfTEVOKTsKKwlpZiAobGVuIDwgMCl7CisJCXJldHVybiAwOworCX0KKwlpZiAodWRwLT5kZXN0ICE9IGh0b25zKEJPT1RQX0NMSUVOVCkpCisJCXJldHVybiAwOworCWlmIChkaGNwcmVwbHktPmJwX29wICE9IEJPT1RQX1JFUExZKQorCQlyZXR1cm4gMDsKKwlpZiAoZGhjcHJlcGx5LT5icF94aWQgIT0geGlkKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKChjaGFyICopJmRoY3ByZXBseS0+YnBfc2lhZGRyLCAoY2hhciAqKSZ6ZXJvSVAsIHNpemVvZihpbl9hZGRyKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChtZW1jbXAoYnJvYWRjYXN0LCBkaGNwcmVwbHktPmJwX2h3YWRkciwgRVRIX0FMRU4pICE9IDApICYmCisJICAgIChtZW1jbXAoYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgZGhjcHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKSAhPSAwKSkgeworCQlyZXR1cm4gMDsKKwl9CisJYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkciA9IGRoY3ByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKKwlkaGNwX2FkZHIuc19hZGRyID0gZGhjcHJlcGx5LT5icF95aWFkZHIuc19hZGRyOworCW5ldG1hc2sgPSBkZWZhdWx0X25ldG1hc2soKTsKKwlhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyID0gZGhjcHJlcGx5LT5icF9zaWFkZHIuc19hZGRyOworCW1lbXNldChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7ICAvKiBLaWxsIGFycCAqLworCWFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyID0gZGhjcHJlcGx5LT5icF9naWFkZHIuc19hZGRyOworCW1lbXNldChhcnB0YWJsZVtBUlBfR0FURVdBWV0ubm9kZSwgMCwgRVRIX0FMRU4pOyAgLyogS2lsbCBhcnAgKi8KKwkvKiBXZSBkb24ndCBjYXJlIGJvb3RwcmVwbHktPmJwX2ZpbGUuIEl0IG11c3QgYmUgJ3B4ZWdydWInICovCisJbWVtY3B5KChjaGFyICopcmZjMTUzM192ZW5kZGF0YSwgKGNoYXIgKikoZGhjcHJlcGx5LT5icF92ZW5kKSwgbGVuKTsKKwlkZWNvZGVfcmZjMTUzMyhyZmMxNTMzX3ZlbmRkYXRhLCAwLCBsZW4sIDEpOworCXJldHVybigxKTsKK30KKworaW50IGRoY3Aodm9pZCkKK3sKKwlpbnQgcmV0cnk7CisJaW50IHJlcXJldHJ5OworCXN0cnVjdCBkaGNwaXBfdCBpcDsKKwl1bnNpZ25lZCBsb25nICBzdGFydHRpbWU7CisKKwlpZighZ3J1Yl9ldGhfcHJvYmUoKSkKKwkJcmV0dXJuIDA7CisKKwluZXR3b3JrX3JlYWR5ID0gMDsKKworCW1lbXNldCgmaXAsIDAsIHNpemVvZihzdHJ1Y3QgZGhjcGlwX3QpKTsKKwlpcC5icC5icF9vcCA9IEJPT1RQX1JFUVVFU1Q7CisJaXAuYnAuYnBfaHR5cGUgPSAxOworCWlwLmJwLmJwX2hsZW4gPSBFVEhfQUxFTjsKKwlzdGFydHRpbWUgPSBjdXJydGlja3MoKTsKKwkvKiBVc2UgbG93ZXIgMzIgYml0cyBvZiBub2RlIGFkZHJlc3MsIG1vcmUgbGlrZWx5IHRvIGJlCisJICAgZGlzdGluY3QgdGhhbiB0aGUgdGltZSBzaW5jZSBib290aW5nICovCisJbWVtY3B5KCZ4aWQsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlWzJdLCBzaXplb2YoeGlkKSk7CisJaXAuYnAuYnBfeGlkID0geGlkICs9IGh0b25sKHN0YXJ0dGltZSk7CisJbWVtY3B5KGlwLmJwLmJwX2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCW1lbWNweShpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZV9kaGNwLCBzaXplb2YgcmZjMTUzM19jb29raWVfZGhjcCk7IC8qIHJlcXVlc3QgUkZDLXN0eWxlIG9wdGlvbnMgKi8KKwltZW1jcHkoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZV9kaGNwLCBkaGNwZGlzY292ZXIsIHNpemVvZiBkaGNwZGlzY292ZXIpOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgTUFYX0JPT1RQX1JFVFJJRVM7ICkgeworCQlsb25nIHRpbWVvdXQ7CisKKwkJcnhfcWRyYWluKCk7CisKKwkJdWRwX3RyYW5zbWl0KElQX0JST0FEQ0FTVCwgQk9PVFBfQ0xJRU5ULCBCT09UUF9TRVJWRVIsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKKwkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoVElNRU9VVCwgcmV0cnkrKyk7CisJCWlmIChhd2FpdF9yZXBseShhd2FpdF9kaGNwLCAwLCBOVUxMLCB0aW1lb3V0KSkgeworCQkJLyogSWYgbm90IGEgREhDUE9GRkVSIHRoZW4gbXVzdCBiZSBqdXN0IGEKKwkJCSAgIEJPT1RQIHJlcGx5LCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGgKKwkJCSAgIEJPT1RQIHRoZW4uIEpzY290dCByZXBvcnQgYSBidWcgaGVyZSwgYnV0IEkKKwkJCSAgIGRvbid0IGtub3cgaG93IGl0IGhhcHBlbmVkICovCisJCQlpZiAoZGhjcF9yZXBseSAhPSBESENQT0ZGRVIpeworCQkJCW5ldHdvcmtfcmVhZHkgPSAxOworCQkJCXJldHVybigxKTsKKwkJCX0KKwkJCWRoY3BfcmVwbHkgPSAwOworCQkJbWVtY3B5KGlwLmJwLmJwX3ZlbmQsIHJmYzE1MzNfY29va2llX2RoY3AsIHNpemVvZiByZmMxNTMzX2Nvb2tpZV9kaGNwKTsKKwkJCW1lbWNweShpcC5icC5icF92ZW5kICsgc2l6ZW9mIHJmYzE1MzNfY29va2llX2RoY3AsIGRoY3ByZXF1ZXN0LCBzaXplb2YgZGhjcHJlcXVlc3QpOworCQkJLyogQmV3YXJlOiB0aGUgbWFnaWMgbnVtYmVycyA5IGFuZCAxNSBkZXBlbmQgb24KKwkJCSAgIHRoZSBsYXlvdXQgb2YgZGhjcHJlcXVlc3QgKi8KKwkJCW1lbWNweSgmaXAuYnAuYnBfdmVuZFs5XSwgJmRoY3Bfc2VydmVyLCBzaXplb2YoaW5fYWRkcikpOworCQkJbWVtY3B5KCZpcC5icC5icF92ZW5kWzE1XSwgJmRoY3BfYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJCWZvciAocmVxcmV0cnkgPSAwOyByZXFyZXRyeSA8IE1BWF9CT09UUF9SRVRSSUVTOyApIHsKKwkJCQl1ZHBfdHJhbnNtaXQoSVBfQlJPQURDQVNULCBCT09UUF9DTElFTlQsIEJPT1RQX1NFUlZFUiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGJvb3RwaXBfdCksICZpcCk7CisJCQkJZGhjcF9yZXBseT0wOworCQkJCXRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsKFRJTUVPVVQsIHJlcXJldHJ5KyspOworCQkJCWlmIChhd2FpdF9yZXBseShhd2FpdF9kaGNwLCAwLCBOVUxMLCB0aW1lb3V0KSkKKwkJCQkJaWYgKGRoY3BfcmVwbHkgPT0gREhDUEFDSyl7CisJCQkJCQluZXR3b3JrX3JlYWR5ID0gMTsKKwkJCQkJCXJldHVybigxKTsKKwkJCQkJfQorCQkJCWlmICh1c2VyX2Fib3J0KQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAodXNlcl9hYm9ydCkKKwkJCXJldHVybiAwOworCQlpcC5icC5icF9zZWNzID0gaHRvbnMoKGN1cnJ0aWNrcygpLXN0YXJ0dGltZSkvVElDS1NfUEVSX1NFQyk7CisJfQorCXJldHVybigwKTsKK30KKworI2lmZGVmIE1VTFRJQ0FTVF9MRVZFTDIKK3N0YXRpYyB2b2lkIHNlbmRfaWdtcF9yZXBvcnRzKHVuc2lnbmVkIGxvbmcgbm93KQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IE1BWF9JR01QOyBpKyspIHsKKwkJaWYgKGlnbXB0YWJsZVtpXS50aW1lICYmIChub3cgPj0gaWdtcHRhYmxlW2ldLnRpbWUpKSB7CisJCQlzdHJ1Y3QgaWdtcF9pcF90IGlnbXA7CisJCQlpZ21wLnJvdXRlcl9hbGVydFswXSA9IDB4OTQ7CisJCQlpZ21wLnJvdXRlcl9hbGVydFsxXSA9IDB4MDQ7CisJCQlpZ21wLnJvdXRlcl9hbGVydFsyXSA9IDA7CisJCQlpZ21wLnJvdXRlcl9hbGVydFszXSA9IDA7CisJCQlidWlsZF9pcF9oZHIoaWdtcHRhYmxlW2ldLmdyb3VwLnNfYWRkciwgCisJCQkJMSwgSVBfSUdNUCwgc2l6ZW9mKGlnbXAucm91dGVyX2FsZXJ0KSwgc2l6ZW9mKGlnbXApLCAmaWdtcCk7CisJCQlpZ21wLmlnbXAudHlwZSA9IElHTVB2Ml9SRVBPUlQ7CisJCQlpZiAobGFzdF9pZ21wdjEgJiYgCisJCQkJKG5vdyA8IGxhc3RfaWdtcHYxICsgSUdNUHYxX1JPVVRFUl9QUkVTRU5UX1RJTUVPVVQpKSB7CisJCQkJaWdtcC5pZ21wLnR5cGUgPSBJR01QdjFfUkVQT1JUOworCQkJfQorCQkJaWdtcC5pZ21wLnJlc3BvbnNlX3RpbWUgPSAwOworCQkJaWdtcC5pZ21wLmNoa3N1bSA9IDA7CisJCQlpZ21wLmlnbXAuZ3JvdXAuc19hZGRyID0gaWdtcHRhYmxlW2ldLmdyb3VwLnNfYWRkcjsKKwkJCWlnbXAuaWdtcC5jaGtzdW0gPSBpcGNoa3N1bSgmaWdtcC5pZ21wLCBzaXplb2YoaWdtcC5pZ21wKSk7CisJCQlpcF90cmFuc21pdChzaXplb2YoaWdtcCksICZpZ21wKTsKKyNpZmRlZglNREVCVUcKKwkJCXByaW50ZigiU2VudCBJR01QIHJlcG9ydCB0bzogJUBcbiIsIGlnbXAuaWdtcC5ncm91cC5zX2FkZHIpOworI2VuZGlmCisJCQkvKiBEb24ndCBzZW5kIGFub3RoZXIgaWdtcCByZXBvcnQgdW50aWwgYXNrZWQgKi8KKwkJCWlnbXB0YWJsZVtpXS50aW1lID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19pZ21wKHN0cnVjdCBpcGhkciAqaXAsIHVuc2lnbmVkIGxvbmcgbm93KQoreworCXN0cnVjdCBpZ21wICppZ21wOworCWludCBpOworCXVuc2lnbmVkIGlwbGVuID0gMDsKKwlpZiAoIWlwIHx8IChpcC0+cHJvdG9jb2wgPT0gSVBfSUdNUCkgfHwKKwkJKG5pYy5wYWNrZXRsZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgaWdtcCkpKSB7CisJCXJldHVybjsKKwl9CisJaXBsZW4gPSAoaXAtPnZlcmhkcmxlbiAmIDB4ZikqNDsKKwlpZ21wID0gKHN0cnVjdCBpZ21wICopJm5pYy5wYWNrZXRbc2l6ZW9mKHN0cnVjdCBpcGhkcildOworCWlmIChpcGNoa3N1bShpZ21wLCBudG9ocyhpcC0+bGVuKSAtIGlwbGVuKSAhPSAwKQorCQlyZXR1cm47CisJaWYgKChpZ21wLT50eXBlID09IElHTVBfUVVFUlkpICYmIAorCQkoaXAtPmRlc3Quc19hZGRyID09IGh0b25sKEdST1VQX0FMTF9IT1NUUykpKSB7CisJCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwgPSBJR01QX0lOVEVSVkFMOworCQlpZiAoaWdtcC0+cmVzcG9uc2VfdGltZSA9PSAwKSB7CisJCQlsYXN0X2lnbXB2MSA9IG5vdzsKKwkJfSBlbHNlIHsKKwkJCWludGVydmFsID0gKGlnbXAtPnJlc3BvbnNlX3RpbWUgKiBUSUNLU19QRVJfU0VDKS8xMDsKKwkJfQorCQkKKyNpZmRlZglNREVCVUcKKwkJcHJpbnRmKCJSZWNlaXZlZCBJR01QIHF1ZXJ5IGZvcjogJUBcbiIsIGlnbXAtPmdyb3VwLnNfYWRkcik7CisjZW5kaWYJCQkgICAgICAgCisJCWZvcihpID0gMDsgaSA8IE1BWF9JR01QOyBpKyspIHsKKwkJCXVpbnQzMl90IGdyb3VwID0gaWdtcHRhYmxlW2ldLmdyb3VwLnNfYWRkcjsKKwkJCWlmICgoZ3JvdXAgPT0gMCkgfHwgKGdyb3VwID09IGlnbXAtPmdyb3VwLnNfYWRkcikpIHsKKwkJCQl1bnNpZ25lZCBsb25nIHRpbWU7CisJCQkJdGltZSA9IGN1cnJ0aWNrcygpICsgcmZjMTExMl9zbGVlcF9pbnRlcnZhbChpbnRlcnZhbCwgMCk7CisJCQkJaWYgKHRpbWUgPCBpZ21wdGFibGVbaV0udGltZSkgeworCQkJCQlpZ21wdGFibGVbaV0udGltZSA9IHRpbWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmICgoKGlnbXAtPnR5cGUgPT0gSUdNUHYxX1JFUE9SVCkgfHwgKGlnbXAtPnR5cGUgPT0gSUdNUHYyX1JFUE9SVCkpICYmCisJCShpcC0+ZGVzdC5zX2FkZHIgPT0gaWdtcC0+Z3JvdXAuc19hZGRyKSkgeworI2lmZGVmCU1ERUJVRworCQlwcmludGYoIlJlY2VpdmVkIElHTVAgcmVwb3J0IGZvcjogJUBcbiIsIGlnbXAtPmdyb3VwLnNfYWRkcik7CisjZW5kaWYJCQkgICAgICAgCisJCWZvcihpID0gMDsgaSA8IE1BWF9JR01QOyBpKyspIHsKKwkJCWlmICgoaWdtcHRhYmxlW2ldLmdyb3VwLnNfYWRkciA9PSBpZ21wLT5ncm91cC5zX2FkZHIpICYmCisJCQkJaWdtcHRhYmxlW2ldLnRpbWUgIT0gMCkgeworCQkJCWlnbXB0YWJsZVtpXS50aW1lID0gMDsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBsZWF2ZV9ncm91cChpbnQgc2xvdCkKK3sKKwkvKiBCZSB2ZXJ5IHN0dXBpZCBhbmQgYWx3YXlzIHNlbmQgYSBsZWF2ZSBncm91cCBtZXNzYWdlIGlmIAorCSAqIEkgaGF2ZSBzdWJzY3JpYmVkLiAgSW1wZXJmZWN0IGJ1dCBpdCBpcyBzdGFuZGFyZHMKKwkgKiBjb21wbGlhbnQsIGVhc3kgYW5kIHJlbGlhYmxlIHRvIGltcGxlbWVudC4KKwkgKgorCSAqIFRoZSBvcHRpbWFsIGdyb3VwIGxlYXZlIG1ldGhvZCBpcyB0byBvbmx5IHNlbmQgbGVhdmUgd2hlbiwKKwkgKiB3ZSB3ZXJlIHRoZSBsYXN0IGhvc3QgdG8gcmVzcG9uZCB0byBhIHF1ZXJ5IG9uIHRoaXMgZ3JvdXAsCisJICogYW5kIGlnbXB2MSBjb21wYXRpYmlsaXR5IGlzIG5vdCBlbmFibGVkLgorCSAqLworCWlmIChpZ21wdGFibGVbc2xvdF0uZ3JvdXAuc19hZGRyKSB7CisJCXN0cnVjdCBpZ21wX2lwX3QgaWdtcDsKKwkJaWdtcC5yb3V0ZXJfYWxlcnRbMF0gPSAweDk0OworCQlpZ21wLnJvdXRlcl9hbGVydFsxXSA9IDB4MDQ7CisJCWlnbXAucm91dGVyX2FsZXJ0WzJdID0gMDsKKwkJaWdtcC5yb3V0ZXJfYWxlcnRbM10gPSAwOworCQlidWlsZF9pcF9oZHIoaHRvbmwoR1JPVVBfQUxMX0hPU1RTKSwKKwkJCTEsIElQX0lHTVAsIHNpemVvZihpZ21wLnJvdXRlcl9hbGVydCksIHNpemVvZihpZ21wKSwgJmlnbXApOworCQlpZ21wLmlnbXAudHlwZSA9IElHTVBfTEVBVkU7CisJCWlnbXAuaWdtcC5yZXNwb25zZV90aW1lID0gMDsKKwkJaWdtcC5pZ21wLmNoa3N1bSA9IDA7CisJCWlnbXAuaWdtcC5ncm91cC5zX2FkZHIgPSBpZ21wdGFibGVbc2xvdF0uZ3JvdXAuc19hZGRyOworCQlpZ21wLmlnbXAuY2hrc3VtID0gaXBjaGtzdW0oJmlnbXAuaWdtcCwgc2l6ZW9mKGlnbXApKTsKKwkJaXBfdHJhbnNtaXQoc2l6ZW9mKGlnbXApLCAmaWdtcCk7CisjaWZkZWYJTURFQlVHCisJCXByaW50ZigiU2VudCBJR01QIGxlYXZlIGZvcjogJUBcbiIsIGlnbXAuaWdtcC5ncm91cC5zX2FkZHIpOworI2VuZGlmCQorCX0KKwltZW1zZXQoJmlnbXB0YWJsZVtzbG90XSwgMCwgc2l6ZW9mKGlnbXB0YWJsZVswXSkpOworfQorCit2b2lkIGpvaW5fZ3JvdXAoaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgZ3JvdXApCit7CisJLyogSSBoYXZlIGFscmVhZHkgam9pbmVkICovCisJaWYgKGlnbXB0YWJsZVtzbG90XS5ncm91cC5zX2FkZHIgPT0gZ3JvdXApCisJCXJldHVybjsKKwlpZiAoaWdtcHRhYmxlW3Nsb3RdLmdyb3VwLnNfYWRkcikgeworCQlsZWF2ZV9ncm91cChzbG90KTsKKwl9CisJLyogT25seSBqb2luIGEgZ3JvdXAgaWYgd2UgYXJlIGdpdmVuIGEgbXVsdGljYXN0IGlwLCB0aGlzIHdheQorCSAqIGNvZGUgY2FuIGJlIGdpdmVuIGEgbm9uLW11bHRpY2FzdCAoYnJvYWRjYXN0IG9yIHVuaWNhc3QgaXApCisJICogYW5kIHN0aWxsIHdvcmsuLi4gCisJICovCisJaWYgKChncm91cCAmIGh0b25sKE1VTFRJQ0FTVF9NQVNLKSkgPT0gaHRvbmwoTVVMVElDQVNUX05FVFdPUkspKSB7CisJCWlnbXB0YWJsZVtzbG90XS5ncm91cC5zX2FkZHIgPSBncm91cDsKKwkJaWdtcHRhYmxlW3Nsb3RdLnRpbWUgPSBjdXJydGlja3MoKTsKKwl9Cit9CisjZWxzZQorI2RlZmluZSBzZW5kX2lnbXBfcmVwb3J0cyhub3cpOworI2RlZmluZSBwcm9jZXNzX2lnbXAoaXAsIG5vdykKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FXQUlUX1JFUExZIC0gV2FpdCB1bnRpbCB3ZSBnZXQgYSByZXNwb25zZSBmb3Igb3VyIHJlcXVlc3QKKyoqKioqKioqKioqKmYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBhd2FpdF9yZXBseShyZXBseV90IHJlcGx5LCBpbnQgaXZhbCwgdm9pZCAqcHRyLCBsb25nIHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lLCBub3c7CisJc3RydWN0CWlwaGRyICppcDsKKwl1bnNpZ25lZCBpcGxlbiA9IDA7CisJc3RydWN0CXVkcGhkciAqdWRwOworCXVuc2lnbmVkIHNob3J0IHB0eXBlOworCWludCByZXN1bHQ7CisKKwl1c2VyX2Fib3J0ID0gMDsKKworCXRpbWUgPSB0aW1lb3V0ICsgY3VycnRpY2tzKCk7CisJLyogVGhlIHRpbWVvdXQgY2hlY2sgaXMgZG9uZSBiZWxvdy4gIFRoZSB0aW1lb3V0IGlzIG9ubHkgY2hlY2tlZCBpZgorCSAqIHRoZXJlIGlzIG5vIHBhY2tldCBpbiB0aGUgUnggcXVldWUuICBUaGlzIGFzc3VtZXMgdGhhdCBldGhfcG9sbCgpCisJICogbmVlZHMgYSBuZWdsaWdpYmxlIGFtb3VudCBvZiB0aW1lLiAgCisJICovCisJZm9yICg7OykgeworCQlub3cgPSBjdXJydGlja3MoKTsKKwkJc2VuZF9pZ21wX3JlcG9ydHMobm93KTsKKwkJcmVzdWx0ID0gZXRoX3BvbGwoMSk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJLyogV2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyAqLworCQkKKwkJCS8qIENoZWNrIGZvciBhYm9ydCBrZXkgb25seSBpZiB0aGUgUnggcXVldWUgaXMgZW1wdHkgLQorCQkJICogYXMgbG9uZyBhcyB3ZSBoYXZlIHNvbWV0aGluZyB0byBwcm9jZXNzLCBkb24ndAorCQkJICogYXNzdW1lIHRoYXQgc29tZXRoaW5nIGZhaWxlZC4gIEl0IGlzIHVubGlrZWx5IHRoYXQKKwkJCSAqIHdlIGhhdmUgbm8gcHJvY2Vzc2luZyB0aW1lIGxlZnQgYmV0d2VlbiBwYWNrZXRzLiAgKi8KKwkJCXBvbGxfaW50ZXJydXB0aW9ucygpOworCQkJLyogRG8gdGhlIHRpbWVvdXQgYWZ0ZXIgYXQgbGVhc3QgYSBmdWxsIHF1ZXVlIHdhbGsuICAqLworCQkJaWYgKCh0aW1lb3V0ID09IDApIHx8IChjdXJydGlja3MoKSA+IHRpbWUpIHx8IHVzZXJfYWJvcnQgPT0gMSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkKKwkJLyogV2UgaGF2ZSBzb21ldGhpbmchICovCisKKwkJLyogRmluZCB0aGUgRXRoZXJuZXQgcGFja2V0IHR5cGUgKi8KKwkJaWYgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4pIHsKKwkJCXB0eXBlID0gKCh1bnNpZ25lZCBzaG9ydCkgbmljLnBhY2tldFsxMl0pIDw8IDgKKwkJCQl8ICgodW5zaWduZWQgc2hvcnQpIG5pYy5wYWNrZXRbMTNdKTsKKwkJfSBlbHNlIGNvbnRpbnVlOyAvKiB3aGF0IGVsc2UgY291bGQgd2UgZG8gd2l0aCBpdD8gKi8KKwkJLyogVmVyaWZ5IGFuIElQIGhlYWRlciAqLworCQlpcCA9IDA7CisJCWlmICgocHR5cGUgPT0gSVApICYmIChuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKSB7CisJCQl1bnNpZ25lZCBpcG9wdGxlbjsKKwkJCWlwID0gKHN0cnVjdCBpcGhkciAqKSZuaWMucGFja2V0W0VUSF9ITEVOXTsKKwkJCWlmICgoaXAtPnZlcmhkcmxlbiA8IDB4NDUpIHx8IChpcC0+dmVyaGRybGVuID4gMHg0RikpIAorCQkJCWNvbnRpbnVlOworCQkJaXBsZW4gPSAoaXAtPnZlcmhkcmxlbiAmIDB4ZikgKiA0OworCQkJaWYgKGlwY2hrc3VtKGlwLCBpcGxlbikgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpcC0+ZnJhZ3MgJiBodG9ucygweDNGRkYpKSB7CisJCQkJc3RhdGljIGludCB3YXJuZWRfZnJhZ21lbnRhdGlvbiA9IDA7CisJCQkJaWYgKCF3YXJuZWRfZnJhZ21lbnRhdGlvbikgeworCQkJCQlwcmludGYoIkFMRVJUOiBnb3QgYSBmcmFnbWVudGVkIHBhY2tldCAtIHJlY29uZmlndXJlIHlvdXIgc2VydmVyXG4iKTsKKwkJCQkJd2FybmVkX2ZyYWdtZW50YXRpb24gPSAxOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChudG9ocyhpcC0+bGVuKSA+IEVUSF9NQVhfTVRVKQorCQkJCWNvbnRpbnVlOworCisJCQlpcG9wdGxlbiA9IGlwbGVuIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCQlpZiAoaXBvcHRsZW4pIHsKKwkJCQkvKiBEZWxldGUgdGhlIGlwIG9wdGlvbnMsIHRvIGd1YXJhbnRlZQorCQkJCSAqIGdvb2QgYWxpZ25tZW50LCBhbmQgbWFrZSBldGhlcmJvb3Qgc2ltcGxlci4KKwkJCQkgKi8KKwkJCQltZW1tb3ZlKCZuaWMucGFja2V0W0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcildLCAKKwkJCQkJJm5pYy5wYWNrZXRbRVRIX0hMRU4gKyBpcGxlbl0sCisJCQkJCW5pYy5wYWNrZXRsZW4gLSBpcG9wdGxlbik7CisJCQkJbmljLnBhY2tldGxlbiAtPSBpcG9wdGxlbjsKKwkJCX0KKwkJfQorCQl1ZHAgPSAwOworCQlpZiAoaXAgJiYgKGlwLT5wcm90b2NvbCA9PSBJUF9VRFApICYmIAorCQkgICAgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpIHsKKwkJCXVkcCA9IChzdHJ1Y3QgdWRwaGRyICopJm5pYy5wYWNrZXRbRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKV07CisJCQkKKwkJCS8qIE1ha2UgY2VydGFpbiB3ZSBoYXZlIGEgcmVhc29uYWJsZSBwYWNrZXQgbGVuZ3RoICovCisJCQlpZiAobnRvaHModWRwLT5sZW4pID4gKG50b2hzKGlwLT5sZW4pIC0gaXBsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAodWRwLT5jaGtzdW0gJiYgdWRwY2hrc3VtKGlwLCB1ZHApKSB7CisJCQkJcHJpbnRmKCJVRFAgY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXJlc3VsdCA9IHJlcGx5KGl2YWwsIHB0ciwgcHR5cGUsIGlwLCB1ZHApOworCQlpZiAocmVzdWx0ID4gMCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkKKwkJLyogSWYgaXQgaXNuJ3QgYSBwYWNrZXQgdGhlIHVwcGVyIGxheWVyIHdhbnRzIHNlZSBpZiB0aGVyZSBpcyBhIGRlZmF1bHQKKwkJICogYWN0aW9uLiAgVGhpcyBhbGxvd3MgdXMgcmVwbHkgdG8gYXJwIGFuZCBpZ21wIHF1ZXJ5aWVzLgorCQkgKi8KKwkJaWYgKChwdHlwZSA9PSBBUlApICYmCisJCSAgICAobmljLnBhY2tldGxlbiA+PSBFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgYXJwcmVxdWVzdCkpKSB7CisJCQlzdHJ1Y3QJYXJwcmVxdWVzdCAqYXJwcmVwbHk7CisJCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJCQorCQkJYXJwcmVwbHkgPSAoc3RydWN0IGFycHJlcXVlc3QgKikmbmljLnBhY2tldFtFVEhfSExFTl07CisJCQltZW1jcHkoJnRtcCwgYXJwcmVwbHktPnRpcGFkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCQlpZiAoKGFycHJlcGx5LT5vcGNvZGUgPT0gaHRvbnMoQVJQX1JFUVVFU1QpKSAmJgorCQkJICAgICh0bXAgPT0gYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikpIHsKKwkJCQlhcnByZXBseS0+b3Bjb2RlID0gaHRvbnMoQVJQX1JFUExZKTsKKwkJCQltZW1jcHkoYXJwcmVwbHktPnRpcGFkZHIsIGFycHJlcGx5LT5zaXBhZGRyLCBzaXplb2YoaW5fYWRkcikpOworCQkJCW1lbWNweShhcnByZXBseS0+dGh3YWRkciwgYXJwcmVwbHktPnNod2FkZHIsIEVUSF9BTEVOKTsKKwkJCQltZW1jcHkoYXJwcmVwbHktPnNpcGFkZHIsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCQkJbWVtY3B5KGFycHJlcGx5LT5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLCBFVEhfQUxFTik7CisJCQkJZXRoX3RyYW5zbWl0KGFycHJlcGx5LT50aHdhZGRyLCBBUlAsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCAgYXJwcmVxdWVzdCksCisJCQkJCSAgICAgYXJwcmVwbHkpOworI2lmZGVmCU1ERUJVRworCQkJCW1lbWNweSgmdG1wLCBhcnByZXBseS0+dGlwYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJCQlwcmludGYoIlNlbnQgQVJQIHJlcGx5IHRvOiAlQFxuIix0bXApOworI2VuZGlmCS8qIE1ERUJVRyAqLworCQkJfQorCQl9CisJCXByb2Nlc3NfaWdtcChpcCwgbm93KTsKKwl9CisJcmV0dXJuKDApOworfQorCisjaWZkZWYJUkVRVUlSRV9WQ0lfRVRIRVJCT09UCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0ZJTkRfVkNJX0VUSEVSQk9PVCAtIExvb2tzIGZvciAiRXRoZXJib290IiBpbiBWZW5kb3IgRW5jYXBzdWxhdGVkIElkZW50aWZpZXJzCitPbiBlbnRyeSBwIHBvaW50cyB0byBieXRlIGNvdW50IG9mIFZDSSBvcHRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmluZF92Y2lfZXRoZXJib290KHVuc2lnbmVkIGNoYXIgKnApCit7CisJdW5zaWduZWQgY2hhcgkqZW5kID0gcCArIDEgKyAqcDsKKworCWZvciAocCsrOyBwIDwgZW5kOyApIHsKKwkJaWYgKCpwID09IFJGQzIxMzJfVkVORE9SX0NMQVNTX0lEKSB7CisJCQlpZiAoc3RybmNtcCgiRXRoZXJib290IiwgcCArIDIsIHNpemVvZigiRXRoZXJib290IikgLSAxKSA9PSAwKQorCQkJCXJldHVybiAoMSk7CisJCX0gZWxzZSBpZiAoKnAgPT0gUkZDMTUzM19FTkQpCisJCQlyZXR1cm4gKDApOworCQlwICs9IFRBR19MRU4ocCkgKyAyOworCX0KKwlyZXR1cm4gKDApOworfQorI2VuZGlmCS8qIFJFUVVJUkVfVkNJX0VUSEVSQk9PVCAqLworCisvKioKKyAqIGRlY29kZV9yZmMxNTMzCisgKgorICogRGVjb2RlcyBSRkMxNTMzIGhlYWRlcgorICoqLworaW50IGRlY29kZV9yZmMxNTMzKHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGludCBibG9jaywgdW5zaWduZWQgaW50IGxlbiwgaW50IGVvZikKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciAqZXh0ZGF0YSA9IE5VTEwsICpleHRlbmQgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgICAgICAgICpleHRwYXRoID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAqZW5kcDsKKworCWlmIChibG9jayA9PSAwKSB7CisJCWVuZF9vZl9yZmMxNTMzID0gTlVMTDsKKwkJaWYgKG1lbWNtcChwLCByZmMxNTMzX2Nvb2tpZSwgc2l6ZW9mKHJmYzE1MzNfY29va2llKSkpCisJCQlyZXR1cm4oMCk7IC8qIG5vIFJGQyAxNTMzIGhlYWRlciBmb3VuZCAqLworCQlwICs9IDQ7CisJCWVuZHAgPSBwICsgbGVuOworCX0gZWxzZSB7CisJCWlmIChibG9jayA9PSAxKSB7CisJCQlpZiAobWVtY21wKHAsIHJmYzE1MzNfY29va2llLCBzaXplb2YocmZjMTUzM19jb29raWUpKSkKKwkJCQlyZXR1cm4oMCk7IC8qIG5vIFJGQyAxNTMzIGhlYWRlciBmb3VuZCAqLworCQkJcCArPSA0OworCQkJbGVuIC09IDQ7IH0KKwkJaWYgKGV4dGVuZCArIGxlbiA8PSAodW5zaWduZWQgY2hhciAqKQorCQkgICAgcmZjMTUzM192ZW5kZGF0YSArIHNpemVvZihyZmMxNTMzX3ZlbmRkYXRhKSkgeworCQkJbWVtY3B5KGV4dGVuZCwgcCwgbGVuKTsKKwkJCWV4dGVuZCArPSBsZW47CisJCX0gZWxzZSB7CisJCQlwcmludGYoIk92ZXJmbG93IGluIHZlbmRvciBkYXRhIGJ1ZmZlciEgQWJvcnRpbmcuLi5cbiIpOworCQkJKmV4dGRhdGEgPSBSRkMxNTMzX0VORDsKKwkJCXJldHVybigwKTsKKwkJfQorCQlwID0gZXh0ZGF0YTsgZW5kcCA9IGV4dGVuZDsKKwl9CisJaWYgKCFlb2YpCisJCXJldHVybiAxOworCXdoaWxlIChwIDwgZW5kcCkgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqcDsKKwkJaWYgKGMgPT0gUkZDMTUzM19QQUQpIHsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKGMgPT0gUkZDMTUzM19FTkQpIHsKKwkJCWVuZF9vZl9yZmMxNTMzID0gZW5kcCA9IHA7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChjID09IFJGQzE1MzNfTkVUTUFTSykKKwkJCW1lbWNweSgmbmV0bWFzaywgcCsyLCBzaXplb2YoaW5fYWRkcikpOworCQllbHNlIGlmIChjID09IFJGQzE1MzNfR0FURVdBWSkgeworCQkJLyogVGhpcyBpcyBhIGxpdHRsZSBzaW1wbGlzdGljLCBidXQgaXQgd2lsbAorCQkJICAgdXN1YWxseSBiZSBzdWZmaWNpZW50LgorCQkJICAgVGFrZSBvbmx5IHRoZSBmaXJzdCBlbnRyeSAqLworCQkJaWYgKFRBR19MRU4ocCkgPj0gc2l6ZW9mKGluX2FkZHIpKQorCQkJCW1lbWNweSgmYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkciwgcCsyLCBzaXplb2YoaW5fYWRkcikpOworCQl9CisJCWVsc2UgaWYgKGMgPT0gUkZDMTUzM19FWFRFTlNJT05QQVRIKQorCQkJZXh0cGF0aCA9IHA7CisJCWVsc2UgaWYgKGMgPT0gUkZDMjEzMl9NU0dfVFlQRSkKKwkJCWRoY3BfcmVwbHk9KihwKzIpOworCQllbHNlIGlmIChjID09IFJGQzIxMzJfU1JWX0lEKQorCQkJbWVtY3B5KCZkaGNwX3NlcnZlciwgcCsyLCBzaXplb2YoaW5fYWRkcikpOworCQllbHNlIGlmIChjID09IFJGQzE1MzNfSE9TVE5BTUUpIHsKKwkJCWhvc3RuYW1lID0gcCArIDI7CisJCQlob3N0bmFtZWxlbiA9ICoocCArIDEpOworCQl9CisJCWVsc2UgaWYgKGMgPT0gUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSl7CisJCQlpbnQgbCA9IFRBR19MRU4gKHApOworCSAgCisJCQkvKiBFbGltaW5hdGUgdGhlIHRyYWlsaW5nIE5VTHMgYWNjb3JkaW5nIHRvIFJGQyAyMTMyLiAgKi8KKwkJCXdoaWxlICgqKHAgKyAyICsgbCAtIDEpID09ICdcMDAwJyAmJiBsID4gMCkKKwkJCQlsLS07CisJICAKKwkJCS8qIFhYWDogU2hvdWxkIGNoZWNrIGlmIExFTiBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoCisJCQkgICBvZiBDT05GSUdfRklMRS4gVGhpcyBraW5kIG9mIHJvYnVzdG5lc3Mgd2lsbCBiZSBhIGdvYWwKKwkJCSAgIGluIEdSVUIgMS4wLiAgKi8KKwkJCW1lbWNweSAoY29uZmlnX2ZpbGUsIHAgKyAyLCBsKTsKKwkJCWNvbmZpZ19maWxlW2xdID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCTsKKwkJfQorCQlwICs9IFRBR19MRU4ocCkgKyAyOworCX0KKwlleHRkYXRhID0gZXh0ZW5kID0gZW5kcDsKKwlpZiAoYmxvY2sgPD0gMCAmJiBleHRwYXRoICE9IE5VTEwpIHsKKwkJY2hhciBmbmFtZVs2NF07CisJCWlmIChUQUdfTEVOKGV4dHBhdGgpID49IHNpemVvZihmbmFtZSkpeworCQkJcHJpbnRmKCJPdmVyZmxvdyBpbiB2ZW5kb3IgZGF0YSBidWZmZXIhIEFib3J0aW5nLi4uXG4iKTsKKwkJCSpleHRkYXRhID0gUkZDMTUzM19FTkQ7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJbWVtY3B5KGZuYW1lLCBleHRwYXRoKzIsIFRBR19MRU4oZXh0cGF0aCkpOworCQlmbmFtZVsoaW50KVRBR19MRU4oZXh0cGF0aCldID0gJ1wwJzsKKwkJcHJpbnRmKCJMb2FkaW5nIEJPT1RQLWV4dGVuc2lvbiBmaWxlOiAlc1xuIixmbmFtZSk7CisJCXRmdHBfZmlsZV9yZWFkKGZuYW1lLCBkZWNvZGVfcmZjMTUzMyk7CisJfQorCXJldHVybiAxOwkvKiBwcm9jZWVkIHdpdGggbmV4dCBibG9jayAqLworfQorCisKKy8qIEZJWE1FIGRvdWJsZSBjaGVjayBUV09fU0VDT05EX0RJVklTT1IgKi8KKyNkZWZpbmUgVFdPX1NFQ09ORF9ESVZJU09SIChSQU5EX01BWC9USUNLU19QRVJfU0VDKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRkMyMTMxX1NMRUVQX0lOVEVSVkFMIC0gc2xlZXAgZm9yIGV4cG90ZW50aWFsbHkgbG9uZ2VyIHRpbWVzIChiYXNlIDw8IGV4cCkgKy0gMSBzZWMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChsb25nIGJhc2UsIGludCBleHApCit7CisJdW5zaWduZWQgbG9uZyB0bW87CisjaWZkZWYgQkFDS09GRl9MSU1JVAorCWlmIChleHAgPiBCQUNLT0ZGX0xJTUlUKQorCQlleHAgPSBCQUNLT0ZGX0xJTUlUOworI2VuZGlmCisJdG1vID0gKGJhc2UgPDwgZXhwKSArIChUSUNLU19QRVJfU0VDIC0gKHJhbmRvbSgpL1RXT19TRUNPTkRfRElWSVNPUikpOworCXJldHVybiB0bW87Cit9CisKKyNpZmRlZiBNVUxUSUNBU1RfTEVWRUwyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JGQzExMTJfU0xFRVBfSU5URVJWQUwgLSBzbGVlcCBmb3IgZXhwb3RlbnRpYWxseSBsb25nZXIgdGltZXMsIHVwIHRvIChiYXNlIDw8IGV4cCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9uZyByZmMxMTEyX3NsZWVwX2ludGVydmFsKGxvbmcgYmFzZSwgaW50IGV4cCkKK3sKKwl1bnNpZ25lZCBsb25nIGRpdmlzb3IsIHRtbzsKKyNpZmRlZiBCQUNLT0ZGX0xJTUlUCisJaWYgKGV4cCA+IEJBQ0tPRkZfTElNSVQpCisJCWV4cCA9IEJBQ0tPRkZfTElNSVQ7CisjZW5kaWYKKwlkaXZpc29yID0gUkFORF9NQVgvKGJhc2UgPDwgZXhwKTsKKwl0bW8gPSByYW5kb20oKS9kaXZpc29yOworCXJldHVybiB0bW87Cit9CisjZW5kaWYgLyogTVVMVElDQVNUX0xFVkVMXzIgKi8KKy8qIGlmY29uZmlnIC0gY29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlLiAgKi8KK2ludAoraWZjb25maWcgKGNoYXIgKmlwLCBjaGFyICpzbSwgY2hhciAqZ3csIGNoYXIgKnN2cikKK3sKKyAgaW5fYWRkciB0bXA7CisgIAorICBpZiAoc20pIAorICAgIHsKKyAgICAgIGlmICghIGluZXRfYXRvbiAoc20sICZ0bXApKQorCXJldHVybiAwOworICAgICAgCisgICAgICBuZXRtYXNrID0gdG1wLnNfYWRkcjsKKyAgICB9CisgIAorICBpZiAoaXApIAorICAgIHsKKyAgICAgIGlmICghIGluZXRfYXRvbiAoaXAsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIpKSAKKwlyZXR1cm4gMDsKKyAgICAgIAorICAgICAgaWYgKCEgbmV0bWFzayAmJiAhIHNtKSAKKwluZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrICgpOworICAgIH0KKyAgCisgIGlmIChndyAmJiAhIGluZXRfYXRvbiAoZ3csICZhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyKSkgCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ2xlYXIgb3V0IHRoZSBBUlAgZW50cnkuICAqLworICBncnViX21lbXNldCAoYXJwdGFibGVbQVJQX0dBVEVXQVldLm5vZGUsIDAsIEVUSF9BTEVOKTsKKyAgCisgIGlmIChzdnIgJiYgISBpbmV0X2F0b24gKHN2ciwgJmFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkcikpIAorICAgIHJldHVybiAwOworCisgIC8qIExpa2V3aXNlLiAgKi8KKyAgZ3J1Yl9tZW1zZXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLm5vZGUsIDAsIEVUSF9BTEVOKTsKKyAgCisgIGlmIChpcCB8fCBzbSkKKyAgICB7CisgICAgICBpZiAoSVBfQlJPQURDQVNUID09IChuZXRtYXNrIHwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikKKwkgIHx8IG5ldG1hc2sgPT0gKG5ldG1hc2sgfCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyKQorCSAgfHwgISBuZXRtYXNrKQorCW5ldHdvcmtfcmVhZHkgPSAwOworICAgICAgZWxzZQorCW5ldHdvcmtfcmVhZHkgPSAxOworICAgIH0KKyAgCisgIHJldHVybiAxOworfQorCisvKgorICogcHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uCisgKgorICogT3V0cHV0IHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uIEl0IG1heSBicm9rZSB0aGUgZ3JhcGhpYyBjb25zb2xlIG5vdy46LSgKKyAqLwordm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpCit7CisJRW50ZXJGdW5jdGlvbigicHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uIik7CisJaWYgKCEgZ3J1Yl9ldGhfcHJvYmUgKCkpCisJCWdydWJfcHJpbnRmICgiTm8gZXRoZXJuZXQgY2FyZCBmb3VuZC5cbiIpOworCWVsc2UgaWYgKCEgbmV0d29ya19yZWFkeSkKKwkJZ3J1Yl9wcmludGYgKCJOb3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7CisJZWxzZSB7CisJCWV0aGVyYm9vdF9wcmludGYgKCJBZGRyZXNzOiAlQFxuIiwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcik7CisJCWV0aGVyYm9vdF9wcmludGYgKCJOZXRtYXNrOiAlQFxuIiwgbmV0bWFzayk7CisJCWV0aGVyYm9vdF9wcmludGYgKCJTZXJ2ZXI6ICVAXG4iLCBhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyKTsKKwkJZXRoZXJib290X3ByaW50ZiAoIkdhdGV3YXk6ICVAXG4iLCBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcik7CisJfQorCUxlYXZlRnVuY3Rpb24oInByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiIpOworfQorCisvKioKKyAqIGNsZWFudXBfbmV0CisgKgorICogTWFyayBuZXR3b3JrIHVudXNhYmxlLCBhbmQgZGlzYWJsZSBOSUNzCisgKi8KK3ZvaWQgY2xlYW51cF9uZXQgKHZvaWQpCit7CisJaWYgKG5ldHdvcmtfcmVhZHkpeworCQkvKiBTdG9wIHJlY2VpdmluZyBwYWNrZXRzLiAgKi8KKwkJZXRoX2Rpc2FibGUgKCk7CisJCW5ldHdvcmtfcmVhZHkgPSAwOworCX0KK30KSW5kZXg6IGIvbmV0Ym9vdC9uaWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvbmljLmgKKysrIGIvbmV0Ym9vdC9uaWMuaApAQCAtOCwyNCArOCwzOCBAQAogI2lmbmRlZglOSUNfSAogI2RlZmluZSBOSUNfSAogCisjaW5jbHVkZSAiZGV2LmgiCisKK3R5cGVkZWYgZW51bSB7CisJRElTQUJMRSA9IDAsCisJRU5BQkxFLAorCUZPUkNFCit9IGlycV9hY3Rpb25fdDsKKwogLyoKICAqCVN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGV0aF9wcm9iZSBhbmQgcGFzc2VkIHRvIG90aGVyIGRyaXZlcgogICoJZnVuY3Rpb25zLgogICovCi0KIHN0cnVjdCBuaWMKIHsKLQl2b2lkCQkoKnJlc2V0KVAoKHN0cnVjdCBuaWMgKikpOwotCWludAkJKCpwb2xsKVAoKHN0cnVjdCBuaWMgKikpOworCXN0cnVjdCBkZXYJZGV2OyAgLyogVGhpcyBtdXN0IGNvbWUgZmlyc3QgKi8KKwlpbnQJCSgqcG9sbClQKChzdHJ1Y3QgbmljICosIGludCByZXRyaWV2ZSkpOwogCXZvaWQJCSgqdHJhbnNtaXQpUCgoc3RydWN0IG5pYyAqLCBjb25zdCBjaGFyICpkLAogCQkJCXVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkpOwotCXZvaWQJCSgqZGlzYWJsZSlQKChzdHJ1Y3QgbmljICopKTsKKwl2b2lkCQkoKmlycSlQKChzdHJ1Y3QgbmljICosIGlycV9hY3Rpb25fdCkpOwogCWludAkJZmxhZ3M7CS8qIGRyaXZlciBzcGVjaWZpYyBmbGFncyAqLwogCXN0cnVjdCByb21faW5mbwkqcm9tX2luZm87CS8qIC0+IHJvbV9pbmZvIGZyb20gbWFpbiAqLwogCXVuc2lnbmVkIGNoYXIJKm5vZGVfYWRkcjsKLQljaGFyCQkqcGFja2V0OworCXVuc2lnbmVkIGNoYXIJKnBhY2tldDsKIAl1bnNpZ25lZCBpbnQJcGFja2V0bGVuOworCXVuc2lnbmVkIGludAlpb2FkZHI7CisJdW5zaWduZWQgY2hhcglpcnFubzsKIAl2b2lkCQkqcHJpdl9kYXRhOwkvKiBkcml2ZXIgY2FuIGhhbmcgcHJpdmF0ZSBkYXRhIGhlcmUgKi8KIH07CiAKK2V4dGVybiBpbnQgIGV0aF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYpOworZXh0ZXJuIGludCAgZXRoX3BvbGwoaW50IHJldHJpZXZlKTsKK2V4dGVybiB2b2lkIGV0aF90cmFuc21pdChjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IHZvaWQgKnApOworZXh0ZXJuIHZvaWQgZXRoX2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBldGhfaXJxKGlycV9hY3Rpb25fdCBhY3Rpb24pOwogI2VuZGlmCS8qIE5JQ19IICovCkluZGV4OiBiL25ldGJvb3QvbnM4MzgyMC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L25zODM4MjAuYwpAQCAtMCwwICsxLDEwMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICBuczgzODIwLmM6IEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciA4MzgyMAorKiAgICBXcml0dGVuIDIwMDQgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCW5zODM4MjAuYyBieSBCZW5qYW1pbiBMYUhhaXNlIHdpdGggY29udHJpYnV0aW9ucworKiAJCWZvciBMaW51eCBrZXJuZWwgMi40LnguCisqCQorKiAgICBMaW51eCBEcml2ZXIgVmVyc2lvbiAwLjIwLCAyMDAyMDYxMAorKiAKKyogICAgVGhpcyBkZXZlbG9wbWVudCBvZiB0aGlzIEV0aGVyYm9vdCBkcml2ZXIgd2FzIGZ1bmRlZCBieToKKyoKKyogICAgTlhUVjogaHR0cDovL3d3dy5ueHR2LmNvbS8KKyogICAgCQorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqCisqICAgIHYxLjAJMDItMTYtMjAwNAl0aW1sZWdnZQlJbml0aWFsIHBvcnQgb2YgTGludXggZHJpdmVyCisqICAgIHYxLjEJMDItMTktMjAwNAl0aW1sZWdnZQlNb3JlIHJvaGJ1c3QgdHJhbnNtaXQgYW5kIHBvbGwKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKworI2lmIEFSQ0ggPT0gaWE2NAkJLyogU3VwcG9ydCA2NC1iaXQgYWRkcmVzc2luZyAqLworI2RlZmluZSBVU0VfNjRCSVRfQUREUgorI2VuZGlmCisKKy8vI2RlZmluZSBEREVCVUcKKyNpZmRlZiBEREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKKyNkZWZpbmUgSFogMTAwCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisKKy8qIEdsb2JhbCBwYXJhbWV0ZXJzLiAgU2VlIE1PRFVMRV9QQVJNIG5lYXIgdGhlIGJvdHRvbS4gKi8KKy8vIHN0YXRpYyBpbnQgaWhyID0gMjsKK3N0YXRpYyBpbnQgcmVzZXRfcGh5ID0gMDsKK3N0YXRpYyBpbnQgbG5rc3RzID0gMDsJCS8qIENGR19MTktTVFMgYml0IHBvbGFyaXR5ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBVU0VfNjRCSVRfQUREUgkiKyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfNjRCSVRfQUREUikKKyNkZWZpbmUgVFJZX0RBQwkxCisjZWxzZQorI2RlZmluZSBUUllfREFDCTAKKyNlbmRpZgorCisvKiB0dW5hYmxlcyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTAwCS8qIDgxOTIgKi8KKworLyogTXVzdCBub3QgZXhjZWVkIH42NTAwMC4gKi8KKyNkZWZpbmUgTlJfUlhfREVTQwk2NAorI2RlZmluZSBOUl9UWF9ERVNDCTEKKworCQkgICAvKiBub3QgdHVuYWJsZSAqLy8qIEV4dHJhIDYgYnl0ZXMgZm9yIDY0IGJpdCBhbGlnbm1lbnQgKGRpdmlzYWJsZSBieSA4KSAqLworI2RlZmluZSBSRUFMX1JYX0JVRl9TSVpFIChSWF9CVUZfU0laRSArIDE0ICsgNikJLyogcngvdHggbWFjIGFkZHIgKyB0eXBlICovCisKKyNkZWZpbmUgTUlOX1RYX0RFU0NfRlJFRQk4CisKKy8qIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgQ0ZHQ1MJCTB4MDQKKworI2RlZmluZSBDUl9UWEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JfVFhECQkweDAwMDAwMDAyCisvKiBSYW1pdCA6IEhlcmUncyBhIHRpcCwgZG9uJ3QgZG8gYSBSWEQgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gUlhFCisgKiBUaGUgUmVjZWl2ZSBlbmdpbmUgc2tpcHMgb25lIGRlc2NyaXB0b3IgYW5kIG1vdmVzCisgKiBvbnRvIHRoZSBuZXh0IG9uZSEhICovCisjZGVmaW5lIENSX1JYRQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUl9SWEQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JfVFhSCQkweDAwMDAwMDEwCisjZGVmaW5lIENSX1JYUgkJMHgwMDAwMDAyMAorI2RlZmluZSBDUl9TV0kJCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1JfUlNUCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgUFRTQ1JfRUVCSVNUX0ZBSUwgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBQVFNDUl9FRUJJU1RfRU4gICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBUU0NSX0VFTE9BRF9FTiAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfRkFJTCAgICAgICAgMHgwMDAwMDFiOAorI2RlZmluZSBQVFNDUl9SQklTVF9ET05FICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBUU0NSX1JCSVNUX0VOICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfUlNUICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE1FQVJfRUVESQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRUFSX0VFRE8JCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVBUl9FRUNMSwkJMHgwMDAwMDAwNAorI2RlZmluZSBNRUFSX0VFU0VMCQkweDAwMDAwMDA4CisjZGVmaW5lIE1FQVJfTURJTwkJMHgwMDAwMDAxMAorI2RlZmluZSBNRUFSX01ERElSCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FQVJfTURDCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgSVNSX1RYREVTQzMJMHg0MDAwMDAwMAorI2RlZmluZSBJU1JfVFhERVNDMgkweDIwMDAwMDAwCisjZGVmaW5lIElTUl9UWERFU0MxCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVNSX1RYREVTQzAJMHgwODAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMwkweDA0MDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MyCTB4MDIwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzEJMHgwMTAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMAkweDAwODAwMDAwCisjZGVmaW5lIElTUl9UWFJDTVAJMHgwMDQwMDAwMAorI2RlZmluZSBJU1JfUlhSQ01QCTB4MDAyMDAwMDAKKyNkZWZpbmUgSVNSX0RQRVJSCTB4MDAxMDAwMDAKKyNkZWZpbmUgSVNSX1NTRVJSCTB4MDAwODAwMDAKKyNkZWZpbmUgSVNSX1JNQUJUCTB4MDAwNDAwMDAKKyNkZWZpbmUgSVNSX1JUQUJUCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVNSX1JYU09WUgkweDAwMDEwMDAwCisjZGVmaW5lIElTUl9ISUJJTlQJMHgwMDAwODAwMAorI2RlZmluZSBJU1JfUEhZCQkweDAwMDA0MDAwCisjZGVmaW5lIElTUl9QTUUJCTB4MDAwMDIwMDAKKyNkZWZpbmUgSVNSX1NXSQkJMHgwMDAwMTAwMAorI2RlZmluZSBJU1JfTUlCCQkweDAwMDAwODAwCisjZGVmaW5lIElTUl9UWFVSTgkweDAwMDAwNDAwCisjZGVmaW5lIElTUl9UWElETEUJMHgwMDAwMDIwMAorI2RlZmluZSBJU1JfVFhFUlIJMHgwMDAwMDEwMAorI2RlZmluZSBJU1JfVFhERVNDCTB4MDAwMDAwODAKKyNkZWZpbmUgSVNSX1RYT0sJMHgwMDAwMDA0MAorI2RlZmluZSBJU1JfUlhPUk4JMHgwMDAwMDAyMAorI2RlZmluZSBJU1JfUlhJRExFCTB4MDAwMDAwMTAKKyNkZWZpbmUgSVNSX1JYRUFSTFkJMHgwMDAwMDAwOAorI2RlZmluZSBJU1JfUlhFUlIJMHgwMDAwMDAwNAorI2RlZmluZSBJU1JfUlhERVNDCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVNSX1JYT0sJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRYQ0ZHX0NTSQkweDgwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0hCSQkweDQwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01MQgkweDIwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0FUUAkweDEwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0VDUkVUUlkJMHgwMDgwMDAwMAorI2RlZmluZSBUWENGR19CUlNUX0RJUwkweDAwMDgwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMTAyNAkweDAwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNTEyCTB4MDA3MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUEyNTYJMHgwMDYwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTEyOAkweDAwNTAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNjQJMHgwMDQwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTMyCTB4MDAzMDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUExNgkweDAwMjAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BOAkweDAwMTAwMDAwCisKKyNkZWZpbmUgQ0ZHX0xOS1NUUwkweDgwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMJMHg2MDAwMDAwMAorI2RlZmluZSBDRkdfU1BEU1RTMQkweDQwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMwCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0RVUFNUUwkweDEwMDAwMDAwCisjZGVmaW5lIENGR19UQklfRU4JMHgwMTAwMDAwMAorI2RlZmluZSBDRkdfTU9ERV8xMDAwCTB4MDA0MDAwMDAKKy8qIFJhbWl0IDogRG9udCcgZXZlciB1c2UgQVVUT18xMDAwLCBpdCBuZXZlciB3b3JrcyBhbmQgaXMgYnVnZ3kuCisgKiBSZWFkIHRoZSBQaHkgcmVzcG9uc2UgYW5kIHRoZW4gY29uZmlndXJlIHRoZSBNQUMgYWNjb3JkaW5nbHkgKi8KKyNkZWZpbmUgQ0ZHX0FVVE9fMTAwMAkweDAwMjAwMDAwCisjZGVmaW5lIENGR19QSU5UX0NUTAkweDAwMWMwMDAwCisjZGVmaW5lIENGR19QSU5UX0RVUFNUUwkweDAwMTAwMDAwCisjZGVmaW5lIENGR19QSU5UX0xOS1NUUwkweDAwMDgwMDAwCisjZGVmaW5lIENGR19QSU5UX1NQRFNUUwkweDAwMDQwMDAwCisjZGVmaW5lIENGR19UTVJURVNUCTB4MDAwMjAwMDAKKyNkZWZpbmUgQ0ZHX01STV9ESVMJMHgwMDAxMDAwMAorI2RlZmluZSBDRkdfTVdJX0RJUwkweDAwMDA4MDAwCisjZGVmaW5lIENGR19UNjRBRERSCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0ZHX1BDSTY0X0RFVAkweDAwMDAyMDAwCisjZGVmaW5lIENGR19EQVRBNjRfRU4JMHgwMDAwMTAwMAorI2RlZmluZSBDRkdfTTY0QUREUgkweDAwMDAwODAwCisjZGVmaW5lIENGR19QSFlfUlNUCTB4MDAwMDA0MDAKKyNkZWZpbmUgQ0ZHX1BIWV9ESVMJMHgwMDAwMDIwMAorI2RlZmluZSBDRkdfRVhUU1RTX0VOCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ0ZHX1JFUUFMRwkweDAwMDAwMDgwCisjZGVmaW5lIENGR19TQgkJMHgwMDAwMDA0MAorI2RlZmluZSBDRkdfUE9XCQkweDAwMDAwMDIwCisjZGVmaW5lIENGR19FWEQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ0ZHX1BFU0VMCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ0ZHX0JST01fRElTCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHX0VYVF8xMjUJMHgwMDAwMDAwMgorI2RlZmluZSBDRkdfQkVNCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRVhUU1RTX1VEUFBLVAkweDAwMjAwMDAwCisjZGVmaW5lIEVYVFNUU19UQ1BQS1QJMHgwMDA4MDAwMAorI2RlZmluZSBFWFRTVFNfSVBQS1QJMHgwMDAyMDAwMAorCisjZGVmaW5lIFNQRFNUU19QT0xBUklUWQkoQ0ZHX1NQRFNUUzEgfCBDRkdfU1BEU1RTMCB8IENGR19EVVBTVFMgfCAobG5rc3RzID8gQ0ZHX0xOS1NUUyA6IDApKQorCisjZGVmaW5lIE1JQkNfTUlCUwkweDAwMDAwMDA4CisjZGVmaW5lIE1JQkNfQUNMUgkweDAwMDAwMDA0CisjZGVmaW5lIE1JQkNfRlJaCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlCQ19XUk4JMHgwMDAwMDAwMQorCisjZGVmaW5lIFBDUl9QU0VOCSgxIDw8IDMxKQorI2RlZmluZSBQQ1JfUFNfTUNBU1QJKDEgPDwgMzApCisjZGVmaW5lIFBDUl9QU19EQQkoMSA8PCAyOSkKKyNkZWZpbmUgUENSX1NUSElfOAkoMyA8PCAyMykKKyNkZWZpbmUgUENSX1NUTE9fNAkoMSA8PCAyMykKKyNkZWZpbmUgUENSX0ZGSElfOEsJKDMgPDwgMjEpCisjZGVmaW5lIFBDUl9GRkxPXzRLCSgxIDw8IDIxKQorI2RlZmluZSBQQ1JfUEFVU0VfQ05UCTB4RkZGRQorCisjZGVmaW5lIFJYQ0ZHX0FFUAkweDgwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX0FSUAkweDQwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX1NUUklQQ1JDCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlhDRkdfUlhfRkQJMHgxMDAwMDAwMAorI2RlZmluZSBSWENGR19BTFAJMHgwODAwMDAwMAorI2RlZmluZSBSWENGR19BSVJMCTB4MDQwMDAwMDAKKyNkZWZpbmUgUlhDRkdfTVhETUE1MTIJMHgwMDcwMDAwMAorI2RlZmluZSBSWENGR19EUlRICTB4MDAwMDAwM2UKKyNkZWZpbmUgUlhDRkdfRFJUSDAJMHgwMDAwMDAwMgorCisjZGVmaW5lIFJGQ1JfUkZFTgkweDgwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQUFCCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkZDUl9BQU0JMHgyMDAwMDAwMAorI2RlZmluZSBSRkNSX0FBVQkweDEwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBNCTB4MDgwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUCTB4MDc4MDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMwkweDA0MDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDIJMHgwMjAwMDAwMAorI2RlZmluZSBSRkNSX0FQQVQxCTB4MDEwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMAkweDAwODAwMDAwCisjZGVmaW5lIFJGQ1JfQUFSUAkweDAwNDAwMDAwCisjZGVmaW5lIFJGQ1JfTUhFTgkweDAwMjAwMDAwCisjZGVmaW5lIFJGQ1JfVUhFTgkweDAwMTAwMDAwCisjZGVmaW5lIFJGQ1JfVUxNCTB4MDAwODAwMDAKKworI2RlZmluZSBWUkNSX1JVRFBFCTB4MDAwMDAwODAKKyNkZWZpbmUgVlJDUl9SVENQRQkweDAwMDAwMDQwCisjZGVmaW5lIFZSQ1JfUklQRQkweDAwMDAwMDIwCisjZGVmaW5lIFZSQ1JfSVBFTgkweDAwMDAwMDEwCisjZGVmaW5lIFZSQ1JfRFVURgkweDAwMDAwMDA4CisjZGVmaW5lIFZSQ1JfRFZURgkweDAwMDAwMDA0CisjZGVmaW5lIFZSQ1JfVlRSRU4JMHgwMDAwMDAwMgorI2RlZmluZSBWUkNSX1ZUREVOCTB4MDAwMDAwMDEKKworI2RlZmluZSBWVENSX1BQQ0hLCTB4MDAwMDAwMDgKKyNkZWZpbmUgVlRDUl9HQ0hLCTB4MDAwMDAwMDQKKyNkZWZpbmUgVlRDUl9WUFBUSQkweDAwMDAwMDAyCisjZGVmaW5lIFZUQ1JfVkdUSQkweDAwMDAwMDAxCisKKyNkZWZpbmUgQ1IJCTB4MDAKKyNkZWZpbmUgQ0ZHCQkweDA0CisjZGVmaW5lIE1FQVIJCTB4MDgKKyNkZWZpbmUgUFRTQ1IJCTB4MGMKKyNkZWZpbmUJSVNSCQkweDEwCisjZGVmaW5lCUlNUgkJMHgxNAorI2RlZmluZQlJRVIJCTB4MTgKKyNkZWZpbmUJSUhSCQkweDFjCisjZGVmaW5lIFRYRFAJCTB4MjAKKyNkZWZpbmUgVFhEUF9ISQkJMHgyNAorI2RlZmluZSBUWENGRwkJMHgyOAorI2RlZmluZSBHUElPUgkJMHgyYworI2RlZmluZSBSWERQCQkweDMwCisjZGVmaW5lIFJYRFBfSEkJCTB4MzQKKyNkZWZpbmUgUlhDRkcJCTB4MzgKKyNkZWZpbmUgUFFDUgkJMHgzYworI2RlZmluZSBXQ1NSCQkweDQwCisjZGVmaW5lIFBDUgkJMHg0NAorI2RlZmluZSBSRkNSCQkweDQ4CisjZGVmaW5lIFJGRFIJCTB4NGMKKworI2RlZmluZSBTUlIJCTB4NTgKKworI2RlZmluZSBWUkNSCQkweGJjCisjZGVmaW5lIFZUQ1IJCTB4YzAKKyNkZWZpbmUgVkRSCQkweGM0CisjZGVmaW5lIENDU1IJCTB4Y2MKKworI2RlZmluZSBUQklDUgkJMHhlMAorI2RlZmluZSBUQklTUgkJMHhlNAorI2RlZmluZSBUQU5BUgkJMHhlOAorI2RlZmluZSBUQU5MUEFSCQkweGVjCisjZGVmaW5lIFRBTkVSCQkweGYwCisjZGVmaW5lIFRFU1IJCTB4ZjQKKworI2RlZmluZSBUQklDUl9NUl9BTl9FTkFCTEUJMHgwMDAwMTAwMAorI2RlZmluZSBUQklDUl9NUl9SRVNUQVJUX0FOCTB4MDAwMDAyMDAKKworI2RlZmluZSBUQklTUl9NUl9MSU5LX1NUQVRVUwkweDAwMDAwMDIwCisjZGVmaW5lIFRCSVNSX01SX0FOX0NPTVBMRVRFCTB4MDAwMDAwMDQKKworI2RlZmluZSBUQU5BUl9QUzIgCQkweDAwMDAwMTAwCisjZGVmaW5lIFRBTkFSX1BTMSAJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEFOQVJfSEFMRl9EVVAgCQkweDAwMDAwMDQwCisjZGVmaW5lIFRBTkFSX0ZVTExfRFVQIAkJMHgwMDAwMDAyMAorCisjZGVmaW5lIEdQSU9SX0dQNV9PRQkJMHgwMDAwMDIwMAorI2RlZmluZSBHUElPUl9HUDRfT0UJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR1BJT1JfR1AzX09FCQkweDAwMDAwMDgwCisjZGVmaW5lIEdQSU9SX0dQMl9PRQkJMHgwMDAwMDA0MAorI2RlZmluZSBHUElPUl9HUDFfT0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR1BJT1JfR1AzX09VVAkJMHgwMDAwMDAwNAorI2RlZmluZSBHUElPUl9HUDFfT1VUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTElOS19BVVRPTkVHT1RJQVRFCTB4MDEKKyNkZWZpbmUgTElOS19ET1dOCQkweDAyCisjZGVmaW5lIExJTktfVVAJCQkweDA0CisKKworI2RlZmluZSBfX2tpY2tfcngoKQl3cml0ZWwoQ1JfUlhFLCBucy0+YmFzZSArIENSKQorCisjZGVmaW5lIGtpY2tfcngoKSBkbyB7IFwKKwlkcHJpbnRmKCgia2lja19yeDogbWF5YmUga2lja2luZ1xuIikpOyBcCisJCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW25zLT5jdXJfcnhdKSwgbnMtPmJhc2UgKyBSWERQKTsgXAorCQlpZiAobnMtPm5leHRfcnggPT0gbnMtPm5leHRfZW1wdHkpIFwKKwkJCXByaW50ZigidWgtb2g6IG5leHRfcnggPT0gbmV4dF9lbXB0eT8/P1xuIik7IFwKKwkJX19raWNrX3J4KCk7IFwKK30gd2hpbGUoMCkKKworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKyNkZWZpbmUgSFdfQUREUl9MRU4JOAorI2Vsc2UKKyNkZWZpbmUgSFdfQUREUl9MRU4JNAorI2VuZGlmCisKKyNkZWZpbmUgQ01EU1RTX09XTgkweDgwMDAwMDAwCisjZGVmaW5lIENNRFNUU19NT1JFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBDTURTVFNfRVJSCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX09LCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0xFTl9NQVNLCTB4MDAwMGZmZmYKKworI2RlZmluZSBDTURTVFNfREVTVF9NQVNLCTB4MDE4MDAwMDAKKyNkZWZpbmUgQ01EU1RTX0RFU1RfU0VMRgkweDAwODAwMDAwCisjZGVmaW5lIENNRFNUU19ERVNUX01VTFRJCTB4MDEwMDAwMDAKKworI2RlZmluZSBERVNDX1NJWkUJOAkvKiBTaG91bGQgYmUgY2FjaGUgbGluZSBzaXplZCAqLworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKK3N0cnVjdCByaW5nX2Rlc2MgeworCXVpbnQ2NF90IGxpbms7CisJdWludDY0X3QgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbHNlCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgbGluazsKKwl1MzIgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcmluZ19kZXNjIHR4X3JpbmdbTlJfVFhfREVTQ10KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUkVBTF9SWF9CVUZfU0laRSBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbTlJfVFhfREVTQyAqIFJFQUxfUlhfQlVGX1NJWkVdOworCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcmluZ19kZXNjIHJ4X3JpbmdbTlJfUlhfREVTQ10KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUkVBTF9SWF9CVUZfU0laRSBmb3IgZWFjaAorUlggRGVzY3JpcHRvciAgIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlJfUlhfREVTQyAqIFJFQUxfUlhfQlVGX1NJWkVdCisgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKworLyogUHJpdmF0ZSBTdG9yYWdlIGZvciB0aGUgTklDICovCitzdHJ1Y3QgbnM4MzgyMF9wcml2YXRlIHsKKwl1OCAqYmFzZTsKKwlpbnQgdXA7CisJbG9uZyBpZGxlOworCXUzMiAqbmV4dF9yeF9kZXNjOworCXUxNiBuZXh0X3J4LCBuZXh0X2VtcHR5OworCXUzMiBjdXJfcng7CisJdTMyICpkZXNjczsKKwl1bnNpZ25lZCBpaHI7CisJdTMyIENGR19jYWNoZTsKKwl1MzIgTUVBUl9jYWNoZTsKKwl1MzIgSU1SX2NhY2hlOworCWludCBsaW5rc3RhdGU7CisJdTE2IHR4X2RvbmVfaWR4OworCXUxNiB0eF9pZHg7CisJdTE2IHR4X2ludHJfaWR4OworCXUzMiBwaHlfZGVzY3M7CisJdTMyICp0eF9kZXNjczsKKworfSBuc3g7CitzdGF0aWMgc3RydWN0IG5zODM4MjBfcHJpdmF0ZSAqbnM7CisKK3N0YXRpYyB2b2lkIHBoeV9pbnRyKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlzdGF0aWMgY2hhciAqc3BlZWRzW10gPQorCSAgICB7ICIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwKD8pIiwgIjEwMDBGIiB9OworCXUzMiBjZmcsIG5ld19jZmc7CisJdTMyIHRiaXNyLCB0YW5hciwgdGFubHBhcjsKKwlpbnQgc3BlZWQsIGZ1bGxkdXBsZXgsIG5ld2xpbmtzdGF0ZTsKKworCWNmZyA9IHJlYWRsKG5zLT5iYXNlICsgQ0ZHKSBeIFNQRFNUU19QT0xBUklUWTsKKwlpZiAobnMtPkNGR19jYWNoZSAmIENGR19UQklfRU4pIHsKKwkJLyogd2UgaGF2ZSBhbiBvcHRpY2FsIHRyYW5zY2VpdmVyICovCisJCXRiaXNyID0gcmVhZGwobnMtPmJhc2UgKyBUQklTUik7CisJCXRhbmFyID0gcmVhZGwobnMtPmJhc2UgKyBUQU5BUik7CisJCXRhbmxwYXIgPSByZWFkbChucy0+YmFzZSArIFRBTkxQQVIpOworCQlkcHJpbnRmKCgicGh5X2ludHI6IHRiaXNyPSVoWCwgdGFuYXI9JWhYLCB0YW5scGFyPSVoWFxuIiwKKwkJCSB0YmlzciwgdGFuYXIsIHRhbmxwYXIpKTsKKworCQlpZiAoKGZ1bGxkdXBsZXggPSAodGFubHBhciAmIFRBTkFSX0ZVTExfRFVQKQorCQkgICAgICYmICh0YW5hciAmIFRBTkFSX0ZVTExfRFVQKSkpIHsKKworCQkJLyogYm90aCBvZiB1cyBhcmUgZnVsbCBkdXBsZXggKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJICAgICAgIHwgVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQLAorCQkJICAgICAgIG5zLT5iYXNlICsgVFhDRkcpOworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgUlhDRkcpIHwgUlhDRkdfUlhfRkQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBSWENGRyk7CisJCQkvKiBMaWdodCB1cCBmdWxsIGR1cGxleCBMRUQgKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIEdQSU9SKSB8IEdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisKKwkJfSBlbHNlIGlmICgoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9GVUxMX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9GVUxMX0RVUCkpKSB7CisKKwkJCS8qIG9uZSBvciBib3RoIG9mIHVzIGFyZSBoYWxmIGR1cGxleCAqLworCQkJd3JpdGVsKChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJCSYgfihUWENGR19DU0kgfCBUWENGR19IQkkpKSB8IFRYQ0ZHX0FUUCwKKwkJCSAgICAgICBucy0+YmFzZSArIFRYQ0ZHKTsKKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFJYQ0ZHKSAmIH5SWENGR19SWF9GRCwKKwkJCSAgICAgICBucy0+YmFzZSArIFJYQ0ZHKTsKKwkJCS8qIFR1cm4gb2ZmIGZ1bGwgZHVwbGV4IExFRCAqLworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgR1BJT1IpICYgfkdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisJCX0KKworCQlzcGVlZCA9IDQ7CS8qIDEwMDBGICovCisKKwl9IGVsc2UgeworCQkvKiB3ZSBoYXZlIGEgY29wcGVyIHRyYW5zY2VpdmVyICovCisJCW5ld19jZmcgPQorCQkgICAgbnMtPkNGR19jYWNoZSAmIH4oQ0ZHX1NCIHwgQ0ZHX01PREVfMTAwMCB8IENGR19TUERTVFMpOworCisJCWlmIChjZmcgJiBDRkdfU1BEU1RTMSkKKwkJCW5ld19jZmcgfD0gQ0ZHX01PREVfMTAwMDsKKwkJZWxzZQorCQkJbmV3X2NmZyAmPSB+Q0ZHX01PREVfMTAwMDsKKworCQlzcGVlZCA9ICgoY2ZnIC8gQ0ZHX1NQRFNUUzApICYgMyk7CisJCWZ1bGxkdXBsZXggPSAoY2ZnICYgQ0ZHX0RVUFNUUyk7CisKKwkJaWYgKGZ1bGxkdXBsZXgpCisJCQluZXdfY2ZnIHw9IENGR19TQjsKKworCQlpZiAoKGNmZyAmIENGR19MTktTVFMpICYmCisJCSAgICAoKG5ld19jZmcgXiBucy0+Q0ZHX2NhY2hlKSAmIENGR19NT0RFXzEwMDApKSB7CisJCQl3cml0ZWwobmV3X2NmZywgbnMtPmJhc2UgKyBDRkcpOworCQkJbnMtPkNGR19jYWNoZSA9IG5ld19jZmc7CisJCX0KKworCQlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfU1BEU1RTOworCQlucy0+Q0ZHX2NhY2hlIHw9IGNmZyAmIENGR19TUERTVFM7CisJfQorCisJbmV3bGlua3N0YXRlID0gKGNmZyAmIENGR19MTktTVFMpID8gTElOS19VUCA6IExJTktfRE9XTjsKKworCWlmIChuZXdsaW5rc3RhdGUgJiBMSU5LX1VQICYmIG5zLT5saW5rc3RhdGUgIT0gbmV3bGlua3N0YXRlKSB7CisJCXByaW50ZigibGluayBub3cgJXMgbWJwcywgJXMgZHVwbGV4IGFuZCB1cC5cbiIsCisJCSAgICAgICBzcGVlZHNbc3BlZWRdLCBmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmtzdGF0ZSAmIExJTktfRE9XTgorCQkgICAmJiBucy0+bGlua3N0YXRlICE9IG5ld2xpbmtzdGF0ZSkgeworCQlwcmludGYoImxpbmsgbm93IGRvd24uXG4iKTsKKwl9CisJbnMtPmxpbmtzdGF0ZSA9IG5ld2xpbmtzdGF0ZTsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXR1cF9yeChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlucy0+aWRsZSA9IDE7CisJbnMtPm5leHRfcnggPSAwOworCW5zLT5uZXh0X3J4X2Rlc2MgPSBucy0+ZGVzY3M7CisJbnMtPm5leHRfZW1wdHkgPSAwOworCW5zLT5jdXJfcnggPSAwOworCisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUlhfREVTQzsgaSsrKSB7CisJCXJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSArIDFdKTsKKwkJcnhfcmluZ1tpXS5idWZwdHIgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBSRUFMX1JYX0JVRl9TSVpFXSk7CisJCXJ4X3JpbmdbaV0uY21kc3RzID0gY3B1X3RvX2xlMzIoUkVBTF9SWF9CVUZfU0laRSk7CisJCXJ4X3JpbmdbaV0uZXh0c3RzID0gY3B1X3RvX2xlMzIoMCk7CisJfQorLy8gICAgICBObyBuZWVkIHRvIHdyYXAgdGhlIHJpbmcgCisvLyAgICAgIHJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKSwgbnMtPmJhc2UgKyBSWERQKTsKKworCWRwcmludGYoKCJzdGFydGluZyByZWNlaXZlclxuIikpOworCisJd3JpdGVsKDB4MDAwMSwgbnMtPmJhc2UgKyBDQ1NSKTsKKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHg3ZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHhmZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKworCW5zLT51cCA9IDE7CisKKwlwaHlfaW50cihuaWMpOworCisJLyogT2theSwgbGV0IGl0IHJpcCAqLworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1BIWTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFJDTVA7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhFUlI7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhPSzsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWE9STjsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFNPVlI7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfUlhERVNDOworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1JYSURMRTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9UWERFU0M7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfVFhJRExFOworCisJLy8gTm8gcmVhc29uIHRvIGVuYWJsZSBpbnRlcnVwdHMuLi4KKwkvLyB3cml0ZWwobnMtPklNUl9jYWNoZSwgbnMtPmJhc2UgKyBJTVIpOworCS8vIHdyaXRlbCgxLCBucy0+YmFzZSArIElFUik7CisJbnM4MzgyMF9zZXRfbXVsdGljYXN0KG5pYyk7CisJa2lja19yeCgpOworfQorCisKK3N0YXRpYyB2b2lkIG5zODM4MjBfZG9fcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MzIgd2hpY2gpCit7CisJZHByaW50ZigoInJlc2V0dGluZyBjaGlwLi4uXG4iKSk7CisJd3JpdGVsKHdoaWNoLCBucy0+YmFzZSArIENSKTsKKwlkbyB7CisKKwl9IHdoaWxlIChyZWFkbChucy0+YmFzZSArIENSKSAmIHdoaWNoKTsKKwlkcHJpbnRmKCgib2theSFcbiIpKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlkcHJpbnRmKCgibnM4MzgyMF9yZXNldFxuIikpOworCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgUFFDUik7CisKKwluczgzODIwX3NldHVwX3J4KG5pYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVFhfREVTQzsgaSsrKSB7CisJCXR4X3JpbmdbaV0ubGluayA9IDA7CisJCXR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwkJdHhfcmluZ1tpXS5jbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwkJdHhfcmluZ1tpXS5leHRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisKKwlucy0+dHhfaWR4ID0gMDsKKwlucy0+dHhfZG9uZV9pZHggPSAwOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFRYRFBfSEkpOworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfZ2V0bWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTggKiBtYWMpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUzMiBkYXRhOworCQkvKiBSZWFkIGZyb20gdGhlIHBlcmZlY3QgbWF0Y2ggbWVtb3J5OiB0aGlzIGlzIGxvYWRlZCBieQorCQkgKiB0aGUgY2hpcCBmcm9tIHRoZSBFRVBST00gdmlhIHRoZSBFRUxPQUQgc2VsZiB0ZXN0LgorCQkgKi8KKwkJd3JpdGVsKGkgKiAyLCBucy0+YmFzZSArIFJGQ1IpOworCQlkYXRhID0gcmVhZGwobnMtPmJhc2UgKyBSRkRSKTsKKwkJKm1hYysrID0gZGF0YTsKKwkJKm1hYysrID0gZGF0YSA+PiA4OworCX0KK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqcmZjciA9IG5zLT5iYXNlICsgUkZDUjsKKwl1MzIgYW5kX21hc2sgPSAweGZmZmZmZmZmOworCXUzMiBvcl9tYXNrID0gMDsKKwl1MzIgdmFsOworCisJLyogU3VwcG9ydCBNdWx0aWNhc3QgKi8KKwlhbmRfbWFzayAmPSB+KFJGQ1JfQUFVIHwgUkZDUl9BQU0pOworCW9yX21hc2sgfD0gUkZDUl9BQU07CisJdmFsID0gKHJlYWRsKHJmY3IpICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkvKiBSYW1pdCA6IFJGQ1IgV3JpdGUgRml4IGRvYyBzYXlzIFJGRU4gbXVzdCBiZSAwIG1vZGlmeSBvdGhlciBiaXRzICovCisJd3JpdGVsKHZhbCAmIH5SRkNSX1JGRU4sIHJmY3IpOworCXdyaXRlbCh2YWwsIHJmY3IpOworCit9CitzdGF0aWMgdm9pZCBuczgzODIwX3J1bl9iaXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgdTMyIGVuYWJsZSwgdTMyIGRvbmUsIHUzMiBmYWlsKQoreworCWludCB0aW1lZF9vdXQgPSAwOworCWxvbmcgc3RhcnQ7CisJdTMyIHN0YXR1czsKKwlpbnQgbG9vcHMgPSAwOworCisJZHByaW50ZigoInN0YXJ0ICVzXG4iLCBuYW1lKSkKKworCSAgICBzdGFydCA9IGN1cnJ0aWNrcygpOworCisJd3JpdGVsKGVuYWJsZSwgbnMtPmJhc2UgKyBQVFNDUik7CisJZm9yICg7OykgeworCQlsb29wcysrOworCQlzdGF0dXMgPSByZWFkbChucy0+YmFzZSArIFBUU0NSKTsKKwkJaWYgKCEoc3RhdHVzICYgZW5hYmxlKSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZG9uZSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZmFpbCkKKwkJCWJyZWFrOworCQlpZiAoKGN1cnJ0aWNrcygpIC0gc3RhcnQpID49IEhaKSB7CisJCQl0aW1lZF9vdXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgZmFpbCkKKwkJcHJpbnRmKCIlcyBmYWlsZWQhICgweCVoWCAmIDB4JWhYKVxuIiwgbmFtZSwgc3RhdHVzLCBmYWlsKTsKKwllbHNlIGlmICh0aW1lZF9vdXQpCisJCXByaW50ZigicnVuX2Jpc3QgJXMgdGltZWQgb3V0ISAoJWhYKVxuIiwgbmFtZSwgc3RhdHVzKTsKKwlkcHJpbnRmKCgiZG9uZSAlcyBpbiAlZCBsb29wc1xuIiwgbmFtZSwgbG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NoZWNrIExpbmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2NoZWNrX2ludHIoc3RydWN0IG5pYyAqbmljKSB7CisJaW50IGk7CisJdTMyIGlzciA9IHJlYWRsKG5zLT5iYXNlICsgSVNSKTsKKwlpZihJU1JfUEhZICYgaXNyKQorCQlwaHlfaW50cihuaWMpOworCWlmKCggSVNSX1JYSURMRSB8IElTUl9SWERFU0MgfCBJU1JfUlhFUlIpICYgaXNyKQorCQlraWNrX3J4KCk7CisJZm9yIChpID0gMDsgaSA8IE5SX1JYX0RFU0M7IGkrKykgeworCQlpZiAocnhfcmluZ1tpXS5jbWRzdHMgPT0gQ01EU1RTX09XTikgeworLy8JCQlyeF9yaW5nW2ldLmxpbmsgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW2kgKyAxXSk7CisJCQlyeF9yaW5nW2ldLmNtZHN0cyA9IGNwdV90b19sZTMyKFJFQUxfUlhfQlVGX1NJWkUpOworCQl9CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuczgzODIwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwl1MzIgY21kc3RzOworCWludCBlbnRyeSA9IG5zLT5jdXJfcng7CisKKwluczgzODIwX2NoZWNrX2ludHIobmljKTsKKworCWNtZHN0cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLmNtZHN0cyk7CisKKwlpZiAoICEgKCAoQ01EU1RTX09XTiAmIChjbWRzdHMpKSAmJiAoY21kc3RzICE9IChDTURTVFNfT1dOKSkgKSApCisJICByZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJaWYgKCEgKENNRFNUU19PSyAmIGNtZHN0cykgKQorCSAgcmV0dXJuIDA7CisKKwluaWMtPnBhY2tldGxlbiA9IGNtZHN0cyAmIDB4ZmZmZjsKKwltZW1jcHkobmljLT5wYWNrZXQsCisJICAgICAgIHJ4YiArIChlbnRyeSAqIFJFQUxfUlhfQlVGX1NJWkUpLAorCSAgICAgICBuaWMtPnBhY2tldGxlbik7CisJLy8JCQlyeF9yaW5nW2VudHJ5XS5saW5rID0gMDsKKwlyeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihDTURTVFNfT1dOKTsKKworCW5zLT5jdXJfcnggPSArK25zLT5jdXJfcnggJSBOUl9SWF9ERVNDOworCisJaWYgKG5zLT5jdXJfcnggPT0gMCkJLyogV2UgaGF2ZSB3cmFwcGVkIHRoZSByaW5nICovCisJICBraWNrX3J4KCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCWRwcmludGYoKCJraWNrX3R4XG4iKSk7CisJd3JpdGVsKENSX1RYRSwgbnMtPmJhc2UgKyBDUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisKKwl1MTYgbnN0eXBlOworCXUzMiBjbWRzdHMsIGV4dHN0czsKKwlpbnQgY3VyX3R4ID0gMDsKKwl1MzIgaXNyID0gcmVhZGwobnMtPmJhc2UgKyBJU1IpOworCWlmIChJU1JfVFhJRExFICYgaXNyKQorCQlraWNrX3R4KG5pYyk7CisJLyogcG9pbnQgdG8gdGhlIGN1cnJlbnQgdHhiIGluY2FzZSBtdWx0aXBsZSB0eF9yaW5ncyBhcmUgdXNlZCAqLworCW1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisJbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CisJbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkodHhiICsgRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJcyAmPSAweDBGRkY7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikKKwkJdHhiW3MrK10gPSAnXDAnOworCisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwlleHRzdHMgPSAwOworCWV4dHN0cyB8PSBFWFRTVFNfVURQUEtUOworCisJdHhfcmluZ1tjdXJfdHhdLmJ1ZnB0ciA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4Yik7CisJdHhfcmluZ1tjdXJfdHhdLmV4dHN0cyA9IGNwdV90b19sZTMyKGV4dHN0cyk7CisKKwljbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwljbWRzdHMgfD0gY3B1X3RvX2xlMzIoQ01EU1RTX09XTiB8IHMpOworCXR4X3JpbmdbY3VyX3R4XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihjbWRzdHMpOworCisJd3JpdGVsKHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLCBucy0+YmFzZSArIFRYRFApOworCWtpY2tfdHgobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQoreworCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCS8qIFRoaXMgZnVuY3Rpb24gc2VydmVzIDMgcHVycG9zZXMuCisJICogVGhpcyBkaXNhYmxlcyBETUEgYW5kIGludGVycnVwdHMgc28gd2UgZG9uJ3QgcmVjZWl2ZQorCSAqICB1bmV4cGVjdGVkIHBhY2tldHMgb3IgaW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFmdGVyCisJICogIGV0aGVyYm9vdCBoYXMgZmluaXNoZWQuIAorCSAqIFRoaXMgZnJlZXMgcmVzb3VyY2VzIHNvIGV0aGVyYm9vdCBtYXkgdXNlCisJICogIHRoaXMgZHJpdmVyIG9uIGFub3RoZXIgaW50ZXJmYWNlCisJICogVGhpcyBhbGxvd3MgZXRoZXJib290IHRvIHJlaW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlCisJICogIGlmIHNvbWV0aGluZyBpcyBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKwkgKi8KKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBJTVIpOworCXdyaXRlbCgwLCBucy0+YmFzZSArIElFUik7CisJcmVhZGwobnMtPmJhc2UgKyBJRVIpOworCisJbnMtPnVwID0gMDsKKworCW5zODM4MjBfZG9fcmVzZXQoKHN0cnVjdCBuaWMgKikgZGV2LCBDUl9SU1QpOworCisJbnMtPklNUl9jYWNoZSAmPQorCSAgICB+KElTUl9SWE9LIHwgSVNSX1JYREVTQyB8IElTUl9SWEVSUiB8IElTUl9SWEVBUkxZIHwKKwkgICAgICBJU1JfUlhJRExFKTsKKwl3cml0ZWwobnMtPklNUl9jYWNoZSwgbnMtPmJhc2UgKyBJTVIpOworCisJLyogdG91Y2ggdGhlIHBjaSBidXMuLi4gKi8KKwlyZWFkbChucy0+YmFzZSArIElNUik7CisKKwkvKiBhc3N1bWVzIHRoZSB0cmFuc21pdHRlciBpcyBhbHJlYWR5IGRpc2FibGVkIGFuZCByZXNldCAqLworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbnM4MzgyMF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBib2FyZF9mb3VuZCAxCisjZGVmaW5lIHZhbGlkX2xpbmsgMAorc3RhdGljIGludCBuczgzODIwX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKSBkZXY7CisJaW50IHN6OworCWxvbmcgYWRkcjsKKwlpbnQgdXNpbmdfZGFjID0gMDsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigibnM4MzgyMC5jOiBGb3VuZCAlcywgdmVuZG9yPTB4JWhYLCBkZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCW5zID0gJm5zeDsKKworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwlhZGRyID0gcGNpX2Jhcl9zdGFydChwY2ksIFBDSV9CQVNFX0FERFJFU1NfMSk7CisJc3ogPSBwY2lfYmFyX3NpemUocGNpLCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCisJbnMtPmJhc2UgPSBpb3JlbWFwKGFkZHIsICgxVUwgPDwgMTIpKTsKKy8vICAgICAgbnMtPmJhc2UgPSBpb3JlbWFwKGFkZHIsIHN6KTsKKworCWlmICghbnMtPmJhc2UpCisJCXJldHVybiAwOworCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCBucy0+YmFzZSArIElNUik7CisJd3JpdGVsKDAsIG5zLT5iYXNlICsgSUVSKTsKKwlyZWFkbChucy0+YmFzZSArIElFUik7CisKKwlucy0+SU1SX2NhY2hlID0gMDsKKworCW5zODM4MjBfZG9fcmVzZXQobmljLCBDUl9SU1QpOworCisJLyogTXVzdCByZXNldCB0aGUgcmFtIGJpc3QgYmVmb3JlIHJ1bm5pbmcgaXQgKi8KKwl3cml0ZWwoUFRTQ1JfUkJJU1RfUlNULCBucy0+YmFzZSArIFBUU0NSKTsKKwluczgzODIwX3J1bl9iaXN0KG5pYywgInNyYW0gYmlzdCIsIFBUU0NSX1JCSVNUX0VOLAorCQkJIFBUU0NSX1JCSVNUX0RPTkUsIFBUU0NSX1JCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmljLCAiZWVwcm9tIGJpc3QiLCBQVFNDUl9FRUJJU1RfRU4sIDAsCisJCQkgUFRTQ1JfRUVCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmljLCAiZWVwcm9tIGxvYWQiLCBQVFNDUl9FRUxPQURfRU4sIDAsIDApOworCisJLyogSSBsb3ZlIGNvbmZpZyByZWdpc3RlcnMgKi8KKwlucy0+Q0ZHX2NhY2hlID0gcmVhZGwobnMtPmJhc2UgKyBDRkcpOworCisJaWYgKChucy0+Q0ZHX2NhY2hlICYgQ0ZHX1BDSTY0X0RFVCkpIHsKKwkJcHJpbnRmKCIlczogZGV0ZWN0ZWQgNjQgYml0IFBDSSBkYXRhIGJ1cy5cbiIsIHBjaS0+bmFtZSk7CisJCS8qZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX0RBVEE2NF9FTjsgKi8KKwkJaWYgKCEobnMtPkNGR19jYWNoZSAmIENGR19EQVRBNjRfRU4pKQorCQkJcHJpbnRmCisJCQkgICAgKCIlczogRUVQUk9NIGRpZCBub3QgZW5hYmxlIDY0IGJpdCBidXMuICBEaXNhYmxlZC5cbiIsCisJCQkgICAgIHBjaS0+bmFtZSk7CisJfSBlbHNlCisJCW5zLT5DRkdfY2FjaGUgJj0gfihDRkdfREFUQTY0X0VOKTsKKworCW5zLT5DRkdfY2FjaGUgJj0gKENGR19UQklfRU4gfCBDRkdfTVJNX0RJUyB8IENGR19NV0lfRElTIHwKKwkJCSAgQ0ZHX1Q2NEFERFIgfCBDRkdfREFUQTY0X0VOIHwgQ0ZHX0VYVF8xMjUgfAorCQkJICBDRkdfTTY0QUREUik7CisJbnMtPkNGR19jYWNoZSB8PQorCSAgICBDRkdfUElOVF9EVVBTVFMgfCBDRkdfUElOVF9MTktTVFMgfCBDRkdfUElOVF9TUERTVFMgfAorCSAgICBDRkdfRVhUU1RTX0VOIHwgQ0ZHX0VYRCB8IENGR19QRVNFTDsKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19SRVFBTEc7CisJbnMtPkNGR19jYWNoZSB8PSBDRkdfUE9XOworCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1RNUlRFU1Q7CisKKwkvKiBXaGVuIGNvbXBpbGVkIHdpdGggNjQgYml0IGFkZHJlc3NpbmcsIHdlIG11c3QgYWx3YXlzIGVuYWJsZQorCSAqIHRoZSA2NCBiaXQgZGVzY3JpcHRvciBmb3JtYXQuCisJICovCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19NNjRBRERSOworI2VuZGlmCisKKy8vRklYTUU6IEVuYWJsZSBzZWN0aW9uIG9uIGRhYyBvciByZW1vdmUgdGhpcworCWlmICh1c2luZ19kYWMpCisJCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1Q2NEFERFI7CisKKwkvKiBCaWcgZW5kaWFuIG1vZGUgZG9lcyBub3Qgc2VlbSB0byBkbyB3aGF0IHRoZSBkb2NzIHN1Z2dlc3QgKi8KKwlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfQkVNOworCisJLyogc2V0dXAgb3B0aWNhbCB0cmFuc2NlaXZlciBpZiB3ZSBoYXZlIG9uZSAqLworCWlmIChucy0+Q0ZHX2NhY2hlICYgQ0ZHX1RCSV9FTikgeworCQlkcHJpbnRmKCgiJXM6IGVuYWJsaW5nIG9wdGljYWwgdHJhbnNjZWl2ZXJcbiIsIHBjaS0+bmFtZSkpOworCQl3cml0ZWwocmVhZGwobnMtPmJhc2UgKyBHUElPUikgfCAweDNlOCwgbnMtPmJhc2UgKyBHUElPUik7CisKKwkJLyogc2V0dXAgYXV0byBuZWdvdGlhdGlvbiBmZWF0dXJlIGFkdmVydGlzZW1lbnQgKi8KKwkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgVEFOQVIpCisJCSAgICAgICB8IFRBTkFSX0hBTEZfRFVQIHwgVEFOQVJfRlVMTF9EVVAsCisJCSAgICAgICBucy0+YmFzZSArIFRBTkFSKTsKKworCQkvKiBzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJCXdyaXRlbChUQklDUl9NUl9BTl9FTkFCTEUgfCBUQklDUl9NUl9SRVNUQVJUX0FOLAorCQkgICAgICAgbnMtPmJhc2UgKyBUQklDUik7CisJCXdyaXRlbChUQklDUl9NUl9BTl9FTkFCTEUsIG5zLT5iYXNlICsgVEJJQ1IpOworCQlucy0+bGlua3N0YXRlID0gTElOS19BVVRPTkVHT1RJQVRFOworCisJCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX01PREVfMTAwMDsKKwl9CisJd3JpdGVsKG5zLT5DRkdfY2FjaGUsIG5zLT5iYXNlICsgQ0ZHKTsKKwlkcHJpbnRmKCgiQ0ZHOiAlaFhcbiIsIG5zLT5DRkdfY2FjaGUpKTsKKworCS8qIEZJWE1FOiByZXNldF9waHkgaXMgZGVmYXVsdGVkIHRvIDAsIHNob3VsZCB3ZSByZXNldCBhbnl3YXk/ICovCisJaWYgKHJlc2V0X3BoeSkgeworCQlkcHJpbnRmKCgiJXM6IHJlc2V0dGluZyBwaHlcbiIsIHBjaS0+bmFtZSkpOworCQl3cml0ZWwobnMtPkNGR19jYWNoZSB8IENGR19QSFlfUlNULCBucy0+YmFzZSArIENGRyk7CisJCXdyaXRlbChucy0+Q0ZHX2NhY2hlLCBucy0+YmFzZSArIENGRyk7CisJfQorI2lmIDAJCQkJLyogSHVoPyAgVGhpcyBzZXRzIHRoZSBQQ0kgbGF0ZW5jeSByZWdpc3Rlci4gIFNob3VsZCBiZSBkb25lIHZpYSAKKwkJCQkgKiB0aGUgUENJIGxheWVyLiAgRklYTUUuCisJCQkJICovCisJaWYgKHJlYWRsKGRldi0+YmFzZSArIFNSUikpCisJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyAweDIwYykgfCAweGZlMDAsCisJCSAgICAgICBkZXYtPmJhc2UgKyAweDIwYyk7CisjZW5kaWYKKworCS8qIE5vdGUhICBUaGUgRE1BIGJ1cnN0IHNpemUgaW50ZXJhY3RzIHdpdGggcGFja2V0CisJICogdHJhbnNtaXNzaW9uLCBzdWNoIHRoYXQgdGhlIGxhcmdlc3QgcGFja2V0IHRoYXQKKwkgKiBjYW4gYmUgdHJhbnNtaXR0ZWQgaXMgODE5MiAtIEZMVEggLSBidXJzdCBzaXplLgorCSAqIElmIG9ubHkgdGhlIHRyYW5zbWl0IGZpZm8gd2FzIGxhcmdlci4uLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgKi8KKwl3cml0ZWwoVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQIHwgVFhDRkdfTVhETUE1MTIKKwkgICAgICAgfCAoKDE2MDAgLyAzMikgKiAweDEwMCksIG5zLT5iYXNlICsgVFhDRkcpOworCisJLyogU2V0IFJ4IHRvIGZ1bGwgZHVwbGV4LCBkb24ndCBhY2NlcHQgcnVudCwgZXJyb3JlZCwgbG9uZyBvciBsZW5ndGgKKwkgKiByYW5nZSBlcnJvcmVkIHBhY2tldHMuICBVc2UgNTEyIGJ5dGUgRE1BLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgCisJICogVHVybiBvbiBBTFAsIG9ubHkgd2UgYXJlIGFjY3BldGluZyBKdW1ibyBQYWNrZXRzICovCisJd3JpdGVsKFJYQ0ZHX0FFUCB8IFJYQ0ZHX0FSUCB8IFJYQ0ZHX0FJUkwgfCBSWENGR19SWF9GRAorCSAgICAgICB8IFJYQ0ZHX1NUUklQQ1JDCisJICAgICAgIC8vfCBSWENGR19BTFAKKwkgICAgICAgfCAoUlhDRkdfTVhETUE1MTIpIHwgMCwgbnMtPmJhc2UgKyBSWENGRyk7CisKKwkvKiBEaXNhYmxlIHByaW9yaXR5IHF1ZXVlaW5nICovCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgUFFDUik7CisKKwkvKiBFbmFibGUgSVAgY2hlY2tzdW0gdmFsaWRhdGlvbiBhbmQgZGV0ZXRpb24gb2YgVkxBTiBoZWFkZXJzLgorCSAqIE5vdGU6IGRvIG5vdCBzZXQgdGhlIHJlamVjdCBvcHRpb25zIGFzIGF0IGxlYXN0IHRoZSAweDEwMgorCSAqIHJldmlzaW9uIG9mIHRoZSBjaGlwIGRvZXMgbm90IHByb3Blcmx5IGFjY2VwdCBJUCBmcmFnbWVudHMKKwkgKiBhdCBsZWFzdCBmb3IgVURQLgorCSAqLworCS8qIFJhbWl0IDogQmUgc3VyZSB0byB0dXJuIG9uIFJYQ0ZHX0FSUCBpZiBWTEFOJ3MgYXJlIGVuYWJsZWQsIHNpbmNlCisJICogdGhlIE1BQyBpdCBjYWxjdWxhdGVzIHRoZSBwYWNrZXRzaXplIEFGVEVSIHN0cmlwcGluZyB0aGUgVkxBTgorCSAqIGhlYWRlciwgYW5kIGlmIGEgVkxBTiBUYWdnZWQgcGFja2V0IG9mIDY0IGJ5dGVzIGlzIHJlY2VpdmVkIChsaWtlCisJICogYSBwaW5nIHdpdGggYSBWTEFOIGhlYWRlcikgdGhlbiB0aGUgY2FyZCwgc3RyaXBzIHRoZSA0IGJ5dGUgVkxBTgorCSAqIHRhZyBhbmQgdGhlbiBjaGVja3MgdGhlIHBhY2tldCBzaXplLCBzbyBpZiBSWENGR19BUlAgaXMgbm90IGVuYWJsZWQsCisJICogaXQgZGlzY3JhcmRzIGl0IS4gIFRoZXNlIGd1eXMuLi4uLi4KKwkgKi8KKwl3cml0ZWwoVlJDUl9JUEVOIHwgVlJDUl9WVERFTiwgbnMtPmJhc2UgKyBWUkNSKTsKKworCS8qIEVuYWJsZSBwZXItcGFja2V0IFRDUC9VRFAvSVAgY2hlY2tzdW1taW5nICovCisJd3JpdGVsKFZUQ1JfUFBDSEssIG5zLT5iYXNlICsgVlRDUik7CisKKwkvKiBSYW1pdCA6IEVuYWJsZSBhc3luYyBhbmQgc3luYyBwYXVzZSBmcmFtZXMgKi8KKy8vICAgICAgd3JpdGVsKDAsIG5zLT5iYXNlICsgUENSKTsgCisJd3JpdGVsKChQQ1JfUFNfTUNBU1QgfCBQQ1JfUFNfREEgfCBQQ1JfUFNFTiB8IFBDUl9GRkxPXzRLIHwKKwkJUENSX0ZGSElfOEsgfCBQQ1JfU1RMT180IHwgUENSX1NUSElfOCB8IFBDUl9QQVVTRV9DTlQpLAorCSAgICAgICBucy0+YmFzZSArIFBDUik7CisKKwkvKiBEaXNhYmxlIFdha2UgT24gTGFuICovCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgV0NTUik7CisKKwluczgzODIwX2dldG1hYyhuaWMsIG5pYy0+bm9kZV9hZGRyKTsKKwlwcmludGYoIiUhIGF0IGlvYWRkciAweCVoWCwgIiwgbmljLT5ub2RlX2FkZHIsIG5zLT5iYXNlKTsKKworCWlmICh1c2luZ19kYWMpIHsKKwkJZHByaW50ZigoIiVzOiB1c2luZyA2NCBiaXQgYWRkcmVzc2luZy5cbiIsIHBjaS0+bmFtZSkpOworCX0KKworCWRwcmludGYoKCIlczogRFA4MzgyMCAlZC4lZDogJSEgaW89MHglaFhcbiIsCisJCSBwY2ktPm5hbWUsCisJCSAodW5zaWduZWQpIHJlYWRsKG5zLT5iYXNlICsgU1JSKSA+PiA4LAorCQkgKHVuc2lnbmVkKSByZWFkbChucy0+YmFzZSArIFNSUikgJiAweGZmLAorCQkgbmljLT5ub2RlX2FkZHIsIHBjaS0+aW9hZGRyKSk7CisKKyNpZmRlZiBQSFlfQ09ERV9JU19GSU5JU0hFRAorCW5zODM4MjBfcHJvYmVfcGh5KGRldik7CisjZW5kaWYKKworCW5zODM4MjBfcmVzZXQobmljKTsKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwlkZXYtPmRpc2FibGUgID0gbnM4MzgyMF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBuczgzODIwX3BvbGw7CisJbmljLT50cmFuc21pdCA9IG5zODM4MjBfdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgICA9IG5zODM4MjBfaXJxOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBuczgzODIwX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTAwYiwgMHgwMDIyLCAibnM4MzgyMCIsICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIDgzODIwIiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBuczgzODIwX2RyaXZlciA9IHsKKwkudHlwZSA9IE5JQ19EUklWRVIsCisJLm5hbWUgPSAiTlM4MzgyMC9QQ0kiLAorCS5wcm9iZSA9IG5zODM4MjBfcHJvYmUsCisJLmlkcyA9IG5zODM4MjBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YobnM4MzgyMF9uaWNzKSAvIHNpemVvZihuczgzODIwX25pY3NbMF0pLAorCS5jbGFzcyA9IDAsCit9OwpJbmRleDogYi9uZXRib290L25zODM5MC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9uczgzOTAuYworKysgYi9uZXRib290L25zODM5MC5jCkBAIC0xMywxMSArMTMsMTUgQEAKICAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQogICByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCiAKK011bHRpY2FzdCBzdXBwb3J0IGFkZGVkIGJ5IFRpbW90aHkgTGVnZ2UgKHRpbWxlZ2dlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkgMDkvMjgvMjAwMworUmVsb2NhdGlvbiBzdXBwb3J0IGFkZGVkIGJ5IEtlbiBZYXAgKGtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0KSAyOC8xMi8wMgogM2M1MDMgc3VwcG9ydCBhZGRlZCBieSBCaWxsIFBhdWwgKHdwYXVsQGN0ci5jb2x1bWJpYS5lZHUpIG9uIDExLzE1Lzk0CiBTTUM4NDE2IHN1cHBvcnQgYWRkZWQgYnkgQmlsbCBQYXVsICh3cGF1bEBjdHIuY29sdW1iaWEuZWR1KSBvbiAxMi8yNS85NAogM2M1MDMgUElPIHN1cHBvcnQgYWRkZWQgYnkgSmltIEhhZ3VlIChqaW0uaGFndWVAYWNtLm9yZykgb24gMi8xNy85OAogUlggb3ZlcnJ1biBieSBLbGF1cyBFc3BlbmxhdWIgKGVzcGVubGF1YkBpbmZvcm1hdGlrLnVuaS11bG0uZGUpIG9uIDMvMTAvOTkKICAgcGFydHMgdGFrZW4gZnJvbSB0aGUgTGludXggODM5MCBkcml2ZXIgKGJ5IERvbmFsZCBCZWNrZXIgYW5kIFBhdWwgR29ydG1ha2VyKQorU01DODQxNiBQSU8gc3VwcG9ydCBhZGRlZCBieSBBbmRyZXcgQmV0dGlzb24gKGFuZHJld2JAemlwLmNvbS5hdSkgb24gNC8zLzAyCisgIGJhc2VkIG9uIHRoZSBMaW51eCA4MzkwIGRyaXZlciAoYnkgRG9uYWxkIEJlY2tlciBhbmQgUGF1bCBHb3J0bWFrZXIpCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNiwxMCArMzAsMTYgQEAKICNpbmNsdWRlICJuczgzOTAuaCIKICNpZmRlZglJTkNMVURFX05TODM5MAogI2luY2x1ZGUgInBjaS5oIgorI2Vsc2UKKyNpbmNsdWRlICJpc2EuaCIKICNlbmRpZgotI2luY2x1ZGUgImNhcmRzLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCWV0aF92ZW5kb3IsIGV0aF9mbGFncywgZXRoX2xhYXI7Cit0eXBlZGVmIGludCBBZGRyZXNzOworCitzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfdmVuZG9yLCBldGhfZmxhZ3M7CisjaWZkZWYJSU5DTFVERV9XRAorc3RhdGljIHVuc2lnbmVkIGNoYXIJZXRoX2xhYXI7CisjZW5kaWYKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2UsIGV0aF9hc2ljX2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfbWVtc2l6ZSwgZXRoX3J4X3N0YXJ0LCBldGhfdHhfc3RhcnQ7CiBzdGF0aWMgQWRkcmVzcwkJZXRoX2JtZW0sIGV0aF9ybWVtOwpAQCAtNjYsNiArNzYsNyBAQAogI2VuZGlmCiAKICNpZglkZWZpbmVkKElOQ0xVREVfV0QpCisjZGVmaW5lCUFTSUNfUElPCVdEX0lBUgogI2RlZmluZQlldGhfcHJvYmUJd2RfcHJvYmUKICNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IGRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKIEVycm9yIHlvdSBtdXN0IG9ubHkgZGVmaW5lIG9uZSBvZiBJTkNMVURFX1dELCBJTkNMVURFXzNDNTAzLCBJTkNMVURFX05FLCBJTkNMVURFX05TODM5MApAQCAtMTAxLDEzICsxMTIsMTYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZglkZWZpbmVkKElOQ0xVREVfTkUpIHx8IGRlZmluZWQoSU5DTFVERV9OUzgzOTApIHx8IChkZWZpbmVkKElOQ0xVREVfM0M1MDMpICYmICFkZWZpbmVkKFQ1MDNfU0hNRU0pKQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgKGRlZmluZWQoSU5DTFVERV8zQzUwMykgJiYgIWRlZmluZWQoVDUwM19TSE1FTSkpIHx8IChkZWZpbmVkKElOQ0xVREVfV0QpICYmIGRlZmluZWQoV0RfNzkwX1BJTykpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEVUSF9QSU9fUkVBRCAtIFJlYWQgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGNudCkKIHsKLQlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeyArK2NudDsgY250ICY9IH4xOyB9CisjaWZkZWYJSU5DTFVERV9XRAorCW91dGIoc3JjICYgMHhmZiwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisJb3V0YihzcmMgPj4gOCwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisjZWxzZQogCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfAogCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CiAJb3V0YihjbnQsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JCQ1IwKTsKQEAgLTEyMiw5ICsxMzYsMTAgQEAKIAlvdXRiKHNyYyA+PiA4LCBldGhfYXNpY19iYXNlICsgXzNDT01fREFNU0IpOwogCW91dGIodDUwM19vdXRwdXQgfCBfM0NPTV9DUl9TVEFSVCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKICNlbmRpZgorI2VuZGlmCiAKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkKLQkJY250ID4+PSAxOworCQljbnQgPSAoY250ICsgMSkgPj4gMTsKIAogCXdoaWxlKGNudC0tKSB7CiAjaWZkZWYJSU5DTFVERV8zQzUwMwpAQCAtMTUzLDcgKzE2OCwxMCBAQAogI2lmZGVmCUNPTVBFWF9STDIwMDBfRklYCiAJdW5zaWduZWQgaW50IHg7CiAjZW5kaWYJLyogQ09NUEVYX1JMMjAwMF9GSVggKi8KLQlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeyArK2NudDsgY250ICY9IH4xOyB9CisjaWZkZWYJSU5DTFVERV9XRAorCW91dGIoZHN0ICYgMHhmZiwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisJb3V0Yihkc3QgPj4gOCwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisjZWxzZQogCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfAogCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CiAJb3V0YihEODM5MF9JU1JfUkRDLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpOwpAQCAtMTcwLDkgKzE4OCwxMCBAQAogCiAJb3V0Yih0NTAzX291dHB1dCB8IF8zQ09NX0NSX0RESVIgfCBfM0NPTV9DUl9TVEFSVCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKICNlbmRpZgorI2VuZGlmCiAKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkKLQkJY250ID4+PSAxOworCQljbnQgPSAoY250ICsgMSkgPj4gMTsKIAogCXdoaWxlKGNudC0tKQogCXsKQEAgLTIwMSwxNyArMjIwLDQwIEBACiAJaWYgKHggPj0gQ09NUEVYX1JMMjAwMF9UUklFUykKIAkJcHJpbnRmKCJXYXJuaW5nOiBDb21wZXggUkwyMDAwIGFib3J0ZWQgd2FpdCFcbiIpOwogI2VuZGlmCS8qIENPTVBFWF9STDIwMDBfRklYICovCisjaWZuZGVmCUlOQ0xVREVfV0QKIAl3aGlsZSgoaW5iKGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0lTUikgJiBEODM5MF9JU1JfUkRDKQogCQkhPSBEODM5MF9JU1JfUkRDKTsKICNlbmRpZgorI2VuZGlmCiB9CiAjZWxzZQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUElPX1JFQUQgLSBEdW1teSByb3V0aW5lIHdoZW4gTkUyMDAwIG5vdCBjb21waWxlZCBpbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBldGhfcGlvX3JlYWQodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBpbnQgY250KSB7fQorc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMgX191bnVzZWQsIHVuc2lnbmVkIGNoYXIgKmRzdCAgX191bnVzZWQsIHVuc2lnbmVkIGludCBjbnQgX191bnVzZWQpIHt9CiAjZW5kaWYKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2VuYWJsZV9tdWx0eWNhc3QgLSBFbmFibGUgTXVsdGljYXN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9tdWx0aWNhc3QodW5zaWduZWQgc2hvcnQgZXRoX25pY19iYXNlKSAKK3sKKwl1bnNpZ25lZCBjaGFyIG1jZmlsdGVyWzhdOworCWludCBpOworCW1lbXNldChtY2ZpbHRlciwgMHhGRiwgOCk7CisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJCisJb3V0YihEODM5MF9DT01NQU5EX1JEMiArIEQ4MzkwX0NPTU1BTkRfUFMxLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlmb3IoaT0wO2k8ODtpKyspCisJeworCQlvdXRiKG1jZmlsdGVyW2ldLCBldGhfbmljX2Jhc2UgKyA4ICsgaSk7CisJCWlmKGluYihldGhfbmljX2Jhc2UgKyA4ICsgaSkhPW1jZmlsdGVyW2ldKQorCQkJcHJpbnRmKCJFcnJvciBTTUMgODNDNjkwIE11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNoYXAgJWRcbiIsaSk7CisJfQorCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgKyBEODM5MF9DT01NQU5EX1BTMCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0Yig0IHwgMHgwOCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogTlM4MzkwX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzgsNyArMjgwLDE0IEBACiAJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UUFNSKTsKIAlvdXRiKGV0aF9yeF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1BTVEFSVCk7CiAjaWZkZWYJSU5DTFVERV9XRAotCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgb3V0YigwLCBldGhfbmljX2Jhc2UgKyAweDA5KTsKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApIHsKKyNpZmRlZglXRF83OTBfUElPCisJCW91dGIoMHgxMCwgZXRoX2FzaWNfYmFzZSArIDB4MDYpOyAvKiBkaXNhYmxlIGludGVycnVwdHMsIGVuYWJsZSBQSU8gKi8KKwkJb3V0YigweDAxLCBldGhfbmljX2Jhc2UgKyAweDA5KTsgLyogZW5hYmxlIHJpbmcgcmVhZCBhdXRvLXdyYXAgKi8KKyNlbHNlCisJCW91dGIoMCwgZXRoX25pY19iYXNlICsgMHgwOSk7CisjZW5kaWYKKwl9CiAjZW5kaWYKIAlvdXRiKGV0aF9tZW1zaXplLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUFNUT1ApOwogCW91dGIoZXRoX21lbXNpemUgLSAxLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpOwpAQCAtMjY2LDggKzMxNSwxMCBAQAogCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwKIAkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKIAlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOwotCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7Ci0Jb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogYWxsb3cgYnJvYWRjYXN0IGZyYW1lcyAqLworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CS8qIHRyYW5zbWl0dGVyIG9uICovCisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogYWxsb3cgcnggYnJvYWRjYXN0IGZyYW1lcyAqLworCisJZW5hYmxlX211bHRpY2FzdChldGhfbmljX2Jhc2UpOwogCiAjaWZkZWYJSU5DTFVERV8zQzUwMwogICAgICAgICAvKgpAQCAtMjgxLDcgKzMzMiw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSk7CiAKICNpZm5kZWYJSU5DTFVERV8zQzUwMwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjQsNyArMzc1LDcgQEAKIAogCS8qIGNsZWFyIHRoZSBSWCByaW5nLCBhY2tub3dsZWRnZSBvdmVycnVuIGludGVycnVwdCAqLwogCWV0aF9kcmFpbl9yZWNlaXZlciA9IDE7Ci0Jd2hpbGUgKG5zODM5MF9wb2xsKG5pYykpCisJd2hpbGUgKG5zODM5MF9wb2xsKG5pYywgMSkpCiAJCS8qIE5vdGhpbmcgKi87CiAJZXRoX2RyYWluX3JlY2VpdmVyID0gMDsKIAlvdXRiKEQ4MzkwX0lTUl9PVlcsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOwpAQCAtMzQ0LDUwICszOTUsNTQgQEAKIAl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCiAJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KIHsKKyNpZiBkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IChkZWZpbmVkKElOQ0xVREVfV0QpICYmICEgZGVmaW5lZChXRF83OTBfUElPKSkKKwlBZGRyZXNzCQlldGhfdm1lbSA9IGJ1c190b192aXJ0KGV0aF9ibWVtKTsKKyNlbmRpZgogI2lmZGVmCUlOQ0xVREVfM0M1MDMKICAgICAgICAgaWYgKCEoZXRoX2ZsYWdzICYgRkxBR19QSU8pKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX2JtZW0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotICAgICAgICAgICAgICAgICooKGNoYXIgKilldGhfYm1lbSsxMikgPSB0Pj44OwkJLyogdHlwZSAqLwotICAgICAgICAgICAgICAgICooKGNoYXIgKilldGhfYm1lbSsxMykgPSB0OwotICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKWV0aF9ibWVtK0VUSF9ITEVOLCBwLCBzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOwogICAgICAgICAgICAgICAgIHMgKz0gRVRIX0hMRU47Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF9ibWVtKyhzKyspKSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CiAgICAgICAgIH0KICNlbmRpZgogCiAjaWZkZWYJSU5DTFVERV9XRAotCS8qIE1lbW9yeSBpbnRlcmZhY2UgKi8KIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgewogCQlvdXRiKGV0aF9sYWFyIHwgV0RfTEFBUl9NMTZFTiwgZXRoX2FzaWNfYmFzZSArIFdEX0xBQVIpOwogCQlpbmIoMHg4NCk7CiAJfQorI2lmbmRlZglXRF83OTBfUElPCisJLyogTWVtb3J5IGludGVyZmFjZSAqLwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKIAkJaW5iKDB4ODQpOwogCX0KIAlpbmIoMHg4NCk7Ci0JbWVtY3B5KChjaGFyICopZXRoX2JtZW0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCi0JbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotCSooKGNoYXIgKilldGhfYm1lbSsxMikgPSB0Pj44OwkJLyogdHlwZSAqLwotCSooKGNoYXIgKilldGhfYm1lbSsxMykgPSB0OwotCW1lbWNweSgoY2hhciAqKWV0aF9ibWVtK0VUSF9ITEVOLCBwLCBzKTsKKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisJKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisJKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisJbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOwogCXMgKz0gRVRIX0hMRU47Ci0Jd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF9ibWVtKyhzKyspKSA9IDA7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CiAJCW91dGIoMCwgZXRoX2FzaWNfYmFzZSArIFdEX01TUik7CiAJCWluYigweDg0KTsKIAl9Ci0JaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKLQkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7Ci0JCWluYigweDg0KTsKLQl9CisjZWxzZQorCWluYigweDg0KTsKKyNlbmRpZgogI2VuZGlmCiAKICNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCi0JaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKSB7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQogI2VuZGlmCi0jaWYJZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCAoZGVmaW5lZChJTkNMVURFXzNDNTAzKSAmJiAhZGVmaW5lZChUNTAzX1NITUVNKSkKKyNpZglkZWZpbmVkKElOQ0xVREVfTkUpIHx8IGRlZmluZWQoSU5DTFVERV9OUzgzOTApIHx8IChkZWZpbmVkKElOQ0xVREVfM0M1MDMpICYmICFkZWZpbmVkKFQ1MDNfU0hNRU0pKSB8fCAoZGVmaW5lZChJTkNMVURFX1dEKSAmJiBkZWZpbmVkKFdEXzc5MF9QSU8pKQorCXsKIAkJLyogUHJvZ3JhbW1lZCBJL08gKi8KIAkJdW5zaWduZWQgc2hvcnQgdHlwZTsKIAkJdHlwZSA9ICh0ID4+IDgpIHwgKHQgPDwgOCk7CkBAIC0zOTgsMTIgKzQ1MywxNiBAQAogCQlldGhfcGlvX3dyaXRlKHAsIChldGhfdHhfc3RhcnQ8PDgpK0VUSF9ITEVOLCBzKTsKIAkJcyArPSBFVEhfSExFTjsKIAkJaWYgKHMgPCBFVEhfWkxFTikgcyA9IEVUSF9aTEVOOworCX0KICNlbmRpZgogI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwMykKLQl9CiAjZW5kaWYKIAogI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeworCQlvdXRiKGV0aF9sYWFyICYgfldEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJaW5iKDB4ODQpOworCX0KIAlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCiAJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAogCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKQEAgLTQyOCw3ICs0ODcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBOUzgzOTBfUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IG5zODM5MF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGNoYXIgcnN0YXQsIGN1cnIsIG5leHQ7CkBAIC00NTMsMjIgKzUxMiwyNyBAQAogCW91dGIoRDgzOTBfQ09NTUFORF9QUzAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKIAlpZiAoY3VyciA+PSBldGhfbWVtc2l6ZSkgY3Vycj1ldGhfcnhfc3RhcnQ7CiAJaWYgKGN1cnIgPT0gbmV4dCkgcmV0dXJuKDApOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICNpZmRlZglJTkNMVURFX1dECiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKIAkJb3V0YihldGhfbGFhciB8IFdEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKIAkJaW5iKDB4ODQpOwogCX0KKyNpZm5kZWYJV0RfNzkwX1BJTwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKIAkJaW5iKDB4ODQpOwogCX0KKyNlbmRpZgogCWluYigweDg0KTsKICNlbmRpZgogCXBrdG9mZiA9IG5leHQgPDwgODsKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCWV0aF9waW9fcmVhZChwa3RvZmYsIChjaGFyICopJnBrdGhkciwgNCk7CiAJZWxzZQotCQltZW1jcHkoJnBrdGhkciwgKGNoYXIgKilldGhfcm1lbSArIHBrdG9mZiwgNCk7CisJCW1lbWNweSgmcGt0aGRyLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIDQpOwogCXBrdG9mZiArPSBzaXplb2YocGt0aGRyKTsKIAkvKiBpbmNvbWluZyBsZW5ndGggaW5jbHVkZXMgRkNTIHNvIG11c3Qgc3ViIDQgKi8KIAlsZW4gPSBwa3RoZHIubGVuIC0gNDsKQEAgLTQ4Niw3ICs1NTAsNyBAQAogCQkJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQogCQkJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGZyYWcpOwogCQkJZWxzZQotCQkJCW1lbWNweShwLCAoY2hhciAqKWV0aF9ybWVtICsgcGt0b2ZmLCBmcmFnKTsKKwkJCQltZW1jcHkocCwgYnVzX3RvX3ZpcnQoZXRoX3JtZW0gKyBwa3RvZmYpLCBmcmFnKTsKIAkJCXBrdG9mZiA9IGV0aF9yeF9zdGFydCA8PCA4OwogCQkJcCArPSBmcmFnOwogCQkJbGVuIC09IGZyYWc7CkBAIC00OTUsMTQgKzU1OSwxNiBAQAogCQlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCQlldGhfcGlvX3JlYWQocGt0b2ZmLCBwLCBsZW4pOwogCQllbHNlCi0JCQltZW1jcHkocCwgKGNoYXIgKilldGhfcm1lbSArIHBrdG9mZiwgbGVuKTsKKwkJCW1lbWNweShwLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIGxlbik7CiAJCXJldCA9IDE7CiAJfQogI2lmZGVmCUlOQ0xVREVfV0QKKyNpZm5kZWYJV0RfNzkwX1BJTwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpOwogCQlpbmIoMHg4NCk7CiAJfQorI2VuZGlmCiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKIAkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CiAJCWluYigweDg0KTsKQEAgLTUxOSwzMSArNTg1LDU2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIE5TODM5MF9ESVNBQkxFIC0gVHVybiBvZmYgYWRhcHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBuczgzOTBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBuczgzOTBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpCiB7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJLyogcmVzZXQgYW5kIGRpc2FibGUgbWVyZ2UgKi8KKwluczgzOTBfcmVzZXQobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitOUzgzOTBfSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5zODM5MF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZglJTkNMVURFX05TODM5MAotc3RydWN0IG5pYyAqZXRoX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLAotCQkgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorc3RhdGljIGludCBldGhfcHJvYmUgKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKICNlbHNlCi1zdHJ1Y3QgbmljICpldGhfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCitzdGF0aWMgaW50IGV0aF9wcm9iZSAoc3RydWN0IGRldiAqZGV2LCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMgX191bnVzZWQpCiAjZW5kaWYKIHsKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKIAlpbnQgaTsKLQlzdHJ1Y3Qgd2RfYm9hcmQgKmJyZDsKLQl1bnNpZ25lZCBzaG9ydCBjaGtzdW07Ci0JdW5zaWduZWQgY2hhciBjOworI2lmZGVmIElOQ0xVREVfTlM4MzkwCisJdW5zaWduZWQgc2hvcnQgcGNpX3Byb2JlX2FkZHJzW10gPSB7IHBjaS0+aW9hZGRyLCAwIH07CisJdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzID0gcGNpX3Byb2JlX2FkZHJzOworI2VuZGlmCiAJZXRoX3ZlbmRvciA9IFZFTkRPUl9OT05FOwogCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CiAKKwluaWMtPmlycW5vICA9IDA7CisKICNpZmRlZglJTkNMVURFX1dECit7CiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCVNlYXJjaCBmb3IgV0QvU01DIGNhcmRzCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXN0cnVjdCB3ZF9ib2FyZCAqYnJkOworCXVuc2lnbmVkIHNob3J0IGNoa3N1bTsKKwl1bnNpZ25lZCBjaGFyIGM7CiAJZm9yIChldGhfYXNpY19iYXNlID0gV0RfTE9XX0JBU0U7IGV0aF9hc2ljX2Jhc2UgPD0gV0RfSElHSF9CQVNFOwogCQlldGhfYXNpY19iYXNlICs9IDB4MjApIHsKIAkJY2hrc3VtID0gMDsKQEAgLTU2MCw2ICs2NTEsOSBAQAogCS8qIFdlJ3ZlIGZvdW5kIGEgYm9hcmQgKi8KIAlldGhfdmVuZG9yID0gVkVORE9SX1dEOwogCWV0aF9uaWNfYmFzZSA9IGV0aF9hc2ljX2Jhc2UgKyBXRF9OSUNfQUREUjsKKworCW5pYy0+aW9hZGRyID0gZXRoX25pY19iYXNlOworCiAJYyA9IGluYihldGhfYXNpY19iYXNlK1dEX0JJRCk7CS8qIEdldCBib2FyZCBpZCAqLwogCWZvciAoYnJkID0gd2RfYm9hcmRzOyBicmQtPm5hbWU7IGJyZCsrKQogCQlpZiAoYnJkLT5pZCA9PSBjKSBicmVhazsKQEAgLTU4Miw4ICs2NzYsOSBAQAogCX0gZWxzZQogCQlldGhfYm1lbSA9IFdEX0RFRkFVTFRfTUVNOwogCWlmIChicmQtPmlkID09IFRZUEVfU01DODIxNlQgfHwgYnJkLT5pZCA9PSBUWVBFX1NNQzgyMTZDKSB7Ci0JCSooKHVuc2lnbmVkIGludCAqKShldGhfYm1lbSArIDgxOTIpKSA9ICh1bnNpZ25lZCBpbnQpMDsKLQkJaWYgKCooKHVuc2lnbmVkIGludCAqKShldGhfYm1lbSArIDgxOTIpKSkgeworCQkvKiBmcm9tIExpbnV4IGRyaXZlciwgODQxNkJUIGRldGVjdHMgYXMgODIxNiBzb21ldGltZXMgKi8KKwkJdW5zaWduZWQgaW50IGFkZHIgPSBpbmIoZXRoX2FzaWNfYmFzZSArIDB4Yik7CisJCWlmICgoKGFkZHIgPj4gNCkgJiAzKSA9PSAwKSB7CiAJCQlicmQgKz0gMjsKIAkJCWV0aF9tZW1zaXplID0gYnJkLT5tZW1zaXplOwogCQl9CkBAIC01OTIsMTkgKzY4NywyNyBAQAogCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKIAkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaStldGhfYXNpY19iYXNlK1dEX0xBUik7CiAJfQotCXByaW50ZigiXG4lcyBiYXNlICUjaHgsIG1lbW9yeSAlI2h4LCBhZGRyICUhXG4iLAotCQlicmQtPm5hbWUsIGV0aF9hc2ljX2Jhc2UsIGV0aF9ibWVtLCBuaWMtPm5vZGVfYWRkcik7CisJcHJpbnRmKCJcbiVzIGJhc2UgJSNoeCIsIGJyZC0+bmFtZSwgZXRoX2FzaWNfYmFzZSk7CiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisjaWZkZWYJV0RfNzkwX1BJTworCQlwcmludGYoIiwgUElPIG1vZGUsIGFkZHIgJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKKwkJZXRoX2JtZW0gPSAwOworCQlldGhfZmxhZ3MgfD0gRkxBR19QSU87CQkvKiBmb3JjZSBQSU8gbW9kZSAqLworCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKyNlbHNlCisJCXByaW50ZigiLCBtZW1vcnkgJSN4LCBhZGRyICUhXG4iLCBldGhfYm1lbSwgbmljLT5ub2RlX2FkZHIpOwogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlK1dEX01TUik7CiAJCW91dGIoKGluYihldGhfYXNpY19iYXNlKzB4MDQpIHwKIAkJCTB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOwotCQlvdXRiKCgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDEzKSAmIDB4MEYpIHwKLQkJCSgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDExKSAmIDB4NDApIHwKKwkJb3V0YigoKHVuc2lnbmVkKShldGhfYm1lbSA+PiAxMykgJiAweDBGKSB8CisJCQkoKHVuc2lnbmVkKShldGhfYm1lbSA+PiAxMSkgJiAweDQwKSB8CiAJCQkoaW5iKGV0aF9hc2ljX2Jhc2UrMHgwQikgJiAweEIwKSwgZXRoX2FzaWNfYmFzZSsweDBCKTsKIAkJb3V0YigoaW5iKGV0aF9hc2ljX2Jhc2UrMHgwNCkgJgogCQkJfjB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOworI2VuZGlmCiAJfSBlbHNlIHsKLQkJb3V0YigoKCh1bnNpZ25lZClldGhfYm1lbSA+PiAxMykgJiAweDNGKSB8IDB4NDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKwkJcHJpbnRmKCIsIG1lbW9yeSAlI3gsIGFkZHIgJSFcbiIsIGV0aF9ibWVtLCBuaWMtPm5vZGVfYWRkcik7CisJCW91dGIoKCh1bnNpZ25lZCkoZXRoX2JtZW0gPj4gMTMpICYgMHgzRikgfCAweDQwLCBldGhfYXNpY19iYXNlK1dEX01TUik7CiAJfQogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CiAJCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewpAQCAtNjI0LDggKzcyNywxNCBAQAogCQl9CiAJCWluYigweDg0KTsKIAl9Cit9CiAjZW5kaWYKICNpZmRlZglJTkNMVURFXzNDNTAzCisjaWZkZWYJVDUwM19BVUkKKwluaWMtPmZsYWdzID0gMTsJCS8qIGF1aSAqLworI2Vsc2UKKwluaWMtPmZsYWdzID0gMDsJCS8qIG5vIGF1aSAqLworI2VuZGlmCiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgU2VhcmNoIGZvciAzQ29tIDNjNTAzIGlmIG5vIFdEL1NNQyBjYXJkcwogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03MDgsMTEgKzgxNywxMiBAQAogICAgICAgICAvKiBHZXQgb3VyIGV0aGVybmV0IGFkZHJlc3MgKi8KIAogICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfRUFMTyB8IF8zQ09NX0NSX1hTRUwsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisJCW5pYy0+aW9hZGRyID0gZXRoX25pY19iYXNlOwogICAgICAgICAgICAgICAgIHByaW50ZigiXG4zQ29tIDNjNTAzIGJhc2UgJSNoeCwgIiwgZXRoX25pY19iYXNlKTsKICAgICAgICAgICAgICAgICBpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCQlwcmludGYoIlBJTyBtb2RlIik7CiAgICAgICAgICAgICAgICAgZWxzZQotCQkJcHJpbnRmKCJtZW1vcnkgJSNoeCIsIGV0aF9ibWVtKTsKKwkJCXByaW50ZigibWVtb3J5ICUjeCIsIGV0aF9ibWVtKTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGluYihldGhfbmljX2Jhc2UraSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzM0LDkgKzg0NCw5IEBACiAgICAgICAgICAqLwogCiAJCWlmICghKGV0aF9mbGFncyAmIEZMQUdfUElPKSkgewotCQkJbWVtc2V0KChjaGFyICopZXRoX2JtZW0sIDAsIDB4MjAwMCk7CisJCQltZW1zZXQoYnVzX3RvX3ZpcnQoZXRoX2JtZW0pLCAwLCAweDIwMDApOwogCQkJZm9yKGkgPSAwOyBpIDwgMHgyMDAwOyArK2kpCi0JCQkJaWYgKCooKChjaGFyICopZXRoX2JtZW0pK2kpKSB7CisJCQkJaWYgKCooKGNoYXIgKikoYnVzX3RvX3ZpcnQoZXRoX2JtZW0raSkpKSkgewogCQkJCQlwcmludGYgKCJGYWlsZWQgdG8gY2xlYXIgM2M1MDMgc2hhcmVkIG1lbS5cbiIpOwogCQkJCQlyZXR1cm4gKDApOwogCQkJCX0KQEAgLTc0OSw5ICs4NTksMTEgQEAKICAgICAgICAgfQogI2VuZGlmCiAjaWYJZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKQorewogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlTZWFyY2ggZm9yIE5FMTAwMC8yMDAwIGlmIG5vIFdEL1NNQyBvciAzY29tIGNhcmRzCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXVuc2lnbmVkIGNoYXIgYzsKIAlpZiAoZXRoX3ZlbmRvciA9PSBWRU5ET1JfTk9ORSkgewogCQljaGFyIHJvbWRhdGFbMTZdLCB0ZXN0YnVmWzMyXTsKIAkJaW50IGlkeDsKQEAgLTgxMCwyMyArOTIyLDk0IEBACiAJCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKIAkJCW5pYy0+bm9kZV9hZGRyW2ldID0gcm9tZGF0YVtpICsgKChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/IGkgOiAwKV07CiAJCX0KKwkJbmljLT5pb2FkZHIgPSBldGhfbmljX2Jhc2U7CiAJCXByaW50ZigiXG5ORSVjMDAwIGJhc2UgJSNoeCwgYWRkciAlIVxuIiwKIAkJCShldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/ICcyJyA6ICcxJywgZXRoX25pY19iYXNlLAogCQkJbmljLT5ub2RlX2FkZHIpOwogCX0KK30KICNlbmRpZgogCWlmIChldGhfdmVuZG9yID09IFZFTkRPUl9OT05FKQogCQlyZXR1cm4oMCk7CiAgICAgICAgIGlmIChldGhfdmVuZG9yICE9IFZFTkRPUl8zQ09NKQogCQlldGhfcm1lbSA9IGV0aF9ibWVtOwogCW5zODM5MF9yZXNldChuaWMpOwotCW5pYy0+cmVzZXQgPSBuczgzOTBfcmVzZXQ7Ci0JbmljLT5wb2xsID0gbnM4MzkwX3BvbGw7CisKKwlkZXYtPmRpc2FibGUgID0gbnM4MzkwX2Rpc2FibGU7IAorCW5pYy0+cG9sbCAgICAgPSBuczgzOTBfcG9sbDsKIAluaWMtPnRyYW5zbWl0ID0gbnM4MzkwX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IG5zODM5MF9kaXNhYmxlOwotCXJldHVybihuaWMpOworCW5pYy0+aXJxICAgICAgPSBuczgzOTBfaXJxOworCisgICAgICAgIC8qIEJhc2VkIG9uIFBuUCBJU0EgbWFwICovCisjaWZkZWYJSU5DTFVERV9XRAorICAgICAgICBkZXYtPmRldmlkLnZlbmRvcl9pZCA9IGh0b25zKEdFTkVSSUNfSVNBUE5QX1ZFTkRPUik7CisgICAgICAgIGRldi0+ZGV2aWQuZGV2aWNlX2lkID0gaHRvbnMoMHg4MTJhKTsKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M1MDMKKyAgICAgICAgZGV2LT5kZXZpZC52ZW5kb3JfaWQgPSBodG9ucyhHRU5FUklDX0lTQVBOUF9WRU5ET1IpOworICAgICAgICBkZXYtPmRldmlkLmRldmljZV9pZCA9IGh0b25zKDB4ODBmMyk7CisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05FCisgICAgICAgIGRldi0+ZGV2aWQudmVuZG9yX2lkID0gaHRvbnMoR0VORVJJQ19JU0FQTlBfVkVORE9SKTsKKyAgICAgICAgZGV2LT5kZXZpZC5kZXZpY2VfaWQgPSBodG9ucygweDgwZDYpOworI2VuZGlmCisJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZglJTkNMVURFX1dECitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgd2RfZHJpdmVyIF9faXNhX2RyaXZlciA9IHsKKwkudHlwZSAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgPSAiV0QiLAorCS5wcm9iZSAgID0gd2RfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfM0M1MDMKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciB0NTAzX2RyaXZlciBfX2lzYV9kcml2ZXIgPSB7CisJLnR5cGUgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgID0gIjNDNTAzIiwKKwkucHJvYmUgICA9IHQ1MDNfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTkUKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBuZV9kcml2ZXIgX19pc2FfZHJpdmVyID0geworCS50eXBlICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICA9ICJORSowMDAiLAorCS5wcm9iZSAgID0gbmVfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTlM4MzkwCitzdGF0aWMgc3RydWN0IHBjaV9pZCBuZXBjaV9uaWNzW10gPSB7CisvKiBBIGZldyBORTIwMDAgUENJIGNsb25lcywgbGlzdCBub3QgZXhoYXVzdGl2ZSAqLworUENJX1JPTSgweDEwZWMsIDB4ODAyOSwgInJ0bDgwMjkiLCAgICAgICJSZWFsdGVrIDgwMjkiKSwKK1BDSV9ST00oMHgxMTg2LCAweDAzMDAsICJkbGluay01MjgiLCAgICAiRC1MaW5rIERFLTUyOCIpLAorUENJX1JPTSgweDEwNTAsIDB4MDk0MCwgIndpbmJvbmQ5NDAiLCAgICJXaW5ib25kIE5FMjAwMC1QQ0kiKSwJCS8qIFdpbmJvbmQgODZDOTQwIC8gODlDOTQwICovCitQQ0lfUk9NKDB4MTA1MCwgMHg1YTVhLCAid2luYm9uZDk0MGYiLCAgIldpbmJvbmQgVzg5Yzk0MEYiKSwJCS8qIFdpbmJvbmQgODlDOTQwRiAqLworUENJX1JPTSgweDExZjYsIDB4MTQwMSwgImNvbXBleHJsMjAwMCIsICJDb21wZXggUmVhZHlMaW5rIDIwMDAiKSwKK1BDSV9ST00oMHg4ZTJlLCAweDMwMDAsICJrdGlldDMycDIiLCAgICAiS1RJIEVUMzJQMiIpLAorUENJX1JPTSgweDRhMTQsIDB4NTAwMCwgIm52NTAwMHNjIiwgICAgICJOZXRWaW4gTlY1MDAwU0MiKSwKK1BDSV9ST00oMHgxMmMzLCAweDAwNTgsICJob2x0ZWs4MDIzMiIsICAiSG9sdGVrIEhUODAyMzIiKSwKK1BDSV9ST00oMHgxMmMzLCAweDU1OTgsICJob2x0ZWs4MDIyOSIsICAiSG9sdGVrIEhUODAyMjkiKSwKK1BDSV9ST00oMHgxMGJkLCAweDBlMzQsICJzdXJlY29tLW5lMzQiLCAiU3VyZWNvbSBORTM0IiksCitQQ0lfUk9NKDB4MTEwNiwgMHgwOTI2LCAidmlhODZjOTI2IiwgICAgIlZpYSA4NmM5MjYiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG5lcGNpX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJORTIwMDAvUENJIiwKKwkucHJvYmUgICAgPSBuZXBjaV9wcm9iZSwKKwkuaWRzICAgICAgPSBuZXBjaV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihuZXBjaV9uaWNzKS9zaXplb2YobmVwY2lfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CisKKyNlbmRpZiAvKiBJTkNMVURFX05TODM5MCAqLworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogIGMtYmFzaWMtb2Zmc2V0OiA4CkluZGV4OiBiL25ldGJvb3Qvb3NkZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3Qvb3NkZXAuaAorKysgYi9uZXRib290L29zZGVwLmgKQEAgLTEsOTQgKzEsMTggQEAKLSNpZm5kZWYJX19PU0RFUF9IX18KLSNkZWZpbmUgX19PU0RFUF9IX18KKyNpZm5kZWYJX09TREVQX0gKKyNkZWZpbmUgX09TREVQX0gKIAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KKyNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNkZWZpbmUgX19hbGlnbmVkIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkKIAotI2RlZmluZQlfX0xJVFRMRV9FTkRJQU4JCS8qIHg4NiAqLwotCi0vKiBUYWtlbiBmcm9tIC91c3IvaW5jbHVkZS9saW51eC9oZnNfc3lzZGVwLmggKi8KLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLSMJaWYgIWRlZmluZWQoX19jb25zdGFudF9odG9ubCkKLSMJCWRlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICh4KQotIwllbmRpZgotIwlpZiAhZGVmaW5lZChfX2NvbnN0YW50X2h0b25zKQotIwkJZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgKHgpCi0jCWVuZGlmCi0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLSMJaWYgIWRlZmluZWQoX19jb25zdGFudF9odG9ubCkKLSMJCWRlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpIFwKLSAgICAgICAgKCh1bnNpZ25lZCBsb25nIGludCkoKCgodW5zaWduZWQgbG9uZyBpbnQpKHgpICYgMHgwMDAwMDBmZlUpIDw8IDI0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBpbnQpKHgpICYgMHgwMDAwZmYwMFUpIDw8ICA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBpbnQpKHgpICYgMHgwMGZmMDAwMFUpID4+ICA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBpbnQpKHgpICYgMHhmZjAwMDAwMFUpID4+IDI0KSkpCi0jCWVuZGlmCi0jCWlmICFkZWZpbmVkKF9fY29uc3RhbnRfaHRvbnMpCi0jCQlkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSBcCi0gICAgICAgICgodW5zaWduZWQgc2hvcnQgaW50KSgoKCh1bnNpZ25lZCBzaG9ydCBpbnQpKHgpICYgMHgwMGZmKSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIHNob3J0IGludCkoeCkgJiAweGZmMDApID4+IDgpKSkKLSMJZW5kaWYKLSNlbHNlCi0jCWVycm9yICJEb24ndCBrbm93IGlmIGJ5dGVzIGFyZSBiaWctIG9yIGxpdHRsZS1lbmRpYW4hIgotI2VuZGlmCi0KLSNkZWZpbmUgbnRvaGwoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAotIF9fY29uc3RhbnRfaHRvbmwoKHgpKSA6IFwKLSBfX3N3YXAzMih4KSkKLSNkZWZpbmUgaHRvbmwoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAotIF9fY29uc3RhbnRfaHRvbmwoKHgpKSA6IFwKLSBfX3N3YXAzMih4KSkKLSNkZWZpbmUgbnRvaHMoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAotIF9fY29uc3RhbnRfaHRvbnMoKHgpKSA6IFwKLSBfX3N3YXAxNih4KSkKLSNkZWZpbmUgaHRvbnMoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAotIF9fY29uc3RhbnRfaHRvbnMoKHgpKSA6IFwKLSBfX3N3YXAxNih4KSkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGludCBfX3N3YXAzMih1bnNpZ25lZCBsb25nIGludCB4KQotewotCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgotCQkicm9ybCAkMTYsJTBcblx0IgotCQkieGNoZ2IgJWIwLCVoMCIKLQkJOiAiPXEiICh4KQotCQk6ICIwIiAoeCkpOwotCXJldHVybiB4OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBfX3N3YXAxNih1bnNpZ25lZCBzaG9ydCBpbnQgeCkKLXsKLQlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwIgotCQk6ICI9cSIgKHgpCi0JCTogIjAiICh4KSk7Ci0JcmV0dXJuIHg7Ci19Ci0KLS8qIE1ha2Ugcm91dGluZXMgYXZhaWxhYmxlIHRvIGFsbCAqLwotI2RlZmluZQlzd2FwMzIoeCkJX19zd2FwMzIoeCkKLSNkZWZpbmUJc3dhcDE2KHgpCV9fc3dhcDE2KHgpCi0KLSNpbmNsdWRlICJsaW51eC1hc20taW8uaCIKLQotdHlwZWRlZgl1bnNpZ25lZCBsb25nIEFkZHJlc3M7CisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJieXRlc3dhcC5oIgorI2luY2x1ZGUgImxhdGNoLmgiCiAKIC8qIEFOU0kgcHJvdG90eXBpbmcgbWFjcm8gKi8KICNpZmRlZglfX1NURENfXwotI2RlZmluZQlQKHgpCXgKKyMgIGRlZmluZQlQKHgpCXgKICNlbHNlCi0jZGVmaW5lCVAoeCkJKCkKKyMgIGRlZmluZQlQKHgpCSgpCiAjZW5kaWYKIAogI2VuZGlmCi0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpJbmRleDogYi9uZXRib290L290dWxpcC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9vdHVsaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICBFdGhlcmJvb3QgREVDIFR1bGlwIGRyaXZlcgotICBhZGFwdGVkIGJ5IEtlbiBZYXAgZnJvbQotCi0gIEZyZWVCU0QgbmV0Ym9vdCBERUMgMjExNDMgZHJpdmVyCi0KLSAgQXV0aG9yOiBEYXZpZCBTaGFycAotICAgIGRhdGU6IE5vdi85OAotCi0gS25vd24gdG8gd29yayBvbiBERUMgREU1MDAgdXNpbmcgMjExNDMtUEMgY2hpcHNldC4KLSBFdmVuIG9uIGNhcmRzIHdpdGggdGhlIHNhbWUgY2hpcHNldCB0aGVyZSBjYW4gYmUKLSBpbmNvbXBhdGFibGl0eSBwcm9ibGVtcyB3aXRoIHRoZSB3YXkgbWVkaWEgc2VsZWN0aW9uCi0gYW5kIHN0YXR1cyBMRUQgc2V0dGluZ3MgYXJlIGRvbmUuICBTZWUgY29tbWVudHMgYmVsb3cuCi0KLSBTb21lIGNvZGUgZnJhZ21lbnRzIHdlcmUgdGFrZW4gZnJvbSB2ZXJpb3VzIHBsYWNlcywKLSBLZW4gWWFwJ3MgZXRoZXJib290LCBGcmVlQlNEJ3MgaWZfZGUuYywgYW5kIHZhcmlvdXMKLSBMaW51eCByZWxhdGVkIGZpbGVzLiAgREVDJ3MgbWFudWFscyBmb3IgdGhlIDIxMTQzIGFuZAotIFNST00gZm9ybWF0IHdlcmUgdmVyeSBoZWxwZnVsLiAgVGhlIExpbnV4IGRlIGRyaXZlcgotIGRldmVsb3BtZW50IHBhZ2UgaGFzIGEgbnVtYmVyIG9mIGxpbmtzIHRvIHVzZWZ1bAotIHJlbGF0ZWQgaW5mb3JtYXRpb24uICBIYXZlIGEgbG9vayBhdDoKLSBmdHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9wdWIvbGludXgvZHJpdmVycy90dWxpcC1kZXZlbC5odG1sCi0KLSovCi0KLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKLSNpbmNsdWRlICJuaWMuaCIKLSNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgotI2luY2x1ZGUgIm90dWxpcC5oIgotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZfaWQ7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaW9hZGRyOwotc3RhdGljIHVuc2lnbmVkIGludCAqbWVtYmFzZTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNyb21bMTAyNF07Ci0KLSNkZWZpbmUgQlVGTEVOIDE1MzYgICAgIC8qIG11c3QgYmUgbG9uZ3dvcmQgZGl2aXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXJzIG11c3QgYmUgbG9uZ3dvcmQgYWxpZ25lZCAqLwotCi0vKiB0cmFuc21pdCBkZXNjcmlwdG9yIGFuZCBidWZmZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgdHhkZXNjIHR4ZDsKLQotLyogcmVjZWl2ZSBkZXNjcmlwdG9yKHMpIGFuZCBidWZmZXIocykgKi8KLSNkZWZpbmUgTlJYRCA0Ci1zdGF0aWMgc3RydWN0IHJ4ZGVzYyByeGRbTlJYRF07Ci1zdGF0aWMgaW50IHJ4ZF90YWlsID0gMDsKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSByeGIgKChjaGFyICopMHgxMDAwMCAtIE5SWEQgKiBCVUZMRU4pCi0jZGVmaW5lIHR4YiAoKGNoYXIgKikweDEwMDAwIC0gTlJYRCAqIEJVRkxFTiAtIEJVRkxFTikKLSNlbHNlCi1zdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlJYRCAqIEJVRkxFTl07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbQlVGTEVOXTsKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBlaGRyW0VUSF9ITEVOXTsgICAgLyogYnVmZmVyIGZvciBldGhlcm5ldCBoZWFkZXIgKi8KLQotZW51bSB0dWxpcF9vZmZzZXRzIHsKLSAgICAgICAgQ1NSMD0wLCAgICBDU1IxPTB4MDgsIENTUjI9MHgxMCwgQ1NSMz0weDE4LCBDU1I0PTB4MjAsIENTUjU9MHgyOCwKLSAgICAgICAgQ1NSNj0weDMwLCBDU1I3PTB4MzgsIENTUjg9MHg0MCwgQ1NSOT0weDQ4LCBDU1IxMD0weDUwLCBDU1IxMT0weDU4LAotICAgICAgICBDU1IxMj0weDYwLCBDU1IxMz0weDY4LCBDU1IxND0weDcwLCBDU1IxNT0weDc4IH07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIDIxMTQzIHNwZWNpZmljIHN0dWZmICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogWFhYIGFzc3VtZSAzM01IeiBQQ0kgYnVzLCAgdGhpcyBpcyBub3QgdmVyeSBhY2N1cmF0ZSBhbmQgc2hvdWxkIGJlCi0gICB1c2VkIG9ubHkgd2l0aCBncm9zcyBvdmVyIGVzdGltYXRpb25zIG9mIHJlcXVpcmVkIGRlbGF5IHRpbWVzIHVubGVzcwotICAgeW91IHR1bmUgVUFESlVTVCB0byB5b3VyIHNwZWNpZmljIHByb2Nlc3NvciBhbmQgSS9PIHN1YnN5c3RlbSAqLwotCi0jZGVmaW5lIFVBREpVU1QgODcwCi1zdGF0aWMgdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKSB7Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLSAgZm9yIChpPSgodXNlYypVQURKVVNUKS8zMykrMTsgaT4wOyBpLS0pICh2b2lkKSBUVUxJUF9DU1JfUkVBRChjc3JfMCk7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgc3JvbSByZWxhdGVkIGNvZGUgd2FzIHRha2VuIGZyb20gRnJlZUJTRCdzIGlmX2RlLmMgKi8KLS8qIHdpdGggbWlub3IgYWx0ZXJhdGlvbnMgdG8gbWFrZSBpdCB3b3JrIGhlcmUuICB0aGUgTGludXggY29kZSBpcyAqLwotLyogYmV0dGVyIGJ1dCB0aGlzIHdhcyBlYXNpZXIgdG8gdXNlICovCi0KLXN0YXRpYyB2b2lkIGRlbGF5XzMwMG5zKHZvaWQpCi17Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeCA9ICgzMDAgLyAzMykgKyAxOyBpZHggPiAwOyBpZHgtLSkKLSAgICAgICAgKHZvaWQpIFRVTElQX0NTUl9SRUFEKGNzcl9idXNtb2RlKTsKLX0KLQotI2RlZmluZSBFTUlUIGRvIHsgVFVMSVBfQ1NSX1dSSVRFKGNzcl9zcm9tX21paSwgY3NyKTsgZGVsYXlfMzAwbnMoKTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIHZvaWQgc3JvbV9pZGxlKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgYml0LCBjc3I7Ci0KLSAgICBjc3IgID0gU1JPTVNFTCA7IEVNSVQ7Ci0gICAgY3NyICA9IFNST01TRUwgfCBTUk9NUkQ7IEVNSVQ7Ci0gICAgY3NyIF49IFNST01DUzsgRU1JVDsKLSAgICBjc3IgXj0gU1JPTUNMS09OOyBFTUlUOwotICAgIC8qCi0gICAgICogV3JpdGUgMjUgY3ljbGVzIG9mIDAgd2hpY2ggd2lsbCBmb3JjZSB0aGUgU1JPTSB0byBiZSBpZGxlLgotICAgICAqLwotICAgIGZvciAoYml0ID0gMyArIFNST01fQklUV0lEVEggKyAxNjsgYml0ID4gMDsgYml0LS0pIHsKLSAgICAgICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7ICAgIC8qIGNsb2NrIGxvdzsgZGF0YSBub3QgdmFsaWQgKi8KLSAgICAgICAgY3NyIF49IFNST01DTEtPTjsgRU1JVDsgICAgIC8qIGNsb2NrIGhpZ2g7IGRhdGEgdmFsaWQgKi8KLSAgICB9Ci0gICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7Ci0gICAgY3NyIF49IFNST01DUzsgRU1JVDsKLSAgICBjc3IgID0gMDsgRU1JVDsKLX0KLQotc3RhdGljIHZvaWQgc3JvbV9yZWFkKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgaWR4OwotICAgIGNvbnN0IHVuc2lnbmVkIGJpdHdpZHRoID0gU1JPTV9CSVRXSURUSDsKLSAgICBjb25zdCB1bnNpZ25lZCBjbWRtYXNrID0gKFNST01DTURfUkQgPDwgYml0d2lkdGgpOwotICAgIGNvbnN0IHVuc2lnbmVkIG1zYiA9IDEgPDwgKGJpdHdpZHRoICsgMyAtIDEpOwotICAgIHVuc2lnbmVkIGxhc3RpZHggPSAoMSA8PCBiaXR3aWR0aCkgLSAxOwotCi0gICAgc3JvbV9pZGxlKCk7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8PSBsYXN0aWR4OyBpZHgrKykgewotICAgICAgICB1bnNpZ25lZCBsYXN0Yml0LCBkYXRhLCBiaXRzLCBiaXQsIGNzcjsKLSAgICAgICAgY3NyICA9IFNST01TRUwgOyAgICAgICAgICAgICAgICBFTUlUOwotICAgICAgICBjc3IgID0gU1JPTVNFTCB8IFNST01SRDsgICAgICAgIEVNSVQ7Ci0gICAgICAgIGNzciBePSBTUk9NQ1NPTjsgICAgICAgICAgICAgICAgRU1JVDsKLSAgICAgICAgY3NyIF49ICAgICAgICAgICAgU1JPTUNMS09OOyAgICBFTUlUOwotCi0gICAgICAgIGxhc3RiaXQgPSAwOwotICAgICAgICBmb3IgKGJpdHMgPSBpZHh8Y21kbWFzaywgYml0ID0gYml0d2lkdGggKyAzOyBiaXQgPiAwOyBiaXQtLSwgYml0cyA8PD0gMSkKLSB7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCB0aGlzYml0ID0gYml0cyAmIG1zYjsKLSAgICAgICAgICAgIGNzciBePSBTUk9NQ0xLT0ZGOyBFTUlUOyAgICAvKiBjbG9jayBsb3c7IGRhdGEgbm90IHZhbGlkICovCi0gICAgICAgICAgICBpZiAodGhpc2JpdCAhPSBsYXN0Yml0KSB7Ci0gICAgICAgICAgICAgICAgY3NyIF49IFNST01ET1VUOyBFTUlUOyAgLyogY2xvY2sgbG93OyBpbnZlcnQgZGF0YSAqLwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBFTUlUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3NyIF49IFNST01DTEtPTjsgRU1JVDsgICAgIC8qIGNsb2NrIGhpZ2g7IGRhdGEgdmFsaWQgKi8KLSAgICAgICAgICAgIGxhc3RiaXQgPSB0aGlzYml0OwotICAgICAgICB9Ci0gICAgICAgIGNzciBePSBTUk9NQ0xLT0ZGOyBFTUlUOwotCi0gICAgICAgIGZvciAoZGF0YSA9IDAsIGJpdHMgPSAwOyBiaXRzIDwgMTY7IGJpdHMrKykgewotICAgICAgICAgICAgZGF0YSA8PD0gMTsKLSAgICAgICAgICAgIGNzciBePSBTUk9NQ0xLT047IEVNSVQ7ICAgICAvKiBjbG9jayBoaWdoOyBkYXRhIHZhbGlkICovCi0gICAgICAgICAgICBkYXRhIHw9IFRVTElQX0NTUl9SRUFEKGNzcl9zcm9tX21paSkgJiBTUk9NRElOID8gMSA6IDA7Ci0gICAgICAgICAgICBjc3IgXj0gU1JPTUNMS09GRjsgRU1JVDsgICAgLyogY2xvY2sgbG93OyBkYXRhIG5vdCB2YWxpZCAqLwotICAgICAgICB9Ci0gICAgICAgIHNyb21baWR4KjJdID0gZGF0YSAmIDB4RkY7Ci0gICAgICAgIHNyb21baWR4KjIrMV0gPSBkYXRhID4+IDg7Ci0gICAgICAgIGNzciAgPSBTUk9NU0VMIHwgU1JPTVJEOyBFTUlUOwotICAgICAgICBjc3IgID0gMDsgRU1JVDsKLSAgICB9Ci0gICAgc3JvbV9pZGxlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdHVsaXBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotICAgICAgICBpbnQgeCxjbnQ9MjsKLQotICAgICAgICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjApOwotICAgICAgICB1ZGVsYXkoMTAwMCk7Ci0gICAgICAgIC8qIHR1cm4gb2ZmIHJlc2V0IGFuZCBzZXQgY2FjaGUgYWxpZ249MTZsd29yZCwgYnVyc3Q9dW5saW1pdCAqLwotICAgICAgICBvdXRsKDB4MDFBMDgwMDAsIGlvYWRkciArIENTUjApOwotCi0JLyogZm9yIHNvbWUgcmVhc29uIHRoZSBtZWRpYSBzZWxlY3Rpb24gZG9lcyBub3QgdGFrZQotICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBzZSBpdCBpcyByZXBlYXRlZC4gICovCi0KLSAgICAgICAgd2hpbGUoY250LS0pIHsKLSAgICAgICAgLyogc3RvcCBUWCxSWCBwcm9jZXNzZXMgKi8KLSAgICAgICAgaWYgKGNudCA9PSAxKQotCQlvdXRsKDB4MzI0MDQwMDAsIGlvYWRkciArIENTUjYpOwotICAgICAgICBlbHNlCi0JCW91dGwoMHgzMjAwMDA0MCwgaW9hZGRyICsgQ1NSNik7Ci0KLSAgICAgICAgLyogWFhYIC0gbWVkaWEgc2VsZWN0aW9uIGlzIHZlbmRvciBzcGVjaWZpYyBhbmQgaGFyZCBjb2RlZCByaWdodAotICAgICAgICAgICBoZXJlLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgdG8gdXNlIHRoZSBoaW50cyBpbiB0aGUgU1JPTSBhbmQKLSAgICAgICAgICAgYWxsb3cgbWVkaWEgc2VsZWN0aW9uIGJ5IHRoZSB1c2VyIGF0IHJ1bnRpbWUuICBNSUkgc3VwcG9ydAotICAgICAgICAgICBzaG91bGQgYWxzbyBiZSBhZGRlZC4gIFN1cHBvcnQgZm9yIGNoaXBzIG90aGVyIHRoYW4gdGhlCi0gICAgICAgICAgIDIxMTQzIHNob3VsZCBiZSBhZGRlZCBoZXJlIGFzIHdlbGwgICovCi0KLSAgICAgICAgLyogc3RhcnQgIHNldCB0byAxME1icHMgaGFsZi1kdXBsZXggKi8KLQotICAgICAgICAvKiBzZXR1cCBTSUEgKi8KLSAgICAgICAgb3V0bCgweDAsIGlvYWRkciArIENTUjEzKTsgICAgICAgICAgICAgIC8qIHJlc2V0IFNJQSAqLwotICAgICAgICBvdXRsKDB4N2YzZiwgaW9hZGRyICsgQ1NSMTQpOwotICAgICAgICBvdXRsKDB4ODAwMDAwOCwgaW9hZGRyICsgQ1NSMTUpOwotICAgICAgICBvdXRsKDB4MCwgaW9hZGRyICsgQ1NSMTMpOwotICAgICAgICBvdXRsKDB4MSwgaW9hZGRyICsgQ1NSMTMpOwotICAgICAgICBvdXRsKDB4MjQwNDAwMCwgaW9hZGRyICsgQ1NSNik7Ci0KLSAgICAgICAgLyogaW5pdGFsaXplIEdQICovCi0gICAgICAgIG91dGwoMHg4YWYwMDA4LCBpb2FkZHIgKyBDU1IxNSk7Ci0gICAgICAgIG91dGwoMHg1MDAwOCwgaW9hZGRyICsgQ1NSMTUpOwotCi0gICAgICAgIC8qIGVuZCAgc2V0IHRvIDEwTWJwcyBoYWxmLWR1cGxleCAqLwotCi0JaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX01BQ1JPTklYICYmIGRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX01YOTg3eDUpIHsKLQkJLyogZG8gc3R1ZmYgZm9yIE1YOTg3MTUgKi8KLQkJb3V0bCgweDAxYTgwMDAwLCBpb2FkZHIgKyBDU1I2KTsKLQkJb3V0bCgweEZGRkZGRkZGLCBpb2FkZHIgKyBDU1IxNCk7Ci0JCW91dGwoMHgwMDAwMTAwMCwgaW9hZGRyICsgQ1NSMTIpOwotCX0KLQotICAgICAgICBvdXRsKDB4MCwgaW9hZGRyICsgQ1NSNyk7ICAgICAgIC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCi0gICAgICAgIC8qIGNvbnN0cnVjdCBzZXR1cCBwYWNrZXQgd2hpY2ggaXMgdXNlZCBieSB0aGUgMjExNDMgdG8KLSAgICAgICAgICAgcHJvZ3JhbSBpdHMgQ0FNIHRvIHJlY29nbml6ZSBpbnRlcmVzdGluZyBNQUMgYWRkcmVzc2VzICovCi0KLSAgICAgICAgbWVtc2V0KCZ0eGQsIDAsIHNpemVvZihzdHJ1Y3QgdHhkZXNjKSk7Ci0gICAgICAgIHR4ZC5idWYxYWRkciA9ICZ0eGJbMF07Ci0gICAgICAgIHR4ZC5idWYyYWRkciA9ICZ0eGJbMF07ICAgICAgICAgLyoganVzdCBpbiBjYXNlICovCi0gICAgICAgIHR4ZC5idWYxc3ogICA9IDE5MjsgICAgICAgICAgICAgLyogc2V0dXAgcGFja2V0IG11c3QgYmUgMTkyIGJ5dGVzICovCi0gICAgICAgIHR4ZC5idWYyc3ogICA9IDA7Ci0gICAgICAgIHR4ZC5jb250cm9sICA9IDB4MDIwOyAgICAgICAgICAgLyogc2V0dXAgcGFja2V0ICovCi0gICAgICAgIHR4ZC5zdGF0dXMgICA9IDB4ODAwMDAwMDA7ICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gMjExNDMgKi8KLQotICAgICAgICAvKiBjb25zdHJ1Y3QgcGVyZmVjdCBmaWx0ZXIgZnJhbWUgKi8KLSAgICAgICAgLyogd2l0aCBtYWMgYWRkcmVzcyBhcyBmaXJzdCBtYXRjaCAqLwotICAgICAgICAvKiBhbmQgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIGFsbCBvdGhlcnMgKi8KLQotICAgICAgICBmb3IoeD0wO3g8MTkyO3grKykgdHhiW3hdID0gMHhmZjsKLSAgICAgICAgdHhiWzBdID0gbmljLT5ub2RlX2FkZHJbMF07Ci0gICAgICAgIHR4YlsxXSA9IG5pYy0+bm9kZV9hZGRyWzFdOwotICAgICAgICB0eGJbNF0gPSBuaWMtPm5vZGVfYWRkclsyXTsKLSAgICAgICAgdHhiWzVdID0gbmljLT5ub2RlX2FkZHJbM107Ci0gICAgICAgIHR4Yls4XSA9IG5pYy0+bm9kZV9hZGRyWzRdOwotICAgICAgICB0eGJbOV0gPSBuaWMtPm5vZGVfYWRkcls1XTsKLSAgICAgICAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhkLCBpb2FkZHIgKyBDU1I0KTsgICAgICAgIC8qIHNldCB4bWl0IGJ1ZiAqLwotICAgICAgICBvdXRsKDB4MjQwNjAwMCwgaW9hZGRyICsgQ1NSNik7ICAgICAgICAgLyogc3RhcnQgdHJhbnNtaXRlciAqLwotCi0gICAgICAgIHVkZWxheSg1MDAwMCk7ICAvKiB3YWl0IGZvciB0aGUgc2V0dXAgcGFja2V0IHRvIGJlIHByb2Nlc3NlZCAqLwotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXR1cCByZWNlaXZlIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgewotICAgICAgICAgIGludCB4OwotICAgICAgICAgIGZvcih4PTA7eDxOUlhEO3grKykgewotICAgICAgICAgICAgbWVtc2V0KCZyeGRbeF0sIDAsIHNpemVvZihzdHJ1Y3QgcnhkZXNjKSk7Ci0gICAgICAgICAgICByeGRbeF0uYnVmMWFkZHIgPSAmcnhiW3ggKiBCVUZMRU5dOwotICAgICAgICAgICAgcnhkW3hdLmJ1ZjJhZGRyID0gMDsgICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgICAgICByeGRbeF0uYnVmMXN6ICAgPSBCVUZMRU47Ci0gICAgICAgICAgICByeGRbeF0uYnVmMnN6ICAgPSAwOyAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgICAgIHJ4ZFt4XS5jb250cm9sICA9IDB4MDsKLSAgICAgICAgICAgIHJ4ZFt4XS5zdGF0dXMgICA9IDB4ODAwMDAwMDA7ICAgICAgIC8qIGdpdmUgb3duZXJzaGlwIGl0IHRvIDIxMTQzICovCi0gICAgICAgICAgfQotICAgICAgICAgIHJ4ZFtOUlhEIC0gMV0uY29udHJvbCAgPSAweDAwODsgICAgICAgLyogU2V0IFJlY2VpdmUgZW5kIG9mIHJpbmcgb24gbGEKLXN0IGRlc2NyaXB0b3IgKi8KLSAgICAgICAgICByeGRfdGFpbCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0ZWxsIERDMjExWFggd2hlcmUgdG8gZmluZCByeCBkZXNjcmlwdG9yIGxpc3QgKi8KLSAgICAgICAgb3V0bCgodW5zaWduZWQgbG9uZykmcnhkWzBdLCBpb2FkZHIgKyBDU1IzKTsKLSAgICAgICAgLyogc3RhcnQgdGhlIHJlY2VpdmVyICovCi0gICAgICAgIG91dGwoMHgyNDA2MDAyLCBpb2FkZHIgKyBDU1I2KTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyIHBhZG1hcFtdID0gewotICAgICAgICAwLCAzLCAyLCAxfTsKLQotc3RhdGljIHZvaWQgdHVsaXBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZTsKLQotICAgICAgICAvKiBzZXR1cCBldGhlcm5ldCBoZWFkZXIgKi8KLQotCW1lbWNweShlaGRyLCBkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KCZlaGRyW0VUSF9BTEVOXSwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKLSAgICAgICAgZWhkcltFVEhfQUxFTioyXSA9ICh0ID4+IDgpICYgMHhmZjsKLSAgICAgICAgZWhkcltFVEhfQUxFTioyKzFdID0gdCAmIDB4ZmY7Ci0KLSAgICAgICAgLyogc2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KLQotICAgICAgICBtZW1zZXQoJnR4ZCwgMCwgc2l6ZW9mKHN0cnVjdCB0eGRlc2MpKTsKLQotICAgICAgICB0eGQuYnVmMWFkZHIgPSAmZWhkclswXTsgICAgICAgIC8qIGV0aGVybmV0IGhlYWRlciAqLwotICAgICAgICB0eGQuYnVmMXN6ICAgPSBFVEhfSExFTjsKLQotICAgICAgICB0eGQuYnVmMmFkZHIgPSBwOyAgICAgICAgICAgICAgIC8qIHBhY2tldCB0byB0cmFuc21pdCAqLwotICAgICAgICB0eGQuYnVmMnN6ICAgPSBzOwotCi0gICAgICAgIHR4ZC5jb250cm9sICA9IDB4MTg4OyAgICAgICAgICAgLyogTFMrRlMrVEVSICovCi0KLSAgICAgICAgdHhkLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAgICAvKiBnaXZlIGl0IHRvIDIxMTQzICovCi0KLSAgICAgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwNDAwMCwgaW9hZGRyICsgQ1NSNik7Ci0gICAgICAgIG91dGwoKHVuc2lnbmVkIGxvbmcpJnR4ZCwgaW9hZGRyICsgQ1NSNCk7Ci0gICAgICAgIG91dGwoaW5sKGlvYWRkciArIENTUjYpIHwgMHgwMDAwNDAwMCwgaW9hZGRyICsgQ1NSNik7Ci0KLS8qICAgV2FpdCBmb3IgdHJhbnNtaXQgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZy4gIG5vdCB3ZWxsIHRlc3RlZC4KLQotICAgICAgICB0aW1lID0gY3VycnRpY2tzKCk7Ci0gICAgICAgIHdoaWxlKHR4ZC5zdGF0dXMgJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICAgaWYgKGN1cnJ0aWNrcygpIC0gdGltZSA+IDIwKSB7Ci0gICAgICAgICAgICBwcmludGYoInRyYW5zbWl0IHRpbWVvdXQuXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotKi8KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLSAgICAgICAgaWYgKHJ4ZFtyeGRfdGFpbF0uc3RhdHVzICYgMHg4MDAwMDAwMCkgcmV0dXJuIDA7Ci0KLSAgICAgICAgbmljLT5wYWNrZXRsZW4gPSAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDNGRkYwMDAwKSA+PiAxNjsKLQotICAgICAgICAvKiBjb3B5IHBhY2tldCB0byB3b3JraW5nIGJ1ZmZlciAqLwotICAgICAgICAvKiBYWFggLSB0aGlzIGNvcHkgY291bGQgYmUgYXZvaWRlZCB3aXRoIGEgbGl0dGxlIG1vcmUgd29yawotICAgICAgICAgICBidXQgZm9yIG5vdyB3ZSBhcmUgY29udGVudCB3aXRoIGl0IGJlY2F1c2UgdGhlIG9wdGltaXNlZAotICAgICAgICAgICBtZW1jcHkoLCAsICkgaXMgcXVpdGUgZmFzdCAqLwotCi0gICAgICAgIG1lbWNweShuaWMtPnBhY2tldCwgcnhiICsgcnhkX3RhaWwgKiBCVUZMRU4sIG5pYy0+cGFja2V0bGVuKTsKLQotICAgICAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNpZXZlIHJpbmcgKi8KLSAgICAgICAgcnhkW3J4ZF90YWlsXS5zdGF0dXMgPSAweDgwMDAwMDAwOwotICAgICAgICByeGRfdGFpbCsrOwotICAgICAgICBpZiAocnhkX3RhaWwgPT0gTlJYRCkgcnhkX3RhaWwgPSAwOwotCi0gICAgICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQkvKiBub3RoaW5nIGZvciB0aGUgbW9tZW50ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqb3R1bGlwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQotewotICAgICAgICBpbnQgaTsKLQotCWlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQotCQlyZXR1cm4gKDApOwotCXZlbmRvciA9IHBjaS0+dmVuZG9yOwotCWRldl9pZCA9IHBjaS0+ZGV2X2lkOwotCWlvYWRkciA9ICppb19hZGRyczsKLQltZW1iYXNlID0gKHVuc2lnbmVkIGludCAqKXBjaS0+bWVtYmFzZTsKLQotICAgICAgICAvKiB3YWtldXAgY2hpcCAqLwotICAgICAgICBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChwY2ktPmJ1cyxwY2ktPmRldmZuLDB4NDAsMHgwMDAwMDAwMCk7Ci0KLSAgICAgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCi0gICAgICAgIC8qIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MjAwMiwgaW9hZGRyICsgQ1NSNik7ICovCi0gICAgICAgIC8qIENsZWFyIHRoZSBtaXNzZWQtcGFja2V0IGNvdW50ZXIuICovCi0gICAgICAgIC8qICh2b2xhdGlsZSBpbnQpaW5sKGlvYWRkciArIENTUjgpOyAqLwotCi0gICAgICAgIHNyb21fcmVhZCgpOwotCi0JZm9yIChpPTA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQluaWMtPm5vZGVfYWRkcltpXSA9IHNyb21bMjAraV07Ci0KLSAgICAgICAgcHJpbnRmKCJUdWxpcCAlISBhdCBpb2FkZHIgJSNoWFxuIiwgbmljLT5ub2RlX2FkZHIsIGlvYWRkcik7Ci0KLSAgICAgICAgdHVsaXBfcmVzZXQobmljKTsKLQotCW5pYy0+cmVzZXQgPSB0dWxpcF9yZXNldDsKLQluaWMtPnBvbGwgPSB0dWxpcF9wb2xsOwotCW5pYy0+dHJhbnNtaXQgPSB0dWxpcF90cmFuc21pdDsKLQluaWMtPmRpc2FibGUgPSB0dWxpcF9kaXNhYmxlOwotICAgICAgICByZXR1cm4gbmljOwotfQpJbmRleDogYi9uZXRib290L290dWxpcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9vdHVsaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIG1vc3RseSBzdG9sZW4gZnJvbSBGcmVlQlNEIGlmX2RlLmMsIGlmX2RldmFyLmggKi8KLQotI2RlZmluZSBUVUxJUF9DU1JfUkVBRChjc3IpCQkobWVtYmFzZVtjc3IqMl0pCi0jZGVmaW5lIENTUl9SRUFEKGNzcikJCQkobWVtYmFzZVtjc3IqMl0pCi0jZGVmaW5lIFRVTElQX0NTUl9XUklURShjc3IsIHZhbCkJKG1lbWJhc2VbY3NyKjJdID0gdmFsKQotI2RlZmluZSBDU1JfV1JJVEUoY3NyLCB2YWwpCQkobWVtYmFzZVtjc3IqMl0gPSB2YWwpCi0KLSNkZWZpbmUgY3NyXzAJCQkwCi0jZGVmaW5lIGNzcl8xCQkJMQotI2RlZmluZSBjc3JfMgkJCTIKLSNkZWZpbmUgY3NyXzMJCQkzCi0jZGVmaW5lIGNzcl80CQkJNAotI2RlZmluZSBjc3JfNQkJCTUKLSNkZWZpbmUgY3NyXzYJCQk2Ci0jZGVmaW5lIGNzcl83CQkJNwotI2RlZmluZSBjc3JfOAkJCTgKLSNkZWZpbmUgY3NyXzkJCQk5Ci0jZGVmaW5lIGNzcl8xMAkJCTEwCi0jZGVmaW5lIGNzcl8xMQkJCTExCi0jZGVmaW5lIGNzcl8xMgkJCTEyCi0jZGVmaW5lIGNzcl8xMwkJCTEzCi0jZGVmaW5lIGNzcl8xNAkJCTE0Ci0jZGVmaW5lIGNzcl8xNQkJCTE1Ci0KLSNkZWZpbmUgY3NyX2J1c21vZGUJCWNzcl8wCi0jZGVmaW5lIGNzcl90eHBvbGwJCWNzcl8xCi0jZGVmaW5lIGNzcl9yeHBvbGwJCWNzcl8yCi0jZGVmaW5lIGNzcl9yeGxpc3QJCWNzcl8zCi0jZGVmaW5lIGNzcl90eGxpc3QJCWNzcl80Ci0jZGVmaW5lIGNzcl9zdGF0dXMJCWNzcl81Ci0jZGVmaW5lIGNzcl9jb21tYW5kCQljc3JfNgotI2RlZmluZSBjc3JfaW50cgkJY3NyXzcKLSNkZWZpbmUgY3NyX21pc3NlZF9mcmFtZXMJY3NyXzgKLSNkZWZpbmUgY3NyX2VuZXRyb20JCWNzcl85CQkvKiAyMTA0MCAqLwotI2RlZmluZSBjc3JfcmVzZXJ2ZWQJCWNzcl8xMAkJLyogMjEwNDAgKi8KLSNkZWZpbmUgY3NyX2Z1bGxfZHVwbGV4CQljc3JfMTEJCS8qIDIxMDQwICovCi0jZGVmaW5lIGNzcl9ib290cm9tCQljc3JfMTAJCS8qIDIxMDQxLzIxMTQwQS8/PyAqLwotI2RlZmluZSBjc3JfZ3AJCQljc3JfMTIJCS8qIDIxMTQwKiAqLwotI2RlZmluZSBjc3Jfd2F0Y2hkb2cJCWNzcl8xNQkJLyogMjExNDAqICovCi0jZGVmaW5lIGNzcl9ncF90aW1lcgkJY3NyXzExCQkvKiAyMTA0MS8yMTE0MCogKi8KLSNkZWZpbmUgY3NyX3Nyb21fbWlpCQljc3JfOQkJLyogMjEwNDEvMjExNDAqICovCi0jZGVmaW5lIGNzcl9zaWFfc3RhdHVzCQljc3JfMTIJCS8qIDIxMDR4ICovCi0jZGVmaW5lIGNzcl9zaWFfY29ubmVjdGl2aXR5CWNzcl8xMwkJLyogMjEwNHggKi8KLSNkZWZpbmUgY3NyX3NpYV90eF9yeAkJY3NyXzE0CQkvKiAyMTA0eCAqLwotI2RlZmluZSBjc3Jfc2lhX2dlbmVyYWwJCWNzcl8xNQkJLyogMjEwNHggKi8KLQotI2RlZmluZSBTUk9NU0VMCQkweDA4MDAKLSNkZWZpbmUgU1JPTUNTCQkweDAwMDEKLSNkZWZpbmUgU1JPTUNMS09OCTB4MDAwMgotI2RlZmluZSBTUk9NQ0xLT0ZGCTB4MDAwMgotI2RlZmluZSBTUk9NUkQJCTB4NDAwMAotI2RlZmluZSBTUk9NV1IJCTB4MjAwMAotI2RlZmluZSBTUk9NX0JJVFdJRFRICTYKLSNkZWZpbmUgU1JPTUNNRF9SRAk2Ci0jZGVmaW5lIFNST01DU09OCTB4MDAwMQotI2RlZmluZSBTUk9NRE9VVAkweDAwMDQKLSNkZWZpbmUgU1JPTURJTgkJMHgwMDA4Ci0KLQotc3RydWN0IHR4ZGVzYyB7Ci0JdW5zaWduZWQgbG9uZwlzdGF0dXM7CQkvKiBvd25lciwgc3RhdHVzICovCi0JdW5zaWduZWQgbG9uZwlidWYxc3o6MTEsCS8qIHNpemUgb2YgYnVmZmVyIDEgKi8KLQkJCWJ1ZjJzejoxMSwJLyogc2l6ZSBvZiBidWZmZXIgMiAqLwotCQkJY29udHJvbDoxMDsJLyogY29udHJvbCBiaXRzICovCi0JY29uc3QgdW5zaWduZWQgY2hhciAqYnVmMWFkZHI7CS8qIGJ1ZmZlciAxIGFkZHJlc3MgKi8KLQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYyYWRkcjsJLyogYnVmZmVyIDIgYWRkcmVzcyAqLwotfTsKLQotc3RydWN0IHJ4ZGVzYyB7Ci0JdW5zaWduZWQgbG9uZwlzdGF0dXM7CQkvKiBvd25lciwgc3RhdHVzICovCi0JdW5zaWduZWQgbG9uZwlidWYxc3o6MTEsCS8qIHNpemUgb2YgYnVmZmVyIDEgKi8KLQkJCWJ1ZjJzejoxMSwJLyogc2l6ZSBvZiBidWZmZXIgMiAqLwotCQkJY29udHJvbDoxMDsJLyogY29udHJvbCBiaXRzICovCi0JdW5zaWduZWQgY2hhcgkqYnVmMWFkZHI7CS8qIGJ1ZmZlciAxIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyCSpidWYyYWRkcjsJLyogYnVmZmVyIDIgYWRkcmVzcyAqLwotfTsKSW5kZXg6IGIvbmV0Ym9vdC9wY2kuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvcGNpLmMKKysrIGIvbmV0Ym9vdC9wY2kuYwpAQCAtMSwxNSArMSwzIEBACi0vKgotKiogU3VwcG9ydCBmb3IgTkUyMDAwIFBDSSBjbG9uZXMgYWRkZWQgRGF2aWQgTW9ucm8gSnVuZSAxOTk3Ci0qKiBHZW5lcmFsaXNlZCB0byBvdGhlciBOSUNzIGJ5IEtlbiBZYXAgSnVseSAxOTk3Ci0qKgotKiogTW9zdCBvZiB0aGlzIGlzIHRha2VuIGZyb206Ci0qKgotKiogL3Vzci9zcmMvbGludXgvZHJpdmVycy9wY2kvcGNpLmMKLSoqIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvcGNpLmgKLSoqIC91c3Ivc3JjL2xpbnV4L2FyY2gvaTM4Ni9iaW9zMzIuYwotKiogL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9iaW9zMzIuaAotKiogL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvbmUuYwotKi8KIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE4LDQwMiArNiwyOTQgQEAKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAiZ3J1Yi5oIgogI2luY2x1ZGUgInBjaS5oIgogCi0vKiNkZWZpbmUJREVCVUcJMSovCi0jZGVmaW5lIERFQlVHCTAKLQotI2lmZGVmCUNPTkZJR19QQ0lfRElSRUNUCi0jZGVmaW5lICBQQ0lCSU9TX1NVQ0NFU1NGVUwgICAgICAgICAgICAgICAgMHgwMAotCi0vKgotICogRnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2l0aCB0eXBlIDEgYWNjZXNzZXMKLSAqLwotCi0jZGVmaW5lIENPTkZJR19DTUQoYnVzLCBkZXZpY2VfZm4sIHdoZXJlKSAgICgweDgwMDAwMDAwIHwgKGJ1cyA8PCAxNikgfCAoZGV2aWNlX2ZuIDw8IDgpIHwgKHdoZXJlICYgfjMpKQotCi1pbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyICp2YWx1ZSkKK3Vuc2lnbmVkIGxvbmcgdmlydF9vZmZzZXQgPSAwOwordW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgY29uc3Qgdm9pZCAqdmlydF9hZGRyKQogewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgICp2YWx1ZSA9IGluYigweENGQyArICh3aGVyZSYzKSk7Ci0gICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKXZpcnRfYWRkcikgKyB2aXJ0X29mZnNldDsKIH0KIAotaW50IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCAodW5zaWduZWQgaW50IGJ1cywKLSAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKK3ZvaWQgKnBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKIHsKLSAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKLSAgICAqdmFsdWUgPSBpbncoMHhDRkMgKyAod2hlcmUmMikpOwotICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisJcmV0dXJuICh2b2lkICopKHBoeXNfYWRkciAtIHZpcnRfb2Zmc2V0KTsKIH0KIAotaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCi0JCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50ICp2YWx1ZSkKLXsKLSAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKLSAgICAqdmFsdWUgPSBpbmwoMHhDRkMpOwotICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19CisjaWZkZWYgSU5DTFVERV8zQzU5NQorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHQ1OTVfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfM0M1OTUgKi8KIAotaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCi0JCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLSAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKLSAgICBvdXRiKHZhbHVlLCAweENGQyArICh3aGVyZSYzKSk7Ci0gICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KKyNpZmRlZiBJTkNMVURFXzNDOTBYCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgYTNjOTB4X2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFXzNDOTBYICovCiAKLWludCBwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLAotCQkJCSB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQotewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgIG91dHcodmFsdWUsIDB4Q0ZDICsgKHdoZXJlJjIpKTsKLSAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQorI2lmZGVmIElOQ0xVREVfREFWSUNPTQorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGRhdmljb21fZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfREFWSUNPTSAqLwogCi1pbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50IHZhbHVlKQotewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgIG91dGwodmFsdWUsIDB4Q0ZDKTsKLSAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQorI2lmZGVmIElOQ0xVREVfRTEwMDAKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBlMTAwMF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9FMTAwMCAqLwogCi0jdW5kZWYgQ09ORklHX0NNRAorI2lmZGVmIElOQ0xVREVfRUVQUk8xMDAKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBlZXBybzEwMF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9FRVBSTzEwMCAqLwogCi0jZWxzZQkgLyogQ09ORklHX1BDSV9ESVJFQ1QgIG5vdCBkZWZpbmVkICovCisjaWZkZWYgSU5DTFVERV9FUElDMTAwCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgZXBpYzEwMF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9FUElDMTAwICovCiAKLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OwotfSBiaW9zMzJfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKLQotc3RhdGljIGxvbmcgcGNpYmlvc19lbnRyeTsKLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OwotfSBwY2lfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKKyNpZmRlZiBJTkNMVURFX0ZPUkNFREVUSAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGZvcmNlZGV0aF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9GT1JDRURFVEggKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmlvczMyX3NlcnZpY2UodW5zaWduZWQgbG9uZyBzZXJ2aWNlKQotewotCXVuc2lnbmVkIGNoYXIgcmV0dXJuX2NvZGU7CS8qICVhbCAqLwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJCS8qICVlYnggKi8KLQl1bnNpZ25lZCBsb25nIGxlbmd0aDsJCS8qICVlY3ggKi8KLQl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogJWVkeCAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQlfX2FzbV9fKAotI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKLQkJImxjYWxsICglJWVkaSkiCi0jZWxzZQotCQkibGNhbGwgKiglJWVkaSkiCi0jZW5kaWYKLQkJOiAiPWEiIChyZXR1cm5fY29kZSksCi0JCSAgIj1iIiAoYWRkcmVzcyksCi0JCSAgIj1jIiAobGVuZ3RoKSwKLQkJICAiPWQiIChlbnRyeSkKLQkJOiAiMCIgKHNlcnZpY2UpLAotCQkgICIxIiAoMCksCi0JCSAgIkQiICgmYmlvczMyX2luZGlyZWN0KSk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQlzd2l0Y2ggKHJldHVybl9jb2RlKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiBhZGRyZXNzICsgZW50cnk7Ci0JCWNhc2UgMHg4MDoJLyogTm90IHByZXNlbnQgKi8KLQkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogbm90IHByZXNlbnRcbiIsIHNlcnZpY2UpOwotCQkJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogcmV0dXJuZWQgJSNYLCBtYWlsIGRyZXdAY29sb3JhZG8uZWR1XG4iLAotCQkJCXNlcnZpY2UsIHJldHVybl9jb2RlKTsKLQkJCXJldHVybiAwOwotCX0KLX0KKyNpZmRlZiBJTkNMVURFX05BVFNFTUkKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBuYXRzZW1pX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX05BVFNFTUkgKi8KIAotaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLAotICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7Ci0gICAgICAgIF9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZXNpKVxuXHQiCi0jZWxzZQotCQkibGNhbGwgKiglJWVzaSlcblx0IgotI2VuZGlmCi0gICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKLSAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKLSAgICAgICAgICAgICAgICAiMToiCi0gICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAotICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQotICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX0JZVEUpLAotICAgICAgICAgICAgICAgICAgImIiIChieCksCi0gICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCi0gICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKLSAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0gICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OwotfQorI2lmZGVmIElOQ0xVREVfTlM4MzgyMAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIG5zODM4MjBfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfTlM4MzgyMCAqLwogCi1pbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHVuc2lnbmVkIGludCBidXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7Ci0gICAgICAgIF9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZXNpKVxuXHQiCi0jZWxzZQotCQkibGNhbGwgKiglJWVzaSlcblx0IgotI2VuZGlmCi0gICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKLSAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKLSAgICAgICAgICAgICAgICAiMToiCi0gICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAotICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQotICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX1dPUkQpLAotICAgICAgICAgICAgICAgICAgImIiIChieCksCi0gICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCi0gICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKLSAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0gICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OwotfQorI2lmZGVmIElOQ0xVREVfTlM4MzkwCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgbmVwY2lfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfTlM4MzkwICovCiAKLWludCBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50ICp2YWx1ZSkKLXsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgIHNhdmVfZmxhZ3MoZmxhZ3MpOwotICAgICAgICBfX2FzbV9fKAotI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKLQkJImxjYWxsICglJWVzaSlcblx0IgotI2Vsc2UKLQkJImxjYWxsICooJSVlc2kpXG5cdCIKLSNlbmRpZgotICAgICAgICAgICAgICAgICJqYyAxZlxuXHQiCi0gICAgICAgICAgICAgICAgInhvciAlJWFoLCAlJWFoXG4iCi0gICAgICAgICAgICAgICAgIjE6IgotICAgICAgICAgICAgICAgIDogIj1jIiAoKnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICI9YSIgKHJldCkKLSAgICAgICAgICAgICAgICA6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19EV09SRCksCi0gICAgICAgICAgICAgICAgICAiYiIgKGJ4KSwKLSAgICAgICAgICAgICAgICAgICJEIiAoKGxvbmcpIHdoZXJlKSwKLSAgICAgICAgICAgICAgICAgICJTIiAoJnBjaV9pbmRpcmVjdCkpOwotICAgICAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Ci19CisjaWZkZWYgSU5DTFVERV9QQ05FVDMyCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgcGNuZXQzMl9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9QQ05FVDMyICovCiAKLWludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlICh1bnNpZ25lZCBpbnQgYnVzLAotCXVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwotCV9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZXNpKVxuXHQiCi0jZWxzZQotCQkibGNhbGwgKiglJWVzaSlcblx0IgotI2VuZGlmCi0JCSJqYyAxZlxuXHQiCi0JCSJ4b3IgJSVhaCwgJSVhaFxuIgotCQkiMToiCi0JCTogIj1hIiAocmV0KQotCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfQllURSksCi0JCSAgImMiICh2YWx1ZSksCi0JCSAgImIiIChieCksCi0JCSAgIkQiICgobG9uZykgd2hlcmUpLAotCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OwotfQorI2lmZGVmIElOQ0xVREVfUE5JQworZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHBuaWNfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfUE5JQyAqLwogCi1pbnQgcGNpYmlvc193cml0ZV9jb25maWdfd29yZCAodW5zaWduZWQgaW50IGJ1cywKLQl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7Ci0JX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCSJsY2FsbCAoJSVlc2kpXG5cdCIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZXNpKVxuXHQiCi0jZW5kaWYKLQkJImpjIDFmXG5cdCIKLQkJInhvciAlJWFoLCAlJWFoXG4iCi0JCSIxOiIKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19XT1JEKSwKLQkJICAiYyIgKHZhbHVlKSwKLQkJICAiYiIgKGJ4KSwKLQkJICAiRCIgKChsb25nKSB3aGVyZSksCi0JCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Ci19CisjaWZkZWYgSU5DTFVERV9SVEw4MTM5CitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgcnRsODEzOV9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9SVEw4MTM5ICovCiAKLWludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywKLQl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwotCV9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZXNpKVxuXHQiCi0jZWxzZQotCQkibGNhbGwgKiglJWVzaSlcblx0IgotI2VuZGlmCi0JCSJqYyAxZlxuXHQiCi0JCSJ4b3IgJSVhaCwgJSVhaFxuIgotCQkiMToiCi0JCTogIj1hIiAocmV0KQotCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfRFdPUkQpLAotCQkgICJjIiAodmFsdWUpLAotCQkgICJiIiAoYngpLAotCQkgICJEIiAoKGxvbmcpIHdoZXJlKSwKLQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKLX0KKyNpZmRlZiBJTkNMVURFX1NJUzkwMAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHNpczkwMF9kcml2ZXI7CitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgc2lzX2JyaWRnZV9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9TSVM5MDAgKi8KIAotc3RhdGljIHZvaWQgY2hlY2tfcGNpYmlvcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwotCXVuc2lnbmVkIGNoYXIgcHJlc2VudF9zdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBtYWpvcl9yZXZpc2lvbjsKLQl1bnNpZ25lZCBjaGFyIG1pbm9yX3JldmlzaW9uOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHBhY2s7Ci0KLQlpZiAoKHBjaWJpb3NfZW50cnkgPSBiaW9zMzJfc2VydmljZShQQ0lfU0VSVklDRSkpKSB7Ci0JCXBjaV9pbmRpcmVjdC5hZGRyZXNzID0gcGNpYmlvc19lbnRyeTsKLQotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCQkibGNhbGwgKCUlZWRpKVxuXHQiCi0jZWxzZQotCQkJImxjYWxsICooJSVlZGkpXG5cdCIKLSNlbmRpZgotCQkJImpjIDFmXG5cdCIKLQkJCSJ4b3IgJSVhaCwgJSVhaFxuIgotCQkJIjE6XHRzaGwgJDgsICUlZWF4XG5cdCIKLQkJCSJtb3Z3ICUlYngsICUlYXgiCi0JCQk6ICI9ZCIgKHNpZ25hdHVyZSksCi0JCQkgICI9YSIgKHBhY2spCi0JCQk6ICIxIiAoUENJQklPU19QQ0lfQklPU19QUkVTRU5UKSwKLQkJCSAgIkQiICgmcGNpX2luZGlyZWN0KQotCQkJOiAiYngiLCAiY3giKTsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQkJcHJlc2VudF9zdGF0dXMgPSAocGFjayA+PiAxNikgJiAweGZmOwotCQltYWpvcl9yZXZpc2lvbiA9IChwYWNrID4+IDgpICYgMHhmZjsKLQkJbWlub3JfcmV2aXNpb24gPSBwYWNrICYgMHhmZjsKLQkJaWYgKHByZXNlbnRfc3RhdHVzIHx8IChzaWduYXR1cmUgIT0gUENJX1NJR05BVFVSRSkpIHsKLQkJCXByaW50ZigiRVJST1I6IEJJT1MzMiBzYXlzIFBDSSBCSU9TLCBidXQgbm8gUENJICIKLQkJCQkiQklPUz8/Pz9cbiIpOwotCQkJcGNpYmlvc19lbnRyeSA9IDA7Ci0JCX0KLSNpZglERUJVRwotCQlpZiAocGNpYmlvc19lbnRyeSkgewotCQkJcHJpbnRmICgicGNpYmlvc19pbml0IDogUENJIEJJT1MgcmV2aXNpb24gJWhoWC4laGhYIgotCQkJCSIgZW50cnkgYXQgJSNYXG4iLCBtYWpvcl9yZXZpc2lvbiwKLQkJCQltaW5vcl9yZXZpc2lvbiwgcGNpYmlvc19lbnRyeSk7Ci0JCX0KLSNlbmRpZgotCX0KLX0KKyNpZmRlZiBJTkNMVURFX1NVTkRBTkNFCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgc3VuZGFuY2VfZHJpdmVyOworI2VuZGlmCS8qIElOQ0xVREVfU1VOREFOQ0UgKi8KIAotc3RhdGljIHZvaWQgcGNpYmlvc19pbml0KHZvaWQpCi17Ci0JdW5pb24gYmlvczMyICpjaGVjazsKLQl1bnNpZ25lZCBjaGFyIHN1bTsKLQlpbnQgaSwgbGVuZ3RoOwotCXVuc2lnbmVkIGxvbmcgYmlvczMyX2VudHJ5ID0gMDsKLQotCS8qCi0JICogRm9sbG93IHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUgZm9yIGxvY2F0aW5nIHRoZSBCSU9TMzIgU2VydmljZQotCSAqIGRpcmVjdG9yeSBieSBzY2FubmluZyB0aGUgcGVybWlzc2libGUgYWRkcmVzcyByYW5nZSBmcm9tCi0JICogMHhlMDAwMCB0aHJvdWdoIDB4ZmZmZmYgZm9yIGEgdmFsaWQgQklPUzMyIHN0cnVjdHVyZS4KLQkgKgotCSAqLworI2lmZGVmIElOQ0xVREVfVEczCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgIHRnM19kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9URzMgKi8KKworI2lmZGVmIElOQ0xVREVfVExBTgorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHRsYW5fZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfVExBTiAqLworCisjaWZkZWYgSU5DTFVERV9UVUxJUAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHR1bGlwX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1RVTElQICovCisKKyNpZmRlZiBJTkNMVURFX1VOREkKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciB1bmRpX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1VOREkgKi8KKworI2lmZGVmIElOQ0xVREVfVklBX1JISU5FCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgcmhpbmVfZHJpdmVyOworI2VuZGlmLyogSU5DTFVERV9WSUFfUkhJTkUgKi8KKworI2lmZGVmIElOQ0xVREVfVzg5Qzg0MAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHc4OWM4NDBfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfVzg5Qzg0MCAqLworCisjaWZkZWYgSU5DTFVERV9SODE2OQorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHI4MTY5X2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1I4MTY5ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RyaXZlcnNbXSA9IHsKKworI2lmZGVmIElOQ0xVREVfM0M1OTUKKwkmdDU5NV9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV8zQzU5NSAqLworCisjaWZkZWYgSU5DTFVERV8zQzkwWAorCSZhM2M5MHhfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfM0M5MFggKi8KKworI2lmZGVmIElOQ0xVREVfREFWSUNPTQorCSZkYXZpY29tX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX0RBVklDT00gKi8KKworI2lmZGVmIElOQ0xVREVfRTEwMDAKKwkmZTEwMDBfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfRTEwMDAgKi8KKworI2lmZGVmIElOQ0xVREVfRUVQUk8xMDAKKwkmZWVwcm8xMDBfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfRUVQUk8xMDAgKi8KKworI2lmZGVmIElOQ0xVREVfRVBJQzEwMAorCSZlcGljMTAwX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX0VQSUMxMDAgKi8KKworI2lmZGVmIElOQ0xVREVfRk9SQ0VERVRICisJJmZvcmNlZGV0aF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9GT1JDRURFVEggKi8KKworI2lmZGVmIElOQ0xVREVfTkFUU0VNSQorCSZuYXRzZW1pX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX05BVFNFTUkgKi8KKworI2lmZGVmIElOQ0xVREVfTlM4MzgyMAorCSZuczgzODIwX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX05TODM4MjAgKi8KKworI2lmZGVmIElOQ0xVREVfTlM4MzkwCisJJm5lcGNpX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX05TODM5MCAqLworCisjaWZkZWYgSU5DTFVERV9QQ05FVDMyCisJJnBjbmV0MzJfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfUENORVQzMiAqLworCisjaWZkZWYgSU5DTFVERV9QTklDCisJJnBuaWNfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfUE5JQyAqLwogCi0JZm9yIChjaGVjayA9ICh1bmlvbiBiaW9zMzIgKikgMHhlMDAwMDsgY2hlY2sgPD0gKHVuaW9uIGJpb3MzMiAqKSAweGZmZmYwOyArK2NoZWNrKSB7Ci0JCWlmIChjaGVjay0+ZmllbGRzLnNpZ25hdHVyZSAhPSBCSU9TMzJfU0lHTkFUVVJFKQorI2lmZGVmIElOQ0xVREVfUlRMODEzOQorCSZydGw4MTM5X2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX1JUTDgxMzkgKi8KKworI2lmZGVmIElOQ0xVREVfU0lTOTAwCisJJnNpczkwMF9kcml2ZXIsCisJJnNpc19icmlkZ2VfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfU0lTOTAwICovCisKKyNpZmRlZiBJTkNMVURFX1NVTkRBTkNFCisJJnN1bmRhbmNlX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX1NVTkRBTkNFICovCisKKyNpZmRlZiBJTkNMVURFX1RHMworCSYgdGczX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX1RHMyAqLworCisjaWZkZWYgSU5DTFVERV9UTEFOCisJJnRsYW5fZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfVExBTiAqLworCisjaWZkZWYgSU5DTFVERV9UVUxJUAorCSYgdHVsaXBfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfVFVMSVAgKi8KKworI2lmZGVmIElOQ0xVREVfVklBX1JISU5FCisJJnJoaW5lX2RyaXZlciwKKyNlbmRpZi8qIElOQ0xVREVfVklBX1JISU5FICovCisKKyNpZmRlZiBJTkNMVURFX1c4OUM4NDAKKwkmdzg5Yzg0MF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9XODlDODQwICovCisKKyNpZmRlZiBJTkNMVURFX1I4MTY5CisJJnI4MTY5X2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX1I4MTY5ICovCisKKy8qIFdlIG11c3QgYmUgdGhlIGxhc3Qgb25lICovCisjaWZkZWYgSU5DTFVERV9VTkRJCisJJnVuZGlfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfVU5ESSAqLworCisJMAorfTsKKworc3RhdGljIHZvaWQgc2Nhbl9kcml2ZXJzKAorCWludCB0eXBlLCAKKwl1aW50MzJfdCBjbGFzcywgdWludDE2X3QgdmVuZG9yLCB1aW50MTZfdCBkZXZpY2UsCisJY29uc3Qgc3RydWN0IHBjaV9kcml2ZXIgKmxhc3RfZHJpdmVyLCBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBwY2lfZHJpdmVyICpza2lwX2RyaXZlciA9IGxhc3RfZHJpdmVyOworCS8qIEFzc3VtZSB0aGVyZSBpcyBvbmx5IG9uZSBtYXRjaCBvZiB0aGUgY29ycmVjdCB0eXBlICovCisJY29uc3Qgc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlcjsKKwlpbnQgaSwgajsKKwkKKwlmb3IoaiA9IDA7IHBjaV9kcml2ZXJzW2pdICE9IDA7IGorKyl7CisJCWRyaXZlciA9IHBjaV9kcml2ZXJzW2pdOworCQlpZiAoZHJpdmVyLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKLQkJbGVuZ3RoID0gY2hlY2stPmZpZWxkcy5sZW5ndGggKiAxNjsKLQkJaWYgKCFsZW5ndGgpCisJCWlmIChza2lwX2RyaXZlcikgeworCQkJaWYgKHNraXBfZHJpdmVyID09IGRyaXZlcikgCisJCQkJc2tpcF9kcml2ZXIgPSAwOwogCQkJY29udGludWU7Ci0JCXN1bSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggOyArK2kpCi0JCQlzdW0gKz0gY2hlY2stPmNoYXJzW2ldOwotCQlpZiAoc3VtICE9IDApCisJCX0KKwkJZm9yKGkgPSAwOyBpIDwgZHJpdmVyLT5pZF9jb3VudDsgaSsrKSB7CisJCQlpZiAoKHZlbmRvciA9PSBkcml2ZXItPmlkc1tpXS52ZW5kb3IpICYmCisJCQkgICAgKGRldmljZSA9PSBkcml2ZXItPmlkc1tpXS5kZXZfaWQpKSB7CisJCQkJCisJCQkJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CisJCQkJZGV2LT5uYW1lICAgPSBkcml2ZXItPmlkc1tpXS5uYW1lOworCisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJaWYgKCFjbGFzcykgeworCQlnb3RvIG91dDsKKwl9CisJZm9yKGogPSAwOyBwY2lfZHJpdmVyc1tqXSAhPSAwOyBqKyspeworCQlkcml2ZXIgPSBwY2lfZHJpdmVyc1tqXTsKKwkJaWYgKGRyaXZlci0+dHlwZSAhPSB0eXBlKQogCQkJY29udGludWU7Ci0JCWlmIChjaGVjay0+ZmllbGRzLnJldmlzaW9uICE9IDApIHsKLQkJCXByaW50ZigicGNpYmlvc19pbml0IDogdW5zdXBwb3J0ZWQgcmV2aXNpb24gJWQgYXQgJSNYLCBtYWlsIGRyZXdAY29sb3JhZG8uZWR1XG4iLAotCQkJCWNoZWNrLT5maWVsZHMucmV2aXNpb24sIGNoZWNrKTsKKwkJaWYgKHNraXBfZHJpdmVyKSB7CisJCQlpZiAoc2tpcF9kcml2ZXIgPT0gZHJpdmVyKQorCQkJCXNraXBfZHJpdmVyID0gMDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0jaWYJREVCVUcKLQkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkgIgotCQkJInN0cnVjdHVyZSBhdCAlI1hcbiIsIGNoZWNrKTsKLSNlbmRpZgotCQlpZiAoIWJpb3MzMl9lbnRyeSkgewotCQkJaWYgKGNoZWNrLT5maWVsZHMuZW50cnkgPj0gMHgxMDAwMDApIHsKLQkJCQlwcmludGYoInBjaWJpb3NfaW5pdDogZW50cnkgaW4gaGlnaCAiCi0JCQkJCSJtZW1vcnksIGdpdmluZyB1cFxuIik7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQliaW9zMzJfZW50cnkgPSBjaGVjay0+ZmllbGRzLmVudHJ5OwotI2lmCURFQlVHCi0JCQkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkiCi0JCQkJCSIgZW50cnkgYXQgJSNYXG4iLCBiaW9zMzJfZW50cnkpOwotI2VuZGlmCi0JCQkJYmlvczMyX2luZGlyZWN0LmFkZHJlc3MgPSBiaW9zMzJfZW50cnk7Ci0JCQl9CisJCWlmIChsYXN0X2RyaXZlciA9PSBkcml2ZXIpCisJCQljb250aW51ZTsKKwkJaWYgKChjbGFzcyA+PiA4KSA9PSBkcml2ZXItPmNsYXNzKSB7CisJCQlkZXYtPmRyaXZlciA9IGRyaXZlcjsKKwkJCWRldi0+bmFtZSAgID0gZHJpdmVyLT5uYW1lOworCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JaWYgKGJpb3MzMl9lbnRyeSkKLQkJY2hlY2tfcGNpYmlvcygpOworIG91dDoKKwlyZXR1cm47CiB9Ci0jZW5kaWYJLyogQ09ORklHX1BDSV9ESVJFQ1Qgbm90IGRlZmluZWQqLwogCi1zdGF0aWMgdm9pZCBzY2FuX2J1cyhzdHJ1Y3QgcGNpX2RldmljZSAqcGNpZGV2KQordm9pZCBzY2FuX3BjaV9idXMoaW50IHR5cGUsIHN0cnVjdCBwY2lfZGV2aWNlICpkZXYpCiB7Ci0JdW5zaWduZWQgaW50IGRldmZuLCBsLCBidXMsIGJ1c2VzOworCXVuc2lnbmVkIGludCBmaXJzdF9idXMsIGZpcnN0X2RldmZuOworCWNvbnN0IHN0cnVjdCBwY2lfZHJpdmVyICpmaXJzdF9kcml2ZXI7CisJdW5zaWduZWQgaW50IGRldmZuLCBidXMsIGJ1c2VzOwogCXVuc2lnbmVkIGNoYXIgaGRyX3R5cGUgPSAwOwotCXVuc2lnbmVkIHNob3J0IHZlbmRvciwgZGV2aWNlOwotCXVuc2lnbmVkIGludCBtZW1iYXNlLCBpb2FkZHIsIHJvbWFkZHI7Ci0JaW50IGksIHJlZzsKLQl1bnNpZ25lZCBpbnQgcGNpX2lvYWRkciA9IDA7Ci0KKwl1aW50MzJfdCBjbGFzczsKKwl1aW50MTZfdCB2ZW5kb3IsIGRldmljZTsKKwl1aW50MzJfdCBsLCBtZW1iYXNlLCBpb2FkZHIsIHJvbWFkZHI7CisJaW50IHJlZzsKKworCUVudGVyRnVuY3Rpb24oInNjYW5fcGNpX2J1cyIpOworCWZpcnN0X2J1cyAgICA9IDA7CisJZmlyc3RfZGV2Zm4gID0gMDsKKwlmaXJzdF9kcml2ZXIgPSAwOworCWlmIChkZXYtPmRyaXZlcikgeworCQlmaXJzdF9kcml2ZXIgPSBkZXYtPmRyaXZlcjsKKwkJZmlyc3RfYnVzICAgID0gZGV2LT5idXM7CisJCWZpcnN0X2RldmZuICA9IGRldi0+ZGV2Zm47CisJCS8qIFJlIHJlYWQgdGhlIGhlYWRlciB0eXBlIG9uIGEgcmVzdGFydCAqLworCQlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUoZmlyc3RfYnVzLCBmaXJzdF9kZXZmbiAmIH4weDcsIAorCQkJUENJX0hFQURFUl9UWVBFLCAmaGRyX3R5cGUpOworCQlkZXYtPmRyaXZlciAgPSAwOworCQlkZXYtPmJ1cyAgICAgPSAwOworCQlkZXYtPmRldmZuICAgPSAwOworCX0KKwkJCiAJLyogU2NhbiBhbGwgUENJIGJ1c2VzLCB1bnRpbCB3ZSBmaW5kIG91ciBjYXJkLgotCSAqIFdlIGNvdWxkIGJlIHNtYXJ0IG9ubHkgc2NhbiB0aGUgcmVxdWlyZWQgYnVzc2VzIGJ1dCB0aGF0CisJICogV2UgY291bGQgYmUgc21hcnQgb25seSBzY2FuIHRoZSByZXF1aXJlZCBidXNlcyBidXQgdGhhdAogCSAqIGlzIGVycm9yIHByb25lLCBhbmQgdHJpY2t5LgotCSAqIEJ5IHNjYW5uaW5nIGFsbCBwb3NzaWJsZSBwY2kgYnVzc2VzIGluIG9yZGVyIHdlIHNob3VsZCBmaW5kCisJICogQnkgc2Nhbm5pbmcgYWxsIHBvc3NpYmxlIHBjaSBidXNlcyBpbiBvcmRlciB3ZSBzaG91bGQgZmluZAogCSAqIG91ciBjYXJkIGV2ZW50dWFsbHkuIAogCSAqLwogCWJ1c2VzPTI1NjsKLQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGJ1c2VzOyArK2J1cykgewotCQlmb3IgKGRldmZuID0gMDsgZGV2Zm4gPCAweGZmOyArK2RldmZuKSB7CisJZm9yIChidXMgPSBmaXJzdF9idXM7IGJ1cyA8IGJ1c2VzOyArK2J1cykgeworCQlmb3IgKGRldmZuID0gZmlyc3RfZGV2Zm47IGRldmZuIDwgMHhmZjsgKytkZXZmbiwgZmlyc3RfZHJpdmVyID0gMCkgewogCQkJaWYgKFBDSV9GVU5DIChkZXZmbikgPT0gMCkKIAkJCQlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUoYnVzLCBkZXZmbiwgUENJX0hFQURFUl9UWVBFLCAmaGRyX3R5cGUpOwogCQkJZWxzZSBpZiAoIShoZHJfdHlwZSAmIDB4ODApKQkvKiBub3QgYSBtdWx0aS1mdW5jdGlvbiBkZXZpY2UgKi8KQEAgLTQyMSw2MSArMzAxLDkwIEBACiAJCQlwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIFBDSV9WRU5ET1JfSUQsICZsKTsKIAkJCS8qIHNvbWUgYnJva2VuIGJvYXJkcyByZXR1cm4gMCBpZiBhIHNsb3QgaXMgZW1wdHk6ICovCiAJCQlpZiAobCA9PSAweGZmZmZmZmZmIHx8IGwgPT0gMHgwMDAwMDAwMCkgewotCQkJCWhkcl90eXBlID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCXZlbmRvciA9IGwgJiAweGZmZmY7CiAJCQlkZXZpY2UgPSAobCA+PiAxNikgJiAweGZmZmY7CiAKKwkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgUENJX1JFVklTSU9OLCAmbCk7CisJCQljbGFzcyA9IChsID4+IDgpICYgMHhmZmZmZmY7CiAjaWYJREVCVUcKLQkJCXByaW50ZigiYnVzICVoaFgsIGZ1bmN0aW9uICVoaFgsIHZlbmRvciAlaFgsIGRldmljZSAlaFhcbiIsCi0JCQkJYnVzLCBkZXZmbiwgdmVuZG9yLCBkZXZpY2UpOworCQl7CisJCQlpbnQgaTsKKwkJCXByaW50ZigiJWhoeDolaGh4LiVoaHggWyVoWC8laFhdIC0tLS0gIiwKKwkJCQlidXMsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pLAorCQkJCXZlbmRvciwgZGV2aWNlKTsKKyNpZglERUJVRyA+IDEKKwkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQkJdW5zaWduZWQgY2hhciBieXRlOworCQkJCWlmICgoaSAmIDB4ZikgPT0gMCkgeworCQkJCQlwcmludGYoIiVoaHg6ICIsIGkpOworCQkJCX0KKwkJCQlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUoYnVzLCBkZXZmbiwgaSwgJmJ5dGUpOworCQkJCXByaW50ZigiJWhoeCAiLCBieXRlKTsKKwkJCQlpZiAoKGkgJiAweGYpID09IDB4ZikgeworCQkJCQlwcmludGYoIlxuIik7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJfQorI2VuZGlmCisJCQlzY2FuX2RyaXZlcnModHlwZSwgY2xhc3MsIHZlbmRvciwgZGV2aWNlLCBmaXJzdF9kcml2ZXIsIGRldik7CisJCQlpZiAoIWRldi0+ZHJpdmVyKXsKKyNpZiBERUJVRworCQkJCXByaW50ZigiTm8gZHJpdmVyIGZpdC5cbiIpOwogI2VuZGlmCi0JCQlmb3IgKGkgPSAwOyBwY2lkZXZbaV0udmVuZG9yICE9IDA7IGkrKykgewotCQkJCWlmICh2ZW5kb3IgIT0gcGNpZGV2W2ldLnZlbmRvcgotCQkJCSAgICB8fCBkZXZpY2UgIT0gcGNpZGV2W2ldLmRldl9pZCkKKwkJCQljb250aW51ZTsKKwkJCX0KKyNpZiBERUJVRworCQkJcHJpbnRmKCJHZXQgRHJpdmVyOlxuIik7CisjZW5kaWYKKwkJCWRldi0+ZGV2Zm4gPSBkZXZmbjsKKwkJCWRldi0+YnVzID0gYnVzOworCQkJZGV2LT5jbGFzcyA9IGNsYXNzOworCQkJZGV2LT52ZW5kb3IgPSB2ZW5kb3I7CisJCQlkZXYtPmRldl9pZCA9IGRldmljZTsKKwkJCQorCQkJCisJCQkvKiBHZXQgdGhlIFJPTSBiYXNlIGFkZHJlc3MgKi8KKwkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgCisJCQkJUENJX1JPTV9BRERSRVNTLCAmcm9tYWRkcik7CisJCQlyb21hZGRyID4+PSAxMDsKKwkJCWRldi0+cm9tYWRkciA9IHJvbWFkZHI7CisJCQkKKwkJCS8qIEdldCB0aGUgYGBtZW1iYXNlJycgKi8KKwkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwKKwkJCQlQQ0lfQkFTRV9BRERSRVNTXzEsICZtZW1iYXNlKTsKKwkJCWRldi0+bWVtYmFzZSA9IG1lbWJhc2U7CisJCQkJCisJCQkvKiBHZXQgdGhlIGBgaW9hZGRyJycgKi8KKwkJCWZvciAocmVnID0gUENJX0JBU0VfQUREUkVTU18wOyByZWcgPD0gUENJX0JBU0VfQUREUkVTU181OyByZWcgKz0gNCkgeworCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgcmVnLCAmaW9hZGRyKTsKKwkJCQlpZiAoKGlvYWRkciAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSykgPT0gMCB8fCAoaW9hZGRyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgPT0gMCkKIAkJCQkJY29udGludWU7Ci0JCQkJcGNpZGV2W2ldLmRldmZuID0gZGV2Zm47Ci0JCQkJcGNpZGV2W2ldLmJ1cyA9IGJ1czsKLQkJCQlmb3IgKHJlZyA9IFBDSV9CQVNFX0FERFJFU1NfMDsgcmVnIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgcmVnICs9IDQpIHsKLQkJCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCByZWcsICZpb2FkZHIpOwotCi0JCQkJCWlmICgoaW9hZGRyICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLKSA9PSAwIHx8IChpb2FkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSA9PSAwKQotCQkJCQkJY29udGludWU7Ci0JCQkJCS8qIFN0cmlwIHRoZSBJL08gYWRkcmVzcyBvdXQgb2YgdGhlIHJldHVybmVkIHZhbHVlICovCi0JCQkJCWlvYWRkciAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQkJCS8qIEdldCB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotCQkJCQlwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sCi0JCQkJCQlQQ0lfQkFTRV9BRERSRVNTXzEsICZtZW1iYXNlKTsKLQkJCQkJLyogR2V0IHRoZSBST00gYmFzZSBhZGRyZXNzICovCi0JCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgUENJX1JPTV9BRERSRVNTLCAmcm9tYWRkcik7Ci0JCQkJCXJvbWFkZHIgPj49IDEwOwotCQkJCQlwcmludGYoIkZvdW5kICVzIGF0ICUjaHgsIFJPTSBhZGRyZXNzICUjaHhcbiIsCi0JCQkJCQlwY2lkZXZbaV0ubmFtZSwgaW9hZGRyLCByb21hZGRyKTsKLQkJCQkJLyogVGFrZSB0aGUgZmlyc3Qgb25lIG9yIHRoZSBvbmUgdGhhdCBtYXRjaGVzIGluIGJvb3QgUk9NIGFkZHJlc3MgKi8KLQkJCQkJaWYgKHBjaV9pb2FkZHIgPT0gMCB8fCByb21hZGRyID09ICgodW5zaWduZWQgbG9uZykgcm9tLnJvbV9zZWdtZW50IDw8IDQpKSB7Ci0JCQkJCQlwY2lkZXZbaV0ubWVtYmFzZSA9IG1lbWJhc2U7Ci0JCQkJCQlwY2lkZXZbaV0uaW9hZGRyID0gaW9hZGRyOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQorCQkJCQorCQkJCQorCQkJCS8qIFN0cmlwIHRoZSBJL08gYWRkcmVzcyBvdXQgb2YgdGhlIHJldHVybmVkIHZhbHVlICovCisJCQkJaW9hZGRyICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwkJCQkKKwkJCQkvKiBUYWtlIHRoZSBmaXJzdCBvbmUgb3IgdGhlIG9uZSB0aGF0IG1hdGNoZXMgaW4gYm9vdCBST00gYWRkcmVzcyAqLworCQkJCWRldi0+aW9hZGRyID0gaW9hZGRyOwogCQkJfQorI2lmIERFQlVHID4gMgorCQkJcHJpbnRmKCJGb3VuZCAlcyBST00gYWRkcmVzcyAlI2h4XG4iLAorCQkJCWRldi0+bmFtZSwgcm9tYWRkcik7CisjZW5kaWYKKwkJCUxlYXZlRnVuY3Rpb24oInNjYW5fcGNpX2J1cyIpOworCQkJcmV0dXJuOwogCQl9CisJCWZpcnN0X2RldmZuID0gMDsKIAl9CisJZmlyc3RfYnVzID0gMDsKKwlMZWF2ZUZ1bmN0aW9uKCJzY2FuX3BjaV9idXMiKTsKIH0KIAotdm9pZCBldGhfcGNpX2luaXQoc3RydWN0IHBjaV9kZXZpY2UgKnBjaWRldikKLXsKLSNpZm5kZWYJQ09ORklHX1BDSV9ESVJFQ1QKLQlwY2liaW9zX2luaXQoKTsKLQlpZiAoIXBjaWJpb3NfZW50cnkpIHsKLQkJcHJpbnRmKCJwY2lfaW5pdDogbm8gQklPUzMyIGRldGVjdGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCXNjYW5fYnVzKHBjaWRldik7Ci0JLyogcmV0dXJuIHZhbHVlcyBhcmUgaW4gcGNpZGV2IHN0cnVjdHVyZXMgKi8KLX0KKwogCiAvKgogICoJU2V0IGRldmljZSB0byBiZSBhIGJ1c21hc3RlciBpbiBjYXNlIEJJT1MgbmVnbGVjdGVkIHRvIGRvIHNvLgpAQCAtNDg5LDEzICszOTgsMTM0IEBACiAJcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHAtPmJ1cywgcC0+ZGV2Zm4sIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOwogCW5ld19jb21tYW5kID0gcGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVJ8UENJX0NPTU1BTkRfSU87CiAJaWYgKHBjaV9jb21tYW5kICE9IG5ld19jb21tYW5kKSB7Ci0JCXByaW50ZigiVGhlIFBDSSBCSU9TIGhhcyBub3QgZW5hYmxlZCB0aGlzIGRldmljZSFcblVwZGF0aW5nIFBDSSBjb21tYW5kICVoWC0+JWhYLiBwY2lfYnVzICVoaFggcGNpX2RldmljZV9mbiAlaGhYXG4iLAorI2lmIERFQlVHID4gMAorCQlwcmludGYoCisJCQkiVGhlIFBDSSBCSU9TIGhhcyBub3QgZW5hYmxlZCB0aGlzIGRldmljZSFcbiIKKwkJCSJVcGRhdGluZyBQQ0kgY29tbWFuZCAlaFgtPiVoWC4gcGNpX2J1cyAlaGhYIHBjaV9kZXZpY2VfZm4gJWhoWFxuIiwKIAkJCSAgIHBjaV9jb21tYW5kLCBuZXdfY29tbWFuZCwgcC0+YnVzLCBwLT5kZXZmbik7CisjZW5kaWYKIAkJcGNpYmlvc193cml0ZV9jb25maWdfd29yZChwLT5idXMsIHAtPmRldmZuLCBQQ0lfQ09NTUFORCwgbmV3X2NvbW1hbmQpOwogCX0KIAlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUocC0+YnVzLCBwLT5kZXZmbiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CiAJaWYgKHBjaV9sYXRlbmN5IDwgMzIpIHsKLQkJcHJpbnRmKCJQQ0kgbGF0ZW5jeSB0aW1lciAoQ0ZMVCkgaXMgdW5yZWFzb25hYmx5IGxvdyBhdCAlZC4gU2V0dGluZyB0byAzMiBjbG9ja3MuXG4iLCBwY2lfbGF0ZW5jeSk7CisjaWYgREVCVUcgPiAwCisJCXByaW50ZigiUENJIGxhdGVuY3kgdGltZXIgKENGTFQpIGlzIHVucmVhc29uYWJseSBsb3cgYXQgJWQuIFNldHRpbmcgdG8gMzIgY2xvY2tzLlxuIiwgCisJCQlwY2lfbGF0ZW5jeSk7CisjZW5kaWYKIAkJcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZShwLT5idXMsIHAtPmRldmZuLCBQQ0lfTEFURU5DWV9USU1FUiwgMzIpOwogCX0KIH0KKworLyoKKyAqIEZpbmQgdGhlIHN0YXJ0IG9mIGEgcGNpIHJlc291cmNlLgorICovCit1bnNpZ25lZCBsb25nIHBjaV9iYXJfc3RhcnQoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXVpbnQzMl90IGxvLCBoaTsKKwl1bnNpZ25lZCBsb25nIGJhcjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpbmRleCwgJmxvKTsKKwlpZiAobG8gJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7CisJCWJhciA9IGxvICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCX0gZWxzZSB7CisJCWJhciA9IDA7CisJCWlmICgobG8gJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spID09IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGluZGV4ICsgNCwgJmhpKTsKKwkJCWlmIChoaSkgeworCQkJCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPiBzaXplb2YodWludDMyX3QpKSB7CisJCQkJCWJhciA9IGhpOworCQkJCQkvKiBJdCdzIFJFQUxMWSBpbnRlcmVzdGluZzotKSAqLworCQkJCQliYXIgPDw9MzI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwcmludGYoIlVuaGFuZGxlZCA2NGJpdCBCQVJcbiIpOworCQkJCQlyZXR1cm4gLTFVTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYmFyIHw9IGxvICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwl9CisJcmV0dXJuIGJhciArIHBjaWJpb3NfYnVzX2Jhc2UoZGV2LT5idXMpOworfQorCisvKgorICogRmluZCB0aGUgc2l6ZSBvZiBhIHBjaSByZXNvdXJjZS4KKyAqLwordW5zaWduZWQgbG9uZyBwY2lfYmFyX3NpemUoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJhcikKK3sKKwl1aW50MzJfdCBzdGFydCwgc2l6ZTsKKwkvKiBTYXZlIHRoZSBvcmlnaW5hbCBiYXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBiYXIsICZzdGFydCk7CisJLyogQ29tcHV0ZSB3aGljaCBiaXRzIGNhbiBiZSBzZXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgYmFyLCB+MCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgYmFyLCAmc2l6ZSk7CisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBiYXIsIHN0YXJ0KTsKKwkvKiBGaW5kIHRoZSBzaWduaWZpY2FudCBiaXRzICovCisJaWYgKHN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgeworCQlzaXplICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwl9IGVsc2UgeworCQlzaXplICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJfQorCS8qIEZpbmQgdGhlIGxvd2VzdCBiaXQgc2V0ICovCisJc2l6ZSA9IHNpemUgJiB+KHNpemUgLSAxKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoqCisgKiBwY2lfZmluZF9jYXBhYmlsaXR5IC0gcXVlcnkgZm9yIGRldmljZXMnIGNhcGFiaWxpdGllcyAKKyAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKKyAqIEBjYXA6IGNhcGFiaWxpdHkgY29kZQorICoKKyAqIFRlbGwgaWYgYSBkZXZpY2Ugc3VwcG9ydHMgYSBnaXZlbiBQQ0kgY2FwYWJpbGl0eS4KKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlcXVlc3RlZCBjYXBhYmlsaXR5IHN0cnVjdHVyZSB3aXRoaW4gdGhlCisgKiBkZXZpY2UncyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvciAwIGluIGNhc2UgdGhlIGRldmljZSBkb2VzIG5vdAorICogc3VwcG9ydCBpdC4gIFBvc3NpYmxlIHZhbHVlcyBmb3IgQGNhcDoKKyAqCisgKiAgJVBDSV9DQVBfSURfUE0gICAgICAgICAgIFBvd2VyIE1hbmFnZW1lbnQgCisgKgorICogICVQQ0lfQ0FQX0lEX0FHUCAgICAgICAgICBBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0IAorICoKKyAqICAlUENJX0NBUF9JRF9WUEQgICAgICAgICAgVml0YWwgUHJvZHVjdCBEYXRhIAorICoKKyAqICAlUENJX0NBUF9JRF9TTE9USUQgICAgICAgU2xvdCBJZGVudGlmaWNhdGlvbiAKKyAqCisgKiAgJVBDSV9DQVBfSURfTVNJICAgICAgICAgIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMKKyAqCisgKiAgJVBDSV9DQVBfSURfQ0hTV1AgICAgICAgIENvbXBhY3RQQ0kgSG90U3dhcCAKKyAqLworaW50IHBjaV9maW5kX2NhcGFiaWxpdHkoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgaW50IGNhcCkKK3sKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDhfdCBwb3MsIGlkOworCXVpbnQ4X3QgaGRyX3R5cGU7CisJaW50IHR0bCA9IDQ4OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAoIShzdGF0dXMgJiBQQ0lfU1RBVFVTX0NBUF9MSVNUKSkKKwkJcmV0dXJuIDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7CisJc3dpdGNoIChoZHJfdHlwZSAmIDB4N0YpIHsKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9OT1JNQUw6CisJY2FzZSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOgorCWRlZmF1bHQ6CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBUEFCSUxJVFlfTElTVCwgJnBvcyk7CisJCWJyZWFrOworCWNhc2UgUENJX0hFQURFUl9UWVBFX0NBUkRCVVM6CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NCX0NBUEFCSUxJVFlfTElTVCwgJnBvcyk7CisJCWJyZWFrOworCX0KKwl3aGlsZSAodHRsLS0gJiYgcG9zID49IDB4NDApIHsKKwkJcG9zICY9IH4zOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHBvcyArIFBDSV9DQVBfTElTVF9JRCwgJmlkKTsKKyNpZglERUJVRyA+IDAKKwkJcHJpbnRmKCJDYXBhYmlsaXR5OiAlZFxuIiwgaWQpOworI2VuZGlmCisJCWlmIChpZCA9PSAweGZmKQorCQkJYnJlYWs7CisJCWlmIChpZCA9PSBjYXApCisJCQlyZXR1cm4gcG9zOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHBvcyArIFBDSV9DQVBfTElTVF9ORVhULCAmcG9zKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKSW5kZXg6IGIvbmV0Ym9vdC9wY2kuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvcGNpLmgKKysrIGIvbmV0Ym9vdC9wY2kuaApAQCAtMSw0ICsxLDQgQEAKLSNpZm5kZWYJUENJX0gKKyNpZiAhZGVmaW5lZChQQ0lfSCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQogI2RlZmluZSBQQ0lfSAogCiAvKgpAQCAtMjEsMTAgKzIxLDE5IEBACiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2luY2x1ZGUgInBjaV9pZHMuaCIKKwogI2RlZmluZSBQQ0lfQ09NTUFORF9JTwkJCTB4MQkvKiBFbmFibGUgcmVzcG9uc2UgaW4gSS9PIHNwYWNlICovCiAjZGVmaW5lIFBDSV9DT01NQU5EX01FTQkJCTB4MgkvKiBFbmFibGUgcmVzcG9uc2UgaW4gbWVtIHNwYWNlICovCiAjZGVmaW5lIFBDSV9DT01NQU5EX01BU1RFUgkJMHg0CS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCiAjZGVmaW5lIFBDSV9MQVRFTkNZX1RJTUVSCQkweDBkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfQ09NTUFORF9TUEVDSUFMCQkweDgJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNwZWNpYWwgY3ljbGVzICovCisjZGVmaW5lIFBDSV9DT01NQU5EX0lOVkFMSURBVEUJCTB4MTAJLyogVXNlIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfVkdBX1BBTEVUVEUgMHgyMAkvKiBFbmFibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfUEFSSVRZCTB4NDAJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfV0FJVCAJMHg4MAkvKiBFbmFibGUgYWRkcmVzcy9kYXRhIHN0ZXBwaW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9TRVJSCTB4MTAwCS8qIEVuYWJsZSBTRVJSICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9GQVNUX0JBQ0sJMHgyMDAJLyogRW5hYmxlIGJhY2stdG8tYmFjayB3cml0ZXMgKi8KIAogI2RlZmluZSBQQ0lCSU9TX1BDSV9GVU5DVElPTl9JRCAgICAgICAgIDB4YjFYWAogI2RlZmluZSBQQ0lCSU9TX1BDSV9CSU9TX1BSRVNFTlQgICAgICAgIDB4YjEwMQpAQCAtNDIsMTAgKzUxLDM3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSUQgICAgICAgICAgIDB4MDIgICAgLyogMTYgYml0cyAqLwogI2RlZmluZSBQQ0lfQ09NTUFORCAgICAgICAgICAgICAweDA0ICAgIC8qIDE2IGJpdHMgKi8KIAorI2RlZmluZSBQQ0lfU1RBVFVTCQkweDA2CS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfQ0FQX0xJU1QJMHgxMAkvKiBTdXBwb3J0IENhcGFiaWxpdHkgTGlzdCAqLworI2RlZmluZSAgUENJX1NUQVRVU182Nk1IWgkweDIwCS8qIFN1cHBvcnQgNjYgTWh6IFBDSSAyLjEgYnVzICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1VERgkJMHg0MAkvKiBTdXBwb3J0IFVzZXIgRGVmaW5hYmxlIEZlYXR1cmVzIFtvYnNvbGV0ZV0gKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfRkFTVF9CQUNLCTB4ODAJLyogQWNjZXB0IGZhc3QtYmFjayB0byBiYWNrICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1BBUklUWQkweDEwMAkvKiBEZXRlY3RlZCBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01BU0sJMHg2MDAJLyogREVWU0VMIHRpbWluZyAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfRkFTVAkweDAwMAkKKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01FRElVTSAweDIwMAorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfU0xPVyAweDQwMAorI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIDB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCAweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiAweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KKwogI2RlZmluZSBQQ0lfUkVWSVNJT04gICAgICAgICAgICAweDA4ICAgIC8qIDggYml0cyAgKi8KKyNkZWZpbmUgUENJX1JFVklTSU9OX0lEICAgICAgICAgMHgwOCAgICAvKiA4IGJpdHMgICovCisjZGVmaW5lIFBDSV9DTEFTU19SRVZJU0lPTiAgICAgIDB4MDggICAgLyogMzIgYml0cyAgKi8KICNkZWZpbmUgUENJX0NMQVNTX0NPREUgICAgICAgICAgMHgwYiAgICAvKiA4IGJpdHMgKi8KICNkZWZpbmUgUENJX1NVQkNMQVNTX0NPREUgICAgICAgMHgwYSAgICAvKiA4IGJpdHMgKi8KICNkZWZpbmUgUENJX0hFQURFUl9UWVBFICAgICAgICAgMHgwZSAgICAvKiA4IGJpdHMgKi8KKyNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9OT1JNQUwJMAorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRSAxCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUyAyCisKKworLyogSGVhZGVyIHR5cGUgMCAobm9ybWFsIGRldmljZXMpICovCisjZGVmaW5lIFBDSV9DQVJEQlVTX0NJUwkJMHgyOAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRAkweDJjCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSUQJMHgyZSAgCiAKICNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wICAgICAgMHgxMCAgICAvKiAzMiBiaXRzICovCiAjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMSAgICAgIDB4MTQgICAgLyogMzIgYml0cyAqLwpAQCAtNTQsMTUgKzkwLDE1NSBAQAogI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzQgICAgICAweDIwICAgIC8qIDMyIGJpdHMgKi8KICNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181ICAgICAgMHgyNCAgICAvKiAzMiBiaXRzICovCiAKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLIDB4MDYKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8zMgkweDAwCS8qIDMyIGJpdCBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQJMHgwNAkvKiA2NCBiaXQgYWRkcmVzcyAqLworCiAjaWZuZGVmCVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwogI2RlZmluZQlQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgICAgICAgKH4weDAzKQogI2VuZGlmCisjaWZuZGVmCVBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0sKKyNkZWZpbmUJUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyAgICAgICAofjB4MGYpCisjZW5kaWYKICNkZWZpbmUJUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTwkweDAxCiAjZGVmaW5lCVBDSV9ST01fQUREUkVTUwkJMHgzMAkvKiAzMiBiaXRzICovCiAjZGVmaW5lCVBDSV9ST01fQUREUkVTU19FTkFCTEUJMHgwMQkvKiBXcml0ZSAxIHRvIGVuYWJsZSBST00sCiAJCQkJCSAgIGJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLAogCQkJCQkgICAxMC4uMiBhcmUgcmVzZXJ2ZWQgKi8KIAorI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9MSVNUCTB4MzQJLyogT2Zmc2V0IG9mIGZpcnN0IGNhcGFiaWxpdHkgbGlzdCBlbnRyeSAqLworCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfTElORQkweDNjCS8qIElSUSBudW1iZXIgKDAtMTUpICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogSVJRIHBpbiBvbiBQQ0kgYnVzIChBLUQpICovCisKKy8qIEhlYWRlciB0eXBlIDEgKFBDSS10by1QQ0kgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQlVTCQkweDE4CS8qIFByaW1hcnkgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfU0VDT05EQVJZX0JVUwkweDE5CS8qIFNlY29uZGFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBIaWdoZXN0IGJ1cyBudW1iZXIgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX1NFQ19MQVRFTkNZX1RJTUVSCTB4MWIJLyogTGF0ZW5jeSB0aW1lciBmb3Igc2Vjb25kYXJ5IGludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfSU9fQkFTRQkJMHgxYwkvKiBJL08gcmFuZ2UgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0lPX0xJTUlUCQkweDFkCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLCTB4MGYJLyogSS9PIGJyaWRnaW5nIHR5cGUgKi8KKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFXzE2CTB4MDAKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFXzMyCTB4MDEKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9NQVNLCX4weDBmCisjZGVmaW5lIFBDSV9TRUNfU1RBVFVTCQkweDFlCS8qIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIsIG9ubHkgYml0IDE0IHVzZWQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9CQVNFCQkweDIwCS8qIE1lbW9yeSByYW5nZSBiZWhpbmQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9MSU1JVAkweDIyCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX1RZUEVfTUFTSyAweDBmCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1BSRUZfTUVNT1JZX0JBU0UJMHgyNAkvKiBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfTElNSVQJMHgyNgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV9NQVNLIDB4MGYKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfMzIJMHgwMAorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV82NAkweDAxCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9NQVNLCX4weDBmCisjZGVmaW5lIFBDSV9QUkVGX0JBU0VfVVBQRVIzMgkweDI4CS8qIFVwcGVyIGhhbGYgb2YgcHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZSAqLworI2RlZmluZSBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyCTB4MmMKKyNkZWZpbmUgUENJX0lPX0JBU0VfVVBQRVIxNgkweDMwCS8qIFVwcGVyIGhhbGYgb2YgSS9PIGFkZHJlc3NlcyAqLworI2RlZmluZSBQQ0lfSU9fTElNSVRfVVBQRVIxNgkweDMyCisvKiAweDM0IHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKy8qIDB4MzUtMHgzYiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MxCTB4MzgJLyogU2FtZSBhcyBQQ0lfUk9NX0FERFJFU1MsIGJ1dCBmb3IgaHR5cGUgMSAqLworLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBFbmFibGUgcGFyaXR5IGRldGVjdGlvbiBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9TRVJSCTB4MDIJLyogVGhlIHNhbWUgZm9yIFNFUlIgZm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTk9fSVNBCTB4MDQJLyogRGlzYWJsZSBicmlkZ2luZyBvZiBJU0EgcG9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1ZHQQkweDA4CS8qIEZvcndhcmQgVkdBIGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUIDB4MjAgIC8qIFJlcG9ydCBtYXN0ZXIgYWJvcnRzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9CVVNfUkVTRVQgMHg0MAkvKiBTZWNvbmRhcnkgYnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9GQVNUX0JBQ0sgMHg4MAkvKiBGYXN0IEJhY2syQmFjayBlbmFibGVkIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBQQ0lfQ0JfQ0FQQUJJTElUWV9MSVNUCTB4MTQKKworLyogQ2FwYWJpbGl0eSBsaXN0cyAqLworCisjZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCisjZGVmaW5lIFBDSV9DQVBfTElTVF9ORVhUCTEJLyogTmV4dCBjYXBhYmlsaXR5IGluIHRoZSBsaXN0ICovCisjZGVmaW5lIFBDSV9DQVBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0eSBkZWZpbmVkIGZsYWdzICgxNiBiaXRzKSAqLworI2RlZmluZSBQQ0lfQ0FQX1NJWkVPRgkJNAorCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9QTV9QTUMgICAgICAgICAgICAgIDIgICAgICAgLyogUE0gQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1ZFUl9NQVNLCTB4MDAwNwkvKiBWZXJzaW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9DTE9DSwkweDAwMDgJLyogUE1FIGNsb2NrIHJlcXVpcmVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1JFU0VSVkVEICAgIDB4MDAxMCAgLyogUmVzZXJ2ZWQgZmllbGQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRFNJCQkweDAwMjAJLyogRGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0FVWF9QT1dFUgkweDAxQzAJLyogQXV4aWxsaWFyeSBwb3dlciBzdXBwb3J0IG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDEJCTB4MDIwMAkvKiBEMSBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QyCQkweDA0MDAJLyogRDIgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUUJCTB4MDgwMAkvKiBQTUUgcGluIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfTUFTSyAgICAweEY4MDAgIC8qIFBNRSBNYXNrIG9mIGFsbCBzdXBwb3J0ZWQgc3RhdGVzICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMCAgICAgIDB4MDgwMCAgLyogUE1FIyBmcm9tIEQwICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMSAgICAgIDB4MTAwMCAgLyogUE1FIyBmcm9tIEQxICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMiAgICAgIDB4MjAwMCAgLyogUE1FIyBmcm9tIEQyICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMyAgICAgIDB4NDAwMCAgLyogUE1FIyBmcm9tIEQzIChob3QpICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQgIDB4ODAwMCAgLyogUE1FIyBmcm9tIEQzIChjb2xkKSAqLworI2RlZmluZSBQQ0lfUE1fQ1RSTAkJNAkvKiBQTSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1NUQVRFX01BU0sJMHgwMDAzCS8qIEN1cnJlbnQgcG93ZXIgc3RhdGUgKEQwIHRvIEQzKSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX0VOQUJMRQkweDAxMDAJLyogUE1FIHBpbiBlbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0VMX01BU0sJMHgxZTAwCS8qIERhdGEgc2VsZWN0ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0NBTEVfTUFTSwkweDYwMDAJLyogRGF0YSBzY2FsZSAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTCTB4ODAwMAkvKiBQTUUgcGluIHN0YXR1cyAqLworI2RlZmluZSBQQ0lfUE1fUFBCX0VYVEVOU0lPTlMJNgkvKiBQUEIgc3VwcG9ydCBleHRlbnNpb25zICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9QUEJfQjJfQjMJMHg0MAkvKiBTdG9wIGNsb2NrIHdoZW4gaW4gRDNob3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0JQQ0NfRU5BQkxFCTB4ODAJLyogQnVzIHBvd2VyL2Nsb2NrIGNvbnRyb2wgZW5hYmxlICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX0RBVEFfUkVHSVNURVIJNwkvKiAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9TSVpFT0YJCTgKKworLyogQUdQIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9BR1BfVkVSU0lPTgkJMgkvKiBCQ0QgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0FHUF9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9BR1BfU1RBVFVTCQk0CS8qIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUlFfTUFTSwkweGZmMDAwMDAwCS8qIE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIC0gMSAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfNjRCSVQJMHgwMDIwCS8qIDY0LWJpdCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfRlcJMHgwMDEwCS8qIEZXIHRyYW5zZmVycyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEU0CTB4MDAwNAkvKiA0eCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTIJMHgwMDAyCS8qIDJ4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMQkweDAwMDEJLyogMXggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX0FHUF9DT01NQU5ECQk4CS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SUV9NQVNLIDB4ZmYwMDAwMDAgIC8qIE1hc3RlcjogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3NpbmcgZW5hYmxlZCAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0FHUAkweDAxMDAJLyogQWxsb3cgcHJvY2Vzc2luZyBvZiBBR1AgdHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfNjRCSVQJMHgwMDIwIAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9GVwkweDAwMTAgCS8qIEZvcmNlIEZXIHRyYW5zZmVycyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEU0CTB4MDAwNAkvKiBVc2UgNHggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUyCTB4MDAwMgkvKiBVc2UgMnggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUxCTB4MDAwMQkvKiBVc2UgMXggcmF0ZSAqLworI2RlZmluZSBQQ0lfQUdQX1NJWkVPRgkJMTIKKworLyogU2xvdCBJZGVudGlmaWNhdGlvbiAqLworCisjZGVmaW5lIFBDSV9TSURfRVNSCQkyCS8qIEV4cGFuc2lvbiBTbG90IFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9OU0xPVFMJMHgxZgkvKiBOdW1iZXIgb2YgZXhwYW5zaW9uIHNsb3RzIGF2YWlsYWJsZSAqLworI2RlZmluZSAgUENJX1NJRF9FU1JfRklDCTB4MjAJLyogRmlyc3QgSW4gQ2hhc3NpcyBGbGFnICovCisjZGVmaW5lIFBDSV9TSURfQ0hBU1NJU19OUgkzCS8qIENoYXNzaXMgTnVtYmVyICovCisKKy8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX01TSV9GTEFHUwkJMgkvKiBWYXJpb3VzIGZsYWdzICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTXzY0QklUCTB4ODAJLyogNjQtYml0IGFkZHJlc3NlcyBhbGxvd2VkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX1FTSVpFCTB4NzAJLyogTWVzc2FnZSBxdWV1ZSBzaXplIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUU1BU0sJMHgwZQkvKiBNYXhpbXVtIHF1ZXVlIHNpemUgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX0VOQUJMRQkweDAxCS8qIE1TSSBmZWF0dXJlIGVuYWJsZWQgKi8KKyNkZWZpbmUgUENJX01TSV9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9NU0lfQUREUkVTU19MTwk0CS8qIExvd2VyIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0hJCTgJLyogVXBwZXIgMzIgYml0cyAoaWYgUENJX01TSV9GTEFHU182NEJJVCBzZXQpICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV8zMgkJOAkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDMyLWJpdCBkZXZpY2VzICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV82NAkJMTIJLyogMTYgYml0cyBvZiBkYXRhIGZvciA2NC1iaXQgZGV2aWNlcyAqLworCisjZGVmaW5lIFBDSV9TTE9UKGRldmZuKQkJICAoKGRldmZuKSA+PiAzKQogI2RlZmluZSBQQ0lfRlVOQyhkZXZmbikgICAgICAgICAgICgoZGV2Zm4pICYgMHgwNykKIAogI2RlZmluZSBCSU9TMzJfU0lHTkFUVVJFICAgICAgICAoKCdfJyA8PCAwKSArICgnMycgPDwgOCkgKyAoJzInIDw8IDE2KSArICgnXycgPDwgMjQpKQpAQCAtODUsMTA4ICsyNjEsOTcgQEAKIAljaGFyIGNoYXJzWzE2XTsKIH07CiAKLSNkZWZpbmUgS0VSTl9DT0RFX1NFRwkweDgJLyogVGhpcyBfTVVTVF8gbWF0Y2ggc3RhcnQuUyAqLwotCi0vKiBTdHVmZiBmb3IgYXNtICovCi0jZGVmaW5lIHNhdmVfZmxhZ3MoeCkgXAotX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmbCA7IHBvcGwgJTAiOiI9ZyIgKHgpOiAvKiBubyBpbnB1dCAqLyA6Im1lbW9yeSIpCi0KLSNkZWZpbmUgY2xpKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkiOiA6IDoibWVtb3J5IikKLQotI2RlZmluZSByZXN0b3JlX2ZsYWdzKHgpIFwKLV9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNobCAlMCA7IHBvcGZsIjogLyogbm8gb3V0cHV0ICovIDoiZyIgKHgpOiJtZW1vcnkiKQotCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQURNVEVLICAgICAgICAgICAgMHgxMzE3Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURNVEVLXzA5ODUgICAgICAgMHgwOTg1Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfUkVBTFRFSyAgICAgICAgICAgMHgxMGVjCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MDI5ICAgICAgMHg4MDI5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5ICAgICAgMHg4MTM5Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfV0lOQk9ORDIgICAgICAgICAgMHgxMDUwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDOTQwICAgMHgwOTQwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDODQwICAgMHgwODQwCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEVYICAgICAgICAgICAgMHgxMWY2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMjAwMCAgICAgMHgxNDAxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMTAwQVRYICAgMHgyMDExCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfS1RJICAgICAgICAgICAgICAgMHg4ZTJlCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfS1RJX0VUMzJQMiAgICAgICAgMHgzMDAwCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUVklOICAgICAgICAgICAgMHg0YTE0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVUVklOX05WNTAwMFNDICAgMHg1MDAwCi0jZGVmaW5lCVBDSV9WRU5ET1JfSURfSE9MVEVLCQkweDEyYzMKLSNkZWZpbmUJUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMgkweDAwNTgKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zQ09NCQkweDEwYjcKLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTkwCTB4NTkwMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTUJMHg1OTUwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xCTB4NTk1MQotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMgkweDU5NTIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwVFBPCTB4OTAwMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTwkweDkwMDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VFgJMHg5MDUwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0CTB4OTA1MQotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVCX1RYCTB4OTA1NQotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVDX1RYTQkweDkyMDAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFTAkJMHg4MDg2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcJMHgxMjI5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUgkweDEyMDkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMjkJMHgxMDI5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwCTB4MTAzMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTYyCTB4MjQ0OQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNRAkJMHgxMDIyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFCQkweDIwMDAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTURfSE9NRVBOQQkweDEwMjIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfSE9NRVBOQQkweDIwMDEKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUNfMTIxMSAgICAgICAgICAweDExMTMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TTUNfMTIxMSAgICAgICAgICAweDEyMTEKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ERUMJCTB4MTAxMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUAkJMHgwMDAyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QJMHgwMDA5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMJMHgwMDE0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyCQkweDAwMTkKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUMJCTB4MTBCOAotI2lmbmRlZglQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwCi0jIGRlZmluZSBQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwCTB4MDAwNQotI2VuZGlmCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfTUFDUk9OSVgJCTB4MTBkOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01YOTg3eDUJCTB4MDUzMQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xJTktTWVMJCTB4MTFBRAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xDODJDMTE1CQkweEMxMTUKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSUFURUMJCTB4MTEwNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JCTB4MzA0MwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDIJMHgzMDY1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2QzEwMEEJMHg2MTAwCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfREFWSUNPTQkJMHgxMjgyCi0jZGVmaW5lCVBDSV9ERVZJQ0VfSURfRE05MDA5CQkweDkwMDkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ETTkxMDIJCTB4OTEwMgotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM5MDAgICAgIAkweDA5MDAgICAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM3MDE2ICAgIAkweDcwMTYgIAotI2RlZmluZQlQQ0lfVkVORE9SX0lEX0RMSU5LCQkweDExODYKLSNkZWZpbmUJUENJX0RFVklDRV9JRF9ERkU1MzBUWFAJCTB4MTMwMAotI2RlZmluZQlQQ0lfVkVORE9SX0lEX05TCQkweDEwMEIKLSNkZWZpbmUJUENJX0RFVklDRV9JRF9EUDgzODE1CQkweDAwMjAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PTElDT00JCTB4MTA4ZAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzMxMzYJMHgwMDAxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMxNQkweDAwMTEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CTB4MDAxMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJMHgwMDEzCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkweDAwMTQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0M2MTUxCTB4MDAyMQorc3RydWN0IHBjaV9kZXZpY2U7CitzdHJ1Y3QgZGV2OwordHlwZWRlZiBpbnQgKCpwY2lfcHJvYmVfdCkoc3RydWN0IGRldiAqLCBzdHJ1Y3QgcGNpX2RldmljZSAqKTsKIAogc3RydWN0IHBjaV9kZXZpY2UgewotCXVuc2lnbmVkIHNob3J0CXZlbmRvciwgZGV2X2lkOwotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JdW5zaWduZWQgaW50CW1lbWJhc2U7Ci0JdW5zaWduZWQgc2hvcnQJaW9hZGRyOwotCXVuc2lnbmVkIGNoYXIJZGV2Zm47Ci0JdW5zaWduZWQgY2hhcglidXM7CisJdWludDMyX3QJCWNsYXNzOworCXVpbnQxNl90CQl2ZW5kb3IsIGRldl9pZDsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwkvKiBtZW1iYXNlIGFuZCBpb2FkZHIgYXJlIHNpbGx5IGFuZCBkZXByaWNhdGVkICovCisJdW5zaWduZWQgaW50CQltZW1iYXNlOworCXVuc2lnbmVkIGludAkJaW9hZGRyOworCXVuc2lnbmVkIGludAkJcm9tYWRkcjsKKwl1bnNpZ25lZCBjaGFyCQlpcnE7CisJdW5zaWduZWQgY2hhcgkJZGV2Zm47CisJdW5zaWduZWQgY2hhcgkJYnVzOworCXVuc2lnbmVkIGNoYXIJCXVzZV9zcGVjaWZpZWQ7CisJY29uc3Qgc3RydWN0IHBjaV9kcml2ZXIJKmRyaXZlcjsKK307CisKK2V4dGVybiB2b2lkIHNjYW5fcGNpX2J1cyhpbnQgdHlwZSwgc3RydWN0IHBjaV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBmaW5kX3BjaShpbnQgdHlwZSwgc3RydWN0IHBjaV9kZXZpY2UgKmRldik7CisKK2V4dGVybiBpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCAqdmFsdWUpOworZXh0ZXJuIGludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQ4X3QgdmFsdWUpOworZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX3dvcmQodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCAqdmFsdWUpOworZXh0ZXJuIGludCBwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQxNl90IHZhbHVlKTsKK2V4dGVybiBpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZCh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90ICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDMyX3QgdmFsdWUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpYmlvc19idXNfYmFzZSh1bnNpZ25lZCBpbnQgYnVzKTsKK2V4dGVybiB2b2lkIGFkanVzdF9wY2lfZGV2aWNlKHN0cnVjdCBwY2lfZGV2aWNlICpwKTsKKworCitzdGF0aWMgaW5saW5lIGludCAKK3BjaV9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCAqdmFsdWUpCit7CisJcmV0dXJuIHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCB2YWx1ZSkKK3sKKwlyZXR1cm4gcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZShkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCAqdmFsdWUpCit7CisJcmV0dXJuIHBjaWJpb3NfcmVhZF9jb25maWdfd29yZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3dyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDE2X3QgdmFsdWUpCit7CisJcmV0dXJuIHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQoZGV2LT5idXMsIGRldi0+ZGV2Zm4sIHdoZXJlLCB2YWx1ZSk7Cit9CitzdGF0aWMgaW5saW5lIGludCAKK3BjaV9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90IHZhbHVlKQoreworCXJldHVybiBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9ucyB0byBmaW5kIHRoZSBzaXplIG9mIGEgcGNpIGJhciAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9zdGFydChzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYmFyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9iYXJfc2l6ZShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYmFyKTsKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIHBjaSBjYXBhYmlsaXRpZXMgKi8KK2V4dGVybiBpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCBpbnQgY2FwKTsKK3N0cnVjdCBwY2lfaWQgeworCXVuc2lnbmVkIHNob3J0IHZlbmRvciwgZGV2X2lkOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgZGV2OworLyogTW9zdCBwY2kgZHJpdmVycyB3aWxsIHVzZSB0aGlzICovCitzdHJ1Y3QgcGNpX2RyaXZlciB7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwlwY2lfcHJvYmVfdCBwcm9iZTsKKwlzdHJ1Y3QgcGNpX2lkICppZHM7CisJaW50IGlkX2NvdW50OworCisvKiBPbiBhIGZldyBvY2Nhc2lvbnMgdGhlIGhhcmR3YXJlIGlzIHN0YW5kYXJkaXplZCBlbm91Z2ggdGhhdAorICogd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlIGNsYXNzIG9mIHRoZSBkZXZpY2UgYW5kIG5vdCB0aGUgZXhhY3QKKyAqIHR5cGUgdG8gZHJpdmUgdGhlIGRldmljZSBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIHRoZSBjYXNlCisgKiBzZXQgYSBjbGFzcyB2YWx1ZSBvdGhlciB0aGFuIDAuCisgKi8KKwl1bnNpZ25lZCBzaG9ydCBjbGFzczsKIH07CiAKLWV4dGVybiB2b2lkCWV0aF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2RldmljZSAqKTsKKyNkZWZpbmUgUENJX1JPTShWRU5ET1JfSUQsIERFVklDRV9JRCwgSU1BR0UsIERFU0NSSVBUSU9OKSBcCisJeyBWRU5ET1JfSUQsIERFVklDRV9JRCwgSU1BR0UsIH0KIAotZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyICp2YWx1ZSk7Ci1leHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciB2YWx1ZSk7Ci1leHRlcm4gaW50IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOwotZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50IHZhbHVlKTsKLXZvaWQgYWRqdXN0X3BjaV9kZXZpY2Uoc3RydWN0IHBjaV9kZXZpY2UgKnApOwogI2VuZGlmCS8qIFBDSV9IICovCkluZGV4OiBiL25ldGJvb3QvcGNpX2lkcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3BjaV9pZHMuaApAQCAtMCwwICsxLDE4MDkgQEAKKy8qCisgKglQQ0kgQ2xhc3MsIFZlbmRvciBhbmQgRGV2aWNlIElEcworICoKKyAqCVBsZWFzZSBrZWVwIHNvcnRlZC4KKyAqLworCisvKiBEZXZpY2UgY2xhc3NlcyBhbmQgc3ViY2xhc3NlcyAqLworCisjZGVmaW5lIFBDSV9DTEFTU19OT1RfREVGSU5FRAkJMHgwMDAwCisjZGVmaW5lIFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EJMHgwMDAxCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU1RPUkFHRQkJMHgwMQorI2RlZmluZSBQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJCQkweDAxMDAKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfSURFCQkweDAxMDEKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfRkxPUFBZCTB4MDEwMgorI2RlZmluZSBQQ0lfQ0xBU1NfU1RPUkFHRV9JUEkJCTB4MDEwMworI2RlZmluZSBQQ0lfQ0xBU1NfU1RPUkFHRV9SQUlECQkweDAxMDQKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfT1RIRVIJCTB4MDE4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX05FVFdPUksJCTB4MDIKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQJMHgwMjAwCisjZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX1RPS0VOX1JJTkcJMHgwMjAxCisjZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX0ZEREkJCTB4MDIwMgorI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19BVE0JCTB4MDIwMworI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUgkJMHgwMjgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfRElTUExBWQkJMHgwMworI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EJCTB4MDMwMAorI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9YR0EJCTB4MDMwMQorI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV8zRAkJMHgwMzAyCisjZGVmaW5lIFBDSV9DTEFTU19ESVNQTEFZX09USEVSCQkweDAzODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19NVUxUSU1FRElBCTB4MDQKKyNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfVklERU8JMHgwNDAwCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPCTB4MDQwMQorI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9QSE9ORQkweDA0MDIKKyNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfT1RIRVIJMHgwNDgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfTUVNT1JZCQkweDA1CisjZGVmaW5lIFBDSV9DTEFTU19NRU1PUllfUkFNCQkweDA1MDAKKyNkZWZpbmUgUENJX0NMQVNTX01FTU9SWV9GTEFTSAkJMHgwNTAxCisjZGVmaW5lIFBDSV9DTEFTU19NRU1PUllfT1RIRVIJCTB4MDU4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0JSSURHRQkJMHgwNgorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QJCTB4MDYwMAorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0lTQQkJMHgwNjAxCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfRUlTQQkJMHgwNjAyCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfTUMJCTB4MDYwMworI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQkJMHgwNjA0CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENNQ0lBCQkweDA2MDUKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9OVUJVUwkJMHgwNjA2CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfQ0FSREJVUwkweDA2MDcKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9SQUNFV0FZCTB4MDYwOAorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX09USEVSCQkweDA2ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19DT01NVU5JQ0FUSU9OCTB4MDcKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMCTB4MDcwMAorI2RlZmluZSBQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9QQVJBTExFTCAweDA3MDEKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fTVVMVElTRVJJQUwgMHgwNzAyCisjZGVmaW5lIFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX01PREVNCTB4MDcwMworI2RlZmluZSBQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9PVEhFUgkweDA3ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19TWVNURU0JCTB4MDgKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9QSUMJCTB4MDgwMAorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX0RNQQkJMHgwODAxCisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fVElNRVIJCTB4MDgwMgorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1JUQwkJMHgwODAzCisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fUENJX0hPVFBMVUcJMHgwODA0CisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fT1RIRVIJCTB4MDg4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0lOUFVUCQkweDA5CisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9LRVlCT0FSRAkweDA5MDAKKyNkZWZpbmUgUENJX0NMQVNTX0lOUFVUX1BFTgkJMHgwOTAxCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9NT1VTRQkJMHgwOTAyCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9TQ0FOTkVSCQkweDA5MDMKKyNkZWZpbmUgUENJX0NMQVNTX0lOUFVUX0dBTUVQT1JUCTB4MDkwNAorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfT1RIRVIJCTB4MDk4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0RPQ0tJTkcJCTB4MGEKKyNkZWZpbmUgUENJX0NMQVNTX0RPQ0tJTkdfR0VORVJJQwkweDBhMDAKKyNkZWZpbmUgUENJX0NMQVNTX0RPQ0tJTkdfT1RIRVIJCTB4MGE4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1BST0NFU1NPUgkweDBiCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfMzg2CQkweDBiMDAKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl80ODYJCTB4MGIwMQorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BFTlRJVU0JMHgwYjAyCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfQUxQSEEJMHgwYjEwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQwkweDBiMjAKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9NSVBTCTB4MGIzMAorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX0NPCQkweDBiNDAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19TRVJJQUwJCTB4MGMKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9GSVJFV0lSRQkweDBjMDAKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9BQ0NFU1MJCTB4MGMwMQorI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMX1NTQQkJMHgwYzAyCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfVVNCCQkweDBjMDMKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9GSUJFUgkJMHgwYzA0CisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfU01CVVMJCTB4MGMwNQorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0lOVEVMTElHRU5UCTB4MGUKKyNkZWZpbmUgUENJX0NMQVNTX0lOVEVMTElHRU5UX0kyTwkweDBlMDAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19TQVRFTExJVEUJMHgwZgorI2RlZmluZSBQQ0lfQ0xBU1NfU0FURUxMSVRFX1RWCQkweDBmMDAKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURV9BVURJTwkweDBmMDEKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURV9WT0lDRQkweDBmMDMKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURV9EQVRBCTB4MGYwNAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0NSWVBUCQkweDEwCisjZGVmaW5lIFBDSV9DTEFTU19DUllQVF9ORVRXT1JLCQkweDEwMDAKKyNkZWZpbmUgUENJX0NMQVNTX0NSWVBUX0VOVEVSVEFJTk1FTlQJMHgxMDAxCisjZGVmaW5lIFBDSV9DTEFTU19DUllQVF9PVEhFUgkJMHgxMDgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU0lHTkFMX1BST0NFU1NJTkcgMHgxMQorI2RlZmluZSBQQ0lfQ0xBU1NfU1BfRFBJTwkJMHgxMTAwCisjZGVmaW5lIFBDSV9DTEFTU19TUF9PVEhFUgkJMHgxMTgwCisKKyNkZWZpbmUgUENJX0NMQVNTX09USEVSUwkJMHhmZgorCisvKiBWZW5kb3JzIGFuZCBkZXZpY2VzLiAgU29ydCBrZXk6IHZlbmRvciBmaXJzdCwgZGV2aWNlIG5leHQuICovCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EWU5BTElOSwkJMHgwNjc1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRFlOQUxJTktfSVM2NFBICTB4MTcwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQkVSS09NCQkJMHgwODcxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVAkJMHhmZmExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkVSS09NX1RfQ09OQ0VQVAkJMHhmZmEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkVSS09NX0E0VAkJMHhmZmE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkVSS09NX1NDSVRFTF9RVUFEUk8JMHhmZmE4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QQVEJCTB4MGUxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9UT0tFTlJJTkcJMHgwNTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRXzEyODAJMHgzMDMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RSSUZMRVgJMHg0MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRXzYwMTAJMHg2MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1NNQVJUMlAJMHhhZTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwCTB4YWUzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwCTB4YWUzNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0kJMHhhZTM1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwRAkweGFlNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBQSQkweGFlNDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBJCTB4YjAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTCTB4YjA2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQgkweGIxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfVEhVTkRFUgkweGYxMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURkxFWDNCCTB4ZjE1MAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkNSCQkweDEwMDAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMJCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgyMAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODI1CTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTUJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzgxMEFQCTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4NjAJMHgwMDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzE1MTAJMHgwMDBhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NgkweDAwMGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODk1CTB4MDAwYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4ODUJMHgwMDBkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NQkweDAwMGYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDMTUxMAkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDODk1QQkweDAwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDODc1QQkweDAwMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMwkweDAwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF82NgkweDAwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDMTAzMAkweDAwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNTNDMTAzNQkweDAwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODc1SgkweDAwOGYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MDkJCTB4MDYyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkyOQkJMHgwNjIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTI5X0xBTgkweDA2MjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MTkJCTB4MDYyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkxOV9MQU4JMHgwNjI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSX1lFTExPV0ZJTgkweDA3MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNjFDMTAyCTB4MDkwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV82M0M4MTUJMHgxMDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVEkJCTB4MTAwMgorLyogTWFjaDY0ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzY4ODAwCQkweDQxNTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1Q1QyMjIJMHg0MzU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxMDg4OENYCTB4NDM1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVFVDIyMgkweDQ1NTQKKy8qIE1hY2g2NCAvIFJhZ2UgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R0IJCTB4NDc0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVHRAkJMHg0NzQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNUdJCQkweDQ3NDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R1AJCTB4NDc1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVHUQkJMHg0NzUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNVhMCQkweDQ3NTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R1QJCTB4NDc1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVHVEIJMHg0NzU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9JVgkweDQ3NTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0lXCTB4NDc1NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfSVoJMHg0NzVBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxMDg4OEdYCTB4NDc1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTEIJMHg0YzQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9MRAkweDRjNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0xHCTB4NGM0NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTEkJMHg0YzQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9MTQkweDRjNEQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0xOCTB4NGM0RQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTFIJMHg0YzUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9MUwkweDRjNTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjY0X0xUCTB4NGM1NAorLyogTWFjaDY0IFZUICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzI2NFZUCQkweDU2NTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjY0VlUJCTB4NTY1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yNjRWVgkJMHg1NjU2CisvKiBSYWdlMTI4IFBybyBHTCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SYWdlMTI4X1BBCTB4NTA0MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SYWdlMTI4X1BCCTB4NTA0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SYWdlMTI4X1BDCTB4NTA0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SYWdlMTI4X1BECTB4NTA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SYWdlMTI4X1BFCTB4NTA0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQUdFMTI4X1BGCTB4NTA0NgorLyogUmFnZTEyOCBQcm8gVlIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QRwkweDUwNDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QSAkweDUwNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QSQkweDUwNDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QSgkweDUwNEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QSwkweDUwNEIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QTAkweDUwNEMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QTQkweDUwNEQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QTgkweDUwNEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QTwkweDUwNEYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QUAkweDUwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QUQkweDUwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QUgkweDUwNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9UUgkweDU0NTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QUwkweDUwNTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QVAkweDUwNTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QVQkweDUwNTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QVgkweDUwNTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QVwkweDUwNTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QWAkweDUwNTgKKy8qIFJhZ2UxMjggR0wgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SRQkweDUyNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SRgkweDUyNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SRwkweDUzNGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SSAkweDUzNGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SSQkweDUzNGQKKy8qIFJhZ2UxMjggVlIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9SSwkweDUyNGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9STAkweDUyNGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9STQkweDUzNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9STgkweDUzNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9STwkweDUzNDcKKy8qIFJhZ2UxMjggTTMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9MRQkweDRjNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9MRgkweDRjNDYKKy8qIFJhZ2UxMjggUHJvIFVsdHJhICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfVTEJMHg1NDQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfVTIJMHg1NDRDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfVTMJMHg1NDUyCisvKiBSYWRlb24gTTQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFERU9OX0xFCTB4NGQ0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQURFT05fTEYJMHg0ZDQ2CisvKiBSYWRlb24gTlYtMTAwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9OMQkweDUxNTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFERU9OX04yCTB4NTE1YQorLyogUmFkZW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9SQQkweDUxNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFERU9OX1JCCTB4NTE0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQURFT05fUkMJMHg1MTQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9SRAkweDUxNDcKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZMU0kJCTB4MTAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTkyCTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTkzCTB4MDAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTk0CTB4MDAwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTk3CTB4MDAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTQxCTB4MDAwYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTQzCTB4MDAwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTMyCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTM0CTB4MDEwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTM1CTB4MDEwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDMTQ3CTB4MDEwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZMU0lfVkFTOTYwMTEJMHgwNzAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BREwJCTB4MTAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FETF8yMzAxCQkweDIzMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05TCQkweDEwMGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184NzQxNQkJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfODc1NjBfTElPCTB4MDAwZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TXzg3NTYwX1VTQgkweDAwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184MzgxNQkJMHgwMDIwCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRFA4MzgxNQkJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfODM4MjAJCTB4MDAyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TXzg3NDEwCQkweGQwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RTRU5HCQkweDEwMGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UU0VOR19XMzJQXzIJMHgzMjAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFNFTkdfVzMyUF9iCTB4MzIwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RTRU5HX1czMlBfYwkweDMyMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UU0VOR19XMzJQX2QJMHgzMjA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFNFTkdfRVQ2MDAwCTB4MzIwOAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0VJVEVLCQkweDEwMGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XRUlURUtfUDkwMDAJMHg5MDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0VJVEVLX1A5MTAwCTB4OTEwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREVDCQkweDEwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfQlJECQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVFVMSVAJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UR0EJCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNUCTB4MDAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UR0EyCQkweDAwMEQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfRkRESQkJMHgwMDBGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMJMHgwMDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyCQkweDAwMTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjEwNTIJCTB4MDAyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE1MAkJMHgwMDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMTUyCQkweDAwMjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjExNTMJCTB4MDAyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE1NAkJMHgwMDI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMjg1CQkweDEwNjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfNDJYWAkweDAwNDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NJUlJVUwkJMHgxMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzc1NDgJMHgwMDM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzU0MzAJMHgwMGEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzU0MzRfNAkweDAwYTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQzNF84CTB4MDBhOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDM2CTB4MDBhYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDQ2CTB4MDBiOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDgwCTB4MDBiYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDYyCTB4MDBkMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDY0CTB4MDBkNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDY1CTB4MDBkNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU182NzI5CTB4MTEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU182ODMyCTB4MTExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU183NTQyCTB4MTIwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU183NTQzCTB4MTIwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU183NTQxCTB4MTIwNAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSUJNCQkweDEwMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fRklSRV9DT1JBTAkweDAwMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fVFIJCTB4MDAxOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV84MkcyNjc1CTB4MDAxZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9NQ0EJCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV84MjM1MQkJMHgwMDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNX1BZVEhPTgkweDAwMmQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fU0VSVkVSQUlECTB4MDAyZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9UUl9XQUtFCTB4MDAzZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9NUElDCQkweDAwNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fMzc4MElEU1AJMHgwMDdkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNX0NIVUtBUgkweDAwOTYKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9JQk1fNDA1R1AJCTB4MDE1NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9TRVJWRVJBSURJOTYwCTB4MDFiZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9NUElDXzIJMHhmZmZmCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QRVgyCQkweDEwMWEgLy8gcGNpLmlkcyBzYXlzICJBVCZUIEdJUyAoTkNSKSIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QRVgyXzEwMFZHCTB4MDAwNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0QJCTB4MTAxYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dEXzcxOTcJCTB4MzI5NgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1JCQkweDEwMWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzCTB4MTk2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRAkweDkwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQyCTB4OTA2MAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1ECQkweDEwMjIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRQkJMHgyMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFX0hPTUUJMHgyMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0hPTUVQTkEJMHgyMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX1NDU0kJCTB4MjAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMDYJMHg3MDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwNwkweDcwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBDCTB4NzAwQworI2RlZmluZSBQQ0lfREVWSURFX0lEX0FNRF9GRV9HQVRFXzcwMEQJMHg3MDBECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwRQkweDcwMEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBGCTB4NzAwRgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAwCTB4NzQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAxCTB4NzQwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAzCTB4NzQwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDA0CTB4NzQwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDA4CTB4NzQwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDA5CTB4NzQwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDBCCTB4NzQwQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDBDCTB4NzQwQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDEwCTB4NzQxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDExCTB4NzQxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDEzCTB4NzQxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDE0CTB4NzQxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDQwCTB4NzQ0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDQxCTB4NzQ0MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDQzCTB4NzQ0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDQ4CTB4NzQ0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDQ5CTB4NzQ0OQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJJREVOVAkJMHgxMDIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgJMHgyMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlgJMHgyMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85MzIwCTB4OTMyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTM4OAkweDkzODgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzkzOTcJMHg5Mzk3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85MzlBCTB4OTM5QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTUyMAkweDk1MjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk1MjUJMHg5NTI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85NDIwCTB4OTQyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTQ0MAkweDk0NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk2NjAJMHg5NjYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85NzUwCTB4OTc1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTg1MAkweDk4NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk4ODAJMHg5ODgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF84NDAwCTB4ODQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfODQyMAkweDg0MjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzg1MDAJMHg4NTAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BSQkJMHgxMDI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUlfTTE0MzUJCTB4MTQzNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREVMTCAgICAgICAgICAgICAgMHgxMDI4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQVRST1gJCTB4MTAyQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9NR0FfMgkweDA1MTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfTUlMCTB4MDUxOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9NWVMJMHgwNTFBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX01JTF8yCTB4MDUxYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9NSUxfMl9BR1AJMHgwNTFmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX01HQV9JTVAJMHgwZDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX0cxMDBfTU0JMHgxMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX0cxMDBfQUdQCTB4MTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX1BDSQkweDA1MjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfRzIwMF9BR1AJMHgwNTIxCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0c0MDAJMHgwNTI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX0c1NTAJMHgyNTI3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX1ZJQQkweDQ1MzYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NUCQkweDEwMmMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DVF82NTU0NQkJMHgwMGQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NDgJCTB4MDBkYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NUXzY1NTUwCQkweDAwZTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DVF82NTU1NAkJMHgwMGU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NTUJCTB4MDBlNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUlSTwkJMHgxMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUlST18zNjA1MAkweDU2MDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05FQwkJMHgxMDMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVDX1BDWDIJCTB4MDA0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FQ19OSUxFNAkJMHgwMDVhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVDX1ZSQzU0NzYgICAgICAgMHgwMDliCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GRAkJMHgxMDM2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkRfMzZDNzAJCTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lTICAgICAgICAgCTB4MTAzOQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJCQkweDEwMzkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTkxX0FHUAkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MjAyCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81MDMJCTB4MDAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJX0FDUEkJCTB4MDAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1OTdfVkdBCTB4MDIwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYyMDUJCTB4MDIwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzUwMQkJMHgwNDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNDk2CQkweDA0OTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMDAJCTB4MDMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzMxNUgJCTB4MDMxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzMxNQkJMHgwMzE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfMzE1UFJPCQkweDAzMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81MzAJCTB4MDUzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU0MAkJMHgwNTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTUwCQkweDA1NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MDEJCTB4MDYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYyMAkJMHgwNjIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjMwCQkweDA2MzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MzUJCTB4MDYzNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY0MAkJMHgwNjQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjQ1CQkweDA2NDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NTAJCTB4MDY1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzczMAkJMHgwNzMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzM1CQkweDA3MzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NDAJCTB4MDc0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc0NQkJMHgwNzQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzUwCQkweDA3NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV85MDAJCTB4MDkwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzkwMAkJMHgwOTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTEwNwkJMHg1MTA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTMwMAkJMHg1MzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTQwX1ZHQQkweDUzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTBfVkdBCTB4NTMxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1MTEJCTB4NTUxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1MTMJCTB4NTUxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1NzEJCTB4NTU3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1OTEJCTB4NTU5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1OTcJCTB4NTU5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1OTgJCTB4NTU5OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU2MDAJCTB4NTYwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYzMDAJCTB4NjMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYzMF9WR0EJMHg2MzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjMwNgkJMHg2MzA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjMyNgkJMHg2MzI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAwMQkJMHg3MDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAxNgkJMHg3MDE2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lTNzAxNiAgICAJMHg3MDE2ICAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83MzBfVkdBCTB4NzMwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFAJCTB4MTAzYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0RPTk5FUl9HRlgJMHgxMDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfVEFDSFlPTgkweDEwMjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9UQUNITElURQkweDEwMjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9KMjU4NUEJCTB4MTAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0oyNTg1QgkJMHgxMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfU0FTCQkweDEwNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9ESVZBMQkJMHgxMDQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfRElWQTIJCTB4MTA0QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1NQMl8wCQkweDEwNEIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BDVEVDSAkJMHgxMDQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENURUNIX1JaMTAwMAkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQ1RFQ0hfUloxMDAxCTB4MTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDVEVDSF9TQU1VUkFJXzAJMHgzMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENURUNIX1NBTVVSQUlfMQkweDMwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQ1RFQ0hfU0FNVVJBSV9JREUgMHgzMDIwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BU1VTVEVLCQkweDEwNDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1VTVEVLXzA2NzUJMHgwNjc1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EUFQJCTB4MTA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RQVAkJMHhhNDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PUFRJCQkweDEwNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzkyQzE3OAkweGMxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzU1NwkweGM1NTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzU1OAkweGM1NTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzYyMQkweGM2MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzcwMAkweGM3MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzcwMQkweGM3MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzgxNAkweGM4MTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzgyMgkweGM4MjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzg2MQkweGM4NjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJXzgyQzgyNQkweGQ1NjgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VMU0EJCTB4MTA0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VMU0FfTUlDUk9MSU5LCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VMU0FfUVMzMDAwCTB4MzAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUxTQQkJMHgxMDQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUxTQV9NSUNST0xJTksJMHgxMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUxTQV9RUzMwMDAJMHgzMDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TR1MJCTB4MTA0YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NHU18yMDAwCQkweDAwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TR1NfMTc2NAkJMHgwMDA5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9CVVNMT0dJQwkJICAgICAgMHgxMDRCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfTVVMVElNQVNURVJfTkMgMHgwMTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfTVVMVElNQVNURVIgICAgMHgxMDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfRkxBU0hQT0lOVCAgICAgMHg4MTMwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9USQkJMHgxMDRjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFZQNDAxMAkweDNkMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9UVlA0MDIwCTB4M2QwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzExMzAJCTB4YWMxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEwMzEJCTB4YWMxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzExMzEJCTB4YWMxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyNTAJCTB4YWMxNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyMjAJCTB4YWMxNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyMjEJCTB4YWMxOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyMTAJCTB4YWMxYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzE0MTAJCTB4YWM1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzE0NTAJCTB4YWMxYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyMjUJCTB4YWMxYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEyNTFBCQkweGFjMWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjExCQkweGFjMWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjUxQgkJMHhhYzFmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfNDQxMAkJMHhhYzQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfNDQ1MQkJMHhhYzQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfMTQyMAkJMHhhYzUxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TT05ZCQkweDEwNGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TT05ZX0NYRDMyMjIJMHg4MDM5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PQUsJCTB4MTA0ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09BS19PVEkxMDcJMHgwMTA3CisKKy8qIFdpbmJvbmQgaGF2ZSB0d28gdmVuZG9yIElEcyEgU2VlIDB4MTBhZCBhcyB3ZWxsICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0lOQk9ORDIJCTB4MTA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzg0MCAgIDB4MDg0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzk0MAkweDA5NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDBGCTB4NWE1YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzY2OTIJMHg2NjkyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTklHTUEJCTB4MTA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FOSUdNQV9NQzE0NTU3NQkweDAxMDAKKyAgCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUZBUgkJMHgxMDU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUZBUl9TTEM5MEU2Nl8xCTB4OTEzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VGQVJfU0xDOTBFNjZfMAkweDk0NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FRkFSX1NMQzkwRTY2XzIJMHg5NDYyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUZBUl9TTEM5MEU2Nl8zCTB4OTQ2MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTU9UT1JPTEEJCTB4MTA1NworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PVE9ST0xBX09PUFMJMHgxNTA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9UT1JPTEFfTVBDMTA1CTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PVE9ST0xBX01QQzEwNgkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1RPUk9MQV9SQVZFTgkweDQ4MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1RPUk9MQV9GQUxDT04JMHg0ODAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9UT1JPTEFfQ1BYODIxNgkweDQ4MDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BST01JU0UJCTB4MTA1YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjUJMHgwZDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NwkweDRkMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjQ2CTB4NGQzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjIJMHg0ZDM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OAkweDRkNjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY4UgkweDYyNjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY5CTB4NGQ2OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzUJMHgxMjc1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV81MzAwCTB4NTMwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTjkJCTB4MTA1ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX045X0kxMjgJCTB4MjMwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX045X0kxMjhfMgkJMHgyMzM5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTjlfSTEyOF9UMlIJMHg0OTNkCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9VTUMJCTB4MTA2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VNQ19VTTg2NzNGCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4OTFBCTB4MDg5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4ODZCRgkweDY3M2EKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QQkweDg4NmEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODgxRgkweDg4ODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2RgkweDg4ODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU05MDE3RgkweDkwMTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2TgkweGU4ODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODkxTgkweGU4OTEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1gJCQkweDEwNjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YX0FHWDAxNgkJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NWUxFWAkJMHgxMDY5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVlMRVhfREFDOTYwX1AJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVlMRVhfREFDOTYwX1BECTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZTEVYX0RBQzk2MF9QRwkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWUxFWF9EQUM5NjBfTEEJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVlMRVhfREFDOTYwX0xQCTB4MDA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZTEVYX0RBQzk2MF9CQQkweEJBNTYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BJQ09QCQkweDEwNjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QSUNPUF9QVDg2QzUyWAkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QSUNPUF9QVDgwQzUyNAkweDgwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FQUExFCQkweDEwNmIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9CQU5ESVQJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfR0MJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX0hZRFJBCTB4MDAwZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0ZXCTB4MDAxOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX0tMX1VTQgkweDAwMTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9BR1AJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fR01BQwkweDAwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9GVzIJMHgwMDMwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ZQU1BSEEJCTB4MTA3MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjQJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzcyNEYJMHgwMDBkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MAkweDAwMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQwkweDAwMGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQ0CTB4MDAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQJMHgwMDEyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVhHRU4JCTB4MTA3NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FWEdFTl84MkM1MDEJMHg0ZTc4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RTE9HSUMJCTB4MTA3NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDIwCTB4MTAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDIyCTB4MTAyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwCTB4MjEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwCTB4MjIwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1lSSVgJCTB4MTA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTAJMHgwMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lSSVhfUENJX01BU1RFUgkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTIwCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfU01JCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfSURFCTB4MDEwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfQVVESU8JMHgwMTAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9WSURFTwkweDAxMDQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xFQURURUsJCTB4MTA3ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xFQURURUtfODA1CTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URVJQSEFTRQkweDEwN2UKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUlBIQVNFXzU1MjYJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJQSEFTRV81NXg2CTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVSUEhBU0VfNTU3NQkweDAwMDgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRBUQkJMHgxMDgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09OVEFRXzgyQzU5OQkweDA2MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzCTB4YzY5MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRk9SRVgJCTB4MTA4MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT0xJQ09NCQkweDEwOGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MzMTM2CTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMTUJMHgwMDExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQkweDAwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCTB4MDAxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYJMHgwMDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DNjE1MQkweDAwMjEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NVTgkJMHgxMDhlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX0VCVVMJCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9IQVBQWU1FQUwJMHgxMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX1JJT19FQlVTCTB4MTEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fR0VNCTB4MTEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fMTM5NAkweDExMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fUklPX1VTQgkweDExMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fR0VNCQkweDJiYWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fU0lNQkEJCTB4NTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9QQk0JCTB4ODAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9TQ0hJWk8JMHg4MDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX1NBQlJFCQkweGEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fSFVNTUlOR0JJUkQJMHhhMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DTUQJCTB4MTA5NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDAJCTB4MDY0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDMJCTB4MDY0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDYJCTB4MDY0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDcJCTB4MDY0NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDgJCTB4MDY0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDkJCTB4MDY0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NzAJCTB4MDY3MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82ODAJCTB4MDY4MAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVklTSU9OCQkweDEwOTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVNJT05fUUQ4NTAwCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJU0lPTl9RRDg1ODAJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUJCTB4MTA5ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NDgJMHgwMzUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg0OUEJMHgwMzUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OF8xCTB4MDM2ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgJMHgwODc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg0NzQJMHg4NDc0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSUVSUkEJCTB4MTBhOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJRVJSQV9TVEIJMHgwMDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TR0kJCTB4MTBhOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NHSV9JT0MzCQkweDAwMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FDQwkJMHgxMGFhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDXzIwNTYJCTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0lOQk9ORAkJMHgxMGFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORF84Mzc2OQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EXzgyQzEwNQkweDAxMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EXzgzQzU1MwkweDA1NjUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RBVEFCT09LCQkweDEwYjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9EQVRBQk9PS184NzE0NAkweGIxMDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BMWAkJMHgxMGI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYX1I2ODUJCTB4MTAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9ST01VTFVTCTB4MTA2YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9TUENPTTgwMAkweDEwNzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfMTA3NwkJMHgxMDc3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYX1NQQ09NMjAwCTB4MTEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9ESklOTl9JVE9PCTB4MTE1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9SNzUzCQkweDExNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfOTA1MAkJMHg5MDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYXzkwNjAJCTB4OTA2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF85MDYwRVMJMHg5MDZFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYXzkwNjBTRAkweDkwNkQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfOTA4MAkJMHg5MDgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYX0dURUtfU0VSSUFMMgkweGEwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01BREdFCQkweDEwYjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQURHRV9NSzIJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BREdFX0MxNTVTCTB4MTAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfM0NPTQkJMHgxMGI3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk4NQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDMzM5CTB4MzM5MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTAJMHg1OTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NQkweDU5NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1VFgJMHg1OTUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xCTB4NTk1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVUNAkweDU5NTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzIJMHg1OTUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NU1JSQkweDU5NTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwVFBPCTB4OTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTwkweDkwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VFgJMHg5MDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0CTB4OTA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVCX1RYCTB4OTA1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVDX1RYTQkweDkyMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NNQwkJMHgxMGI4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAJMHgwMDA1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVU5EQU5DRQkJMHgxM0YwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOREFOQ0VfQUxUQQkweDAyMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMCQkweDEwYjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTQ0NQkJMHgxNDQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE0NDkJCTB4MTQ0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNDUxCQkweDE0NTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTQ2MQkJMHgxNDYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE0ODkJCTB4MTQ4OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNTExCQkweDE1MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTUxMwkJMHgxNTEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE1MjEJCTB4MTUyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNTIzCQkweDE1MjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTUzMQkJMHgxNTMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMJCTB4MTUzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNTQxCQkweDE1NDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTYyMSAgICAgICAgICAweDE2MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTYzMSAgICAgICAgICAweDE2MzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTY0MSAgICAgICAgICAweDE2NDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTY0NyAgICAgICAgICAweDE2NDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTY1MSAgICAgICAgICAweDE2NTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTU0MwkJMHgxNTQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTMzMDcJCTB4MzMwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX000ODAzCQkweDUyMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NNTIxOQkJMHg1MjE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTUyMjkJCTB4NTIyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX001MjM3CQkweDUyMzcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NNTI0MwkJMHg1MjQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTU0NTEJCTB4NTQ1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX003MTAxCQkweDcxMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JVFNVQklTSEkJMHgxMGJhCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVVJFQ09NCQkweDEwYmQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVVJFQ09NX05FMzQJMHgwZTM0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORU9NQUdJQwkJMHgxMGM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTUFHSUNHUkFQSF9OTTIwNzAgMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTUFHSUNHUkFQSF8xMjhWIDB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX01BR0lDR1JBUEhfMTI4WlYgMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTUFHSUNHUkFQSF9OTTIxNjAgMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTUFHSUNNRURJQV8yNTZBViAgICAgICAweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19NQUdJQ0dSQVBIXzEyOFpWUExVUyAgIDB4MDA4MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVNQCQkweDEwY2QKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwCTB4MTIwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDBVCTB4MTMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDBVVwkweDIzMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01BQ1JPTklYCQkweDEwZDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQUNST05JWF9NWDk4NzEzCTB4MDUxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01YOTg3eDMJCTB4MDUxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BQ1JPTklYX01YOTg3eDUJMHgwNTMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVg5ODd4NQkJMHgwNTMxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9UQ09OUkFECQkweDEwZGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UQ09OUkFEX1RPS0VOUklORwkweDA1MDgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NFUk4JCTB4MTBkYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NFUk5fU1BTQl9QTUMJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0VSTl9TUFNCX1BDSQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DRVJOX0hJUFBJX0RTVAkweDAwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DRVJOX0hJUFBJX1NSQwkweDAwMjIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05WSURJQQkJCTB4MTBkZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9UTlQJCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9UTlQyCQkweDAwMjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfVVROVDIJCTB4MDAyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9WVE5UMgkJMHgwMDJDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1VWVE5UMgkJMHgwMDJECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0lUTlQyCQkweDAwQTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9TRFIJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRERSCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk8JCTB4MDEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFMl9NWAkweDAxMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfTVgyCTB4MDExMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk8yX01YUgkweDAxMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfR1RTCTB4MDE1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFMl9HVFMyCTB4MDE1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFMl9VTFRSQQkweDAxNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPMl9QUk8JMHgwMTUzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTVMJCTB4MTBlMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lNU184ODQ5CQkweDg4NDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTVNfVFQxMjgJCTB4OTEyOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lNU19UVDNECQkweDkxMzUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RFS1JBTTIJCTB4MTBlMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RFS1JBTTJfNjkwYwkweDY5MGMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RVTkRSQQkJMHgxMGUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFVORFJBX0NBOTFDMDQyCTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1DQwkJMHgxMGU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1DQ19NWVJJTkVUCTB4ODA0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNQ0NfUEFSQVNUQVRJT04JMHg4MDYyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1DQ19TNTkzMwkweDgwN2QKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUNDX1M1OTMzX0hFUEMzCTB4ODA5YworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URVJHCQkweDEwZWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfMTY4MAkweDE2ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfMTY4MgkweDE2ODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfMjAwMAkweDIwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfMjAxMAkweDIwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfNTAwMAkweDUwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MAkweDUwNTAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFQUxURUsJCTB4MTBlYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JFQUxURUtfODAyOQkweDgwMjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMjkJMHg4MTI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5CTB4ODEzOQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWElMSU5YCQkweDEwZWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UVVJCT1BBTQkJMHg0MDIwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9UUlVFVklTSU9OCTB4MTBmYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSVUVWSVNJT05fVDEwMDAJMHgwMDBjCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTklUCQkweDExMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTklUXzMyMFAJCTB4OTEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOSVRfMzYwUAkJMHg5NTAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DUkVBVElWRQkJMHgxMTAyIC8vIGR1cGxpY2F0ZTogRUNUSVZBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMQkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VDVElWQQkJMHgxMTAyIC8vIGR1cGxpY2F0ZTogQ1JFQVRJVkUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FQ1RJVkFfRVYxOTM4CTB4ODkzOAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFRJCQkweDExMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UVElfSFBUMzQzCTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNjYJMHgwMDA0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSUEJCTB4MTEwNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJQVRFQwkJMHgxMTA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNjNfMAkweDAzMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODM3MV8wCTB4MDM5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NTAxXzAJMHgwNTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzUwNQkweDA1MDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTYxCTB4MDU2MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMQkweDA1NzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTc2CTB4MDU3NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODUJMHgwNTg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8wCTB4MDU4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTUJMHgwNTk1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5NgkweDA1OTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk3XzAJMHgwNTk3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5OF8wCTB4MDU5OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NjAxXzAJMHgwNjAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2MDVfMAkweDA2MDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjgwCTB4MDY4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODYJMHgwNjg2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY5MQkweDA2OTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjkzCTB4MDY5MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2OTNfMQkweDA2OTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDOTI2CTB4MDkyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NzZfMQkweDE1NzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk1Xzk3CTB4MTU5NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMgkweDMwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzMJMHgzMDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1JISU5FX0kJMHgzMDQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzYzMDUJCTB4MzA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZfMwkweDMwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk2Ql8zCTB4MzA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNAkweDMwNTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzUJMHgzMDU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNfNQkweDMwNTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzM183CTB4MzA2NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDIJMHgzMDY1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl82CTB4MzA2OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjMzXzAJMHgzMDc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1ZUNjEwNQkweDMxMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzM0NfMAkweDMxMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODYzM18wCTB4MzA5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MzY3XzAJMHgzMDk5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2QzEwMEEJMHg2MTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzEJCTB4ODIzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjMxXzQJMHg4MjM1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNjVfMQkweDgzMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODM3MV8xCTB4ODM5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NTAxXzEJMHg4NTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5N18xCTB4ODU5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OThfMQkweDg1OTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODYwMV8xCTB4ODYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NTA1XzEJMFg4NjA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2MzNfMQkweEIwOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODM2N18xCTB4QjA5OQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lFTUVOUyAgICAgICAgICAgMHgxMTBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lFTUVOU19EU0NDNCAgICAgMHgyMTAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUMyCQkweDExMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TTUMyXzEyMTFUWAkweDEyMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TTUMyXzEyMTEgICAgICAgICAweDEyMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TTUMyXzEyMTYgICAgICAgICAweDEyMTYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZPUlRFWAkJMHgxMTE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYweDAJMHgwMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYwMDBCCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDEwCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIwCTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTMwCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTUwCTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3CTB4MDAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3CTB4MDAwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM3CTB4MDAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3CTB4MDAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE1CTB4MDAwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI1CTB4MDAwYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM1CTB4MDAwYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU1CTB4MDAwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlAJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjdSUAkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzN1JQCTB4MDEwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3UlAJMHgwMTAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTFSUAkweDAxMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMVJQCTB4MDEwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlAxCTB4MDExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3UlAxCTB4MDExMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM3UlAxCTB4MDExMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3UlAxCTB4MDExMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDExUlAxCTB4MDExNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIxUlAxCTB4MDExNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlAyCTB4MDEyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3UlAyCTB4MDEyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM3UlAyCTB4MDEyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3UlAyCTB4MDEyMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDExUlAyCTB4MDEyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIxUlAyCTB4MDEyNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUYJCTB4MTExYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VGX0FUTV9GUEdBCTB4MDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VGX0FUTV9BU0lDCTB4MDAwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSURUCQkweDExMWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JRFRfSURUNzcyMDEJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GT1JFCQkweDExMjcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GT1JFX1BDQTIwMFBDCTB4MDIxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZPUkVfUENBMjAwRQkweDAzMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lNQUdJTkdURUNICTB4MTEyZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lNQUdJTkdURUNIX0lDUENJCTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUEhJTElQUwkJMHgxMTMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTQ1CTB4NzE0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NgkweDcxNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTk3MzAJMHg5NzMwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FSUNPTgkJMHgxMTMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwUFJPCTB4ZTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMAkweGUwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjBQUk9fVQkweGUwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjBfVQkweGUwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAxCTB4ZTAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkEJMHhlMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVEJMHhlMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVFfVQkweGUwMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9NQUVTVFJBUAkweGUwMTQKKyAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DWUNMT05FCQkweDExM2MKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT05FX1NESwkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMTElBTkNFCQkweDExNDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTExJQU5DRV9QUk9NT1RJTwkweDMyMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTExJQU5DRV9QUk9WSURFTwkweDY0MjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTExJQU5DRV9BVDI0CTB4NjQyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMTElBTkNFX0FUM0QJMHg2NDNkCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNUCTB4MTE0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfRlAJMHg0MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9UUgkweDQyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUX0dFCTB4NDMwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVk1JQwkJMHgxMTRhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk1JQ19WTUUJCTB4NzU4NworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRElHSQkJMHgxMTRmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9FUEMJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfUklHSFRTV0lUQ0gJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9YRU0JCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfWFIJCTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfQ1gJCTB4MDAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfWFJKCQkweDAwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX0VQQ0oJCTB4MDAwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfWFJfOTIwCTB4MDAyNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9JT00yX0UJMHgwMDcwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UJMHgwMDcxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfQQkweDAwNzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fQQkweDAwNzMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01VVEVDSAkJMHgxMTU5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVVURUNIX01WMTAwMAkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1hJUkNPTQkJMHgxMTVkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWElSQ09NX1gzMjAxX0VUSAkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YSVJDT01fWDMyMDFfTURNCTB4MDEwMworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUkVORElUSU9OCQkweDExNjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRU5ESVRJT05fVkVSSVRFCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JFTkRJVElPTl9WRVJJVEUyMTAwIDB4MjAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MJICAweDExNjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IRQkgIDB4MDAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFCSAgMHgwMDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ0lPQjMwICAweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DTUlDX0hFIDB4MDAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjQJICAweDAyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1CSAgMHgwMjAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSAweDAyMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFIDB4MDIxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRVU0IgMHgwMjIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNVVTQiBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRVU0IKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SVNBIDB4MDIzMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0JFCQkweDExNzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TQkVfV0FOWEwxMDAJMHgwMzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMjAwCTB4MDMwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDQwMAkweDAxMDQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RPU0hJQkEJCTB4MTE3OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfNjAxCTB4MDYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUM5NQkweDA2MGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RPUElDOTcJMHgwNjBmCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SSUNPSAkJMHgxMTgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ2NQkweDA0NjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDY2CTB4MDQ2NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NzUJMHgwNDc1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3NgkweDA0NzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDc4CTB4MDQ3OAorCisjZGVmaW5lCVBDSV9WRU5ET1JfSURfRExJTksJCTB4MTE4NgorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RGRTUzMFRYUAkJMHgxMzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREZFNTMwVFhTCQkweDEwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FSVE9QCQkweDExOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NDAwCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg1MFVGCTB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MAkweDAwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjBSCTB4MDAwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTAJMHg4MDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMlVXCTB4ODAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJVCTB4ODAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJTCTB4ODAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJECTB4ODA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJTVVcJMHg4MDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJUT1BfODA2MAkweDgwNjAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1pFSVRORVQJCTB4MTE5MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1pFSVRORVRfMTIyMQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9aRUlUTkVUXzEyMjUJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PTUVHQQkJMHgxMTliCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT01FR0FfODJDMDkyRwkweDEyMjEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZVSklUU1VfTUUJMHgxMTllCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRlVKSVRTVV9GUzE1NQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GVUpJVFNVX0ZTNTAJMHgwMDAzCisKKyNkZWZpbmUgUENJX1NVQlZFTkRPUl9JRF9LRVlTUEFOCTB4MTFhOQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0tFWVNQQU5fU1gyCTB4NTMzNAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfR0FMSUxFTwkJMHgxMWFiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfR0FMSUxFT19HVDY0MDExCTB4NDE0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dBTElMRU9fR1Q2NDExMQkweDQxNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9HQUxJTEVPX0dUOTYxMDAJMHg5NjUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfR0FMSUxFT19HVDk2MTAwQQkweDk2NTMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xJTktTWVMJCTB4MTFhZAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xJVEVPTgkJMHgxMWFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTElURU9OX0xORTEwMFRYCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xDODJDMTE1CQkweEMxMTUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1YzCQkweDExYjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WM19WOTYwCQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WM19WMzUwCQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WM19WOTYxCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WM19WMzUxCQkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05QCQkweDExYmMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OUF9QQ0lfRkRESQkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUVAkJMHgxMWMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRUX0w1NlhNRgkweDA0NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVFRfVkVOVVNfTU9ERU0JMHg0ODAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWAkJMHgxMWNiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX0lPOAkweDIwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfWElPCTB4NDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9SSU8JMHg4MDAwCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfU1BFQ0lBTElYX1NQRUVENCAweGEwMDQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FVUkFWSVNJT04JMHgxMWQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVVSQVZJU0lPTl9WWFA1MjQJMHgwMWY3CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTkFMT0dfREVWSUNFUwkweDExZDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BRDE4ODlKUwkJMHgxODg5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JS09OCQkweDExZDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JS09OXzEwMTE1CTB4MDExNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lLT05fMTAxMTcJMHgwMTE3CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9aT1JBTgkJMHgxMWRlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWk9SQU5fMzYwNTcJMHg2MDU3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWk9SQU5fMzYxMjAJMHg2MTIwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LSU5FVElDCQkweDExZjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9LSU5FVElDXzI5MTUJMHgyOTE1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QRVgJCTB4MTFmNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBFWF9FTkVUMTAwVkc0CTB4MDExMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDIwMDAJMHgxNDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMTAwQVRYICAgMHgyMDExCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SUAkJMHgxMWZlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlAzMklOVEYJCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQOElOVEYJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQMTZJTlRGCQkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDRRVUFECQkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhPQ1RBCQkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhKCQkweDAwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUFA0CQkweDAwMEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUFA4CQkweDAwMEIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhNCQkweDAwMEMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NZQ0xBREVTCQkweDEyMGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbwkweDAxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT01fWV9IaQkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT01fNFlfTG8JMHgwMTAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0hpCTB4MDEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV84WV9MbwkweDAxMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT01fOFlfSGkJMHgwMTA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfTG8JMHgwMjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGkJMHgwMjAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMgkweDAzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xCTB4MDMwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzIJMHgwMzEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMQkweDAzMTEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VTU0VOVElBTAkJMHgxMjBmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTRU5USUFMX1JPQURSVU5ORVIJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PMgkJMHgxMjE3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjcyOQkJMHg2NzI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjczMAkJMHg2NzNhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjgzMgkJMHg2ODMyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjgzNgkJMHg2ODM2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zREZYCQkweDEyMWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zREZYX1ZPT0RPTwkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zREZYX1ZPT0RPTzIJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RGWF9CQU5TSEVFCTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNERlhfVk9PRE9PMwkweDAwMDUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJR01BREVTCQkweDEyMzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUdNQURFU182NDI1CTB4NjQwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0NVQkUJCTB4MTIzZgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVZNCQkweDEyNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVk1fQjEJCTB4MDcwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWTV9DNAkJMHgwODAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVZNX0ExCQkweDBhMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVk1fQTFfVjIJCTB4MGUwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWTV9DMgkJMHgxMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVZNX1QxCQkweDEyMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RJUElYCQkweDEyNDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NUQUxMSU9OCQkweDEyNGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVEFMTElPTl9FQ0hQQ0k4MzIgMHgwMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1RBTExJT05fRUNIUENJODY0IDB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NUQUxMSU9OX0VJT1BDSQkweDAwMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09QVElCQVNFCQkweDEyNTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJQkFTRV9GT1JHRQkweDExMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJQkFTRV9GVVNJT04JMHgxMjEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSUJBU0VfVlBMRVgJMHgyMTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSUJBU0VfVlBMRVhDQwkweDIxMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PUFRJQkFTRV9WUVVFU1QJMHgyMTMwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FU1MJCTB4MTI1ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19FU1MxOTY4CTB4MTk2OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19BVURJT1BDSQkweDE5NjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk3OAkweDE5NzgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hBUlJJUyAgICAgICAgCTB4MTI2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hBUlJJU19QUklTTTIJMHgzODczCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TQVRTQUdFTQkJMHgxMjY3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0FUU0FHRU1fTklDQ1kJMHgxMDE2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0FUU0FHRU1fUENSMjEwMQkweDUzNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TQVRTQUdFTV9URUxTQVRUVVJCTyAweDVhNGIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hVR0hFUwkJMHgxMjczCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFVHSEVTX0RJUkVDUEMJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTlNPTklRCQkweDEyNzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MAkweDU4ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MAkweDUwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MQkweDEzNzEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPQ0tXRUxMCQkweDEyN0EKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RBVklDT00JCTB4MTI4MgorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RNOTAwOQkJMHg5MDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRE05MTAyCQkweDkxMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lURQkJMHgxMjgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFX0lUODE3MkdfQVVESU8gMHgwODAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFX0lUODE3MkcJMHg4MTcyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzg4NzIJCTB4ODg3MgorCisKKy8qIGZvcm1lcmx5IFBsYXRmb3JtIFRlY2ggKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FU1NfT0xECQkweDEyODUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfRVNTMDEwMAkweDAxMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMVEVPTgkJMHgxMmFlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxURU9OX0FDRU5JQwkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1VTUgkJMHgxMkI5CisKKyNkZWZpbmUJUENJX1ZFTkRPUl9JRF9IT0xURUsJCTB4MTJjMworI2RlZmluZQlQQ0lfREVWSUNFX0lEX0hPTFRFS19IVDgwMjMyCTB4MDA1OAorCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNICQkJMHgxMmM0CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIOF8yMzIJCTB4MDAwMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDRfMjMyCQkweDAwMDIKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgyXzIzMgkJMHgwMDAzCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIOF80ODUJCTB4MDAwNAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfNDg1XzRfNAkweDAwMDUKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg0XzQ4NQkJMHgwMDA2CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JINF80ODVfMl8yCTB4MDAwNworI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDJfNDg1CQkweDAwMDgKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg4XzQ4NV8yXzYJMHgwMDA5CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIMDgxMTAxVjEJMHgwMDBBCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIMDQxMTAxVjEJMHgwMDBCCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QSUNUVVJFTAkJMHgxMmM1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUElDVFVSRUxfUENJVlNUCTB4MDA4MQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTlZJRElBX1NHUwkweDEyZDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfU0dTX1JJVkExMjggMHgwMDE4CisKKyNkZWZpbmUgUENJX1NVQlZFTkRPUl9JRF9DSEFTRV9QQ0lGQVNUCQkweDEyRTAKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUNAkJMHgwMDMxCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDgJCTB4MDAyMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1QxNgkweDAwMTEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUMTZGTUMJMHgwMDQxCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJUkFTCQkweDEyNEQKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM0CQkweEYwMDEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM4CQkweEYwMTAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FVUkVBTAkJMHgxMmViCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVVSRUFMX1ZPUlRFWF8xCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FVUkVBTF9WT1JURVhfMgkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NCT0FSRFMJCTB4MTMwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NCT0FSRFNfREFTMTYwMl8xNiAweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJSUcJCTB4MTMxZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4XzU1MAkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF82NTAJMHgxMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18xU18xMHhfODUwCTB4MTAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8xMHhfNTUwCTB4MTAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8xMHhfNjUwCTB4MTAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8xMHhfODUwCTB4MTAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVBfMTB4CTB4MTAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlBfMTB4CTB4MTAyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMTB4XzU1MAkweDEwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTXzEweF82NTAJMHgxMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yU18xMHhfODUwCTB4MTAzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8xMHhfNTUwCTB4MTAzNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8xMHhfNjUwCTB4MTAzNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8xMHhfODUwCTB4MTAzNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfNFNfMTB4XzU1MAkweDEwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzRTXzEweF82NTAJMHgxMDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR180U18xMHhfODUwCTB4MTA1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMjB4XzU1MAkweDIwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTXzIweF82NTAJMHgyMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18xU18yMHhfODUwCTB4MjAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVBfMjB4CTB4MjAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlBfMjB4CTB4MjAyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMjB4XzU1MAkweDIwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTXzIweF82NTAJMHgyMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yU18yMHhfODUwCTB4MjAzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlAxU18yMHhfNTUwCTB4MjA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlAxU18yMHhfNjUwCTB4MjA0MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlAxU18yMHhfODUwCTB4MjA0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8yMHhfNTUwCTB4MjAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8yMHhfNjUwCTB4MjAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVMxUF8yMHhfODUwCTB4MjAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfNFNfMjB4XzU1MAkweDIwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzRTXzIweF82NTAJMHgyMDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR180U18yMHhfODUwCTB4MjA1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8yMHhfNTUwCTB4MjA2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8yMHhfNjUwCTB4MjA2MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlMxUF8yMHhfODUwCTB4MjA2MgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURNVEVLICAgICAgICAgICAgMHgxMzE3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURNVEVLXzA5ODUgICAgICAgMHgwOTg1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ET01FWAkJMHgxMzRhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRE9NRVhfRE1YMzE5MUQJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RVUFURUNICQkweDEzNUMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFURUNIX1FTQzEwMAkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFURUNIX0RTQzEwMAkweDAwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFURUNIX0RTQzIwMAkweDAwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFURUNIX1FTQzIwMAkweDAwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFURUNIX0VTQzEwMEQJMHgwMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9FU0MxMDBNCTB4MDA2MAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0VBTEVWRUwJCTB4MTM1ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1U1MzAJMHg3MTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVUNPTU0yCTB4NzIwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NNDIyCTB4NzQwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NMjMyCTB4NzIwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX0NPTU00CTB4NzQwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX0NPTU04CTB4NzgwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFlQRVJDT1BFCQkweDEzNjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IWVBFUkNPUEVfUExYCTB4OTA1MAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0hZUEVSQ09QRV9PTERfRVJHTwkweDAxMDQKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9IWVBFUkNPUEVfRVJHTwkJMHgwMTA2CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfSFlQRVJDT1BFX01FVFJPCTB4MDEwNworI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0hZUEVSQ09QRV9DSEFNUDIJMHgwMTA4CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfSFlQRVJDT1BFX1BMRVhVUwkweDAxMDkKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0tBV0FTQUtJCQkweDEzNmIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQ0hJUF9LTDVBNzIwMDIJMHhmZjAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MTUMJCTB4MTM3NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xNQ19IU1NJCQkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MTUNfRFMzCQkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MTUNfU1NJCQkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MTUNfVDEJCTB4MDAwNgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUR0VBUgkJMHgxMzg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9NQTMwMQkweDQxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwCTB4NjIwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEdFQVJfR0E2MjIJMHg2MjJhCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTQkJMHgxMzg5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTElDT01fUENJR0VORVJJQyAweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwSUJTX0NBTiAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwUEZCIDB4MDAwMworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTU9YQQkJMHgxMzkzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0CQkweDEwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0MxNjgJCTB4MTY4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQ1AyMDRKCTB4MjA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQzIxOAkJMHgyMTgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DMzIwCQkweDMyMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NDRAkJMHgxMzk3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEXzJCRDAJCTB4MmJkMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMDAwCQkweGIwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwNgkJMHhiMDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDcJCTB4YjAwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMDA4CQkweGIwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwOQkJMHhiMDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEEJCTB4YjAwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMDBCCQkweGIwMGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwQwkJMHhiMDBjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IxMDAJCTB4YjEwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUlDUk9HQVRFCQkweDEzYzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NSUNST0dBVEVfVVNDCTB4MDAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01JQ1JPR0FURV9TQ0MJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUlDUk9HQVRFX1NDQQkweDAwMzAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNXQVJFCQkweDEzQzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV8xMDAwCTB4MTAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUJPQ09NCQkweDEzRDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQk9DT01fMkJEMSAgICAgICAweDJCRDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NNRURJQQkJMHgxM2Y2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEEJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEIJMHgwMTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOAkweDAxMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4QgkweDAxMTIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xBVkEJCTB4MTQwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfRFNFUklBTAkweDAxMDAgLyogMnggMTY1NTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1FVQVRST19BCTB4MDEwMSAvKiAyeCAxNjU1MCwgaGFsZiBvZiA0IHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1FVQVRST19CCTB4MDEwMiAvKiAyeCAxNjU1MCwgaGFsZiBvZiA0IHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1BPUlRfUExVUwkweDAyMDAgLyogMnggMTY2NTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1FVQURfQQkweDAyMDEgLyogMnggMTY2NTAsIGhhbGYgb2YgNCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9RVUFEX0IJMHgwMjAyIC8qIDJ4IDE2NjUwLCBoYWxmIG9mIDQgcG9ydCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfU1NFUklBTAkweDA1MDAgLyogMXggMTY1NTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1BPUlRfNjUwCTB4MDYwMCAvKiAxeCAxNjY1MCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfUEFSQUxMRUwJMHg4MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9EVUFMX1BBUl9BCTB4ODAwMiAvKiBUaGUgTGF2YSBEdWFsIFBhcmFsbGVsIGlzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9EVUFMX1BBUl9CCTB4ODAwMyAvKiB0d28gUENJIGRldmljZXMgb24gYSBjYXJkICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9CT0NBX0lPUFBBUgkweDg4MDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RJTUVESUEJCTB4MTQwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJTUVESUFfMTg4OQkweDcxNjgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09YU0VNSQkJMHgxNDE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzEyUENJODQwCTB4ODQwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NAkweDk1MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTIJMHg5NTBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTVOCTB4OTUxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NFBQCTB4OTUxMworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUlST05FVAkJMHgxNGI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUlST05FVF80ODAwXzEJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUlST05FVF80ODAwCTB4NDUwMCAvLyB2YWx1ZXMgc3dpdGNoZWQ/ICBzZWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BSVJPTkVUXzQ1MDAJMHg0ODAwIC8vIGRyaXZlcnMvbmV0L2Fpcm9uZXQ0NTAwX2NhcmQuYworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVElUQU4JCTB4MTREMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzAxMEwJMHg4MDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fMTAwTAkweDgwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl8xMTBMCTB4ODAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzIwMEwJMHg4MDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fMjEwTAkweDgwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl80MDBMCTB4ODA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzgwMEwJMHg4MDgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fMTAwCQkweEEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl8yMDAJCTB4QTAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzQwMAkJMHhBMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fODAwQgkweEEwMDQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BBTkFDT00JCTB4MTRkNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BBTkFDT01fUVVBRE1PREVNCTB4MDQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BBTkFDT01fRFVBTE1PREVNCTB4MDQwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPQURDT00JCTB4MTRlNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAwCTB4MTY0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAxCTB4MTY0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyCTB4MTY0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAzCTB4MTY0NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA0CTB4MTY0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyRkUJMHgxNjRkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDUJMHgxNjUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVfMgkweDE2NTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNU0JMHgxNjVkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVNXzIJMHgxNjVlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODIJMHgxNjk2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODgJMHgxNjljCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJYCTB4MTZhNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAzWAkweDE2YTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNFMJMHgxNmE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJBMwkweDE2YzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM0EzCTB4MTZjNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxCTB4MTcwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxXzIJMHgxNzBlCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TWUJBCQkweDE1OTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TWUJBXzJQX0VQUAkweDA3ODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TWUJBXzFQX0VDUAkweDA3ODMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PUkVUT04JCTB4MTVhYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JBU1RFTF8yUE9SVAkweDIwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1pPTFRSSVgJCTB4MTViMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1pPTFRSSVhfMkJEMAkweDJiZDAgCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QREMJCTB4MTVlOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BEQ18xODQxCQkweDE4NDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NZTVBIT05ZCQkweDFjMWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TWU1QSE9OWV8xMDEJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9URUtSQU0JCTB4MWRlMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RFS1JBTV9EQzI5MAkweGRjMjkKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNETEFCUwkJMHgzZDNkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTXzMwMFNYCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU181MDBUWAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zRExBQlNfREVMVEEJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTX1BFUk1FRElBCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19NWAkJMHgwMDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTX1BFUk1FRElBMgkweDAwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zRExBQlNfR0FNTUEJMHgwMDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTX1BFUk1FRElBMlYJMHgwMDA5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVkFOQ0UJCTB4NDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWQU5DRV9BTEcyMDY0CTB4MjA2NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWQU5DRV8yMzAyCTB4MjMwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUtTCQkweDQxNmMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BS1NfQUxBRERJTkNBUkQJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUtTX0NQQwkJMHgwMjAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRWSU4JCTB4NGExNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVFZJTl9OVjUwMDBTQwkweDUwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1MzCQkweDUzMzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19QTEFUT19QWFMJMHgwNTUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVmlSR0UJCTB4NTYzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1RSSU8JCTB4ODgxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX0FVUk9SQTY0VlAJMHg4ODEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVFJJTzY0VVZQCTB4ODgxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFX1ZYCTB4ODgzZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzXzg2OAkJMHg4ODgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfOTI4CQkweDg4YjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM184NjRfMQkJMHg4OGMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfODY0XzIJCTB4ODhjMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzXzk2NF8xCQkweDg4ZDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM185NjRfMgkJMHg4OGQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfOTY4CQkweDg4ZjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19UUklPNjRWMgkweDg5MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19QTEFUT19QWEcJMHg4OTAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVmlSR0VfRFhHWAkweDhhMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19WaVJHRV9HWDIJMHg4YTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVmlSR0VfTVgJMHg4YzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVmlSR0VfTVhQCTB4OGMwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFX01YUE1WCTB4OGMwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1NPTklDVklCRVMJMHhjYTAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQ0kJCTB4NjY2NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RDSV9QQ0NPTTQJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRENJX1BDQ09NOAkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0dFTlJPQ08JCTB4NTU1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dFTlJPQ09fSEZQODMyCTB4MDAwMworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URUwJCTB4ODA4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzIxMTQ1CTB4MDAzOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzc1CTB4MDQ4MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDI0CTB4MDQ4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzc4CTB4MDQ4NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDMwCTB4MDQ4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDM0CTB4MDRhMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0k5NjAJMHgwOTYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDIgICAgICAgCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQzR0NfRklCRVIgIAkweDEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0M0dDX0NPUFBFUiAJMHgxMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDRFSV9DT1BQRVIgCTB4MTAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQ0RUlfRklCRVIgCTB4MTAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQ0R0NfQ09QUEVSIAkweDEwMEMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NEdDX0xPTSAgIAkweDEwMEQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0MEVNCQkweDEwMEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NUVNX0NPUFBFUgkweDEwMEYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NkVCX0NPUFBFUgkweDEwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NUVNX0ZJQkVSCTB4MTAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQ2RUJfRklCRVIJMHgxMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDBFTV9MT00JCTB4MTAxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAyOQkweDEwMjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzAJMHgxMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMxCTB4MTAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAzOAkweDEwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzkJMHgxMDM5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDNBCTB4MTAzQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTYyRVQJMHgxMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUgkweDEyMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjA5MkFBXzAJMHgxMjIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIwOTJBQV8xCTB4MTIyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzcxMTYJMHgxMjIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1OTYJMHgxMjI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NjUJMHgxMjI3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcJMHgxMjI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0MzcJMHgxMjJkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFGQl8wCTB4MTIyZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMQkweDEyMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MU1YCTB4MTIzNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDM3TVgJMHgxMjM1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEJMHgxMjM3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzODBGQgkweDEyNGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzOQkweDEyNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MDk2MF9SUAkweDE5NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzAJMHgyNDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8xCTB4MjQxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMgkweDI0MTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzMJMHgyNDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV81CTB4MjQxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfNgkweDI0MTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzgJMHgyNDE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8wCTB4MjQyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMQkweDI0MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzIJMHgyNDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8zCTB4MjQyMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfNQkweDI0MjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzYJMHgyNDI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl84CTB4MjQyOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMAkweDI0NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEJMHgyNDQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8yCTB4MjQ0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMwkweDI0NDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzQJMHgyNDQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV81CTB4MjQ0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfNgkweDI0NDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzcJMHgyNDQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NjIJMHgyNDQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV84CTB4MjQ0YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfOQkweDI0NGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEwCTB4MjQ0YworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMTEJMHgyNDRlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8wCTB4MjQ4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMgkweDI0ODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzMJMHgyNDgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV80CTB4MjQ4NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfNQkweDI0ODUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzYJMHgyNDg2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV83CTB4MjQ4NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTAJMHgyNDhhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMQkweDI0OGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyCTB4MjQ4YworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgwMzEwCTB4NTMwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMAkweDcwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzEJMHg3MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFTQl8yCTB4NzAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDM3VlgJMHg3MDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0MzlUWAkweDcxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzAJMHg3MTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQgkweDcxMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzIJMHg3MTEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zCTB4NzExMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMQkweDcxMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzEJMHg3MTIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfTUMzCTB4NzEyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX0lHMwkweDcxMjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0xYXzAJMHg3MTgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNMWF8xCTB4NzE4MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMAkweDcxOTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0JYXzEJMHg3MTkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNCWF8yCTB4NzE5MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzTVhfMAkweDcxOTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzEJMHg3MTk5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNNWF8yCTB4NzE5YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzTVhfMwkweDcxOWIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MkZCXzAJMHg3NjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzJGQl8xCTB4NzYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcyRkJfMgkweDc2MDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MkZCXzMJMHg3NjAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTRHWAkweDg0YzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MEdYCTB4ODRjNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDUxTlgJMHg4NGNhCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QVVRPTkUJCTB4OGUwZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBVVE9ORV9JUDJFWAkweDAyOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QVVRPTkVfUEcJMHgwMzAyCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ09NUFVUT05FCTB4OGUwZQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTVBVVE9ORV9QRzQJMHgwMDAxCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09NUFVUT05FX1BHOAkweDAwMDIKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT01QVVRPTkVfUEc2CTB4MDAwMworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfS1RJCQkweDhlMmUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9LVElfRVQzMlAyCTB4MzAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURBUFRFQwkJMHg5MDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODEwCTB4MTA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzgyMQkweDIxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzM4NjAyCTB4Mzg2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg1MAkweDUwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTUJMHg1NTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ181ODAwCTB4NTgwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMzg2MAkweDYwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzE0ODBBCTB4NjA3NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg2MAkweDYwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NjEJMHg2MTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcwCTB4NzA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MQkweDcxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NzIJMHg3Mjc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODczCTB4NzM3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3NAkweDc0NzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4OTUJMHg3ODk1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODgwCTB4ODA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MQkweDgxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODIJMHg4Mjc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODgzCTB4ODM3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4NAkweDg0NzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODUJMHg4NTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg2CTB4ODY3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4NwkweDg3NzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODgJMHg4ODc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18xMDMwCTB4OGI3OAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURBUFRFQzIJCTB4OTAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzI5NDBVMgkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl8yOTMwVTIJMHgwMDExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5MEIJMHgwMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5MAkweDAwMWYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl8zOTQwVTIJMHgwMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfMzk1MFUyRAkweDAwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODk2CTB4MDA1ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJBCTB4MDA4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJCCTB4MDA4MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJECTB4MDA4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJQCTB4MDA4ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTlBCTB4MDBjMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTlCCTB4MDBjMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTlECTB4MDBjMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTlQCTB4MDBjZgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVRST05JQ1MJCTB4OTA3ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUUk9OSUNTXzIwMTUJMHgyMDE1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IT0xURUsyCQkweDk0MTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IT0xURUsyXzY1NjUJMHg2NTY1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRNT1MJCTB4OTcxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVE1PU185NzM1CTB4OTczNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVE1PU185ODM1CTB4OTgzNQorCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfRVhTWVMJCTB4ZDg0ZAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0VYU1lTXzQwMTQJMHg0MDE0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9USUdFUkpFVAkJMHhlMTU5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMzAwCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR0VSSkVUXzEwMAkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FSSwkJMHhlZGQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJLX1NUSU5HCQkweGEwOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUktfU1RJTkdBUksJMHhhMDk5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJLXzIwMDBNVAkweGEwYTEKKwpJbmRleDogYi9uZXRib290L3BjaV9pby5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3BjaV9pby5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorKiogU3VwcG9ydCBmb3IgTkUyMDAwIFBDSSBjbG9uZXMgYWRkZWQgRGF2aWQgTW9ucm8gSnVuZSAxOTk3CisqKiBHZW5lcmFsaXNlZCB0byBvdGhlciBOSUNzIGJ5IEtlbiBZYXAgSnVseSAxOTk3CisqKgorKiogTW9zdCBvZiB0aGlzIGlzIHRha2VuIGZyb206CisqKgorKiogL3Vzci9zcmMvbGludXgvZHJpdmVycy9wY2kvcGNpLmMKKyoqIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvcGNpLmgKKyoqIC91c3Ivc3JjL2xpbnV4L2FyY2gvaTM4Ni9iaW9zMzIuYworKiogL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9iaW9zMzIuaAorKiogL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvbmUuYworKi8KKyNkZWZpbmUgUENCSU9TCisjaW5jbHVkZSAiZ3J1Yi5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaWZkZWYJQ09ORklHX1BDSV9ESVJFQ1QKKyNkZWZpbmUgIFBDSUJJT1NfU1VDQ0VTU0ZVTCAgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgREVCVUcgMAorCisvKgorICogRnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2l0aCB0eXBlIDEgYWNjZXNzZXMKKyAqLworCisjZGVmaW5lIENPTkZJR19DTUQoYnVzLCBkZXZpY2VfZm4sIHdoZXJlKSAgICgweDgwMDAwMDAwIHwgKGJ1cyA8PCAxNikgfCAoZGV2aWNlX2ZuIDw8IDgpIHwgKHdoZXJlICYgfjMpKQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90ICp2YWx1ZSkKK3sKKyAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKKyAgICAqdmFsdWUgPSBpbmIoMHhDRkMgKyAod2hlcmUmMykpOworICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK2ludCBwY2liaW9zX3JlYWRfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsCisgICAgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCAqdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgKnZhbHVlID0gaW53KDB4Q0ZDICsgKHdoZXJlJjIpKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKKwkJCQkgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MzJfdCAqdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgKnZhbHVlID0gaW5sKDB4Q0ZDKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZSAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKKwkJCQkgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90IHZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgIG91dGIodmFsdWUsIDB4Q0ZDICsgKHdoZXJlJjMpKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKKwkJCQkgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCB2YWx1ZSkKK3sKKyAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKKyAgICBvdXR3KHZhbHVlLCAweENGQyArICh3aGVyZSYyKSk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90IHZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgIG91dGwodmFsdWUsIDB4Q0ZDKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCisjdW5kZWYgQ09ORklHX0NNRAorCisjZWxzZQkgLyogQ09ORklHX1BDSV9ESVJFQ1QgIG5vdCBkZWZpbmVkICovCisKKyNpZiAhZGVmaW5lZChQQ0JJT1MpCisjZXJyb3IgIlRoZSBwY2liaW9zIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgUENCSU9TIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4iCisjZW5kaWYKKworCisjZGVmaW5lIEtFUk5fQ09ERV9TRUcgMFg4CisvKiBTdHVmZiBmb3IgYXNtICovCisjZGVmaW5lIHNhdmVfZmxhZ3MoeCkgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmbCA7IHBvcGwgJTAiOiI9ZyIgKHgpOiAvKiBubyBpbnB1dCAqLyA6Im1lbW9yeSIpCisKKyNkZWZpbmUgY2xpKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkiOiA6IDoibWVtb3J5IikKKworI2RlZmluZSByZXN0b3JlX2ZsYWdzKHgpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJwdXNobCAlMCA7IHBvcGZsIjogLyogbm8gb3V0cHV0ICovIDoiZyIgKHgpOiJtZW1vcnkiKQorCisKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IHNlZ21lbnQ7Cit9IGJpb3MzMl9pbmRpcmVjdCA9IHsgMCwgS0VSTl9DT0RFX1NFRyB9OworCitzdGF0aWMgbG9uZyBwY2liaW9zX2VudHJ5ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OworfSBwY2lfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmlvczMyX3NlcnZpY2UodW5zaWduZWQgbG9uZyBzZXJ2aWNlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dXJuX2NvZGU7CS8qICVhbCAqLworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJCS8qICVlYnggKi8KKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsJCS8qICVlY3ggKi8KKwl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogJWVkeCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVkaSkiCisjZWxzZQorCQkibGNhbGwgKiglJWVkaSkiCisjZW5kaWYKKwkJOiAiPWEiIChyZXR1cm5fY29kZSksCisJCSAgIj1iIiAoYWRkcmVzcyksCisJCSAgIj1jIiAobGVuZ3RoKSwKKwkJICAiPWQiIChlbnRyeSkKKwkJOiAiMCIgKHNlcnZpY2UpLAorCQkgICIxIiAoMCksCisJCSAgIkQiICgmYmlvczMyX2luZGlyZWN0KSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlzd2l0Y2ggKHJldHVybl9jb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBhZGRyZXNzICsgZW50cnk7CisJCWNhc2UgMHg4MDoJLyogTm90IHByZXNlbnQgKi8KKwkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogbm90IHByZXNlbnRcbiIsIHNlcnZpY2UpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogcmV0dXJuZWQgJSNYLCBtYWlsIGRyZXdAY29sb3JhZG8uZWR1XG4iLAorCQkJCXNlcnZpY2UsIHJldHVybl9jb2RlKTsKKwkJCXJldHVybiAwOworCX0KK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQ4X3QgKnZhbHVlKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgICAgIF9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisgICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKKyAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKKyAgICAgICAgICAgICAgICAiMToiCisgICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQorICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX0JZVEUpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHVuc2lnbmVkIGludCBidXMsCisgICAgICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDE2X3QgKnZhbHVlKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgICAgIF9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisgICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKKyAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKKyAgICAgICAgICAgICAgICAiMToiCisgICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQorICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX1dPUkQpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZCh1bnNpZ25lZCBpbnQgYnVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90ICp2YWx1ZSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZXQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNhdmVfZmxhZ3MoZmxhZ3MpOworICAgICAgICBfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgICAgICJqYyAxZlxuXHQiCisgICAgICAgICAgICAgICAgInhvciAlJWFoLCAlJWFoXG4iCisgICAgICAgICAgICAgICAgIjE6IgorICAgICAgICAgICAgICAgIDogIj1jIiAoKnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICI9YSIgKHJldCkKKyAgICAgICAgICAgICAgICA6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19EV09SRCksCisgICAgICAgICAgICAgICAgICAiYiIgKGJ4KSwKKyAgICAgICAgICAgICAgICAgICJEIiAoKGxvbmcpIHdoZXJlKSwKKyAgICAgICAgICAgICAgICAgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworICAgICAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Cit9CisKK2ludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlICh1bnNpZ25lZCBpbnQgYnVzLAorCXVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCV9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisJCSJqYyAxZlxuXHQiCisJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkiMToiCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfQllURSksCisJCSAgImMiICh2YWx1ZSksCisJCSAgImIiIChieCksCisJCSAgIkQiICgobG9uZykgd2hlcmUpLAorCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfd29yZCAodW5zaWduZWQgaW50IGJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQxNl90IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCSJsY2FsbCAoJSVlc2kpXG5cdCIKKyNlbHNlCisJCSJsY2FsbCAqKCUlZXNpKVxuXHQiCisjZW5kaWYKKwkJImpjIDFmXG5cdCIKKwkJInhvciAlJWFoLCAlJWFoXG4iCisJCSIxOiIKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19XT1JEKSwKKwkJICAiYyIgKHZhbHVlKSwKKwkJICAiYiIgKGJ4KSwKKwkJICAiRCIgKChsb25nKSB3aGVyZSksCisJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Cit9CisKK2ludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQzMl90IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCSJsY2FsbCAoJSVlc2kpXG5cdCIKKyNlbHNlCisJCSJsY2FsbCAqKCUlZXNpKVxuXHQiCisjZW5kaWYKKwkJImpjIDFmXG5cdCIKKwkJInhvciAlJWFoLCAlJWFoXG4iCisJCSIxOiIKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19EV09SRCksCisJCSAgImMiICh2YWx1ZSksCisJCSAgImIiIChieCksCisJCSAgIkQiICgobG9uZykgd2hlcmUpLAorCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitzdGF0aWMgdm9pZCBjaGVja19wY2liaW9zKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7CisJdW5zaWduZWQgY2hhciBwcmVzZW50X3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIG1ham9yX3JldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgbWlub3JfcmV2aXNpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcGFjazsKKworCWlmICgocGNpYmlvc19lbnRyeSA9IGJpb3MzMl9zZXJ2aWNlKFBDSV9TRVJWSUNFKSkpIHsKKwkJcGNpX2luZGlyZWN0LmFkZHJlc3MgPSBwY2liaW9zX2VudHJ5OworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJCSJsY2FsbCAoJSVlZGkpXG5cdCIKKyNlbHNlCisJCQkibGNhbGwgKiglJWVkaSlcblx0IgorI2VuZGlmCisJCQkiamMgMWZcblx0IgorCQkJInhvciAlJWFoLCAlJWFoXG4iCisJCQkiMTpcdHNobCAkOCwgJSVlYXhcblx0IgorCQkJIm1vdncgJSVieCwgJSVheCIKKwkJCTogIj1kIiAoc2lnbmF0dXJlKSwKKwkJCSAgIj1hIiAocGFjaykKKwkJCTogIjEiIChQQ0lCSU9TX1BDSV9CSU9TX1BSRVNFTlQpLAorCQkJICAiRCIgKCZwY2lfaW5kaXJlY3QpCisJCQk6ICJieCIsICJjeCIpOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCQlwcmVzZW50X3N0YXR1cyA9IChwYWNrID4+IDE2KSAmIDB4ZmY7CisJCW1ham9yX3JldmlzaW9uID0gKHBhY2sgPj4gOCkgJiAweGZmOworCQltaW5vcl9yZXZpc2lvbiA9IHBhY2sgJiAweGZmOworCQlpZiAocHJlc2VudF9zdGF0dXMgfHwgKHNpZ25hdHVyZSAhPSBQQ0lfU0lHTkFUVVJFKSkgeworCQkJcHJpbnRmKCJFUlJPUjogQklPUzMyIHNheXMgUENJIEJJT1MsIGJ1dCBubyBQQ0kgIgorCQkJCSJCSU9TPz8/P1xuIik7CisJCQlwY2liaW9zX2VudHJ5ID0gMDsKKwkJfQorI2lmCURFQlVHCisJCWlmIChwY2liaW9zX2VudHJ5KSB7CisJCQlwcmludGYgKCJwY2liaW9zX2luaXQgOiBQQ0kgQklPUyByZXZpc2lvbiAlaGhYLiVoaFgiCisJCQkJIiBlbnRyeSBhdCAlI1hcbiIsIG1ham9yX3JldmlzaW9uLAorCQkJCW1pbm9yX3JldmlzaW9uLCBwY2liaW9zX2VudHJ5KTsKKwkJfQorI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBwY2liaW9zX2luaXQodm9pZCkKK3sKKwl1bmlvbiBiaW9zMzIgKmNoZWNrOworCXVuc2lnbmVkIGNoYXIgc3VtOworCWludCBpLCBsZW5ndGg7CisJdW5zaWduZWQgbG9uZyBiaW9zMzJfZW50cnkgPSAwOworCisJRW50ZXJGdW5jdGlvbigicGNpYmlvc19pbml0Iik7CisJLyoKKwkgKiBGb2xsb3cgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSBmb3IgbG9jYXRpbmcgdGhlIEJJT1MzMiBTZXJ2aWNlCisJICogZGlyZWN0b3J5IGJ5IHNjYW5uaW5nIHRoZSBwZXJtaXNzaWJsZSBhZGRyZXNzIHJhbmdlIGZyb20KKwkgKiAweGUwMDAwIHRocm91Z2ggMHhmZmZmZiBmb3IgYSB2YWxpZCBCSU9TMzIgc3RydWN0dXJlLgorCSAqCisJICovCisKKwlmb3IgKGNoZWNrID0gKHVuaW9uIGJpb3MzMiAqKSAweGUwMDAwOyBjaGVjayA8PSAodW5pb24gYmlvczMyICopIDB4ZmZmZjA7ICsrY2hlY2spIHsKKwkJaWYgKGNoZWNrLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCisJCQljb250aW51ZTsKKwkJbGVuZ3RoID0gY2hlY2stPmZpZWxkcy5sZW5ndGggKiAxNjsKKwkJaWYgKCFsZW5ndGgpCisJCQljb250aW51ZTsKKwkJc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGxlbmd0aCA7ICsraSkKKwkJCXN1bSArPSBjaGVjay0+Y2hhcnNbaV07CisJCWlmIChzdW0gIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2hlY2stPmZpZWxkcy5yZXZpc2lvbiAhPSAwKSB7CisJCQlwcmludGYoInBjaWJpb3NfaW5pdCA6IHVuc3VwcG9ydGVkIHJldmlzaW9uICVkIGF0ICUjWCwgbWFpbCBkcmV3QGNvbG9yYWRvLmVkdVxuIiwKKwkJCQljaGVjay0+ZmllbGRzLnJldmlzaW9uLCBjaGVjayk7CisJCQljb250aW51ZTsKKwkJfQorI2lmCURFQlVHCisJCXByaW50ZigicGNpYmlvc19pbml0IDogQklPUzMyIFNlcnZpY2UgRGlyZWN0b3J5ICIKKwkJCSJzdHJ1Y3R1cmUgYXQgJSNYXG4iLCBjaGVjayk7CisjZW5kaWYKKwkJaWYgKCFiaW9zMzJfZW50cnkpIHsKKwkJCWlmIChjaGVjay0+ZmllbGRzLmVudHJ5ID49IDB4MTAwMDAwKSB7CisJCQkJcHJpbnRmKCJwY2liaW9zX2luaXQ6IGVudHJ5IGluIGhpZ2ggIgorCQkJCQkibWVtb3J5LCBnaXZpbmcgdXBcbiIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJYmlvczMyX2VudHJ5ID0gY2hlY2stPmZpZWxkcy5lbnRyeTsKKyNpZglERUJVRworCQkJCXByaW50ZigicGNpYmlvc19pbml0IDogQklPUzMyIFNlcnZpY2UgRGlyZWN0b3J5IgorCQkJCQkiIGVudHJ5IGF0ICUjWFxuIiwgYmlvczMyX2VudHJ5KTsKKyNlbmRpZgorCQkJCWJpb3MzMl9pbmRpcmVjdC5hZGRyZXNzID0gYmlvczMyX2VudHJ5OworCQkJfQorCQl9CisJfQorCWlmIChiaW9zMzJfZW50cnkpCisJCWNoZWNrX3BjaWJpb3MoKTsKKwlMZWF2ZUZ1bmN0aW9uKCJwY2liaW9zX2luaXQiKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19QQ0lfRElSRUNUIG5vdCBkZWZpbmVkKi8KKwordW5zaWduZWQgbG9uZyBwY2liaW9zX2J1c19iYXNlKHVuc2lnbmVkIGludCBidXMgX191bnVzZWQpCit7CisJLyogYXJjaGl0ZWN0dXJhbGx5IHRoaXMgbXVzdCBiZSAwICovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmluZF9wY2koaW50IHR5cGUsIHN0cnVjdCBwY2lfZGV2aWNlICpkZXYpCit7CisJRW50ZXJGdW5jdGlvbigiZmluZF9wY2kiKTsKKyNpZm5kZWYJQ09ORklHX1BDSV9ESVJFQ1QKKwlpZiAoIXBjaWJpb3NfZW50cnkpIHsKKwkJcGNpYmlvc19pbml0KCk7CisJfQorCWlmICghcGNpYmlvc19lbnRyeSkgeworCQlwcmludGYoInBjaV9pbml0OiBubyBCSU9TMzIgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJTGVhdmVGdW5jdGlvbigiZmluZF9wY2kiKTsKKwlyZXR1cm4gc2Nhbl9wY2lfYnVzKHR5cGUsIGRldik7Cit9CkluZGV4OiBiL25ldGJvb3QvcGNuZXQzMi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3BjbmV0MzIuYwpAQCAtMCwwICsxLDEwMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBwY25ldDMyLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBBTUQgUENuZXQzMgorKiAgICBXcml0dGVuIDIwMDMtMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSBiYXNlZCBvbjoKKyoJCXBjbmV0MzIuYzogQW4gQU1EIFBDbmV0MzIgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eDoKKyoKKyoJKEMpIDE5OTYtMTk5OSBUaG9tYXMgQm9nZW5kb2VyZmVyCisqCQlTZWUgTGludXggRHJpdmVyIGZvciBmdWxsIGluZm9ybWF0aW9uCisqCQorKglUaGUgdHJhbnNtaXQgYW5kIHBvbGwgZnVuY3Rpb25zIHdlcmUgd3JpdHRlbiB3aXRoIHJlZmVyZW5jZSB0bzoKKyoJbGFuY2UuYyAtIExBTkNFIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdCB3cml0dGVuIGJ5IEtlbiBZYXAgCisqCQorKglMaW51eCBEcml2ZXIgVmVyc2lvbiAxLjI3YSwgMTAuMDIuMjAwMgorKiAKKyogCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwOC0wNi0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuMQkwOC0yMy0yMDAzCXRpbWxlZ2dlCUFkZCBtdWx0aWNhc3Qgc3VwcG9ydAorKiAgICB2MS4yCTAxLTE3LTIwMDQJdGltbGVnZ2UJSW5pdGlhbCBkcml2ZXIgb3V0cHV0IGNsZWFudXAKKyogICAgdjEuMwkwMy0yOS0yMDA0CXRpbWxlZ2dlCU1vcmUgZHJpdmVyIGNsZWFudXAKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKy8qIEluY2x1ZGUgdGhlIHRpbWUgZnVuY3Rpb25zICovCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJtaWkuaCIKKy8qIHZvaWQgaGV4X2R1bXAoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbik7ICovCisKKy8qIEV0aGVyYm9vdCBTcGVjaWZpYyBkZWZpbmF0aW9ucyAqLworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuMyIKKyNkZWZpbmUgZHJ2X2RhdGUgIjAzLTI5LTIwMDQiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKK3N0YXRpYyB1MzIgaW9hZGRyOwkJLyogR2xvYmFsbHkgdXNlZCBmb3IgdGhlIGNhcmQncyBpbyBhZGRyZXNzICovCisKKyNpZmRlZiBFREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBFbmQgRXRoZXJib290IFNwZWNpZmljICovCisKK2ludCBjYXJkc19mb3VuZCAvKiBfX2luaXRkYXRhICovIDsKKworI2lmZGVmIFJFTU9WRQorLyogRklYTUU6IFJlbW92ZSB0aGVzZSB0aGV5IGFyZSBwcm9iYWJseSBwb2ludGxlc3MgKi8KKworLyogCisgKiBWTEIgSS9PIGFkZHJlc3NlcyAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwY25ldDMyX3BvcnRsaXN0W10gLypfX2luaXRkYXRhICovICA9Cit7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwIH07CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kZWJ1ZyA9IDE7CitzdGF0aWMgaW50IHR4X3N0YXJ0ID0gMTsJLyogTWFwcGluZyAtLSAwOjIwLCAxOjY0LCAyOjEyOCwgMzp+MjIwIChkZXBlbmRzIG9uIGNoaXAgdmVycykgKi8KK3N0YXRpYyBpbnQgcGNuZXQzMnZsYjsJCS8qIGNoZWNrIGZvciBWTEIgY2FyZHMgPyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBjbmV0MzJfZGV2OworCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDgwOworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisjZW5kaWYKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FVSSAgICAgIDB4MDAKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwQlQgICAgIDB4MDEKKyNkZWZpbmUgUENORVQzMl9QT1JUX0dQU0kgICAgIDB4MDIKKyNkZWZpbmUgUENORVQzMl9QT1JUX01JSSAgICAgIDB4MDMKKworI2RlZmluZSBQQ05FVDMyX1BPUlRfUE9SVFNFTCAgMHgwMworI2RlZmluZSBQQ05FVDMyX1BPUlRfQVNFTCAgICAgMHgwNAorI2RlZmluZSBQQ05FVDMyX1BPUlRfMTAwICAgICAgMHg0MAorI2RlZmluZSBQQ05FVDMyX1BPUlRfRkQJICAgICAgMHg4MAorCisjZGVmaW5lIFBDTkVUMzJfRE1BX01BU0sgMHhmZmZmZmZmZgorCisvKgorICogdGFibGUgdG8gdHJhbnNsYXRlIG9wdGlvbiB2YWx1ZXMgZnJvbSB0dWxpcAorICogdG8gaW50ZXJuYWwgb3B0aW9ucworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBvcHRpb25zX21hcHBpbmdbXSA9IHsKKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDAgQXV0by1zZWxlY3QgICAgICAqLworCVBDTkVUMzJfUE9SVF9BVUksCS8qICAxIEJOQy9BVUkgICAgICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVVJLAkvKiAgMiBBVUkvQk5DICAgICAgICAgICovCisJUENORVQzMl9QT1JUX0FTRUwsCS8qICAzIG5vdCBzdXBwb3J0ZWQgICAgKi8KKwlQQ05FVDMyX1BPUlRfMTBCVCB8IFBDTkVUMzJfUE9SVF9GRCwJLyogIDQgMTBiYXNlVC1GRCAgICAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgNSBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUX0FTRUwsCS8qICA2IG5vdCBzdXBwb3J0ZWQgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDcgbm90IHN1cHBvcnRlZCAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgOCBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUX01JSSwJLyogIDkgTUlJIDEwYmFzZVQgICAgICAqLworCVBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfRkQsCS8qIDEwIE1JSSAxMGJhc2VULUZEICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJLAkvKiAxMSBNSUkgKGF1dG9zZWwpICAgICovCisJUENORVQzMl9QT1JUXzEwQlQsCS8qIDEyIDEwQmFzZVQgICAgICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJIHwgUENORVQzMl9QT1JUXzEwMCwJLyogMTMgTUlJIDEwMEJhc2VUeCAgICAqLworCVBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfMTAwIHwgUENORVQzMl9QT1JUX0ZELAkvKiAxNCBNSUkgMTAwQmFzZVR4LUZEICovCisJUENORVQzMl9QT1JUX0FTRUwJLyogMTUgbm90IHN1cHBvcnRlZCAgICAqLworfTsKKworI2RlZmluZSBNQVhfVU5JVFMgOAkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdOworCisvKgorICoJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorICogCisgKiBUaGlzIGRyaXZlciB1c2VzIHRoZSBzYW1lIHNvZnR3YXJlIHN0cnVjdHVyZSBhcyB0aGUgbm9ybWFsIGxhbmNlCisgKiBkcml2ZXIuIFNvIGxvb2sgZm9yIGEgdmVyYm9zZSBkZXNjcmlwdGlvbiBpbiBsYW5jZS5jLiBUaGUgZGlmZmVyZW5jZXMKKyAqIHRvIHRoZSBub3JtYWwgbGFuY2UgZHJpdmVyIGlzIHRoZSB1c2Ugb2YgdGhlIDMyYml0IG1vZGUgb2YgUENuZXQzMgorICogYW5kIFBDbmV0UENJIGNoaXBzLiBCZWNhdXNlIHRoZXNlIGNoaXBzIGFyZSAzMmJpdCBjaGlwcywgdGhlcmUgaXMgbm8KKyAqIDE2TUIgbGltaXRhdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCBib3VuY2UgYnVmZmVycy4KKyAqLworCisKKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICogUmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBhcmUgNCBUeCBidWZmZXJzLCBhbmQgMTYgUnggYnVmZmVycy4KKyAqIFRoYXQgdHJhbnNsYXRlcyB0byAyICg0ID09IDJeXjIpIGFuZCA0ICgxNiA9PSAyXl40KS4KKyAqLworI2lmbmRlZiBQQ05FVDMyX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMgMQorI2RlZmluZSBQQ05FVDMyX0xPR19SWF9CVUZGRVJTIDIKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUgLSAxKQorLyogRklYTUU6IEZpeCB0aGlzIHRvIGFsbG93IG11bHRpcGxlIHR4X3JpbmcgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUwkweDAwMDAJLypQQ05FVDMyX0xPR19UWF9CVUZGRVJTKSA8PCAxMikgKi8KKworI2RlZmluZSBSWF9SSU5HX1NJWkUJCSgxIDw8IChQQ05FVDMyX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkoKFBDTkVUMzJfTE9HX1JYX0JVRkZFUlMpIDw8IDQpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NAorCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgUENORVQzMl9XSU9fUkRQCQkweDEwCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JBUAkJMHgxMgorI2RlZmluZSBQQ05FVDMyX1dJT19SRVNFVAkweDE0CisjZGVmaW5lIFBDTkVUMzJfV0lPX0JEUAkJMHgxNgorCisjZGVmaW5lIFBDTkVUMzJfRFdJT19SRFAJMHgxMAorI2RlZmluZSBQQ05FVDMyX0RXSU9fUkFQCTB4MTQKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JFU0VUCTB4MTgKKyNkZWZpbmUgUENORVQzMl9EV0lPX0JEUAkweDFDCisKKyNkZWZpbmUgUENORVQzMl9UT1RBTF9TSVpFCTB4MjAKKworLyogQnVmZmVycyBmb3IgdGhlIHR4IGFuZCBSeCAqLworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUEtUX0JVRl9TWiBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07CisvLyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFBLVF9CVUZfU1ogZm9yIGVhY2gKK1JYIERlc2NyaXB0b3IgICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYQorcGFydCBvZiB0aGlzIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW1JYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1pdOworLy8gICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKy8qIFRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0MzJfcnhfaGVhZCB7CisJdTMyIGJhc2U7CisJczE2IGJ1Zl9sZW5ndGg7CisJczE2IHN0YXR1czsKKwl1MzIgbXNnX2xlbmd0aDsKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkIHsKKwl1MzIgYmFzZTsKKwlzMTYgbGVuZ3RoOworCXMxNiBzdGF0dXM7CisJdTMyIG1pc2M7CisJdTMyIHJlc2VydmVkOworfTsKKworLyogVGhlIFBDTkVUMzIgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIHsKKwl1MTYgbW9kZTsKKwl1MTYgdGxlbl9ybGVuOworCXU4IHBoeXNfYWRkcls2XTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIGZpbHRlclsyXTsKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1MzIgcnhfcmluZzsKKwl1MzIgdHhfcmluZzsKK307CisvKiBQQ25ldDMyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0cnVjdCBwY25ldDMyX2FjY2VzcyB7CisJdTE2KCpyZWFkX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX3JhcCkgKHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCp3cml0ZV9yYXApICh1bnNpZ25lZCBsb25nLCB1MTYpOworCXZvaWQgKCpyZXNldCkgKHVuc2lnbmVkIGxvbmcpOworfTsKKworLyogRGVmaW5lIHRoZSBUWCBEZXNjcmlwdG9yICovCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfdHhfaGVhZCB0eF9yaW5nW1RYX1JJTkdfU0laRV0KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworCisvKiBEZWZpbmUgdGhlIFJYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9yeF9oZWFkIHJ4X3JpbmdbUlhfUklOR19TSVpFXQorICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworCisvKiBNYXkgbmVlZCB0byBiZSBtb3ZlZCB0byBtaWkuaCAqLworc3RydWN0IG1paV9pZl9pbmZvIHsKKwlpbnQgcGh5X2lkOworCWludCBhZHZlcnRpc2luZzsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJLyogaXMgZnVsbCBkdXBsZXg/ICovCit9OworCisvKgorICogVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBvZiBwY25ldDMyX3ByaXZhdGUgYXJlIHJlYWQgYnkgdGhlIGV0aGVybmV0IGRldmljZSAKKyAqIHNvIHdlIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBieSBwY2lfYWxsb2NfY29uc2lzdGVudCgpLgorICovCisjZGVmaW5lIE1JSV9DTlQgNAorc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSB7CisJc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayBpbml0X2Jsb2NrOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkvKiBQb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHBjaSBkZXZpY2Ugc3RydWN0dXJlICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHBjbmV0MzJfYWNjZXNzIGE7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwljaGFyIHR4X2Z1bGw7CisJaW50IG9wdGlvbnM7CisJaW50IHNoYXJlZF9pcnE6MSwJLyogc2hhcmVkIGlycSBwb3NzaWJsZSAqLworCSBsdGludDoxLAkJLyogZW5hYmxlIFR4RG9uZS1pbnRyIGluaGliaXRvciAqLworCSBkeHN1ZmxvOjEsCQkvKiBkaXNhYmxlIHRyYW5zbWl0IHN0b3Agb24gdWZsbyAqLworCSBtaWk6MTsJCQkvKiBtaWkgcG9ydCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKKwlpbnQgZnVsbF9kdXBsZXg6MTsKK30gbHB4OworCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pOworI2lmIDAKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwKKwkJICAgICAgIGludCB2YWwpOworI2VuZGlmCitlbnVtIHBjaV9mbGFnc19iaXQgeworCVBDSV9VU0VTX0lPID0gMSwgUENJX1VTRVNfTUVNID0gMiwgUENJX1VTRVNfTUFTVEVSID0gNCwKKwlQQ0lfQUREUjAgPSAweDEwIDw8IDAsIFBDSV9BRERSMSA9IDB4MTAgPDwgMSwgUENJX0FERFIyID0KKwkgICAgMHgxMCA8PCAyLCBQQ0lfQUREUjMgPSAweDEwIDw8IDMsCit9OworCisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJcmV0dXJuIGludyhhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fd3JpdGVfY3NyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dHcoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2Jjcih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKwlvdXR3KGluZGV4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9iY3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJb3V0dyh2YWwsIGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfd2lvX3JlYWRfcmFwKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9yYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludyhhZGRyICsgUENORVQzMl9XSU9fUkVTRVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXR3KDg4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gKGludyhhZGRyICsgUENORVQzMl9XSU9fUkFQKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl93aW8gPSB7CisgICAgICByZWFkX2NzcjpwY25ldDMyX3dpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX3dpb193cml0ZV9jc3IsCisgICAgICByZWFkX2JjcjpwY25ldDMyX3dpb19yZWFkX2JjciwKKyAgICAgIHdyaXRlX2JjcjpwY25ldDMyX3dpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX3dpb19yZWFkX3JhcCwKKyAgICAgIHdyaXRlX3JhcDpwY25ldDMyX3dpb193cml0ZV9yYXAsCisgICAgICByZXNldDpwY25ldDMyX3dpb19yZXNldAorfTsKKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCXJldHVybiAoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCW91dGwodmFsLCBhZGRyICsgUENORVQzMl9EV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlyZXR1cm4gKGlubChhZGRyICsgUENORVQzMl9EV0lPX0JEUCkgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2R3aW9fd3JpdGVfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlvdXRsKHZhbCwgYWRkciArIFBDTkVUMzJfRFdJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIChpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiB2YWwpCit7CisJb3V0bCh2YWwsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3Jlc2V0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXRsKDg4LCBhZGRyICsgUENORVQzMl9EV0lPX1JBUCk7CisJcmV0dXJuICgoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKSAmIDB4ZmZmZikgPT0gODgpOworfQorCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfYWNjZXNzIHBjbmV0MzJfZHdpbyA9IHsKKyAgICAgIHJlYWRfY3NyOnBjbmV0MzJfZHdpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX2R3aW9fd3JpdGVfY3NyLAorICAgICAgcmVhZF9iY3I6cGNuZXQzMl9kd2lvX3JlYWRfYmNyLAorICAgICAgd3JpdGVfYmNyOnBjbmV0MzJfZHdpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX2R3aW9fcmVhZF9yYXAsCisgICAgICB3cml0ZV9yYXA6cGNuZXQzMl9kd2lvX3dyaXRlX3JhcCwKKyAgICAgIHJlc2V0OnBjbmV0MzJfZHdpb19yZXNldAorfTsKKworCisvKiBJbml0aWFsaXplIHRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5ncy4gKi8KK3N0YXRpYyBpbnQgcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJbHAtPnR4X2Z1bGwgPSAwOworCWxwLT5jdXJfcnggPSBscC0+Y3VyX3R4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeF9yaW5nW2ldLmJhc2UgPSAodTMyKSB2aXJ0X3RvX2xlMzJkZXNjKCZyeGJbaV0pOworCQlyeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgtUEtUX0JVRl9TWik7CisJCXJ4X3JpbmdbaV0uc3RhdHVzID0gbGUxNl90b19jcHUoMHg4MDAwKTsKKwl9CisKKwkvKiBUaGUgVHggYnVmZmVyIGFkZHJlc3MgaXMgZmlsbGVkIGluIGFzIG5lZWRlZCwgYnV0IHdlIGRvIG5lZWQgdG8gY2xlYXIKKwkgICB0aGUgdXBwZXIgb3duZXJzaGlwIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfcmluZ1tpXS5iYXNlID0gMDsKKwkJdHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKworCisJbHAtPmluaXRfYmxvY2sudGxlbl9ybGVuID0KKwkgICAgbGUxNl90b19jcHUoVFhfUklOR19MRU5fQklUUyB8IFJYX1JJTkdfTEVOX0JJVFMpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCWxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodTMyKSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKHUzMikgdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwl1MTYgdmFsOworCWludCBpOworCisJLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKwlscC0+YS5yZXNldChpb2FkZHIpOworCisJLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworCS8qIHNldC9yZXNldCBhdXRvc2VsZWN0IGJpdCAqLworCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMikgJiB+MjsKKwlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkKKwkJdmFsIHw9IDI7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMiwgdmFsKTsKKwkvKiBoYW5kbGUgZnVsbCBkdXBsZXggc2V0dGluZyAqLworCWlmIChscC0+ZnVsbF9kdXBsZXgpIHsKKwkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCA5KSAmIH4zOworCQlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfRkQpIHsKKwkJCXZhbCB8PSAxOworCQkJaWYgKGxwLT5vcHRpb25zID09CisJCQkgICAgKFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9BVUkpKQorCQkJCXZhbCB8PSAyOworCQl9IGVsc2UgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkJCS8qIHdvcmthcm91bmQgb2YgeFNlcmllczI1MCwgdHVybiBvbiBmb3IgNzlDOTc1IG9ubHkgKi8KKwkJCWkgPSAoKGxwLT5hLgorCQkJICAgICAgcmVhZF9jc3IoaW9hZGRyLAorCQkJCSAgICAgICA4OCkgfCAobHAtPmEucmVhZF9jc3IoaW9hZGRyLAorCQkJCQkJCSAgICAgODkpIDw8IDE2KSkgPj4KKwkJCSAgICAgMTIpICYgMHhmZmZmOworCQkJaWYgKGkgPT0gMHgyNjI3KQorCQkJCXZhbCB8PSAzOworCQl9CisJCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDksIHZhbCk7CisJfQorCisJLyogc2V0L3Jlc2V0IEdQU0kgYml0IGluIHRlc3QgcmVnaXN0ZXIgKi8KKwl2YWwgPSBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDEyNCkgJiB+MHgxMDsKKwlpZiAoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpID09IFBDTkVUMzJfUE9SVF9HUFNJKQorCQl2YWwgfD0gMHgxMDsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAxMjQsIHZhbCk7CisKKwlpZiAobHAtPm1paSAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpKSB7CisJCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpICYgfjB4Mzg7CS8qIGRpc2FibGUgQXV0byBOZWdvdGlhdGlvbiwgc2V0IDEwTXBicywgSEQgKi8KKwkJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0ZEKQorCQkJdmFsIHw9IDB4MTA7CisJCWlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF8xMDApCisJCQl2YWwgfD0gMHgwODsKKwkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsIHZhbCk7CisJfSBlbHNlIHsKKwkJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsJLyogZW5hYmxlIGF1dG8gbmVnb3RpYXRlLCBzZXR1cCwgZGlzYWJsZSBmZCAqLworCQkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgJiB+MHg5ODsKKwkJCXZhbCB8PSAweDIwOworCQkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsIHZhbCk7CisJCX0KKwl9CisKKyNpZmRlZiBET19EWFNVRkxPCisJaWYgKGxwLT5keHN1ZmxvKSB7CS8qIERpc2FibGUgdHJhbnNtaXQgc3RvcCBvbiB1bmRlcmZsb3cgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9jc3IoaW9hZGRyLCAzKTsKKwkJdmFsIHw9IDB4NDA7CisJCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDMsIHZhbCk7CisJfQorI2VuZGlmCisKKwlpZiAobHAtPmx0aW50KSB7CS8qIEVuYWJsZSBUeERvbmUtaW50ciBpbmhpYml0b3IgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9jc3IoaW9hZGRyLCA1KTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgNSwgdmFsKTsKKwl9CisJbHAtPmluaXRfYmxvY2subW9kZSA9CisJICAgIGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4ZmZmZmZmZmY7CisKKwlwY25ldDMyX2luaXRfcmluZyhuaWMpOworCisKKwkvKiBSZS1pbml0aWFsaXplIHRoZSBQQ05FVDMyLCBhbmQgc3RhcnQgaXQgd2hlbiBkb25lLiAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDEsCisJCQkodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgJiAweGZmZmYpOworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDIsICh2aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKSA+PiAxNik7CisJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgNCwgMHgwOTE1KTsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDEpOworCisKKwlpID0gMDsKKwl3aGlsZSAoaSsrIDwgMTAwKQorCQlpZiAobHAtPmEucmVhZF9jc3IoaW9hZGRyLCAwKSAmIDB4MDEwMCkKKwkJCWJyZWFrOworCS8qIAorCSAqIFdlIHVzZWQgdG8gY2xlYXIgdGhlIEluaXREb25lIGJpdCwgMHgwMTAwLCBoZXJlIGJ1dCBNYXJrIFN0b2NrdG9uCisJICogcmVwb3J0cyB0aGF0IGRvaW5nIHNvIHRyaWdnZXJzIGEgYnVnIGluIHRoZSAnOTc0LgorCSAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDA0Mik7CisKKwlkcHJpbnRmKCgicGNuZXQzMiBvcGVuLCBjc3IwICVoWC5cbiIsIGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBjbmV0MzJfcG9sbChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCByZXRyaWV2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCisJaW50IHN0YXR1czsKKwlpbnQgZW50cnk7CisKKwllbnRyeSA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworCXN0YXR1cyA9ICgoc2hvcnQpIGxlMTZfdG9fY3B1KHJ4X3JpbmdbZW50cnldLnN0YXR1cykgPj4gOCk7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworCWlmIChzdGF0dXMgPT0gMHgwMykgeworCQluaWMtPnBhY2tldGxlbiA9CisJCSAgICAobGUzMl90b19jcHUocnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCkgJiAweGZmZikgLSA0OworCQltZW1jcHkobmljLT5wYWNrZXQsICZyeGJbZW50cnldLCBuaWMtPnBhY2tldGxlbik7CisKKwkJLyogQW5kcmV3IEJveWQgb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzc2NQorCQkgKiBjbGVhciB0aGUgYnVmZmVyIGxlbmd0aCAqLworCQlyeF9yaW5nW2VudHJ5XS5idWZfbGVuZ3RoID0gbGUxNl90b19jcHUoLVBLVF9CVUZfU1opOworCQlyeF9yaW5nW2VudHJ5XS5zdGF0dXMgfD0gbGUxNl90b19jcHUoMHg4MDAwKTsJLyogcHJpbWUgZm9yIG5leHQgcmVjZWl2ZSAqLworCQkvKiBTd2l0Y2ggdG8gdGhlIG5leHQgUnggcmluZyBidWZmZXIgKi8KKwkJbHAtPmN1cl9yeCsrOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJdW5zaWduZWQgbG9uZyB0aW1lOworCXU4ICpwdHhiOworCXUxNiBuc3R5cGU7CisJdTE2IHN0YXR1czsKKwlpbnQgZW50cnkgPSAwOwkJLypscC0+Y3VyX3R4ICYgVFhfUklOR19NT0RfTUFTSzsgKi8KKworCXN0YXR1cyA9IDB4ODMwMDsKKwkvKiBwb2ludCB0byB0aGUgY3VycmVudCB0eGIgaW5jYXNlIG11bHRpcGxlIHR4X3JpbmdzIGFyZSB1c2VkICovCisJcHR4YiA9IHR4YiArIChscC0+Y3VyX3R4ICogUEtUX0JVRl9TWik7CisKKwkvKiBjb3B5IHRoZSBwYWNrZXQgdG8gcmluZyBidWZmZXIgKi8KKwltZW1jcHkocHR4YiwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkocHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwkvKiBzcmMgKi8KKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsJLyogdHlwZSAqLworCW1lbWNweShwdHhiICsgMiAqIEVUSF9BTEVOLCAodTggKikgJiBuc3R5cGUsIDIpOwkvKiB0eXBlICovCisJbWVtY3B5KHB0eGIgKyBFVEhfSExFTiwgcCwgcyk7CisKKwlzICs9IEVUSF9ITEVOOworCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCisJCXB0eGJbcysrXSA9ICdcMCc7CisKKwl0eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtcyk7CisJdHhfcmluZ1tlbnRyeV0ubWlzYyA9IDB4MDAwMDAwMDA7CisJdHhfcmluZ1tlbnRyeV0uYmFzZSA9ICh1MzIpIHZpcnRfdG9fbGUzMmRlc2MocHR4Yik7CisKKwkvKiB3ZSBzZXQgdGhlIHRvcCBieXRlIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgKi8KKwl0eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBsZTE2X3RvX2NwdShzdGF0dXMpOworCisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwgKi8KKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwNDgpOworCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGUgKi8KKwlscC0+Y3VyX3R4ID0gMDsJCS8qIChscC0+Y3VyX3R4ICsgMSk7ICovCisJdGltZSA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsJLyogd2FpdCBvbmUgc2Vjb25kICovCisJd2hpbGUgKGN1cnJ0aWNrcygpIDwgdGltZSAmJgorCSAgICAgICAoKHNob3J0KSBsZTE2X3RvX2NwdSh0eF9yaW5nW2VudHJ5XS5zdGF0dXMpIDwgMCkpOworCisJaWYgKChzaG9ydCkgbGUxNl90b19jcHUodHhfcmluZ1tlbnRyeV0uc3RhdHVzKSA8IDApCisJCXByaW50ZigiUENORVQzMiB0aW1lZCBvdXQgb24gdHJhbnNtaXRcbiIpOworCisJLyogU3RvcCBwb2ludGluZyBhdCB0aGUgY3VycmVudCB0eGIKKwkgKiBvdGhlcndpc2UgdGhlIGNhcmQgY29udGludWVzIHRvIHNlbmQgdGhlIHBhY2tldCAqLworCXR4X3JpbmdbZW50cnldLmJhc2UgPSAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNuZXQzMl9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwkvKiBTdG9wIHRoZSBQQ05FVDMyIGhlcmUgLS0gaXQgb2Nhc3Npb25hbGx5IHBvbGxzIG1lbW9yeSBpZiB3ZSBkb24ndCAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDAwNCk7CisKKwkvKgorCSAqIFN3aXRjaCBiYWNrIHRvIDE2LWJpdCBtb2RlIHRvIGF2b2lkIHByb2JsZXNtIHdpdGggZHVtYiAKKwkgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisJICovCisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMjAsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNuZXQzMl9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKK1lvdSBzaG91bGQgb21pdCB0aGUgbGFzdCBhcmd1bWVudCBzdHJ1Y3QgcGNpX2RldmljZSAqIGZvciBhIG5vbi1QQ0kgTklDCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBjbmV0MzJfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopIGRldjsKKwlpbnQgaSwgbWVkaWE7CisJaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvLCBsdGludDsKKwlpbnQgY2hpcF92ZXJzaW9uOworCWNoYXIgKmNoaXBuYW1lOworCXN0cnVjdCBwY25ldDMyX2FjY2VzcyAqYSA9IE5VTEw7CisJdTggcHJvbWFkZHJbNl07CisKKwlpbnQgc2hhcmVkID0gMTsKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBCQVNFIGlzIHVzZWQgdGhyb3VnaG91dCB0byBhZGRyZXNzIHRoZSBjYXJkICovCisJaW9hZGRyID0gcGNpLT5pb2FkZHI7CisJcHJpbnRmKCJwY25ldDMyLmM6IEZvdW5kICVzLCBWZW5kb3I9MHglaFggRGV2aWNlPTB4JWhYXG4iLAorCSAgICAgICBwY2ktPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldl9pZCk7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworCisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlwY25ldDMyX3dpb19yZXNldChpb2FkZHIpOworCisJLyogTk9URTogMTYtYml0IGNoZWNrIGlzIGZpcnN0LCBvdGhlcndpc2Ugc29tZSBvbGRlciBQQ25ldCBjaGlwcyBmYWlsICovCisJaWYgKHBjbmV0MzJfd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNAorCSAgICAmJiBwY25ldDMyX3dpb19jaGVjayhpb2FkZHIpKSB7CisJCWEgPSAmcGNuZXQzMl93aW87CisJfSBlbHNlIHsKKwkJcGNuZXQzMl9kd2lvX3Jlc2V0KGlvYWRkcik7CisJCWlmIChwY25ldDMyX2R3aW9fcmVhZF9jc3IoaW9hZGRyLCAwKSA9PSA0CisJCSAgICAmJiBwY25ldDMyX2R3aW9fY2hlY2soaW9hZGRyKSkgeworCQkJYSA9ICZwY25ldDMyX2R3aW87CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJY2hpcF92ZXJzaW9uID0KKwkgICAgYS0+cmVhZF9jc3IoaW9hZGRyLCA4OCkgfCAoYS0+cmVhZF9jc3IoaW9hZGRyLCA4OSkgPDwgMTYpOworCisJZHByaW50ZigoIlBDbmV0IGNoaXAgdmVyc2lvbiBpcyAlMHhoWFxuIiwgY2hpcF92ZXJzaW9uKSk7CisJaWYgKChjaGlwX3ZlcnNpb24gJiAweGZmZikgIT0gMHgwMDMpCisJCXJldHVybiAwOworCisJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmZHggPSBtaWkgPSBmc2V0ID0gZHhzdWZsbyA9IGx0aW50ID0gMDsKKwljaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKworCXN3aXRjaCAoY2hpcF92ZXJzaW9uKSB7CisJY2FzZSAweDI0MjA6CisJCWNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOwkvKiBQQ0kgKi8KKwkJYnJlYWs7CisJY2FzZSAweDI0MzA6CisJCWlmIChzaGFyZWQpCisJCQljaGlwbmFtZSA9ICJQQ25ldC9QQ0kgNzlDOTcwIjsJLyogOTcwIGdpdmVzIHRoZSB3cm9uZyBjaGlwIGlkIGJhY2sgKi8KKwkJZWxzZQorCQkJY2hpcG5hbWUgPSAiUENuZXQvMzIgNzlDOTY1IjsJLyogNDg2L1ZMIGJ1cyAqLworCQlicmVhazsKKwljYXNlIDB4MjYyMToKKwkJY2hpcG5hbWUgPSAiUENuZXQvUENJIElJIDc5Qzk3MEEiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjM6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgNzlDOTcxIjsJLyogUENJICovCisJCWZkeCA9IDE7CisJCW1paSA9IDE7CisJCWZzZXQgPSAxOworCQlsdGludCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgyNjI0OgorCQljaGlwbmFtZSA9ICJQQ25ldC9GQVNUKyA3OUM5NzIiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJbWlpID0gMTsKKwkJZnNldCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgyNjI1OgorCQljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzMiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJbWlpID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjY6CisJCWNoaXBuYW1lID0gIlBDbmV0L0hvbWUgNzlDOTc4IjsJLyogUENJICovCisJCWZkeCA9IDE7CisJCS8qIAorCQkgKiBUaGlzIGlzIGJhc2VkIG9uIHNwZWNzIHB1Ymxpc2hlZCBhdCB3d3cuYW1kLmNvbS4gIFRoaXMgc2VjdGlvbgorCQkgKiBhc3N1bWVzIHRoYXQgYSBjYXJkIHdpdGggYSA3OUM5Nzggd2FudHMgdG8gZ28gaW50byAxTWIgSG9tZVBOQQorCQkgKiBtb2RlLiAgVGhlIDc5Qzk3OCBjYW4gYWxzbyBnbyBpbnRvIHN0YW5kYXJkIGV0aGVybmV0LCBhbmQgdGhlcmUKKwkJICogcHJvYmFibHkgc2hvdWxkIGJlIHNvbWUgc29ydCBvZiBtb2R1bGUgb3B0aW9uIHRvIHNlbGVjdCB0aGUKKwkJICogbW9kZSBieSB3aGljaCB0aGUgY2FyZCBzaG91bGQgb3BlcmF0ZQorCQkgKi8KKwkJLyogc3dpdGNoIHRvIGhvbWUgd2lyaW5nIG1vZGUgKi8KKwkJbWVkaWEgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDQ5KTsKKworCQlwcmludGYoIm1lZGlhIHJlc2V0IHRvICUjeC5cbiIsIG1lZGlhKTsKKwkJYS0+d3JpdGVfYmNyKGlvYWRkciwgNDksIG1lZGlhKTsKKwkJYnJlYWs7CisJY2FzZSAweDI2Mjc6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3NSI7CS8qIFBDSSAqLworCQlmZHggPSAxOworCQltaWkgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlBDbmV0IHZlcnNpb24gJSN4LCBubyBQQ25ldDMyIGNoaXAuXG4iLAorCQkgICAgICAgY2hpcF92ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgT24gc2VsZWN0ZWQgY2hpcHMgdHVybiBvbiB0aGUgQkNSMTg6Tk9VRkxPIGJpdC4gVGhpcyBzdG9wcyB0cmFuc21pdAorCSAqICBzdGFydGluZyB1bnRpbCB0aGUgcGFja2V0IGlzIGxvYWRlZC4gU3RyaWtlIG9uZSBmb3IgcmVsaWFiaWxpdHksIGxvc2UKKwkgKiAgb25lIGZvciBsYXRlbmN5IC0gYWx0aG91Z2ggb24gUENJIHRoaXMgaXNudCBhIGJpZyBsb3NzLiBPbGRlciBjaGlwcyAKKwkgKiAgaGF2ZSBGSUZPJ3Mgc21hbGxlciB0aGFuIGEgcGFja2V0LCBzbyB5b3UgY2FuJ3QgZG8gdGhpcy4KKwkgKi8KKworCWlmIChmc2V0KSB7CisJCWEtPndyaXRlX2Jjcihpb2FkZHIsIDE4LAorCQkJICAgICAoYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAweDA4MDApKTsKKwkJYS0+d3JpdGVfY3NyKGlvYWRkciwgODAsCisJCQkgICAgIChhLT5yZWFkX2Nzcihpb2FkZHIsIDgwKSAmIDB4MEMwMCkgfCAweDBjMDApOworCQlkeHN1ZmxvID0gMTsKKwkJbHRpbnQgPSAxOworCX0KKworCWRwcmludGYoKCIlcyBhdCAlaFgsIiwgY2hpcG5hbWUsIGlvYWRkcikpOworCisJLyogcmVhZCBQUk9NIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcm9tYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKTsKKworCS8qIFVwZGF0ZSB0aGUgbmljIHN0cnVjdHVyZSB3aXRoIHRoZSBNQUMgQWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gcHJvbWFkZHJbaV07CisJfQorCS8qIFByaW50IG91dCBzb21lIGhhcmR3YXJlIGluZm8gKi8KKwlwcmludGYoIiVzOiAlISBhdCBpb2FkZHIgJWhYLCAiLCBwY2ktPm5hbWUsIG5pYy0+bm9kZV9hZGRyLAorCSAgICAgICBpb2FkZHIpOworCisJLyogU2V0IHRvIHBjaSBidXMgbWFzdGVyICovCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCWxwID0gJmxweDsKKworI2lmIEVCREVCVUcKKwlpZiAoKChjaGlwX3ZlcnNpb24gKyAxKSAmIDB4ZmZmZSkgPT0gMHgyNjI0KSB7CS8qIFZlcnNpb24gMHgyNjIzIG9yIDB4MjYyNCAqLworCQlpID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4MCkgJiAweDBDMDA7CS8qIENoZWNrIHR4X3N0YXJ0X3B0ICovCisJCWRwcmludGYoKCIgICAgdHhfc3RhcnRfcHQoMHglaFgpOiIsIGkpKTsKKwkJc3dpdGNoIChpID4+IDEwKSB7CisJCWNhc2UgMDoKKwkJCWRwcmludGYoKCIgIDIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkcHJpbnRmKCgiICA2NCBieXRlcywiKSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHByaW50ZigoIiAxMjggYnl0ZXMsIikpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRwcmludGYoKCJ+MjIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQl9CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDE4KTsJLyogQ2hlY2sgQnVyc3QvQnVzIGNvbnRyb2wgKi8KKwkJZHByaW50ZigoIiBCQ1IxOCglaFgpOiIsIGkgJiAweGZmZmYpKTsKKwkJaWYgKGkgJiAoMSA8PCA1KSkKKwkJCWRwcmludGYoKCJCdXJzdFdyRW4gIikpOworCQlpZiAoaSAmICgxIDw8IDYpKQorCQkJZHByaW50ZigoIkJ1cnN0UmRFbiAiKSk7CisJCWlmIChpICYgKDEgPDwgNykpCisJCQlkcHJpbnRmKCgiRFdvcmRJTyAiKSk7CisJCWlmIChpICYgKDEgPDwgMTEpKQorCQkJZHByaW50ZigoIk5vVUZsb3cgIikpOworCQlpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNSk7CisJCWRwcmludGYoKCIgICAgU1JBTVNJWkU9MHglaFgsIiwgaSA8PCA4KSk7CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI2KTsKKwkJZHByaW50ZigoIiBTUkFNX0JORD0weCVoWCwiLCBpIDw8IDgpKTsKKwkJaSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMjcpOworCQlpZiAoaSAmICgxIDw8IDE0KSkKKwkJCWRwcmludGYoKCJMb3dMYXRSeCIpKTsKKwl9CisjZW5kaWYKKwlscC0+bmFtZSA9IGNoaXBuYW1lOworCWxwLT5zaGFyZWRfaXJxID0gc2hhcmVkOworCWxwLT5mdWxsX2R1cGxleCA9IGZkeDsKKwlscC0+ZHhzdWZsbyA9IGR4c3VmbG87CisJbHAtPmx0aW50ID0gbHRpbnQ7CisJbHAtPm1paSA9IG1paTsKKwkvKiBGSVhNRTogRml4IE9wdGlvbnMgZm9yIG9ubHkgb25lIGNhcmQgKi8KKwlpZiAoKGNhcmRzX2ZvdW5kID49IE1BWF9VTklUUykKKwkgICAgfHwgKCh1bnNpZ25lZCBpbnQpIG9wdGlvbnNbY2FyZHNfZm91bmRdID4gc2l6ZW9mKG9wdGlvbnNfbWFwcGluZykpKQorCQlscC0+b3B0aW9ucyA9IFBDTkVUMzJfUE9SVF9BU0VMOworCWVsc2UKKwkJbHAtPm9wdGlvbnMgPSBvcHRpb25zX21hcHBpbmdbb3B0aW9uc1tjYXJkc19mb3VuZF1dOworCisJaWYgKGZkeCAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpICYmCisJICAgICgoY2FyZHNfZm91bmQgPj0gTUFYX1VOSVRTKSB8fCBmdWxsX2R1cGxleFtjYXJkc19mb3VuZF0pKQorCQlscC0+b3B0aW9ucyB8PSBQQ05FVDMyX1BPUlRfRkQ7CisKKwlpZiAoIWEpIHsKKwkJcHJpbnRmKCJObyBhY2Nlc3MgbWV0aG9kc1xuIik7CisJCXJldHVybiAwOworCX0KKwlscC0+YSA9ICphOworCisJLyogZGV0ZWN0IHNwZWNpYWwgVDEvRTEgV0FOIGNhcmQgYnkgY2hlY2tpbmcgZm9yIE1BQyBhZGRyZXNzICovCisJaWYgKG5pYy0+bm9kZV9hZGRyWzBdID09IDB4MDAgJiYgbmljLT5ub2RlX2FkZHJbMV0gPT0gMHhlMAorCSAgICAmJiBuaWMtPm5vZGVfYWRkclsyXSA9PSAweDc1KQorCQlscC0+b3B0aW9ucyA9IFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9HUFNJOworCisJbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KDB4MDAwMyk7CS8qIERpc2FibGUgUnggYW5kIFR4LiAqLworCWxwLT5pbml0X2Jsb2NrLnRsZW5fcmxlbiA9CisJICAgIGxlMTZfdG9fY3B1KFRYX1JJTkdfTEVOX0JJVFMgfCBSWF9SSU5HX0xFTl9CSVRTKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4ZmZmZmZmZmY7CisJbHAtPmluaXRfYmxvY2sucnhfcmluZyA9IHZpcnRfdG9fYnVzKCZyeF9yaW5nKTsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gdmlydF90b19idXMoJnR4X3JpbmcpOworCisJLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworCWEtPndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgMSwgKHZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jaykpICYgMHhmZmZmKTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgPj4gMTYpOworCisJLyogCisJICogVG8gYXV0by1JUlEgd2UgZW5hYmxlIHRoZSBpbml0aWFsaXphdGlvbi1kb25lIGFuZCBETUEgZXJyb3IKKwkgKiBpbnRlcnJ1cHRzLiBGb3IgSVNBIGJvYXJkcyB3ZSBnZXQgYSBETUEgZXJyb3IsIGJ1dCBWTEIgYW5kIFBDSQorCSAqIGJvYXJkcyB3aWxsIHdvcmsuCisJICovCisJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbiBqdXN0IGZvciB0aGUgaW50ZXJydXB0LiAqLworCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgMCwgMHg0MSk7CisJbWRlbGF5KDEpOworCisJY2FyZHNfZm91bmQrKzsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCXBjbmV0MzJfcmVzZXQobmljKTsKKwlpZiAoMSkgeworCSAgICAgICAgaW50IHRtcDsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCXUxNiBtaWlfbHBhOworCQlscC0+cGh5c1swXSA9IDE7CS8qIERlZmF1bHQgU2V0dGluZyAqLworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBNSUlfQ05UOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQobmljLCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCWxwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyA9CisJCQkJICAgIG1kaW9fcmVhZChuaWMsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKSB7CisJCQkJICB0bXAgPSBwaHk7CisJCQkJICBkcHJpbnRmICgoIk1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIgCisJCQkJCSAgICAiJWhYIGFkdmVydGlzaW5nICVoWFxuIiwgcGh5LCBtaWlfc3RhdHVzLCAKKwkJCQkJICAgIGxwLT5taWlfaWYuYWR2ZXJ0aXNpbmcpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBoeV9pZHggPT0gMCkKKwkJCXByaW50ZigiTm8gTUlJIHRyYW5zY2VpdmVyIGZvdW5kIVxuIik7CisJCWxwLT5taWlfaWYucGh5X2lkID0gbHAtPnBoeXNbMF07CisKKwkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyA9CisJCSAgICBtZGlvX3JlYWQobmljLCBscC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSk7CisKKwkJbWlpX2xwYSA9IG1kaW9fcmVhZChuaWMsIGxwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyAmPSBtaWlfbHBhOworCQlpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQkJcHJpbnRmKCIxMDBNYnBzIEZ1bGwtRHVwbGV4XG4iKTsKKwkJZWxzZSBpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQkJcHJpbnRmKCIxMDBNYnBzIEhhbGYtRHVwbGV4XG4iKTsKKwkJZWxzZSBpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEZVTEwpCisJCQlwcmludGYoIjEwTWJwcyBGdWxsLUR1cGxleFxuIik7CisJCWVsc2UgaWYgKGxwLT5taWlfaWYuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQkJcHJpbnRmKCIxME1icHMgSGFsZi1EdXBsZXhcbiIpOworCQllbHNlCisJCQlwcmludGYoIlxuIik7CisJfQorCisJbmljLT5wb2xsICAgICA9IHBjbmV0MzJfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gcGNuZXQzMl90cmFuc21pdDsKKwlkZXYtPmRpc2FibGUgID0gcGNuZXQzMl9kaXNhYmxlOworCW5pYy0+aXJxICAgICAgPSBwY25ldDMyX2lycTsKKworCXJldHVybiAxOworfQorc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKK3sKKwl1MTYgdmFsX291dDsKKwlpbnQgcGh5YWRkcjsKKworCWlmICghbHAtPm1paSkKKwkJcmV0dXJuIDA7CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwl2YWxfb3V0ID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsIHBoeWFkZHIpOworCisJcmV0dXJuIHZhbF9vdXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sCisJCSAgICAgICBpbnQgdmFsKQoreworCWludCBwaHlhZGRyOworCisJaWYgKCFscC0+bWlpKQorCQlyZXR1cm47CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzNCwgdmFsKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgcGh5YWRkcik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfaWQgcGNuZXQzMl9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwMjIsIDB4MjAwMCwgImxhbmNlcGNpIiwgIkFNRCBMYW5jZS9QQ0kiKSwKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyNjI1LCAicGNuZXRmYXN0aWlpIiwgIkFNRCBMYW5jZS9QQ0kgUENOZXQvMzIiKSwKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyMDAxLCAiYW1kaG9tZXBuYSIsICJBTUQgTGFuY2UvSG9tZVBOQSIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgcGNuZXQzMl9kcml2ZXIgPSB7CisJLnR5cGUgPSBOSUNfRFJJVkVSLAorCS5uYW1lID0gIlBDTkVUMzIvUENJIiwKKwkucHJvYmUgPSBwY25ldDMyX3Byb2JlLAorCS5pZHMgPSBwY25ldDMyX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHBjbmV0MzJfbmljcykgLyBzaXplb2YocGNuZXQzMl9uaWNzWzBdKSwKKwkuY2xhc3MgPSAwLAorfTsKSW5kZXg6IGIvbmV0Ym9vdC9waWM4MjU5LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvcGljODI1OS5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogQmFzaWMgc3VwcG9ydCBmb3IgY29udHJvbGxpbmcgdGhlIDgyNTkgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVycy4KKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEJyb3duIChtY2IzMCkuCisgKi8KKworI2luY2x1ZGUgPGV0aGVyYm9vdC5oPgorI2luY2x1ZGUgPHBpYzgyNTkuaD4KKworI2lmZGVmIERFQlVHX0lSUQorI2RlZmluZSBEQkcoLi4uKSBwcmludGYgKCBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBEQkcoLi4uKQorI2VuZGlmCisKKy8qIEN1cnJlbnQgbG9jYXRpb25zIG9mIHRyaXZpYWwgSVJRIGhhbmRsZXIuICBUaGVzZSB3aWxsIGNoYW5nZSBhdAorICogcnVudGltZSB3aGVuIHJlbG9jYXRpb24gaXMgdXNlZDsgdGhlIGhhbmRsZXIgbmVlZHMgdG8gYmUgY29waWVkIHRvCisgKiBiYXNlIG1lbW9yeSBiZWZvcmUgYmVpbmcgaW5zdGFsbGVkLgorICovCit2b2lkICgqdHJpdmlhbF9pcnFfaGFuZGxlcilQKCh2b2lkKSkgPSBfdHJpdmlhbF9pcnFfaGFuZGxlcjsKK3VpbnQxNl90IHZvbGF0aWxlICp0cml2aWFsX2lycV90cmlnZ2VyX2NvdW50ID0gJl90cml2aWFsX2lycV90cmlnZ2VyX2NvdW50Oworc2Vnb2ZmX3QgKnRyaXZpYWxfaXJxX2NoYWluX3RvID0gJl90cml2aWFsX2lycV9jaGFpbl90bzsKK3VpbnQ4X3QgKnRyaXZpYWxfaXJxX2NoYWluID0gJl90cml2aWFsX2lycV9jaGFpbjsKK2lycV90IHRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbiA9IElSUV9OT05FOworCisvKiBQcmV2aW91cyB0cmlnZ2VyIGNvdW50IGZvciB0cml2aWFsIElSUSBoYW5kbGVyICovCitzdGF0aWMgdWludDE2X3QgdHJpdmlhbF9pcnFfcHJldmlvdXNfdHJpZ2dlcl9jb3VudCA9IDA7CisKKy8qIEluc3RhbGwgYSBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIElSUS4gIEFkZHJlc3Mgb2YgcHJldmlvdXMKKyAqIGhhbmRsZXIgd2lsbCBiZSBzdG9yZWQgaW4gcHJldmlvdXNfaGFuZGxlci4gIEVuYWJsZWQvZGlzYWJsZWQgc3RhdGUKKyAqIG9mIElSUSB3aWxsIGJlIHByZXNlcnZlZCBhY3Jvc3MgY2FsbCwgdGhlcmVmb3JlIGlmIHRoZSBoYW5kbGVyIGRvZXMKKyAqIGNoYWluaW5nLCBlbnN1cmUgdGhhdCBlaXRoZXIgKGEpIElSUSBpcyBkaXNhYmxlZCBiZWZvcmUgY2FsbCwgb3IKKyAqIChiKSBwcmV2aW91c19oYW5kbGVyIHBvaW50cyBkaXJlY3RseSB0byB0aGUgcGxhY2UgdGhhdCB0aGUgaGFuZGxlcgorICogcGlja3MgdXAgaXRzIGNoYWluLXRvIGFkZHJlc3MuCisgKi8KKworaW50IGluc3RhbGxfaXJxX2hhbmRsZXIgKCBpcnFfdCBpcnEsIHNlZ29mZl90ICpoYW5kbGVyLAorCQkJICB1aW50OF90ICpwcmV2aW91c2x5X2VuYWJsZWQsCisJCQkgIHNlZ29mZl90ICpwcmV2aW91c19oYW5kbGVyICkgeworCXNlZ29mZl90ICppcnFfdmVjdG9yID0gSVJRX1ZFQ1RPUiAoIGlycSApOworCSpwcmV2aW91c2x5X2VuYWJsZWQgPSBpcnFfZW5hYmxlZCAoIGlycSApOworCisJaWYgKCBpcnEgPiBJUlFfTUFYICkgeworCQlEQkcgKCAiSW52YWxpZCBJUlEgbnVtYmVyICVkXG4iICk7CisJCXJldHVybiAwOworCX0KKworCXByZXZpb3VzX2hhbmRsZXItPnNlZ21lbnQgPSBpcnFfdmVjdG9yLT5zZWdtZW50OworCXByZXZpb3VzX2hhbmRsZXItPm9mZnNldCA9IGlycV92ZWN0b3ItPm9mZnNldDsKKwlpZiAoICpwcmV2aW91c2x5X2VuYWJsZWQgKSBkaXNhYmxlX2lycSAoIGlycSApOworCURCRyAoICJJbnN0YWxsaW5nIGhhbmRsZXIgYXQgJWh4OiVoeCBmb3IgSVJRICVkLCBsZWF2aW5nICVzXG4iLAorCQkgIGhhbmRsZXItPnNlZ21lbnQsIGhhbmRsZXItPm9mZnNldCwgaXJxLAorCQkgICggKnByZXZpb3VzbHlfZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIgKSApOworCURCRyAoICIuLi4ocHJldmlvdXMgaGFuZGxlciBhdCAlaHg6JWh4KVxuIiwKKwkJICBwcmV2aW91c19oYW5kbGVyLT5zZWdtZW50LCBwcmV2aW91c19oYW5kbGVyLT5vZmZzZXQgKTsKKwlpcnFfdmVjdG9yLT5zZWdtZW50ID0gaGFuZGxlci0+c2VnbWVudDsKKwlpcnFfdmVjdG9yLT5vZmZzZXQgPSBoYW5kbGVyLT5vZmZzZXQ7CisJaWYgKCAqcHJldmlvdXNseV9lbmFibGVkICkgZW5hYmxlX2lycSAoIGlycSApOworCXJldHVybiAxOworfQorCisvKiBSZW1vdmUgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCBJUlEuICBSb3V0aW5lIGNoZWNrcyB0aGF0IGFub3RoZXIKKyAqIGhhbmRsZXIgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCB0aGF0IGNoYWlucyB0byBoYW5kbGVyIGJlZm9yZQorICogdW5pbnN0YWxsaW5nIGhhbmRsZXIuICBFbmFibGVkL2Rpc2FibGVkIHN0YXRlIG9mIHRoZSBJUlEgd2lsbCBiZQorICogcmVzdG9yZWQgdG8gdGhhdCBzcGVjaWZpZWQgYnkgcHJldmlvdXNseV9lbmFibGVkLgorICovCisKK2ludCByZW1vdmVfaXJxX2hhbmRsZXIgKCBpcnFfdCBpcnEsIHNlZ29mZl90ICpoYW5kbGVyLAorCQkJIHVpbnQ4X3QgKnByZXZpb3VzbHlfZW5hYmxlZCwKKwkJCSBzZWdvZmZfdCAqcHJldmlvdXNfaGFuZGxlciApIHsKKwlzZWdvZmZfdCAqaXJxX3ZlY3RvciA9IElSUV9WRUNUT1IgKCBpcnEgKTsKKworCWlmICggaXJxID4gSVJRX01BWCApIHsKKwkJREJHICggIkludmFsaWQgSVJRIG51bWJlciAlZFxuIiApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCAoIGlycV92ZWN0b3ItPnNlZ21lbnQgIT0gaGFuZGxlci0+c2VnbWVudCApIHx8CisJICAgICAoIGlycV92ZWN0b3ItPm9mZnNldCAhPSBoYW5kbGVyLT5vZmZzZXQgKSApIHsKKwkJREJHICggIkNhbm5vdCByZW1vdmUgaGFuZGxlciBmb3IgSVJRICVkXG4iICk7CisJCXJldHVybiAwOworCX0KKworCURCRyAoICJSZW1vdmluZyBoYW5kbGVyIGZvciBJUlEgJWRcbiIsIGlycSApOworCWRpc2FibGVfaXJxICggaXJxICk7CisJaXJxX3ZlY3Rvci0+c2VnbWVudCA9IHByZXZpb3VzX2hhbmRsZXItPnNlZ21lbnQ7CisJaXJxX3ZlY3Rvci0+b2Zmc2V0ID0gcHJldmlvdXNfaGFuZGxlci0+b2Zmc2V0OworCWlmICggKnByZXZpb3VzbHlfZW5hYmxlZCApIGVuYWJsZV9pcnEgKCBpcnEgKTsKKwlyZXR1cm4gMTsKK30KKworLyogSW5zdGFsbCB0aGUgdHJpdmlhbCBJUlEgaGFuZGxlci4gIFRoaXMgcm91dGluZSBpbnN0YWxscyB0aGUKKyAqIGhhbmRsZXIsIHRlc3RzIGl0IGFuZCBlbmFibGVzIHRoZSBJUlEuCisgKi8KKworaW50IGluc3RhbGxfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGlycV90IGlycSApIHsKKwlzZWdvZmZfdCB0cml2aWFsX2lycV9oYW5kbGVyX3NlZ29mZiA9IFNFR09GRih0cml2aWFsX2lycV9oYW5kbGVyKTsKKwkKKwlpZiAoIHRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbiAhPSBJUlFfTk9ORSApIHsKKwkJREJHICggIkNhbiBpbnN0YWxsIHRyaXZpYWwgSVJRIGhhbmRsZXIgb25seSBvbmNlXG4iICk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIFNFR01FTlQodHJpdmlhbF9pcnFfaGFuZGxlcikgPiAweGZmZmYgKSB7CisJCURCRyAoICJUcml2aWFsIElSUSBoYW5kbGVyIG5vdCBpbiBiYXNlIG1lbW9yeVxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkcgKCAiSW5zdGFsbGluZyB0cml2aWFsIElSUSBoYW5kbGVyIG9uIElSUSAlZFxuIiwgaXJxICk7CisJaWYgKCAhIGluc3RhbGxfaXJxX2hhbmRsZXIgKCBpcnEsICZ0cml2aWFsX2lycV9oYW5kbGVyX3NlZ29mZiwKKwkJCQkgICAgIHRyaXZpYWxfaXJxX2NoYWluLAorCQkJCSAgICAgdHJpdmlhbF9pcnFfY2hhaW5fdG8gKSApCisJCXJldHVybiAwOworCXRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbiA9IGlycTsKKworCURCRyAoICJUZXN0aW5nIHRyaXZpYWwgSVJRIGhhbmRsZXJcbiIgKTsKKwlkaXNhYmxlX2lycSAoIGlycSApOworCSp0cml2aWFsX2lycV90cmlnZ2VyX2NvdW50ID0gMDsKKwl0cml2aWFsX2lycV9wcmV2aW91c190cmlnZ2VyX2NvdW50ID0gMDsKKwlmYWtlX2lycSAoIGlycSApOworCWlmICggISB0cml2aWFsX2lycV90cmlnZ2VyZWQgKCBpcnEgKSApIHsKKwkJREJHICggIkluc3RhbGxhdGlvbiBvZiB0cml2aWFsIElSUSBoYW5kbGVyIGZhaWxlZFxuIiApOworCQlyZW1vdmVfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGlycSApOworCQlyZXR1cm4gMDsKKwl9CisJREJHICggIlRyaXZpYWwgSVJRIGhhbmRsZXIgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVxuIiApOworCWVuYWJsZV9pcnEgKCBpcnEgKTsKKwlyZXR1cm4gMTsKK30KKworLyogUmVtb3ZlIHRoZSB0cml2aWFsIElSUSBoYW5kbGVyLgorICovCisKK2ludCByZW1vdmVfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGlycV90IGlycSApIHsKKwlzZWdvZmZfdCB0cml2aWFsX2lycV9oYW5kbGVyX3NlZ29mZiA9IFNFR09GRih0cml2aWFsX2lycV9oYW5kbGVyKTsKKworCWlmICggdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uID09IElSUV9OT05FICkgcmV0dXJuIDE7CisJaWYgKCBpcnEgIT0gdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uICkgeworCQlEQkcgKCAiQ2Fubm90IHVuaW5zdGFsbCB0cml2aWFsIElSUSBoYW5kbGVyIGZyb20gSVJRICVkOyAiCisJCSAgICAgICJpcyBpbnN0YWxsZWQgb24gSVJRICVkXG4iLCBpcnEsCisJCSAgICAgIHRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoICEgcmVtb3ZlX2lycV9oYW5kbGVyICggaXJxLCAmdHJpdmlhbF9pcnFfaGFuZGxlcl9zZWdvZmYsCisJCQkJICAgIHRyaXZpYWxfaXJxX2NoYWluLAorCQkJCSAgICB0cml2aWFsX2lycV9jaGFpbl90byApICkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIHRyaXZpYWxfaXJxX3RyaWdnZXJlZCAoIHRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbiApICkgeworCQlEQkcgKCAiU2VuZGluZyBFT0kgZm9yIHVud2FudGVkIHRyaXZpYWwgSVJRXG4iICk7CisJCXNlbmRfc3BlY2lmaWNfZW9pICggdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uICk7CisJfQorCisJdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uID0gSVJRX05PTkU7CisJcmV0dXJuIDE7Cit9CisKKy8qIFNhZmUgbWV0aG9kIHRvIGRldGVjdCB3aGV0aGVyIG9yIG5vdCB0cml2aWFsIElSUSBoYXMgYmVlbgorICogdHJpZ2dlcmVkLiAgVXNpbmcgdGhpcyBjYWxsIGF2b2lkcyBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLiAgVGhpcworICogY2FsbCB3aWxsIHJldHVybiBzdWNjZXNzIG9ubHkgb25jZSBwZXIgdHJpZ2dlci4KKyAqLworCitpbnQgdHJpdmlhbF9pcnFfdHJpZ2dlcmVkICggaXJxX3QgaXJxICkgeworCXVpbnQxNl90IHRyaXZpYWxfaXJxX3RoaXNfdHJpZ2dlcl9jb3VudCA9ICp0cml2aWFsX2lycV90cmlnZ2VyX2NvdW50OworCWludCB0cmlnZ2VyZWQgPSAoIHRyaXZpYWxfaXJxX3RoaXNfdHJpZ2dlcl9jb3VudCAtCisJCQkgIHRyaXZpYWxfaXJxX3ByZXZpb3VzX3RyaWdnZXJfY291bnQgKTsKKwkKKwkvKiBpcnEgaXMgbm90IHVzZWQgYXQgcHJlc2VudCwgYnV0IHdlIGhhdmUgaXQgaW4gdGhlIEFQSSBmb3IKKwkgKiBmdXR1cmUtcHJvb2Zpbmc7IGluIGNhc2Ugd2Ugd2FudCB0aGUgZmFjaWxpdHkgdG8gaGF2ZQorCSAqIG11bHRpcGxlIHRyaXZpYWwgSVJRIGhhbmRsZXJzIGluc3RhbGxlZCBzaW11bHRhbmVvdXNseS4KKwkgKgorCSAqIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHZhcmlhYmxlLgorCSAqLworCWlmICggaXJxID09IElSUV9OT05FICkge307CisJCisJdHJpdmlhbF9pcnFfcHJldmlvdXNfdHJpZ2dlcl9jb3VudCA9IHRyaXZpYWxfaXJxX3RoaXNfdHJpZ2dlcl9jb3VudDsKKwlyZXR1cm4gdHJpZ2dlcmVkID8gMSA6IDA7Cit9CisKKy8qIENvcHkgdHJpdmlhbCBJUlEgaGFuZGxlciB0byBhIG5ldyBsb2NhdGlvbi4gIFR5cGljYWxseSB1c2VkIHRvIGNvcHkKKyAqIHRoZSBoYW5kbGVyIGludG8gYmFzZSBtZW1vcnk7IHdoZW4gcmVsb2NhdGlvbiBpcyBiZWluZyB1c2VkIHdlIG5lZWQKKyAqIHRvIGRvIHRoaXMgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGhhbmRsZXIuCisgKgorICogQ2FsbCB3aXRoIHRhcmdldD1OVUxMIGluIG9yZGVyIHRvIHJlc3RvcmUgdGhlIGhhbmRsZXIgdG8gaXRzCisgKiBvcmlnaW5hbCBsb2NhdGlvbi4KKyAqLworCitpbnQgY29weV90cml2aWFsX2lycV9oYW5kbGVyICggdm9pZCAqdGFyZ2V0LCBzaXplX3QgdGFyZ2V0X3NpemUgKSB7CisJaXJxX3QgY3VycmVudGx5X2luc3RhbGxlZF9vbiA9IHRyaXZpYWxfaXJxX2luc3RhbGxlZF9vbjsKKwl1aW50MzJfdCBvZmZzZXQgPSAoIHRhcmdldCA9PSBOVUxMID8gMCA6CisJCQkgICAgdGFyZ2V0IC0gJl90cml2aWFsX2lycV9oYW5kbGVyX3N0YXJ0ICk7CisKKwlpZiAoKCB0YXJnZXQgIT0gTlVMTCApICYmICggdGFyZ2V0X3NpemUgPCBUUklWSUFMX0lSUV9IQU5ETEVSX1NJWkUgKSkgeworCQlEQkcgKCAiSW5zdWZmaWNpZW50IHNwYWNlIHRvIGNvcHkgdHJpdmlhbCBJUlEgaGFuZGxlclxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIGN1cnJlbnRseV9pbnN0YWxsZWRfb24gIT0gSVJRX05PTkUgKSB7CisJCURCRyAoIldBUk5JTkc6IHJlbG9jYXRpbmcgdHJpdmlhbCBJUlEgaGFuZGxlciB3aGlsZSBpbiB1c2VcbiIpOworCQlpZiAoICEgcmVtb3ZlX3RyaXZpYWxfaXJxX2hhbmRsZXIgKCBjdXJyZW50bHlfaW5zdGFsbGVkX29uICkgKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogRG8gdGhlIGFjdHVhbCBjb3B5ICovCisJaWYgKCB0YXJnZXQgIT0gTlVMTCApIHsKKwkJREJHICggIkNvcHlpbmcgdHJpdmlhbCBJUlEgaGFuZGxlciB0byAlaHg6JWh4XG4iLAorCQkgICAgICBTRUdNRU5UKHRhcmdldCksIE9GRlNFVCh0YXJnZXQpICk7CisJCW1lbWNweSAoIHRhcmdldCwgJl90cml2aWFsX2lycV9oYW5kbGVyX3N0YXJ0LAorCQkJIFRSSVZJQUxfSVJRX0hBTkRMRVJfU0laRSApOworCX0gZWxzZSB7CisJCURCRyAoICJSZXN0b3JpbmcgdHJpdmlhbCBJUlEgaGFuZGxlciB0byBvcmlnaW5hbCBsb2NhdGlvblxuIiApOworCX0KKwkvKiBVcGRhdGUgYWxsIHRoZSBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIHdpdGhpbiB0aGUgaGFuZGxlciAqLworCXRyaXZpYWxfaXJxX2hhbmRsZXIgPSAoIHZvaWQgKCopUCgodm9pZCkpICkKKwkJKCAodm9pZCopX3RyaXZpYWxfaXJxX2hhbmRsZXIgKyBvZmZzZXQgKTsKKwl0cml2aWFsX2lycV90cmlnZ2VyX2NvdW50ID0gKHVpbnQxNl90KikKKwkJKCAodm9pZCopJl90cml2aWFsX2lycV90cmlnZ2VyX2NvdW50ICsgb2Zmc2V0ICk7CisJdHJpdmlhbF9pcnFfY2hhaW5fdG8gPSAoc2Vnb2ZmX3QqKQorCQkoICh2b2lkKikmX3RyaXZpYWxfaXJxX2NoYWluX3RvICsgb2Zmc2V0ICk7CisJdHJpdmlhbF9pcnFfY2hhaW4gPSAodWludDhfdCopCisJCSggKHZvaWQqKSZfdHJpdmlhbF9pcnFfY2hhaW4gKyBvZmZzZXQgKTsKKworCWlmICggY3VycmVudGx5X2luc3RhbGxlZF9vbiAhPSBJUlFfTk9ORSApIHsKKwkJaWYgKCAhIGluc3RhbGxfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGN1cnJlbnRseV9pbnN0YWxsZWRfb24gKSApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIFNlbmQgbm9uLXNwZWNpZmljIEVPSShzKS4gIFRoaXMgc2VlbXMgdG8gYmUgaW5oZXJlbnRseSB1bnNhZmUuCisgKi8KKwordm9pZCBzZW5kX25vbnNwZWNpZmljX2VvaSAoIGlycV90IGlycSApIHsKKwlEQkcgKCAiU2VuZGluZyBub24tc3BlY2lmaWMgRU9JIGZvciBJUlEgJWRcbiIsIGlycSApOworCWlmICggaXJxID49IElSUV9QSUNfQ1VUT0ZGICkgeworCQlvdXRiICggSUNSX0VPSV9OT05fU1BFQ0lGSUMsIFBJQzJfSUNSICk7CisJfQkJCisJb3V0YiAoIElDUl9FT0lfTk9OX1NQRUNJRklDLCBQSUMxX0lDUiApOworfQorCisvKiBTZW5kIHNwZWNpZmljIEVPSShzKS4KKyAqLworCit2b2lkIHNlbmRfc3BlY2lmaWNfZW9pICggaXJxX3QgaXJxICkgeworCURCRyAoICJTZW5kaW5nIHNwZWNpZmljIEVPSSBmb3IgSVJRICVkXG4iLCBpcnEgKTsKKwlvdXRiICggSUNSX0VPSV9TUEVDSUZJQyB8IElDUl9WQUxVRShpcnEpLCBJQ1JfUkVHKGlycSkgKTsKKwlpZiAoIGlycSA+PSBJUlFfUElDX0NVVE9GRiApIHsKKwkJb3V0YiAoIElDUl9FT0lfU1BFQ0lGSUMgfCBJQ1JfVkFMVUUoQ0hBSU5FRF9JUlEpLAorCQkgICAgICAgSUNSX1JFRyhDSEFJTkVEX0lSUSkgKTsKKwl9Cit9CisKKy8qIER1bXAgY3VycmVudCA4MjU5IHN0YXR1czogZW5hYmxlZCBJUlFzIGFuZCBoYW5kbGVyIGFkZHJlc3Nlcy4KKyAqLworCisjaWZkZWYgREVCVUdfSVJRCit2b2lkIGR1bXBfaXJxX3N0YXR1cyAoIHZvaWQgKSB7CisJaW50IGlycSA9IDA7CisJCisJZm9yICggaXJxID0gMDsgaXJxIDwgMTY7IGlycSsrICkgeworCQlpZiAoIGlycV9lbmFibGVkICggaXJxICkgKSB7CisJCQlwcmludGYgKCAiSVJRJWQgZW5hYmxlZCwgSVNSIGF0ICVoeDolaHhcbiIsIGlycSwKKwkJCQkgSVJRX1ZFQ1RPUihpcnEpLT5zZWdtZW50LAorCQkJCSBJUlFfVkVDVE9SKGlycSktPm9mZnNldCApOworCQl9CisJfQorfQorI2VuZGlmCkluZGV4OiBiL25ldGJvb3QvcGljODI1OS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3BpYzgyNTkuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQmFzaWMgc3VwcG9ydCBmb3IgY29udHJvbGxpbmcgdGhlIDgyNTkgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVycy4KKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEJyb3duIChtY2IzMCkuCisgKi8KKworI2lmbmRlZiBQSUM4MjU5X0gKKyNkZWZpbmUgUElDODI1OV9ICisKKy8qIEZvciBzZWdvZmZfdCAqLworI2luY2x1ZGUgPHNlZ29mZi5oPgorCisjZGVmaW5lIElSUV9QSUNfQ1VUT0ZGICg4KQorCisvKiA4MjU5IHJlZ2lzdGVyIGxvY2F0aW9ucyAqLworI2RlZmluZSBQSUMxX0lDVzEgKDB4MjApCisjZGVmaW5lIFBJQzFfT0NXMiAoMHgyMCkKKyNkZWZpbmUgUElDMV9PQ1czICgweDIwKQorI2RlZmluZSBQSUMxX0lDUiAoMHgyMCkKKyNkZWZpbmUgUElDMV9JUlIgKDB4MjApCisjZGVmaW5lIFBJQzFfSVNSICgweDIwKQorI2RlZmluZSBQSUMxX0lDVzIgKDB4MjEpCisjZGVmaW5lIFBJQzFfSUNXMyAoMHgyMSkKKyNkZWZpbmUgUElDMV9JQ1c0ICgweDIxKQorI2RlZmluZSBQSUMxX0lNUiAoMHgyMSkKKyNkZWZpbmUgUElDMl9JQ1cxICgweGEwKQorI2RlZmluZSBQSUMyX09DVzIgKDB4YTApCisjZGVmaW5lIFBJQzJfT0NXMyAoMHhhMCkKKyNkZWZpbmUgUElDMl9JQ1IgKDB4YTApCisjZGVmaW5lIFBJQzJfSVJSICgweGEwKQorI2RlZmluZSBQSUMyX0lTUiAoMHhhMCkKKyNkZWZpbmUgUElDMl9JQ1cyICgweGExKQorI2RlZmluZSBQSUMyX0lDVzMgKDB4YTEpCisjZGVmaW5lIFBJQzJfSUNXNCAoMHhhMSkKKyNkZWZpbmUgUElDMl9JTVIgKDB4YTEpCisKKy8qIFJlZ2lzdGVyIGNvbW1hbmQgdmFsdWVzICovCisjZGVmaW5lIE9DVzNfSUQgKDB4MDgpCisjZGVmaW5lIE9DVzNfUkVBRF9JUlIgKDB4MDMpCisjZGVmaW5lIE9DVzNfUkVBRF9JU1IgKDB4MDIpCisjZGVmaW5lIElDUl9FT0lfTk9OX1NQRUNJRklDICgweDIwKQorI2RlZmluZSBJQ1JfRU9JX05PUCAoMHg0MCkKKyNkZWZpbmUgSUNSX0VPSV9TUEVDSUZJQyAoMHg2MCkKKyNkZWZpbmUgSUNSX0VPSV9TRVRfUFJJT1JJVFkgKDB4YzApCisKKy8qIE1hY3JvcyB0byBlbmFibGUvZGlzYWJsZSBJUlFzICovCisjZGVmaW5lIElNUl9SRUcoeCkgKCAoeCkgPCBJUlFfUElDX0NVVE9GRiA/IFBJQzFfSU1SIDogUElDMl9JTVIgKQorI2RlZmluZSBJTVJfQklUKHgpICggMSA8PCAoICh4KSAlIElSUV9QSUNfQ1VUT0ZGICkgKQorI2RlZmluZSBpcnFfZW5hYmxlZCh4KSAoICggaW5iICggSU1SX1JFRyh4KSApICYgSU1SX0JJVCh4KSApID09IDAgKQorI2RlZmluZSBlbmFibGVfaXJxKHgpIG91dGIgKCBpbmIoIElNUl9SRUcoeCkgKSAmIH5JTVJfQklUKHgpLCBJTVJfUkVHKHgpICkKKyNkZWZpbmUgZGlzYWJsZV9pcnEoeCkgb3V0YiAoIGluYiggSU1SX1JFRyh4KSApIHwgSU1SX0JJVCh4KSwgSU1SX1JFRyh4KSApCisKKy8qIE1hY3JvcyBmb3IgYWNrbm93bGVkZ2luZyBJUlFzICovCisjZGVmaW5lIElDUl9SRUcoeCkgKCAoeCkgPCBJUlFfUElDX0NVVE9GRiA/IFBJQzFfSUNSIDogUElDMl9JQ1IgKQorI2RlZmluZSBJQ1JfVkFMVUUoeCkgKCAoeCkgJSBJUlFfUElDX0NVVE9GRiApCisjZGVmaW5lIENIQUlORURfSVJRIDIKKworLyogVXRpbGl0eSBtYWNyb3MgdG8gY29udmVydCBJUlEgbnVtYmVycyB0byBJTlQgbnVtYmVycyBhbmQgSU5UIHZlY3RvcnMgICovCisjZGVmaW5lIElSUV9JTlQoeCkgKCAoeCk8SVJRX1BJQ19DVVRPRkYgPyAoeCkrMHgwOCA6ICh4KS1JUlFfUElDX0NVVE9GRisweDcwICkKKyNkZWZpbmUgSU5UX1ZFQ1RPUih4KSAoIChzZWdvZmZfdCopIHBoeXNfdG9fdmlydCggNCAqICh4KSApICkKKyNkZWZpbmUgSVJRX1ZFQ1RPUih4KSAoIElOVF9WRUNUT1IgKCBJUlFfSU5UKHgpICkgKQorCisvKiBPdGhlciBjb25zdGFudHMgKi8KK3R5cGVkZWYgdWludDhfdCBpcnFfdDsKKyNkZWZpbmUgSVJRX01BWCAoMTUpCisjZGVmaW5lIElSUV9OT05FICgweGZmKQorCisvKiBMYWJlbHMgaW4gYXNzZW1ibHkgY29kZSAoaW4gcGNiaW9zLlMpCisgKi8KK2V4dGVybiB2b2lkIF90cml2aWFsX2lycV9oYW5kbGVyX3N0YXJ0OworZXh0ZXJuIHZvaWQgX3RyaXZpYWxfaXJxX2hhbmRsZXIgKCB2b2lkICk7CitleHRlcm4gdm9sYXRpbGUgdWludDE2X3QgX3RyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQ7CitleHRlcm4gc2Vnb2ZmX3QgX3RyaXZpYWxfaXJxX2NoYWluX3RvOworZXh0ZXJuIHVpbnQ4X3QgX3RyaXZpYWxfaXJxX2NoYWluOworZXh0ZXJuIHZvaWQgX3RyaXZpYWxfaXJxX2hhbmRsZXJfZW5kOworI2RlZmluZSBUUklWSUFMX0lSUV9IQU5ETEVSX1NJWkUgXAorCSgodWludDMyX3QpKCAmX3RyaXZpYWxfaXJxX2hhbmRsZXJfZW5kIC0gJl90cml2aWFsX2lycV9oYW5kbGVyX3N0YXJ0ICkpCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworaW50IGluc3RhbGxfaXJxX2hhbmRsZXIgKCBpcnFfdCBpcnEsIHNlZ29mZl90ICpoYW5kbGVyLAorCQkJICB1aW50OF90ICpwcmV2aW91c2x5X2VuYWJsZWQsCisJCQkgIHNlZ29mZl90ICpwcmV2aW91c19oYW5kbGVyICk7CitpbnQgcmVtb3ZlX2lycV9oYW5kbGVyICggaXJxX3QgaXJxLCBzZWdvZmZfdCAqaGFuZGxlciwKKwkJCSB1aW50OF90ICpwcmV2aW91c2x5X2VuYWJsZWQsCisJCQkgc2Vnb2ZmX3QgKnByZXZpb3VzX2hhbmRsZXIgKTsKK2ludCBpbnN0YWxsX3RyaXZpYWxfaXJxX2hhbmRsZXIgKCBpcnFfdCBpcnEgKTsKK2ludCByZW1vdmVfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGlycV90IGlycSApOworaW50IHRyaXZpYWxfaXJxX3RyaWdnZXJlZCAoIGlycV90IGlycSApOworaW50IGNvcHlfdHJpdmlhbF9pcnFfaGFuZGxlciAoIHZvaWQgKnRhcmdldCwgc2l6ZV90IHRhcmdldF9zaXplICk7Cit2b2lkIHNlbmRfbm9uX3NwZWNpZmljX2VvaSAoIGlycV90IGlycSApOwordm9pZCBzZW5kX3NwZWNpZmljX2VvaSAoIGlycV90IGlycSApOworI2lmZGVmIERFQlVHX0lSUQordm9pZCBkdW1wX2lycV9zdGF0dXMgKCB2b2lkICk7CisjZWxzZQorI2RlZmluZSBkdW1wX2lycV9zdGF0dXMoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBQSUM4MjU5X0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9wbmljLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvcG5pYy5jCkBAIC0wLDAgKzEsMjY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCitCb2NocyBQc2V1ZG8gTklDIGRyaXZlciBmb3IgRXRoZXJib290CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFNlZSBwbmljX2FwaS5oIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgQm9jaHMgUHNldWRvIE5JQy4KKyAqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKworLyogUE5JQyBBUEkgKi8KKyNpbmNsdWRlICJwbmljX2FwaS5oIgorCisvKiBQcml2YXRlIGRhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgYXBpX3ZlcnNpb247Cit9IHBuaWNfcHJpdl9kYXRhX3Q7CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgcG5pY19hcGlfY2hlY2sgKCB1aW50MTZfdCBhcGlfdmVyc2lvbiApOworCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCitzdGF0aWMgdWludDhfdCB0eF9idWZmZXJbRVRIX0ZSQU1FX0xFTl07CisKKy8qIAorICogVXRpbGl0eSBmdW5jdGlvbnM6IGlzc3VlIGEgUE5JQyBjb21tYW5kLCByZXRyaWV2ZSByZXN1bHQuICBVc2UKKyAqIHBuaWNfY29tbWFuZF9xdWlldCBpZiB5b3UgZG9uJ3Qgd2FudCBmYWlsdXJlIGNvZGVzIHRvIGJlCisgKiBhdXRvbWF0aWNhbGx5IHByaW50ZWQuICBSZXR1cm5zIHRoZSBQTklDIHN0YXR1cyBjb2RlLgorICogCisgKiBTZXQgb3V0cHV0X2xlbmd0aCB0byBOVUxMIG9ubHkgaWYgeW91IGV4cGVjdCB0byByZWNlaXZlIGV4YWN0bHkKKyAqIG91dHB1dF9tYXhfbGVuZ3RoIGJ5dGVzLCBvdGhlcndpc2UgaXQnbGwgY29tcGxhaW4gdGhhdCB5b3UgZGlkbid0CisgKiBnZXQgZW5vdWdoIGRhdGEgKG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgaWYgeW91IG5vdCBpbnRlcmVzdGVkIGluCisgKiBkaXNjb3ZlcmluZyB0aGUgb3V0cHV0IGxlbmd0aCB0aGVuIHlvdSdyZSBleHBlY3RpbmcgYSBmaXhlZCBhbW91bnQKKyAqIG9mIGRhdGEpLgorICovCisKK3N0YXRpYyB1aW50MTZfdCBwbmljX2NvbW1hbmRfcXVpZXQgKCBzdHJ1Y3QgbmljICpuaWMsIHVpbnQxNl90IGNvbW1hbmQsCisJCQkJICAgICB2b2lkICppbnB1dCwgdWludDE2X3QgaW5wdXRfbGVuZ3RoLAorCQkJCSAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCQkgICAgIHVpbnQxNl90ICpvdXRwdXRfbGVuZ3RoICkgeworCWludCBpOworCXVpbnQxNl90IHN0YXR1czsKKwl1aW50MTZfdCBfb3V0cHV0X2xlbmd0aDsKKworCWlmICggaW5wdXQgIT0gTlVMTCApIHsKKwkJLyogV3JpdGUgaW5wdXQgbGVuZ3RoICovCisJCW91dHcgKCBpbnB1dF9sZW5ndGgsIG5pYy0+aW9hZGRyICsgUE5JQ19SRUdfTEVOICk7CisJCS8qIFdyaXRlIGlucHV0IGRhdGEgKi8KKwkJZm9yICggaSA9IDA7IGkgPCBpbnB1dF9sZW5ndGg7IGkrKyApIHsKKwkJCW91dGIoICgoY2hhciopaW5wdXQpW2ldLCBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0RBVEEgKTsKKwkJfQorCX0KKwkvKiBXcml0ZSBjb21tYW5kICovCisJb3V0dyAoIGNvbW1hbmQsIG5pYy0+aW9hZGRyICsgUE5JQ19SRUdfQ01EICk7CisJLyogUmV0cmlldmUgc3RhdHVzICovCisJc3RhdHVzID0gaW53ICggbmljLT5pb2FkZHIgKyBQTklDX1JFR19TVEFUICk7CisJLyogUmV0cmlldmUgb3V0cHV0IGxlbmd0aCAqLworCV9vdXRwdXRfbGVuZ3RoID0gaW53ICggbmljLT5pb2FkZHIgKyBQTklDX1JFR19MRU4gKTsKKwlpZiAoIG91dHB1dF9sZW5ndGggPT0gTlVMTCApIHsKKwkJaWYgKCBfb3V0cHV0X2xlbmd0aCAhPSBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogd3JvbmcgZGF0YSBsZW5ndGggIgorCQkJCSAicmV0dXJuZWQgKGV4cGVjdGVkICVkLCBnb3QgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJfQorCX0gZWxzZSB7CisJCSpvdXRwdXRfbGVuZ3RoID0gX291dHB1dF9sZW5ndGg7CisJfQorCWlmICggb3V0cHV0ICE9IE5VTEwgKSB7CisJCWlmICggX291dHB1dF9sZW5ndGggPiBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgIgorCQkJCSAiKGhhdmUgJWQsIG5lZWQgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJCV9vdXRwdXRfbGVuZ3RoID0gb3V0cHV0X21heF9sZW5ndGg7CisJCX0KKwkJLyogUmV0cmlldmUgb3V0cHV0IGRhdGEgKi8KKwkJZm9yICggaSA9IDA7IGkgPCBfb3V0cHV0X2xlbmd0aDsgaSsrICkgeworCQkJKChjaGFyKilvdXRwdXQpW2ldID0KKwkJCQlpbmIgKCBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0RBVEEgKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdWludDE2X3QgcG5pY19jb21tYW5kICggc3RydWN0IG5pYyAqbmljLCB1aW50MTZfdCBjb21tYW5kLAorCQkJICAgICAgIHZvaWQgKmlucHV0LCB1aW50MTZfdCBpbnB1dF9sZW5ndGgsCisJCQkgICAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCSAgICAgICB1aW50MTZfdCAqb3V0cHV0X2xlbmd0aCApIHsKKwlwbmljX3ByaXZfZGF0YV90ICpwcml2ID0gKHBuaWNfcHJpdl9kYXRhX3QqKW5pYy0+cHJpdl9kYXRhOworCXVpbnQxNl90IHN0YXR1cyA9IHBuaWNfY29tbWFuZF9xdWlldCAoIG5pYywgY29tbWFuZCwKKwkJCQkJICAgICAgIGlucHV0LCBpbnB1dF9sZW5ndGgsCisJCQkJCSAgICAgICBvdXRwdXQsIG91dHB1dF9tYXhfbGVuZ3RoLAorCQkJCQkgICAgICAgb3V0cHV0X2xlbmd0aCApOworCWlmICggc3RhdHVzID09IFBOSUNfU1RBVFVTX09LICkgcmV0dXJuIHN0YXR1czsKKwlwcmludGYgKCAiUE5JQyBjb21tYW5kICUjaHggKGxlbiAlI2h4KSBmYWlsZWQgd2l0aCBzdGF0dXMgJSNoeFxuIiwKKwkJIGNvbW1hbmQsIGlucHV0X2xlbmd0aCwgc3RhdHVzICk7CisJaWYgKCBwcml2LT5hcGlfdmVyc2lvbiApIHBuaWNfYXBpX2NoZWNrKHByaXYtPmFwaV92ZXJzaW9uKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDaGVjayBBUEkgdmVyc2lvbiBtYXRjaGVzIHRoYXQgb2YgTklDICovCitzdGF0aWMgaW50IHBuaWNfYXBpX2NoZWNrICggdWludDE2X3QgYXBpX3ZlcnNpb24gKSB7CisJaWYgKCBhcGlfdmVyc2lvbiAhPSBQTklDX0FQSV9WRVJTSU9OICkgeworCQlwcmludGYgKCAiV2FybmluZzogQVBJIHZlcnNpb24gbWlzbWF0Y2ghICIKKwkJCSAiKE5JQydzIGlzICVkLiVkLCBvdXJzIGlzICVkLiVkKVxuIiwKKwkJCSBhcGlfdmVyc2lvbiA+PiA4LCBhcGlfdmVyc2lvbiAmIDB4ZmYsCisJCQkgUE5JQ19BUElfVkVSU0lPTiA+PiA4LCBQTklDX0FQSV9WRVJTSU9OICYgMHhmZiApOworCX0KKwlpZiAoIGFwaV92ZXJzaW9uIDwgUE5JQ19BUElfVkVSU0lPTiApIHsKKwkJcHJpbnRmICggIioqKiBZb3UgbWF5IG5lZWQgdG8gdXBkYXRlIHlvdXIgY29weSBvZiBCb2NocyAqKipcbiIgKTsKKwl9CisJcmV0dXJuICggYXBpX3ZlcnNpb24gPT0gUE5JQ19BUElfVkVSU0lPTiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBuaWNfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgcWxlbjsKKworCS8qIENoZWNrIHJlY2VpdmUgcXVldWUgbGVuZ3RoIHRvIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIHRvCisJICogZ2V0LiAgTmVjZXNzYXJ5IHNpbmNlIG9uY2Ugd2UndmUgY2FsbGVkIFBOSUNfQ01EX1JFQ1Ygd2UKKwkgKiBoYXZlIHRvIHJlYWQgb3V0IHRoZSBwYWNrZXQsIG90aGVyd2lzZSBpdCdzIGxvc3QgZm9yZXZlci4KKwkgKi8KKwlpZiAoIHBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfUkVDVl9RTEVOLCBOVUxMLCAwLAorCQkJICAgICZxbGVuLCBzaXplb2YocWxlbiksIE5VTEwgKQorCSAgICAgIT0gUE5JQ19TVEFUVVNfT0sgKSByZXR1cm4gKCAwICk7CisJaWYgKCBxbGVuID09IDAgKSByZXR1cm4gKCAwICk7CisKKwkvKiBUaGVyZSBpcyBhIHBhY2tldCByZWFkeS4gIFJldHVybiAxIGlmIHdlJ3JlIG9ubHkgY2hlY2tpbmcuICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuICggMSApOworCisJLyogUmV0cmlldmUgdGhlIHBhY2tldCAqLworCWlmICggcG5pY19jb21tYW5kICggbmljLCBQTklDX0NNRF9SRUNWLCBOVUxMLCAwLAorCQkJICAgIG5pYy0+cGFja2V0LCBFVEhfRlJBTUVfTEVOLCAmbGVuZ3RoICkKKwkgICAgICE9IFBOSUNfU1RBVFVTX09LICkgcmV0dXJuICggMCApOworCW5pYy0+cGFja2V0bGVuID0gbGVuZ3RoOworCXJldHVybiAoIDEgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBuaWNfdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmRlc3QsCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0eXBlLAkJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzaXplLAkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKmRhdGEpCQkvKiBQYWNrZXQgKi8KK3sKKwl1bnNpZ25lZCBpbnQgbnN0eXBlID0gaHRvbnMgKCB0eXBlICk7CisKKwlpZiAoICggRVRIX0hMRU4gKyBzaXplICkgPj0gRVRIX0ZSQU1FX0xFTiApIHsKKwkJcHJpbnRmICggInBuaWNfdHJhbnNtaXQ6IHBhY2tldCB0b28gbGFyZ2VcbiIgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFzc2VtYmxlIHBhY2tldCAqLworCW1lbWNweSAoIHR4X2J1ZmZlciwgZGVzdCwgRVRIX0FMRU4gKTsKKwltZW1jcHkgKCB0eF9idWZmZXIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOICk7CisJbWVtY3B5ICggdHhfYnVmZmVyICsgMiAqIEVUSF9BTEVOLCAmbnN0eXBlLCAyICk7CisJbWVtY3B5ICggdHhfYnVmZmVyICsgRVRIX0hMRU4sIGRhdGEsIHNpemUgKTsKKworCXBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfWE1JVCwgdHhfYnVmZmVyLCBFVEhfSExFTiArIHNpemUsCisJCSAgICAgICBOVUxMLCAwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwlwbmljX2NvbW1hbmQgKCBuaWMsIFBOSUNfQ01EX1JFU0VULCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gSGFuZGxlIGNhcmQgaW50ZXJydXB0IHN0YXR1cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19pcnEgKCBzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24gKQoreworCXVpbnQ4X3QgZW5hYmxlZDsKKworCXN3aXRjaCAoIGFjdGlvbiApIHsKKwljYXNlIERJU0FCTEUgOgorCWNhc2UgRU5BQkxFIDoKKwkJZW5hYmxlZCA9ICggYWN0aW9uID09IEVOQUJMRSA/IDEgOiAwICk7CisJCXBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfTUFTS19JUlEsCisJCQkgICAgICAgJmVuYWJsZWQsIHNpemVvZihlbmFibGVkKSwgTlVMTCwgMCwgTlVMTCApOworCQlicmVhazsKKwljYXNlIEZPUkNFIDoKKwkJcG5pY19jb21tYW5kICggbmljLCBQTklDX0NNRF9GT1JDRV9JUlEsCisJCQkgICAgICAgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCApOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcG5pY19wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJc3RhdGljIHBuaWNfcHJpdl9kYXRhX3QgcHJpdjsKKwl1aW50MTZfdCBzdGF0dXM7CisKKwlwcmludGYoIiAtICIpOworCisJLyogQ2xlYXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBhbmQgY2hhaW4gaXQgaW4gKi8KKwltZW1zZXQgKCAmcHJpdiwgMCwgc2l6ZW9mKHByaXYpICk7CisJbmljLT5wcml2X2RhdGEgPSAmcHJpdjsKKworCS8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisJbmljLT5pcnFubyA9IHBjaS0+aXJxOworCS8qIE5vdCBzdXJlIHdoYXQgdGhpcyBkb2VzLCBidXQgdGhlIHJ0bDgxMzkgZHJpdmVyIGRvZXMgaXQgKi8KKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisJc3RhdHVzID0gcG5pY19jb21tYW5kX3F1aWV0KCBuaWMsIFBOSUNfQ01EX0FQSV9WRVIsIE5VTEwsIDAsCisJCQkJICAgICAmcHJpdi5hcGlfdmVyc2lvbiwKKwkJCQkgICAgIHNpemVvZihwcml2LmFwaV92ZXJzaW9uKSwgTlVMTCApOworCWlmICggc3RhdHVzICE9IFBOSUNfU1RBVFVTX09LICkgeworCQlwcmludGYgKCAiUE5JQyBmYWlsZWQgaW5zdGFsbGF0aW9uIGNoZWNrLCBjb2RlICUjaHhcbiIsCisJCQkgc3RhdHVzICk7CisJCXJldHVybiAwOworCX0KKwlwbmljX2FwaV9jaGVjayhwcml2LmFwaV92ZXJzaW9uKTsKKwlzdGF0dXMgPSBwbmljX2NvbW1hbmQgKCBuaWMsIFBOSUNfQ01EX1JFQURfTUFDLCBOVUxMLCAwLAorCQkJCW5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiwgTlVMTCApOworCXByaW50ZiAoICJEZXRlY3RlZCBCb2NocyBQc2V1ZG8gTklDIE1BQyAlISAoQVBJIHYlZC4lZCkgYXQgJSNoeFxuIiwKKwkJIG5pYy0+bm9kZV9hZGRyLCBwcml2LmFwaV92ZXJzaW9uPj44LCBwcml2LmFwaV92ZXJzaW9uJjB4ZmYsCisJCSBuaWMtPmlvYWRkciApOworCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJZGV2LT5kaXNhYmxlICA9IHBuaWNfZGlzYWJsZTsKKwluaWMtPnBvbGwgICAgID0gcG5pY19wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBwbmljX3RyYW5zbWl0OworCW5pYy0+aXJxICAgICAgPSBwbmljX2lycTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgcG5pY19uaWNzW10gPSB7CisvKiBnZW5ydWxlcy5wbCBkb2Vzbid0IGxldCB1cyB1c2UgbWFjcm9zIGZvciBQQ0kgSURzLi4uKi8KK1BDSV9ST00oMHhmZWZlLCAweGVmZWYsICJwbmljIiwgIkJvY2hzIFBzZXVkbyBOSUMgQWRhcHRvciIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgcG5pY19kcml2ZXIgPSB7CisJLnR5cGUgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgPSAiUE5JQyIsCisJLnByb2JlICAgID0gcG5pY19wcm9iZSwKKwkuaWRzICAgICAgPSBwbmljX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHBuaWNfbmljcykvc2l6ZW9mKHBuaWNfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CkluZGV4OiBiL25ldGJvb3QvcG5pY19hcGkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9wbmljX2FwaS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb25zdGFudHMgZXRjLiBmb3IgdGhlIEJvY2hzL0V0aGVyYm9vdCBwc2V1ZG8tTklDCisgKiAKKyAqIFRoaXMgaGVhZGVyIGZpbGUgbXVzdCBiZSB2YWxpZCBDIGFuZCBDKysuCisgKgorICogT3BlcmF0aW9uIG9mIHRoZSBwc2V1ZG8tTklDIChQTklDKSBpcyBwcmV0dHkgc2ltcGxlLiAgVG8gd3JpdGUgYQorICogY29tbWFuZCBwbHVzIGRhdGEsIGZpcnN0IHdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8KKyAqIFBOSUNfUkVHX0xFTiwgdGhlbiB3cml0ZSB0aGUgZGF0YSBhIGJ5dGUgYXQgYSB0eXBlIHRvCisgKiBQTklDX1JFR19EQVRBLCB0aGVuIHdyaXRlIHRoZSBjb21tYW5kIGNvZGUgdG8gUE5JQ19SRUdfQ01ELiAgVGhlCisgKiBzdGF0dXMgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSBQTklDX1JFR19TVEFULiAgVGhlIGxlbmd0aCBvZiBhbnkKKyAqIGRhdGEgcmV0dXJuZWQgd2lsbCBiZSBpbiBQTklDX1JFR19MRU4gYW5kIGNhbiBiZSByZWFkIGEgYnl0ZSBhdCBhCisgKiB0aW1lIGZyb20gUE5JQ19SRUdfREFUQS4KKyAqLworCisvKgorICogUENJIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBQTklDX1BDSV9WRU5ET1IJMHhmZWZlCS8qIEhvcGVmdWxseSB0aGVzZSB3b24ndCBjbGFzaCB3aXRoICovCisjZGVmaW5lIFBOSUNfUENJX0RFVklDRSAweGVmZWYJLyogYW55IHJlYWwgUENJIGRldmljZSBJRHMuICAgICAgICAgKi8KKworLyoKKyAqICdIYXJkd2FyZScgcmVnaXN0ZXIgYWRkcmVzc2VzLCBvZmZzZXQgZnJvbSBpb19iYXNlCisgKi8KKyNkZWZpbmUgUE5JQ19SRUdfQ01ECTB4MDAJLyogQ29tbWFuZCByZWdpc3RlciwgMiBieXRlcywgd3JpdGUgb25seSAqLworI2RlZmluZSBQTklDX1JFR19TVEFUCTB4MDAJLyogU3RhdHVzIHJlZ2lzdGVyLCAyIGJ5dGVzLCByZWFkIG9ubHkgKi8KKyNkZWZpbmUgUE5JQ19SRUdfTEVOCTB4MDIJLyogTGVuZ3RoIHJlZ2lzdGVyLCAyIGJ5dGVzLCByZWFkLXdyaXRlICovCisjZGVmaW5lIFBOSUNfUkVHX0RBVEEJMHgwNAkvKiBEYXRhIHBvcnQsIDEgYnl0ZSwgcmVhZC13cml0ZSAqLworLyoKKyAqIFBOSUNfTUFYX1JFRyB1c2VkIGluIEJvY2hzIHRvIGNsYWltIGkvbyBzcGFjZQorICovCisjZGVmaW5lIFBOSUNfTUFYX1JFRwkweDA0CisKKy8qCisgKiBDb21tYW5kIGNvZGUgZGVmaW5pdGlvbnM6IHdyaXRlIHRoZXNlIGludG8gUE5JQ19SRUdfQ01ECisgKi8KKyNkZWZpbmUgUE5JQ19DTURfTk9PUAkJMHgwMDAwCisjZGVmaW5lIFBOSUNfQ01EX0FQSV9WRVIJMHgwMDAxCisjZGVmaW5lIFBOSUNfQ01EX1JFQURfTUFDCTB4MDAwMgorI2RlZmluZSBQTklDX0NNRF9SRVNFVAkJMHgwMDAzCisjZGVmaW5lIFBOSUNfQ01EX1hNSVQJCTB4MDAwNAorI2RlZmluZSBQTklDX0NNRF9SRUNWCQkweDAwMDUKKyNkZWZpbmUgUE5JQ19DTURfUkVDVl9RTEVOCTB4MDAwNgorI2RlZmluZSBQTklDX0NNRF9NQVNLX0lSUQkweDAwMDcKKyNkZWZpbmUgUE5JQ19DTURfRk9SQ0VfSVJRCTB4MDAwOAorCisvKgorICogU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnM6IHJlYWQgdGhlc2UgZnJvbSBQTklDX1JFR19TVEFUCisgKgorICogV2UgYXZvaWQgdXNpbmcgc3RhdHVzIGNvZGVzIHRoYXQgbWlnaHQgYmUgY29uZnVzZWQgd2l0aAorICogcmFuZG9tbHktcmVhZCBkYXRhIChlLmcuIDB4MDAwMCwgMHhmZmZmIGV0Yy4pCisgKi8KKyNkZWZpbmUgUE5JQ19TVEFUVVNfT0sJCTB4NGY0YgkJLyogJ09LJyAqLworI2RlZmluZSBQTklDX1NUQVRVU19VTktOT1dOX0NNRAkweDNmM2YJCS8qICc/PycgKi8KKworLyoKKyAqIE90aGVyIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24KKyAqLworCisjZGVmaW5lIFBOSUNfQVBJX1ZFUlNJT04JMHgwMTAxCQkvKiAxLjEgKi8KSW5kZXg6IGIvbmV0Ym9vdC9weGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9weGUuaApAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBbGZyZWQgUGVybHN0ZWluIDxhbGZyZWRAZnJlZWJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwIFBhdWwgU2FhYiA8cHNAZnJlZWJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwIEpvaG4gQmFsZHdpbiA8amhiQGZyZWVic2Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL3N5cy9ib290L2kzODYvbGliaTM4Ni9weGUuaCx2IDEuNC4yLjIgMjAwMC8wOS8xMCAwMjo1MjoxOCBwcyBFeHAgJAorICovCisKKy8qCisgKiBUaGUgdHlwZWRlZnMgYW5kIHN0cnVjdHVyZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlCisgKiBjbGVhcmx5IHZpb2xhdGUgc3R5bGUoOSksIHRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gY29uZm9ybSB0byB0aGUKKyAqIHR5cGVkZWZzL3N0cnVjdHVyZS1uYW1lcyB1c2VkIGluIHRoZSBJbnRlbCBsaXRlcmF0dXJlIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKyAqCisgKiBJdCdzIGZvciB5b3VyIG93biBnb29kLiA6KQorICovCisKKy8qIFNFR09GRjE2X3QgZGVmaW5lZCBpbiBzZXBhcmF0ZSBoZWFkZXIgZm9yIEV0aGVyYm9vdAorICovCisjaW5jbHVkZSA8c2Vnb2ZmLmg+CisKKy8qIEl0IHNlZW1zIHRoYXQgaW50ZWwgZGlkbid0IHRoaW5rIGFib3V0IEFCSSwKKyAqIGVpdGhlciB0aGF0IG9yIDE2Yml0IEFCSSAhPSAzMmJpdCBBQkkgKHdoaWNoIHNlZW1zIHJlYXNvbmFibGUpCisgKiBJIGhhdmUgdG8gdGhhbmsgSW50ZWwgZm9yIHRoZSBoYWlyIGxvc3MgSSBpbmN1cnJlZCB0cnlpbmcgdG8gZmlndXJlCisgKiBvdXQgd2h5IFBYRSB3YXMgbWlzLXJlYWRpbmcgc3RydWN0dXJlcyBJIHdhcyBwYXNzaW5nIGl0IChhdCBsZWFzdAorICogZnJvbSBteSBwb2ludCBvZiB2aWV3KQorICoKKyAqIFNvbHV0aW9uOiB1c2UgZ2NjJ3MgJ19fYXR0cmlidXRlX18gKChwYWNrZWQpKScgdG8gY29ycmVjdGx5IGFsaWduCisgKiBzdHJ1Y3R1cmVzIHBhc3NlZCBpbnRvIFBYRQorICogUXVlc3Rpb246IGRvZXMgdGhpcyByZWFsbHkgd29yayBmb3IgUFhFJ3MgZXhwZWN0ZWQgQUJJPworICovCisjZGVmaW5lCVBBQ0tFRAkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNkZWZpbmUJU19TSVpFKHMpCXMsIHNpemVvZihzKSAtIDEKKworI2RlZmluZQlJUF9TVFIJCSIlZC4lZC4lZC4lZCIKKyNkZWZpbmUJSVBfQVJHUyhpcCkJCQkJCVwKKwkoaW50KShpcCA+PiAyNCkgJiAweGZmLCAoaW50KShpcCA+PiAxNikgJiAweGZmLCBcCisJKGludCkoaXAgPj4gOCkgJiAweGZmLCAoaW50KWlwICYgMHhmZgorCisjZGVmaW5lCU1BQ19TVFIJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUJTUFDX0FSR1MobWFjKQkJCQkJXAorCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0gCisKKyNkZWZpbmUJUFhFTkZTUk9PVFBBVEgJIi9weGVyb290IgorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QJCVNlZ19BZGRyOworCXVpbnQzMl90CQlQaHlfQWRkcjsKKwl1aW50MTZfdAkJU2VnX1NpemU7Cit9IFBBQ0tFRCBTRUdERVNDX3Q7IC8qIFBBQ0tFRCBpcyByZXF1aXJlZCwgb3RoZXJ3aXNlIGdjYyBwYWRzIHRoaXMgb3V0IHRvIDEyCisJCSAgICAgICBieXRlcyAtIG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrIChtY2IzMCkgMTcvNS8wMyAqLworCit0eXBlZGVmCXVpbnQxNl90CQlTRUdTRUxfdDsKK3R5cGVkZWYJdWludDE2X3QJCVBYRU5WX1NUQVRVU190OwordHlwZWRlZgl1aW50MzJfdAkJSVA0X3Q7Cit0eXBlZGVmCXVpbnQzMl90CQlBRERSMzJfdDsKK3R5cGVkZWYJdWludDE2X3QJCVVEUF9QT1JUX3Q7CisKKyNkZWZpbmUJTUFDX0FERFJfTEVOCQkxNgordHlwZWRlZgl1aW50OF90CQkJTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKKworLyogUFhFTlYrICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJU2lnbmF0dXJlWzZdOwkvKiAnUFhFTlYrJyAqLworCXVpbnQxNl90CVZlcnNpb247CS8qIE1TQiA9IG1ham9yLCBMU0IgPSBtaW5vciAqLworCXVpbnQ4X3QJCUxlbmd0aDsJCS8qIHN0cnVjdHVyZSBsZW5ndGggKi8KKwl1aW50OF90CQlDaGVja3N1bTsJLyogY2hlY2tzdW0gcGFkICovCisJU0VHT0ZGMTZfdAlSTUVudHJ5OwkvKiBTRUc6T0ZGIHRvIFBYRSBlbnRyeSBwb2ludCAqLworCS8qIGRvbid0IHVzZSBQTU9mZnNldCBhbmQgUE1TZWxlY3RvciAoZnJvbSB0aGUgMi4xIFBYRSBtYW51YWwpICovCisJdWludDMyX3QJUE1PZmZzZXQ7CS8qIFByb3RlY3RlZCBtb2RlIGVudHJ5ICovCisJU0VHU0VMX3QJUE1TZWxlY3RvcjsJLyogUHJvdGVjdGVkIG1vZGUgc2VsZWN0b3IgKi8KKwlTRUdTRUxfdAlTdGFja1NlZzsJLyogU3RhY2sgc2VnbWVudCBhZGRyZXNzICovCisJdWludDE2X3QJU3RhY2tTaXplOwkvKiBTdGFjayBzZWdtZW50IHNpemUgKGJ5dGVzKSAqLworCVNFR1NFTF90CUJDX0NvZGVTZWc7CS8qIEJDIENvZGUgc2VnbWVudCBhZGRyZXNzICovCisJdWludDE2X3QJQkNfQ29kZVNpemU7CS8qIEJDIENvZGUgc2VnbWVudCBzaXplIChieXRlcykgKi8KKwlTRUdTRUxfdAlCQ19EYXRhU2VnOwkvKiBCQyBEYXRhIHNlZ21lbnQgYWRkcmVzcyAqLworCXVpbnQxNl90CUJDX0RhdGFTaXplOwkvKiBCQyBEYXRhIHNlZ21lbnQgc2l6ZSAoYnl0ZXMpICovCisJU0VHU0VMX3QJVU5ESURhdGFTZWc7CS8qIFVOREkgRGF0YSBzZWdtZW50IGFkZHJlc3MgKi8KKwl1aW50MTZfdAlVTkRJRGF0YVNpemU7CS8qIFVOREkgRGF0YSBzZWdtZW50IHNpemUgKGJ5dGVzKSAqLworCVNFR1NFTF90CVVORElDb2RlU2VnOwkvKiBVTkRJIENvZGUgc2VnbWVudCBhZGRyZXNzICovCisJdWludDE2X3QJVU5ESUNvZGVTaXplOwkvKiBVTkRJIENvZGUgc2VnbWVudCBzaXplIChieXRlcykgKi8KKwlTRUdPRkYxNl90CVBYRVB0cjsJCS8qIFNFRzpPRkYgdG8gIVBYRSBzdHJ1Y3QsIAorCQkJCQkgICBvbmx5IHByZXNlbnQgd2hlbiBWZXJzaW9uID4gMi4xICovCit9IFBBQ0tFRCBweGVudl90OworCisvKiAhUFhFICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJU2lnbmF0dXJlWzRdOworCXVpbnQ4X3QJCVN0cnVjdExlbmd0aDsKKwl1aW50OF90CQlTdHJ1Y3RDa3N1bTsKKwl1aW50OF90CQlTdHJ1Y3RSZXY7CisJdWludDhfdAkJcmVzZXJ2ZWRfMTsKKwlTRUdPRkYxNl90CVVORElST01JRDsKKwlTRUdPRkYxNl90CUJhc2VST01JRDsKKwlTRUdPRkYxNl90CUVudHJ5UG9pbnRTUDsKKwlTRUdPRkYxNl90CUVudHJ5UG9pbnRFU1A7CisJU0VHT0ZGMTZfdAlTdGF0dXNDYWxsb3V0OworCXVpbnQ4X3QJCXJlc2VydmVkXzI7CisJdWludDhfdAkJU2VnRGVzY0NuOworCVNFR1NFTF90CUZpcnN0U2VsZWN0b3I7CisJU0VHREVTQ190CVN0YWNrOworCVNFR0RFU0NfdAlVTkRJRGF0YTsKKwlTRUdERVNDX3QJVU5ESUNvZGU7CisJU0VHREVTQ190CVVORElDb2RlV3JpdGU7CisJU0VHREVTQ190CUJDX0RhdGE7CisJU0VHREVTQ190CUJDX0NvZGU7CisJU0VHREVTQ190CUJDX0NvZGVXcml0ZTsKK30gUEFDS0VEIHB4ZV90OworCisjZGVmaW5lCVBYRU5WX1NUQVJUX1VOREkJCTB4MDAwMAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlheDsKKwl1aW50MTZfdAlieDsKKwl1aW50MTZfdAlkeDsKKwl1aW50MTZfdAlkaTsKKwl1aW50MTZfdAllczsKK30gUEFDS0VEIHRfUFhFTlZfU1RBUlRfVU5ESTsKKworI2RlZmluZQlQWEVOVl9VTkRJX1NUQVJUVVAJCTB4MDAwMQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9TVEFSVFVQOworCisjZGVmaW5lCVBYRU5WX1VORElfQ0xFQU5VUAkJMHgwMDAyCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0NMRUFOVVA7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9JTklUSUFMSVpFCQkweDAwMDMKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJQUREUjMyX3QJUHJvdG9jb2xJbmk7CS8qIFBoeXMgYWRkciBvZiBhIGNvcHkgb2YgdGhlIGRyaXZlciBtb2R1bGUgKi8KKwl1aW50OF90CQlyZXNlcnZlZFs4XTsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9JTklUSUFMSVpFOworCisKKyNkZWZpbmUJTUFYTlVNX01DQUREUgkJOAordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90CU1DYXN0QWRkckNvdW50OworCU1BQ19BRERSCU1jYXN0QWRkcltNQVhOVU1fTUNBRERSXTsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTOworCisjZGVmaW5lCVBYRU5WX1VORElfUkVTRVRfQURBUFRFUgkweDAwMDQJCQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl0X1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyBSX01jYXN0X0J1ZjsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9SRVNFVDsKKworI2RlZmluZQlQWEVOVl9VTkRJX1NIVVRET1dOCQkweDAwMDUKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfU0hVVERPV047CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9PUEVOCQkJMHgwMDA2Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQxNl90CU9wZW5GbGFnOworCXVpbnQxNl90CVBrdEZpbHRlcjsKKyMJZGVmaW5lIEZMVFJfRElSRUNURUQJMHgwMDAxCisjCWRlZmluZSBGTFRSX0JSRENTVAkweDAwMDIKKyMJZGVmaW5lIEZMVFJfUFJNU0NTCTB4MDAwMworIwlkZWZpbmUgRkxUUl9TUkNfUlRHCTB4MDAwNAorCisJdF9QWEVOVl9VTkRJX01DQVNUX0FERFJFU1MgUl9NY2FzdF9CdWY7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfT1BFTjsKKworI2RlZmluZQlQWEVOVl9VTkRJX0NMT1NFCQkweDAwMDcKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfQ0xPU0U7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9UUkFOU01JVAkJMHgwMDA4Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQ4X3QJCVByb3RvY29sOworIwlkZWZpbmUgUF9VTktOT1dOCTAKKyMJZGVmaW5lIFBfSVAJCTEKKyMJZGVmaW5lIFBfQVJQCQkyCisjCWRlZmluZSBQX1JBUlAJCTMKKworCXVpbnQ4X3QJCVhtaXRGbGFnOworIwlkZWZpbmUgWE1UX0RFU1RBRERSCTB4MDAwMAorIwlkZWZpbmUgWE1UX0JST0FEQ0FTVAkweDAwMDEKKworCVNFR09GRjE2X3QJRGVzdEFkZHI7CisJU0VHT0ZGMTZfdAlUQkQ7CisJdWludDMyX3QJUmVzZXJ2ZWRbMl07Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfVFJBTlNNSVQ7CisKKyNkZWZpbmUJTUFYX0RBVEFfQkxLUwkJOAordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90CUltbWVkTGVuZ3RoOworCVNFR09GRjE2X3QJWG1pdDsKKwl1aW50MTZfdAlEYXRhQmxrQ291bnQ7CisJc3RydWN0CURhdGFCbGsgeworCQl1aW50OF90CQlURFB0clR5cGU7CisJCXVpbnQ4X3QJCVREUnN2ZEJ5dGU7CisJCXVpbnQxNl90CVRERGF0YUxlbjsKKwkJU0VHT0ZGMTZfdAlURERhdGFQdHI7CisJfSBEYXRhQmxvY2tbTUFYX0RBVEFfQkxLU107Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfVEJEOworCisjZGVmaW5lCVBYRU5WX1VORElfU0VUX01DQVNUX0FERFJFU1MJMHgwMDA5Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXRfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTIFJfTWNhc3RfQnVmOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSOworCisjZGVmaW5lCVBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUwkweDAwMEEKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJTUFDX0FERFIJU3RhdGlvbkFkZHJlc3M7CQkvKiBUZW1wIE1BQyBhZGRyZXMgdG8gdXNlICovCit9IFBBQ0tFRCB0X1BYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUzsKKworI2RlZmluZQlQWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCTB4MDAwQgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlmaWx0ZXI7CQkJLyogc2VlIFVORElfT1BFTiAoMHgwMDA2KSAqLworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSOworCisjZGVmaW5lCVBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OCTB4MDAwQwordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlCYXNlSW87CQkJLyogQWRhcHRlciBiYXNlIEkvTyBhZGRyZXNzICovCisJdWludDE2X3QJSW50TnVtYmVyOwkJLyogQWRhcHRlciBJUlEgbnVtYmVyICovCisJdWludDE2X3QJTWF4VHJhblVuaXQ7CQkvKiBBZGFwdGVyIG1heGltdW0gdHJhbnNtaXQgdW5pdCAqLworCXVpbnQxNl90CUh3VHlwZTsJCQkvKiBUeXBlIG9mIHByb3RvY29sIGF0IHRoZSBoYXJkd2FyZSBhZGRyICovCisjCWRlZmluZSBFVEhFUl9UWVBFCTEKKyMJZGVmaW5lIEVYUF9FVEhFUl9UWVBFCTIKKyMJZGVmaW5lIElFRUVfVFlQRQk2CisjCWRlZmluZSBBUkNORVRfVFlQRQk3CisKKwl1aW50MTZfdAlId0FkZHJMZW47CQkvKiBMZW5ndGggb2YgaGFyZHdhcmUgYWRkcmVzcyAqLworCU1BQ19BRERSCUN1cnJlbnROb2RlQWRkcmVzczsJLyogQ3VycmVudCBoYXJkd2FyZSBhZGRyZXNzICovCisJTUFDX0FERFIJUGVybU5vZGVBZGRyZXNzOwkvKiBQZXJtYW5lbnQgaGFyZHdhcmUgYWRkcmVzcyAqLworCVNFR1NFTF90CVJPTUFkZHJlc3M7CQkvKiBSZWFsIG1vZGUgUk9NIHNlZ21lbnQgYWRkcmVzcyAqLworCXVpbnQxNl90CVJ4QnVmQ3Q7CQkvKiBSZWNlaXZlIHF1ZXVlIGxlbmd0aCAqLworCXVpbnQxNl90CVR4QnVmQ3Q7CQkvKiBUcmFuc21pdCBxdWV1ZSBsZW5ndGggKi8KK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT047CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUwkweDAwMEQKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDMyX3QJWG1pdEdvb2RGcmFtZXM7CQkvKiBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0cmFuc21pc3Npb25zICovCisJdWludDMyX3QJUmN2R29vZEZyYW1lczsJCS8qIE51bWJlciBvZiBnb29kIGZyYW1lcyByZWNlaXZlZCAqLworCXVpbnQzMl90CVJjdkNSQ0Vycm9yczsJCS8qIE51bWJlciBvZiBmcmFtZXMgd2l0aCBDUkMgZXJyb3JzICovCisJdWludDMyX3QJUmN2UmVzb3VyY2VFcnJvcnM7CS8qIE51bWJlciBvZiBmcmFtZXMgZHJvcHBlZCAqLworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTOworCisjZGVmaW5lCVBYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUwkweDAwMEUKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUzsKKworI2RlZmluZQlQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTCTB4MDAwRgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUzsKKworI2RlZmluZQlQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVAkweDAwMTAKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfRk9SQ0VfSU5URVJSVVBUOworCisjZGVmaW5lCVBYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MJMHgwMDExCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCUlQNF90CQlJbmV0QWRkcjsJCS8qIElQIG11bGljYXN0IGFkZHJlc3MgKi8KKwlNQUNfQUREUglNZWRpYUFkZHI7CQkvKiBNQUMgbXVsdGljYXN0IGFkZHJlc3MgKi8KK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUjsKKworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9OSUNfVFlQRQkJMHgwMDEyCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQ4X3QJCU5pY1R5cGU7CQkvKiBUeXBlIG9mIE5JQyAqLworIwlkZWZpbmUgUENJX05JQwkJMgorIwlkZWZpbmUgUG5QX05JQwkJMworIwlkZWZpbmUgQ2FyZEJ1c19OSUMJNAorCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QJVmVuZG9yX0lEOworCQkJdWludDE2X3QJRGV2X0lEOworCQkJdWludDhfdAkJQmFzZV9DbGFzczsKKwkJCXVpbnQ4X3QJCVN1Yl9DbGFzczsKKwkJCXVpbnQ4X3QJCVByb2dfSW50ZjsKKwkJCXVpbnQ4X3QJCVJldjsKKwkJCXVpbnQxNl90CUJ1c0RldkZ1bmM7CisJCQl1aW50MTZfdAlTdWJWZW5kb3JfSUQ7CisJCQl1aW50MTZfdAlTdWJEZXZpY2VfSUQ7CisJCX0gcGNpLCBjYXJkYnVzOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QJRUlTQV9EZXZfSUQ7CisJCQl1aW50OF90CQlCYXNlX0NsYXNzOworCQkJdWludDhfdAkJU3ViX0NsYXNzOworCQkJdWludDhfdAkJUHJvZ19JbnRmOworCQkJdWludDE2X3QJQ2FyZFNlbE51bTsKKwkJfSBwbnA7CisJfSBpbmZvOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRTsKKworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCTB4MDAxMwordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlJZmFjZVR5cGVbMTZdOwkJLyogTmFtZSBvZiBNQUMgdHlwZSBpbiBBU0NJSS4gKi8KKwl1aW50MzJfdAlMaW5rU3BlZWQ7CQkvKiBEZWZpbmVkIGluIE5ESVMgMi4wIHNwZWMgKi8KKwl1aW50MzJfdAlTZXJ2aWNlRmxhZ3M7CQkvKiBEZWZpbmVkIGluIE5ESVMgMi4wIHNwZWMgKi8KKwl1aW50MzJfdAlSZXNlcnZlZFs0XTsJCS8qIG11c3QgYmUgMCAqLworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPOworCisjZGVmaW5lCVBYRU5WX1VORElfSVNSCQkJMHgwMDE0Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQxNl90CUZ1bmNGbGFnOwkJLyogUFhFTlZfVU5ESV9JU1JfT1VUX3h4eCAqLworCXVpbnQxNl90CUJ1ZmZlckxlbmd0aDsJCS8qIExlbmd0aCBvZiBGcmFtZSAqLworCXVpbnQxNl90CUZyYW1lTGVuZ3RoOwkJLyogVG90YWwgbGVuZ3RoIG9mIHJlY2lldmVyIGZyYW1lICovCisJdWludDE2X3QJRnJhbWVIZWFkZXJMZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIEZyYW1lICovCisJU0VHT0ZGMTZfdAlGcmFtZTsJCQkvKiByZWNlaXZlIGJ1ZmZlciAqLworCXVpbnQ4X3QJCVByb3RUeXBlOwkJLyogUHJvdG9jb2wgdHlwZSAqLworCXVpbnQ4X3QJCVBrdFR5cGU7CQkvKiBQYWNrZXQgVHlwZSAqLworIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fU1RBUlQJCTEKKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX0lOX1BST0NFU1MJMgorIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQJMworCisJLyogb25lIG9mIHRoZXNlIHdpbGwgYmUgcmV0dXJuZWQgZm9yIFBYRU5WX1VORElfSVNSX0lOX1NUQVJUICovCisjCWRlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfT1VSUwkJMAorIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX05PVF9PVVJTCTEKKworCS8qCisJICogb25lIG9mIHRoZXNlIHdpbGwgYnJlIHJldHVybmQgZm9yIFBYRU5EX1VORElfSVNSX0lOX1BST0NFU1MKKwkgKiBhbmQgUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQKKwkgKi8KKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9ET05FCQkwCisjCWRlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfVFJBTlNNSVQJMgorIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX1JFQ0VJVkUJMworIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX0JVU1kJCTQKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9JU1I7CisKKyNkZWZpbmUJUFhFTlZfU1RPUF9VTkRJCQkJMHgwMDE1Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9TVE9QX1VOREk7CisKKyNkZWZpbmUJUFhFTlZfVEZUUF9PUEVOCQkJMHgwMDIwCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCUlQNF90CQlTZXJ2ZXJJUEFkZHJlc3M7CisJSVA0X3QJCUdhdGV3YXlJUEFkZHJlc3M7CisJdWludDhfdAkJRmlsZU5hbWVbMTI4XTsKKwlVRFBfUE9SVF90CVRGVFBQb3J0OworCXVpbnQxNl90CVBhY2tldFNpemU7Cit9IFBBQ0tFRCB0X1BYRU5WX1RGVFBfT1BFTjsKKworI2RlZmluZQlQWEVOVl9URlRQX0NMT1NFCQkweDAwMjEKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1RGVFBfQ0xPU0U7CisKKyNkZWZpbmUJUFhFTlZfVEZUUF9SRUFECQkJMHgwMDIyCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQxNl90CVBhY2tldE51bWJlcjsKKwl1aW50MTZfdAlCdWZmZXJTaXplOworCVNFR09GRjE2X3QJQnVmZmVyOworfSBQQUNLRUQgdF9QWEVOVl9URlRQX1JFQUQ7CisKKyNkZWZpbmUJUFhFTlZfVEZUUF9SRUFEX0ZJTEUJCTB4MDAyMwordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlGaWxlTmFtZVsxMjhdOworCXVpbnQzMl90CUJ1ZmZlclNpemU7CisJQUREUjMyX3QJQnVmZmVyOworCUlQNF90CQlTZXJ2ZXJJUEFkZHJlc3M7CisJSVA0X3QJCUdhdGV3YXlJUEFkcmVzczsKKwlJUDRfdAkJTWNhc3RJUEFkcmVzczsKKwlVRFBfUE9SVF90CVRGVFBDbG50UG9ydDsKKwlVRFBfUE9SVF90CVRGVFBTcnZQb3J0OworCXVpbnQxNl90CVRGVFBPcGVuVGltZU91dDsKKwl1aW50MTZfdAlURlRQUmVvcGVuRGVsYXk7Cit9IFBBQ0tFRCB0X1BYRU5WX1RGVFBfUkVBRF9GSUxFOworCisjZGVmaW5lCVBYRU5WX1RGVFBfR0VUX0ZTSVpFCQkweDAwMjUKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJSVA0X3QJCVNlcnZlcklQQWRkcmVzczsKKwlJUDRfdAkJR2F0ZXdheUlQQWRyZXNzOworCXVpbnQ4X3QJCUZpbGVOYW1lWzEyOF07CisJdWludDMyX3QJRmlsZVNpemU7Cit9IFBBQ0tFRCB0X1BYRU5WX1RGVFBfR0VUX0ZTSVpFOworCisjZGVmaW5lCVBYRU5WX1VEUF9PUEVOCQkJMHgwMDMwCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCUlQNF90CQlzcmNfaXA7CQkvKiBJUCBhZGRyZXNzIG9mIHRoaXMgc3RhdGlvbiAqLworfSBQQUNLRUQgdF9QWEVOVl9VRFBfT1BFTjsKKworI2RlZmluZQlQWEVOVl9VRFBfQ0xPU0UJCQkweDAwMzEKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlzdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VEUF9DTE9TRTsKKworI2RlZmluZQlQWEVOVl9VRFBfUkVBRAkJCTB4MDAzMgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CXN0YXR1czsKKwlJUDRfdAkJc3JjX2lwOwkJLyogSVAgb2Ygc2VuZGVyICovCisJSVA0X3QJCWRlc3RfaXA7CS8qIE9ubHkgYWNjZXB0IHBhY2tldHMgc2VudCB0byB0aGlzIElQICovCisJVURQX1BPUlRfdAlzX3BvcnQ7CQkvKiBVRFAgc291cmNlIHBvcnQgb2Ygc2VuZGVyICovCisJVURQX1BPUlRfdAlkX3BvcnQ7CQkvKiBPbmx5IGFjY2VwdCBwYWNrZXRzIHNlbnQgdG8gdGhpcyBwb3J0ICovCisJdWludDE2X3QJYnVmZmVyX3NpemU7CS8qIFNpemUgb2YgdGhlIHBhY2tldCBidWZmZXIgKi8KKwlTRUdPRkYxNl90CWJ1ZmZlcjsJCS8qIFNFRzpPRkYgdG8gdGhlIHBhY2tldCBidWZmZXIgKi8KK30gUEFDS0VEIHRfUFhFTlZfVURQX1JFQUQ7CisKKyNkZWZpbmUJUFhFTlZfVURQX1dSSVRFCQkJMHgwMDMzCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJc3RhdHVzOworCUlQNF90CQlpcDsJCS8qIGRlc3QgaXAgYWRkciAqLworCUlQNF90CQlndzsJCS8qIGlwIGdhdGV3YXkgKi8KKwlVRFBfUE9SVF90CXNyY19wb3J0OwkvKiBzb3VyY2UgdWRwIHBvcnQgKi8KKwlVRFBfUE9SVF90CWRzdF9wb3J0OwkvKiBkZXN0aW5hdGlvbiB1ZHAgcG9ydCAqLworCXVpbnQxNl90CWJ1ZmZlcl9zaXplOwkvKiBTaXplIG9mIHRoZSBwYWNrZXQgYnVmZmVyICovCisJU0VHT0ZGMTZfdAlidWZmZXI7CQkvKiBTRUc6T0ZGIHRvIHRoZSBwYWNrZXQgYnVmZmVyICovCit9IFBBQ0tFRCB0X1BYRU5WX1VEUF9XUklURTsKKworI2RlZmluZQlQWEVOVl9VTkxPQURfU1RBQ0sJCTB4MDA3MAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlyZXNlcnZlZFsxMF07Cit9IFBBQ0tFRCB0X1BYRU5WX1VOTE9BRF9TVEFDSzsKKworCisjZGVmaW5lCVBYRU5WX0dFVF9DQUNIRURfSU5GTwkJMHgwMDcxCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQxNl90CVBhY2tldFR5cGU7CS8qIHR5cGUgKGRlZmluZWQgcmlnaHQgaGVyZSkgKi8KKyMJZGVmaW5lIFBYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfRElTQ09WRVIgIDEKKyMJZGVmaW5lIFBYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfQUNLICAgICAgIDIKKyMJZGVmaW5lIFBYRU5WX1BBQ0tFVF9UWVBFX0JJTkxfUkVQTFkgICAgIDMKKwl1aW50MTZfdAlCdWZmZXJTaXplOwkvKiBtYXggdG8gY29weSwgbGVhdmUgYXQgMCBmb3IgcG9pbnRlciAqLworCVNFR09GRjE2X3QJQnVmZmVyOwkJLyogY29weSB0bywgbGVhdmUgYXQgMCBmb3IgcG9pbnRlciAqLworCXVpbnQxNl90CUJ1ZmZlckxpbWl0OwkvKiBtYXggc2l6ZSBvZiBidWZmZXIgaW4gQkMgZGF0YXNlZyA/ICovCit9IFBBQ0tFRCB0X1BYRU5WX0dFVF9DQUNIRURfSU5GTzsKKworCisvKiBzdHJ1Y3R1cmUgZmlsbGVkIGluIGJ5IFBYRU5WX0dFVF9DQUNIRURfSU5GTyAKKyAqIChob3cgd2UgZGV0ZXJtaW5lIHdoaWNoIElQIHdlIGRvd25sb2FkZWQgdGhlIGluaXRpYWwgYm9vdHN0cmFwIGZyb20pCisgKiB3b3JkcyBjYW4ndCBkZXNjcmliZS4uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJb3Bjb2RlOworIwlkZWZpbmUgQk9PVFBfUkVRCTEKKyMJZGVmaW5lIEJPT1RQX1JFUAkyCisJdWludDhfdAkJSGFyZHdhcmU7CS8qIGhhcmR3YXJlIHR5cGUgKi8KKwl1aW50OF90CQlIYXJkbGVuOwkvKiBoYXJkd2FyZSBhZGRyIGxlbiAqLworCXVpbnQ4X3QJCUdhdGVob3BzOwkvKiB6ZXJvIGl0ICovCisJdWludDMyX3QJaWRlbnQ7CQkvKiByYW5kb20gbnVtYmVyIGNob3NlbiBieSBjbGllbnQgKi8KKwl1aW50MTZfdAlzZWNvbmRzOwkvKiBzZWNvbmRzIHNpbmNlIGRpZCBpbml0aWFsIGJvb3RzdHJhcCAqLworCXVpbnQxNl90CUZsYWdzOwkJLyogc2Vjb25kcyBzaW5jZSBkaWQgaW5pdGlhbCBib290c3RyYXAgKi8KKyMJZGVmaW5lIEJPT1RQX0JDQVNUCTB4ODAwMAkJLyogPyAqLworCUlQNF90CQljaXA7CQkvKiBDbGllbnQgSVAgKi8KKwlJUDRfdAkJeWlwOwkJLyogWW91ciBJUCAqLworCUlQNF90CQlzaXA7CQkvKiBJUCB0byB1c2UgZm9yIG5leHQgYm9vdCBzdGFnZSAqLworCUlQNF90CQlnaXA7CQkvKiBSZWxheSBJUCA/ICovCisJTUFDX0FERFIJQ0FkZHI7CQkvKiBDbGllbnQgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVpbnQ4X3QJCVNuYW1lWzY0XTsJLyogU2VydmVyJ3MgaG9zdG5hbWUgKE9wdGlvbmFsKSAqLworCXVpbnQ4X3QJCWJvb3RmaWxlWzEyOF07CS8qIGJvb3QgZmlsZW5hbWUgKi8KKwl1bmlvbiB7CisjCQlpZiAxCisjCQlkZWZpbmUgQk9PVFBfREhDUFZFTkQgIDEwMjQgICAgLyogREhDUCBleHRlbmRlZCB2ZW5kb3IgZmllbGQgc2l6ZSAqLworIwkJZWxzZQorIwkJZGVmaW5lIEJPT1RQX0RIQ1BWRU5EICAzMTIJLyogREhDUCBzdGFuZGFyZCB2ZW5kb3IgZmllbGQgc2l6ZSAqLworIwkJZW5kaWYKKwkJdWludDhfdAkJZFtCT09UUF9ESENQVkVORF07CS8qIHJhdyBhcnJheSBvZiB2ZW5kb3IvZGhjcCBvcHRpb25zICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90CQltYWdpY1s0XTsJLyogREhDUCBtYWdpYyBjb29raWUgKi8KKyMJCQlpZm5kZWYJCVZNX1JGQzEwNDgKKyMJCQlkZWZpbmUJCVZNX1JGQzEwNDgJMHg2MzgyNTM2M0wJLyogPyAqLworIwkJCWVuZGlmCisJCQl1aW50MzJfdAlmbGFnczsJCS8qIGJvb3RwIGZsYWdzL29wY29kZXMgKi8KKwkJCXVpbnQ4X3QJCXBhZFs1Nl07CS8qIEkgZG9uJ3QgdGhpbmsgaW50ZWwga25vd3Mgd2hhdCBhCisJCQkJCQkJICAgdW5pb24gZG9lcy4uLiAqLworCQl9IHY7CisJfSB2ZW5kb3I7Cit9IFBBQ0tFRCBCT09UUExBWUVSOworCisjZGVmaW5lCVBYRU5WX1JFU1RBUlRfVEZUUAkJMHgwMDczCisjZGVmaW5lCXRfUFhFTlZfUkVTVEFSVF9URlRQCQl0X1BYRU5WX1RGVFBfUkVBRF9GSUxFCisKKyNkZWZpbmUJUFhFTlZfU1RBUlRfQkFTRQkJMHgwMDc1Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9TVEFSVF9CQVNFOworCisjZGVmaW5lCVBYRU5WX1NUT1BfQkFTRQkJCTB4MDA3NgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfU1RPUF9CQVNFOwpJbmRleDogYi9uZXRib290L3I4MTY5LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvcjgxNjkuYwpAQCAtMCwwICsxLDg1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgIHI4MTY5LmM6IEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgUmVhbFRlayBSVEwtODE2OSBHaWdhYml0CisqICAgIFdyaXR0ZW4gMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSBiYXNlZCBvbjoKKyoJcjgxNjkuYzogQSBSZWFsVGVrIFJUTC04MTY5IEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyIAorKiAJCWZvciBMaW51eCBrZXJuZWwgMi40LnguCisqCisqICAgIFdyaXR0ZW4gMjAwMiBTaHVDaGVuIDxzaHVjaGVuQHJlYWx0ZWsuY29tLnR3PgorKgkgIFNlZSBMaW51eCBEcml2ZXIgZm9yIGZ1bGwgaW5mb3JtYXRpb24KKyoJCisqICAgIExpbnV4IERyaXZlciBWZXJzaW9uIDEuMjdhLCAxMC4wMi4yMDAyCisqIAorKiAgICBUaGFua3MgdG86CisqICAgIAlKZWFuIENoZW4gb2YgUmVhbFRlayBTZW1pY29uZHVjdG9yIENvcnAuIGZvcgorKiAgICAJcHJvdmlkaW5nIHRoZSBldmFsdWF0aW9uIE5JQyB1c2VkIHRvIGRldmVsb3AgCisqICAgIAl0aGlzIGRyaXZlci4gIFJlYWxUZWsncyBzdXBwb3J0IGZvciBFdGhlcmJvb3QgCisqICAgIAlpcyBhcHByZWNpYXRlZC4KKyogICAgCQorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqCisqICAgIHYxLjAJMTEtMjYtMjAwMwl0aW1sZWdnZQlJbml0aWFsIHBvcnQgb2YgTGludXggZHJpdmVyCisqICAgIHYxLjUJMDEtMTctMjAwNAl0aW1sZWdnZQlJbml0aWFsIGRyaXZlciBvdXRwdXQgY2xlYW51cAorKiAgICB2MS42CTAzLTI3LTIwMDQJdGltbGVnZ2UJQWRkaXRpb25hbCBDbGVhbnVwCisqICAgIAorKiAgICBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuNiIKKyNkZWZpbmUgZHJ2X2RhdGUgIjAzLTI3LTIwMDQiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKKyNkZWZpbmUgSFogMTAwMAorCitzdGF0aWMgdTMyIGlvYWRkcjsKKworI2lmZGVmIEVERUJVRworI2RlZmluZSBkcHJpbnRmKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBkcHJpbnRmKHgpCisjZW5kaWYKKworLyogQ29uZGVuc2VkIG9wZXJhdGlvbnMgZm9yIHJlYWRhYmlsaXR5LiAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKy8qIG1lZGlhIG9wdGlvbnMgCisgICAgICAgIF8xMF9IYWxmID0gMHgwMSwKKyAgICAgICAgXzEwX0Z1bGwgPSAweDAyLAorICAgICAgICBfMTAwX0hhbGYgPSAweDA0LAorICAgICAgICBfMTAwX0Z1bGwgPSAweDA4LAorICAgICAgICBfMTAwMF9GdWxsID0gMHgxMCwKKyovCitzdGF0aWMgaW50IG1lZGlhID0gLTE7CisKKyNpZiAwCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKyNlbmRpZgorCisjaWYgMAorLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiBSeC1hbGwtbXVsdGljYXN0KS4KKyAgIFRoZSBSVEwgY2hpcHMgdXNlIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisjZW5kaWYKKworLyogTUFDIGFkZHJlc3MgbGVuZ3RoKi8KKyNkZWZpbmUgTUFDX0FERFJfTEVOCTYKKworLyogbWF4IHN1cHBvcnRlZCBnaWdhYml0IGV0aGVybmV0IGZyYW1lIHNpemUgLS0gbXVzdCBiZSBhdCBsZWFzdCAoZGV2LT5tdHUrMTQrNCkuKi8KKyNkZWZpbmUgTUFYX0VUSF9GUkFNRV9TSVpFCTE1MzYKKworI2RlZmluZSBUWF9GSUZPX1RIUkVTSCAyNTYJLyogSW4gYnl0ZXMgKi8KKworI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk3CS8qIDcgbWVhbnMgTk8gdGhyZXNob2xkLCBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAgKi8KKyNkZWZpbmUgUlhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBFYXJseVR4VGhsZCAJMHgzRgkvKiAweDNGIG1lYW5zIE5PIGVhcmx5IHRyYW5zbWl0ICovCisjZGVmaW5lIFJ4UGFja2V0TWF4U2l6ZQkweDA4MDAJLyogTWF4aW11bSBzaXplIHN1cHBvcnRlZCBpcyAxNkstMSAqLworI2RlZmluZSBJbnRlckZyYW1lR2FwCTB4MDMJLyogMyBtZWFucyBJbnRlckZyYW1lR2FwID0gdGhlIHNob3J0ZXN0IG9uZSAqLworCisjZGVmaW5lIE5VTV9UWF9ERVNDCTEJLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5VTV9SWF9ERVNDCTQJLyogTnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJYX0JVRl9TSVpFCTE1MzYJLyogUnggQnVmZmVyIHNpemUgKi8KKworI2RlZmluZSBSVExfTUlOX0lPX1NJWkUgMHg4MAorI2RlZmluZSBUWF9USU1FT1VUICAoNipIWikKKworLyogd3JpdGUvcmVhZCBNTUlPIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUTF9XOChyZWcsIHZhbDgpCXdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1cxNihyZWcsIHZhbDE2KQl3cml0ZXcgKCh2YWwxNiksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfVzMyKHJlZywgdmFsMzIpCXdyaXRlbCAoKHZhbDMyKSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SOChyZWcpCQlyZWFkYiAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMTYocmVnKQkJcmVhZHcgKGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgcmVhZGwgKGlvYWRkciArIChyZWcpKSkKKworZW51bSBSVEw4MTY5X3JlZ2lzdGVycyB7CisJTUFDMCA9IDAsCQkvKiBFdGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworCU1BUjAgPSA4LAkJLyogTXVsdGljYXN0IGZpbHRlci4gKi8KKwlUeERlc2NTdGFydEFkZHIgPSAweDIwLAorCVR4SERlc2NTdGFydEFkZHIgPSAweDI4LAorCUZMQVNIID0gMHgzMCwKKwlFUlNSID0gMHgzNiwKKwlDaGlwQ21kID0gMHgzNywKKwlUeFBvbGwgPSAweDM4LAorCUludHJNYXNrID0gMHgzQywKKwlJbnRyU3RhdHVzID0gMHgzRSwKKwlUeENvbmZpZyA9IDB4NDAsCisJUnhDb25maWcgPSAweDQ0LAorCVJ4TWlzc2VkID0gMHg0QywKKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlDb25maWcyID0gMHg1MywKKwlDb25maWczID0gMHg1NCwKKwlDb25maWc0ID0gMHg1NSwKKwlDb25maWc1ID0gMHg1NiwKKwlNdWx0aUludHIgPSAweDVDLAorCVBIWUFSID0gMHg2MCwKKwlUQklDU1IgPSAweDY0LAorCVRCSV9BTkFSID0gMHg2OCwKKwlUQklfTFBBUiA9IDB4NkEsCisJUEhZc3RhdHVzID0gMHg2QywKKwlSeE1heFNpemUgPSAweERBLAorCUNQbHVzQ21kID0gMHhFMCwKKwlSeERlc2NTdGFydEFkZHIgPSAweEU0LAorCUVhcmx5VHhUaHJlcyA9IDB4RUMsCisJRnVuY0V2ZW50ID0gMHhGMCwKKwlGdW5jRXZlbnRNYXNrID0gMHhGNCwKKwlGdW5jUHJlc2V0U3RhdGUgPSAweEY4LAorCUZ1bmNGb3JjZUV2ZW50ID0gMHhGQywKK307CisKK2VudW0gUlRMODE2OV9yZWdpc3Rlcl9jb250ZW50IHsKKwkvKkludGVycnVwdFN0YXR1c0JpdHMgKi8KKwlTWVNFcnIgPSAweDgwMDAsCisJUENTVGltZW91dCA9IDB4NDAwMCwKKwlTV0ludCA9IDB4MDEwMCwKKwlUeERlc2NVbmF2YWlsID0gMHg4MCwKKwlSeEZJRk9PdmVyID0gMHg0MCwKKwlSeFVuZGVycnVuID0gMHgyMCwKKwlSeE92ZXJmbG93ID0gMHgxMCwKKwlUeEVyciA9IDB4MDgsCisJVHhPSyA9IDB4MDQsCisJUnhFcnIgPSAweDAyLAorCVJ4T0sgPSAweDAxLAorCisJLypSeFN0YXR1c0Rlc2MgKi8KKwlSeFJFUyA9IDB4MDAyMDAwMDAsCisJUnhDUkMgPSAweDAwMDgwMDAwLAorCVJ4UlVOVCA9IDB4MDAxMDAwMDAsCisJUnhSV1QgPSAweDAwNDAwMDAwLAorCisJLypDaGlwQ21kQml0cyAqLworCUNtZFJlc2V0ID0gMHgxMCwKKwlDbWRSeEVuYiA9IDB4MDgsCisJQ21kVHhFbmIgPSAweDA0LAorCVJ4QnVmRW1wdHkgPSAweDAxLAorCisJLypDZmc5MzQ2Qml0cyAqLworCUNmZzkzNDZfTG9jayA9IDB4MDAsCisJQ2ZnOTM0Nl9VbmxvY2sgPSAweEMwLAorCisJLypyeF9tb2RlX2JpdHMgKi8KKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorCisJLypSeENvbmZpZ0JpdHMgKi8KKwlSeENmZ0ZJRk9TaGlmdCA9IDEzLAorCVJ4Q2ZnRE1BU2hpZnQgPSA4LAorCisJLypUeENvbmZpZ0JpdHMgKi8KKwlUeEludGVyRnJhbWVHYXBTaGlmdCA9IDI0LAorCVR4RE1BU2hpZnQgPSA4LAkJLyogRE1BIGJ1cnN0IHZhbHVlICgwLTcpIGlzIHNoaWZ0IHRoaXMgbWFueSBiaXRzICovCisKKwkvKnJ0bDgxNjlfUEhZc3RhdHVzICovCisJVEJJX0VuYWJsZSA9IDB4ODAsCisJVHhGbG93Q3RybCA9IDB4NDAsCisJUnhGbG93Q3RybCA9IDB4MjAsCisJXzEwMDBicHNGID0gMHgxMCwKKwlfMTAwYnBzID0gMHgwOCwKKwlfMTBicHMgPSAweDA0LAorCUxpbmtTdGF0dXMgPSAweDAyLAorCUZ1bGxEdXAgPSAweDAxLAorCisJLypHSUdBQklUX1BIWV9yZWdpc3RlcnMgKi8KKwlQSFlfQ1RSTF9SRUcgPSAwLAorCVBIWV9TVEFUX1JFRyA9IDEsCisJUEhZX0FVVE9fTkVHT19SRUcgPSA0LAorCVBIWV8xMDAwX0NUUkxfUkVHID0gOSwKKworCS8qR0lHQUJJVF9QSFlfUkVHX0JJVCAqLworCVBIWV9SZXN0YXJ0X0F1dG9fTmVnbyA9IDB4MDIwMCwKKwlQSFlfRW5hYmxlX0F1dG9fTmVnbyA9IDB4MTAwMCwKKworCS8qIFBIWV9TVEFUX1JFRyA9IDE7ICovCisJUEhZX0F1dG9fTmVjb19Db21wID0gMHgwMDIwLAorCisJLyogUEhZX0FVVE9fTkVHT19SRUcgPSA0OyAqLworCVBIWV9DYXBfMTBfSGFsZiA9IDB4MDAyMCwKKwlQSFlfQ2FwXzEwX0Z1bGwgPSAweDAwNDAsCisJUEhZX0NhcF8xMDBfSGFsZiA9IDB4MDA4MCwKKwlQSFlfQ2FwXzEwMF9GdWxsID0gMHgwMTAwLAorCisJLyogUEhZXzEwMDBfQ1RSTF9SRUcgPSA5OyAqLworCVBIWV9DYXBfMTAwMF9GdWxsID0gMHgwMjAwLAorCisJUEhZX0NhcF9OdWxsID0gMHgwLAorCisJLypfTWVkaWFUeXBlKi8KKwlfMTBfSGFsZiA9IDB4MDEsCisJXzEwX0Z1bGwgPSAweDAyLAorCV8xMDBfSGFsZiA9IDB4MDQsCisJXzEwMF9GdWxsID0gMHgwOCwKKwlfMTAwMF9GdWxsID0gMHgxMCwKKworCS8qX1RCSUNTUkJpdCovCisJVEJJTGlua09LID0gMHgwMjAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdmVyc2lvbjsJCS8qIGRlcGVuZCBvbiBSVEw4MTY5IGRvY3MgKi8KKwl1MzIgUnhDb25maWdNYXNrOwkvKiBzaG91bGQgY2xlYXIgdGhlIGJpdHMgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcCAqLworfSBydGxfY2hpcF9pbmZvW10gPSB7CisJeworIlJUTC04MTY5IiwgMHgwMCwgMHhmZjdlMTg4MCx9LH07CisKK2VudW0gX0Rlc2NTdGF0dXNCaXQgeworCU9XTmJpdCA9IDB4ODAwMDAwMDAsCisJRU9SYml0ID0gMHg0MDAwMDAwMCwKKwlGU2JpdCA9IDB4MjAwMDAwMDAsCisJTFNiaXQgPSAweDEwMDAwMDAwLAorfTsKKworc3RydWN0IFR4RGVzYyB7CisJdTMyIHN0YXR1czsKKwl1MzIgdmxhbl90YWc7CisJdTMyIGJ1Zl9hZGRyOworCXUzMiBidWZfSGFkZHI7Cit9OworCitzdHJ1Y3QgUnhEZXNjIHsKKwl1MzIgc3RhdHVzOworCXUzMiB2bGFuX3RhZzsKKwl1MzIgYnVmX2FkZHI7CisJdTMyIGJ1Zl9IYWRkcjsKK307CisKKy8qIFRoZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBjYXJkIGFyZSByZXF1aXJlZCB0byBiZSBhbGlnbmVkIG9uCisyNTYgYnl0ZSBib3VuZGFyaWVzLiAgQXMgdGhlIGFsaWduIGF0dHJpYnV0ZSBkb2VzIG5vdCBkbyBtb3JlIHRoYW4KKzE2IGJ5dGVzIG9mIGFsaWdubWVudCBpdCByZXF1aXJlcyBzb21lIGV4dHJhIHN0ZXBzLiAgQWRkIDI1NiB0byB0aGUgCitzaXplIG9mIHRoZSBhcnJheSBhbmQgdGhlIGluaXRfcmluZyBhZGp1c3RzIHRoZSBhbGlnbm1lbnQgKi8KKworLyogRGVmaW5lIHRoZSBUWCBEZXNjcmlwdG9yICovCitzdGF0aWMgdTggdHhfcmluZ1tOVU1fVFhfREVTQyAqIHNpemVvZihzdHJ1Y3QgVHhEZXNjKSArIDI1Nl07CisKKy8qIENyZWF0ZSBhIHN0YXRpYyBidWZmZXIgb2Ygc2l6ZSBSWF9CVUZfU1ogZm9yIGVhY2gKK1RYIERlc2NyaXB0b3IuICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYQorcGFydCBvZiB0aGlzIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW05VTV9UWF9ERVNDICogUlhfQlVGX1NJWkVdOworCisvKiBEZWZpbmUgdGhlIFJYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyB1OCByeF9yaW5nW05VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpICsgMjU2XTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFJYX0JVRl9TWiBmb3IgZWFjaAorUlggRGVzY3JpcHRvciAgIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlVNX1JYX0RFU0MgKiBSWF9CVUZfU0laRV07CisKK3N0cnVjdCBydGw4MTY5X3ByaXZhdGUgeworCXZvaWQgKm1taW9fYWRkcjsJLyogbWVtb3J5IG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCisJaW50IGNoaXBzZXQ7CisJdW5zaWduZWQgbG9uZyBjdXJfcng7CS8qIEluZGV4IGludG8gdGhlIFJ4IGRlc2NyaXB0b3IgYnVmZmVyIG9mIG5leHQgUnggcGt0LiAqLworCXVuc2lnbmVkIGxvbmcgY3VyX3R4OwkvKiBJbmRleCBpbnRvIHRoZSBUeCBkZXNjcmlwdG9yIGJ1ZmZlciBvZiBuZXh0IFJ4IHBrdC4gKi8KKwl1bnNpZ25lZCBjaGFyICpUeERlc2NBcnJheXM7CS8qIEluZGV4IG9mIFR4IERlc2NyaXB0b3IgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqUnhEZXNjQXJyYXlzOwkvKiBJbmRleCBvZiBSeCBEZXNjcmlwdG9yIGJ1ZmZlciAqLworCXN0cnVjdCBUeERlc2MgKlR4RGVzY0FycmF5OwkvKiBJbmRleCBvZiAyNTYtYWxpZ25tZW50IFR4IERlc2NyaXB0b3IgYnVmZmVyICovCisJc3RydWN0IFJ4RGVzYyAqUnhEZXNjQXJyYXk7CS8qIEluZGV4IG9mIDI1Ni1hbGlnbm1lbnQgUnggRGVzY3JpcHRvciBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpSeEJ1ZmZlclJpbmdbTlVNX1JYX0RFU0NdOwkvKiBJbmRleCBvZiBSeCBCdWZmZXIgYXJyYXkgKi8KKwl1bnNpZ25lZCBjaGFyICpUeF9za2J1ZmZbTlVNX1RYX0RFU0NdOworfSB0cHg7CisKK3N0YXRpYyBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cGM7CisKK3N0YXRpYyBjb25zdCB1MTYgcnRsODE2OV9pbnRyX21hc2sgPQorICAgIFNZU0VyciB8IFBDU1RpbWVvdXQgfCBSeFVuZGVycnVuIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfCBUeEVyciB8CisgICAgVHhPSyB8IFJ4RXJyIHwgUnhPSzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODE2OV9yeF9jb25maWcgPQorICAgIChSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfCAoUlhfRE1BX0JVUlNUIDw8IFJ4Q2ZnRE1BU2hpZnQpOworCit2b2lkIG1kaW9fd3JpdGUoaW50IFJlZ0FkZHIsIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCVJUTF9XMzIoUEhZQVIsIDB4ODAwMDAwMDAgfCAoUmVnQWRkciAmIDB4RkYpIDw8IDE2IHwgdmFsdWUpOworCXVkZWxheSgxMDAwKTsKKworCWZvciAoaSA9IDIwMDA7IGkgPiAwOyBpLS0pIHsKKwkJLyogQ2hlY2sgaWYgdGhlIFJUTDgxNjkgaGFzIGNvbXBsZXRlZCB3cml0aW5nIHRvIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJCWlmICghKFJUTF9SMzIoUEhZQVIpICYgMHg4MDAwMDAwMCkpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwl9Cit9CisKK2ludCBtZGlvX3JlYWQoaW50IFJlZ0FkZHIpCit7CisJaW50IGksIHZhbHVlID0gLTE7CisKKwlSVExfVzMyKFBIWUFSLCAweDAgfCAoUmVnQWRkciAmIDB4RkYpIDw8IDE2KTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlmb3IgKGkgPSAyMDAwOyBpID4gMDsgaS0tKSB7CisJCS8qIENoZWNrIGlmIHRoZSBSVEw4MTY5IGhhcyBjb21wbGV0ZWQgcmV0cmlldmluZyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKFJUTF9SMzIoUEhZQVIpICYgMHg4MDAwMDAwMCkgeworCQkJdmFsdWUgPSAoaW50KSAoUlRMX1IzMihQSFlBUikgJiAweEZGRkYpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcnRyZWdfYmFzZSwgcnRyZWdfbGVuOworCXUzMiB0bXA7CisKKwlydHJlZ19iYXNlID0gcGNpX2Jhcl9zdGFydChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCXJ0cmVnX2xlbiA9IHBjaV9iYXJfc2l6ZShwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCisJLyogY2hlY2sgZm9yIHdlaXJkL2Jyb2tlbiBQQ0kgcmVnaW9uIHJlcG9ydGluZyAqLworCWlmIChydHJlZ19sZW4gPCBSVExfTUlOX0lPX1NJWkUpIHsKKwkJcHJpbnRmKCJJbnZhbGlkIFBDSSByZWdpb24gc2l6ZShzKSwgYWJvcnRpbmdcbiIpOworCX0KKworCWFkanVzdF9wY2lfZGV2aWNlKHBkZXYpOworLyogICAgICBwbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOyAqLworCisJLyogaW9yZW1hcCBNTUlPIHJlZ2lvbiAqLworCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKHJ0cmVnX2Jhc2UsIHJ0cmVnX2xlbik7CisJaWYgKGlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCXRwYy0+bW1pb19hZGRyID0gJmlvYWRkcjsKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCVJUTF9XOChDaGlwQ21kLCBDbWRSZXNldCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkKKwkJaWYgKChSVExfUjgoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCQllbHNlCisJCQl1ZGVsYXkoMTApOworCisJLyogaWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXRtcCA9IFJUTF9SMzIoVHhDb25maWcpOworCXRtcCA9ICgodG1wICYgMHg3YzAwMDAwMCkgKyAoKHRtcCAmIDB4MDA4MDAwMDApIDw8IDIpKSA+PiAyNDsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUocnRsX2NoaXBfaW5mbykgLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHRtcCA9PSBydGxfY2hpcF9pbmZvW2ldLnZlcnNpb24pIHsKKwkJCXRwYy0+Y2hpcHNldCA9IGk7CisJCQlnb3RvIG1hdGNoOworCQl9CisJLyogaWYgdW5rbm93biBjaGlwLCBhc3N1bWUgYXJyYXkgZWxlbWVudCAjMCwgb3JpZ2luYWwgUlRMLTgxNjkgaW4gdGhpcyBjYXNlICovCisJZHByaW50ZigoIlBDSSBkZXZpY2U6IHVua25vd24gY2hpcCB2ZXJzaW9uLCBhc3N1bWluZyBSVEwtODE2OVxuIikpOworCWRwcmludGYoKCJQQ0kgZGV2aWNlOiBUeENvbmZpZyA9IDB4JWhYXG4iLAorCQkgKHVuc2lnbmVkIGxvbmcpIFJUTF9SMzIoVHhDb25maWcpKSk7CisJdHBjLT5jaGlwc2V0ID0gMDsKKwlyZXR1cm4gMTsKKyAgICAgIG1hdGNoOgorCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCByODE2OV9pcnEgKCBzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gKSB7CisJaW50IGludHJfc3RhdHVzID0gMDsKKwlpbnQgaW50ZXJlc3RlZCA9IFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlciB8IFJ4RXJyIHwgUnhPSzsKKyAKKwlzd2l0Y2ggKCBhY3Rpb24gKSB7CisJCWNhc2UgRElTQUJMRToKKwkJY2FzZSBFTkFCTEU6CisJCQlpbnRyX3N0YXR1cyA9IFJUTF9SMTYoSW50clN0YXR1cyk7CisJCQkvKiBoL3cgbm8gbG9uZ2VyIHByZXNlbnQgKGhvdHBsdWc/KSBvciBtYWpvciBlcnJvciwgCisJCQkJYmFpbCAqLworCQkJaWYgKGludHJfc3RhdHVzID09IDB4RkZGRikKKwkJCQlicmVhazsKKworCQkJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1cyAmIH5pbnRlcmVzdGVkOworCQkJaWYgKCBhY3Rpb24gPT0gRU5BQkxFICkKKwkJCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzIHwgaW50ZXJlc3RlZDsKKwkJCVJUTF9XMTYoSW50ck1hc2ssIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUkNFIDoKKwkJCVJUTF9XOChUeFBvbGwsIChSVExfUjgoVHhQb2xsKSB8IDB4MDEpKTsKKwkJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByODE2OV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJlaXZlKQoreworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisJaW50IGN1cl9yeDsKKwl1bnNpZ25lZCBpbnQgaW50cl9zdGF0dXMgPSAwOworCWN1cl9yeCA9IHRwYy0+Y3VyX3J4OworCWlmICgodHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLnN0YXR1cyAmIE9XTmJpdCkgPT0gMCkgeworCSAgICAgICAgIC8qIFRoZXJlIGlzIGEgcGFja2V0IHJlYWR5ICovCisgIAkgICAgICAgICBpZighcmV0cmVpdmUpCisgIAkgICAgICAgICAgICAgICAgIHJldHVybiAxOworCQlpbnRyX3N0YXR1cyA9IFJUTF9SMTYoSW50clN0YXR1cyk7CisJCS8qIGgvdyBubyBsb25nZXIgcHJlc2VudCAoaG90cGx1Zz8pIG9yIG1ham9yIGVycm9yLAorCQkJYmFpbCAqLworCQlpZiAoaW50cl9zdGF0dXMgPT0gMHhGRkZGKQorCQkJcmV0dXJuIDA7CisJCVJUTF9XMTYoSW50clN0YXR1cywgaW50cl9zdGF0dXMgJiAKKwkJCX4oUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSk7CisKKwkJaWYgKCEodHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLnN0YXR1cyAmIFJ4UkVTKSkgeworCQkJbmljLT5wYWNrZXRsZW4gPSAoaW50KSAodHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLgorCQkJCQkJc3RhdHVzICYgMHgwMDAwMUZGRikgLSA0OworCQkJbWVtY3B5KG5pYy0+cGFja2V0LCB0cGMtPlJ4QnVmZmVyUmluZ1tjdXJfcnhdLAorCQkJICAgICAgIG5pYy0+cGFja2V0bGVuKTsKKwkJCWlmIChjdXJfcnggPT0gTlVNX1JYX0RFU0MgLSAxKQorCQkJCXRwYy0+UnhEZXNjQXJyYXlbY3VyX3J4XS5zdGF0dXMgPQorCQkJCSAgICAoT1dOYml0IHwgRU9SYml0KSArIFJYX0JVRl9TSVpFOworCQkJZWxzZQorCQkJCXRwYy0+UnhEZXNjQXJyYXlbY3VyX3J4XS5zdGF0dXMgPQorCQkJCSAgICBPV05iaXQgKyBSWF9CVUZfU0laRTsKKwkJCXRwYy0+UnhEZXNjQXJyYXlbY3VyX3J4XS5idWZfYWRkciA9CisJCQkgICAgdmlydF90b19idXModHBjLT5SeEJ1ZmZlclJpbmdbY3VyX3J4XSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJFcnJvciBSeCIpOworCQkvKiBGSVhNRTogc2hvdWxkbid0IEkgcmVzZXQgdGhlIHN0YXR1cyBvbiBhbiBlcnJvciAqLworCQljdXJfcnggPSAoY3VyX3J4ICsgMSkgJSBOVU1fUlhfREVTQzsKKwkJdHBjLT5jdXJfcnggPSBjdXJfcng7CisJCVJUTF9XMTYoSW50clN0YXR1cywgaW50cl9zdGF0dXMgJiAKKwkJCShSeEZJRk9PdmVyIHwgUnhPdmVyZmxvdyB8IFJ4T0spKTsKKworCQlyZXR1cm4gMTsKKworCX0KKwl0cGMtPmN1cl9yeCA9IGN1cl9yeDsKKwkvKiBGSVhNRTogVGhlcmUgaXMgbm8gcmVhc29uIHRvIGRvIHRoaXMgYXMgY3VyX3J4IGRpZCBub3QgY2hhbmdlICovCisKKwlyZXR1cm4gKDApOwkJLyogaW5pdGlhbGx5IGFzIHRoaXMgaXMgY2FsbGVkIHRvIGZsdXNoIHRoZSBpbnB1dCAqLworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCByODE2OV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsCS8qIERlc3RpbmF0aW9uICovCisJCQkgICB1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCQkJICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgIGNvbnN0IGNoYXIgKnApCit7CQkJCS8qIFBhY2tldCAqLworCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworCisJdTE2IG5zdHlwZTsKKwl1MzIgdG87CisJdTggKnB0eGI7CisJaW50IGVudHJ5ID0gdHBjLT5jdXJfdHggJSBOVU1fVFhfREVTQzsKKworCS8qIHBvaW50IHRvIHRoZSBjdXJyZW50IHR4YiBpbmNhc2UgbXVsdGlwbGUgdHhfcmluZ3MgYXJlIHVzZWQgKi8KKwlwdHhiID0gdHBjLT5UeF9za2J1ZmZbZW50cnkgKiBNQVhfRVRIX0ZSQU1FX1NJWkVdOworCW1lbWNweShwdHhiLCBkLCBFVEhfQUxFTik7CisJbWVtY3B5KHB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsKKwltZW1jcHkocHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkocHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKwlzICs9IEVUSF9ITEVOOworCXMgJj0gMHgwRkZGOworCXdoaWxlIChzIDwgRVRIX1pMRU4pCisJCXB0eGJbcysrXSA9ICdcMCc7CisKKwl0cGMtPlR4RGVzY0FycmF5W2VudHJ5XS5idWZfYWRkciA9IHZpcnRfdG9fYnVzKHB0eGIpOworCWlmIChlbnRyeSAhPSAoTlVNX1RYX0RFU0MgLSAxKSkKKwkJdHBjLT5UeERlc2NBcnJheVtlbnRyeV0uc3RhdHVzID0KKwkJICAgIChPV05iaXQgfCBGU2JpdCB8IExTYml0KSB8ICgocyA+IEVUSF9aTEVOKSA/IHMgOgorCQkJCQkJRVRIX1pMRU4pOworCWVsc2UKKwkJdHBjLT5UeERlc2NBcnJheVtlbnRyeV0uc3RhdHVzID0KKwkJICAgIChPV05iaXQgfCBFT1JiaXQgfCBGU2JpdCB8IExTYml0KSB8ICgocyA+IEVUSF9aTEVOKSA/IHMKKwkJCQkJCQkgOiBFVEhfWkxFTik7CisJUlRMX1c4KFR4UG9sbCwgMHg0MCk7CS8qIHNldCBwb2xsaW5nIGJpdCAqLworCisJdHBjLT5jdXJfdHgrKzsKKwl0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRU9VVDsKKwl3aGlsZSAoKHRwYy0+VHhEZXNjQXJyYXlbZW50cnldLnN0YXR1cyAmIE9XTmJpdCkgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKTsJLyogd2FpdCAqLworCisJaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisJCXByaW50ZigiVFggVGltZSBPdXQiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCWludCByeF9tb2RlOworCXUzMiB0bXAgPSAwOworCisJLyogSUZGX0FMTE1VTFRJICovCisJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHBlcmZlY3RseSAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCisJdG1wID0KKwkgICAgcnRsODE2OV9yeF9jb25maWcgfCByeF9tb2RlIHwgKFJUTF9SMzIoUnhDb25maWcpICYKKwkJCQkJICAgcnRsX2NoaXBfaW5mb1t0cGMtPmNoaXBzZXRdLgorCQkJCQkgICBSeENvbmZpZ01hc2spOworCisJUlRMX1czMihSeENvbmZpZywgdG1wKTsKKwlSVExfVzMyKE1BUjAgKyAwLCBtY19maWx0ZXJbMF0pOworCVJUTF9XMzIoTUFSMCArIDQsIG1jX2ZpbHRlclsxXSk7Cit9CitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1MzIgaTsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCWlmICgoUlRMX1I4KENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJZWxzZQorCQkJdWRlbGF5KDEwKTsKKwl9CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKwlSVExfVzgoRWFybHlUeFRocmVzLCBFYXJseVR4VGhsZCk7CisKKwkvKiBGb3IgZ2lnYWJpdCBydGw4MTY5ICovCisJUlRMX1cxNihSeE1heFNpemUsIFJ4UGFja2V0TWF4U2l6ZSk7CisKKwkvKiBTZXQgUnggQ29uZmlnIHJlZ2lzdGVyICovCisJaSA9IHJ0bDgxNjlfcnhfY29uZmlnIHwgKFJUTF9SMzIoUnhDb25maWcpICYKKwkJCQkgcnRsX2NoaXBfaW5mb1t0cGMtPmNoaXBzZXRdLlJ4Q29uZmlnTWFzayk7CisJUlRMX1czMihSeENvbmZpZywgaSk7CisKKwkvKiBTZXQgRE1BIGJ1cnN0IHNpemUgYW5kIEludGVyZnJhbWUgR2FwIFRpbWUgKi8KKwlSVExfVzMyKFR4Q29uZmlnLAorCQkoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpIHwgKEludGVyRnJhbWVHYXAgPDwKKwkJCQkJCVR4SW50ZXJGcmFtZUdhcFNoaWZ0KSk7CisKKworCXRwYy0+Y3VyX3J4ID0gMDsKKworCVJUTF9XMzIoVHhEZXNjU3RhcnRBZGRyLCB2aXJ0X3RvX2xlMzJkZXNjKHRwYy0+VHhEZXNjQXJyYXkpKTsKKwlSVExfVzMyKFJ4RGVzY1N0YXJ0QWRkciwgdmlydF90b19sZTMyZGVzYyh0cGMtPlJ4RGVzY0FycmF5KSk7CisJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisJdWRlbGF5KDEwKTsKKworCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCisJcnRsODE2OV9zZXRfcnhfbW9kZShuaWMpOworCisJLyogbm8gZWFybHktcnggaW50ZXJydXB0cyAqLworCVJUTF9XMTYoTXVsdGlJbnRyLCBSVExfUjE2KE11bHRpSW50cikgJiAweEYwMDApOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2luaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJaW50IGk7CisKKwl0cGMtPmN1cl9yeCA9IDA7CisJdHBjLT5jdXJfdHggPSAwOworCW1lbXNldCh0cGMtPlR4RGVzY0FycmF5LCAweDAsIE5VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpKTsKKwltZW1zZXQodHBjLT5SeERlc2NBcnJheSwgMHgwLCBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgUnhEZXNjKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQl0cGMtPlR4X3NrYnVmZltpXSA9ICZ0eGJbaV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKwkJaWYgKGkgPT0gKE5VTV9SWF9ERVNDIC0gMSkpCisJCQl0cGMtPlJ4RGVzY0FycmF5W2ldLnN0YXR1cyA9CisJCQkgICAgKE9XTmJpdCB8IEVPUmJpdCkgKyBSWF9CVUZfU0laRTsKKwkJZWxzZQorCQkJdHBjLT5SeERlc2NBcnJheVtpXS5zdGF0dXMgPSBPV05iaXQgKyBSWF9CVUZfU0laRTsKKworCQl0cGMtPlJ4QnVmZmVyUmluZ1tpXSA9ICZyeGJbaSAqIFJYX0JVRl9TSVpFXTsKKwkJdHBjLT5SeERlc2NBcnJheVtpXS5idWZfYWRkciA9CisJCSAgICB2aXJ0X3RvX2J1cyh0cGMtPlJ4QnVmZmVyUmluZ1tpXSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFU0VUIC0gRmluaXNoIHNldHRpbmcgdXAgdGhlIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcjgxNjlfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCXU4IGRpZmY7CisJdTMyIFR4UGh5QWRkciwgUnhQaHlBZGRyOworCisJdHBjLT5UeERlc2NBcnJheXMgPSB0eF9yaW5nOworCWlmICh0cGMtPlR4RGVzY0FycmF5cyA9PSAwKQorCQlwcmludGYoIkFsbG90IEVycm9yIik7CisJLyogVHggRGVzc2NyaXB0b3IgbmVlZHMgMjU2IGJ5dGVzIGFsaWdubWVudDsgKi8KKwlUeFBoeUFkZHIgPSB2aXJ0X3RvX2J1cyh0cGMtPlR4RGVzY0FycmF5cyk7CisJZGlmZiA9IDI1NiAtIChUeFBoeUFkZHIgLSAoKFR4UGh5QWRkciA+PiA4KSA8PCA4KSk7CisJVHhQaHlBZGRyICs9IGRpZmY7CisJdHBjLT5UeERlc2NBcnJheSA9IChzdHJ1Y3QgVHhEZXNjICopICh0cGMtPlR4RGVzY0FycmF5cyArIGRpZmYpOworCisJdHBjLT5SeERlc2NBcnJheXMgPSByeF9yaW5nOworCS8qIFJ4IERlc3NjcmlwdG9yIG5lZWRzIDI1NiBieXRlcyBhbGlnbm1lbnQ7ICovCisJUnhQaHlBZGRyID0gdmlydF90b19idXModHBjLT5SeERlc2NBcnJheXMpOworCWRpZmYgPSAyNTYgLSAoUnhQaHlBZGRyIC0gKChSeFBoeUFkZHIgPj4gOCkgPDwgOCkpOworCVJ4UGh5QWRkciArPSBkaWZmOworCXRwYy0+UnhEZXNjQXJyYXkgPSAoc3RydWN0IFJ4RGVzYyAqKSAodHBjLT5SeERlc2NBcnJheXMgKyBkaWZmKTsKKworCWlmICh0cGMtPlR4RGVzY0FycmF5cyA9PSBOVUxMIHx8IHRwYy0+UnhEZXNjQXJyYXlzID09IE5VTEwpIHsKKwkJcHJpbnRmKCJBbGxvY2F0ZSBSeERlc2NBcnJheSBvciBUeERlc2NBcnJheSBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcnRsODE2OV9pbml0X3JpbmcobmljKTsKKwlydGw4MTY5X2h3X3N0YXJ0KG5pYyk7CisJLyogQ29uc3RydWN0IGEgcGVyZmVjdCBmaWx0ZXIgZnJhbWUgd2l0aCB0aGUgbWFjIGFkZHJlc3MgYXMgZmlyc3QgbWF0Y2gKKwkgKiBhbmQgYnJvYWRjYXN0IGZvciBhbGwgb3RoZXJzICovCisJZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorCQl0eGJbaV0gPSAweEZGOworCisJdHhiWzBdID0gbmljLT5ub2RlX2FkZHJbMF07CisJdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07CisJdHhiWzJdID0gbmljLT5ub2RlX2FkZHJbMl07CisJdHhiWzNdID0gbmljLT5ub2RlX2FkZHJbM107CisJdHhiWzRdID0gbmljLT5ub2RlX2FkZHJbNF07CisJdHhiWzVdID0gbmljLT5ub2RlX2FkZHJbNV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcjgxNjlfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYgX191bnVzZWQpCit7CisJaW50IGk7CisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBETUEgcHJvY2Vzc2VzLiAqLworCVJUTF9XOChDaGlwQ21kLCAweDAwKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJUlRMX1cxNihJbnRyTWFzaywgMHgwMDAwKTsKKworCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCisJdHBjLT5UeERlc2NBcnJheXMgPSBOVUxMOworCXRwYy0+UnhEZXNjQXJyYXlzID0gTlVMTDsKKwl0cGMtPlR4RGVzY0FycmF5ID0gTlVMTDsKKwl0cGMtPlJ4RGVzY0FycmF5ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQl0cGMtPlJ4QnVmZmVyUmluZ1tpXSA9IE5VTEw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGJvYXJkX2ZvdW5kIDEKKyNkZWZpbmUgdmFsaWRfbGluayAwCitzdGF0aWMgaW50IHI4MTY5X3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKSBkZXY7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbiA9IDA7CisJaW50IGksIHJjOworCWludCBvcHRpb24gPSAtMSwgQ2FwMTBfMTAwID0gMCwgQ2FwMTAwMCA9IDA7CisKKwlwcmludGYoInI4MTY5LmM6IEZvdW5kICVzLCBWZW5kb3I9JWhYIERldmljZT0laFhcbiIsCisJICAgICAgIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkKTsKKworCWJvYXJkX2lkeCsrOworCisJcHJpbnRlZF92ZXJzaW9uID0gMTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCXRwYyA9ICZ0cHg7CisKKwlyYyA9IHJ0bDgxNjlfaW5pdF9ib2FyZChwY2kpOwkvKiBSZXR1cm4gY29kZSBpcyBtZWFuaW5nbGVzcyAqLworCisJLyogR2V0IE1BQyBhZGRyZXNzLiAgRklYTUU6IHJlYWQgRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCQluaWMtPm5vZGVfYWRkcltpXSA9IFJUTF9SOChNQUMwICsgaSk7CisKKwlkcHJpbnRmKCgiJXM6IElkZW50aWZpZWQgY2hpcCB0eXBlIGlzICclcycuXG4iLCBwY2ktPm5hbWUsCisJCSBydGxfY2hpcF9pbmZvW3RwYy0+Y2hpcHNldF0ubmFtZSkpOworCS8qIFByaW50IG91dCBzb21lIGhhcmR3YXJlIGluZm8gKi8KKwlwcmludGYoIiVzOiAlISBhdCBpb2FkZHIgJWhYLCAiLCBwY2ktPm5hbWUsIG5pYy0+bm9kZV9hZGRyLAorCSAgICAgICBpb2FkZHIpOworCisJLyogaWYgVEJJIGlzIG5vdCBlbmRibGVkICovCisJaWYgKCEoUlRMX1I4KFBIWXN0YXR1cykgJiBUQklfRW5hYmxlKSkgeworCQlpbnQgdmFsID0gbWRpb19yZWFkKFBIWV9BVVRPX05FR09fUkVHKTsKKworCQlvcHRpb24gPSBtZWRpYTsKKwkJLyogRm9yY2UgUlRMODE2OSBpbiAxMC8xMDAvMTAwMCBGdWxsL0hhbGYgbW9kZS4gKi8KKwkJaWYgKG9wdGlvbiA+IDApIHsKKwkJCXByaW50ZigiIEZvcmNlLW1vZGUgRW5hYmxlZC5cbiIpOworCQkJQ2FwMTBfMTAwID0gMCwgQ2FwMTAwMCA9IDA7CisJCQlzd2l0Y2ggKG9wdGlvbikgeworCQkJY2FzZSBfMTBfSGFsZjoKKwkJCQlDYXAxMF8xMDAgPSBQSFlfQ2FwXzEwX0hhbGY7CisJCQkJQ2FwMTAwMCA9IFBIWV9DYXBfTnVsbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgXzEwX0Z1bGw6CisJCQkJQ2FwMTBfMTAwID0gUEhZX0NhcF8xMF9GdWxsOworCQkJCUNhcDEwMDAgPSBQSFlfQ2FwX051bGw7CisJCQkJYnJlYWs7CisJCQljYXNlIF8xMDBfSGFsZjoKKwkJCQlDYXAxMF8xMDAgPSBQSFlfQ2FwXzEwMF9IYWxmOworCQkJCUNhcDEwMDAgPSBQSFlfQ2FwX051bGw7CisJCQkJYnJlYWs7CisJCQljYXNlIF8xMDBfRnVsbDoKKwkJCQlDYXAxMF8xMDAgPSBQSFlfQ2FwXzEwMF9GdWxsOworCQkJCUNhcDEwMDAgPSBQSFlfQ2FwX051bGw7CisJCQkJYnJlYWs7CisJCQljYXNlIF8xMDAwX0Z1bGw6CisJCQkJQ2FwMTBfMTAwID0gUEhZX0NhcF9OdWxsOworCQkJCUNhcDEwMDAgPSBQSFlfQ2FwXzEwMDBfRnVsbDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBsZWF2ZSBQSFlfQVVUT19ORUdPX1JFRyBiaXQ0OjAgdW5jaGFuZ2VkICovCisJCQltZGlvX3dyaXRlKFBIWV9BVVRPX05FR09fUkVHLAorCQkJCSAgIENhcDEwXzEwMCB8ICh2YWwgJiAweDFGKSk7CisJCQltZGlvX3dyaXRlKFBIWV8xMDAwX0NUUkxfUkVHLCBDYXAxMDAwKTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGYoKCJBdXRvLW5lZ290aWF0aW9uIEVuYWJsZWQuXG4iLAorCQkJCSBwY2ktPm5hbWUpKTsKKworCQkJLyogZW5hYmxlIDEwLzEwMCBGdWxsL0hhbGYgTW9kZSwgbGVhdmUgUEhZX0FVVE9fTkVHT19SRUcgYml0NDowIHVuY2hhbmdlZCAqLworCQkJbWRpb193cml0ZShQSFlfQVVUT19ORUdPX1JFRywKKwkJCQkgICBQSFlfQ2FwXzEwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGwgfAorCQkJCSAgIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsIHwKKwkJCQkgICAodmFsICYgMHgxRikpOworCisJCQkvKiBlbmFibGUgMTAwMCBGdWxsIE1vZGUgKi8KKwkJCW1kaW9fd3JpdGUoUEhZXzEwMDBfQ1RSTF9SRUcsIFBIWV9DYXBfMTAwMF9GdWxsKTsKKworCQl9CisKKwkJLyogRW5hYmxlIGF1dG8tbmVnb3RpYXRpb24gYW5kIHJlc3RhcnQgYXV0by1uaWdvdGlhdGlvbiAqLworCQltZGlvX3dyaXRlKFBIWV9DVFJMX1JFRywKKwkJCSAgIFBIWV9FbmFibGVfQXV0b19OZWdvIHwgUEhZX1Jlc3RhcnRfQXV0b19OZWdvKTsKKwkJdWRlbGF5KDEwMCk7CisKKwkJLyogd2FpdCBmb3IgYXV0by1uZWdvdGlhdGlvbiBwcm9jZXNzICovCisJCWZvciAoaSA9IDEwMDAwOyBpID4gMDsgaS0tKSB7CisJCQkvKiBDaGVjayBpZiBhdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICovCisJCQlpZiAobWRpb19yZWFkKFBIWV9TVEFUX1JFRykgJiBQSFlfQXV0b19OZWNvX0NvbXApIHsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCQlvcHRpb24gPSBSVExfUjgoUEhZc3RhdHVzKTsKKwkJCQlpZiAob3B0aW9uICYgXzEwMDBicHNGKSB7CisJCQkJCXByaW50ZgorCQkJCQkgICAgKCIxMDAwTWJwcyBGdWxsLWR1cGxleCBvcGVyYXRpb24uXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYKKwkJCQkJICAgICgiJXNNYnBzICVzLWR1cGxleCBvcGVyYXRpb24uXG4iLAorCQkJCQkgICAgIChvcHRpb24gJiBfMTAwYnBzKSA/ICIxMDAiIDoKKwkJCQkJICAgICAiMTAiLAorCQkJCQkgICAgIChvcHRpb24gJiBGdWxsRHVwKSA/ICJGdWxsIiA6CisJCQkJCSAgICAgIkhhbGYiKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXVkZWxheSgxMDApOworCQkJfQorCQl9CQkvKiBlbmQgZm9yLWxvb3AgdG8gd2FpdCBmb3IgYXV0by1uZWdvdGlhdGlvbiBwcm9jZXNzICovCisKKwl9IGVsc2UgeworCQl1ZGVsYXkoMTAwKTsKKwkJcHJpbnRmCisJCSAgICAoIiVzOiAxMDAwTWJwcyBGdWxsLWR1cGxleCBvcGVyYXRpb24sIFRCSSBMaW5rICVzIVxuIiwKKwkJICAgICBwY2ktPm5hbWUsCisJCSAgICAgKFJUTF9SMzIoVEJJQ1NSKSAmIFRCSUxpbmtPSykgPyAiT0siIDogIkZhaWxlZCIpOworCisJfQorCisJcjgxNjlfcmVzZXQobmljKTsKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwlkZXYtPmRpc2FibGUgPSByODE2OV9kaXNhYmxlOworCW5pYy0+cG9sbCA9IHI4MTY5X3BvbGw7CisJbmljLT50cmFuc21pdCA9IHI4MTY5X3RyYW5zbWl0OworCW5pYy0+aXJxbm8gPSBwY2ktPmlycTsKKwluaWMtPmlycSA9IHI4MTY5X2lycTsKKwluaWMtPmlvYWRkciA9IGlvYWRkcjsKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCByODE2OV9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwZWMsIDB4ODE2OSwgInI4MTY5IiwgIlJlYWxUZWsgUlRMODE2OSBHaWdhYml0IEV0aGVybmV0IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciByODE2OV9kcml2ZXIgPSB7CisJLnR5cGUgPSBOSUNfRFJJVkVSLAorCS5uYW1lID0gInI4MTY5L1BDSSIsCisJLnByb2JlID0gcjgxNjlfcHJvYmUsCisJLmlkcyA9IHI4MTY5X25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHI4MTY5X25pY3MpIC8gc2l6ZW9mKHI4MTY5X25pY3NbMF0pLAorCS5jbGFzcyA9IDAsCit9OwpJbmRleDogYi9uZXRib290L3J0bDgxMzkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvcnRsODEzOS5jCisrKyBiL25ldGJvb3QvcnRsODEzOS5jCkBAIC0xNyw2ICsxNyw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgorICAyOCBEZWMgMjAwMglrZW5feWFwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAoS2VuIFlhcCkKKyAgICAgUHV0IGluIHZpcnRfdG9fYnVzIGNhbGxzIHRvIGFsbG93IEV0aGVyYm9vdCByZWxvY2F0aW9uLgogCiAgIDA2IEFwciAyMDAxCWtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0IChLZW4gWWFwKQogICAgICBGb2xsb3dpbmcgZW1haWwgZnJvbSBIeXVuLUpvb24gQ2hhLCBhZGRlZCBhIGRpc2FibGUgcm91dGluZSwgb3RoZXJ3aXNlCkBAIC02Myw3ICs2NSw2IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCiAjZGVmaW5lIFJUTF9USU1FT1VUICgxKlRJQ0tTX1BFUl9TRUMpCkBAIC0xMTIsOSArMTEzLDE5IEBACiAJICogZGVmaW5pdGlvbnMgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBuZWVkIHRvIGtub3cgYWJvdXQuICAqLwogfTsKIAorZW51bSBSeEVhcmx5U3RhdHVzQml0cyB7CisJRVJHb29kPTB4MDgsIEVSQmFkPTB4MDQsIEVST1ZXPTB4MDIsIEVST0s9MHgwMQorfTsKKwogZW51bSBDaGlwQ21kQml0cyB7CiAJQ21kUmVzZXQ9MHgxMCwgQ21kUnhFbmI9MHgwOCwgQ21kVHhFbmI9MHgwNCwgUnhCdWZFbXB0eT0weDAxLCB9OwogCitlbnVtIEludHJNYXNrQml0cyB7CisJU0VSUj0weDgwMDAsIFRpbWVPdXQ9MHg0MDAwLCBMZW5DaGc9MHgyMDAwLAorCUZPVlc9MHg0MCwgUFVOX0xpbmtDaGc9MHgyMCwgUlhPVlc9MHgxMCwKKwlURVI9MHgwOCwgVE9LPTB4MDQsIFJFUj0weDAyLCBST0s9MHgwMQorfTsKKwogLyogSW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMsIHVzaW5nIG15IG93biBtZWFuaW5nZnVsIG5hbWVzLiAqLwogZW51bSBJbnRyU3RhdHVzQml0cyB7CiAJUENJRXJyPTB4ODAwMCwgUENTVGltZW91dD0weDQwMDAsIENhYmxlTGVuQ2hhbmdlPSAweDIwMDAsCkBAIC0xNTUsNzQgKzE2Niw2OCBAQAogCUFjY2VwdE11bHRpY2FzdD0weDA0LCBBY2NlcHRNeVBoeXM9MHgwMiwgQWNjZXB0QWxsUGh5cz0weDAxLAogfTsKIAotc3RhdGljIGludCBpb2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgaW50IGN1cl9yeCxjdXJfdHg7CiAKIC8qIFRoZSBSVEw4MTM5IGNhbiBvbmx5IHRyYW5zbWl0IGZyb20gYSBjb250aWd1b3VzLCBhbGlnbmVkIG1lbW9yeSBibG9jay4gICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eF9idWZmZXJbVFhfQlVGX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKLQotLyogSSBrbm93IHRoYXQgdGhpcyBpcyBhIE1FR0EgSEFDSywgYnV0IHRoZSB0YWdnZWQgYm9vdCBpbWFnZSBzcGVjaWZpY2F0aW9uCi0gKiBzdGF0ZXMgdGhhdCB3ZSBjYW4gZG8gd2hhdGV2ZXIgd2Ugd2FudCBiZWxvdyAweDEwMDAwIC0gc28gd2UgZG8hICAqLwotLyogQnV0IHdlIHN0aWxsIGdpdmUgdGhlIHVzZXIgdGhlIGNob2ljZSBvZiB1c2luZyBhbiBpbnRlcm5hbCBidWZmZXIKLSAgIGp1c3QgaW4gY2FzZSAtIEtlbiAqLwotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHJ4X3JpbmcgKCh1bnNpZ25lZCBjaGFyICopKDB4MTAwMDAgLSAoUlhfQlVGX0xFTiArIDE2KSkpCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhfcmluZ1tSWF9CVUZfTEVOKzE2XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7Ci0jZW5kaWYKIAotc3RydWN0IG5pYyAqcnRsODEzOV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLAotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOwotc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBydGw4MTM5X3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHN0cnVjdCBuaWMgKm5pYywgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOwogc3RhdGljIHZvaWQgcnRsX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCBydGxfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkZXN0YWRkciwKIAl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSk7Ci1zdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCBydGxfZGlzYWJsZShzdHJ1Y3QgbmljKik7CitzdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBkZXYgKik7CitzdGF0aWMgdm9pZCBydGxfaXJxKHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbik7CiAKIAotc3RydWN0IG5pYyAqcnRsODEzOV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLAotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHJ0bDgxMzlfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogeworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogCWludCBpOwogCWludCBzcGVlZDEwLCBmdWxsZHVwbGV4OworCWludCBhZGRyX2xlbjsKKwl1bnNpZ25lZCBzaG9ydCAqYXAgPSAodW5zaWduZWQgc2hvcnQqKW5pYy0+bm9kZV9hZGRyOwogCiAJLyogVGhlcmUgYXJlIGVub3VnaCAiUlRMODEzOSIgc3RyaW5ncyBvbiB0aGUgY29uc29sZSBhbHJlYWR5LCBzbwogCSAqIGJlIGJyaWVmIGFuZCBjb25jZW50cmF0ZSBvbiB0aGUgaW50ZXJlc3RpbmcgcGllY2VzIG9mIGluZm8uLi4gKi8KIAlwcmludGYoIiAtICIpOwogCiAJLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLwotCWlvYWRkciA9IHByb2JlYWRkcnNbMF0gJiB+MzsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKwkvKiBDb3B5IElSUSBmcm9tIFBDSSBpbmZvcm1hdGlvbiAqLworCW5pYy0+aXJxbm8gPSBwY2ktPmlycTsKIAogCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAKIAkvKiBCcmluZyB0aGUgY2hpcCBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCi0Jb3V0YigweDAwLCBpb2FkZHIgKyBDb25maWcxKTsKLQotCWlmIChyZWFkX2VlcHJvbSgwKSAhPSAweGZmZmYpIHsKLQkJdW5zaWduZWQgc2hvcnQgKmFwID0gKHVuc2lnbmVkIHNob3J0KiluaWMtPm5vZGVfYWRkcjsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCSphcCsrID0gcmVhZF9lZXByb20oaSArIDcpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmFwID0gKHVuc2lnbmVkIGNoYXIqKW5pYy0+bm9kZV9hZGRyOwotCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJCSphcCsrID0gaW5iKGlvYWRkciArIE1BQzAgKyBpKTsKLQl9CisJb3V0YigweDAwLCBuaWMtPmlvYWRkciArIENvbmZpZzEpOwogCi0Jc3BlZWQxMCA9IGluYihpb2FkZHIgKyBNZWRpYVN0YXR1cykgJiBNU1JTcGVlZDEwOwotCWZ1bGxkdXBsZXggPSBpbncoaW9hZGRyICsgTUlJX0JNQ1IpICYgQk1DUkR1cGxleDsKLQlwcmludGYoImlvYWRkciAlI2hYLCBhZGRyICUhICVzTWJwcyAlcy1kdXBsZXhcbiIsIGlvYWRkciwKLQkJbmljLT5ub2RlX2FkZHIsICBzcGVlZDEwID8gIjEwIiA6ICIxMDAiLAotCQlmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tKG5pYywwLDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAqYXArKyA9IHJlYWRfZWVwcm9tKG5pYyxpICsgNyxhZGRyX2xlbik7CisKKwlzcGVlZDEwID0gaW5iKG5pYy0+aW9hZGRyICsgTWVkaWFTdGF0dXMpICYgTVNSU3BlZWQxMDsKKwlmdWxsZHVwbGV4ID0gaW53KG5pYy0+aW9hZGRyICsgTUlJX0JNQ1IpICYgQk1DUkR1cGxleDsKKwlwcmludGYoImlvYWRkciAlI2hYLCBpcnEgJWQsIGFkZHIgJSEgJXNNYnBzICVzLWR1cGxleFxuIiwgbmljLT5pb2FkZHIsCisJICAgICAgIG5pYy0+aXJxbm8sIG5pYy0+bm9kZV9hZGRyLCAgc3BlZWQxMCA/ICIxMCIgOiAiMTAwIiwKKwkgICAgICAgZnVsbGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CiAKIAlydGxfcmVzZXQobmljKTsKIAotCW5pYy0+cmVzZXQgPSBydGxfcmVzZXQ7Ci0JbmljLT5wb2xsID0gcnRsX3BvbGw7CisJaWYgKGluYihuaWMtPmlvYWRkciArIE1lZGlhU3RhdHVzKSAmIE1TUkxpbmtGYWlsKSB7CisJCXByaW50ZigiQ2FibGUgbm90IGNvbm5lY3RlZCBvciBvdGhlciBsaW5rIGZhaWx1cmVcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJZGV2LT5kaXNhYmxlICA9IHJ0bF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBydGxfcG9sbDsKIAluaWMtPnRyYW5zbWl0ID0gcnRsX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IHJ0bF9kaXNhYmxlOworCW5pYy0+aXJxICAgICAgPSBydGxfaXJxOwogCi0JcmV0dXJuIG5pYzsKKwlyZXR1cm4gMTsKIH0KIAogLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLwpAQCAtMjQ0LDIyICsyNDksMjMgQEAKICNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgIGlubChlZV9hZGRyKQogCiAvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KLSNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1IDw8IDYpCi0jZGVmaW5lIEVFX1JFQURfQ01EICAgICAoNiA8PCA2KQotI2RlZmluZSBFRV9FUkFTRV9DTUQgICAgKDcgPDwgNikKKyNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1KQorI2RlZmluZSBFRV9SRUFEX0NNRCAgICAgKDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRCAgICAoNykKIAotc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHN0cnVjdCBuaWMgKm5pYywgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7Ci0JbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKLQlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCWxvbmcgZWVfYWRkciA9IG5pYy0+aW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CiAKIAlvdXRiKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CiAJb3V0YihFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOwogCiAJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KLQlmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CiAJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CiAJCW91dGIoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CiAJCWVlcHJvbV9kZWxheSgpOwpAQCAtMjc5LDMxICsyODUsNTEgQEAKIAogCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KIAlvdXRiKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBydGw4MTM5X3J4X2NvbmZpZyA9IAorCShSWF9CVUZfTEVOX0lEWCA8PCAxMSkgfAorCShSWF9GSUZPX1RIUkVTSCA8PCAxMykgfAorCShSWF9ETUFfQlVSU1QgPDwgOCk7CisJCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpIHsKKwl1bnNpZ25lZCBpbnQgbWNfZmlsdGVyWzJdOworCWludCByeF9tb2RlOworCS8qICFJRkZfUFJPTUlTQyAqLworCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKworCW91dGwocnRsODEzOV9yeF9jb25maWcgfCByeF9tb2RlLCBuaWMtPmlvYWRkciArIFJ4Q29uZmlnKTsKKworCW91dGwobWNfZmlsdGVyWzBdLCBuaWMtPmlvYWRkciArIE1BUjAgKyAwKTsKKwlvdXRsKG1jX2ZpbHRlclsxXSwgbmljLT5pb2FkZHIgKyBNQVIwICsgNCk7Cit9CisJCiBzdGF0aWMgdm9pZCBydGxfcmVzZXQoc3RydWN0IG5pYyogbmljKQogewogCWludCBpOwogCi0Jb3V0YihDbWRSZXNldCwgaW9hZGRyICsgQ2hpcENtZCk7CisJb3V0YihDbWRSZXNldCwgbmljLT5pb2FkZHIgKyBDaGlwQ21kKTsKIAogCWN1cl9yeCA9IDA7CiAJY3VyX3R4ID0gMDsKIAogCS8qIEdpdmUgdGhlIGNoaXAgMTBtcyB0byBmaW5pc2ggdGhlIHJlc2V0LiAqLwogCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7Ci0Jd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCXdoaWxlICgoaW5iKG5pYy0+aW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJgorCSAgICAgICB0aW1lcjJfcnVubmluZygpKQogCQkvKiB3YWl0ICovOwogCiAJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIGlvYWRkciArIE1BQzAgKyBpKTsKKwkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgbmljLT5pb2FkZHIgKyBNQUMwICsgaSk7CiAKIAkvKiBNdXN0IGVuYWJsZSBUeC9SeCBiZWZvcmUgc2V0dGluZyB0cmFuc2ZlciB0aHJlc2hvbGRzISAqLwotCW91dGIoQ21kUnhFbmIgfCBDbWRUeEVuYiwgaW9hZGRyICsgQ2hpcENtZCk7CisJb3V0YihDbWRSeEVuYiB8IENtZFR4RW5iLCBuaWMtPmlvYWRkciArIENoaXBDbWQpOwogCW91dGwoKFJYX0ZJRk9fVEhSRVNIPDwxMykgfCAoUlhfQlVGX0xFTl9JRFg8PDExKSB8IChSWF9ETUFfQlVSU1Q8PDgpLAotCQlpb2FkZHIgKyBSeENvbmZpZyk7CQkvKiBhY2NlcHQgbm8gZnJhbWVzIHlldCEgICovCi0Jb3V0bCgoVFhfRE1BX0JVUlNUPDw4KXwweDAzMDAwMDAwLCBpb2FkZHIgKyBUeENvbmZpZyk7CisJCW5pYy0+aW9hZGRyICsgUnhDb25maWcpOwkgIC8qIGFjY2VwdCBubyBmcmFtZXMgeWV0ISAgKi8KKwlvdXRsKChUWF9ETUFfQlVSU1Q8PDgpfDB4MDMwMDAwMDAsIG5pYy0+aW9hZGRyICsgVHhDb25maWcpOwogCiAJLyogVGhlIExpbnV4IGRyaXZlciBjaGFuZ2VzIENvbmZpZzEgaGVyZSB0byB1c2UgYSBkaWZmZXJlbnQgTEVEIHBhdHRlcm4KIAkgKiBmb3IgaGFsZiBkdXBsZXggb3IgZnVsbC9hdXRvZGV0ZWN0IGR1cGxleCAoZm9yIGZ1bGwvYXV0b2RldGVjdCwgdGhlCkBAIC0zMTYsMTkgKzM0MiwyNiBAQAogI2lmZGVmCURFQlVHX1JYCiAJcHJpbnRmKCJyeCByaW5nIGFkZHJlc3MgaXMgJVhcbiIsKHVuc2lnbmVkIGxvbmcpcnhfcmluZyk7CiAjZW5kaWYKLQlvdXRsKCh1bnNpZ25lZCBsb25nKXJ4X3JpbmcsIGlvYWRkciArIFJ4QnVmKTsKKwlvdXRsKCh1bnNpZ25lZCBsb25nKXZpcnRfdG9fYnVzKHJ4X3JpbmcpLCBuaWMtPmlvYWRkciArIFJ4QnVmKTsKKworCiAKLQkvKiBTdGFydCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzLiAqLwotCW91dGwoMCwgaW9hZGRyICsgUnhNaXNzZWQpOwotCS8qIHNldF9yeF9tb2RlICovCi0Jb3V0YihBY2NlcHRCcm9hZGNhc3R8QWNjZXB0TXlQaHlzLCBpb2FkZHIgKyBSeENvbmZpZyk7CiAJLyogSWYgd2UgYWRkIG11bHRpY2FzdCBzdXBwb3J0LCB0aGUgTUFSMCByZWdpc3RlciB3b3VsZCBoYXZlIHRvIGJlCiAJICogaW5pdGlhbGl6ZWQgdG8gMHhmZmZmZmZmZmZmZmZmZmZmICh0d28gMzIgYml0IGFjY2Vzc2VzKS4gIEV0aGVyYm9vdAogCSAqIG9ubHkgbmVlZHMgYnJvYWRjYXN0IChmb3IgQVJQL1JBUlAvQk9PVFAvREhDUCkgYW5kIHVuaWNhc3QuICAqLwotCW91dGIoQ21kUnhFbmIgfCBDbWRUeEVuYiwgaW9hZGRyICsgQ2hpcENtZCk7CiAKKwlvdXRiKENtZFJ4RW5iIHwgQ21kVHhFbmIsIG5pYy0+aW9hZGRyICsgQ2hpcENtZCk7CisJCisJb3V0bChydGw4MTM5X3J4X2NvbmZpZywgbmljLT5pb2FkZHIgKyBSeENvbmZpZyk7CisJCisJLyogU3RhcnQgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzcy4gKi8KKwlvdXRsKDAsIG5pYy0+aW9hZGRyICsgUnhNaXNzZWQpOworCisJLyogc2V0X3J4X21vZGUgKi8KKwlzZXRfcnhfbW9kZShuaWMpOworCQogCS8qIERpc2FibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCi0Jb3V0dygwLCBpb2FkZHIgKyBJbnRyTWFzayk7CisJb3V0dygwLCBuaWMtPmlvYWRkciArIEludHJNYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsCkBAIC0zMzcsMTAgKzM3MCwxMSBAQAogCXVuc2lnbmVkIGludCBzdGF0dXMsIHRvLCBuc3R5cGU7CiAJdW5zaWduZWQgbG9uZyB0eHN0YXR1czsKIAorCS8qIG5zdHlwZSBhc3NpZ25tZW50IG1vdmVkIHVwIGhlcmUgdG8gYXZvaWQgZ2NjIDMuMC4zIGNvbXBpbGVyIGJ1ZyAqLworCW5zdHlwZSA9IGh0b25zKHR5cGUpOwogCW1lbWNweSh0eF9idWZmZXIsIGRlc3RhZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KHR4X2J1ZmZlciArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCW5zdHlwZSA9IGh0b25zKHR5cGUpOwotCW1lbWNweSh0eF9idWZmZXIgKyAyICogRVRIX0FMRU4sIChjaGFyKikmbnN0eXBlLCAyKTsKKwltZW1jcHkodHhfYnVmZmVyICsgMiAqIEVUSF9BTEVOLCAmbnN0eXBlLCAyKTsKIAltZW1jcHkodHhfYnVmZmVyICsgRVRIX0hMRU4sIGRhdGEsIGxlbik7CiAKIAlsZW4gKz0gRVRIX0hMRU47CkBAIC0zNTQsMjIgKzM4OCwyMiBAQAogCQl0eF9idWZmZXJbbGVuKytdID0gJ1wwJzsKIAl9CiAKLQlvdXRsKCh1bnNpZ25lZCBsb25nKXR4X2J1ZmZlciwgaW9hZGRyICsgVHhBZGRyMCArIGN1cl90eCo0KTsKKwlvdXRsKCh1bnNpZ25lZCBsb25nKXZpcnRfdG9fYnVzKHR4X2J1ZmZlciksIG5pYy0+aW9hZGRyICsgVHhBZGRyMCArIGN1cl90eCo0KTsKIAlvdXRsKCgoVFhfRklGT19USFJFU0g8PDExKSAmIDB4MDAzZjAwMDApIHwgbGVuLAotCQlpb2FkZHIgKyBUeFN0YXR1czAgKyBjdXJfdHgqNCk7CisJCW5pYy0+aW9hZGRyICsgVHhTdGF0dXMwICsgY3VyX3R4KjQpOwogCiAJdG8gPSBjdXJydGlja3MoKSArIFJUTF9USU1FT1VUOwogCiAJZG8gewotCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgSW50clN0YXR1cyk7CisJCXN0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOwogCQkvKiBPbmx5IGFja25sb3dsZWRnZSBpbnRlcnJ1cHQgc291cmNlcyB3ZSBjYW4gcHJvcGVybHkgaGFuZGxlCiAJCSAqIGhlcmUgLSB0aGUgUnhPdmVyZmxvdy9SeEZJRk9PdmVyIE1VU1QgYmUgaGFuZGxlZCBpbiB0aGUKIAkJICogcnRsX3BvbGwoKSBmdW5jdGlvbi4gICovCi0JCW91dHcoc3RhdHVzICYgKFR4T0sgfCBUeEVyciB8IFBDSUVyciksIGlvYWRkciArIEludHJTdGF0dXMpOworCQlvdXR3KHN0YXR1cyAmIChUeE9LIHwgVHhFcnIgfCBQQ0lFcnIpLCBuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOwogCQlpZiAoKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIgfCBQQ0lFcnIpKSAhPSAwKSBicmVhazsKIAl9IHdoaWxlIChjdXJydGlja3MoKSA8IHRvKTsKIAotCXR4c3RhdHVzID0gaW5sKGlvYWRkcisgVHhTdGF0dXMwICsgY3VyX3R4KjQpOworCXR4c3RhdHVzID0gaW5sKG5pYy0+aW9hZGRyKyBUeFN0YXR1czAgKyBjdXJfdHgqNCk7CiAKIAlpZiAoc3RhdHVzICYgVHhPSykgewogCQljdXJfdHggPSAoY3VyX3R4ICsgMSkgJSBOVU1fVFhfREVTQzsKQEAgLTM4NiwxOSArNDIwLDIyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgcnRsX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmluZ19vZmZzOwogCXVuc2lnbmVkIGludCByeF9zaXplLCByeF9zdGF0dXM7CiAKLQlpZiAoaW5iKGlvYWRkciArIENoaXBDbWQpICYgUnhCdWZFbXB0eSkgeworCWlmIChpbmIobmljLT5pb2FkZHIgKyBDaGlwQ21kKSAmIFJ4QnVmRW1wdHkpIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3RhdHVzID0gaW53KGlvYWRkciArIEludHJTdGF0dXMpOworCS8qIFRoZXJlIGlzIGEgcGFja2V0IHJlYWR5ICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwlzdGF0dXMgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKIAkvKiBTZWUgYmVsb3cgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VzLiAgKi8KLQlvdXR3KHN0YXR1cyAmIH4oUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJb3V0dyhzdGF0dXMgJiB+KFJ4RklGT092ZXIgfCBSeE92ZXJmbG93IHwgUnhPSyksIG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CiAKICNpZmRlZglERUJVR19SWAogCXByaW50ZigicnRsX3BvbGw6IGludCAlaFggIiwgc3RhdHVzKTsKQEAgLTQzOCwyMSArNDc1LDc3IEBACiAJCW5pYy0+cGFja2V0WzEyXSwgbmljLT5wYWNrZXRbMTNdLCByeF9zdGF0dXMpOwogI2VuZGlmCiAJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKLQlvdXR3KGN1cl9yeCAtIDE2LCBpb2FkZHIgKyBSeEJ1ZlB0cik7CisJb3V0dyhjdXJfcnggLSAxNiwgbmljLT5pb2FkZHIgKyBSeEJ1ZlB0cik7CiAJLyogU2VlIFJUTDgxMzkgUHJvZ3JhbW1pbmcgR3VpZGUgVjAuMSBmb3IgdGhlIG9mZmljaWFsIGhhbmRsaW5nIG9mCiAJICogUnggb3ZlcmZsb3cgc2l0dWF0aW9ucy4gIFRoZSBkb2N1bWVudCBpdHNlbGYgY29udGFpbnMgYmFzaWNhbGx5IG5vCiAJICogdXNhYmxlIGluZm9ybWF0aW9uLCBleGNlcHQgZm9yIGEgZmV3IGV4Y2VwdGlvbiBoYW5kbGluZyBydWxlcy4gICovCi0Jb3V0dyhzdGF0dXMgJiAoUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJb3V0dyhzdGF0dXMgJiAoUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgcnRsX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgcnRsX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pCiB7CisJdW5zaWduZWQgaW50IG1hc2s7CisJLyogQml0IG9mIGEgZ3Vlc3MgYXMgdG8gd2hpY2ggaW50ZXJydXB0cyB3ZSBzaG91bGQgYWxsb3cgKi8KKwl1bnNpZ25lZCBpbnQgaW50ZXJlc3RlZCA9IFJPSyB8IFJFUiB8IFJYT1ZXIHwgRk9WVyB8IFNFUlI7CisKKwlzd2l0Y2ggKCBhY3Rpb24gKSB7CisJY2FzZSBESVNBQkxFIDoKKwljYXNlIEVOQUJMRSA6CisJCW1hc2sgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyTWFzayk7CisJCW1hc2sgPSBtYXNrICYgfmludGVyZXN0ZWQ7CisJCWlmICggYWN0aW9uID09IEVOQUJMRSApIG1hc2sgPSBtYXNrIHwgaW50ZXJlc3RlZDsKKwkJb3V0dyhtYXNrLCBuaWMtPmlvYWRkciArIEludHJNYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBGT1JDRSA6CisJCS8qIEFwcGFyZW50bHkgd3JpdGluZyBhIDEgdG8gdGhpcyByZWFkLW9ubHkgYml0IG9mIGEKKwkJICogcmVhZC1vbmx5IGFuZCBvdGhlcndpc2UgdW5yZWxhdGVkIHJlZ2lzdGVyIHdpbGwKKwkJICogZm9yY2UgYW4gaW50ZXJydXB0LiAgSWYgeW91IGV2ZXIgd2FudCB0byBzZWUgaG93CisJCSAqIG5vdCB0byB3cml0ZSBhIGRhdGFzaGVldCwgcmVhZCB0aGUgb25lIGZvciB0aGUKKwkJICogUlRMODEzOS4uLgorCQkgKi8KKwkJb3V0YihFUk9LLCBuaWMtPmlvYWRkciArIFJ4RWFybHlTdGF0dXMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwkvKiBtZXJnZSByZXNldCBhbmQgZGlzYWJsZSAqLworCXJ0bF9yZXNldChuaWMpOworCiAJLyogcmVzZXQgdGhlIGNoaXAgKi8KLQlvdXRiKENtZFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKKwlvdXRiKENtZFJlc2V0LCBuaWMtPmlvYWRkciArIENoaXBDbWQpOwogCiAJLyogMTAgbXMgdGltZW91dCAqLwogCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7Ci0Jd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCXdoaWxlICgoaW5iKG5pYy0+aW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQogCQkvKiB3YWl0ICovOwogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBydGw4MTM5X25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMGVjLCAweDgxMjksICJydGw4MTI5IiwgICAgICAgIlJlYWx0ZWsgODEyOSIpLAorUENJX1JPTSgweDEwZWMsIDB4ODEzOSwgInJ0bDgxMzkiLCAgICAgICAiUmVhbHRlayA4MTM5IiksCitQQ0lfUk9NKDB4MTBlYywgMHg4MTM4LCAicnRsODEzOWIiLCAgICAgICJSZWFsdGVrIDgxMzlCIiksCitQQ0lfUk9NKDB4MTE4NiwgMHgxMzAwLCAiZGZlNTM4IiwgICAgICAgICJERkU1MzBUWCsvREZFNTM4VFgiKSwKK1BDSV9ST00oMHgxMTEzLCAweDEyMTEsICJzbWMxMjExLTEiLCAgICAgIlNNQyBFWjEwLzEwMCIpLAorUENJX1JPTSgweDExMTIsIDB4MTIxMSwgInNtYzEyMTEiLCAgICAgICAiU01DIEVaMTAvMTAwIiksCitQQ0lfUk9NKDB4MTUwMCwgMHgxMzYwLCAiZGVsdGE4MTM5IiwgICAgICJEZWx0YSBFbGVjdHJvbmljcyA4MTM5IiksCitQQ0lfUk9NKDB4NDAzMywgMHgxMzYwLCAiYWRkdHJvbjgxMzkiLCAgICJBZGR0cm9uIFRlY2hub2xvZ3kgODEzOSIpLAorUENJX1JPTSgweDExODYsIDB4MTM0MCwgImRmZTY5MHR4ZCIsICAgICAiRC1MaW5rIERGRTY5MFRYRCIpLAorUENJX1JPTSgweDEzZDEsIDB4YWIwNiwgImZlMjAwMHZ4IiwgICAgICAiQWJvQ29tIEZFMjAwMFZYIiksCitQQ0lfUk9NKDB4MTI1OSwgMHhhMTE3LCAiYWxsaWVkODEzOSIsICAgICJBbGxpZWQgVGVsZXN5biA4MTM5IiksCitQQ0lfUk9NKDB4MTRlYSwgMHhhYjA2LCAiZm53MzYwM3R4IiwgICAgICJQbGFuZXggRk5XLTM2MDMtVFgiKSwKK1BDSV9ST00oMHgxNGVhLCAweGFiMDcsICJmbnczODAwdHgiLCAgICAgIlBsYW5leCBGTlctMzgwMC1UWCIpLAorUENJX1JPTSgweGZmZmYsIDB4ODEzOSwgImNsb25lLXJ0bDgxMzkiLCAiQ2xvbmVkIDgxMzkiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxMzlfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlJUTDgxMzkiLAorCS5wcm9iZSAgICA9IHJ0bDgxMzlfcHJvYmUsCisJLmlkcyAgICAgID0gcnRsODEzOV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihydGw4MTM5X25pY3MpL3NpemVvZihydGw4MTM5X25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpJbmRleDogYi9uZXRib290L3NlZ29mZi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3NlZ29mZi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBTZWdtZW50Om9mZnNldCB0eXBlcyBhbmQgbWFjcm9zCisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBCcm93biAobWNiMzApLgorICovCisKKyNpZm5kZWYgU0VHT0ZGX0gKKyNkZWZpbmUgU0VHT0ZGX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGlvLmg+CisKKy8qIFNlZ21lbnQ6b2Zmc2V0IHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB0aGUgb3JkZXIgd2l0aGluIHRoZSBzdHJ1Y3R1cmUKKyAqIGlzIG9mZnNldDpzZWdtZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgb2Zmc2V0OworCXVpbnQxNl90IHNlZ21lbnQ7Cit9IHNlZ29mZl90OworCisvKiBGb3IgUFhFIHN0dWZmICovCit0eXBlZGVmIHNlZ29mZl90IFNFR09GRjE2X3Q7CisKKy8qIE1hY3JvcyBmb3IgY29udmVydGluZyBmcm9tIHZpcnR1YWwgdG8gc2VnbWVudDpvZmZzZXQgYWRkcmVzc2VzLAorICogd2hlbiB3ZSBkb24ndCBhY3R1YWxseSBjYXJlIHdoaWNoIG9mIHRoZSBtYW55IGlzb21vcnBoaWMgcmVzdWx0cyB3ZQorICogZ2V0LgorICovCisjaWZkZWYgREVCVUdfU0VHTUVOVAordWludDE2X3QgU0VHTUVOVCAoIGNvbnN0IHZvaWQgKiBjb25zdCBwdHIgKSB7CisJdWludDMyX3QgcGh5cyA9IHZpcnRfdG9fcGh5cyAoIHB0ciApOworCWlmICggcGh5cyA+IDB4ZmZmZmYgKSB7CisJCXByaW50ZiAoICJGQVRBTCBFUlJPUjogc2VnbWVudCBhZGRyZXNzIG91dCBvZiByYW5nZVxuIiApOworCX0KKwlyZXR1cm4gcGh5cyA+PiA0OworfQorI2Vsc2UKKyNkZWZpbmUgU0VHTUVOVCh4KSAoIHZpcnRfdG9fcGh5cyAoIHggKSA+PiA0ICkKKyNlbmRpZgorI2RlZmluZSBPRkZTRVQoeCkgKCB2aXJ0X3RvX3BoeXMgKCB4ICkgJiAweGYgKQorI2RlZmluZSBTRUdPRkYoeCkgeyBPRkZTRVQoeCksIFNFR01FTlQoeCkgfQorI2RlZmluZSBWSVJUVUFMKHgseSkgKCBwaHlzX3RvX3ZpcnQgKCAoICggeCApIDw8IDQgKSArICggeSApICkgKQorCisjZW5kaWYgLyogU0VHT0ZGX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC9zaXM5MDAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3Qvc2lzOTAwLmMKKysrIGIvbmV0Ym9vdC9zaXM5MDAuYwpAQCAtMjcsNiArMjcsMTEgQEAKIC8qIFJldmlzaW9uIEhpc3RvcnkgKi8KIAogLyoKKyAgMDcgRGVjIDIwMDMgIHRpbWxlZ2dlIC0gRW5hYmxlZCBNdWx0aWNhc3QgU3VwcG9ydAorICAwNiBEZWMgMjAwMyAgdGltbGVnZ2UgLSBGaXhlZCByZWxvY2F0aW9uIGlzc3VlIGluIDUuMgorICAwNCBKYW4gMjAwMiAgQ2hpZW4tWXUgQ2hlbiwgRG91ZyBBbWJyaXNrbywgTWFydHkgQ29ubm9yICBQYXRjaCB0byBFdGhlcmJvb3QgNS4wLjUKKyAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFNpUyA2MzBFVCBwbHVzIHZhcmlvdXMgYnVnIGZpeGVzIGZyb20gbGludXgga2VybmVsCisgICAgIHNvdXJjZSAyLjQuMTcuCiAgIDAxIE1hcmNoIDIwMDEgIG1kYyAgICAgMS4wCiAgICAgIEluaXRpYWwgUmVsZWFzZS4gIFRlc3RlZCB3aXRoIFBDSSBiYXNlZCBzaXM5MDAgY2FyZCBhbmQgVGhpbmtOSUMKICAgICAgY29tcHV0ZXIuCkBAIC0zNSwxMyArNDAsMTIgQEAKICAgICAgVGVzdGV0IHdpdGggU0lTNzMwUyBjaGlwc2V0ICsgSUNTMTg5MwogKi8KIAotDAogLyogSW5jbHVkZXMgKi8KIAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogI2luY2x1ZGUgIm5pYy5oIgogI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKIAogI2luY2x1ZGUgInNpczkwMC5oIgogCkBAIC01MSw2ICs1NSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlvYWRkcjsKK3N0YXRpYyB1OCBwY2lfcmV2aXNpb247CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3VyX3BoeTsKIApAQCAtNTgsMTUgKzYzLDEwIEBACiAKIHN0YXRpYyBCdWZmZXJEZXNjIHR4ZDsKIHN0YXRpYyBCdWZmZXJEZXNjIHJ4ZFtOVU1fUlhfREVTQ107Ci0KLSNpZmRlZiBVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSB0eGIgKChjaGFyICopMHgxMDAwMCAtIFRYX0JVRl9TSVpFKQotI2RlZmluZSByeGIgKChjaGFyICopMHgxMDAwMCAtIE5VTV9SWF9ERVNDKlJYX0JVRl9TSVpFIC0gVFhfQlVGX1NJWkUpCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW1RYX0JVRl9TSVpFXTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOVU1fUlhfREVTQyAqIFJYX0JVRl9TSVpFXTsKLSNlbmRpZgogCisjaWYgMAogc3RhdGljIHN0cnVjdCBtYWNfY2hpcF9pbmZvIHsKICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIHUxNiB2ZW5kb3JfaWQsIGRldmljZV9pZCwgZmxhZ3M7CkBAIC03OCwxMSArNzgsMTMgQEAKICAgICAgIFBDSV9DT01NQU5EX0lPfFBDSV9DT01NQU5EX01BU1RFUiwgU0lTOTAwX1RPVEFMX1NJWkV9LAogICAgIHswLDAsMCwwLDB9IC8qIDAgdGVybWluYXRlZCBsaXN0LiAqLwogfTsKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CiBzdGF0aWMgdm9pZCBhbWQ3OWM5MDFfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CiBzdGF0aWMgdm9pZCBpY3MxODkzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOwogc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKK3N0YXRpYyB2b2lkIHZ0NjEwM19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKIAogc3RhdGljIHN0cnVjdCBtaWlfY2hpcF9pbmZvIHsKICAgICBjb25zdCBjaGFyICogbmFtZTsKQEAgLTk2LDYgKzk4LDcgQEAKICAgICB7IkFNRCA3OUM5MDEgSG9tZVBOQSBQSFkiLCAgIDB4MDAwMCwgMHgzNWM4LCBhbWQ3OWM5MDFfcmVhZF9tb2RlfSwKICAgICB7IklDUyAxODkzIEludGVncmF0ZWQgUEhZY2VpdmVyIiAgICwgMHgwMDE1LCAweGY0NDEsaWNzMTg5M19yZWFkX21vZGV9LAogICAgIHsiUlRMIDgyMDEgMTAvMTAwTWJwcyBQaHljZWl2ZXIiICAgLCAweDAwMDAsIDB4ODIwMSxydGw4MjAxX3JlYWRfbW9kZX0sCisgICAgeyJWSUEgNjEwMyAxMC8xMDBNYnBzIFBoeWNlaXZlciIsIDB4MDEwMSwgMHg4ZjIwLHZ0NjEwM19yZWFkX21vZGV9LAogICAgIHswLDAsMCwwfQogfTsKIApAQCAtMTA2LDI0ICsxMDksMzIgQEAKICAgICB1MTYgc3RhdHVzOwogfSBtaWk7CiAKLQwKIC8vIFBDSSB0byBJU0EgYnJpZGdlIGZvciBTSVM2NDBFIGFjY2Vzcwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlICAgcGNpX2lzYV9icmlkZ2VfbGlzdFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfaWQgICBwY2lfaXNhX2JyaWRnZV9saXN0W10gPSB7CiAJeyAweDEwMzksIDB4MDAwOCwKLQkJIlNJUyA4NUM1MDMvNTUxMyBQQ0kgdG8gSVNBIGJyaWRnZSIsIDAsIDAsIDAsIDB9LAotCXswLCAwLCBOVUxMLCAwLCAwLCAwLCAwfQorCQkiU0lTIDg1QzUwMy81NTEzIFBDSSB0byBJU0EgYnJpZGdlIn0sCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBzaXNfYnJpZGdlX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBCUklER0VfRFJJVkVSLAorCS5uYW1lICAgICA9ICIiLAorCS5wcm9iZSAgICA9IDAsCisJLmlkcyAgICAgID0gcGNpX2lzYV9icmlkZ2VfbGlzdCwKKwkuaWRfY291bnQgPSBzaXplb2YocGNpX2lzYV9icmlkZ2VfbGlzdCkvc2l6ZW9mKHBjaV9pc2FfYnJpZGdlX2xpc3RbMF0pLAorCS5jbGFzcyAgICA9IDAsCiB9OwogCiAvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCiAKLXN0cnVjdCBuaWMgKnNpczkwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IHNpczkwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOwogCiBzdGF0aWMgdTE2ICBzaXM5MDBfcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKTsKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3Jlc2V0KGxvbmcgbWRpb19hZGRyKTsKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpOwogc3RhdGljIHUxNiAgc2lzOTAwX21kaW9fcmVhZChpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworI2lmIDAKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3dyaXRlKGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbCk7Ci0KKyNlbmRpZgogc3RhdGljIHZvaWQgc2lzOTAwX2luaXQoc3RydWN0IG5pYyAqbmljKTsKIAogc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CkBAIC0xMzYsOSArMTQ3LDExIEBACiAKIHN0YXRpYyB2b2lkIHNpczkwMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7Ci1zdGF0aWMgaW50ICBzaXM5MDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCAgc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOwogCi1zdGF0aWMgdm9pZCBzaXM5MDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc2lzOTAwX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pOwogCiAvKioKICAqCXNpczkwMF9nZXRfbWFjX2FkZHI6IC0gR2V0IE1BQyBhZGRyZXNzIGZvciBzdGFuZCBhbG9uZSBTaVM5MDAgbW9kZWwKQEAgLTE0OSw3ICsxNjIsNyBAQAogICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIHJlYWRfZWVwcm9tKCkgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCiAgKi8KIAotc3RhdGljIGludCBzaXM5MDBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiAsIHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgc2lzOTAwX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYgX191bnVzZWQsIHN0cnVjdCBuaWMgKm5pYykKIHsKIAl1MTYgc2lnbmF0dXJlOwogCWludCBpOwpAQCAtMTY4LDYgKzE4MSw1MCBAQAogfQogCiAvKioKKyAqCXNpczk2eF9nZXRfbWFjX2FkZHI6IC0gR2V0IE1BQyBhZGRyZXNzIGZvciBTaVM5NjIgb3IgU2lTOTYzIG1vZGVsCisgKglAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yIAorICoKKyAqCVNpUzk2MiBvciBTaVM5NjMgbW9kZWwsIHVzZSBFRVBST00gdG8gc3RvcmUgTUFDIGFkZHJlc3MuIEFuZCBFRVBST00gCisgKglpcyBzaGFyZWQgYnkKKyAqCUxBTiBhbmQgMTM5NC4gV2hlbiBhY2Nlc3MgRUVQUk9NLCBzZW5kIEVFUkVRIHNpZ25hbCB0byBoYXJkd2FyZSBmaXJzdCAKKyAqCWFuZCB3YWl0IGZvciBFRUdOVC4gSWYgRUVHTlQgaXMgT04sIEVFUFJPTSBpcyBwZXJtaXR0ZWQgdG8gYmUgYWNjZXNzIAorICoJYnkgTEFOLCBvdGhlcndpc2UgaXMgbm90LiBBZnRlciBNQUMgYWRkcmVzcyBpcyByZWFkIGZyb20gRUVQUk9NLCBzZW5kCisgKglFRURPTkUgc2lnbmFsIHRvIHJlZnVzZSBFRVBST00gYWNjZXNzIGJ5IExBTi4gCisgKglUaGUgRUVQUk9NIG1hcCBvZiBTaVM5NjIgb3IgU2lTOTYzIGlzIGRpZmZlcmVudCB0byBTaVM5MDAuIAorICoJVGhlIHNpZ25hdHVyZSBmaWVsZCBpbiBTaVM5NjIgb3IgU2lTOTYzIHNwZWMgaXMgbWVhbmluZ2xlc3MuIAorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IHNpczk2eF9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXZpY2UgKiBwY2lfZGV2IF9fdW51c2VkLCBzdHJ1Y3QgbmljICpuaWMpCit7CisvKiAJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7ICovCisJbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgbWVhcjsKKwl1MzIgd2FpdHRpbWUgPSAwOworCWludCBpOworCQorCXByaW50ZigiQWx0ZXJuYXRlIGZ1bmN0aW9uXG4iKTsKKworCW91dGwoRUVSRVEsIGVlX2FkZHIpOworCXdoaWxlKHdhaXR0aW1lIDwgMjAwMCkgeworCQlpZihpbmwoZWVfYWRkcikgJiBFRUdOVCkgeworCisJCQkvKiBnZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkgICAgICAgICgodTE2ICopKG5pYy0+bm9kZV9hZGRyKSlbaV0gPSBzaXM5MDBfcmVhZF9lZXByb20oaStFRVBST01NQUNBZGRyKTsKKworCQkJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQl1ZGVsYXkoMSk7CQorCQkJd2FpdHRpbWUgKys7CisJCX0KKwl9CisJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCXJldHVybiAwOworfQorCisvKioKICAqCXNpczYzMGVfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTNjMwRSBtb2RlbAogICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQogICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvcgpAQCAtMTc3LDE3ICsyMzQsMjEgQEAKICAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCiAgKi8KIAotc3RhdGljIGludCBzaXM2MzBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYsIHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgc2lzNjMwZV9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXZpY2UgKiBwY2lfZGV2IF9fdW51c2VkLCBzdHJ1Y3QgbmljICpuaWMpCiB7CiAJdTggcmVnOwogCWludCBpOwotCXN0cnVjdCBwY2lfZGV2aWNlCSpwOwotCi0JLy8gZmluZCBQQ0kgdG8gSVNBIGJyaWRnZQotCWV0aF9wY2lfaW5pdChwY2lfaXNhX2JyaWRnZV9saXN0KTsKKwlzdHJ1Y3QgcGNpX2RldmljZQlwWzFdOwogCi0gICAgLyogdGhlIGZpcnRzIGVudHJ5IGluIHRoaXMgbGlzdCBzaG91bGQgY29udGFpbiBidXMvZGV2Zm4gKi8KLSAgICBwID0gcGNpX2lzYV9icmlkZ2VfbGlzdDsKKwkvKiBmaW5kIFBDSSB0byBJU0EgYnJpZGdlICovCisJbWVtc2V0KHAsIDAsIHNpemVvZihwKSk7CisJZG8geworCQlmaW5kX3BjaShCUklER0VfRFJJVkVSLCBwKTsKKwl9IHdoaWxlKHAtPmRyaXZlciAmJiBwLT5kcml2ZXIgIT0gJnNpc19icmlkZ2VfZHJpdmVyKTsKKworCS8qIGVycm9yIG9uIGZhaWx1cmUgKi8KKwlpZiAoIXAtPmRyaXZlcikKKwkgICAgcmV0dXJuIDA7CiAKIAlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUocC0+YnVzLHAtPmRldmZuLCAweDQ4LCAmcmVnKTsKIAlwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlKHAtPmJ1cyxwLT5kZXZmbiwgMHg0OCwgcmVnIHwgMHg0MCk7CkBAIC0yMDEsNyArMjYyLDQzIEBACiAKIAlyZXR1cm4gMTsKIH0KLQwKKworLyoqCisgKiAgICAgIHNpczYzMGVfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTNjMwRSBtb2RlbAorICogICAgICBAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKiAgICAgIEBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IKKyAqCisgKiAgICAgIFNpUzYzMEUgbW9kZWwsIHVzZSBBUEMgQ01PUyBSQU0gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKiAgICAgIEFQQyBDTU9TIFJBTSBpcyBhY2Nlc3NlZCB0aHJvdWdoIElTQSBicmlkZ2UuCisgKiAgICAgIE1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM2MzVfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiBfX3VudXNlZCwgc3RydWN0IG5pYyAqbmljKQoreworICAgICAgICB1MzIgcmZjclNhdmU7CisgICAgICAgIHUzMiBpOworCQorCQorICAgICAgICByZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworICAgICAgICBvdXRsKHJmY3JTYXZlIHwgUkVMT0FELCBpb2FkZHIgKyBjcik7CisgICAgICAgIG91dGwoMCwgaW9hZGRyICsgY3IpOworCisgICAgICAgIC8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKyAgICAgICAgb3V0bChyZmNyU2F2ZSAmIH5SRkVOLCByZmNyICsgaW9hZGRyKTsKKworICAgICAgICAvKiBsb2FkIE1BQyBhZGRyIHRvIGZpbHRlciBkYXRhIHJlZ2lzdGVyICovCisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICAgICAgICAgIG91dGwoKGkgPDwgUkZBRERSX3NoaWZ0KSwgaW9hZGRyICsgcmZjcik7CisgICAgICAgICAgICAgICAgKiggKCh1MTYgKiluaWMtPm5vZGVfYWRkcikgKyBpKSA9IGludyhpb2FkZHIgKyByZmRyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGVuYWJsZSBwYWNrZXQgZmlsaXRlcmluZyAqLworICAgICAgICBvdXRsKHJmY3JTYXZlIHwgUkZFTiwgcmZjciArIGlvYWRkcik7CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKIC8qIAogICogRnVuY3Rpb246IHNpczkwMF9wcm9iZQogICoKQEAgLTIxNiwxOSArMzEzLDIxIEBACiAgKiBSZXR1cm5zOiAgIHN0cnVjdCBuaWMgKjogICAgICAgICAgcG9pbnRlciB0byBOSUMgZGF0YSBzdHJ1Y3R1cmUKICAqLwogCi1zdHJ1Y3QgbmljICpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHNpczkwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCiB7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgICAgaW50IGk7CiAgICAgaW50IGZvdW5kPTA7CiAgICAgaW50IHBoeV9hZGRyOwotICAgIHUxNiBzaWduYXR1cmU7CiAgICAgdTggcmV2aXNpb247CiAgICAgaW50IHJldDsKIAotICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpb2FkZHIgID0gKmlvX2FkZHJzICYgfjM7CisgICAgbmljLT5pcnFubyAgPSAwOworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKyAgICBpb2FkZHIgID0gcGNpLT5pb2FkZHIgJiB+MzsKICAgICB2ZW5kb3IgID0gcGNpLT52ZW5kb3I7CiAgICAgZGV2X2lkICA9IHBjaS0+ZGV2X2lkOwogCkBAIC0yNDAsMTkgKzMzOSwyOSBAQAogICAgIC8qIGdldCBNQUMgYWRkcmVzcyAqLwogICAgIHJldCA9IDA7CiAgICAgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHBjaS0+YnVzLHBjaS0+ZGV2Zm4sIFBDSV9SRVZJU0lPTiwgJnJldmlzaW9uKTsKLSAgICBpZiAocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWKQotICAgICAgIHJldCA9IHNpczYzMGVfZ2V0X21hY19hZGRyKHBjaSwgbmljKTsKLSAgICBlbHNlIGlmIChyZXZpc2lvbiA9PSBTSVM2MzBTXzkwMF9SRVYpCisgICAgCisgICAgLyogc2F2ZSBmb3IgdXNlIGxhdGVyIGluIHNpczkwMF9yZXNldCgpICovCisgICAgcGNpX3JldmlzaW9uID0gcmV2aXNpb247IAorCisgICAgaWYgKHJldmlzaW9uID09IFNJUzYzMEVfOTAwX1JFVikKICAgICAgICAgcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpLCBuaWMpOworICAgIGVsc2UgaWYgKChyZXZpc2lvbiA+IDB4ODEpICYmIChyZXZpc2lvbiA8PSAweDkwKSkKKyAgICAgICAgcmV0ID0gc2lzNjM1X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CisgICAgZWxzZSBpZiAocmV2aXNpb24gPT0gU0lTOTZ4XzkwMF9SRVYpCisJcmV0ID0gc2lzOTZ4X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CiAgICAgZWxzZQogICAgICAgICByZXQgPSBzaXM5MDBfZ2V0X21hY19hZGRyKHBjaSwgbmljKTsKIAogICAgIGlmIChyZXQgPT0gMCkKICAgICB7CiAgICAgICAgIHByaW50ZiAoInNpczkwMF9wcm9iZTogRXJyb3IgTUFDIGFkZHJlc3Mgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8qIDYzMEVUIDogc2V0IHRoZSBtaWkgYWNjZXNzIG1vZGUgYXMgc29mdHdhcmUtbW9kZSAqLworICAgIGlmIChyZXZpc2lvbiA9PSBTSVM2MzBFVF85MDBfUkVWKQorCW91dGwoQUNDRVNTTU9ERSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKwogICAgIHByaW50ZigiXG5zaXM5MDBfcHJvYmU6IE1BQyBhZGRyICUhIGF0IGlvYWRkciAlI2hYXG4iLAogICAgICAgICAgICBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKICAgICBwcmludGYoInNpczkwMF9wcm9iZTogVmVuZG9yOiUjaFggRGV2aWNlOiUjaFhcbiIsIHZlbmRvciwgZGV2X2lkKTsKQEAgLTI2NCw3ICszNzMsNyBAQAogICAgIGZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IDMyOyBwaHlfYWRkcisrKSB7CiAgICAgICAgIHUxNiBtaWlfc3RhdHVzOwogICAgICAgICB1MTYgcGh5X2lkMCwgcGh5X2lkMTsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICBtaWlfc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVUyk7CiAgICAgICAgIGlmIChtaWlfc3RhdHVzID09IDB4ZmZmZiB8fCBtaWlfc3RhdHVzID09IDB4MDAwMCkKICAgICAgICAgICAgIC8qIHRoZSBtaWkgaXMgbm90IGFjY2Vzc2FibGUsIHRyeSBuZXh0IG9uZSAqLwpAQCAtMjcyLDcgKzM4MSw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgIHBoeV9pZDAgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMCk7CiAgICAgICAgIHBoeV9pZDEgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgLyogc2VhcmNoIG91ciBtaWkgdGFibGUgZm9yIHRoZSBjdXJyZW50IG1paSAqLyAKICAgICAgICAgZm9yIChpID0gMDsgbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMTsgaSsrKSB7CiAKQEAgLTI5NCw3ICs0MDMsNyBAQAogICAgICAgICAKICAgICBpZiAoZm91bmQgPT0gMCkgewogICAgICAgICBwcmludGYoInNpczkwMF9wcm9iZTogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgLyogQXJiaXRyYXJpbHkgc2VsZWN0IHRoZSBsYXN0IFBIWSBmb3VuZCBhcyBjdXJyZW50IFBIWSAqLwpAQCAtMzA0LDE1ICs0MTMsMTQgQEAKICAgICAvKiBpbml0aWFsaXplIGRldmljZSAqLwogICAgIHNpczkwMF9pbml0KG5pYyk7CiAKLSAgICBuaWMtPnJlc2V0ICAgID0gc2lzOTAwX2luaXQ7CisgICAgZGV2LT5kaXNhYmxlICA9IHNpczkwMF9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSBzaXM5MDBfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gc2lzOTAwX3RyYW5zbWl0OwotICAgIG5pYy0+ZGlzYWJsZSAgPSBzaXM5MDBfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gc2lzOTAwX2lycTsKIAotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuIDE7CiB9CiAKLQwKIC8qIAogICogRUVQUk9NIFJvdXRpbmVzOiAgVGhlc2UgZnVuY3Rpb25zIHJlYWQgYW5kIHdyaXRlIHRvIEVFUFJPTSBmb3IgCiAgKiAgICByZXRyaWV2aW5nIHRoZSBNQUMgYWRkcmVzcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCAKQEAgLTMyMiw3ICs0MzAsNiBAQAogLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCiAjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX2VlcHJvbQogICoKICAqIERlc2NyaXB0aW9uOiByZWFkcyBhbmQgcmV0dXJucyBhIGdpdmVuIGxvY2F0aW9uIGZyb20gRUVQUk9NCkBAIC0zNzgsNyArNDg1LDYgQEAKIAogI2RlZmluZSBzaXM5MDBfbWRpb19kZWxheSgpICAgIGlubChtZGlvX2FkZHIpCiAKLQwKIC8qIAogICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKICAgIHNlcmlhbCBNRElPIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIGNvbW1hbmQgYml0cyBhbmQgZGF0YSBiaXRzIGFyZQpAQCAtNDMyLDkgKzUzOCwxMSBAQAogICAgICAgICBvdXRsKE1EQywgbWRpb19hZGRyKTsKICAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKICAgICB9CisgICAgb3V0bCgweDAwLCBtZGlvX2FkZHIpOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKKyNpZiAwCiBzdGF0aWMgdm9pZCBzaXM5MDBfbWRpb193cml0ZShpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKICAgICBsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIG1lYXI7CkBAIC00NzEsMTAgKzU3OSwxMSBAQAogICAgICAgICBvdXRiKE1EQywgbWRpb19hZGRyKTsKICAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKICAgICB9CisgICAgb3V0bCgweDAwLCBtZGlvX2FkZHIpOwogICAgIHJldHVybjsKIH0KKyNlbmRpZgogCi0MCiAvKiBGdW5jdGlvbjogc2lzOTAwX2luaXQKICAqCiAgKiBEZXNjcmlwdGlvbjogcmVzZXRzIHRoZSBldGhlcm5ldCBjb250cm9sbGVyIGNoaXAgYW5kIHZhcmlvdXMKQEAgLTUwMCwxMCArNjA5LDkgQEAKIAogICAgIHNpczkwMF9jaGVja19tb2RlKG5pYyk7CiAKLSAgICBvdXRsKFJ4RU5BLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeEVOQXwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOwogfQogCi0MCiAvKiAKICAqIEZ1bmN0aW9uOiBzaXM5MDBfcmVzZXQKICAqCkBAIC01MTUsNyArNjIzLDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCAKLXNpczkwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCitzaXM5MDBfcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIGludCBpID0gMDsKICAgICB1MzIgc3RhdHVzID0gVHhSQ01QIHwgUnhSQ01QOwpAQCAtNTI0LDE2ICs2MzIsMTkgQEAKICAgICBvdXRsKDAsIGlvYWRkciArIGltcik7CiAgICAgb3V0bCgwLCBpb2FkZHIgKyByZmNyKTsKIAotICAgIG91dGwoUnhSRVNFVCB8IFR4UkVTRVQgfCBSRVNFVCwgaW9hZGRyICsgY3IpOwotICAgICAgICAKKyAgICBvdXRsKFJ4UkVTRVQgfCBUeFJFU0VUIHwgUkVTRVQgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKICAgICAvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCiAgICAgd2hpbGUgKHN0YXR1cyAmJiAoaSsrIDwgMTAwMCkpIHsKICAgICAgICAgc3RhdHVzIF49IChpbmwoaXNyICsgaW9hZGRyKSAmIHN0YXR1cyk7CiAgICAgfQotICAgIG91dGwoUEVTRUwsIGlvYWRkciArIGNmZyk7CisKKyAgICBpZiggKHBjaV9yZXZpc2lvbiA9PSBTSVM2MzVBXzkwMF9SRVYpIHx8IChwY2lfcmV2aXNpb24gPT0gU0lTOTAwQl85MDBfUkVWKSApCisgICAgICAgICAgICBvdXRsKFBFU0VMIHwgUk5EX0NOVCwgaW9hZGRyICsgY2ZnKTsKKyAgICBlbHNlCisgICAgICAgICAgICBvdXRsKFBFU0VMLCBpb2FkZHIgKyBjZmcpOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzX2luaXRfcnhmaWx0ZXIKICAqCiAgKiBEZXNjcmlwdGlvbjogc2V0cyByZWNlaXZlIGZpbHRlciBhZGRyZXNzIHRvIG91ciBNQUMgYWRkcmVzcwpAQCAtNTUyLDcgKzY2Myw3IEBACiAgICAgcmZjclNhdmUgPSBpbmwocmZjciArIGlvYWRkcik7CiAKICAgICAvKiBkaXNhYmxlIHBhY2tldCBmaWx0ZXJpbmcgYmVmb3JlIHNldHRpbmcgZmlsdGVyICovCi0gICAgb3V0bChyZmNyU2F2ZSAmIH5SRkVOLCByZmNyKTsKKyAgICBvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOwogCiAgICAgLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLwogICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgewpAQCAtNTcxLDcgKzY4Miw2IEBACiAgICAgb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOwogfQogCi0MCiAvKiAKICAqIEZ1bmN0aW9uOiBzaXNfaW5pdF90eGQKICAqCkBAIC01ODMsMjAgKzY5MywxOSBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1zaXM5MDBfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX2luaXRfdHhkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICB0eGQubGluayAgID0gKHUzMikgMDsKICAgICB0eGQuY21kc3RzID0gKHUzMikgMDsKLSAgICB0eGQuYnVmcHRyID0gKHUzMikgJnR4YlswXTsKKyAgICB0eGQuYnVmcHRyID0gdmlydF90b19idXMoJnR4YlswXSk7CiAKICAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KLSAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIHR4ZHApOyAKKyAgICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGQpLCBpb2FkZHIgKyB0eGRwKTsgCiAgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDApCiAgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfdHhkOiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCiAgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgdHhkcCkpOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzX2luaXRfcnhkCiAgKgogICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmcKQEAgLTYwNyw3ICs3MTYsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIAotc2lzOTAwX2luaXRfcnhkKHN0cnVjdCBuaWMgKm5pYykgCitzaXM5MDBfaW5pdF9yeGQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSAKIHsgCiAgICAgaW50IGk7CiAKQEAgLTYxNSwxNiArNzI0LDE2IEBACiAKICAgICAvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgewotICAgICAgICByeGRbaV0ubGluayAgID0gKGkrMSA8IE5VTV9SWF9ERVNDKSA/ICh1MzIpICZyeGRbaSsxXSA6ICh1MzIpICZyeGRbMF07CisgICAgICAgIHJ4ZFtpXS5saW5rICAgPSB2aXJ0X3RvX2J1cygoaSsxIDwgTlVNX1JYX0RFU0MpID8gJnJ4ZFtpKzFdIDogJnJ4ZFswXSk7CiAgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKLSAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9ICh1MzIpICZyeGJbaSpSWF9CVUZfU0laRV07CisgICAgICAgIHJ4ZFtpXS5idWZwdHIgPSB2aXJ0X3RvX2J1cygmcnhiW2kqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDApCiAgICAgICAgICAgICBwcmludGYoInNpczkwMF9pbml0X3J4ZDogcnhkWyVkXT0lWCBsaW5rPSVYIGNtZHN0cz0lWCBidWZwdHI9JVhcbiIsIAogICAgICAgICAgICAgICAgICAgIGksICZyeGRbaV0sIHJ4ZFtpXS5saW5rLCByeGRbaV0uY21kc3RzLCByeGRbaV0uYnVmcHRyKTsKICAgICB9CiAKICAgICAvKiBsb2FkIFJlY2VpdmUgRGVzY3JpcHRvciBSZWdpc3RlciAqLwotICAgIG91dGwoKHUzMikgJnJ4ZFswXSwgaW9hZGRyICsgcnhkcCk7CisgICAgb3V0bCh2aXJ0X3RvX2J1cygmcnhkWzBdKSwgaW9hZGRyICsgcnhkcCk7CiAKICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfaW5pdF9yeGQ6IFJYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKQEAgLTYzMiw3ICs3NDEsNiBAQAogCiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBzaXNfaW5pdF9yeGQKICAqCiAgKiBEZXNjcmlwdGlvbjogCkBAIC02NDQsMjUgKzc1MiwzNiBAQAogICogUmV0dXJuczogICB2b2lkLgogICovCiAKLXN0YXRpYyB2b2lkIHNpczkwMF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBzaXM5MDBfc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotICAgIGludCBpOworICAgIGludCBpLCB0YWJsZV9lbnRyaWVzOworICAgIHUzMiByeF9tb2RlOyAKKyAgICB1MTYgbWNfZmlsdGVyWzE2XSA9IHswfTsJLyogMjU2LzEyOCBiaXRzIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisgICAgCQorICAgIGlmKChwY2lfcmV2aXNpb24gPT0gU0lTNjM1QV85MDBfUkVWKSB8fCAocGNpX3JldmlzaW9uID09IFNJUzkwMEJfOTAwX1JFVikpCisJdGFibGVfZW50cmllcyA9IDE2OworICAgIGVsc2UKKwl0YWJsZV9lbnRyaWVzID0gODsKIAotICAgIC8qIENvbmZpZ3VyZSBNdWx0aWNhc3QgSGFzaCBUYWJsZSBpbiBSZWNlaXZlIEZpbHRlciAKLSAgICAgICB0byByZWplY3QgYWxsIE1DQVNUIHBhY2tldHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgLyogYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0ICovCisgICAgcnhfbW9kZSA9IFJGQUFCIHwgUkZBQU07CisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2VudHJpZXM7IGkrKykKKwkJbWNfZmlsdGVyW2ldID0gMHhmZmZmOworCQkJCQkKKyAgICAvKiB1cGRhdGUgTXVsdGljYXN0IEhhc2ggVGFibGUgaW4gUmVjZWl2ZSBGaWx0ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKSB7CiAgICAgICAgIC8qIHdoeSBwbHVzIDB4MDQ/IFRoYXQgbWFrZXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGhhc2ggdGFibGUuICovCiAgICAgICAgIG91dGwoKHUzMikoMHgwMDAwMDAwNCtpKSA8PCBSRkFERFJfc2hpZnQsIGlvYWRkciArIHJmY3IpOwotICAgICAgICBvdXRsKCh1MzIpKDB4MCksIGlvYWRkciArIHJmZHIpOworICAgICAgICBvdXRsKG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgcmZkcik7CiAgICAgfQotICAgIC8qIEFjY2VwdCBCcm9hZGNhc3QgcGFja2V0cywgZGVzdGluYXRpb24gYWRkcmVzc2VzIHRoYXQgbWF0Y2ggCisKKyAgICAvKiBBY2NlcHQgQnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgcGFja2V0cywgZGVzdGluYXRpb24gYWRkcmVzc2VzIHRoYXQgbWF0Y2ggCiAgICAgICAgb3VyIE1BQyBhZGRyZXNzICovCi0gICAgb3V0bChSRkVOIHwgUkZBQUIsIGlvYWRkciArIHJmY3IpOworICAgIG91dGwoUkZFTiB8IHJ4X21vZGUsIGlvYWRkciArIHJmY3IpOwogCiAgICAgcmV0dXJuOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzOTAwX2NoZWNrX21vZGUKICAqCiAgKiBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBzdGF0ZSBvZiB0cmFuc21pdCBhbmQgcmVjZWl2ZQpAQCAtNjc0LDE1ICs3OTMsMjEgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotc2lzOTAwX2NoZWNrX21vZGUgKHN0cnVjdCBuaWMgKm5pYykKK3NpczkwMF9jaGVja19tb2RlKHN0cnVjdCBuaWMgKm5pYykKIHsKICAgICBpbnQgc3BlZWQsIGR1cGxleDsKICAgICB1MzIgdHhfZmxhZ3MgPSAwLCByeF9mbGFncyA9IDA7CiAKICAgICBtaWkuY2hpcF9pbmZvLT5yZWFkX21vZGUobmljLCBjdXJfcGh5LCAmc3BlZWQsICZkdXBsZXgpOwogCi0gICAgdHhfZmxhZ3MgPSBUeEFUUCB8IChUWF9ETUFfQlVSU1QgPDwgVHhNWERNQV9zaGlmdCkgfCAoVFhfRklMTF9USFJFU0ggPDwgVHhGSUxMVF9zaGlmdCk7Ci0gICAgcnhfZmxhZ3MgPSBSWF9ETUFfQlVSU1QgPDwgUnhNWERNQV9zaGlmdDsKKyAgICBpZiggaW5sKGlvYWRkciArIGNmZykgJiBFREJfTUFTVEVSX0VOICkgeworICAgICAgICB0eF9mbGFncyA9IFR4QVRQIHwgKERNQV9CVVJTVF82NCA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKwlyeF9mbGFncyA9IERNQV9CVVJTVF82NCA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgICAgIHR4X2ZsYWdzID0gVHhBVFAgfCAoRE1BX0JVUlNUXzUxMiA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKyAgICAgICAgICAgIHJ4X2ZsYWdzID0gRE1BX0JVUlNUXzUxMiA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KIAogICAgIGlmIChzcGVlZCA9PSBIV19TUEVFRF9IT01FIHx8IHNwZWVkID09IEhXX1NQRUVEXzEwX01CUFMpIHsKICAgICAgICAgcnhfZmxhZ3MgfD0gKFJ4RFJOVF8xMCA8PCBSeERSTlRfc2hpZnQpOwpAQCAtNzAyLDcgKzgyNyw2IEBACiAgICAgb3V0bCAocnhfZmxhZ3MsIGlvYWRkciArIHJ4Y2ZnKTsKIH0KIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX21vZGUKICAqCiAgKiBEZXNjcmlwdGlvbjogcmV0cmlldmVzIGFuZCBkaXNwbGF5cyBzcGVlZCBhbmQgZHVwbGV4CkBAIC03MTQsMjQgKzgzOCwzMyBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1zaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3NpczkwMF9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogICAgIGludCBpID0gMDsKICAgICB1MzIgc3RhdHVzOworICAgIHUxNiBwaHlfaWQwLCBwaHlfaWQxOwogICAgICAgICAKICAgICAvKiBTVFNPVVQgcmVnaXN0ZXIgaXMgTGF0Y2hlZCBvbiBUcmFuc2l0aW9uLCByZWFkIG9wZXJhdGlvbiB1cGRhdGVzIGl0ICovCiAgICAgd2hpbGUgKGkrKyA8IDIpCiAgICAgICAgIHN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVFNPVVQpOwogCi0gICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNPVVRfU1BEKQotICAgICAgICAqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKLSAgICBlbHNlCi0gICAgICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7Ci0KLSAgICBpZiAoc3RhdHVzICYgTUlJX1NUU09VVF9EUExYKQotICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKLSAgICBlbHNlCi0gICAgICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisgICAgCisgICAgaWYgKHN0YXR1cyAmIChNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCkpCisJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisgICAgaWYgKHN0YXR1cyAmICggTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFgpKQorCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCQorICAgIC8qIFdvcmthcm91bmQgZm9yIFJlYWx0ZWsgUlRMODIwMSBQSFkgaXNzdWUgKi8KKyAgICBwaHlfaWQwID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1BIWV9JRDApOworICAgIHBoeV9pZDEgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CisgICAgaWYoKHBoeV9pZDAgPT0gMHgwMDAwKSAmJiAoKHBoeV9pZDEgJiAweEZGRjApID09IDB4ODIwMCkpeworCWlmKHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9DT05UUk9MKSAmIE1JSV9DTlRMX0ZEWCkKKwkgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJaWYoc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgMHgwMDE5KSAmIDB4MDEpCisJICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworICAgIH0KIAogICAgIGlmIChzdGF0dXMgJiBNSUlfU1RTT1VUX0xJTktfRkFJTCkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CkBAIC03NDMsNyArODc2LDYgQEAKICAgICAgICAgICAgICAgICJmdWxsIiA6ICJoYWxmIik7CiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBhbWQ3OWM5MDFfcmVhZF9tb2RlCiAgKgogICogRGVzY3JpcHRpb246IHJldHJpZXZlcyBhbmQgZGlzcGxheXMgc3BlZWQgYW5kIGR1cGxleApAQCAtNzU1LDcgKzg4Nyw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQKLWFtZDc5YzkwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorYW1kNzljOTAxX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCiB7CiAgICAgaW50IGk7CiAgICAgdTE2IHN0YXR1czsKQEAgLTc5Niw3ICs5MjgsNiBAQAogICAgIH0KIH0KIAotDAogLyoqCiAgKglpY3MxODkzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIElDUzE4OTMgUEhZCiAgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZCBtb2RlIGZvcgpAQCAtODA4LDcgKzkzOSw3IEBACiAgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCiAgKi8KIAotc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogCWludCBpID0gMDsKIAl1MzIgc3RhdHVzOwpAQCAtODQ4LDcgKzk3OSw3IEBACiAgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCiAgKi8KIAotc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogCXUzMiBzdGF0dXM7CiAKQEAgLTg3OCw3ICsxMDA5LDUxIEBACiAJCSAgICAgICAqZHVwbGV4ID09IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgPwogCQkgICAgICAgImZ1bGwiIDogImhhbGYiKTsKIAllbHNlCi0JCXByaW50ZigicnRsOTIwMV9yZWFkX2NvbmZpZ19tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CisJCXByaW50ZigicnRsODIwMV9yZWFkX2NvbmZpZ19tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7Cit9CisKKy8qKgorICoJdnQ2MTAzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIHZ0NjEwMyBwaHkKKyAqCUBuaWM6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKglAc3BlZWQ6IHRoZSB0cmFuc21pdCBzcGVlZCB0byBiZSBkZXRlcm1pbmVkCisgKglAZHVwbGV4OiB0aGUgZHVwbGV4IG1vZGUgdG8gYmUgZGV0ZXJtaW5lZAorICoKKyAqCXJlYWQgTUlJX1NUQVRVUyByZWdpc3RlciBmcm9tIHJ0bDgyMDEgcGh5CisgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCisgKi8KKworc3RhdGljIHZvaWQgdnQ2MTAzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSB7CisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKworCWlmIChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKQorCQlwcmludGYoInZ0NjEwM19yZWFkX21vZGU6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkJICAgICAgICpzcGVlZCA9PSBIV19TUEVFRF8xMDBfTUJQUyA/CisJCSAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKwkJICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisJCSAgICAgICAiZnVsbCIgOiAiaGFsZiIpOworCWVsc2UKKwkJcHJpbnRmKCJ2dDYxMDNfcmVhZF9jb25maWdfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOwogfQogCiAvKiBGdW5jdGlvbjogc2lzOTAwX3RyYW5zbWl0CkBAIC05MDAsMTQgKzEwNzUsMTQgQEAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcywgICAgIC8qIHNpemUgKi8KICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcCkgICAgIC8qIFBhY2tldCAqLwogewotICAgIHUzMiBzdGF0dXMsIHRvLCBuc3R5cGU7CisgICAgdTMyIHRvLCBuc3R5cGU7CiAgICAgdm9sYXRpbGUgdTMyIHR4X3N0YXR1czsKICAgICAKICAgICAvKiBTdG9wIHRoZSB0cmFuc21pdHRlciAqLwotICAgIG91dGwoVHhESVMsIGlvYWRkciArIGNyKTsKKyAgICBvdXRsKFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOwogCiAgICAgLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCi0gICAgb3V0bCgodTMyKSAmdHhkLCBpb2FkZHIgKyB0eGRwKTsgCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgdHhkcCk7IAogICAgIGlmIChzaXM5MDBfZGVidWcgPiAxKQogICAgICAgICBwcmludGYoInNpczkwMF90cmFuc21pdDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAogICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIHR4ZHApKTsKQEAgLTkyOSwxOCArMTEwNCwxOCBAQAogICAgICAgICB0eGJbcysrXSA9ICdcMCc7CiAKICAgICAvKiBzZXQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBlbmFibGUgVHJhbnNtaXQgU3RhdGUgTWFjaGluZSAqLwotICAgIHR4ZC5idWZwdHIgPSAodTMyKSAmdHhiWzBdOworICAgIHR4ZC5idWZwdHIgPSB2aXJ0X3RvX2J1cygmdHhiWzBdKTsKICAgICB0eGQuY21kc3RzID0gKHUzMikgT1dOIHwgczsKIAogICAgIC8qIHJlc3RhcnQgdGhlIHRyYW5zbWl0dGVyICovCi0gICAgb3V0bChUeEVOQSwgaW9hZGRyICsgY3IpOworICAgIG91dGwoVHhFTkEgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CiAKICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMSkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFF1ZXVlZCBUeCBwYWNrZXQgc2l6ZSAlZC5cbiIsIChpbnQpIHMpOwogCiAgICAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVPVVQ7CiAKLSAgICB3aGlsZSAoKCh0eF9zdGF0dXM9dHhkLmNtZHN0cykgJiBPV04pICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICB3aGlsZSAoKCh0eF9zdGF0dXM9dHhkLmNtZHN0cyAmIE9XTikgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQogICAgICAgICAvKiB3YWl0ICovIDsKIAogICAgIGlmIChjdXJydGlja3MoKSA+PSB0bykgewpAQCAtOTU1LDcgKzExMzAsNiBAQAogICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKIH0KIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9wb2xsCiAgKgogICogRGVzY3JpcHRpb246IGNoZWNrcyBmb3IgYSByZWNlaXZlZCBwYWNrZXQgYW5kIHJldHVybnMgaXQgaWYgZm91bmQuCkBAIC05NzEsNyArMTE0NSw3IEBACiAgKi8KIAogc3RhdGljIGludAotc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAgICAgdTMyIHJ4X3N0YXR1cyA9IHJ4ZFtjdXJfcnhdLmNtZHN0czsKICAgICBpbnQgcmV0c3RhdCA9IDA7CkBAIC05ODYsNiArMTE2MCw4IEBACiAgICAgICAgIHByaW50Zigic2lzOTAwX3BvbGw6IGdvdCBhIHBhY2tldDogY3VyX3J4OiVkLCBzdGF0dXM6JVhcbiIsCiAgICAgICAgICAgICAgICBjdXJfcngsIHJ4X3N0YXR1cyk7CiAKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKyAgICAKICAgICBuaWMtPnBhY2tldGxlbiA9IChyeF9zdGF0dXMgJiBEU0laRSkgLSBDUkNfU0laRTsKIAogICAgIGlmIChyeF9zdGF0dXMgJiAoQUJPUlR8T1ZFUlJVTnxUT09MT05HfFJVTlR8UlhJU0VSUnxDUkNFUlJ8RkFFUlIpKSB7CkBAIC0xMDAxLDE4ICsxMTc3LDE4IEBACiAKICAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KICAgICByeGRbY3VyX3J4XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKLSAgICByeGRbY3VyX3J4XS5idWZwdHIgPSAodTMyKSAmcnhiW2N1cl9yeCpSWF9CVUZfU0laRV07CisgICAgcnhkW2N1cl9yeF0uYnVmcHRyID0gdmlydF90b19idXMoJnJ4YltjdXJfcngqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgCiAgICAgaWYgKCsrY3VyX3J4ID09IE5VTV9SWF9ERVNDKQogICAgICAgICBjdXJfcnggPSAwOwogCiAgICAgLyogcmUtZW5hYmxlIHRoZSBwb3RlbnRpYWxseSBpZGxlIHJlY2VpdmUgc3RhdGUgbWFjaGluZSAqLwotICAgIG91dGwoUnhFTkEgLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKIAogICAgIHJldHVybiByZXRzdGF0OworCiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBzaXM5MDBfZGlzYWJsZQogICoKICAqIERlc2NyaXB0aW9uOiBUdXJucyBvZmYgaW50ZXJydXB0cyBhbmQgc3RvcHMgVHggYW5kIFJ4IGVuZ2luZXMKQEAgLTEwMjMsMTIgKzExOTksNTMgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotc2lzOTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgc2lzOTAwX2luaXQobmljKTsKKwogICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCiAgICAgb3V0bCgwLCBpb2FkZHIgKyBpbXIpOwogICAgIG91dGwoMCwgaW9hZGRyICsgaWVyKTsKICAgICAKICAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IFN0YXR1cyBNYWNoaW5lICovCi0gICAgb3V0bChSeERJUyB8IFR4RElTLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeERJUyB8IFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworfQorCisvKiBGdW5jdGlvbjogc2lzOTAwX2lycQorICoKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlLCBpbnRlcnJ1cHRzCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgaXJxX2FjdGlvbl90IGFjdGlvbjogICAgICBSZXF1ZXN0ZWQgYWN0aW9uICAgICAgIAorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBzaXM5MDBfbmljc1tdID0geworUENJX1JPTSgweDEwMzksIDB4MDkwMCwgInNpczkwMCIsICAiU0lTOTAwIiksCitQQ0lfUk9NKDB4MTAzOSwgMHg3MDE2LCAic2lzNzAxNiIsICJTSVM3MDE2IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBzaXM5MDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlNJUzkwMCIsCisJLnByb2JlICAgID0gc2lzOTAwX3Byb2JlLAorCS5pZHMgICAgICA9IHNpczkwMF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihzaXM5MDBfbmljcykvc2l6ZW9mKHNpczkwMF9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKSW5kZXg6IGIvbmV0Ym9vdC9zaXM5MDAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3Qvc2lzOTAwLmgKKysrIGIvbmV0Ym9vdC9zaXM5MDAuaApAQCAtMzksMTQgKzM5LDE2IEBACiAKIC8qIFN5bWJvbGljIG5hbWVzIGZvciBiaXRzIGluIHZhcmlvdXMgcmVnaXN0ZXJzICovCiBlbnVtIHNpczkwMF9jb21tYW5kX3JlZ2lzdGVyX2JpdHMgewotICAgIFJFU0VUICAgPSAweDAwMDAwMTAwLCAKLSAgICBTV0kgICAgID0gMHgwMDAwMDA4MCwgCi0gICAgUnhSRVNFVCA9IDB4MDAwMDAwMjAsCi0gICAgVHhSRVNFVCA9IDB4MDAwMDAwMTAsIAotICAgIFJ4RElTICAgPSAweDAwMDAwMDA4LCAKLSAgICBSeEVOQSAgID0gMHgwMDAwMDAwNCwKLSAgICBUeERJUyAgID0gMHgwMDAwMDAwMiwgCi0gICAgVHhFTkEgICA9IDB4MDAwMDAwMDEKKyAgICBSRUxPQUQgICAgID0gMHgwMDAwMDQwMCwKKyAgICBBQ0NFU1NNT0RFID0gMHgwMDAwMDIwMCwKKyAgICBSRVNFVCAgICAgID0gMHgwMDAwMDEwMCwgCisgICAgU1dJICAgICAgICA9IDB4MDAwMDAwODAsIAorICAgIFJ4UkVTRVQgICAgPSAweDAwMDAwMDIwLAorICAgIFR4UkVTRVQgICAgPSAweDAwMDAwMDEwLCAKKyAgICBSeERJUyAgICAgID0gMHgwMDAwMDAwOCwgCisgICAgUnhFTkEgICAgICA9IDB4MDAwMDAwMDQsCisgICAgVHhESVMgICAgICA9IDB4MDAwMDAwMDIsIAorICAgIFR4RU5BICAgICAgPSAweDAwMDAwMDAxCiB9OwogCiBlbnVtIHNpczkwMF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX2JpdHMgewpAQCAtNTcsNyArNTksMTAgQEAKICAgICBFWEQgICAgICA9IDB4MDAwMDAwMTAsIAogICAgIFBFU0VMICAgID0gMHgwMDAwMDAwOCwgCiAgICAgTFBNICAgICAgPSAweDAwMDAwMDA0LCAKLSAgICBCRU0gICAgICA9IDB4MDAwMDAwMDEKKyAgICBCRU0gICAgICA9IDB4MDAwMDAwMDEsCisgICAgUk5EX0NOVCAgPSAweDAwMDAwNDAwLAorICAgIEZBSVJfQkFDS09GRiA9IDB4MDAwMDAyMDAsCisgICAgRURCX01BU1RFUl9FTiA9IDB4MDAwMDIwMDAKIH07CiAKIGVudW0gc2lzOTAwX2VlcHJvbV9hY2Nlc3NfcmVpZ3N0ZXJfYml0cyB7CkBAIC0xMDgsNiArMTEzLDEwIEBACiAjZGVmaW5lIFRYX0RNQV9CVVJTVCAgICAwCiAjZGVmaW5lIFJYX0RNQV9CVVJTVCAgICAwCiAKK2VudW0gc2lzOTAwX3R4X3J4X2RtYXsKKwkgICAgICAgIERNQV9CVVJTVF81MTIgPSAwLCAgICAgIERNQV9CVVJTVF82NCA9IDUKK307CisKIC8qIHRyYW5zbWl0IEZJRk8gdGhyZXNoaG9sZHMgKi8KICNkZWZpbmUgVFhfRklMTF9USFJFU0ggIDE2ICAgICAgLyogMS80IEZJRk8gc2l6ZSAqLwogI2RlZmluZSBUeEZJTExUX3NoaWZ0ICAgOApAQCAtMTcyLDYgKzE4MSwxMSBAQAogICAgIEVFZXJhc2VBbGwgICAgICA9IDB4MDEyMCwKICAgICBFRXdyaXRlQWxsICAgICAgPSAweDAxMTAsIAogICAgIEVFYWRkck1hc2sgICAgICA9IDB4MDEzRiwgCisgICAgRUVjbWRTaGlmdCAJICAgID0gMTYKK307CisvKiBGb3IgU2lTOTYyIG9yIFNpUzk2MywgcmVxdWVzdCB0aGUgZWVwcm9tIHNvZnR3YXJlIGFjY2VzcyAqLworZW51bSBzaXM5NnhfZWVwcm9tX2NvbW1hbmQgeworCUVFUkVRID0gMHgwMDAwMDQwMCwgRUVET05FID0gMHgwMDAwMDIwMCwgRUVHTlQgPSAweDAwMDAwMTAwCiB9OwogCiAvKiBNYW5hbWdlbWVudCBEYXRhIEkvTyAobWRpbykgZnJhbWUgKi8KQEAgLTIzNiw3ICsyNTAsOCBAQAogICAgIE1JSV9DT05GSUcxID0gMHgwMDEwLAogICAgIE1JSV9DT05GSUcyID0gMHgwMDExLAogICAgIE1JSV9TVFNPVVQgID0gMHgwMDEyLAotICAgIE1JSV9NQVNLICAgID0gMHgwMDEzCisgICAgTUlJX01BU0sgICAgPSAweDAwMTMsCisgICAgTUlJX1JFU1YgICAgPSAweDAwMTQKIH07CiAKIC8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gQU1EIDc5QzkwMSAqLwpAQCAtMzIwLDcgKzMzNSw5IEBACiAKIGVudW0gc2lzOTAwX3JldmlzaW9uX2lkIHsKIAlTSVM2MzBBXzkwMF9SRVYgPSAweDgwLAkJU0lTNjMwRV85MDBfUkVWID0gMHg4MSwKLQlTSVM2MzBTXzkwMF9SRVYgPSAweDgyLAkJU0lTNjMwRUExXzkwMF9SRVYgPSAweDgzCisJU0lTNjMwU185MDBfUkVWID0gMHg4MiwJCVNJUzYzMEVBMV85MDBfUkVWID0gMHg4MywKKwlTSVM2MzBFVF85MDBfUkVWID0gMHg4NCwgICAgICAgIFNJUzYzNUFfOTAwX1JFViA9IDB4OTAsCisJU0lTOTZ4XzkwMF9SRVYgPSAwWDkxLAkJU0lTOTAwQl85MDBfUkVWID0gMHgwMwogfTsKIAogZW51bSBzaXM2MzBfcmV2aXNpb25faWQgewpJbmRleDogYi9uZXRib290L3NpczkwMC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L3NpczkwMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1Ib3cgSSBhZGRlZCB0aGUgU0lTOTAwIGNhcmQgdG8gRXRoZXJib290Ci0KLUF1dGhvcjogTWFydHkgQ29ubm9yIChtZGNAdGhpbmd1aW4ub3JnKQotCi1EYXRlOiAgIDI1IEZlYnJhcnkgMjAwMQotCi1EZXNjcmlwdGlvbjoKLQotVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGhlbHAgcGVvcGxlIHdobyB3YW50IHRvIHdyaXRlIGFuIEV0aGVyYm9vdAotZHJpdmVyIG9yIHBvcnQgYW5vdGhlciBkcml2ZXIgdG8gRXRoZXJib290LiAgSXQgaXMgYSBzdGFydGluZyBwb2ludC4KLVBlcmhhcHMgc29tZWRheSBJIG1heSB3cml0ZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2Ygd3JpdGluZyBhbgotRXRoZXJib290IGRyaXZlci4gVGhpcyB0ZXh0IHNob3VsZCBoZWxwIGdldCBwZW9wbGUgc3RhcnRlZCwgYW5kCi1zdHVkeWluZyBzaXM5MDAuW2NoXSBzaG91bGQgaGVscCBzaG93IHRoZSBiYXNpYyBzdHJ1Y3R1cmUgYW5kCi10ZWNobmlxdWVzIGludm9sdmVkIGluIHdyaXRpbmcgYW5kIEV0aGVyYm9vdCBkcml2ZXIuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTAuIEJhY2sgdXAgYWxsIHRoZSBmaWxlcyBJIG5lZWQgdG8gbW9kaWZ5OgotCi1jZCBldGhlcmJvb3QtNC43LjIwL3NyYwotY3AgTWFrZWZpbGUgTWFrZWZpbGUub3JpZwotY3AgY29uZmlnLmMgY29uZmlnLmMub3JpZwotY3AgcGNpLmggcGNpLmgub3JpZwotY3AgTklDIE5JQy5vcmlnCi1jcCBjYXJkcy5oIGNhcmRzLmgub3JpZwotCi0xLiBFZGl0IHNyYy9NYWtlZmlsZSB0byBhZGQgU0lTOTAwRkxBR1MgdG8gZGVmaW5lcwotCi1TSVM5MDBGTEFHUz0JICAgICAgIAktRElOQ0xVREVfU0lTOTAwCi0KLTIuIGVkaXQgc3JjL3BjaS5oIHRvIGFkZCBQQ0kgc2lnbmF0dXJlcyBmb3IgY2FyZAotCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lTICAgICAgICAgCTB4MTAzOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzkwMCAgICAgCTB4MDkwMCAgIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzcwMTYgICAgCTB4NzAxNiAgCi0KLTMuIEVkaXQgc3JjL2NvbmZpZy5jIHRvIGFkZCB0aGUgY2FyZCB0byB0aGUgY2FyZCBwcm9iZSBsaXN0Ci0KLSNpZiBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSAgfHwgZGVmaW5lZChJTkNMVURFX0VFUFJPMTAwKSAgfHwgCi0gICAgZGVmaW5lZChJTkNMVURFX0xBTkNFKSAgIHx8IGRlZmluZWQoSU5DTFVERV9FUElDMTAwKSAgIHx8IAotICAgIGRlZmluZWQoSU5DTFVERV9UVUxJUCkgICB8fCBkZWZpbmVkKElOQ0xVREVfT1RVTElQKSAgICB8fAotICAgIGRlZmluZWQoSU5DTFVERV8zQzkwWCkgICB8fCBkZWZpbmVkKElOQ0xVREVfM0M1OTUpICAgICB8fAotICAgIGRlZmluZWQoSU5DTFVERV9SVEw4MTM5KSB8fCBkZWZpbmVkKElOQ0xVREVfVklBX1JISU5FKSB8fCAKLSAgICBkZWZpbmVkKElOQ0xVREVfU0lTOTAwKSAgfHwgZGVmaW5lZChJTkNMVURFX1c4OUM4NDApCi0KLS4uLiBhbmQgLi4uCi0KLSNpZmRlZiBJTkNMVURFX1NJUzkwMAotICAgICAgIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAJUENJX0RFVklDRV9JRF9TSVM5MDAsCi0gICAgICAgICAiU0lTOTAwIiwgMCwgMCwgMCwgMH0sCi0gICAgICAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgIAlQQ0lfREVWSUNFX0lEX1NJUzcwMTYsCi0JICJTSVM3MDE2IiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLQotLi4uIGFuZCAuLi4KLQotI2lmZGVmIElOQ0xVREVfU0lTOTAwCi0JeyAiU0lTOTAwIiwgc2lzOTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAkKLSNlbmRpZgotCi00LiBFZGl0IE5JQyB0byBhZGQgc2lzOTAwIGFuZCBzaXM3MDE2IHRvIE5JQyBsaXN0Ci0KLSMgU0lTIDkwMCBhbmQgU0lTIDcwMTYKLXNpczkwMAkJc2lzOTAwCQkweDEwMzksMHgwOTAwCi1zaXM3MDE2CQlzaXM5MDAJCTB4MTAzOSwweDcwMTYKLQotNS4gRWRpdCBjYXJkcy5oIHRvIGFkZCBzaXM5MDAgcHJvYmUgcm91dGluZSBkZWNsYXJhdGlvbgotCi0jaWZkZWYJSU5DTFVERV9TSVM5MDAKLWV4dGVybiBzdHJ1Y3QgbmljCSpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0gICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIGJlZ2luIGNyZWF0aW5nIHlvdXIgZHJpdmVyIHNvdXJjZSBmaWxlLiAgU2VlCi10aGUgIldyaXRpbmcgYW5kIEV0aGVyYm9vdCBEcml2ZXIiIHNlY3Rpb24gb2YgdGhlIEV0aGVyYm9vdAotZG9jdW1lbnRhdGlvbiBmb3Igc29tZSBoaW50cy4gIFNlZSB0aGUgc2tlbC5jIGZpbGUgZm9yIGEgc3RhcnRpbmcKLXBvaW50LiAgSWYgdGhlcmUgaXMgYSBMaW51eCBkcml2ZXIgZm9yIHRoZSBjYXJkLCB5b3UgbWF5IGJlIGFibGUgdG8KLXVzZSB0aGF0LiAgQ29weSBhbmQgbGVhcm4gZnJvbSBleGlzdGluZyBFdGhlcmJvb3QgZHJpdmVycyAodGhpcyBpcyBHUEwKLS8gT3BlbiBTb3VyY2Ugc29mdHdhcmUhKS4KLQotSm9pbiB0aGUgZXRoZXJib290LWRldmVsb3BlcnMgYW5kIGV0aGVyYm9vdC11c2VycyBtYWlsaW5nIGxpc3RzCi0oaW5mb3JtYXRpb24gaXMgb24gZXRoZXJib290LnNvdXJjZWZvcmdlLm5ldCkgZm9yIGluZm9ybWF0aW9uIGFuZAotYXNzaXN0YW5jZS4gV2UgaW52aXRlIG1vcmUgZGV2ZWxvcGVycyB0byBoZWxwIGltcHJvdmUgRXRoZXJib290LgotCi1WaXNpdCB0aGUgaHR0cDovL2V0aGVyYm9vdC5zb3VyY2Vmb3JnZS5uZXQsIGh0dHA6Ly90aGluZ3Vpbi5vcmcsIAotaHR0cDovL3JvbS1vLW1hdGljLm5ldCwgYW5kIGh0dHA6Ly9sdHNwLm9yZyBzaXRlcyBmb3IgaW5mb3JtYXRpb24gYW5kCi1hc3Npc3RhbmNlLgotCi1FbmpveS4KSW5kZXg6IGIvbmV0Ym9vdC9zbWM5MDAwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L3NtYzkwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0gLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHNtYzkwMDAuYwotICogVGhpcyBpcyBhIEV0aGVyYm9vdCBkcml2ZXIgZm9yIFNNQydzIDkwMDAgc2VyaWVzIG9mIEV0aGVybmV0IGNhcmRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBEYW5pZWwgRW5nc3Ry9m0gPGRhbmllbC5lbmdzdHJvbUByaWtzbmV0dC5ubz4KLSAqIEJhc2VkIG9uIHRoZSBMaW51eCBTTUM5MDAwIGRyaXZlciwgc21jOTE5NC5jIGJ5IEVyaWMgU3RhaGxtYW4KLSAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuIDxlcmljQHZ0LmVkdT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiAiRmVhdHVyZXMiIG9mIHRoZSBTTUMgY2hpcDoKLSAqICAgNDYwOCBieXRlIHBhY2tldCBtZW1vcnkuICggZm9yIHRoZSA5MUM5Mi80LiAgT3RoZXJzIGhhdmUgbW9yZSApCi0gKiAgIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbgotICogICBBVUkvVFAgc2VsZWN0aW9uCi0gKgotICogQXV0aG9ycwotICoJRXJpayBTdGFobG1hbgkJCQk8ZXJpa0B2dC5lZHU+Ci0gKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgotICoKLSAqIEhpc3RvcnkKLSAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gRXRoZXJib290IGRyaXZlciBjcmF0ZWQgZnJvbSBFcmljJ3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGludXggZHJpdmVyLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTElOVVhfT1VUX01BQ1JPUyAxCi0jZGVmaW5lIFNNQzkwMDBfVkVSQk9TRSAgMQotI2RlZmluZSBTTUM5MDAwX0RFQlVHICAgIDAKLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0jaW5jbHVkZSAic21jOTAwMC5oIgotCi0jIGRlZmluZSBfb3V0YiBvdXRiCi0jIGRlZmluZSBfb3V0dyBvdXR3Ci0KLXN0YXRpYyBjb25zdCBjaGFyICAgICAgIHNtYzkwMDBfdmVyc2lvbltdID0gIlZlcnNpb24gMC45OSA5OC0wOS0zMCI7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNtYzkwMDBfYmFzZT0wOwotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgKmludGVyZmFjZXNbIDIgXSA9IHsgIlRQIiwgIkFVSSIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICpjaGlwX2lkc1sgMTUgXSA9ICB7Ci0gICBOVUxMLCBOVUxMLCBOVUxMLAotICAgLyogMyAqLyAiU01DOTFDOTAvOTFDOTIiLAotICAgLyogNCAqLyAiU01DOTFDOTQiLAotICAgLyogNSAqLyAiU01DOTFDOTUiLAotICAgTlVMTCwKLSAgIC8qIDcgKi8gIlNNQzkxQzEwMCIsCi0gICAvKiA4ICovICJTTUM5MUMxMDBGRCIsCi0gICBOVUxMLCBOVUxMLCBOVUxMLAotICAgTlVMTCwgTlVMTCwgTlVMTAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgc21jOTFjOTZfaWRbXSA9ICJTTUM5MUM5NiI7Ci0KLS8qCi0gKiBGdW5jdGlvbjogc21jX3Jlc2V0KCBpbnQgaW9hZGRyICkKLSAqIFB1cnBvc2U6Ci0gKglUaGlzIHNldHMgdGhlIFNNQzkxeHggY2hpcCB0byBpdHMgbm9ybWFsIHN0YXRlLCBob3BlZnVsbHkgZnJvbSB3aGF0ZXZlcgotICoJbWVzcyB0aGF0IGFueSBvdGhlciBET1MgZHJpdmVyIGhhcyBwdXQgaXQgaW4uCi0gKgotICogTWF5YmUgSSBzaG91bGQgcmVzZXQgbW9yZSByZWdpc3RlcnMgdG8gZGVmYXVsdHMgaW4gaGVyZT8gIFNPRlRSRVNFVCAgc2hvdWxkCi0gKiBkbyB0aGF0IGZvciBtZS4KLSAqCi0gKiBNZXRob2Q6Ci0gKgkxLiAgc2VuZCBhIFNPRlQgUkVTRVQKLSAqCTIuICB3YWl0IGZvciBpdCB0byBmaW5pc2gKLSAqCTMuICByZXNldCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdAotICogICAgICA0LiAgY2xlYXIgYWxsIGludGVycnVwdHMKLSAqCi0qLwotc3RhdGljIHZvaWQgc21jX3Jlc2V0KGludCBpb2FkZHIpCi17Ci0gICAvKiBUaGlzIHJlc2V0cyB0aGUgcmVnaXN0ZXJzIG1vc3RseSB0byBkZWZhdWx0cywgYnV0IGRvZXNuJ3QKLSAgICAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5ICovCi0gICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAwKTsKLSAgIF9vdXR3KCBSQ1JfU09GVFJFU0VULCBpb2FkZHIgKyBSQ1IgKTsKLQotICAgLyogdGhpcyBzaG91bGQgcGF1c2UgZW5vdWdoIGZvciB0aGUgY2hpcCB0byBiZSBoYXBweSAqLwotICAgU01DX0RFTEFZKGlvYWRkcik7Ci0KLSAgIC8qIFNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgdG8KLSAgICAqIGRlZmF1bHQgdmFsdWVzICovCi0gICBfb3V0dyhSQ1JfQ0xFQVIsIGlvYWRkciArIFJDUik7Ci0gICBfb3V0dyhUQ1JfQ0xFQVIsIGlvYWRkciArIFRDUik7Ci0KLSAgIC8qIFJlc2V0IHRoZSBNTVUgKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDIpOwotICAgX291dHcoIE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EICk7Ci0KLSAgIC8qIE5vdGU6ICBJdCBkb2Vzbid0IHNlZW0gdGhhdCB3YWl0aW5nIGZvciB0aGUgTU1VIGJ1c3kgaXMgbmVlZGVkIGhlcmUsCi0gICAgKiBidXQgdGhpcyBpcyBhIHBsYWNlIHdoZXJlIGZ1dHVyZSBjaGlwc2V0cyBfQ09VTERfIGJyZWFrLiAgQmUgd2FyeQotICAgICogb2YgaXNzdWluZyBhbm90aGVyIE1NVSBjb21tYW5kIHJpZ2h0IGFmdGVyIHRoaXMgKi8KLSAgIF9vdXRiKDAsIGlvYWRkciArIElOVF9NQVNLKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiBzbWNfcHJvYmUoIGludCBpb2FkZHIgKQotICoKLSAqIFB1cnBvc2U6Ci0gKglUZXN0cyB0byBzZWUgaWYgYSBnaXZlbiBpb2FkZHIgcG9pbnRzIHRvIGFuIFNNQzl4eHggY2hpcC4KLSAqCVJldHVybnMgYSAwIG9uIHN1Y2Nlc3MKLSAqCi0gKiBBbGdvcml0aG06Ci0gKgkoMSkgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgb2YgQkFOS19TRUxFQ1QgaXMgMHgzMwotICoJKDIpIGNvbXBhcmUgdGhlIGlvYWRkciB3aXRoIHRoZSBiYXNlIHJlZ2lzdGVyJ3MgYWRkcmVzcwotICoJKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIGludCBzbWNfcHJvYmUoIGludCBpb2FkZHIgKQotewotICAgd29yZCBiYW5rOwotICAgd29yZAlyZXZpc2lvbl9yZWdpc3RlcjsKLSAgIHdvcmQgYmFzZV9hZGRyZXNzX3JlZ2lzdGVyOwotCi0gICAvKiBGaXJzdCwgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgaXMgMHgzMyAqLwotICAgYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7Ci0gICBpZiAoKGJhbmsgJiAweEZGMDApICE9IDB4MzMwMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgfQotICAgLyogVGhlIGFib3ZlIE1JR0hUIGluZGljYXRlIGEgZGV2aWNlLCBidXQgSSBuZWVkIHRvIHdyaXRlIHRvIGZ1cnRoZXIKLSAgICAqCXRlc3QgdGhpcy4gICovCi0gICBfb3V0dygweDAsIGlvYWRkciArIEJBTktfU0VMRUNUKTsKLSAgIGJhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOwotICAgaWYgKChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgIH0KLQotICAgLyogd2VsbCwgd2UndmUgYWxyZWFkeSB3cml0dGVuIG9uY2UsIHNvIGhvcGVmdWxseSBhbm90aGVyIHRpbWUgd29uJ3QKLSAgICAqICBodXJ0LiAgVGhpcyB0aW1lLCBJIG5lZWQgdG8gc3dpdGNoIHRoZSBiYW5rIHJlZ2lzdGVyIHRvIGJhbmsgMSwKLSAgICAqICBzbyBJIGNhbiBhY2Nlc3MgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLwotICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMSk7Ci0gICBiYXNlX2FkZHJlc3NfcmVnaXN0ZXIgPSBpbncoaW9hZGRyICsgQkFTRSk7Ci0KLSAgIGlmIChpb2FkZHIgIT0gKGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApKSAgewotI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQotICAgICAgcHJpbnRmKCJTTUM5MDAwOiBJT0FERFIgJWhYIGRvZXNuJ3QgbWF0Y2ggY29uZmlndXJhdGlvbiAoJWhYKS4iCi0JICAgICAiUHJvYmFibHkgbm90IGEgU01DIGNoaXBcbiIsCi0JICAgICBpb2FkZHIsIGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApOwotI2VuZGlmCi0gICAgICAvKiB3ZWxsLCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGRpZG4ndCBtYXRjaC4gIE11c3Qgbm90IGhhdmUKLSAgICAgICAqIGJlZW4gYSBTTUMgY2hpcCBhZnRlciBhbGwuICovCi0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLQotICAgLyogY2hlY2sgaWYgdGhlIHJldmlzaW9uIHJlZ2lzdGVyIGlzIHNvbWV0aGluZyB0aGF0IEkgcmVjb2duaXplLgotICAgICogVGhlc2UgbWlnaHQgbmVlZCB0byBiZSBhZGRlZCB0byBsYXRlciwgYXMgZnV0dXJlIHJldmlzaW9ucwotICAgICogY291bGQgYmUgYWRkZWQuICAqLwotICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMyk7Ci0gICByZXZpc2lvbl9yZWdpc3RlciAgPSBpbncoaW9hZGRyICsgUkVWSVNJT04pOwotICAgaWYgKCFjaGlwX2lkc1socmV2aXNpb25fcmVnaXN0ZXIgPj4gNCkgJiAweEZdKSB7Ci0gICAgICAvKiBJIGRvbid0IHJlY29nbml6ZSB0aGlzIGNoaXAsIHNvLi4uICovCi0jaWZkZWYJU01DOTAwMF9WRVJCT1NFCi0gICAgICBwcmludGYoIlNNQzkwMDA6IElPICVoWDogVW5yZWNvZ25pemVkIHJldmlzaW9uIHJlZ2lzdGVyOiIKLQkgICAgICIgJWhYLCBDb250YWN0IGF1dGhvci5cbiIsIGlvYWRkciwgcmV2aXNpb25fcmVnaXN0ZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLSAgIC8qIGF0IHRoaXMgcG9pbnQgSSdsbCBhc3N1bWUgdGhhdCB0aGUgY2hpcCBpcyBhbiBTTUM5eHh4LgotICAgICogSXQgbWlnaHQgYmUgcHJ1ZGVudCB0byBjaGVjayBhIGxpc3Rpbmcgb2YgTUFDIGFkZHJlc3NlcwotICAgICogYWdhaW5zdCB0aGUgaGFyZHdhcmUgYWRkcmVzcywgb3IgZG8gc29tZSBvdGhlciB0ZXN0cy4gKi8KLSAgIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgc21jOTAwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0gICBzbWNfcmVzZXQoc21jOTAwMF9iYXNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFVEhfVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc21jOTAwMF90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLSAgIHdvcmQgbGVuZ3RoOyAvKiByZWFsLCBsZW5ndGggaW5jbC4gaGVhZGVyICovCi0gICB3b3JkIG51bVBhZ2VzOwotICAgdW5zaWduZWQgbG9uZyB0aW1lX291dDsKLSAgIGJ5dGUJcGFja2V0X25vOwotICAgd29yZCBzdGF0dXM7Ci0gICBpbnQgaTsKLQotICAgLyogV2UgZG9udCBwYWQgaGVyZSBzaW5jZSB3ZSBjYW4gaGF2ZSB0aGUgaGFyZHdhcmUgZG9pbmcgaXQgZm9yIHVzICovCi0gICBsZW5ndGggPSAocyArIEVUSF9ITEVOICsgMSkmfjE7Ci0KLSAgIC8qIGNvbnZlcnQgdG8gTU1VIHBhZ2VzICovCi0gICBudW1QYWdlcyA9IGxlbmd0aCAvIDI1NjsKLQotICAgaWYgKG51bVBhZ2VzID4gNyApIHsKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLSAgICAgIHByaW50ZigiU01DOTAwMDogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLiBcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIGRvbnQgdHJ5IG1vcmUgdGhhbiwgc2F5IDMwIHRpbWVzICovCi0gICBmb3IgKGk9MDtpPDMwO2krKykgewotICAgICAgLyogbm93LCB0cnkgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSAqLwotICAgICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMik7Ci0gICAgICBfb3V0dyhNQ19BTExPQyB8IG51bVBhZ2VzLCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotICAgICAgc3RhdHVzID0gMDsKLSAgICAgIC8qIHdhaXQgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB0byBmaW5uaXNoICovCi0gICAgICBmb3IgKHRpbWVfb3V0ID0gY3VycnRpY2tzKCkgKyA1KlRJQ0tTX1BFUl9TRUM7IGN1cnJ0aWNrcygpIDwgdGltZV9vdXQ7ICkgewotCSBzdGF0dXMgPSBpbmIoc21jOTAwMF9iYXNlICsgSU5URVJSVVBUKTsKLQkgaWYgKCBzdGF0dXMgJiBJTV9BTExPQ19JTlQgKSB7Ci0JICAgIC8qIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KLQkgICAgX291dGIoSU1fQUxMT0NfSU5ULCBzbWM5MDAwX2Jhc2UgKyBJTlRFUlJVUFQpOwotCSAgICBicmVhazsKLQkgfQotICAgICAgfQotCi0gICAgICBpZiAoKHN0YXR1cyAmIElNX0FMTE9DX0lOVCkgIT0gMCApIHsKLQkgLyogV2UndmUgZ290IHRoZSBtZW1vcnkgKi8KLQkgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotCSBwcmludGYoIlNNQzkwMDA6IE1lbW9yeSBhbGxvY2F0aW9uIHRpbWVkIG91dCwgcmVzZXR0aW5nIE1NVS5cbiIpOwotCSBfb3V0dyhNQ19SRVNFVCwgc21jOTAwMF9iYXNlICsgTU1VX0NNRCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmIEkgZ2V0IGhlcmUsIEkgX2tub3dfIHRoZXJlIGlzIGEgcGFja2V0IHNsb3Qgd2FpdGluZyBmb3IgbWUgKi8KLSAgIHBhY2tldF9ubyA9IGluYihzbWM5MDAwX2Jhc2UgKyBQTlJfQVJSICsgMSk7Ci0gICBpZiAocGFja2V0X25vICYgMHg4MCkgewotICAgICAgLyogb3IgaXNuJ3QgdGhlcmU/ICBCQUQgQ0hJUCEgKi8KLSAgICAgIHByaW50ZigiU01DOTAwMDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBcbiIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiB3ZSBoYXZlIGEgcGFja2V0IGFkZHJlc3MsIHNvIHRlbGwgdGhlIGNhcmQgdG8gdXNlIGl0ICovCi0gICBfb3V0YihwYWNrZXRfbm8sIHNtYzkwMDBfYmFzZSArIFBOUl9BUlIpOwotCi0gICAvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KLSAgIF9vdXR3KFBUUl9BVVRPSU5DLCBzbWM5MDAwX2Jhc2UgKyBQT0lOVEVSKTsKLQotI2lmCVNNQzkwMDBfREVCVUcgPiAyCi0gICBwcmludGYoIlRyeWluZyB0byB4bWl0IHBhY2tldCBvZiBsZW5ndGggJWhYXG4iLCBsZW5ndGggKTsKLSNlbmRpZgotCi0gICAvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cywgbGVuZ3RoIGFuZCBjdGwgYnl0ZSApCi0gICAgKiBhbmQgdGhlIHN0YXR1cyB3b3JkICggc2V0IHRvIHplcm9zICkgKi8KLSAgIF9vdXR3KDAsIHNtYzkwMDBfYmFzZSArIERBVEFfMSApOwotCi0gICAvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cyB3b3JkcywgbGVuZ3RoLCBhbmQgY3RsKSAqLwotICAgX291dGIoKGxlbmd0aCs2KSAmIDB4RkYsICBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotICAgX291dGIoKGxlbmd0aCs2KSA+PiA4ICwgICBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotCi0gICAvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLwotCi0gICAvKiBUaGUgZXRoZXJuZXQgaGVhZGVyIGZpcnN0Li4uICovCi0gICBvdXRzdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEsIGQsIEVUSF9BTEVOID4+IDEpOwotICAgb3V0c3coc21jOTAwMF9iYXNlICsgREFUQV8xLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gPj4gMSk7Ci0gICBfb3V0dyhodG9ucyh0KSwgc21jOTAwMF9iYXNlICsgREFUQV8xKTsKLQotICAgLyogLi4uIHRoZSBkYXRhIC4uLiAqLwotICAgb3V0c3coc21jOTAwMF9iYXNlICsgREFUQV8xICwgcCwgcyA+PiAxKTsKLQotICAgLyogLi4uIGFuZCB0aGUgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUuICAgKi8KLSAgIGlmICgocyAmIDEpID09IDApIHsKLSAgICAgIF9vdXR3KDAsIHNtYzkwMDBfYmFzZSArIERBVEFfMSk7Ci0gICB9IGVsc2UgewotICAgICAgX291dGIocFtzLTFdLCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotICAgICAgX291dGIoMHgyMCwgc21jOTAwMF9iYXNlICsgREFUQV8xKTsKLSAgIH0KLQotICAgLyogYW5kIGxldCB0aGUgY2hpcHNldCBkZWFsIHdpdGggaXQgKi8KLSAgIF9vdXR3KE1DX0VOUVVFVUUgLCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotICAgc3RhdHVzID0gMDsgdGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsKLSAgIGRvIHsKLSAgICAgIHN0YXR1cyA9IGluYihzbWM5MDAwX2Jhc2UgKyBJTlRFUlJVUFQpOwotCi0gICAgICBpZiAoKHN0YXR1cyAmIElNX1RYX0lOVCApICE9IDApIHsKLQkgd29yZCB0eF9zdGF0dXM7Ci0KLQkgLyogYWNrIGludGVycnVwdCAqLwotCSBfb3V0YihJTV9UWF9JTlQsIHNtYzkwMDBfYmFzZSArIElOVEVSUlVQVCk7Ci0KLQkgcGFja2V0X25vID0gaW53KHNtYzkwMDBfYmFzZSArIEZJRk9fUE9SVFMpOwotCSBwYWNrZXRfbm8gJj0gMHg3RjsKLQotCSAvKiBzZWxlY3QgdGhpcyBhcyB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbSAqLwotCSBfb3V0YiggcGFja2V0X25vLCBzbWM5MDAwX2Jhc2UgKyBQTlJfQVJSICk7Ci0KLQkgLyogcmVhZCB0aGUgZmlyc3Qgd29yZCBmcm9tIHRoaXMgcGFja2V0ICovCi0JIF9vdXR3KCBQVFJfQVVUT0lOQyB8IFBUUl9SRUFELCBzbWM5MDAwX2Jhc2UgKyBQT0lOVEVSICk7Ci0KLQkgdHhfc3RhdHVzID0gaW53KCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEgKTsKLQotCSBpZiAoMCA9PSAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykpIHsKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLQkgICAgcHJpbnRmKCJTTUM5MDAwOiBUWCBGQUlMIFNUQVRVUzogJWhYIFxuIiwgdHhfc3RhdHVzKTsKLSNlbmRpZgotCSAgICAvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KLQkgICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7Ci0JICAgIF9vdXR3KGludyhzbWM5MDAwX2Jhc2UgKyBUQ1IgKSB8IFRDUl9FTkFCTEUsIHNtYzkwMDBfYmFzZSArIFRDUiApOwotCSB9Ci0KLQkgLyoga2lsbCB0aGUgcGFja2V0ICovCi0JIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDIpOwotCSBfb3V0dyhNQ19GUkVFUEtULCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotCSByZXR1cm47Ci0gICAgICB9Ci0gICB9d2hpbGUoY3VycnRpY2tzKCkgPCB0aW1lX291dCk7Ci0KLSAgIHByaW50ZigiU01DOTAwMDogV2FyaW5nIFRYIHRpbWVkIG91dCwgcmVzZXR0aW5nIGJvYXJkXG4iKTsKLSAgIHNtY19yZXNldChzbWM5MDAwX2Jhc2UpOwotICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc21jOTAwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLSAgIGlmKCFzbWM5MDAwX2Jhc2UpCi0gICAgIHJldHVybiAwOwotCi0gICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAyKTsKLSAgIGlmIChpbncoc21jOTAwMF9iYXNlICsgRklGT19QT1JUUykgJiBGUF9SWEVNUFRZKQotICAgICByZXR1cm4gMDsKLQotICAgLyogIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCAqLwotICAgX291dHcoUFRSX1JFQUQgfCBQVFJfUkNWIHwgUFRSX0FVVE9JTkMsIHNtYzkwMDBfYmFzZSArIFBPSU5URVIpOwotCi0gICAvKiBGaXJzdCByZWFkIHRoZSBzdGF0dXMgYW5kIGNoZWNrIHRoYXQgd2UncmUgb2sgKi8KLSAgIGlmICghKGludyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpICYgUlNfRVJST1JTKSkgewotICAgICAgLyogTmV4dDogcmVhZCB0aGUgcGFja2V0IGxlbmd0aCBhbmQgbWFzayBvZmYgdGhlIHRvcCBiaXRzICovCi0gICAgICBuaWMtPnBhY2tldGxlbiA9IChpbncoc21jOTAwMF9iYXNlICsgREFUQV8xKSAmIDB4MDdmZik7Ci0KLSAgICAgIC8qIHRoZSBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSAzIGV4dHJhIHdvcmRzICovCi0gICAgICBuaWMtPnBhY2tldGxlbiAtPSA2OwotI2lmCVNNQzkwMDBfREVCVUcgPiAyCi0gICAgICBwcmludGYoIiBSZWFkaW5nICVkIHdvcmRzIChhbmQgJWQgYnl0ZShzKSlcbiIsCi0JICAgICAgIChuaWMtPnBhY2tldGxlbiA+PiAxKSwgbmljLT5wYWNrZXRsZW4gJiAxKTsKLSNlbmRpZgotICAgICAgLyogcmVhZCB0aGUgcGFja2V0IChhbmQgdGhlIGxhc3QgImV4dHJhIiB3b3JkKSAqLwotICAgICAgaW5zdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEsIG5pYy0+cGFja2V0LCAobmljLT5wYWNrZXRsZW4rMikgPj4gMSk7Ci0gICAgICAvKiBpcyB0aGVyZSBhbiBvZGQgbGFzdCBieXRlID8gKi8KLSAgICAgIGlmIChuaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbisxXSAmIDB4MjApCi0JIG5pYy0+cGFja2V0bGVuKys7Ci0KLSAgICAgIC8qICBlcnJvciBvciBnb29kLCB0ZWxsIHRoZSBjYXJkIHRvIGdldCByaWQgb2YgdGhpcyBwYWNrZXQgKi8KLSAgICAgIF9vdXR3KE1DX1JFTEVBU0UsIHNtYzkwMDBfYmFzZSArIE1NVV9DTUQpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIHByaW50ZigiU01DOTAwMDogUlggZXJyb3JcbiIpOwotICAgLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLwotICAgX291dHcoTUNfUkVMRUFTRSwgc21jOTAwMF9iYXNlICsgTU1VX0NNRCk7Ci0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc21jOTAwMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLSAgIGlmKCFzbWM5MDAwX2Jhc2UpCi0gICAgIHJldHVybjsKLQotICAgLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGZvciBtZSAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMik7Ci0gICBfb3V0YiggMCwgc21jOTAwMF9iYXNlICsgSU5UX01BU0spOwotCi0gICAvKiBhbmQgdGVsbCB0aGUgY2FyZCB0byBzdGF5IGF3YXkgZnJvbSB0aGF0IG5hc3R5IG91dHNpZGUgd29ybGQgKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDApOwotICAgX291dGIoIFJDUl9DTEVBUiwgc21jOTAwMF9iYXNlICsgUkNSICk7Ci0gICBfb3V0YiggVENSX0NMRUFSLCBzbWM5MDAwX2Jhc2UgKyBUQ1IgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgbmljICpzbWM5MDAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotICAgdW5zaWduZWQgc2hvcnQgICByZXZpc2lvbjsKLSAgIGludAkgICAgICAgICAgICBtZW1vcnk7Ci0gICBpbnQgICAgICAgICAgICAgIG1lZGlhOwotICAgY29uc3QgY2hhciAqCSAgICB2ZXJzaW9uX3N0cmluZzsKLSAgIGNvbnN0IGNoYXIgKgkgICAgaWZfc3RyaW5nOwotICAgaW50ICAgICAgICAgICAgICBpOwotCi0gICAvKgotICAgICogdGhlIFNNQzkwMDAgY2FuIGJlIGF0IGFueSBvZiB0aGUgZm9sbG93aW5nIHBvcnQgYWRkcmVzc2VzLiAgVG8gY2hhbmdlLAotICAgICogZm9yIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNhcmQsIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSBhcnJheS4gIEtlZXAgaW4KLSAgICAqIG1pbmQgdGhhdCB0aGUgYXJyYXkgbXVzdCBlbmQgaW4gemVyby4KLSAgICAqLwotICAgc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRsaXN0W10gPSB7Ci0jaWZkZWYJU01DOTAwMF9TQ0FOCi0gICAgICBTTUM5MDAwX1NDQU4sCi0jZWxzZQotICAgICAgMHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyQzAsIDB4MkUwLAotICAgICAgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MzgwLCAweDNBMCwgMHgzQzAsIDB4M0UwLAotI2VuZGlmCi0gICAgICAwIH07Ci0KLSAgIHByaW50ZigiXG5TTUM5MDAwICVzXG4iLCBzbWM5MDAwX3ZlcnNpb24pOwotI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQotICAgcHJpbnRmKCJDb3B5cmlnaHQgKEMpIDE5OTggRGFuaWVsIEVuZ3N0clx4OTRtXG4iKTsKLSAgIHByaW50ZigiQ29weXJpZ2h0IChDKSAxOTk2IEVyaWMgU3RhaGxtYW5cbiIpOwotI2VuZGlmCi0gICAvKiBpZiBubyBhZGRyZXNzZXMgc3VwcGxpZWQsIGZhbGwgYmFjayBvbiBkZWZhdWx0cyAqLwotICAgaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKLSAgICAgcHJvYmVfYWRkcnMgPSBwb3J0bGlzdDsKLQotICAgLyogY2hlY2sgZXZlcnkgZXRoZXJuZXQgYWRkcmVzcyAqLwotICAgZm9yIChpID0gMDsgcHJvYmVfYWRkcnNbaV07IGkrKykgewotICAgICAgLyogY2hlY2sgdGhpcyBzcGVjaWZpYyBhZGRyZXNzICovCi0gICAgICBpZiAoc21jX3Byb2JlKHByb2JlX2FkZHJzW2ldKSA9PSAwKQotCXNtYzkwMDBfYmFzZSA9IHByb2JlX2FkZHJzW2ldOwotICAgfQotCi0gICAvKiBjb3VsZG4ndCBmaW5kIGFueXRoaW5nICovCi0gICBpZigwID09IHNtYzkwMDBfYmFzZSkKLSAgICAgZ290byBvdXQ7Ci0KLSAgIC8qCi0gICAgKiBHZXQgdGhlIE1BQyBhZGRyZXNzICggYmFuayAxLCByZWdzIDQgLSA5ICkKLSAgICAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMSk7Ci0gICBmb3IgKCBpID0gMDsgaSA8IDY7IGkgKz0gMiApIHsKLSAgICAgIHdvcmQgYWRkcmVzczsKLQotICAgICAgYWRkcmVzcyA9IGludyhzbWM5MDAwX2Jhc2UgKyBBRERSMCArIGkpOwotICAgICAgbmljLT5ub2RlX2FkZHJbaSsxXSA9IGFkZHJlc3MgPj4gODsKLSAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gYWRkcmVzcyAmIDB4RkY7Ci0gICB9Ci0KLQotICAgLyogZ2V0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDApOwotICAgbWVtb3J5ID0gKCBpbncoc21jOTAwMF9iYXNlICsgTUNSKSA+PiA5ICkgICYgMHg3OyAgLyogbXVsdGlwbGllciAqLwotICAgbWVtb3J5ICo9IDI1NiAqIChpbncoc21jOTAwMF9iYXNlICsgTUlSKSAmIDB4RkYpOwotCi0gICAvKgotICAgICogTm93LCBJIHdhbnQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgY2hpcC4gIFRoaXMgaXMgc29ydCBvZgotICAgICogcmVkdW5kYW50LCBidXQgaXQncyBjbGVhbmVyIHRvIGhhdmUgaXQgaW4gYm90aCwgcmF0aGVyIHRoYW4gaGF2aW5nCi0gICAgKiBvbmUgVkVSWSBsb25nIHByb2JlIHByb2NlZHVyZS4KLSAgICAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMyk7Ci0gICByZXZpc2lvbiAgPSBpbncoc21jOTAwMF9iYXNlICsgUkVWSVNJT04pOwotICAgdmVyc2lvbl9zdHJpbmcgPSBjaGlwX2lkc1socmV2aXNpb24gPj4gNCkgJiAweEZdOwotCi0gICBpZiAoKChyZXZpc2lvbiAmIDB4RjApID4+IDQgPT0gQ0hJUF85MTk2KSAmJgotICAgICAgICgocmV2aXNpb24gJiAweDBGKSA+PSBSRVZfOTE5NikpIHsKLSAgICAgIC8qIFRoaXMgaXMgYSA5MWM5Ni4gJ2M5NiBoYXMgdGhlIHNhbWUgY2hpcCBpZCBhcyAnYzk0ICg0KSBidXQKLSAgICAgICAqIGEgcmV2aXNpb24gc3RhcnRpbmcgYXQgNiAqLwotICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzbWM5MWM5Nl9pZDsKLSAgIH0KLQotICAgaWYgKCAhdmVyc2lvbl9zdHJpbmcgKSB7Ci0gICAgICAvKiBJIHNob3VsZG4ndCBnZXQgaGVyZSBiZWNhdXNlIHRoaXMgY2FsbCB3YXMgZG9uZSBiZWZvcmUuLi4uICovCi0gICAgICBnb3RvIG91dDsKLSAgIH0KLQotICAgLyogaXMgaXQgdXNpbmcgQVVJIG9yIDEwQmFzZVQgPyAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMSk7Ci0gICBpZiAoaW53KHNtYzkwMDBfYmFzZSArIENPTkZJRykgJiBDRkdfQVVJX1NFTEVDVCkKLSAgICAgbWVkaWEgPSAyOwotICAgZWxzZQotICAgICBtZWRpYSA9IDE7Ci0KLSAgIGlmX3N0cmluZyA9IGludGVyZmFjZXNbbWVkaWEgLSAxXTsKLQotICAgLyogbm93LCByZXNldCB0aGUgY2hpcCwgYW5kIHB1dCBpdCBpbnRvIGEga25vd24gc3RhdGUgKi8KLSAgIHNtY19yZXNldChzbWM5MDAwX2Jhc2UpOwotCi0gICBwcmludGYoIiVzIHJldjolZCBJL08gcG9ydDolaFggSW50ZXJmYWNlOiVzIFJBTTolZCBieXRlcyBcbiIsCi0JICB2ZXJzaW9uX3N0cmluZywgcmV2aXNpb24gJiAweEYsCi0JICBzbWM5MDAwX2Jhc2UsIGlmX3N0cmluZywgbWVtb3J5ICk7Ci0gICAvKgotICAgICogUHJpbnQgdGhlIEV0aGVybmV0IGFkZHJlc3MKLSAgICAqLwotICAgcHJpbnRmKCJFdGhlcm5ldCBNQUMgYWRkcmVzczogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKLQotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7Ci0KLSAgIC8qIHNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIG9wdGlvbnMgaW4gVENSL1JDUiBOT1JNQUwqLwotICAgX291dHcoVENSX05PUk1BTCwgc21jOTAwMF9iYXNlICsgVENSKTsKLSAgIF9vdXR3KFJDUl9OT1JNQUwsIHNtYzkwMDBfYmFzZSArIFJDUik7Ci0KLSAgIC8qIFNlbGVjdCB3aGljaCBpbnRlcmZhY2UgdG8gdXNlICovCi0gICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAxKTsKLSAgIGlmICggbWVkaWEgPT0gMSApIHsKLSAgICAgIF9vdXR3KCBpbncoIHNtYzkwMDBfYmFzZSArIENPTkZJRyApICYgfkNGR19BVUlfU0VMRUNULAotCSAgIHNtYzkwMDBfYmFzZSArIENPTkZJRyApOwotICAgfQotICAgZWxzZSBpZiAoIG1lZGlhID09IDIgKSB7Ci0gICAgICBfb3V0dyggaW53KCBzbWM5MDAwX2Jhc2UgKyBDT05GSUcgKSB8IENGR19BVUlfU0VMRUNULAotCSAgIHNtYzkwMDBfYmFzZSArIENPTkZJRyApOwotICAgfQotCi0gICBuaWMtPnJlc2V0ID0gc21jOTAwMF9yZXNldDsKLSAgIG5pYy0+cG9sbCA9IHNtYzkwMDBfcG9sbDsKLSAgIG5pYy0+dHJhbnNtaXQgPSBzbWM5MDAwX3RyYW5zbWl0OwotICAgbmljLT5kaXNhYmxlID0gc21jOTAwMF9kaXNhYmxlOwotCi0KLSAgIHJldHVybiBuaWM7Ci0KLW91dDoKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLSAgIHByaW50ZigiTm8gU01DOTAwMCBhZGFwdGVycyBmb3VuZFxuIik7Ci0jZW5kaWYKLSAgIHNtYzkwMDBfYmFzZSA9IDA7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLQotCkluZGV4OiBiL25ldGJvb3Qvc21jOTAwMC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC9zbWM5MDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHNtYzkwMDAuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBieSBEYW5pZWwgRW5nc3Ry9m0KLSAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwotICogb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGFuZCBhY2Nlc3MgbWFjcm9zIGZvcgotICogdGhlIFNNQzkxeHh4IGNoaXBzZXQuCi0gKgotICogSW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSB3YXMgb2J0YWluZWQgZnJvbSB0aGUgU01DOTFDOTQKLSAqIG1hbnVhbCBmcm9tIFNNQy4gIFRvIGdldCBhIGNvcHksIGlmIHlvdSByZWFsbHkgd2FudCBvbmUsIHlvdSBjYW4gZmluZAotICogaW5mb3JtYXRpb24gdW5kZXIgd3d3LnNtc2MuY29tIGluIHRoZSBjb21wb25lbnRzIGRpdmlzaW9uLgotICogKCB0aGlzIHRoYW5rcyB0byBhZHZpY2UgZnJvbSBEb25hbGQgQmVja2VyICkuCi0gKgotICogQXV0aG9ycwotICogICAgICBEYW5pZWwgRW5nc3Ry9m0gICAgICAgICAgICAgICAgICAgICAgICAgPGRhbmllbC5lbmdzdHJvbUByaWtzbmV0dC5ubz4KLSAqCUVyaWsgU3RhaGxtYW4JCQkJPGVyaWtAdnQuZWR1PgotICoKLSAqIEhpc3RvcnkKLSAqIDk2LTAxLTA2CQkgRXJpayBTdGFobG1hbiAgIG1vdmVkIGRlZmluaXRpb25zIGhlcmUgZnJvbSBtYWluIC5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUKLSAqIDk2LTAxLTE5CQkgRXJpayBTdGFobG1hbgkgcG9saXNoZWQgdGhpcyB1cCBzb21lLCBhbmQgYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyIGVycm9yIGhhbmRsaW5nCi0gKiA5OC0wOS0yNSAgICAgICAgICAgICAgRGFuaWVsIEVuZ3N0cvZtIGFkanVzdGVkIGZvciBFdGhlcmJvb3QKLSAqIDk4LTA5LTI3ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gbW92ZWQgc29tZSBzdGF0aWMgc3RyaW5ncyBiYWNrIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluIC5jIGZpbGUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYJX1NNQzkwMDBfSF8KLSMgZGVmaW5lIF9TTUM5MDAwX0hfCi0KLS8qIEkgd2FudCBzb21lIHNpbXBsZSB0eXBlcyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQkJYnl0ZTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCQl3b3JkOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAkJZHdvcmQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgU01DIHJlZ2lzdGVycyBpcyBwcm9iYWJseSBpbiBvcmRlciBoZXJlLAotICogYWx0aG91Z2ggZm9yIGRldGFpbHMsIHRoZSBTTUMgZGF0YXNoZWV0IGlzIGludmFsdWFibGUuCi0gKgotICogQmFzaWNhbGx5LCB0aGUgY2hpcCBoYXMgNCBiYW5rcyBvZiByZWdpc3RlcnMgKCAwIHRvIDMgKSwgd2hpY2gKLSAqIGFyZSBhY2Nlc3NlZCBieSB3cml0aW5nIGEgbnVtYmVyIGludG8gdGhlIEJBTktfU0VMRUNUIHJlZ2lzdGVyCi0gKiAoIEkgYWxzbyB1c2UgYSBTTUNfU0VMRUNUX0JBTksgbWFjcm8gZm9yIHRoaXMgKS4KLSAqCi0gKiBUaGUgYmFua3MgYXJlIGNvbmZpZ3VyZWQgc28gdGhhdCBmb3IgbW9zdCBwdXJwb3NlcywgYmFuayAyIGlzIGFsbAotICogdGhhdCBpcyBuZWVkZWQgZm9yIHNpbXBsZSBydW4gdGltZSB0YXNrcy4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogQmFuayBTZWxlY3QgUmVnaXN0ZXI6Ci0gKgotICoJCXl5eXkgeXl5eSAwMDAwIDAweHgKLSAqCQl4eAkJPSBiYW5rIG51bWJlcgotICoJCXl5eXkgeXl5eQk9IDB4MzMsIGZvciBpZGVudGlmaWNhdGlvbiBwdXJwb3Nlcy4KLSAqLwotI2RlZmluZQlCQU5LX1NFTEVDVAkJMTQKLQotLyogQkFOSyAwICAqLwotCi0jZGVmaW5lCVRDUgkJMAkvKiB0cmFuc21pdCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFRDUl9FTkFCTEUJMHgwMDAxCS8qIGlmIHRoaXMgaXMgMSwgd2UgY2FuIHRyYW5zbWl0ICovCi0jZGVmaW5lIFRDUl9GRFVQTFgJMHgwODAwCS8qIHJlY2VpdmUgcGFja2V0cyBzZW50IG91dCAqLwotI2RlZmluZSBUQ1JfU1RQX1NRRVQJMHgxMDAwCS8qIHN0b3AgdHJhbnNtaXR0aW5nIGlmIFNpZ25hbCBxdWFsaXR5IGVycm9yICovCi0jZGVmaW5lCVRDUl9NT05fQ05TCTB4MDQwMAkvKiBtb25pdG9ycyB0aGUgY2FycmllciBzdGF0dXMgKi8KLSNkZWZpbmUJVENSX1BBRF9FTkFCTEUJMHgwMDgwCS8qIHBhZHMgc2hvcnQgcGFja2V0cyB0byA2NCBieXRlcyAqLwotCi0jZGVmaW5lCVRDUl9DTEVBUgkwCS8qIGRvIE5PVEhJTkcgKi8KLS8qIHRoZSBub3JtYWwgc2V0dGluZ3MgZm9yIHRoZSBUQ1IgcmVnaXN0ZXIgOiAqLwotI2RlZmluZQlUQ1JfTk9STUFMCShUQ1JfRU5BQkxFIHwgVENSX1BBRF9FTkFCTEUpCi0KLQotI2RlZmluZSBFUEhfU1RBVFVTCTIKLSNkZWZpbmUgRVNfTElOS19PSwkweDQwMDAJLyogaXMgdGhlIGxpbmsgaW50ZWdyaXR5IG9rID8gKi8KLQotI2RlZmluZQlSQ1IJCTQKLSNkZWZpbmUgUkNSX1NPRlRSRVNFVAkweDgwMDAJLyogcmVzZXRzIHRoZSBjaGlwICovCi0jZGVmaW5lCVJDUl9TVFJJUF9DUkMJMHgyMDAJLyogc3RyaXBzIENSQyAqLwotI2RlZmluZSBSQ1JfRU5BQkxFCTB4MTAwCS8qIElGRiB0aGlzIGlzIHNldCwgd2UgY2FuIHJlY2VpdmUgcGFja2V0cyAqLwotI2RlZmluZSBSQ1JfQUxNVUwJMHg0CS8qIHJlY2VpdmUgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCi0jZGVmaW5lCVJDUl9QUk9NSVNDCTB4MgkvKiBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwotCi0vKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgUkNSIHJlZ2lzdGVyIDogKi8KLSNkZWZpbmUJUkNSX05PUk1BTAkoUkNSX1NUUklQX0NSQyB8IFJDUl9FTkFCTEUpCi0jZGVmaW5lIFJDUl9DTEVBUgkweDAJCS8qIHNldCBpdCB0byBhIGJhc2Ugc3RhdGUgKi8KLQotI2RlZmluZQlDT1VOVEVSCQk2Ci0jZGVmaW5lCU1JUgkJOAotI2RlZmluZQlNQ1IJCTEwCi0vKiAxMiBpcyByZXNlcnZlZCAqLwotCi0vKiBCQU5LIDEgKi8KLSNkZWZpbmUgQ09ORklHCQkJMAotI2RlZmluZSBDRkdfQVVJX1NFTEVDVAkJMHgxMDAKLSNkZWZpbmUJQkFTRQkJCTIKLSNkZWZpbmUJQUREUjAJCQk0Ci0jZGVmaW5lCUFERFIxCQkJNgotI2RlZmluZQlBRERSMgkJCTgKLSNkZWZpbmUJR0VORVJBTAkJCTEwCi0jZGVmaW5lCUNPTlRST0wJCQkxMgotI2RlZmluZQlDVExfUE9XRVJET1dOCQkweDIwMDAKLSNkZWZpbmUJQ1RMX0xFX0VOQUJMRQkJMHg4MAotI2RlZmluZQlDVExfQ1JfRU5BQkxFCQkweDQwCi0jZGVmaW5lCUNUTF9URV9FTkFCTEUJCTB4MDAyMAotI2RlZmluZSBDVExfQVVUT19SRUxFQVNFCTB4MDgwMAotI2RlZmluZQlDVExfRVBST01fQUNDRVNTCTB4MDAwMyAvKiBoaWdoIGlmIEVwcm9tIGlzIGJlaW5nIHJlYWQgKi8KLQotLyogQkFOSyAyICovCi0jZGVmaW5lIE1NVV9DTUQJCTAKLSNkZWZpbmUgTUNfQlVTWQkJMQkvKiBvbmx5IHJlYWRhYmxlIGJpdCBpbiB0aGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUNfTk9QCQkwCi0jZGVmaW5lCU1DX0FMTE9DCTB4MjAJLyogb3Igd2l0aCBudW1iZXIgb2YgMjU2IGJ5dGUgcGFja2V0cyAqLwotI2RlZmluZQlNQ19SRVNFVAkweDQwCi0jZGVmaW5lCU1DX1JFTU9WRQkweDYwCS8qIHJlbW92ZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KLSNkZWZpbmUgTUNfUkVMRUFTRQkweDgwCS8qIHJlbW92ZSBhbmQgcmVsZWFzZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KLSNkZWZpbmUgTUNfRlJFRVBLVAkweEEwCS8qIFJlbGVhc2UgcGFja2V0IGluIFBOUiByZWdpc3RlciAqLwotI2RlZmluZSBNQ19FTlFVRVVFCTB4QzAJLyogRW5xdWV1ZSB0aGUgcGFja2V0IGZvciB0cmFuc21pdCAqLwotCi0jZGVmaW5lCVBOUl9BUlIJCTIKLSNkZWZpbmUgRklGT19QT1JUUwk0Ci0KLSNkZWZpbmUgRlBfUlhFTVBUWQkweDgwMDAKLSNkZWZpbmUgRlBfVFhFTVBUWQkweDgwCi0KLSNkZWZpbmUJUE9JTlRFUgkJNgotI2RlZmluZSBQVFJfUkVBRAkweDIwMDAKLSNkZWZpbmUJUFRSX1JDVgkJMHg4MDAwCi0jZGVmaW5lCVBUUl9BVVRPSU5DCTB4NDAwMAotI2RlZmluZSBQVFJfQVVUT19JTkMJMHgwMDQwCi0KLSNkZWZpbmUJREFUQV8xCQk4Ci0jZGVmaW5lCURBVEFfMgkJMTAKLSNkZWZpbmUJSU5URVJSVVBUCTEyCi0KLSNkZWZpbmUgSU5UX01BU0sJMTMKLSNkZWZpbmUgSU1fUkNWX0lOVAkweDEKLSNkZWZpbmUJSU1fVFhfSU5UCTB4MgotI2RlZmluZQlJTV9UWF9FTVBUWV9JTlQJMHg0Ci0jZGVmaW5lCUlNX0FMTE9DX0lOVAkweDgKLSNkZWZpbmUJSU1fUlhfT1ZSTl9JTlQJMHgxMAotI2RlZmluZQlJTV9FUEhfSU5UCTB4MjAKLSNkZWZpbmUJSU1fRVJDVl9JTlQJMHg0MCAvKiBub3Qgb24gU01DOTE5MiAqLwotCi0vKiBCQU5LIDMgKi8KLSNkZWZpbmUJTVVMVElDQVNUMQkwCi0jZGVmaW5lCU1VTFRJQ0FTVDIJMgotI2RlZmluZQlNVUxUSUNBU1QzCTQKLSNkZWZpbmUJTVVMVElDQVNUNAk2Ci0jZGVmaW5lCU1HTVQJCTgKLSNkZWZpbmUJUkVWSVNJT04JMTAgLyogKCBoaTogY2hpcCBpZCAgIGxvdzogcmV2ICMgKSAqLwotCi0KLS8qIHRoaXMgaXMgTk9UIG9uIFNNQzkxOTIgKi8KLSNkZWZpbmUJRVJDVgkJMTIKLQotLyogTm90ZSB0aGF0IDkxOTQgYW5kIDkxOTYgaGF2ZSB0aGUgc21hbWUgY2hpcCBpZCwKLSAqIHRoZSA5MTk2IHdpbGwgaGF2ZSByZXZpc2lvbnMgc3RhcnRpbmcgYXQgNiAqLwotI2RlZmluZSBDSElQXzkxOTAJMwotI2RlZmluZSBDSElQXzkxOTQJNAotI2RlZmluZSBDSElQXzkxOTUJNQotI2RlZmluZSBDSElQXzkxOTYJNAotI2RlZmluZSBDSElQXzkxMTAwCTcKLSNkZWZpbmUgQ0hJUF85MTEwMEZECTgKLQotI2RlZmluZSBSRVZfOTE5Ngk2Ci0KLS8qCi0gKiBUcmFuc21pdCBzdGF0dXMgYml0cwotICovCi0jZGVmaW5lIFRTX1NVQ0NFU1MJMHgwMDAxCi0jZGVmaW5lIFRTX0xPU1RDQVIJMHgwNDAwCi0jZGVmaW5lIFRTX0xBVENPTAkweDAyMDAKLSNkZWZpbmUgVFNfMTZDT0wJMHgwMDEwCi0KLS8qCi0gKiBSZWNlaXZlIHN0YXR1cyBiaXRzCi0gKi8KLSNkZWZpbmUgUlNfQUxHTkVSUgkweDgwMDAKLSNkZWZpbmUgUlNfQkFEQ1JDCTB4MjAwMAotI2RlZmluZSBSU19PRERGUkFNRQkweDEwMDAKLSNkZWZpbmUgUlNfVE9PTE9ORwkweDA4MDAKLSNkZWZpbmUgUlNfVE9PU0hPUlQJMHgwNDAwCi0jZGVmaW5lIFJTX01VTFRJQ0FTVAkweDAwMDEKLSNkZWZpbmUgUlNfRVJST1JTCShSU19BTEdORVJSIHwgUlNfQkFEQ1JDIHwgUlNfVE9PTE9ORyB8IFJTX1RPT1NIT1JUKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIEkgZGVmaW5lIHNvbWUgbWFjcm9zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRvIHNvbWV3aGF0IGNvbW1vbgotICogb3Igc2xpZ2h0bHkgY29tcGxpY2F0ZWQsIHJlcGVhdGVkIHRhc2tzLgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc2VsZWN0IGEgcmVnaXN0ZXIgYmFuaywgMCB0byAzICAqLwotCi0jZGVmaW5lIFNNQ19TRUxFQ1RfQkFOSyh4LCB5KSB7IF9vdXR3KCB5LCB4ICsgQkFOS19TRUxFQ1QgKTsgfQotCi0vKiBkZWZpbmUgYSBzbWFsbCBkZWxheSBmb3IgdGhlIHJlc2V0ICovCi0jZGVmaW5lIFNNQ19ERUxBWSh4KSB7IGludyggeCArIFJDUiApO1wKLQkJCWludyggeCArIFJDUiApO1wKLQkJCWludyggeCArIFJDUiApOyB9Ci0KLQotI2VuZGlmCS8qIF9TTUNfOTAwMF9IXyAqLwotCkluZGV4OiBiL25ldGJvb3Qvc3RkaW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvc3RkaW50LmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBTVERJTlRfSAorI2RlZmluZSBTVERJTlRfSAorLyogCisgKiBJJ20gYXJjaGl0ZWN0dXJlIGRlcGVuZGVkLiBDaGVjayBtZSBiZWZvcmUgcG9ydCBHUlVCCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgICAgICAgICAgIHNpemVfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIHVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKwordHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgaW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICAgaW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgIGludDMyX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICBpbnQ2NF90OworCisjZW5kaWYgLyogU1RESU5UX0ggKi8KSW5kZXg6IGIvbmV0Ym9vdC90ZnRwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdGZ0cC5oCkBAIC0wLDAgKzEsODIgQEAKKyNpZm5kZWYJX1RGVFBfSAorI2RlZmluZQlfVEZUUF9ICisKKyNpbmNsdWRlICJpZl9ldGhlci5oIgorI2luY2x1ZGUgImlwLmgiCisjaW5jbHVkZSAidWRwLmgiCisKKyNpZm5kZWYJTUFYX1RGVFBfUkVUUklFUworI2RlZmluZSBNQVhfVEZUUF9SRVRSSUVTCTIwCisjZW5kaWYKKworLyogVGhlc2Ugc2V0dGluZ3MgaGF2ZSBzZW5zZSBvbmx5IGlmIGNvbXBpbGVkIHdpdGggLURDT05HRVNURUQgKi8KKy8qIHRvdGFsIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgaW4gdGlja3MgKi8KKyNkZWZpbmUgVEZUUF9USU1FT1VUCQkoMzAqVElDS1NfUEVSX1NFQykKKy8qIHBhY2tldCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGluIHRpY2tzICovCisjZGVmaW5lIFRGVFBfUkVYTVQJCSgzKlRJQ0tTX1BFUl9TRUMpCisKKyNkZWZpbmUgVEZUUF9QT1JUCTY5CisjZGVmaW5lCVRGVFBfREVGQVVMVFNJWkVfUEFDS0VUCTUxMgorI2RlZmluZQlURlRQX01BWF9QQUNLRVQJCTE0MzIgLyogNTEyICovCisKKyNkZWZpbmUgVEZUUF9SUlEJMQorI2RlZmluZSBURlRQX1dSUQkyCisjZGVmaW5lIFRGVFBfREFUQQkzCisjZGVmaW5lIFRGVFBfQUNLCTQKKyNkZWZpbmUgVEZUUF9FUlJPUgk1CisjZGVmaW5lIFRGVFBfT0FDSwk2CisKKyNkZWZpbmUgVEZUUF9DT0RFX0VPRgkxCisjZGVmaW5lIFRGVFBfQ09ERV9NT1JFCTIKKyNkZWZpbmUgVEZUUF9DT0RFX0VSUk9SCTMKKyNkZWZpbmUgVEZUUF9DT0RFX0JPT1QJNAorI2RlZmluZSBURlRQX0NPREVfQ0ZHCTUKKworc3RydWN0IHRmdHBfdCB7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXVpbnQxNl90IG9wY29kZTsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgcnJxW1RGVFBfREVGQVVMVFNJWkVfUEFDS0VUXTsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGJsb2NrOworCQkJdWludDhfdCAgZG93bmxvYWRbVEZUUF9NQVhfUEFDS0VUXTsKKwkJfSBkYXRhOworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgYmxvY2s7CisJCX0gYWNrOworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgZXJyY29kZTsKKwkJCXVpbnQ4X3QgIGVycm1zZ1tURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVF07CisJCX0gZXJyOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCAgZGF0YVtURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVCsyXTsKKwkJfSBvYWNrOworCX0gdTsKK307CisKKy8qIGRlZmluZSBhIHNtYWxsZXIgdGZ0cCBwYWNrZXQgc29sZWx5IGZvciBtYWtpbmcgcmVxdWVzdHMgdG8gY29uc2VydmUgc3RhY2sKKyAgIDUxMiBieXRlcyBzaG91bGQgYmUgZW5vdWdoICovCitzdHJ1Y3QgdGZ0cHJlcV90IHsKKwlzdHJ1Y3QgaXBoZHIgaXA7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJdWludDE2X3Qgb3Bjb2RlOworCXVuaW9uIHsKKwkJdWludDhfdCBycnFbNTEyXTsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGJsb2NrOworCQl9IGFjazsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGVycmNvZGU7CisJCQl1aW50OF90ICBlcnJtc2dbNTEyLTJdOworCQl9IGVycjsKKwl9IHU7Cit9OworCisjZGVmaW5lIFRGVFBfTUlOX1BBQ0tFVAkoc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyA0KQorCit0eXBlZGVmIGludCAoKnJlYWRfYWN0b3JfdCkodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KTsKKworaW50IHRmdHBfZmlsZV9yZWFkKGNvbnN0IGNoYXIgKm5hbWUsIHJlYWRfYWN0b3JfdCk7CisKKyNlbmRpZgkvKiBfVEZUUF9IICovCkluZGV4OiBiL25ldGJvb3QvdGczLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdGczLmMKQEAgLTAsMCArMSwzMzIyIEBACisvKiAkSWQ6IGdydWItMC45NS1kaXNrbGVzcy1wYXRjaC0yLnBhdGNoLHYgMS4xLjEuMSAyMDA1LzA2LzE0IDA4OjE4OjUwIHdlc29sb3dzIEV4cCAkCisgKiB0ZzMuYzogQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgR2FyemlrIChqZ2FyemlrQG1hbmRyYWtlc29mdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRXJpYyBCaWVkZXJtYW4gKGViaWVkZXJtYW5AbG54aS5jb20pICBbZXRoZXJib290IHBvcnRdCisgKi8KKworLyogMTEtMTMtMjAwMwl0aW1sZWdnZQlGaXggSXNzdWUgd2l0aCBOZXRHZWFyIEdBMzAyVCAKKyAqIDExLTE4LTIwMDMgICBlYmllZGVybSAgICAgICAgR2VuZXJhbGl6ZSBOZXRHZWFyIEZpeCB0byB3aGF0IHRoZSBjb2RlIHdhcyBzdXBwb3NlZCB0byBiZS4KKyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKy8qI2luY2x1ZGUgInN0cmluZy5oIiovCisjaW5jbHVkZSAidGczLmgiCisKKyNkZWZpbmUgU1VQUE9SVF9DT1BQRVJfUEhZICAxCisjZGVmaW5lIFNVUFBPUlRfRklCRVJfUEhZICAgMQorI2RlZmluZSBTVVBQT1JUX0xJTktfUkVQT1JUIDEKKyNkZWZpbmUgU1VQUE9SVF9QQVJUTk9fU1RSICAxCisjZGVmaW5lIFNVUFBPUlRfUEhZX1NUUiAgICAgMQorCitzdHJ1Y3QgdGczIHRnMzsKKworLyogRHVtbXkgZGVmaW5lcyBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyNkZWZpbmUgRUJVU1kgIDEKKyNkZWZpbmUgRU5PREVWIDIKKyNkZWZpbmUgRUlOVkFMIDMKKyNkZWZpbmUgRU5PTUVNIDQKKworCisvKiBUaGVzZSBudW1iZXJzIHNlZW0gdG8gYmUgaGFyZCBjb2RlZCBpbiB0aGUgTklDIGZpcm13YXJlIHNvbWVob3cuCisgKiBZb3UgY2FuJ3QgY2hhbmdlIHRoZSByaW5nIHNpemVzLCBidXQgeW91IGNhbiBjaGFuZ2Ugd2hlcmUgeW91IHBsYWNlCisgKiB0aGVtIGluIHRoZSBOSUMgb25ib2FyZCBtZW1vcnkuCisgKi8KKyNkZWZpbmUgVEczX1JYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFRHM19ERUZfUlhfUklOR19QRU5ESU5HCQkyMAkvKiBSWF9SSU5HX1BFTkRJTkcgc2VlbXMgdG8gYmUgby5rLiBhdCAyMCBhbmQgMjAwICovCisjZGVmaW5lIFRHM19SWF9SQ0JfUklOR19TSVpFCTEwMjQKKworLyoJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ID8gXAorCSA1MTIgOiAxMDI0KSAqLworICNkZWZpbmUgVEczX1RYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFRHM19ERUZfVFhfUklOR19QRU5ESU5HCQkoVEczX1RYX1JJTkdfU0laRSAtIDEpCisKKyNkZWZpbmUgVEczX1JYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjKSAqIFRHM19SWF9SSU5HX1NJWkUpCisjZGVmaW5lIFRHM19SWF9SQ0JfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogVEczX1JYX1JDQl9SSU5HX1NJWkUpCisKKyNkZWZpbmUgVEczX1RYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjKSAqIFRHM19UWF9SSU5HX1NJWkUpCisjZGVmaW5lIE5FWFRfVFgoTikJCSgoKE4pICsgMSkgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1RYKE4pCQkoKChOKSAtIDEpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIDIgKyA2NCkKKworCitzdGF0aWMgc3RydWN0IGJzcyB7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyByeF9zdGRbVEczX1JYX1JJTkdfU0laRV07CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyByeF9yY2JbVEczX1JYX1JDQl9SSU5HX1NJWkVdOworCXN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MgdHhfcmluZ1tURzNfVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cyAgICAgIGh3X3N0YXR1czsKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzICAgICAgIGh3X3N0YXRzOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgcnhfYnVmc1tURzNfREVGX1JYX1JJTkdfUEVORElOR11bUlhfUEtUX0JVRl9TWl07Cit9IHRnM19ic3M7CisKKy8qKgorICogcGNpX3NhdmVfc3RhdGUgLSBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZworICogQGRldjogLSBQQ0kgZGV2aWNlIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoCisgKiBAYnVmZmVyOiAtIGJ1ZmZlciB0byBob2xkIGNvbmZpZyBzcGFjZSBjb250ZXh0CisgKgorICogQGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgUENJIDIuMiBjb25maWcgc3BhY2UgCisgKiAoPj0gNjQgYnl0ZXMpLgorICovCitzdGF0aWMgaW50IHBjaV9zYXZlX3N0YXRlKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVpbnQzMl90ICpidWZmZXIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGkgKiA0LCZidWZmZXJbaV0pOworCXJldHVybiAwOworfQorCisvKiogCisgKiBwY2lfcmVzdG9yZV9zdGF0ZSAtIFJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQorICogQGRldjogLSBQQ0kgZGV2aWNlIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoCisgKiBAYnVmZmVyOiAtIHNhdmVkIFBDSSBjb25maWcgc3BhY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgcGNpX3Jlc3RvcmVfc3RhdGUoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdWludDMyX3QgKmJ1ZmZlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldixpICogNCwgYnVmZmVyW2ldKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGczX3dyaXRlX2luZGlyZWN0X3JlZzMyKHVpbnQzMl90IG9mZiwgdWludDMyX3QgdmFsKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9SRUdfQkFTRV9BRERSLCBvZmYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9SRUdfREFUQSwgdmFsKTsKK30KKworI2RlZmluZSB0dzMyKHJlZyx2YWwpCQl0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIoKHJlZyksKHZhbCkpCisjZGVmaW5lIHR3MzJfbWFpbGJveChyZWcsIHZhbCkJd3JpdGVsKCgodmFsKSAmIDB4ZmZmZmZmZmYpLCB0ZzMucmVncyArIChyZWcpKQorI2RlZmluZSB0dzE2KHJlZyx2YWwpCQl3cml0ZXcoKCh2YWwpICYgMHhmZmZmKSwgdGczLnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHc4KHJlZyx2YWwpCQl3cml0ZWIoKCh2YWwpICYgMHhmZiksIHRnMy5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyMzIocmVnKQkJcmVhZGwodGczLnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHIxNihyZWcpCQlyZWFkdyh0ZzMucmVncyArIChyZWcpKQorI2RlZmluZSB0cjgocmVnKQkJcmVhZGIodGczLnJlZ3MgKyAocmVnKSkKKworc3RhdGljIHZvaWQgdHczMl9jYXJlZnVsbHkodWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJdHczMihyZWcsIHZhbCk7CisJdHIzMihyZWcpOworCXVkZWxheSgxMDApOworfQorCitzdGF0aWMgdm9pZCB0dzMyX21haWxib3gyKHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCXR3MzJfbWFpbGJveChyZWcsIHZhbCk7CisJdHIzMihyZWcpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfbWVtKHVpbnQzMl90IG9mZiwgdWludDMyX3QgdmFsKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgb2ZmKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCisJLyogQWx3YXlzIGxlYXZlIHRoaXMgYXMgemVyby4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworfQorCitzdGF0aWMgdm9pZCB0ZzNfcmVhZF9tZW0odWludDMyX3Qgb2ZmLCB1aW50MzJfdCAqdmFsKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgb2ZmKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0RBVEEsIHZhbCk7CisKKwkvKiBBbHdheXMgbGVhdmUgdGhpcyBhcyB6ZXJvLiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19kaXNhYmxlX2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJICAgICAodHAtPm1pc2NfaG9zdF9jdHJsIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CisJdHczMl9tYWlsYm94MihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIDB4MDAwMDAwMDEpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc3dpdGNoX2Nsb2NrcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBvcmlnX2Nsb2NrX2N0cmwsIGNsb2NrX2N0cmw7CisKKwljbG9ja19jdHJsID0gdHIzMihURzNQQ0lfQ0xPQ0tfQ1RSTCk7CisKKwlvcmlnX2Nsb2NrX2N0cmwgPSBjbG9ja19jdHJsOworCWNsb2NrX2N0cmwgJj0gKENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOIHwgQ0xPQ0tfQ1RSTF9DTEtSVU5fT0VOQUJMRSB8IDB4MWYpOworCXRwLT5wY2lfY2xvY2tfY3RybCA9IGNsb2NrX2N0cmw7CisJCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkJKG9yaWdfY2xvY2tfY3RybCAmIENMT0NLX0NUUkxfNDRNSFpfQ09SRSkhPTApIHsKKwkJdHczMl9jYXJlZnVsbHkoVEczUENJX0NMT0NLX0NUUkwsIAorCQkJY2xvY2tfY3RybCB8IChDTE9DS19DVFJMXzQ0TUhaX0NPUkUgfCBDTE9DS19DVFJMX0FMVENMSykpOworCQl0dzMyX2NhcmVmdWxseShURzNQQ0lfQ0xPQ0tfQ1RSTCwgCisJCQljbG9ja19jdHJsIHwgKENMT0NLX0NUUkxfQUxUQ0xLKSk7CisJfQorCXR3MzJfY2FyZWZ1bGx5KFRHM1BDSV9DTE9DS19DVFJMLCBjbG9ja19jdHJsKTsKK30KKworI2RlZmluZSBQSFlfQlVTWV9MT09QUwk1MDAwCisKK3N0YXRpYyBpbnQgdGczX3JlYWRwaHkoc3RydWN0IHRnMyAqdHAsIGludCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisJdWludDMyX3QgZnJhbWVfdmFsOworCWludCBsb29wcywgcmV0OworCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlICYgfk1BQ19NSV9NT0RFX0FVVE9fUE9MTCk7CisKKwkqdmFsID0gMHhmZmZmZmZmZjsKKworCWZyYW1lX3ZhbCAgPSAoKFBIWV9BRERSIDw8IE1JX0NPTV9QSFlfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUEhZX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9ICgocmVnIDw8IE1JX0NPTV9SRUdfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUkVHX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9IChNSV9DT01fQ01EX1JFQUQgfCBNSV9DT01fU1RBUlQpOworCQorCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9DT00sIGZyYW1lX3ZhbCk7CisKKwlsb29wcyA9IFBIWV9CVVNZX0xPT1BTOworCXdoaWxlIChsb29wcy0tID4gMCkgeworCQl1ZGVsYXkoMTApOworCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCisJCWlmICgoZnJhbWVfdmFsICYgTUlfQ09NX0JVU1kpID09IDApIHsKKwkJCXVkZWxheSg1KTsKKwkJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldCA9IC1FQlVTWTsKKwlpZiAobG9vcHMgPiAwKSB7CisJCSp2YWwgPSBmcmFtZV92YWwgJiBNSV9DT01fREFUQV9NQVNLOworCQlyZXQgPSAwOworCX0KKworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRnM193cml0ZXBoeShzdHJ1Y3QgdGczICp0cCwgaW50IHJlZywgdWludDMyX3QgdmFsKQoreworCXVpbnQzMl90IGZyYW1lX3ZhbDsKKwlpbnQgbG9vcHMsIHJldDsKKworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpOworCisJZnJhbWVfdmFsICA9ICgoUEhZX0FERFIgPDwgTUlfQ09NX1BIWV9BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9QSFlfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKChyZWcgPDwgTUlfQ09NX1JFR19BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9SRUdfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKHZhbCAmIE1JX0NPTV9EQVRBX01BU0spOworCWZyYW1lX3ZhbCB8PSAoTUlfQ09NX0NNRF9XUklURSB8IE1JX0NPTV9TVEFSVCk7CisJCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX0NPTSwgZnJhbWVfdmFsKTsKKworCWxvb3BzID0gUEhZX0JVU1lfTE9PUFM7CisJd2hpbGUgKGxvb3BzLS0gPiAwKSB7CisJCXVkZWxheSgxMCk7CisJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisJCWlmICgoZnJhbWVfdmFsICYgTUlfQ09NX0JVU1kpID09IDApIHsKKwkJCXVkZWxheSg1KTsKKwkJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldCA9IC1FQlVTWTsKKwlpZiAobG9vcHMgPiAwKQorCQlyZXQgPSAwOworCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX3dyaXRlZHNwKHN0cnVjdCB0ZzMgKnRwLCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCB2YWwpCit7CisJaW50IGVycjsKKwllcnIgID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCBhZGRyKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCB2YWwpOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgdGczX3BoeV9zZXRfd2lyZXNwZWVkKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHZhbDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEKQorCQlyZXR1cm47CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NzAwNyk7CisJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZ2YWwpOworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgKHZhbCB8ICgxIDw8IDE1KSB8ICgxIDw8IDQpKSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX2JtY3JfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgcGh5X2NvbnRyb2w7CisJaW50IGxpbWl0LCBlcnI7CisKKwkvKiBPSywgcmVzZXQgaXQsIGFuZCBwb2xsIHRoZSBCTUNSX1JFU0VUIGJpdCB1bnRpbCBpdAorCSAqIGNsZWFycyBvciB3ZSB0aW1lIG91dC4KKwkgKi8KKwlwaHlfY29udHJvbCA9IEJNQ1JfUkVTRVQ7CisJZXJyID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgcGh5X2NvbnRyb2wpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWxpbWl0ID0gNTAwMDsKKwl3aGlsZSAobGltaXQtLSkgeworCQllcnIgPSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZwaHlfY29udHJvbCk7CisJCWlmIChlcnIgIT0gMCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKChwaHlfY29udHJvbCAmIEJNQ1JfUkVTRVQpID09IDApIHsKKwkJCXVkZWxheSg0MCk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobGltaXQgPD0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM193YWl0X21hY3JvX2RvbmUoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGxpbWl0ID0gMTAwOworCisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJdWludDMyX3QgdG1wMzI7CisKKwkJdGczX3JlYWRwaHkodHAsIDB4MTYsICZ0bXAzMik7CisJCWlmICgodG1wMzIgJiAweDEwMDApID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGxpbWl0IDw9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X3dyaXRlX2FuZF9jaGVja190ZXN0cGF0KHN0cnVjdCB0ZzMgKnRwLCBpbnQgKnJlc2V0cCkKK3sKKwlzdGF0aWMgY29uc3QgdWludDMyX3QgdGVzdF9wYXRbNF1bNl0gPSB7CisJeyAweDAwMDA1NTU1LCAweDAwMDAwMDA1LCAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzNDU2LCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzMzMzLCAweDAwMDAwMDAzLCAweDAwMDA3ODlhLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMDA1YTVhLCAweDAwMDAwMDA1LCAweDAwMDAyYTZhLCAweDAwMDAwMDBhLCAweDAwMDAxYmNkLCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYTVhLCAweDAwMDAwMDBhLCAweDAwMDAzM2MzLCAweDAwMDAwMDAzLCAweDAwMDAyZWYxLCAweDAwMDAwMDA1IH0KKwl9OworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkoY2hhbiAqIDB4MjAwMCkgfCAweDAyMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMik7CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwKKwkJCQl0ZXN0X3BhdFtjaGFuXVtpXSk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAyMDIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCSpyZXNldHAgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCSAgICAgKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwODIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCSpyZXNldHAgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwODAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCQl1aW50MzJfdCBsb3csIGhpZ2g7CisKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmbG93KTsKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmaGlnaCk7CisJCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCQkqcmVzZXRwID0gMTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJbG93ICY9IDB4N2ZmZjsKKwkJCWhpZ2ggJj0gMHgwMDBmOworCQkJaWYgKGxvdyAhPSB0ZXN0X3BhdFtjaGFuXVtpXSB8fAorCQkJICAgIGhpZ2ggIT0gdGVzdF9wYXRbY2hhbl1baSsxXSkgeworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDBiKTsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4NDAwMSk7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDQwMDUpOworCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19waHlfcmVzZXRfY2hhbnBhdChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgY2hhbjsKKworCWZvciAoY2hhbiA9IDA7IGNoYW4gPCA0OyBjaGFuKyspIHsKKwkJaW50IGk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLAorCQkJICAgICAoY2hhbiAqIDB4MjAwMCkgfCAweDAyMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAyMDIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19waHlfcmVzZXRfNTcwM180XzUoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgcmVnMzIsIHBoeTlfb3JpZzsKKwlpbnQgcmV0cmllcywgZG9fcGh5X3Jlc2V0LCBlcnI7CisKKwlyZXRyaWVzID0gMTA7CisJZG9fcGh5X3Jlc2V0ID0gMTsKKwlkbyB7CisJCWlmIChkb19waHlfcmVzZXQpIHsKKwkJCWVyciA9IHRnM19ibWNyX3Jlc2V0KHRwKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWRvX3BoeV9yZXNldCA9IDA7CisJCX0KKwkJCisJCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIgYW5kIGludGVycnVwdC4gICovCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcmVnMzIpOworCQlyZWczMiB8PSAweDMwMDA7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOworCisJCS8qIFNldCBmdWxsLWR1cGxleCwgMTAwMCBtYnBzLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwKKwkJCUJNQ1JfRlVMTERQTFggfCBURzNfQk1DUl9TUEVFRDEwMDApOworCisJCS8qIFNldCB0byBtYXN0ZXIgbW9kZS4gICovCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0NUUkwsICZwaHk5X29yaWcpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwKKwkJCShNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQlNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUikpOworCisJCS8qIEVuYWJsZSBTTV9EU1BfQ0xPQ0sgYW5kIDZkQi4gICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKKworCQkvKiBCbG9jayB0aGUgUEhZIGNvbnRyb2wgYWNjZXNzLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDUpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDgwMCk7CisKKwkJZXJyID0gdGczX3BoeV93cml0ZV9hbmRfY2hlY2tfdGVzdHBhdCh0cCwgJmRvX3BoeV9yZXNldCk7CisJCWlmICghZXJyKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1yZXRyaWVzKTsKKworCWVyciA9IHRnM19waHlfcmVzZXRfY2hhbnBhdCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA1KTsKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDAwMCk7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODIwMCk7CisJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwMDApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIHBoeTlfb3JpZyk7CisKKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnJlZzMyKTsKKwlyZWczMiAmPSB+MHgzMDAwOworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOworCisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyB3aWxsIHJlc2V0IHRoZSB0aWdvbjMgUEhZIGlmIHRoZXJlIGlzIG5vIHZhbGlkCisgKiBsaW5rLgorICovCitzdGF0aWMgaW50IHRnM19waHlfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgcGh5X3N0YXR1czsKKwlpbnQgZXJyOworCisJZXJyICA9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnBoeV9zdGF0dXMpOworCWVyciB8PSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZwaHlfc3RhdHVzKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHx8CisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkpIHsKKwkJZXJyID0gdGczX3BoeV9yZXNldF81NzAzXzRfNSh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gdGczX2JtY3JfcmVzZXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7Cisgb3V0OgorCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfcG93ZXJfc3RhdGVfMChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MTZfdCBwb3dlcl9jb250cm9sOworCWludCBwbSA9IHRwLT5wbV9jYXA7CisKKwkvKiBNYWtlIHN1cmUgcmVnaXN0ZXIgYWNjZXNzZXMgKGluZGlyZWN0IG9yIG90aGVyd2lzZSkKKwkgKiB3aWxsIGZ1bmN0aW9uIGNvcnJlY3RseS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCAgVEczUENJX01JU0NfSE9TVF9DVFJMLCB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIHBtICsgUENJX1BNX0NUUkwsICZwb3dlcl9jb250cm9sKTsKKworCXBvd2VyX2NvbnRyb2wgfD0gUENJX1BNX0NUUkxfUE1FX1NUQVRVUzsKKwlwb3dlcl9jb250cm9sICY9IH4oUENJX1BNX0NUUkxfU1RBVEVfTUFTSyk7CisJcG93ZXJfY29udHJvbCB8PSAwOworCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgcG93ZXJfY29udHJvbCk7CisKKwl0dzMyX2NhcmVmdWxseShHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKworCXJldHVybjsKK30KKworCisjaWYgU1VQUE9SVF9MSU5LX1JFUE9SVAorc3RhdGljIHZvaWQgdGczX2xpbmtfcmVwb3J0KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICghdHAtPmNhcnJpZXJfb2spIHsKKwkJcHJpbnRmKCJMaW5rIGlzIGRvd24uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkxpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LiAlcyAlcyAlc1xuIiwKKwkJCSh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgPworCQkJICAgICAgIDEwMDAgOgorCQkJKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwID8KKwkJCQkxMDAgOiAxMCkpLAorCQkJKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9GVUxMID8gIAorCQkJCSJmdWxsIiA6ICJoYWxmIiksCisJCQkodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKSA/ICJUWCIgOiAiIiwKKwkJCSh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpID8gIlJYIiA6ICIiLAorCQkJKHRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfVFhfUEFVU0UgfFRHM19GTEFHX1JYX1BBVVNFKSkgPyAiZmxvdyBjb250cm9sIiA6ICIiKTsKKwl9Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfbGlua19yZXBvcnQodHApCisjZW5kaWYKKworc3RhdGljIHZvaWQgdGczX3NldHVwX2Zsb3dfY29udHJvbChzdHJ1Y3QgdGczICp0cCwgdWludDMyX3QgbG9jYWxfYWR2LCB1aW50MzJfdCByZW1vdGVfYWR2KQoreworCXVpbnQzMl90IG5ld190ZzNfZmxhZ3MgPSAwOworCisJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCQlpZiAocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApCisJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgVEczX0ZMQUdfVFhfUEFVU0UpOworCQkJZWxzZSBpZiAocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9BU1lNKQorCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJKFRHM19GTEFHX1JYX1BBVVNFKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkKKwkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCShURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSBURzNfRkxBR19UWF9QQVVTRSk7CisJCX0KKwl9IGVsc2UgaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCWlmICgocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApICYmCisJCSAgICAocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9BU1lNKSkKKwkJCW5ld190ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVFhfUEFVU0U7CisJfQorCisJdHAtPnRnM19mbGFncyAmPSB+KFRHM19GTEFHX1JYX1BBVVNFIHwgVEczX0ZMQUdfVFhfUEFVU0UpOworCXRwLT50ZzNfZmxhZ3MgfD0gbmV3X3RnM19mbGFnczsKKworCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpCisJCXRwLT5yeF9tb2RlIHw9IFJYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisKKwlpZiAobmV3X3RnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKQorCQl0cC0+dHhfbW9kZSB8PSBUWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisJZWxzZQorCQl0cC0+dHhfbW9kZSAmPSB+VFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworfQorCisjaWYgU1VQUE9SVF9DT1BQRVJfUEhZCitzdGF0aWMgdm9pZCB0ZzNfYXV4X3N0YXRfdG9fc3BlZWRfZHVwbGV4KAorCXN0cnVjdCB0ZzMgKnRwIF9fdW51c2VkLCB1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKnNwZWVkLCB1aW50OF90ICpkdXBsZXgpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWFwW10gPSB7CisJCVswXSA9IChTUEVFRF9JTlZBTElEIDw8IDIpIHwgRFVQTEVYX0lOVkFMSUQsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwSEFMRiA+PiA4XSAgID0gKFNQRUVEXzEwIDw8IDIpIHwgRFVQTEVYX0hBTEYsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwRlVMTCA+PiA4XSAgID0gKFNQRUVEXzEwIDw8IDIpIHwgRFVQTEVYX0ZVTEwsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwMEhBTEYgPj4gOF0gID0gKFNQRUVEXzEwMCA8PCAyKSB8IERVUExFWF9IQUxGLAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMDBfNCA+PiA4XSA9IChTUEVFRF9JTlZBTElEIDw8IDIpIHwgRFVQTEVYX0lOVkFMSUQsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwMEZVTEwgPj4gOF0gID0gKFNQRUVEXzEwMCA8PCAyKSB8IERVUExFWF9GVUxMLAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMDAwSEFMRiA+PiA4XSA9IChTUEVFRF8xMDAwIDw8IDIpIHwgRFVQTEVYX0hBTEYsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMID4+IDhdID0gKFNQRUVEXzEwMDAgPDwgMikgfCBEVVBMRVhfRlVMTCwKKwl9OworCXVpbnQ4X3QgcmVzdWx0OworCXJlc3VsdCA9IG1hcFsodmFsICYgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLKSA+PiA4XTsKKwkqc3BlZWQgPSByZXN1bHQgPj4gMjsKKwkqZHVwbGV4ID0gcmVzdWx0ICYgMzsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X2NvcHBlcl9iZWdpbihzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBuZXdfYWR2OworCisJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0KKwkJKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfQXV0b25lZyB8IEFEVkVSVElTRURfTUlJKTsKKwkKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmPQorCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisJfQorCQorCW5ld19hZHYgPSAoQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpIHsKKwkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCX0KKwlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpIHsKKwkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCX0KKwlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKSB7CisJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJfQorCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpIHsKKwkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwl9CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKwkKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYKKwkJKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKSkgeworCQluZXdfYWR2ID0gMDsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpIHsKKwkJCW5ld19hZHYgfD0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEY7CisJCX0KKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpIHsKKwkJCW5ld19hZHYgfD0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEw7CisJCX0KKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSAmJgorCQkJKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCQkJdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApKSB7CisJCQluZXdfYWR2IHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQlNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUik7CisJCX0KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIG5ld19hZHYpOworCX0gZWxzZSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKwl9CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX2luaXRfNTQwMXBoeV9kc3Aoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCS8qIFR1cm4gb2ZmIHRhcCBwb3dlciBtYW5hZ2VtZW50LiAqLworCWVyciAgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMyMCk7CisJCisJZXJyIHw9IHRnM193cml0ZWRzcCh0cCwgMHgwMDEyLCAweDE4MDQpOworCWVyciB8PSB0ZzNfd3JpdGVkc3AodHAsIDB4MDAxMywgMHgxMjA0KTsKKwllcnIgfD0gdGczX3dyaXRlZHNwKHRwLCAweDgwMDYsIDB4MDEzMik7CisJZXJyIHw9IHRnM193cml0ZWRzcCh0cCwgMHg4MDA2LCAweDAyMzIpOworCWVyciB8PSB0ZzNfd3JpdGVkc3AodHAsIDB4MjAxZiwgMHgwYTIwKTsKKworCXVkZWxheSg0MCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9jb3BwZXJfcGh5KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBjdXJyZW50X2xpbmtfdXA7CisJdWludDMyX3QgYm1zciwgZHVtbXk7CisJaW50IGksIGVycjsKKworCXR3MzJfY2FyZWZ1bGx5KE1BQ19TVEFUVVMsCisJCShNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8IE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDAyKTsKKworCS8qIFNvbWUgdGhpcmQtcGFydHkgUEhZcyBuZWVkIHRvIGJlIHJlc2V0IG9uIGxpbmsgZ29pbmcKKwkgKiBkb3duLgorCSAqLworCWlmICgJKAkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHx8CisJCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHx8CisJCQkodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTApKSAmJgorCQkodHAtPmNhcnJpZXJfb2spKSB7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKCEoYm1zciAmIEJNU1JfTFNUQVRVUykpCisJCQl0ZzNfcGh5X3Jlc2V0KHRwKTsKKwl9CisKKwlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpIHsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJCWJtc3IgPSAwOworCisJCWlmICghKGJtc3IgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQkJCXVkZWxheSgxMCk7CisJCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCQkJaWYgKGJtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQkJdWRlbGF5KDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfUkVWX01BU0spID09IFBIWV9SRVZfQkNNNTQwMV9CMCAmJgorCQkJICAgICEoYm1zciAmIEJNU1JfTFNUQVRVUykgJiYKKwkJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQllcnIgPSB0ZzNfcGh5X3Jlc2V0KHRwKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCSAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CisJCS8qIDU3MDEge0EwLEIwfSBDUkMgYnVnIHdvcmthcm91bmQgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDBhNzUpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCX0KKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4uLiAqLworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0lNQVNLLCB+MCk7CisKKwlpZiAodHAtPmxlZF9tb2RlID09IGxlZF9tb2RlX3RocmVlX2xpbmspCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwKKwkJCSAgICAgTUlJX1RHM19FWFRfQ1RSTF9MTkszX0xFRF9NT0RFKTsKKwllbHNlCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgMCk7CisKKwljdXJyZW50X2xpbmtfdXAgPSAwOworCisJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisKKwlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQl1aW50MzJfdCBhdXhfc3RhdCwgYm1jcjsKKworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KTsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9TVEFULCAmYXV4X3N0YXQpOworCQkJaWYgKGF1eF9zdGF0KQorCQkJCWJyZWFrOworCQl9CisKKwkJdGczX2F1eF9zdGF0X3RvX3NwZWVkX2R1cGxleCh0cCwgYXV4X3N0YXQsCisJCQkmdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCwKKwkJCSZ0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCk7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwkJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCQl1aW50MzJfdCBnaWdfY3RybDsKKwkJCQorCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCQorCQkJLyogRm9yY2UgYXV0b25lZyByZXN0YXJ0IGlmIHdlIGFyZSBleGl0aW5nCisJCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJCSAqLworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJmdpZ19jdHJsKTsKKwkJCWlmICghKGdpZ19jdHJsICYgKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCQkgICAgICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTCkpKSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCX0KKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEgJiYKKwkJKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworCQl1aW50MzJfdCBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9BRFZFUlRJU0UsICZsb2NhbF9hZHYpOworCQlsb2NhbF9hZHYgJj0gKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9MUEEsICZyZW1vdGVfYWR2KTsKKwkJcmVtb3RlX2FkdiAmPSAoTFBBX1BBVVNFX0NBUCB8IExQQV9QQVVTRV9BU1lNKTsKKworCQkvKiBJZiB3ZSBhcmUgbm90IGFkdmVydGlzaW5nIGZ1bGwgcGF1c2UgY2FwYWJpbGl0eSwKKwkJICogc29tZXRoaW5nIGlzIHdyb25nLiAgQnJpbmcgdGhlIGxpbmsgZG93biBhbmQgcmVjb25maWd1cmUuCisJCSAqLworCQlpZiAobG9jYWxfYWR2ICE9IEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCX0gZWxzZSB7CisJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCQl9CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCA9PSAwKSB7CisJCXVpbnQzMl90IHRtcDsKKworCQl0ZzNfcGh5X2NvcHBlcl9iZWdpbih0cCk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJaWYgKHRtcCAmIEJNU1JfTFNUQVRVUykKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEpIHsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CisJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCWVsc2UKKwkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwl9IGVsc2UKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHsKKwkJaWYgKCh0cC0+bGVkX21vZGUgPT0gbGVkX21vZGVfbGluazEwKSB8fAorCQkgICAgKGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJCSAgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMCkpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwl9IGVsc2UgeworCQlpZiAoY3VycmVudF9saW5rX3VwID09IDEpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJdHczMihNQUNfTEVEX0NUUkwsIExFRF9DVFJMX1BIWV9NT0RFXzEpOworCX0KKworCS8qID8/PyBXaXRob3V0IHRoaXMgc2V0dGluZyBOZXRnZWFyIEdBMzAyVCBQSFkgZG9lcyBub3QKKwkgKiA/Pz8gc2VuZC9yZWNlaXZlIHBhY2tldHMuLi4KKwkgKiBXaXRoIHRoaXMgb3RoZXIgUEhZcyBjYW5ub3QgYnJpbmcgdXAgdGhlIGxpbmsKKwkgKi8KKwlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MTEgJiYKKwkJdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDBfQUxUSU1BKSB7CisJCXRwLT5taV9tb2RlIHw9IE1BQ19NSV9NT0RFX0FVVE9fUE9MTDsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwl9CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCS8qIExpbmsgY2hhbmdlIHBvbGxlZC4gKi8KKwl0dzMyX2NhcmVmdWxseShNQUNfRVZFTlQsIDApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwICYmCisJICAgIGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpIHx8CisJICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEKSkpIHsKKwkJdWRlbGF5KDEyMCk7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19TVEFUVVMsCisJCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXRnM193cml0ZV9tZW0oCisJCQkgICAgICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzIpOworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgIT0gdHAtPmNhcnJpZXJfb2spIHsKKwkJdHAtPmNhcnJpZXJfb2sgPSBjdXJyZW50X2xpbmtfdXA7CisJCXRnM19saW5rX3JlcG9ydCh0cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfc2V0dXBfY29wcGVyX3BoeShUUCkgKC1FSU5WQUwpCisjZW5kaWYgLyogU1VQUE9SVF9DT1BQRVJfUEhZICovCisKKyNpZiBTVVBQT1JUX0ZJQkVSX1BIWQorc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyB7CisJaW50IHN0YXRlOworI2RlZmluZSBBTkVHX1NUQVRFX1VOS05PV04JCTAKKyNkZWZpbmUgQU5FR19TVEFURV9BTl9FTkFCTEUJCTEKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUX0lOSVQJCTIKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUCQkzCisjZGVmaW5lIEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LCTQKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVF9JTklUCTUKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVAk2CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUCTcKKyNkZWZpbmUgQU5FR19TVEFURV9BQ0tfREVURUNUCQk4CisjZGVmaW5lIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQJOQorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSwkJMTAKKyNkZWZpbmUgQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUCTExCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1QJCTEyCisjZGVmaW5lIEFORUdfU1RBVEVfTElOS19PSwkJMTMKKyNkZWZpbmUgQU5FR19TVEFURV9ORVhUX1BBR0VfV0FJVF9JTklUCTE0CisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVQJMTUKKworCXVpbnQzMl90IGZsYWdzOworI2RlZmluZSBNUl9BTl9FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVJfUkVTVEFSVF9BTgkJMHgwMDAwMDAwMgorI2RlZmluZSBNUl9BTl9DT01QTEVURQkJMHgwMDAwMDAwNAorI2RlZmluZSBNUl9QQUdFX1JYCQkweDAwMDAwMDA4CisjZGVmaW5lIE1SX05QX0xPQURFRAkJMHgwMDAwMDAxMAorI2RlZmluZSBNUl9UT0dHTEVfVFgJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVJfTFBfQURWX0ZVTExfRFVQTEVYCTB4MDAwMDAwNDAKKyNkZWZpbmUgTVJfTFBfQURWX0hBTEZfRFVQTEVYCTB4MDAwMDAwODAKKyNkZWZpbmUgTVJfTFBfQURWX1NZTV9QQVVTRQkweDAwMDAwMTAwCisjZGVmaW5lIE1SX0xQX0FEVl9BU1lNX1BBVVNFCTB4MDAwMDAyMDAKKyNkZWZpbmUgTVJfTFBfQURWX1JFTU9URV9GQVVMVDEJMHgwMDAwMDQwMAorI2RlZmluZSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMgkweDAwMDAwODAwCisjZGVmaW5lIE1SX0xQX0FEVl9ORVhUX1BBR0UJMHgwMDAwMTAwMAorI2RlZmluZSBNUl9UT0dHTEVfUlgJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTVJfTlBfUlgJCTB4MDAwMDQwMDAKKworI2RlZmluZSBNUl9MSU5LX09LCQkweDgwMDAwMDAwCisKKwl1bnNpZ25lZCBsb25nIGxpbmtfdGltZSwgY3VyX3RpbWU7CisKKwl1aW50MzJfdCBhYmlsaXR5X21hdGNoX2NmZzsKKwlpbnQgYWJpbGl0eV9tYXRjaF9jb3VudDsKKworCWNoYXIgYWJpbGl0eV9tYXRjaCwgaWRsZV9tYXRjaCwgYWNrX21hdGNoOworCisJdWludDMyX3QgdHhjb25maWcsIHJ4Y29uZmlnOworI2RlZmluZSBBTkVHX0NGR19OUAkJMHgwMDAwMDA4MAorI2RlZmluZSBBTkVHX0NGR19BQ0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQU5FR19DRkdfUkYyCQkweDAwMDAwMDIwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMQkJMHgwMDAwMDAxMAorI2RlZmluZSBBTkVHX0NGR19QUzIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQU5FR19DRkdfUFMxCQkweDAwMDA4MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0hECQkweDAwMDA0MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0ZECQkweDAwMDAyMDAwCisjZGVmaW5lIEFORUdfQ0ZHX0lOVkFMCQkweDAwMDAxZjA2CisKK307CisjZGVmaW5lIEFORUdfT0sJCTAKKyNkZWZpbmUgQU5FR19ET05FCTEKKyNkZWZpbmUgQU5FR19USU1FUl9FTkFCCTIKKyNkZWZpbmUgQU5FR19GQUlMRUQJLTEKKworI2RlZmluZSBBTkVHX1NUQVRFX1NFVFRMRV9USU1FCTEwMDAwCisKK3N0YXRpYyBpbnQgdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUoc3RydWN0IHRnMyAqdHAsCisJCQkJICAgc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyAqYXApCit7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1aW50MzJfdCByeF9jZmdfcmVnOworCWludCByZXQ7CisKKwlpZiAoYXAtPnN0YXRlID09IEFORUdfU1RBVEVfVU5LTk9XTikgeworCQlhcC0+cnhjb25maWcgPSAwOworCQlhcC0+bGlua190aW1lID0gMDsKKwkJYXAtPmN1cl90aW1lID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCWFwLT5pZGxlX21hdGNoID0gMDsKKwkJYXAtPmFja19tYXRjaCA9IDA7CisJfQorCWFwLT5jdXJfdGltZSsrOworCisJaWYgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSB7CisJCXJ4X2NmZ19yZWcgPSB0cjMyKE1BQ19SWF9BVVRPX05FRyk7CisKKwkJaWYgKHJ4X2NmZ19yZWcgIT0gYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnKSB7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSByeF9jZmdfcmVnOworCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKCsrYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPiAxKSB7CisJCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAxOworCQkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IHJ4X2NmZ19yZWc7CisJCQl9CisJCX0KKwkJaWYgKHJ4X2NmZ19yZWcgJiBBTkVHX0NGR19BQ0spCisJCQlhcC0+YWNrX21hdGNoID0gMTsKKwkJZWxzZQorCQkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCX0gZWxzZSB7CisJCWFwLT5pZGxlX21hdGNoID0gMTsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCXJ4X2NmZ19yZWcgPSAwOworCX0KKworCWFwLT5yeGNvbmZpZyA9IHJ4X2NmZ19yZWc7CisJcmV0ID0gQU5FR19PSzsKKworCXN3aXRjaChhcC0+c3RhdGUpIHsKKwljYXNlIEFORUdfU1RBVEVfVU5LTk9XTjoKKwkJaWYgKGFwLT5mbGFncyAmIChNUl9BTl9FTkFCTEUgfCBNUl9SRVNUQVJUX0FOKSkKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBBTkVHX1NUQVRFX0FOX0VOQUJMRToKKwkJYXAtPmZsYWdzICY9IH4oTVJfQU5fQ09NUExFVEUgfCBNUl9QQUdFX1JYKTsKKwkJaWYgKGFwLT5mbGFncyAmIE1SX0FOX0VOQUJMRSkgeworCQkJYXAtPmxpbmtfdGltZSA9IDA7CisJCQlhcC0+Y3VyX3RpbWUgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJCWFwLT5pZGxlX21hdGNoID0gMDsKKwkJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX1JFU1RBUlRfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX1JFU1RBUlRfSU5JVDoKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKwkJYXAtPmZsYWdzICY9IH4oTVJfTlBfTE9BREVEKTsKKwkJYXAtPnR4Y29uZmlnID0gMDsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIDApOworCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfU0VORF9DT05GSUdTOworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUOgorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s6CisJCXJldCA9IEFORUdfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmZsYWdzICY9IH4oTVJfVE9HR0xFX1RYKTsKKwkJYXAtPnR4Y29uZmlnID0gKEFORUdfQ0ZHX0ZEIHwgQU5FR19DRkdfUFMxKTsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1Q7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJiBhcC0+cnhjb25maWcgIT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQ0tfREVURUNUX0lOSVQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOgorCQlhcC0+dHhjb25maWcgfD0gQU5FR19DRkdfQUNLOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgYXAtPnR4Y29uZmlnKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQ0tfREVURUNUOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1Q6CisJCWlmIChhcC0+YWNrX21hdGNoICE9IDApIHsKKwkJCWlmICgoYXAtPnJ4Y29uZmlnICYgfkFORUdfQ0ZHX0FDSykgPT0KKwkJCSAgICAoYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnICYgfkFORUdfQ0ZHX0FDSykpIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUOworCQkJfSBlbHNlIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcC0+YWJpbGl0eV9tYXRjaCAhPSAwICYmCisJCQkgICBhcC0+cnhjb25maWcgPT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQ6CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19JTlZBTCkgeworCQkJcmV0ID0gQU5FR19GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCQlhcC0+ZmxhZ3MgJj0gfihNUl9MUF9BRFZfRlVMTF9EVVBMRVggfAorCQkJICAgICAgIE1SX0xQX0FEVl9IQUxGX0RVUExFWCB8CisJCQkgICAgICAgTVJfTFBfQURWX1NZTV9QQVVTRSB8CisJCQkgICAgICAgTVJfTFBfQURWX0FTWU1fUEFVU0UgfAorCQkJICAgICAgIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMiB8CisJCQkgICAgICAgTVJfTFBfQURWX05FWFRfUEFHRSB8CisJCQkgICAgICAgTVJfVE9HR0xFX1JYIHwKKwkJCSAgICAgICBNUl9OUF9SWCk7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19GRCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfRlVMTF9EVVBMRVg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19IRCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfSEFMRl9EVVBMRVg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19QUzEpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1NZTV9QQVVTRTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1BTMikKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfQVNZTV9QQVVTRTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1JGMSkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1JGMikKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMjsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX05QKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9ORVhUX1BBR0U7CisKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKworCQlhcC0+ZmxhZ3MgXj0gKE1SX1RPR0dMRV9UWCk7CisJCWlmIChhcC0+cnhjb25maWcgJiAweDAwMDgpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfVE9HR0xFX1JYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfTlApCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTlBfUlg7CisJCWFwLT5mbGFncyB8PSBNUl9QQUdFX1JYOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQ09NUExFVEVfQUNLOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSzoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYKKwkJICAgIGFwLT5yeGNvbmZpZyA9PSAwKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJCWJyZWFrOworCQl9CisJCWRlbHRhID0gYXAtPmN1cl90aW1lIC0gYXAtPmxpbmtfdGltZTsKKwkJaWYgKGRlbHRhID4gQU5FR19TVEFURV9TRVRUTEVfVElNRSkgeworCQkJaWYgKCEoYXAtPmZsYWdzICYgKE1SX0xQX0FEVl9ORVhUX1BBR0UpKSkgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChhcC0+dHhjb25maWcgJiBBTkVHX0NGR19OUCkgPT0gMCAmJgorCQkJCSAgICAhKGFwLT5mbGFncyAmIE1SX05QX1JYKSkgeworCQkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0ID0gQU5FR19GQUlMRUQ7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ6CisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisJCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfU0VORF9DT05GSUdTOworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQkvKiBYWFggYW5vdGhlciBnZW0gZnJvbSB0aGUgQnJvYWRjb20gZHJpdmVyIDooICovCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTElOS19PSzoKKwkJYXAtPmZsYWdzIHw9IChNUl9BTl9DT01QTEVURSB8IE1SX0xJTktfT0spOworCQlyZXQgPSBBTkVHX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUX0lOSVQ6CisJCS8qID8/PyB1bmltcGxlbWVudGVkICovCisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUOgorCQkvKiA/Pz8gdW5pbXBsZW1lbnRlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IEFORUdfRkFJTEVEOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfZmliZXJfcGh5KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG9yaWdfcGF1c2VfY2ZnOworCXVpbnQxNl90IG9yaWdfYWN0aXZlX3NwZWVkOworCXVpbnQ4X3Qgb3JpZ19hY3RpdmVfZHVwbGV4OworCWludCBjdXJyZW50X2xpbmtfdXA7CisJaW50IGk7CisKKwlvcmlnX3BhdXNlX2NmZyA9CisJCSh0cC0+dGczX2ZsYWdzICYgKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkgIFRHM19GTEFHX1RYX1BBVVNFKSk7CisJb3JpZ19hY3RpdmVfc3BlZWQgPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkOworCW9yaWdfYWN0aXZlX2R1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4OworCisJdHAtPm1hY19tb2RlICY9IH4oTUFDX01PREVfUE9SVF9NT0RFX01BU0sgfCBNQUNfTU9ERV9IQUxGX0RVUExFWCk7CisJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkvKiBSZXNldCB3aGVuIGluaXR0aW5nIGZpcnN0IHRpbWUgb3Igd2UgaGF2ZSBhIGxpbmsuICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpIHx8CisJICAgICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkvKiBTZXQgUExMIGxvY2sgcmFuZ2UuICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg4MDA3KTsKKworCQkvKiBTVyByZXNldCAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCQkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwkJbWRlbGF5KDUpOworCisJCS8qIENvbmZpZyBtb2RlOyBzZWxlY3QgUE1BL0NoIDEgcmVncy4gKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDEwLCAweDg0MTEpOworCisJCS8qIEVuYWJsZSBhdXRvLWxvY2sgYW5kIGNvbWRldCwgc2VsZWN0IHR4Y2xrIGZvciB0eC4gKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhMTApOworCisJCXRnM193cml0ZXBoeSh0cCwgMHgxOCwgMHgwMGEwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDQxZmYpOworCisJCS8qIEFzc2VydCBhbmQgZGVhc3NlcnQgUE9SLiAqLworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTMsIDB4MDQwMCk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwMDAwKTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTEsIDB4MGE1MCk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTEwKTsKKworCQkvKiBXYWl0IGZvciBzaWduYWwgdG8gc3RhYmlsaXplICovCisJCW1kZWxheSgxNTApOworCisJCS8qIERlc2VsZWN0IHRoZSBjaGFubmVsIHJlZ2lzdGVyIHNvIHdlIGNhbiByZWFkIHRoZSBQSFlJRAorCQkgKiBsYXRlci4KKwkJICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxMCwgMHg4MDExKTsKKwl9CisKKwkvKiBEaXNhYmxlIGxpbmsgY2hhbmdlIGludGVycnVwdC4gICovCisJdHczMl9jYXJlZnVsbHkoTUFDX0VWRU5ULCAwKTsKKworCWN1cnJlbnRfbGlua191cCA9IDA7CisJaWYgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpIHsKKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCkpIHsKKwkJCXN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gYW5pbmZvOworCQkJaW50IHN0YXR1cyA9IEFORUdfRkFJTEVEOworCQkJdW5zaWduZWQgaW50IHRpY2s7CisJCQl1aW50MzJfdCB0bXA7CisKKwkJCW1lbXNldCgmYW5pbmZvLCAwLCBzaXplb2YoYW5pbmZvKSk7CisJCQlhbmluZm8uZmxhZ3MgfD0gKE1SX0FOX0VOQUJMRSk7CisKKwkJCXR3MzIoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKworCQkJdG1wID0gdHAtPm1hY19tb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRtcCB8IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJKTsKKworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSB8IE1BQ19NT0RFX1NFTkRfQ09ORklHUyk7CisKKwkJCWFuaW5mby5zdGF0ZSA9IEFORUdfU1RBVEVfVU5LTk9XTjsKKwkJCWFuaW5mby5jdXJfdGltZSA9IDA7CisJCQl0aWNrID0gMDsKKwkJCXdoaWxlICgrK3RpY2sgPCAxOTUwMDApIHsKKwkJCQlzdGF0dXMgPSB0ZzNfZmliZXJfYW5lZ19zbWFjaGluZSh0cCwgJmFuaW5mbyk7CisJCQkJaWYgKHN0YXR1cyA9PSBBTkVHX0RPTkUgfHwKKwkJCQkgICAgc3RhdHVzID09IEFORUdfRkFJTEVEKQorCQkJCQlicmVhazsKKworCQkJCXVkZWxheSgxKTsKKwkJCX0KKworCQkJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQkJaWYgKHN0YXR1cyA9PSBBTkVHX0RPTkUgJiYKKwkJCSAgICAoYW5pbmZvLmZsYWdzICYKKwkJCSAgICAgKE1SX0FOX0NPTVBMRVRFIHwgTVJfTElOS19PSyB8CisJCQkgICAgICBNUl9MUF9BRFZfRlVMTF9EVVBMRVgpKSkgeworCQkJCXVpbnQzMl90IGxvY2FsX2FkdiwgcmVtb3RlX2FkdjsKKworCQkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQkJcmVtb3RlX2FkdiA9IDA7CisJCQkJaWYgKGFuaW5mby5mbGFncyAmIE1SX0xQX0FEVl9TWU1fUEFVU0UpCisJCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0NBUDsKKwkJCQlpZiAoYW5pbmZvLmZsYWdzICYgTVJfTFBfQURWX0FTWU1fUEFVU0UpCisJCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0FTWU07CisKKwkJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCisJCQkJdHAtPnRnM19mbGFncyB8PQorCQkJCQlURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKSB7CisJCQkJdWRlbGF5KDIwKTsKKwkJCQl0dzMyX2NhcmVmdWxseShNQUNfU1RBVFVTLAorCQkJCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCQkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJCQkgICAgIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCQkJICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAwICYmCisJCQkgICAgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpKSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEZvcmNpbmcgMTAwMEZEIGxpbmsgdXAuICovCisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJdHAtPmh3X3N0YXR1cy0+c3RhdHVzID0KKwkJKFNEX1NUQVRVU19VUERBVEVEIHwKKwkJICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiB+U0RfU1RBVFVTX0xJTktfQ0hHKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdWRlbGF5KDIwKTsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX1NUQVRVUywKKwkJCShNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8IE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmICgodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgPT0gMCkKKwkJY3VycmVudF9saW5rX3VwID0gMDsKKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSkgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwICE9IHRwLT5jYXJyaWVyX29rKSB7CisJCXRwLT5jYXJyaWVyX29rID0gY3VycmVudF9saW5rX3VwOworCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0gZWxzZSB7CisJCXVpbnQzMl90IG5vd19wYXVzZV9jZmcgPQorCQkJdHAtPnRnM19mbGFncyAmIChURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSBURzNfRkxBR19UWF9QQVVTRSk7CisJCWlmIChvcmlnX3BhdXNlX2NmZyAhPSBub3dfcGF1c2VfY2ZnIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9zcGVlZCAhPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9kdXBsZXggIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXgpCisJCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0KKworCWlmICgodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgPT0gMCkgeworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlIHwgTUFDX01PREVfTElOS19QT0xBUklUWSk7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgeworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHRnM19zZXR1cF9maWJlcl9waHkoVFApICgtRUlOVkFMKQorI2VuZGlmIC8qIFNVUFBPUlRfRklCRVJfUEhZICovCisKK3N0YXRpYyBpbnQgdGczX3NldHVwX3BoeShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQllcnIgPSB0ZzNfc2V0dXBfZmliZXJfcGh5KHRwKTsKKwl9IGVsc2UgeworCQllcnIgPSB0ZzNfc2V0dXBfY29wcGVyX3BoeSh0cCk7CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgweGZmIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSkpOworCWVsc2UKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpKTsKKworCXJldHVybiBlcnI7Cit9CisKKworI2RlZmluZSBNQVhfV0FJVF9DTlQgMTAwMAorCisvKiBUbyBzdG9wIGEgYmxvY2ssIGNsZWFyIHRoZSBlbmFibGUgYml0IGFuZCBwb2xsIHRpbGwgaXQKKyAqIGNsZWFycy4gIAorICovCitzdGF0aWMgaW50IHRnM19zdG9wX2Jsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1bnNpZ25lZCBsb25nIG9mcywgdWludDMyX3QgZW5hYmxlX2JpdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHsKKwkJc3dpdGNoKG9mcykgeworCQljYXNlIFJDVkxTQ19NT0RFOgorCQljYXNlIERNQUNfTU9ERToKKwkJY2FzZSBNQkZSRUVfTU9ERToKKwkJY2FzZSBCVUZNR1JfTU9ERToKKwkJY2FzZSBNRU1BUkJfTU9ERToKKwkJCS8qIFdlIGNhbid0IGVuYWJsZS9kaXNhYmxlIHRoZXNlIGJpdHMgb2YgdGhlCisJCQkgKiA1NzA1LCBqdXN0IHNheSBzdWNjZXNzLgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXZhbCA9IHRyMzIob2ZzKTsKKwl2YWwgJj0gfmVuYWJsZV9iaXQ7CisJdHczMihvZnMsIHZhbCk7CisJdHIzMihvZnMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9XQUlUX0NOVDsgaSsrKSB7CisJCXVkZWxheSgxMDApOworCQl2YWwgPSB0cjMyKG9mcyk7CisJCWlmICgodmFsICYgZW5hYmxlX2JpdCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IE1BWF9XQUlUX0NOVCkgeworCQlwcmludGYoInRnM19zdG9wX2Jsb2NrIHRpbWVkIG91dCwgb2ZzPSVseCBlbmFibGVfYml0PSV4XG4iLAorCQkgICAgICAgb2ZzLCBlbmFibGVfYml0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX2Fib3J0X2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBpLCBlcnI7CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZCRElfTU9ERSwgICBSQ1ZCRElfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWTFBDX01PREUsICAgUkNWTFBDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkxTQ19NT0RFLCAgIFJDVkxTQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQkRJX01PREUsICBSQ1ZEQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkRDQ19NT0RFLCAgIFJDVkRDQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZDQ19NT0RFLCAgICBSQ1ZDQ19NT0RFX0VOQUJMRSk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNOREJEU19NT0RFLCAgIFNOREJEU19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkRCRElfTU9ERSwgICBTTkRCRElfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EREFUQUlfTU9ERSwgU05EREFUQUlfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkRNQUNfTU9ERSwgICAgUkRNQUNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EREFUQUNfTU9ERSwgU05EREFUQUNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRDX01PREUsICAgU05EQkRDX01PREVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfVERFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCXRwLT50eF9tb2RlICY9IH5UWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfVFhfTU9ERSwgdHAtPnR4X21vZGUpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9XQUlUX0NOVDsgaSsrKSB7CisJCXVkZWxheSgxMDApOworCQlpZiAoISh0cjMyKE1BQ19UWF9NT0RFKSAmIFRYX01PREVfRU5BQkxFKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBNQVhfV0FJVF9DTlQpIHsKKwkJcHJpbnRmKCJ0ZzNfYWJvcnRfaHcgdGltZWQgb3V0IFRYX01PREVfRU5BQkxFIHdpbGwgbm90IGNsZWFyIE1BQ19UWF9NT0RFPSV4XG4iLAorCQkJdHIzMihNQUNfVFhfTU9ERSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgID0gdGczX3N0b3BfYmxvY2sodHAsIEhPU1RDQ19NT0RFLCBIT1NUQ0NfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgV0RNQUNfTU9ERSwgIFdETUFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIE1CRlJFRV9NT0RFLCBNQkZSRUVfTU9ERV9FTkFCTEUpOworCisJdHczMihGVFFfUkVTRVQsIDB4ZmZmZmZmZmYpOworCXR3MzIoRlRRX1JFU0VULCAweDAwMDAwMDAwKTsKKworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNRU1BUkJfTU9ERSwgTUVNQVJCX01PREVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW1lbXNldCh0cC0+aHdfc3RhdHVzLCAwLCBURzNfSFdfU1RBVFVTX1NJWkUpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdGczX2NoaXBfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgdmFsOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwNCkpIHsKKwkJLyogRm9yY2UgTlZSQU0gdG8gc2V0dGxlLgorCQkgKiBUaGlzIGRlYWxzIHdpdGggYSBjaGlwIGJ1ZyB3aGljaCBjYW4gcmVzdWx0IGluIEVFUFJPTQorCQkgKiBjb3JydXB0aW9uLgorCQkgKi8KKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkgeworCQkJaW50IGk7CisJCisJCQl0dzMyKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfU0VUMSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJCQlpZiAodHIzMihOVlJBTV9TV0FSQikgJiBTV0FSQl9HTlQxKQorCQkJCQlicmVhazsKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCQl9CisJfQorCS8qIEluIEV0aGVyYm9vdCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSA1NzAxCisJICogUkVHX1dSSVRFX0JVRyBiZWNhdXNlIHdlIGRvIGFsbCByZWdpc3RlciB3cml0ZXMgaW5kaXJlY3RseS4KKwkgKi8KKworCS8qIGRvIHRoZSByZXNldCAqLworCXZhbCA9IEdSQ19NSVNDX0NGR19DT1JFQ0xLX1JFU0VUOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkKKwkJdmFsIHw9IEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVI7CisJdHczMihHUkNfTUlTQ19DRkcsIHZhbCk7CisKKwkvKiBGbHVzaCBQQ0kgcG9zdGVkIHdyaXRlcy4gIFRoZSBub3JtYWwgTU1JTyByZWdpc3RlcnMKKwkgKiBhcmUgaW5hY2Nlc3NpYmxlIGF0IHRoaXMgdGltZSBzbyB0aGlzIGlzIHRoZSBvbmx5CisJICogd2F5IHRvIG1ha2UgdGhpcyByZWxpYWJseS4gIEkgdHJpZWQgdG8gdXNlIGluZGlyZWN0CisJICogcmVnaXN0ZXIgcmVhZC93cml0ZSBidXQgdGhpcyB1cHNldCBzb21lIDU3MDEgdmFyaWFudHMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnZhbCk7CisKKwl1ZGVsYXkoMTIwKTsKKworCS8qIFJlLWVuYWJsZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3Nlcy4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCS8qIFNldCBNQVggUENJIHJldHJ5IHRvIHplcm8uICovCisJdmFsID0gKFBDSVNUQVRFX1JPTV9FTkFCTEUgfCBQQ0lTVEFURV9ST01fUkVUUllfRU5BQkxFKTsKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpKQorCQl2YWwgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLCB2YWwpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUodHAtPnBkZXYsIHRwLT5wY2lfY2ZnX3N0YXRlKTsKKworCS8qIE1ha2Ugc3VyZSBQQ0ktWCByZWxheGVkIG9yZGVyaW5nIGJpdCBpcyBjbGVhci4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9YX0NBUFMsICZ2YWwpOworCXZhbCAmPSB+UENJWF9DQVBTX1JFTEFYRURfT1JERVJJTkc7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1hfQ0FQUywgdmFsKTsKKworCXR3MzIoTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisKKwlpZiAoKCh0cC0+bmljX3NyYW1fZGF0YV9jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19NSU5JX1BDSSkgIT0gMCkgJiYKKwkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgeworCQl0cC0+cGNpX2Nsb2NrX2N0cmwgfD0KKwkJCShDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTiB8IENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEUpOworCQl0dzMyKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwpOworCX0KKworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLCB0cC0+bWlzY19ob3N0X2N0cmwpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc3RvcF9mdyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpIHsKKwkJdWludDMyX3QgdmFsOworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVfbWVtKE5JQ19TUkFNX0ZXX0NNRF9NQk9YLCBGV0NNRF9OSUNEUlZfUEFVU0VfRlcpOworCQl2YWwgPSB0cjMyKEdSQ19SWF9DUFVfRVZFTlQpOworCQl2YWwgfD0gKDEgPDwgMTQpOworCQl0dzMyKEdSQ19SWF9DUFVfRVZFTlQsIHZhbCk7CisKKwkJLyogV2FpdCBmb3IgUlggY3B1IHRvIEFDSyB0aGUgZXZlbnQuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCWlmICghKHRyMzIoR1JDX1JYX0NQVV9FVkVOVCkgJiAoMSA8PCAxNCkpKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRnM19yZXN0YXJ0X2Z3KHN0cnVjdCB0ZzMgKnRwLCB1aW50MzJfdCBzdGF0ZSkKK3sKKwl1aW50MzJfdCB2YWw7CisJaW50IGk7CisJCisJdGczX3dyaXRlX21lbShOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLCAKKwkJTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEpOworCS8qIFdhaXQgZm9yIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLiAqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworCQl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fRklSTVdBUkVfTUJPWCwgJnZhbCk7CisJCWlmICh2YWwgPT0gKHVpbnQzMl90KSB+TklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGkgPj0gMTAwMDAwICYmCisJCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MDQpKSB7CisJCXByaW50ZigiRmlybXdhcmUgd2lsbCBub3QgcmVzdGFydCBtYWdpYz0leFxuIiwKKwkJCXZhbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpIHsKKwkJc3RhdGUgPSBEUlZfU1RBVEVfU1VTUEVORDsKKwl9CisJdGczX3dyaXRlX21lbShOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwgc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19oYWx0KHN0cnVjdCB0ZzMgKnRwKQoreworCXRnM19zdG9wX2Z3KHRwKTsKKwl0ZzNfYWJvcnRfaHcodHApOworCXRnM19jaGlwX3Jlc2V0KHRwKTsKKwlyZXR1cm4gdGczX3Jlc3RhcnRfZncodHAsIERSVl9TVEFURV9VTkxPQUQpOworfQorCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfbWFjX2FkZHIoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgYWRkcl9oaWdoLCBhZGRyX2xvdzsKKwlpbnQgaTsKKworCWFkZHJfaGlnaCA9ICgodHAtPm5pYy0+bm9kZV9hZGRyWzBdIDw8IDgpIHwKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbMV0pOworCWFkZHJfbG93ID0gKCh0cC0+bmljLT5ub2RlX2FkZHJbMl0gPDwgMjQpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbM10gPDwgMTYpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbNF0gPDwgIDgpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbNV0gPDwgIDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXR3MzIoTUFDX0FERFJfMF9ISUdIICsgKGkgKiA4KSwgYWRkcl9oaWdoKTsKKwkJdHczMihNQUNfQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwl9CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwKSAmJgorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpICYmCisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkpIHsKKwkJZm9yKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJdHczMihNQUNfRVhUQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQkJdHczMihNQUNfRVhUQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwkJfQorCX0KKwlhZGRyX2hpZ2ggPSAodHAtPm5pYy0+bm9kZV9hZGRyWzBdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbMV0gKworCQkgICAgIHRwLT5uaWMtPm5vZGVfYWRkclsyXSArCisJCSAgICAgdHAtPm5pYy0+bm9kZV9hZGRyWzNdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbNF0gKworCQkgICAgIHRwLT5uaWMtPm5vZGVfYWRkcls1XSkgJgorCQlUWF9CQUNLT0ZGX1NFRURfTUFTSzsKKwl0dzMyKE1BQ19UWF9CQUNLT0ZGX1NFRUQsIGFkZHJfaGlnaCk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfYmRpbmZvKHN0cnVjdCB0ZzMgKnRwLCB1aW50MzJfdCBiZGluZm9fYWRkciwKKwkJCSAgIGRtYV9hZGRyX3QgbWFwcGluZywgdWludDMyX3QgbWF4bGVuX2ZsYWdzLAorCQkJICAgdWludDMyX3QgbmljX2FkZHIpCit7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gpLAorCQkgICAgICAoKHVpbnQ2NF90KSBtYXBwaW5nID4+IDMyKSk7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVyksCisJCSAgICAgICgodWludDY0X3QpIG1hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19NQVhMRU5fRkxBR1MpLAorCQkgICAgICAgbWF4bGVuX2ZsYWdzKTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpIHsKKwkJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX05JQ19BRERSKSwgbmljX2FkZHIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9yaW5ncyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogWmVybyBvdXQgdGhlIHRnMyB2YXJpYWJsZXMgKi8KKwltZW1zZXQoJnRnM19ic3MsIDAsIHNpemVvZih0ZzNfYnNzKSk7CisJdHAtPnJ4X3N0ZCAgICA9ICZ0ZzNfYnNzLnJ4X3N0ZFswXTsKKwl0cC0+cnhfcmNiICAgID0gJnRnM19ic3MucnhfcmNiWzBdOworCXRwLT50eF9yaW5nICAgPSAmdGczX2Jzcy50eF9yaW5nWzBdOworCXRwLT5od19zdGF0dXMgPSAmdGczX2Jzcy5od19zdGF0dXM7CisJdHAtPmh3X3N0YXRzICA9ICZ0ZzNfYnNzLmh3X3N0YXRzOworCXRwLT5tYWNfbW9kZSAgPSAwOworCisKKwkvKiBJbml0aWFsaXplIHR4L3J4IHJpbmdzIGZvciBwYWNrZXQgcHJvY2Vzc2luZy4KKwkgKgorCSAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisJICogdGhlIG5ldHdvcmtpbmcsIHNvIG5vIGludGVycnVwdHMgb3IgbmV3IHR4IHBhY2tldHMgd2lsbAorCSAqIGVuZCB1cCBpbiB0aGUgZHJpdmVyLgorCSAqLworCisJLyogSW5pdGlhbGl6ZSBpbnZhcmlhbnRzIG9mIHRoZSByaW5ncywgd2Ugb25seSBzZXQgdGhpcworCSAqIHN0dWZmIG9uY2UuICBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGNhcmQgZG9lcyBub3QKKwkgKiB3cml0ZSBpbnRvIHRoZSByeCBidWZmZXIgcG9zdGluZyByaW5ncy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKnJ4ZDsKKworCQlyeGQgPSAmdHAtPnJ4X3N0ZFtpXTsKKwkJcnhkLT5pZHhfbGVuID0gKFJYX1BLVF9CVUZfU1ogLSAyIC0gNjQpCTw8IFJYRF9MRU5fU0hJRlQ7CisJCXJ4ZC0+dHlwZV9mbGFncyA9IChSWERfRkxBR19FTkQgPDwgUlhEX0ZMQUdTX1NISUZUKTsKKwkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX1NURCB8IChpIDw8IFJYRF9PUEFRVUVfSU5ERVhfU0hJRlQpKTsKKworCQkvKiBOb3RlIHdoZXJlIHRoZSByZWNlaXZlIGJ1ZmZlciBmb3IgdGhlIHJpbmcgaXMgcGxhY2VkICovCisJCXJ4ZC0+YWRkcl9oaSA9IDA7CisJCXJ4ZC0+YWRkcl9sbyA9IHZpcnRfdG9fYnVzKAorCQkJJnRnM19ic3MucnhfYnVmc1tpJVRHM19ERUZfUlhfUklOR19QRU5ESU5HXVsyXSk7CisJfQorfQorCisjZGVmaW5lIFRHM19XUklURV9TRVRUSU5HUyhUQUJMRSkgXAorZG8geyBcCisJY29uc3QgdWludDMyX3QgKl90YWJsZSwgKl9lbmQ7IFwKKwlfdGFibGUgPSBUQUJMRTsgXAorCV9lbmQgPSBfdGFibGUgKyBzaXplb2YoVEFCTEUpL3NpemVvZihUQUJMRVswXSk7ICBcCisJZm9yKDsgX3RhYmxlIDwgX2VuZDsgX3RhYmxlICs9IDIpIHsgXAorCQl0dzMyKF90YWJsZVswXSwgX3RhYmxlWzFdKTsgXAorCX0gXAorfSB3aGlsZSgwKQorCisKKy8qIGluaXRpYWxpemUvcmVzZXQgdGhlIHRnMyAqLworc3RhdGljIGludCB0ZzNfc2V0dXBfaHcoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgdmFsLCByZG1hY19tb2RlOworCWludCBpLCBlcnIsIGxpbWl0OworCisJLyogU2ltcGx5IGRvbid0IHN1cHBvcnQgc2V0dXBzIHdpdGggZXh0cmVtbHkgYnVnZ3kgZmlybXdhcmUgaW4gZXRoZXJib290ICovCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwKSB7CisJCXByaW50ZigiRXJyb3IgNTcwMV9BMCBmaXJtd2FyZSBidWcgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCS8qIE9yaWdpbmFsbHkgdGhpcyB3YXMgYWxsIGluIHRnM19pbml0X2h3ICovCisKKwkvKiBGb3JjZSB0aGUgY2hpcCBpbnRvIEQwLiAqLworCXRnM19zZXRfcG93ZXJfc3RhdGVfMCh0cCk7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwl0dzMyKFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7CisKKworCS8qIE9yaWdpbmFsbHkgdGhpcyB3YXMgYWxsIGluIHRnM19yZXNldF9odyAqLworCisJdGczX3N0b3BfZncodHApOworCisJLyogTm8gbmVlZCB0byBjYWxsIHRnM19hYm9ydF9odyBoZXJlLCBpdCBpcyBjYWxsZWQgYmVmb3JlIHRnM19zZXR1cF9ody4gKi8KKworCXRnM19jaGlwX3Jlc2V0KHRwKTsKKworCXR3MzIoR1JDX01PREUsIHRwLT5ncmNfbW9kZSk7ICAvKiBSZWR1bmRhbnQ/ICovCisKKwllcnIgPSB0ZzNfcmVzdGFydF9mdyh0cCwgRFJWX1NUQVRFX1NUQVJUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCX0KKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCisJLyogVGhpcyB3b3JrcyBhcm91bmQgYW4gaXNzdWUgd2l0aCBBdGhsb24gY2hpcHNldHMgb24KKwkgKiBCMyB0aWdvbjMgc2lsaWNvbi4gIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgb24gYW55CisJICogb3RoZXIgcmV2aXNpb24uCisJICovCisJdHAtPnBjaV9jbG9ja19jdHJsIHw9IENMT0NLX0NUUkxfREVMQVlfUENJX0dSQU5UOworCXR3MzJfY2FyZWZ1bGx5KFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwpOworCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkgeworCQl2YWwgPSB0cjMyKFRHM1BDSV9QQ0lTVEFURSk7CisJCXZhbCB8PSBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJdHczMihURzNQQ0lfUENJU1RBVEUsIHZhbCk7CisJfQorCisJLyogRGVzY3JpcHRvciByaW5nIGluaXQgbWF5IG1ha2UgYWNjZXNzZXMgdG8gdGhlCisJICogTklDIFNSQU0gYXJlYSB0byBzZXR1cCB0aGUgVFggZGVzY3JpcHRvcnMsIHNvIHdlCisJICogY2FuIG9ubHkgZG8gdGhpcyBhZnRlciB0aGUgaGFyZHdhcmUgaGFzIGJlZW4KKwkgKiBzdWNjZXNzZnVsbHkgcmVzZXQuCisJICovCisJdGczX2luaXRfcmluZ3ModHApOworCisJLyogQ2xlYXIgc3RhdGlzdGljcy9zdGF0dXMgYmxvY2sgaW4gY2hpcCAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQlmb3IgKGkgPSBOSUNfU1JBTV9TVEFUU19CTEs7CisJCSAgICAgaSA8IE5JQ19TUkFNX1NUQVRVU19CTEsgKyBURzNfSFdfU1RBVFVTX1NJWkU7CisJCSAgICAgaSArPSBzaXplb2YodWludDMyX3QpKSB7CisJCQl0ZzNfd3JpdGVfbWVtKGksIDApOworCQkJdWRlbGF5KDQwKTsKKwkJfQorCX0KKworCS8qIFRoaXMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgdGhlIHByb2JlIHRpbWUgRE1BCisJICogZW5naW5lIHRlc3QsIHRnM19zZXR1cF9kbWEuCisJICovCisJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKworCXRwLT5ncmNfbW9kZSAmPSB+KEdSQ19NT0RFX0hPU1RfU0VOREJEUyB8CisJCQkgIEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTIHwKKwkJCSAgR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNIHwKKwkJCSAgR1JDX01PREVfTk9fUlhfUEhEUl9DU1VNKTsKKwl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfSE9TVF9TRU5EQkRTOworCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU07CisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTTsKKworCXR3MzIoR1JDX01PREUsCisJCXRwLT5ncmNfbW9kZSB8IAorCQkoR1JDX01PREVfSVJRX09OX01BQ19BVFROIHwgR1JDX01PREVfSE9TVF9TVEFDS1VQKSk7CisKKwkvKiBTZXR1cCB0aGUgdGltZXIgcHJlc2NhbGFyIHJlZ2lzdGVyLiAgQ2xvY2sgaXMgYWx3YXlzIDY2TWh6LiAqLworCXR3MzIoR1JDX01JU0NfQ0ZHLAorCSAgICAgKDY1IDw8IEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQpKTsKKworCS8qIEluaXRpYWxpemUgTUJVRi9ERVNDIHBvb2wuICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCXR3MzIoQlVGTUdSX01CX1BPT0xfQUREUiwgTklDX1NSQU1fTUJVRl9QT09MX0JBU0UpOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpCisJCQl0dzMyKEJVRk1HUl9NQl9QT09MX1NJWkUsIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNjQpOworCQllbHNlCisJCQl0dzMyKEJVRk1HUl9NQl9QT09MX1NJWkUsIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFOTYpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRSk7CisJCXR3MzIoQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRSwgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFKTsKKwl9CisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0pVTUJPX0VOQUJMRSkpIHsKKwkJdHczMihCVUZNR1JfTUJfUkRNQV9MT1dfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXIpOworCQl0dzMyKEJVRk1HUl9NQl9NQUNSWF9MT1dfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfSElHSF9XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX2hpZ2hfd2F0ZXIpOworCX0gZWxzZSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyX2p1bWJvKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyX2p1bWJvKTsKKwl9CisJdHczMihCVUZNR1JfRE1BX0xPV19XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9sb3dfd2F0ZXIpOworCXR3MzIoQlVGTUdSX0RNQV9ISUdIX1dBVEVSLAorCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcuZG1hX2hpZ2hfd2F0ZXIpOworCisJdHczMihCVUZNR1JfTU9ERSwgQlVGTUdSX01PREVfRU5BQkxFIHwgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUpOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKHRyMzIoQlVGTUdSX01PREUpICYgQlVGTUdSX01PREVfRU5BQkxFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpID49IDIwMDApIHsKKwkJcHJpbnRmKCJ0ZzNfc2V0dXBfaHcgY2Fubm90IGVuYWJsZSBCVUZNR1JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0dzMyKEZUUV9SRVNFVCwgMHhmZmZmZmZmZik7CisJdHczMihGVFFfUkVTRVQsIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKHRyMzIoRlRRX1JFU0VUKSA9PSAweDAwMDAwMDAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpID49IDIwMDApIHsKKwkJcHJpbnRmKCJ0ZzNfc2V0dXBfaHcgY2Fubm90IHJlc2V0IEZUUVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEluaXRpYWxpemUgVEczX0JESU5GTydzIGF0OgorCSAqICBSQ1ZEQkRJX1NURF9CRDoJc3RhbmRhcmQgZXRoIHNpemUgcnggcmluZworCSAqICBSQ1ZEQkRJX0pVTUJPX0JEOglqdW1ibyBmcmFtZSByeCByaW5nCisJICogIFJDVkRCRElfTUlOSV9CRDoJc21hbGwgZnJhbWUgcnggcmluZyAoPz8/IGRvZXMgbm90IHdvcmspCisJICoKKwkgKiBsaWtlIHNvOgorCSAqICBURzNfQkRJTkZPX0hPU1RfQUREUjoJaGlnaC9sb3cgcGFydHMgb2YgRE1BIGFkZHJlc3Mgb2YgcmluZworCSAqICBURzNfQkRJTkZPX01BWExFTl9GTEFHUzoJKHJ4IG1heCBidWZmZXIgc2l6ZSA8PCAxNikgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZyBhdHRyaWJ1dGUgZmxhZ3MKKwkgKiAgVEczX0JESU5GT19OSUNfQUREUjoJbG9jYXRpb24gb2YgZGVzY3JpcHRvcnMgaW4gbmljIFNSQU0KKwkgKgorCSAqIFN0YW5kYXJkIHJlY2VpdmUgcmluZyBAIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDLCA1MTIgZW50cmllcy4KKwkgKiBKdW1ibyByZWNlaXZlIHJpbmcgQCBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQywgMjU2IGVudHJpZXMuCisJICoKKwkgKiA/Pz8gTm8gc3BhY2UgYWxsb2NhdGVkIGZvciBtaW5pIHJlY2VpdmUgcmluZz8gOigKKwkgKgorCSAqIFRoZSBzaXplIG9mIGVhY2ggcmluZyBpcyBmaXhlZCBpbiB0aGUgZmlybXdhcmUsIGJ1dCB0aGUgbG9jYXRpb24gaXMKKwkgKiBjb25maWd1cmFibGUuCisJICovCisJeworCQlzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfYWxsW10gPSB7CisJCQkvKiBTZXR1cCByZXBsZW5pc2ggdGhyZXNob2xkcy4gKi8KKwkJCVJDVkJESV9TVERfVEhSRVNILCBURzNfREVGX1JYX1JJTkdfUEVORElORyAvIDgsCisKKwkJCS8qIEV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IgKi8KKwkJCVJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsIDAsCisJCQlSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTklDX0FERFIsIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDLAorCQl9OworCQlzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfbm90XzU3MDVbXSA9IHsKKwkJCS8qIEJ1ZmZlciBtYXhpbXVtIGxlbmd0aCAqLworCQkJUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywgUlhfU1REX01BWF9TSVpFIDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQsCisJCQkKKwkJCS8qIERpc2FibGUgdGhlIG1pbmkgZnJhbWUgcnggcmluZyAqLworCQkJUkNWREJESV9NSU5JX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCUJESU5GT19GTEFHU19ESVNBQkxFRCwKKwkJCQorCQkJLyogRGlzYWJsZSB0aGUganVtYm8gZnJhbWUgcnggcmluZyAqLworCQkJUkNWQkRJX0pVTUJPX1RIUkVTSCwgMCwKKwkJCVJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywgQkRJTkZPX0ZMQUdTX0RJU0FCTEVELAorCQkJCisJCQkKKwkJfTsKKwkJVEczX1dSSVRFX1NFVFRJTkdTKHRhYmxlX2FsbCk7CisJCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLCAKKwkJCXZpcnRfdG9fYnVzKHRwLT5yeF9zdGQpKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCQkJUlhfU1REX01BWF9TSVpFXzU3MDUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCk7CisJCX0gZWxzZSB7CisJCQlURzNfV1JJVEVfU0VUVElOR1ModGFibGVfbm90XzU3MDUpOworCQl9CisJfQorCisJCisJLyogVGhlcmUgaXMgb25seSBvbmUgc2VuZCByaW5nIG9uIDU3MDUsIG5vIG5lZWQgdG8gZXhwbGljaXRseQorCSAqIGRpc2FibGUgdGhlIG90aGVycy4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpIHsKKwkJLyogQ2xlYXIgb3V0IHNlbmQgUkNCIHJpbmcgaW4gU1JBTS4gKi8KKwkJZm9yIChpID0gTklDX1NSQU1fU0VORF9SQ0I7IGkgPCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQjsgaSArPSBURzNfQkRJTkZPX1NJWkUpCisJCQl0ZzNfd3JpdGVfbWVtKGkgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwl9CisKKwl0cC0+dHhfcHJvZCA9IDA7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKKworCXRnM19zZXRfYmRpbmZvKHRwLAorCQlOSUNfU1JBTV9TRU5EX1JDQiwKKwkJdmlydF90b19idXModHAtPnR4X3JpbmcpLAorCQkoVEczX1RYX1JJTkdfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKSwKKwkJTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MpOworCisJLyogVGhlcmUgaXMgb25seSBvbmUgcmVjZWl2ZSByZXR1cm4gcmluZyBvbiA1NzA1LCBubyBuZWVkIHRvIGV4cGxpY2l0bHkKKwkgKiBkaXNhYmxlIHRoZSBvdGhlcnMuCisJICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCWZvciAoaSA9IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpIDwgTklDX1NSQU1fU1RBVFNfQkxLOyBpICs9IFRHM19CRElORk9fU0laRSkgeworCQkJdGczX3dyaXRlX21lbShpICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCQkJQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwkJfQorCX0KKworCXRwLT5yeF9yY2JfcHRyID0gMDsKKwl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKKworCXRnM19zZXRfYmRpbmZvKHRwLAorCQlOSUNfU1JBTV9SQ1ZfUkVUX1JDQiwKKwkJdmlydF90b19idXModHAtPnJ4X3JjYiksCisJCShURzNfUlhfUkNCX1JJTkdfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKSwKKwkJMCk7CisKKwl0cC0+cnhfc3RkX3B0ciA9IFRHM19ERUZfUlhfUklOR19QRU5ESU5HOworCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9SQ1ZfU1REX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgdHAtPnJ4X3N0ZF9wdHIpOworCisJdHczMl9tYWlsYm94MihNQUlMQk9YX1JDVl9KVU1CT19QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKKworCS8qIEluaXRpYWxpemUgTUFDIGFkZHJlc3MgYW5kIGJhY2tvZmYgc2VlZC4gKi8KKwlfX3RnM19zZXRfbWFjX2FkZHIodHApOworCisJLyogQ2FsY3VsYXRlIFJETUFDX01PREUgc2V0dGluZyBlYXJseSwgd2UgbmVlZCBpdCB0byBkZXRlcm1pbmUKKwkgKiB0aGUgUkNWTFBDX1NUQVRFX0VOQUJMRSBtYXNrLgorCSAqLworCXJkbWFjX21vZGUgPSAoUkRNQUNfTU9ERV9FTkFCTEUgfCBSRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIgfAorCQlSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIgfCBSRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCIHwKKwkJUkRNQUNfTU9ERV9BRERST0ZMT1dfRU5BQiB8IFJETUFDX01PREVfRklGT09GTE9XX0VOQUIgfAorCQlSRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKKwkJUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkKKwkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX1NQTElUX0VOQUJMRTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHsKKwkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSB7CisJCQlpZiAoISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9CVVNfU1BFRURfSElHSCkgJiYKKwkJCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkpIHsKKwkJCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19MT05HX0JVUlNUOworCQkJfQorCQl9CisJfQorCisJLyogU2V0dXAgaG9zdCBjb2FsZXNjaW5nIGVuZ2luZS4gKi8KKwl0dzMyKEhPU1RDQ19NT0RFLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICghKHRyMzIoSE9TVENDX01PREUpICYgSE9TVENDX01PREVfRU5BQkxFKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1RYU1RBVF9FTkFCTEUgfCBNQUNfTU9ERV9SWFNUQVRfRU5BQkxFIHwKKwkJTUFDX01PREVfVERFX0VOQUJMRSB8IE1BQ19NT0RFX1JERV9FTkFCTEUgfCBNQUNfTU9ERV9GSERFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlIHwgTUFDX01PREVfUlhTVEFUX0NMRUFSIHwgTUFDX01PREVfVFhTVEFUX0NMRUFSKTsKKworCXRwLT5ncmNfbG9jYWxfY3RybCA9IEdSQ19MQ0xDVFJMX0lOVF9PTl9BVFROIHwgR1JDX0xDTENUUkxfQVVUT19TRUVQUk9NOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkKKwkJdHAtPmdyY19sb2NhbF9jdHJsIHw9IChHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSk7CisJdHczMl9jYXJlZnVsbHkoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCk7CisKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKKwl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCXR3MzJfY2FyZWZ1bGx5KERNQUNfTU9ERSwgRE1BQ19NT0RFX0VOQUJMRSk7CisJfQorCisJdmFsID0gKAlXRE1BQ19NT0RFX0VOQUJMRSB8IFdETUFDX01PREVfVEdUQUJPUlRfRU5BQiB8CisJCVdETUFDX01PREVfTVNUQUJPUlRfRU5BQiB8IFdETUFDX01PREVfUEFSSVRZRVJSX0VOQUIgfAorCQlXRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCIHwgV0RNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQiB8CisJCVdETUFDX01PREVfRklGT1VSVU5fRU5BQiB8IFdETUFDX01PREVfRklGT09SRUFEX0VOQUIgfAorCQlXRE1BQ19NT0RFX0xOR1JFQURfRU5BQik7CisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkJKCh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9CVVNfU1BFRURfSElHSCkgIT0gMCkgJiYKKwkJISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTXzU3ODgpKSB7CisJCXZhbCB8PSBXRE1BQ19NT0RFX1JYX0FDQ0VMOworCX0KKwl0dzMyX2NhcmVmdWxseShXRE1BQ19NT0RFLCB2YWwpOworCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAhPSAwKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1hfQ0FQUyk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgeworCQkJdmFsICY9IFBDSVhfQ0FQU19CVVJTVF9NQVNLOworCQkJdmFsIHw9IChQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ0FQU19CVVJTVF9TSElGVCk7CisJCX0gZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJCXZhbCAmPSB+KFBDSVhfQ0FQU19TUExJVF9NQVNLIHwgUENJWF9DQVBTX0JVUlNUX01BU0spOworCQkJdmFsIHw9IChQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ0FQU19CVVJTVF9TSElGVCk7CisJCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NQTElUX01PREUpCisJCQkJdmFsIHw9ICh0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA8PAorCQkJCQlQQ0lYX0NBUFNfU1BMSVRfU0hJRlQpOworCQl9CisJCXR3MzIoVEczUENJX1hfQ0FQUywgdmFsKTsKKwl9CisKKwl0dzMyX2NhcmVmdWxseShSRE1BQ19NT0RFLCByZG1hY19tb2RlKTsKKwl7CisJCXN0YXRpYyBjb25zdCB1aW50MzJfdCB0YWJsZV9hbGxbXSA9IHsKKwkJCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnICovCisJCQlNQUNfUlhfTVRVX1NJWkUsIEVUSF9NQVhfTVRVICsgRVRIX0hMRU4gKyA4LAorCQkJCisJCQkvKiBUaGUgc2xvdCB0aW1lIGlzIGNoYW5nZWQgYnkgdGczX3NldHVwX3BoeSBpZiB3ZQorCQkJICogcnVuIGF0IGdpZ2FiaXQgd2l0aCBoYWxmIGR1cGxleC4KKwkJCSAqLworCQkJTUFDX1RYX0xFTkdUSFMsCQorCQkJKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCQkoNiA8PCBUWF9MRU5HVEhTX0lQR19TSElGVCkgfAorCQkJKDMyIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSwKKwkJCQorCQkJLyogUmVjZWl2ZSBydWxlcy4gKi8KKwkJCU1BQ19SQ1ZfUlVMRV9DRkcsIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTLAorCQkJUkNWTFBDX0NPTkZJRywgMHgwMTgxLAorCQkJCisJCQkvKiBSZWNlaXZlL3NlbmQgc3RhdGlzdGljcy4gKi8KKwkJCVJDVkxQQ19TVEFUU19FTkFCTEUsIDB4ZmZmZmZmLAorCQkJUkNWTFBDX1NUQVRTQ1RSTCwgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUsCisJCQlTTkREQVRBSV9TVEFUU0VOQUIsIDB4ZmZmZmZmLAorCQkJU05EREFUQUlfU1RBVFNDVFJMLCAoU05EREFUQUlfU0NUUkxfRU5BQkxFIHxTTkREQVRBSV9TQ1RSTF9GQVNUVVBEKSwKKwkJCQorCQkJLyogSG9zdCBjb2FsZXNjaW5nIGVuZ2luZSAqLworCQkJSE9TVENDX1JYQ09MX1RJQ0tTLCAwLAorCQkJSE9TVENDX1RYQ09MX1RJQ0tTLCBMT1dfVFhDT0xfVElDS1MsCisJCQlIT1NUQ0NfUlhNQVhfRlJBTUVTLCAxLAorCQkJSE9TVENDX1RYTUFYX0ZSQU1FUywgTE9XX1JYTUFYX0ZSQU1FUywKKwkJCUhPU1RDQ19SWENPQUxfTUFYRl9JTlQsIDEsCisJCQlIT1NUQ0NfVFhDT0FMX01BWEZfSU5ULCAwLAorCQkJCisJCQkvKiBTdGF0dXMvc3RhdGlzdGljcyBibG9jayBhZGRyZXNzLiAqLworCQkJLyogRXRoZXJib290IGxpdmVzIGJlbG93IDRHQiwgc28gSElHSCA9PSAwICovCisJCQlIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsIDAsCisKKwkJCS8qIE5vIG5lZWQgdG8gZW5hYmxlIDMyYnl0ZSBjb2FsZXNjZSBtb2RlLiAqLworCQkJSE9TVENDX01PREUsIEhPU1RDQ19NT0RFX0VOQUJMRSB8IDAsCisJCQkKKwkJCVJDVkNDX01PREUsIFJDVkNDX01PREVfRU5BQkxFIHwgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRSwKKwkJCVJDVkxQQ19NT0RFLCBSQ1ZMUENfTU9ERV9FTkFCTEUsCisJCQkKKwkJCVJDVkRDQ19NT0RFLCBSQ1ZEQ0NfTU9ERV9FTkFCTEUgfCBSQ1ZEQ0NfTU9ERV9BVFROX0VOQUJMRSwKKworCQkJU05EREFUQUNfTU9ERSwgU05EREFUQUNfTU9ERV9FTkFCTEUsCisJCQlTTkRCRENfTU9ERSwgU05EQkRDX01PREVfRU5BQkxFIHwgU05EQkRDX01PREVfQVRUTl9FTkFCTEUsCisJCQlSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFIHwgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQiwKKwkJCVJDVkRCRElfTU9ERSwgUkNWREJESV9NT0RFX0VOQUJMRSB8IFJDVkRCRElfTU9ERV9JTlZfUklOR19TWiwKKwkJCVNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFLAorCQkJU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSB8IFNOREJESV9NT0RFX0FUVE5fRU5BQkxFLAorCQkJU05EQkRTX01PREUsIFNOREJEU19NT0RFX0VOQUJMRSB8IFNOREJEU19NT0RFX0FUVE5fRU5BQkxFLAorCQkJCisJCQkvKiBBY2NlcHQgYWxsIG11bHRpY2FzdCBmcmFtZXMuICovCisJCQlNQUNfSEFTSF9SRUdfMCwgMHhmZmZmZmZmZiwKKwkJCU1BQ19IQVNIX1JFR18xLCAweGZmZmZmZmZmLAorCQkJTUFDX0hBU0hfUkVHXzIsIDB4ZmZmZmZmZmYsCisJCQlNQUNfSEFTSF9SRUdfMywgMHhmZmZmZmZmZiwKKwkJfTsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX25vdF81NzA1W10gPSB7CisJCQkvKiBIb3N0IGNvYWxlc2NpbmcgZW5naW5lICovCisJCQlIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5ULCAwLAorCQkJSE9TVENDX1RYQ09BTF9USUNLX0lOVCwgMCwKKworCQkJLyogU3RhdHVzL3N0YXRpc3RpY3MgYmxvY2sgYWRkcmVzcy4gKi8KKwkJCS8qIEV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IsIHNvIEhJR0ggPT0gMCAqLworCQkJSE9TVENDX1NUQVRfQ09BTF9USUNLUywgREVGQVVMVF9TVEFUX0NPQUxfVElDS1MsCisJCQlIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwgMCwKKwkJCUhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIsIE5JQ19TUkFNX1NUQVRTX0JMSywKKwkJCUhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUVVNfQkxLLAorCisJCQlSQ1ZMU0NfTU9ERSwgUkNWTFNDX01PREVfRU5BQkxFIHwgUkNWTFNDX01PREVfQVRUTl9FTkFCTEUsCisKKwkJCU1CRlJFRV9NT0RFLCBNQkZSRUVfTU9ERV9FTkFCTEUsCisJCX07CisJCVRHM19XUklURV9TRVRUSU5HUyh0YWJsZV9hbGwpOworCQl0dzMyKEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJCQl2aXJ0X3RvX2J1cyh0cC0+aHdfc3RhdHMpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCXZpcnRfdG9fYnVzKHRwLT5od19zdGF0dXMpKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCQlURzNfV1JJVEVfU0VUVElOR1ModGFibGVfbm90XzU3MDUpOworCQl9CisJfQorCisJdHAtPnR4X21vZGUgPSBUWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfVFhfTU9ERSwgdHAtPnR4X21vZGUpOworCisJdHAtPnJ4X21vZGUgPSBSWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCisJdHAtPm1pX21vZGUgPSBNQUNfTUlfTU9ERV9CQVNFOworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisKKwl0dzMyKE1BQ19MRURfQ1RSTCwgMCk7CisJdHczMihNQUNfTUlfU1RBVCwgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIpOworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpIHsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX1JYX01PREUsIFJYX01PREVfUkVTRVQpOworCX0KKwl0cC0+cnhfbW9kZSB8PSBSWF9NT0RFX0tFRVBfVkxBTl9UQUc7IC8qIGRyb3AgdGFnZ2VkIHZsYW4gcGFja2V0cyAqLworCXR3MzJfY2FyZWZ1bGx5KE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDNfQTEpCisJCXR3MzIoTUFDX1NFUkRFU19DRkcsIDB4NjE2MDAwKTsKKworCS8qIFByZXZlbnQgY2hpcCBmcm9tIGRyb3BwaW5nIGZyYW1lcyB3aGVuIGZsb3cgY29udHJvbAorCSAqIGlzIGVuYWJsZWQuCisJICovCisJdHczMihNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRSwgMik7CisJdHIzMihNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRSk7CisKKwllcnIgPSB0ZzNfc2V0dXBfcGh5KHRwKTsKKworCS8qIElnbm9yZSBDUkMgc3RhdHMgKi8KKworCS8qIEluaXRpYWxpemUgcmVjZWl2ZSBydWxlcy4gKi8KKwl0dzMyKE1BQ19SQ1ZfUlVMRV8wLCAgMHhjMjAwMDAwMCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzAsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9SVUxFXzEsICAweDg2MDAwMDA0ICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfVkFMVUVfMSwgMHhmZmZmZmZmZiAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpCisJCWxpbWl0ID0gODsKKwllbHNlCisJCWxpbWl0ID0gMTY7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKQorCQlsaW1pdCAtPSA0OworCXN3aXRjaCAobGltaXQpIHsKKwljYXNlIDE2Ogl0dzMyKE1BQ19SQ1ZfUlVMRV8xNSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTUsICAwKTsKKwljYXNlIDE1Ogl0dzMyKE1BQ19SQ1ZfUlVMRV8xNCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTQsICAwKTsKKwljYXNlIDE0Ogl0dzMyKE1BQ19SQ1ZfUlVMRV8xMywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTMsICAwKTsKKwljYXNlIDEzOgl0dzMyKE1BQ19SQ1ZfUlVMRV8xMiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTIsICAwKTsKKwljYXNlIDEyOgl0dzMyKE1BQ19SQ1ZfUlVMRV8xMSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTEsICAwKTsKKwljYXNlIDExOgl0dzMyKE1BQ19SQ1ZfUlVMRV8xMCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTAsICAwKTsKKwljYXNlIDEwOgl0dzMyKE1BQ19SQ1ZfUlVMRV85LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfOSwgIDApOworCWNhc2UgOToJCXR3MzIoTUFDX1JDVl9SVUxFXzgsICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV84LCAgMCk7CisJY2FzZSA4OgkJdHczMihNQUNfUkNWX1JVTEVfNywgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzcsICAwKTsKKwljYXNlIDc6CQl0dzMyKE1BQ19SQ1ZfUlVMRV82LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfNiwgIDApOworCWNhc2UgNjoJCXR3MzIoTUFDX1JDVl9SVUxFXzUsICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV81LCAgMCk7CisJY2FzZSA1OgkJdHczMihNQUNfUkNWX1JVTEVfNCwgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzQsICAwKTsKKwljYXNlIDQ6CQkvKiB0dzMyKE1BQ19SQ1ZfUlVMRV8zLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8zLCAgMCk7ICovCisJY2FzZSAzOgkJLyogdHczMihNQUNfUkNWX1JVTEVfMiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMiwgIDApOyAqLworCWNhc2UgMjoKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKKworCisvKiBDaGlwcyBvdGhlciB0aGFuIDU3MDAvNTcwMSB1c2UgdGhlIE5WUkFNIGZvciBmZXRjaGluZyBpbmZvLiAqLworc3RhdGljIHZvaWQgdGczX252cmFtX2luaXQoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihHUkNfRUVQUk9NX0FERFIsCisJICAgICAoRUVQUk9NX0FERFJfRlNNX1JFU0VUIHwKKwkgICAgICAoRUVQUk9NX0RFRkFVTFRfQ0xPQ0tfUEVSSU9EIDw8CisJICAgICAgIEVFUFJPTV9BRERSX0NMS1BFUkRfU0hJRlQpKSk7CisKKwltZGVsYXkoMSk7CisKKwkvKiBFbmFibGUgc2VlcHJvbSBhY2Nlc3Nlcy4gKi8KKwl0dzMyX2NhcmVmdWxseShHUkNfTE9DQUxfQ1RSTCwKKwkJdHIzMihHUkNfTE9DQUxfQ1RSTCkgfCBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST00pOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwICYmCisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSB7CisJCXVpbnQzMl90IG52Y2ZnMSA9IHRyMzIoTlZSQU1fQ0ZHMSk7CisKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTTsKKwkJaWYgKG52Y2ZnMSAmIE5WUkFNX0NGRzFfRkxBU0hJRl9FTkFCKSB7CisJCQlpZiAobnZjZmcxICYgTlZSQU1fQ0ZHMV9CVUZGRVJFRF9NT0RFKQorCQkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQ7CisJCX0gZWxzZSB7CisJCQludmNmZzEgJj0gfk5WUkFNX0NGRzFfQ09NUEFUX0JZUEFTUzsKKwkJCXR3MzIoTlZSQU1fQ0ZHMSwgbnZjZmcxKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJdHAtPnRnM19mbGFncyAmPSB+KFRHM19GTEFHX05WUkFNIHwgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQpOworCX0KK30KKworCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkX3VzaW5nX2VlcHJvbSgKKwlzdHJ1Y3QgdGczICp0cCBfX3VudXNlZCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqdmFsKQoreworCXVpbnQzMl90IHRtcDsKKwlpbnQgaTsKKworCWlmIChvZmZzZXQgPiBFRVBST01fQUREUl9BRERSX01BU0sgfHwKKwkJKG9mZnNldCAlIDQpICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1wID0gdHIzMihHUkNfRUVQUk9NX0FERFIpICYgfihFRVBST01fQUREUl9BRERSX01BU0sgfAorCQkJCQlFRVBST01fQUREUl9ERVZJRF9NQVNLIHwKKwkJCQkJRUVQUk9NX0FERFJfUkVBRCk7CisJdHczMihHUkNfRUVQUk9NX0FERFIsCisJICAgICB0bXAgfAorCSAgICAgKDAgPDwgRUVQUk9NX0FERFJfREVWSURfU0hJRlQpIHwKKwkgICAgICgob2Zmc2V0IDw8IEVFUFJPTV9BRERSX0FERFJfU0hJRlQpICYKKwkgICAgICBFRVBST01fQUREUl9BRERSX01BU0spIHwKKwkgICAgIEVFUFJPTV9BRERSX1JFQUQgfCBFRVBST01fQUREUl9TVEFSVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl0bXAgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisKKwkJaWYgKHRtcCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoISh0bXAgJiBFRVBST01fQUREUl9DT01QTEVURSkpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkqdmFsID0gdHIzMihHUkNfRUVQUk9NX0RBVEEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkKHN0cnVjdCB0ZzMgKnRwLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90ICp2YWwpCit7CisJaW50IGksIHNhd19kb25lX2NsZWFyOworCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNKSkKKwkJcmV0dXJuIHRnM19udnJhbV9yZWFkX3VzaW5nX2VlcHJvbSh0cCwgb2Zmc2V0LCB2YWwpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCkKKwkJb2Zmc2V0ID0gKChvZmZzZXQgLyBOVlJBTV9CVUZGRVJFRF9QQUdFX1NJWkUpIDw8CisJCQkgIE5WUkFNX0JVRkZFUkVEX1BBR0VfUE9TKSArCisJCQkob2Zmc2V0ICUgTlZSQU1fQlVGRkVSRURfUEFHRV9TSVpFKTsKKworCWlmIChvZmZzZXQgPiBOVlJBTV9BRERSX01TSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0dzMyKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfU0VUMSk7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAodHIzMihOVlJBTV9TV0FSQikgJiBTV0FSQl9HTlQxKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCisJdHczMihOVlJBTV9BRERSLCBvZmZzZXQpOworCXR3MzIoTlZSQU1fQ01ELAorCSAgICAgTlZSQU1fQ01EX1JEIHwgTlZSQU1fQ01EX0dPIHwKKwkgICAgIE5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUIHwgTlZSQU1fQ01EX0RPTkUpOworCisJLyogV2FpdCBmb3IgZG9uZSBiaXQgdG8gY2xlYXIgdGhlbiBzZXQgYWdhaW4uICovCisJc2F3X2RvbmVfY2xlYXIgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKCFzYXdfZG9uZV9jbGVhciAmJgorCQkgICAgISh0cjMyKE5WUkFNX0NNRCkgJiBOVlJBTV9DTURfRE9ORSkpCisJCQlzYXdfZG9uZV9jbGVhciA9IDE7CisJCWVsc2UgaWYgKHNhd19kb25lX2NsZWFyICYmCisJCQkgKHRyMzIoTlZSQU1fQ01EKSAmIE5WUkFNX0NNRF9ET05FKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSAxMDAwKSB7CisJCXR3MzIoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9DTFIxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkqdmFsID0gYnN3YXBfMzIodHIzMihOVlJBTV9SRERBVEEpKTsKKwl0dzMyKE5WUkFNX1NXQVJCLCAweDIwKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3Vic3lzX3RibF9lbnQgeworCXVpbnQxNl90IHN1YnN5c192ZW5kb3IsIHN1YnN5c19kZXZpZDsKKwl1aW50MzJfdCBwaHlfaWQ7Cit9OworCitzdGF0aWMgc3RydWN0IHN1YnN5c190YmxfZW50IHN1YnN5c19pZF90b19waHlfaWRbXSA9IHsKKwkvKiBCcm9hZGNvbSBib2FyZHMuICovCisJeyAweDE0ZTQsIDB4MTY0NCwgUEhZX0lEX0JDTTU0MDEgfSwgLyogQkNNOTU3MDBBNiAqLworCXsgMHgxNGU0LCAweDAwMDEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxQTUgKi8KKwl7IDB4MTRlNCwgMHgwMDAyLCBQSFlfSURfQkNNODAwMiB9LCAvKiBCQ005NTcwMFQ2ICovCisJeyAweDE0ZTQsIDB4MDAwMywgUEhZX0lEX1NFUkRFUyAgfSwgLyogQkNNOTU3MDBBOSAqLworCXsgMHgxNGU0LCAweDAwMDUsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxVDEgKi8KKwl7IDB4MTRlNCwgMHgwMDA2LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMVQ4ICovCisJeyAweDE0ZTQsIDB4MDAwNywgUEhZX0lEX1NFUkRFUyAgfSwgLyogQkNNOTU3MDFBNyAqLworCXsgMHgxNGU0LCAweDAwMDgsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxQTEwICovCisJeyAweDE0ZTQsIDB4ODAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTIgKi8KKwl7IDB4MTRlNCwgMHgwMDA5LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwM0F4MSAqLworCXsgMHgxNGU0LCAweDgwMDksIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAzQXgyICovCisKKwkvKiAzY29tIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDAwLCBQSFlfSURfQkNNNTQwMSB9LCAvKiAzQzk5NlQgKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA2LCBQSFlfSURfQkNNNTcwMSB9LCAvKiAzQzk5NkJUICovCisJLyogeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwMiwgUEhZX0lEX1hYWCB9LCAgICAgM0M5OTZDVCAqLworCS8qIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDMsIFBIWV9JRF9YWFggfSwgICAgIDNDOTk3VCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDQsIFBIWV9JRF9TRVJERVMgIH0sIC8qIDNDOTk2U1ggKi8KKwkvKiB7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA1LCBQSFlfSURfWFhYIH0sICAgICAzQzk5N1NaICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNywgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0MxMDAwVCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDgsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTQwQlIwMSAqLworCisJLyogREVMTCBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDBkMSwgUEhZX0lEX0JDTTU0MDEgfSwgLyogVklQRVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA2LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBKQUdVQVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA5LCBQSFlfSURfQkNNNTQxMSB9LCAvKiBNRVJMT1QgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTBhLCBQSFlfSURfQkNNNTQxMSB9LCAvKiBTTElNX01FUkxPVCAqLworCisJLyogQ29tcGFxIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwN2MsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUUgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOWEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUVfMiAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA3ZCwgUEhZX0lEX1NFUkRFUyAgfSwgLyogQ0hBTkdFTElORyAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA4NSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogTkM3NzgwICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDk5LCBQSFlfSURfQkNNNTcwMSB9ICAvKiBOQzc3ODBfMiAqLworfTsKKworc3RhdGljIGludCB0ZzNfcGh5X3Byb2JlKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IGVlcHJvbV9waHlfaWQsIGh3X3BoeV9pZF8xLCBod19waHlfaWRfMjsKKwl1aW50MzJfdCBod19waHlfaWQsIGh3X3BoeV9pZF9tYXNrZWQ7CisJZW51bSBwaHlfbGVkX21vZGUgZWVwcm9tX2xlZF9tb2RlOworCXVpbnQzMl90IHZhbDsKKwl1bnNpZ25lZCBpOworCWludCBlZXByb21fc2lnbmF0dXJlX2ZvdW5kLCBlcnI7CisKKwl0cC0+cGh5X2lkID0gUEhZX0lEX0lOVkFMSUQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN1YnN5c19pZF90b19waHlfaWQpL3NpemVvZihzdWJzeXNfaWRfdG9fcGh5X2lkWzBdKTsgaSsrKSB7CisJCWlmICgoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfdmVuZG9yID09IHRwLT5zdWJzeXN0ZW1fdmVuZG9yKSAmJgorCQkJKHN1YnN5c19pZF90b19waHlfaWRbaV0uc3Vic3lzX2RldmlkID09IHRwLT5zdWJzeXN0ZW1fZGV2aWNlKSkgeworCQkJdHAtPnBoeV9pZCA9IHN1YnN5c19pZF90b19waHlfaWRbaV0ucGh5X2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwllZXByb21fcGh5X2lkID0gUEhZX0lEX0lOVkFMSUQ7CisJZWVwcm9tX2xlZF9tb2RlID0gbGVkX21vZGVfYXV0bzsKKwllZXByb21fc2lnbmF0dXJlX2ZvdW5kID0gMDsKKwl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fREFUQV9TSUcsICZ2YWwpOworCWlmICh2YWwgPT0gTklDX1NSQU1fREFUQV9TSUdfTUFHSUMpIHsKKwkJdWludDMyX3QgbmljX2NmZzsKKworCQl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fREFUQV9DRkcsICZuaWNfY2ZnKTsKKwkJdHAtPm5pY19zcmFtX2RhdGFfY2ZnID0gbmljX2NmZzsKKworCQllZXByb21fc2lnbmF0dXJlX2ZvdW5kID0gMTsKKworCQlpZiAoKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLKSA9PQorCQkgICAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfRklCRVIpIHsKKwkJCWVlcHJvbV9waHlfaWQgPSBQSFlfSURfU0VSREVTOworCQl9IGVsc2UgeworCQkJdWludDMyX3QgbmljX3BoeV9pZDsKKworCQkJdGczX3JlYWRfbWVtKE5JQ19TUkFNX0RBVEFfUEhZX0lELCAmbmljX3BoeV9pZCk7CisJCQlpZiAobmljX3BoeV9pZCAhPSAwKSB7CisJCQkJdWludDMyX3QgaWQxID0gbmljX3BoeV9pZCAmIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLOworCQkJCXVpbnQzMl90IGlkMiA9IG5pY19waHlfaWQgJiBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSzsKKworCQkJCWVlcHJvbV9waHlfaWQgID0gKGlkMSA+PiAxNikgPDwgMTA7CisJCQkJZWVwcm9tX3BoeV9pZCB8PSAoaWQyICYgMHhmYzAwKSA8PCAxNjsKKwkJCQllZXByb21fcGh5X2lkIHw9IChpZDIgJiAweDAzZmYpIDw8ICAwOworCQkJfQorCQl9CisKKwkJc3dpdGNoIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSykgeworCQljYXNlIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9UUklQTEVfU1BEOgorCQkJZWVwcm9tX2xlZF9tb2RlID0gbGVkX21vZGVfdGhyZWVfbGluazsKKwkJCWJyZWFrOworCisJCWNhc2UgTklDX1NSQU1fREFUQV9DRkdfTEVEX0xJTktfU1BEOgorCQkJZWVwcm9tX2xlZF9tb2RlID0gbGVkX21vZGVfbGluazEwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVlcHJvbV9sZWRfbW9kZSA9IGxlZF9tb2RlX2F1dG87CisJCQlicmVhazsKKwkJfTsKKwkJaWYgKCgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHx8CisJCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHx8CisJCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpKSAmJgorCQkJKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19FRVBST01fV1ApKSB7CisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UOworCQl9CisKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFKQorCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19FTkFCTEVfQVNGOworCQlpZiAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0ZJQkVSX1dPTCkKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfU0VSREVTX1dPTF9DQVA7CisJfQorCisJLyogTm93IHJlYWQgdGhlIHBoeXNpY2FsIFBIWV9JRCBmcm9tIHRoZSBjaGlwIGFuZCB2ZXJpZnkKKwkgKiB0aGF0IGl0IGlzIHNhbmUuICBJZiBpdCBkb2Vzbid0IGxvb2sgZ29vZCwgd2UgZmFsbCBiYWNrCisJICogdG8gZWl0aGVyIHRoZSBoYXJkLWNvZGVkIHRhYmxlIGJhc2VkIFBIWV9JRCBhbmQgZmFpbGluZworCSAqIHRoYXQgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSBlZXByb20gYXJlYS4KKwkgKi8KKwllcnIgID0gdGczX3JlYWRwaHkodHAsIE1JSV9QSFlTSUQxLCAmaHdfcGh5X2lkXzEpOworCWVyciB8PSB0ZzNfcmVhZHBoeSh0cCwgTUlJX1BIWVNJRDIsICZod19waHlfaWRfMik7CisKKwlod19waHlfaWQgID0gKGh3X3BoeV9pZF8xICYgMHhmZmZmKSA8PCAxMDsKKwlod19waHlfaWQgfD0gKGh3X3BoeV9pZF8yICYgMHhmYzAwKSA8PCAxNjsKKwlod19waHlfaWQgfD0gKGh3X3BoeV9pZF8yICYgMHgwM2ZmKSA8PCAgMDsKKworCWh3X3BoeV9pZF9tYXNrZWQgPSBod19waHlfaWQgJiBQSFlfSURfTUFTSzsKKworCWlmICghZXJyICYmIEtOT1dOX1BIWV9JRChod19waHlfaWRfbWFza2VkKSkgeworCQl0cC0+cGh5X2lkID0gaHdfcGh5X2lkOworCX0gZWxzZSB7CisJCS8qIHBoeV9pZCBjdXJyZW50bHkgaG9sZHMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZQorCQkgKiBzdWJzeXNfaWRfdG9fcGh5X2lkW10gdGFibGUgb3IgUEhZX0lEX0lOVkFMSUQKKwkJICogaWYgYSBtYXRjaCB3YXMgbm90IGZvdW5kIHRoZXJlLgorCQkgKi8KKwkJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX0lOVkFMSUQpIHsKKwkJCWlmICghZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCB8fAorCQkJICAgICFLTk9XTl9QSFlfSUQoZWVwcm9tX3BoeV9pZCAmIFBIWV9JRF9NQVNLKSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXRwLT5waHlfaWQgPSBlZXByb21fcGh5X2lkOworCQl9CisJfQorCisJZXJyID0gdGczX3BoeV9yZXNldCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkgeworCQl1aW50MzJfdCBtaWlfdGczX2N0cmw7CisJCQorCQkvKiBUaGVzZSBjaGlwcywgd2hlbiByZXNldCwgb25seSBhZHZlcnRpc2UgMTBNYgorCQkgKiBjYXBhYmlsaXRpZXMuICBGaXggdGhhdC4KKwkJICovCisJCWVyciAgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsCisJCQkJICAgIChBRFZFUlRJU0VfQ1NNQSB8CisJCQkJICAgICBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMEhBTEYgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwRlVMTCkpOworCQltaWlfdGczX2N0cmwgPSAoTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYgfAorCQkJCU1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMIHwKKwkJCQlNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQlNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUik7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJCQltaWlfdGczX2N0cmwgPSAwOworCisJCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgbWlpX3RnM19jdHJsKTsKKwkJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCisJCQkJICAgIChCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfQU5FTkFCTEUpKTsKKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MjAxZik7CisJCXRnM193cml0ZWRzcCh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgyYWFhKTsKKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJfQorCisJLyogRW5hYmxlIEV0aGVybmV0QFdpcmVTcGVlZCAqLworCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CisKKwlpZiAoIWVyciAmJiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpKSB7CisJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIFBIWSBsZWQgbW9kZS4gCisJICogQmUgY2FyZWZ1bCBpZiB0aGlzIGdldHMgc2V0IHdyb25nIGl0IGNhbiByZXN1bHQgaW4gYW4gaW5hYmlsaXR5IHRvIAorCSAqIGVzdGFibGlzaCBhIGxpbmsuCisJICovCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQl0cC0+bGVkX21vZGUgPSBsZWRfbW9kZV90aHJlZV9saW5rOworCX0KKwllbHNlIGlmICh0cC0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFTEwpIHsKKwkJdHAtPmxlZF9tb2RlID0gbGVkX21vZGVfbGluazEwOworCX0gZWxzZSB7CisJCXRwLT5sZWRfbW9kZSA9IGxlZF9tb2RlX3RocmVlX2xpbms7CisJCWlmIChlZXByb21fc2lnbmF0dXJlX2ZvdW5kICYmCisJCSAgICBlZXByb21fbGVkX21vZGUgIT0gbGVkX21vZGVfYXV0bykKKwkJCXRwLT5sZWRfbW9kZSA9IGVlcHJvbV9sZWRfbW9kZTsKKwl9CisKKwlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfU0VSREVTKQorCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkJKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkJIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfQXV0b25lZyB8CisJCQkgQURWRVJUSVNFRF9GSUJSRSk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CisJCQl+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkJICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZiBTVVBQT1JUX1BBUlROT19TVFIKK3N0YXRpYyB2b2lkIHRnM19yZWFkX3BhcnRubyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZwZF9kYXRhWzI1Nl07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKwkJdWludDMyX3QgdG1wOworCisJCWlmICh0ZzNfbnZyYW1fcmVhZCh0cCwgMHgxMDAgKyBpLCAmdG1wKSkKKwkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQl2cGRfZGF0YVtpICsgMF0gPSAoKHRtcCA+PiAgMCkgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDFdID0gKCh0bXAgPj4gIDgpICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAyXSA9ICgodG1wID4+IDE2KSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgM10gPSAoKHRtcCA+PiAyNCkgJiAweGZmKTsKKwl9CisKKwkvKiBOb3cgcGFyc2UgYW5kIGZpbmQgdGhlIHBhcnQgbnVtYmVyLiAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICkgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IHZwZF9kYXRhW2ldOworCQlpbnQgYmxvY2tfZW5kOworCisJCWlmICh2YWwgPT0gMHg4MiB8fCB2YWwgPT0gMHg5MSkgeworCQkJaSA9IChpICsgMyArCisJCQkgICAgICh2cGRfZGF0YVtpICsgMV0gKworCQkJICAgICAgKHZwZF9kYXRhW2kgKyAyXSA8PCA4KSkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodmFsICE9IDB4OTApCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJYmxvY2tfZW5kID0gKGkgKyAzICsKKwkJCSAgICAgKHZwZF9kYXRhW2kgKyAxXSArCisJCQkgICAgICAodnBkX2RhdGFbaSArIDJdIDw8IDgpKSk7CisJCWkgKz0gMzsKKwkJd2hpbGUgKGkgPCBibG9ja19lbmQpIHsKKwkJCWlmICh2cGRfZGF0YVtpICsgMF0gPT0gJ1AnICYmCisJCQkgICAgdnBkX2RhdGFbaSArIDFdID09ICdOJykgeworCQkJCWludCBwYXJ0bm9fbGVuID0gdnBkX2RhdGFbaSArIDJdOworCisJCQkJaWYgKHBhcnRub19sZW4gPiAyNCkKKwkJCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCQkJbWVtY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwKKwkJCQkgICAgICAgJnZwZF9kYXRhW2kgKyAzXSwKKwkJCQkgICAgICAgcGFydG5vX2xlbik7CisKKwkJCQkvKiBTdWNjZXNzLiAqLworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIFBhcnQgbnVtYmVyIG5vdCBmb3VuZC4gKi8KKwkJZ290byBvdXRfbm90X2ZvdW5kOworCX0KKworb3V0X25vdF9mb3VuZDoKKwltZW1jcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLCAibm9uZSIsIHNpemVvZigibm9uZSIpKTsKK30KKyNlbHNlCisjZGVmaW5lIHRnM19yZWFkX3BhcnRubyhUUCkgKChUUCktPmJvYXJkX3BhcnRfbnVtYmVyWzBdID0gJ1wwJykKKyNlbmRpZgorCitzdGF0aWMgaW50IHRnM19nZXRfaW52YXJpYW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBtaXNjX2N0cmxfcmVnOworCXVpbnQzMl90IHBjaV9zdGF0ZV9yZWcsIGdyY19taXNjX2NmZzsKKwl1aW50MTZfdCBwY2lfY21kOworCXVpbnQ4X3QgIHBjaV9sYXRlbmN5OworCWludCBlcnI7CisKKwkvKiBSZWFkIHRoZSBzdWJzeXN0ZW0gdmVuZG9yIGFuZCBkZXZpY2UgaWRzICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdHAtPnN1YnN5c3RlbV92ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmdHAtPnN1YnN5c3RlbV9kZXZpY2UpOworCisJLyogVGhlIHN1bl81NzA0IGNvZGUgbmVlZHMgaW5mcmFzdHJ1Y3R1cmUgZXRoZXJib290IGRvZXMgaGF2ZQorCSAqIGlnbm9yZSBpdCBmb3Igbm93LgorCSAqLworCisJLyogSWYgd2UgaGF2ZSBhbiBBTUQgNzYyIG9yIEludGVsIElDSC9JQ0gwIGNoaXBzZXQsIHdyaXRlCisJICogcmVvcmRlcmluZyB0byB0aGUgbWFpbGJveCByZWdpc3RlcnMgZG9uZSBieSB0aGUgaG9zdAorCSAqIGNvbnRyb2xsZXIgY2FuIGNhdXNlIG1ham9yIHRyb3VibGVzLiAgV2UgcmVhZCBiYWNrIGZyb20KKwkgKiBldmVyeSBtYWlsYm94IHJlZ2lzdGVyIHdyaXRlIHRvIGZvcmNlIHRoZSB3cml0ZXMgdG8gYmUKKwkgKiBwb3N0ZWQgdG8gdGhlIGNoaXAgaW4gb3JkZXIuCisJICoKKwkgKiBURzNfRkxBR19NQk9YX1dSSVRFX1JFT1JERVIgaGFzIGJlZW4gZm9yY2VkIG9uLgorCSAqLworCisJLyogRm9yY2UgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgb2ZmLiAgSWYgd2UgbGVhdmUgaXQgb24sCisJICogdGhlbiBvbiA1NzAwX0JYIGNoaXBzIHdlIGhhdmUgdG8gZW5hYmxlIGEgd29ya2Fyb3VuZC4KKwkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIFRHM1BDSV9ETUFfUldfQ1RSTCBib3VuZHJ5CisJICogdG8gbWF0Y2ggdGhlIGNhY2hlbGluZSBzaXplLiAgVGhlIEJyb2FkY29tIGRyaXZlciBoYXZlIHRoaXMKKwkgKiB3b3JrYXJvdW5kIGJ1dCB0dXJucyBNV0kgb2ZmIGFsbCB0aGUgdGltZXMgc28gbmV2ZXIgdXNlcworCSAqIGl0LiAgVGhpcyBzZWVtcyB0byBzdWdnZXN0IHRoYXQgdGhlIHdvcmthcm91bmQgaXMgaW5zdWZmaWNpZW50LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJLyogQWxzbywgZm9yY2UgU0VSUiMvUEVSUiMgaW4gUENJIGNvbW1hbmQuICovCisJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSOworCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOworCisJLyogSXQgaXMgYWJzb2x1dGVseSBjcml0aWNhbCB0aGF0IFRHM1BDSV9NSVNDX0hPU1RfQ1RSTAorCSAqIGhhcyB0aGUgcmVnaXN0ZXIgaW5kaXJlY3Qgd3JpdGUgZW5hYmxlIGJpdCBzZXQgYmVmb3JlCisJICogd2UgdHJ5IHRvIGFjY2VzcyBhbnkgb2YgdGhlIE1NSU8gcmVnaXN0ZXJzLiAgSXQgaXMgYWxzbworCSAqIGNyaXRpY2FsIHRoYXQgdGhlIFBDSS1YIGh3IHdvcmthcm91bmQgc2l0dWF0aW9uIGlzIGRlY2lkZWQKKwkgKiBiZWZvcmUgdGhhdCBhcyB3ZWxsLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLCAmbWlzY19jdHJsX3JlZyk7CisKKwl0cC0+cGNpX2NoaXBfcmV2X2lkID0gKG1pc2NfY3RybF9yZWcgPj4gTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVCk7CisKKwkvKiBJbml0aWFsaXplIG1pc2MgaG9zdCBjb250cm9sIGluIFBDSSBibG9jay4gKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgfD0gKG1pc2NfY3RybF9yZWcgJgorCQkJICAgICAgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOworCWlmIChwY2lfbGF0ZW5jeSA8IDY0KSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZSh0cC0+cGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDY0KTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgJnBjaV9zdGF0ZV9yZWcpOworCisJLyogSWYgdGhpcyBpcyBhIDU3MDAgQlggY2hpcHNldCwgYW5kIHdlIGFyZSBpbiBQQ0ktWAorCSAqIG1vZGUsIGVuYWJsZSByZWdpc3RlciB3cml0ZSB3b3JrYXJvdW5kLgorCSAqCisJICogVGhlIHdvcmthcm91bmQgaXMgdG8gdXNlIGluZGlyZWN0IHJlZ2lzdGVyIGFjY2Vzc2VzCisJICogZm9yIGFsbCBjaGlwIHdyaXRlcyBub3QgdG8gbWFpbGJveCByZWdpc3RlcnMuCisJICoKKwkgKiBJbiBldGhlcmJvb3QgdG8gc2ltcGxpZnkgdGhpbmdzIHdlIGp1c3QgYWx3YXlzIHVzZSB0aGlzIHdvcmsgYXJvdW5kLgorCSAqLworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0NPTlZfUENJX01PREUpID09IDApIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lYX01PREU7CisJfQorCS8qIEJhY2sgdG8gYmFjayByZWdpc3RlciB3cml0ZXMgY2FuIGNhdXNlIHByb2JsZW1zIG9uIHRoZSA1NzAxLAorCSAqIHRoZSB3b3JrYXJvdW5kIGlzIHRvIHJlYWQgYmFjayBhbGwgcmVnIHdyaXRlcyBleGNlcHQgdGhvc2UgdG8KKwkgKiBtYWlsYm94IHJlZ3MuCisJICogSW4gZXRoZXJib290IHdlIGFsd2F5cyB1c2UgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMgc28KKwkgKiB3ZSBkb24ndCBzZWUgdGhpcy4KKwkgKi8KKworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAhPSAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEOworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU18zMkJJVCkgIT0gMCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lfMzJCSVQ7CisKKwkvKiBDaGlwLXNwZWNpZmljIGZpeHVwIGZyb20gQnJvYWRjb20gZHJpdmVyICovCisJaWYgKCh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCkgJiYKKwkgICAgKCEocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BKSkpIHsKKwkJcGNpX3N0YXRlX3JlZyB8PSBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLCBwY2lfc3RhdGVfcmVnKTsKKwl9CisKKwkvKiBGb3JjZSB0aGUgY2hpcCBpbnRvIEQwLiAqLworCXRnM19zZXRfcG93ZXJfc3RhdGVfMCh0cCk7CisKKwkvKiBFdGhlcmJvb3QgZG9lcyBub3QgYXNrIHRoZSB0ZzMgdG8gZG8gY2hlY2tzdW1zICovCisJLyogRXRoZXJib290IGRvZXMgbm90IGFzayB0aGUgdGczIHRvIGRvIGp1bWJvIGZyYW1lcyAqLworCS8qIEVodGVyYm9vdCBkb2VzIG5vdCBhc2sgdGhlIHRnMyB0byB1c2UgV2FrZU9uTGFuLiAqLworCisJLyogQSBmZXcgYm9hcmRzIGRvbid0IHdhbnQgRXRoZXJuZXRAV2lyZVNwZWVkIHBoeSBmZWF0dXJlICovCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkgfHwKKwkJKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkJCSh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMCkgJiYKKwkJCSh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMSkpKSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEOworCX0KKworCS8qIEF2b2lkIHRhZ2dlZCBpcnEgc3RhdHVzIGV0aGVyYm9vdCBkb2VzIG5vdCB1c2UgaXJxcyAqLworCisJLyogT25seSA1NzAxIGFuZCBsYXRlciBzdXBwb3J0IHRhZ2dlZCBpcnEgc3RhdHVzIG1vZGUuCisJICogQWxzbywgNTc4OCBjaGlwcyBjYW5ub3QgdXNlIHRhZ2dlZCBpcnEgc3RhdHVzLgorCSAqCisJICogSG93ZXZlciwgc2luY2UgZXRoZXJib290IGRvZXMgbm90IHVzZSBpcnFzIGF2b2lkIHRhZ2dlZCBpcnFzCisJICogc3RhdHVzICBiZWNhdXNlIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uIGlzIG1vcmUgZGlmZmljdWx0IHRvCisJICogZnVsbHkgY2xlYXIgaW4gdGhhdCBtb2RlLgorCSAqLworCQorCS8qIFNpbmNlIHNvbWUgNTcwMF9BWCAmJiA1NzAwX0JYIGhhdmUgcHJvYmxlbXMgd2l0aCAzMkJZVEUKKwkgKiBjb2FsZXNjZV9tb2RlLCBhbmQgdGhlIHJlc3Qgd29yayBmaW5lIGFueXRoaW5nIHNldC4KKwkgKiBEb24ndCBlbmFibGUgSE9TVF9DQ19NT0RFXzMyQllURSBpbiBldGhlcmJvb3QuCisJICovCisKKwkvKiBJbml0aWFsaXplIE1BQyBNSSBtb2RlLCBwb2xsaW5nIGRpc2FibGVkLiAqLworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisKKwkvKiBJbml0aWFsaXplIGRhdGEvZGVzY3JpcHRvciBieXRlL3dvcmQgc3dhcHBpbmcuICovCisJdHczMihHUkNfTU9ERSwgdHAtPmdyY19tb2RlKTsKKworCXRnM19zd2l0Y2hfY2xvY2tzKHRwKTsKKworCS8qIENsZWFyIHRoaXMgb3V0IGZvciBzYW5pdHkuICovCisJdHczMihURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCisJLyogRXRoZXJib290IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhlIFBDSVhfVEFSR0VUX0hXQlVHCisJICogaXMgbmVlZGVkLiAgSXQgYWx3YXlzIHVzZXMgaXQuCisJICovCisJCisJdWRlbGF5KDUwKTsKKwl0ZzNfbnZyYW1faW5pdCh0cCk7CisKKwkvKiBUaGUgVFggZGVzY3JpcHRvcnMgd2lsbCByZXNpZGUgaW4gbWFpbiBtZW1vcnkuCisJICovCisKKwkvKiBTZWUgd2hpY2ggYm9hcmQgd2UgYXJlIHVzaW5nLgorCSAqLworCWdyY19taXNjX2NmZyA9IHRyMzIoR1JDX01JU0NfQ0ZHKTsKKwlncmNfbWlzY19jZmcgJj0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX01BU0s7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0Q0lPQkUpIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TUExJVF9NT0RFOworCQl0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA9IFNQTElUX01PREVfNTcwNF9NQVhfUkVROworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAoZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4IHx8CisJICAgICBncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODhNKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSVNfNTc4ODsKKworCS8qIHRoZXNlIGFyZSBsaW1pdGVkIHRvIDEwLzEwMCBvbmx5ICovCisJaWYgKCgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpICYmCisJCSAgICAoKGdyY19taXNjX2NmZyA9PSAweDgwMDApIHx8IChncmNfbWlzY19jZmcgPT0gMHg0MDAwKSkpIHx8CisJCSgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpICYmCisJCQkodHAtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NKSAmJgorCQkJKCh0cC0+cGRldi0+ZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU5MDEpIHx8CisJCQkJKHRwLT5wZGV2LT5kZXZfaWQgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMV8yKSkpKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfMTBfMTAwX09OTFk7CisJfQorCisJZXJyID0gdGczX3BoeV9wcm9iZSh0cCk7CisJaWYgKGVycikgeworCQlwcmludGYoInBoeSBwcm9iZSBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwl9CisKKwl0ZzNfcmVhZF9wYXJ0bm8odHApOworCisKKwkvKiA1NzAwIEJYIGNoaXBzIG5lZWQgdG8gaGF2ZSB0aGVpciBUWCBwcm9kdWNlciBpbmRleCBtYWlsYm94ZXMKKwkgKiB3cml0dGVuIHR3aWNlIHRvIHdvcmthcm91bmQgYSBidWcuCisJICogSW4gZXRoZXJib290IHdlIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5IHRvIHNpbXBsaWZ5IHRoaW5ncy4KKwkgKi8KKworCS8qIDU3MDAgY2hpcHMgY2FuIGdldCBjb25mdXNlZCBpZiBUWCBidWZmZXJzIHN0cmFkZGxlIHRoZQorCSAqIDRHQiBhZGRyZXNzIGJvdW5kYXJ5IGluIHNvbWUgY2FzZXMuCisJICogCisJICogSW4gZXRoZXJib290IHdlIGNhbiBpZ25vcmUgdGhlIHByb2JsZW0gYXMgZXRoZXJib290IGxpdmVzIGJlbG93IDRHQi4KKwkgKi8KKworCS8qIEluIGV0aGVyYm9vdCB3YWtlLW9uLWxhbiBpcyB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZWQgKi8KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50ICB0ZzNfZ2V0X2RldmljZV9hZGRyZXNzKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IHRwLT5uaWM7CisJdWludDMyX3QgaGksIGxvLCBtYWNfb2Zmc2V0OworCisJaWYgKFBDSV9GVU5DKHRwLT5wZGV2LT5kZXZmbikgPT0gMCkKKwkJbWFjX29mZnNldCA9IDB4N2M7CisJZWxzZQorCQltYWNfb2Zmc2V0ID0gMHhjYzsKKworCS8qIEZpcnN0IHRyeSB0byBnZXQgaXQgZnJvbSBNQUMgYWRkcmVzcyBtYWlsYm94LiAqLworCXRnM19yZWFkX21lbShOSUNfU1JBTV9NQUNfQUREUl9ISUdIX01CT1gsICZoaSk7CisJaWYgKChoaSA+PiAxNikgPT0gMHg0ODRiKSB7CisJCW5pYy0+bm9kZV9hZGRyWzBdID0gKGhpID4+ICA4KSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzFdID0gKGhpID4+ICAwKSAmIDB4ZmY7CisKKwkJdGczX3JlYWRfbWVtKE5JQ19TUkFNX01BQ19BRERSX0xPV19NQk9YLCAmbG8pOworCQluaWMtPm5vZGVfYWRkclsyXSA9IChsbyA+PiAyNCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclszXSA9IChsbyA+PiAxNikgJiAweGZmOworCQluaWMtPm5vZGVfYWRkcls0XSA9IChsbyA+PiAgOCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkcls1XSA9IChsbyA+PiAgMCkgJiAweGZmOworCX0KKwkvKiBOZXh0LCB0cnkgTlZSQU0uICovCisJZWxzZSBpZiAoIXRnM19udnJhbV9yZWFkKHRwLCBtYWNfb2Zmc2V0ICsgMCwgJmhpKSAmJgorCQkgIXRnM19udnJhbV9yZWFkKHRwLCBtYWNfb2Zmc2V0ICsgNCwgJmxvKSkgeworCQluaWMtPm5vZGVfYWRkclswXSA9ICgoaGkgPj4gMTYpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzFdID0gKChoaSA+PiAyNCkgJiAweGZmKTsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAoKGxvID4+ICAwKSAmIDB4ZmYpOworCQluaWMtPm5vZGVfYWRkclszXSA9ICgobG8gPj4gIDgpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzRdID0gKChsbyA+PiAxNikgJiAweGZmKTsKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSAoKGxvID4+IDI0KSAmIDB4ZmYpOworCX0KKwkvKiBGaW5hbGx5IGp1c3QgZmV0Y2ggaXQgb3V0IG9mIHRoZSBNQUMgY29udHJvbCByZWdzLiAqLworCWVsc2UgeworCQloaSA9IHRyMzIoTUFDX0FERFJfMF9ISUdIKTsKKwkJbG8gPSB0cjMyKE1BQ19BRERSXzBfTE9XKTsKKworCQluaWMtPm5vZGVfYWRkcls1XSA9IGxvICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNF0gPSAobG8gPj4gOCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclszXSA9IChsbyA+PiAxNikgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclsyXSA9IChsbyA+PiAyNCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclsxXSA9IGhpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMF0gPSAoaGkgPj4gOCkgJiAweGZmOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2RtYShzdHJ1Y3QgdGczICp0cCkKK3sKKwl0dzMyKFRHM1BDSV9DTE9DS19DVFJMLCAwKTsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgPT0gMCkgeworCQl0cC0+ZG1hX3J3Y3RybCA9CisJCQkoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkgfAorCQkJKDB4NyA8PCBETUFfUldDVFJMX1dSSVRFX1dBVEVSX1NISUZUKSB8CisJCQkoMHg3IDw8IERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVCkgfAorCQkJKDB4MGYgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCQl0cC0+ZG1hX3J3Y3RybCAmPSB+KERNQV9SV0NUUkxfTUlOX0RNQSA8PCBETUFfUldDVFJMX01JTl9ETUFfU0hJRlQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQkJdHAtPmRtYV9yd2N0cmwgPQorCQkJCSgweDcgPDwgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EX1NISUZUKSB8CisJCQkJKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkgfAorCQkJCSgweDMgPDwgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVCkgfAorCQkJCSgweDcgPDwgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSX1NISUZUKSB8CisJCQkJKDB4MDAgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKwkJZWxzZQorCQkJdHAtPmRtYV9yd2N0cmwgPQorCQkJCSgweDcgPDwgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EX1NISUZUKSB8CisJCQkJKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkgfAorCQkJCSgweDMgPDwgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVCkgfAorCQkJCSgweDMgPDwgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSX1NISUZUKSB8CisJCQkJKDB4MGYgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKworCQkvKiBXaGVlZSwgc29tZSBtb3JlIGNoaXAgYnVncy4uLiAqLworCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSkgeworCQkJdWludDMyX3QgY2N2YWwgPSB0cjMyKFRHM1BDSV9DTE9DS19DVFJMKSAmIDB4MWY7CisKKwkJCWlmICgoY2N2YWwgPT0gMHg2KSB8fCAoY2N2YWwgPT0gMHg3KSkgeworCQkJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfT05FX0RNQTsKKwkJCX0KKwkJfQorCX0KKworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHx8CisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkpIHsKKwkJdHAtPmRtYV9yd2N0cmwgJj0gfihETUFfUldDVFJMX01JTl9ETUEgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKwl9CisKKwl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX0FTU0VSVF9BTExfQkU7CisKKwl0dzMyKFRHM1BDSV9ETUFfUldfQ1RSTCwgdHAtPmRtYV9yd2N0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19pbml0X2xpbmtfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCShBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX01JSSk7CisJdHAtPmNhcnJpZXJfb2sgPSAwOworCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7Cit9CisKKworI2lmIFNVUFBPUlRfUEhZX1NUUgorc3RhdGljIGNvbnN0IGNoYXIgKiB0ZzNfcGh5X3N0cmluZyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzd2l0Y2ggKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgeworCWNhc2UgUEhZX0lEX0JDTTU0MDA6CXJldHVybiAiNTQwMCI7CisJY2FzZSBQSFlfSURfQkNNNTQwMToJcmV0dXJuICI1NDAxIjsKKwljYXNlIFBIWV9JRF9CQ001NDExOglyZXR1cm4gIjU0MTEiOworCWNhc2UgUEhZX0lEX0JDTTU3MDE6CXJldHVybiAiNTcwMSI7CisJY2FzZSBQSFlfSURfQkNNNTcwMzoJcmV0dXJuICI1NzAzIjsKKwljYXNlIFBIWV9JRF9CQ001NzA0OglyZXR1cm4gIjU3MDQiOworCWNhc2UgUEhZX0lEX0JDTTgwMDI6CXJldHVybiAiODAwMiI7CisJY2FzZSBQSFlfSURfU0VSREVTOglyZXR1cm4gInNlcmRlcyI7CisJZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7CisJfTsKK30KKyNlbHNlCisjZGVmaW5lIHRnM19waHlfc3RyaW5nKFRQKSAiPyIKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHRnM19wb2xsX2xpbmsoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgbWFjX3N0YXQ7CisKKwltYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQlpZiAodHAtPmNhcnJpZXJfb2s/CisJCQkobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpOgorCQkJKG1hY19zdGF0ICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSyk7CisJCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQkJdGczX3NldHVwX3BoeSh0cCk7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRCkgeworCQkJdGczX3NldHVwX3BoeSh0cCk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRnM19hY2tfaXJxcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHsKKwkJLyoKKwkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKKwkJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCisJCSAqIHdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKKwkJICogTklDIHRvIHN0b3Agc2VuZGluZyB1cyBpcnFzLCBlbmdhZ2luZyAiaW4taW50ci1oYW5kbGVyIgorCQkgKiBldmVudCBjb2FsZXNjaW5nLgorCQkgKi8KKwkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgCisJCQkweDAwMDAwMDAxKTsKKwkJLyoKKwkJICogRmx1c2ggUENJIHdyaXRlLiAgVGhpcyBhbHNvIGd1YXJhbnRlZXMgdGhhdCBvdXIKKwkJICogc3RhdHVzIGJsb2NrIGhhcyBiZWVuIGZsdXNoZWQgdG8gaG9zdCBtZW1vcnkuCisJCSAqLworCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCXRwLT5od19zdGF0dXMtPnN0YXR1cyAmPSB+U0RfU1RBVFVTX1VQREFURUQ7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisKKwlzdHJ1Y3QgdGczICp0cCA9ICZ0ZzM7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IDA7CisKKwlpZiAoICh0cC0+aHdfc3RhdHVzLT5pZHhbMF0ucnhfcHJvZHVjZXIgIT0gdHAtPnJ4X3JjYl9wdHIpICYmICFyZXRyaWV2ZSApIAorCSAgcmV0dXJuIDE7CisKKwl0ZzNfYWNrX2lycXModHApOworCisJaWYgKHRwLT5od19zdGF0dXMtPmlkeFswXS5yeF9wcm9kdWNlciAhPSB0cC0+cnhfcmNiX3B0cikgeworCQlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgbGVuOworCQlkZXNjID0gJnRwLT5yeF9yY2JbdHAtPnJ4X3JjYl9wdHJdOworCQlpZiAoKGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfUklOR19NQVNLKSA9PSBSWERfT1BBUVVFX1JJTkdfU1REKSB7CisJCQlsZW4gPSAoKGRlc2MtPmlkeF9sZW4gJiBSWERfTEVOX01BU0spID4+IFJYRF9MRU5fU0hJRlQpIC0gNDsgLyogb21pdCBjcmMgKi8KKwkJCQorCQkJbmljLT5wYWNrZXRsZW4gPSBsZW47CisJCQltZW1jcHkobmljLT5wYWNrZXQsIGJ1c190b192aXJ0KGRlc2MtPmFkZHJfbG8pLCBsZW4pOworCQkJcmVzdWx0ID0gMTsKKwkJfQorCQl0cC0+cnhfcmNiX3B0ciA9ICh0cC0+cnhfcmNiX3B0ciArIDEpICUgVEczX1JYX1JDQl9SSU5HX1NJWkU7CisJCQorCQkvKiBBQ0sgdGhlIHN0YXR1cyByaW5nICovCisJCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIHRwLT5yeF9yY2JfcHRyKTsKKworCQkvKiBSZWZpbGwgUlggcmluZy4gKi8KKwkJaWYgKHJlc3VsdCkgeworCQkJdHAtPnJ4X3N0ZF9wdHIgPSAodHAtPnJ4X3N0ZF9wdHIgKyAxKSAlIFRHM19SWF9SSU5HX1NJWkU7CisJCQl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLCB0cC0+cnhfc3RkX3B0cik7CisJCX0KKwl9CisJdGczX3BvbGxfbGluayh0cCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICp0cCwgaW50IGVudHJ5LAorCWRtYV9hZGRyX3QgbWFwcGluZywgaW50IGxlbiwgdWludDMyX3QgZmxhZ3MsCisJdWludDMyX3QgbXNzX2FuZF9pc19lbmQpCit7CisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyAqdHhkID0gICZ0cC0+dHhfcmluZ1tlbnRyeV07CisJaW50IGlzX2VuZCA9IChtc3NfYW5kX2lzX2VuZCAmIDB4MSk7CisJaWYgKGlzX2VuZCkgeworCQlmbGFncyB8PSBUWERfRkxBR19FTkQ7CisJfQorCisJdHhkLT5hZGRyX2hpICAgPSAwOworCXR4ZC0+YWRkcl9sbyAgID0gbWFwcGluZyAmIDB4ZmZmZmZmZmY7CisJdHhkLT5sZW5fZmxhZ3MgPSAobGVuIDw8IFRYRF9MRU5fU0hJRlQpIHwgZmxhZ3M7CisJdHhkLT52bGFuX3RhZyAgPSAwIDw8IFRYRF9WTEFOX1RBR19TSElGVDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0ZzNfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkc3RfYWRkciwKKwl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IGNoYXIgKnBhY2tldCkKK3sKKwlzdGF0aWMgc3RydWN0IGV0aF9mcmFtZSB7CisJCXVpbnQ4X3QgIGRzdF9hZGRyW0VUSF9BTEVOXTsKKwkJdWludDhfdCAgc3JjX2FkZHJbRVRIX0FMRU5dOworCQl1aW50MTZfdCB0eXBlOworCQl1aW50OF90ICBkYXRhIFtFVEhfRlJBTUVfTEVOIC0gRVRIX0hMRU5dOworCX0gZnJhbWVbMl07CisJc3RhdGljIGludCBmcmFtZV9pZHg7CisJCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyAqdHhkOworCXN0cnVjdCB0ZzMgKnRwOworCXVpbnQzMl90IGVudHJ5OworCWludCBpOworCisJLyogV2FpdCB1bnRpbCB0aGVyZSBpcyBhIGZyZWUgcGFja2V0IGZyYW1lICovCisJdHAgPSAmdGczOworCWkgPSAwOworCWVudHJ5ID0gdHAtPnR4X3Byb2Q7CisJd2hpbGUoKHRwLT5od19zdGF0dXMtPmlkeFswXS50eF9jb25zdW1lciAhPSBlbnRyeSkgJiYKKwkJKHRwLT5od19zdGF0dXMtPmlkeFswXS50eF9jb25zdW1lciAhPSBQUkVWX1RYKGVudHJ5KSkpIHsKKwkJbWRlbGF5KDEwKTsJLyogZ2l2ZSB0aGUgbmljayBhIGNoYW5jZSAqLworCQlwb2xsX2ludGVycnVwdGlvbnMoKTsKKwkJaWYgKCsraSA+IDUwMCkgeyAvKiB0aW1lb3V0IDVzIGZvciB0cmFuc21pdCAqLworCQkJcHJpbnRmKCJ0cmFuc21pdCB0aW1lZCBvdXRcbiIpOworCQkJdGczX2hhbHQodHApOworCQkJdGczX3NldHVwX2h3KHRwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoaSAhPSAwKSB7CisJCXByaW50ZigiIyIpOworCX0KKwkKKwkvKiBDb3B5IHRoZSBwYWNrZXQgdG8gdGhlIG91ciBsb2NhbCBidWZmZXIgKi8KKwltZW1jcHkoJmZyYW1lW2ZyYW1lX2lkeF0uZHN0X2FkZHIsIGRzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCZmcmFtZVtmcmFtZV9pZHhdLnNyY19hZGRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCWZyYW1lW2ZyYW1lX2lkeF0udHlwZSA9IGh0b25zKHR5cGUpOworCW1lbXNldCgmZnJhbWVbZnJhbWVfaWR4XS5kYXRhLCAwLCBzaXplb2YoZnJhbWVbZnJhbWVfaWR4XS5kYXRhKSk7CisJbWVtY3B5KCZmcmFtZVtmcmFtZV9pZHhdLmRhdGEsIHBhY2tldCwgc2l6ZSk7CisKKwkvKiBTZXR1cCB0aGUgcmluZyBidWZmZXIgZW50cnkgdG8gdHJhbnNtaXQgKi8KKwl0eGQgICAgICAgICAgICA9ICZ0cC0+dHhfcmluZ1tlbnRyeV07CisJdHhkLT5hZGRyX2hpICAgPSAwOyAvKiBFdGhlcmJvb3QgcnVucyB1bmRlciA0R0IgKi8KKwl0eGQtPmFkZHJfbG8gICA9IHZpcnRfdG9fYnVzKCZmcmFtZVtmcmFtZV9pZHhdKTsKKwl0eGQtPmxlbl9mbGFncyA9ICgoc2l6ZSArIEVUSF9ITEVOKSA8PCBUWERfTEVOX1NISUZUKSB8IFRYRF9GTEFHX0VORDsKKwl0eGQtPnZsYW5fdGFnICA9IDAgPDwgVFhEX1ZMQU5fVEFHX1NISUZUOworCisJLyogQWR2YW5jZSB0byB0aGUgbmV4dCBlbnRyeSAqLworCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJZnJhbWVfaWR4IF49IDE7CisKKwkvKiBQYWNrZXRzIGFyZSByZWFkeSwgdXBkYXRlIFR4IHByb2R1Y2VyIGlkeCBsb2NhbCBhbmQgb24gY2FyZCAqLworCXR3MzJfbWFpbGJveCgoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKKwl0dzMyX21haWxib3gyKChNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XKSwgZW50cnkpOworCXRwLT50eF9wcm9kID0gZW50cnk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGczX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2IF9fdW51c2VkKQoreworCXN0cnVjdCB0ZzMgKnRwID0gJnRnMzsKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwkvKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyAzIHB1cnBvc2VzLgorCSAqIFRoaXMgZGlzYWJsZXMgRE1BIGFuZCBpbnRlcnJ1cHRzIHNvIHdlIGRvbid0IHJlY2VpdmUKKwkgKiAgdW5leHBlY3RlZCBwYWNrZXRzIG9yIGludGVycnVwdHMgZnJvbSB0aGUgY2FyZCBhZnRlcgorCSAqICBldGhlcmJvb3QgaGFzIGZpbmlzaGVkLiAKKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICovCisJdGczX2hhbHQodHApOworCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19JTklUX0NPTVBMRVRFfFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCk7CisJdHAtPmNhcnJpZXJfb2sgPSAwOworCWlvdW5tYXAoKHZvaWQgKil0cC0+cmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0ZzNfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCitZb3Ugc2hvdWxkIG9taXQgdGhlIGxhc3QgYXJndW1lbnQgc3RydWN0IHBjaV9kZXZpY2UgKiBmb3IgYSBub24tUENJIE5JQworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0ZzNfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwlzdHJ1Y3QgdGczICp0cCA9ICZ0ZzM7CisJdW5zaWduZWQgbG9uZyB0ZzNyZWdfYmFzZSwgdGczcmVnX2xlbjsKKwlpbnQgaSwgZXJyLCBwbV9jYXA7CisKKwlpZiAocGRldiA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCh0cCwgMCwgc2l6ZW9mKCp0cCkpOworCisJYWRqdXN0X3BjaV9kZXZpY2UocGRldik7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwZGV2LT5pb2FkZHIgJiB+MzsKKworCS8qIEZpbmQgcG93ZXItbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAqLworCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtX2NhcCA9PSAwKSB7CisJCXByaW50ZigiQ2Fubm90IGZpbmQgUG93ZXJNYW5hZ2VtZW50IGNhcGFiaWxpdHksIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwl0ZzNyZWdfYmFzZSA9IHBjaV9iYXJfc3RhcnQocGRldiwgUENJX0JBU0VfQUREUkVTU18wKTsKKwlpZiAodGczcmVnX2Jhc2UgPT0gLTFVTCkgeworCQlwcmludGYoIlVudXNlYWJsZSBiYXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJdGczcmVnX2xlbiAgPSBwY2lfYmFyX3NpemUocGRldiwgIFBDSV9CQVNFX0FERFJFU1NfMCk7CisKKwl0cC0+cGRldiAgICAgICA9IHBkZXY7CisJdHAtPm5pYyAgICAgICAgPSBuaWM7CisJdHAtPnBtX2NhcCAgICAgPSBwbV9jYXA7CisJdHAtPnJ4X21vZGUgICAgPSAwOworCXRwLT50eF9tb2RlICAgID0gMDsKKwl0cC0+bWlfbW9kZSAgICA9IE1BQ19NSV9NT0RFX0JBU0U7CisJdHAtPnRnM19mbGFncyAgPSAwICYgflRHM19GTEFHX0lOSVRfQ09NUExFVEU7IAorCQorCS8qIFRoZSB3b3JkL2J5dGUgc3dhcCBjb250cm9scyBoZXJlIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzIGJ5dGUKKwkgKiBzd2FwcGluZy4gIERNQSBkYXRhIGJ5dGUgc3dhcHBpbmcgaXMgY29udHJvbGxlZCBpbiB0aGUgR1JDX01PREUKKwkgKiBzZXR0aW5nIGJlbG93LgorCSAqLworCXRwLT5taXNjX2hvc3RfY3RybCA9CisJCU1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisJCU1JU0NfSE9TVF9DVFJMX1dPUkRfU1dBUCB8CisJCU1JU0NfSE9TVF9DVFJMX0lORElSX0FDQ0VTUyB8CisJCU1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXOworCisJLyogVGhlIE5PTkZSTSAobm9uLWZyYW1lKSBieXRlL3dvcmQgc3dhcCBjb250cm9scyB0YWtlIGVmZmVjdAorCSAqIG9uIGRlc2NyaXB0b3IgZW50cmllcywgYW55dGhpbmcgd2hpY2ggaXNuJ3QgcGFja2V0IGRhdGEuCisJICoKKwkgKiBUaGUgU3Ryb25nQVJNIGNoaXBzIG9uIHRoZSBib2FyZCAob25lIGZvciB0eCwgb25lIGZvciByeCkKKwkgKiBhcmUgcnVubmluZyBpbiBiaWctZW5kaWFuIG1vZGUuCisJICovCisJdHAtPmdyY19tb2RlID0gKEdSQ19NT0RFX1dTV0FQX0RBVEEgfCBHUkNfTU9ERV9CU1dBUF9EQVRBIHwKKwkJCUdSQ19NT0RFX1dTV0FQX05PTkZSTV9EQVRBKTsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0JTV0FQX05PTkZSTV9EQVRBOworI2VuZGlmCisJdHAtPnJlZ3MgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCh0ZzNyZWdfYmFzZSwgdGczcmVnX2xlbik7CisJaWYgKHRwLT5yZWdzID09IDBVTCkgeworCQlwcmludGYoIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgYWJvcnRpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0ZzNfaW5pdF9saW5rX2NvbmZpZyh0cCk7CisKKwllcnIgPSB0ZzNfZ2V0X2ludmFyaWFudHModHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJQcm9ibGVtIGZldGNoaW5nIGludmFyaWFudHMgb2YgY2hpcCwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJZXJyID0gdGczX2dldF9kZXZpY2VfYWRkcmVzcyh0cCk7CisJaWYgKGVycikgeworCQlwcmludGYoIkNvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCXByaW50ZigiRXRoZXJuZXQgYWRkcjogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKKworCXRnM19zZXR1cF9kbWEodHApOworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBmdWxseSBzZXR1cCB0aGUgY2hpcCwgc2F2ZSBhd2F5IGEgc25hcHNob3QKKwkgKiBvZiB0aGUgUENJIGNvbmZpZyBzcGFjZS4gIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGlzIGFmdGVyCisJICogR1JDX01JU0NfQ0ZHIGNvcmUgY2xvY2sgcmVzZXRzIGFuZCBzb21lIHJlc3VtZSBldmVudHMuCisJICovCisJcGNpX3NhdmVfc3RhdGUodHAtPnBkZXYsIHRwLT5wY2lfY2ZnX3N0YXRlKTsKKworCXByaW50ZigiVGlnb24zIFtwYXJ0bm8oJXMpIHJldiAlaHggUEhZKCVzKV0gKFBDSSVzOiVzOiVzKVxuIiwKKwkJdHAtPmJvYXJkX3BhcnRfbnVtYmVyLAorCQl0cC0+cGNpX2NoaXBfcmV2X2lkLAorCQl0ZzNfcGh5X3N0cmluZyh0cCksCisJCSgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgPyAiWCIgOiAiIiksCisJCSgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEKSA/CisJCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIjEzM01IeiIgOiAiNjZNSHoiKSA6CisJCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIjEwME1IeiIgOiAiMzNNSHoiKSksCisJCSgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV8zMkJJVCkgPyAiMzItYml0IiA6ICI2NC1iaXQiKSk7CisKKworCWVyciA9IHRnM19zZXR1cF9odyh0cCk7IAorCWlmIChlcnIpIHsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfSAKKwl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0lOSVRfQ09NUExFVEU7CisKKwkvKiBXYWl0IGZvciBhIHJlYXNvbmFibGUgdGltZSBmb3IgdGhlIGxpbmsgdG8gY29tZSB1cCAqLworCXRnM19wb2xsX2xpbmsodHApOworCWZvcihpID0gMDsgIXRwLT5jYXJyaWVyX29rICYmIChpIDwgVkFMSURfTElOS19USU1FT1VUKjEwMCk7IGkrKykgeworCQltZGVsYXkoMSk7CisJCXRnM19wb2xsX2xpbmsodHApOworCX0KKwlpZiAoIXRwLT5jYXJyaWVyX29rKXsKKwkJcHJpbnRmKCJWYWxpZCBsaW5rIG5vdCBlc3RhYmxpc2hlZFxuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCWRldi0+ZGlzYWJsZSAgPSB0ZzNfZGlzYWJsZTsKKwluaWMtPnBvbGwgICAgID0gdGczX3BvbGw7CisJbmljLT50cmFuc21pdCA9IHRnM190cmFuc21pdDsKKwluaWMtPmlycSAgICAgID0gdGczX2lycTsKKworCXJldHVybiAxOworCisgZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoKHZvaWQgKil0cC0+cmVncyk7CisJcmV0dXJuIDA7CisgZXJyX291dF9kaXNhYmxlOgorCXRnM19kaXNhYmxlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHRnM19uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTRlNCwgMHgxNjQ0LCAidGczLTU3MDAiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMCIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY0NSwgInRnMy01NzAxIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDEiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NDYsICJ0ZzMtNTcwMiIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjQ3LCAidGczLTU3MDMiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMyIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY0OCwgInRnMy01NzA0IiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDQiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NGQsICJ0ZzMtNTcwMkZFIiwgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyRkUiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NTMsICJ0ZzMtNTcwNSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzA1IiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjU0LCAidGczLTU3MDVfMiIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNV8yIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjVkLCAidGczLTU3MDVNIiwgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNU0iKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NWUsICJ0ZzMtNTcwNU1fMiIsICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzA1TV8yIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjk2LCAidGczLTU3ODIiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTc4MiIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY5YywgInRnMy01Nzg4IiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3ODgiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YTYsICJ0ZzMtNTcwMlgiLCAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyWCIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTZhNywgInRnMy01NzAzWCIsICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDNYIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNmE4LCAidGczLTU3MDRTIiwgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNFMiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YzYsICJ0ZzMtNTcwMkEzIiwgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyQTMiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YzcsICJ0ZzMtNTcwM0EzIiwgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAzQTMiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE3MGQsICJ0ZzMtNTkwMSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1OTAxIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNzBlLCAidGczLTU5MDFfMiIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTkwMV8yIiksCitQQ0lfUk9NKDB4MTE0OCwgMHg0NDAwLCAidGczLTlEWFgiLCAgICAgICAgIlN5c2tvbm5lY3QgOURYWCIpLAorUENJX1JPTSgweDExNDgsIDB4NDUwMCwgInRnMy05TVhYIiwgICAgICAgICJTeXNrb25uZWN0IDlNWFgiKSwKK1BDSV9ST00oMHgxNzNiLCAweDAzZTgsICJ0ZzMtYWMxMDAwIiwgICAgICAiQWx0aW1hIEFDMTAwMCIpLAorUENJX1JPTSgweDE3M2IsIDB4MDNlOSwgInRnMy1hYzEwMDEiLCAgICAgICJBbHRpbWEgQUMxMDAxIiksCitQQ0lfUk9NKDB4MTczYiwgMHgwM2VhLCAidGczLWFjOTEwMCIsICAgICAgIkFsdGltYSBBQzkxMDAiKSwKK1BDSV9ST00oMHgxNzNiLCAweDAzZWIsICJ0ZzMtYWMxMDAzIiwgICAgICAiQWx0aW1hIEFDMTAwMyIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgdGczX2RyaXZlciA9IHsKKwkudHlwZQkgID0gTklDX0RSSVZFUiwKKwkubmFtZQkgID0gIlRHMyIsCisJLnByb2JlCSAgPSB0ZzNfcHJvYmUsCisJLmlkcwkgID0gdGczX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHRnM19uaWNzKS9zaXplb2YodGczX25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpJbmRleDogYi9uZXRib290L3RnMy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3RnMy5oCkBAIC0wLDAgKzEsMjIwMyBAQAorLyogJElkOiBncnViLTAuOTUtZGlza2xlc3MtcGF0Y2gtMi5wYXRjaCx2IDEuMS4xLjEgMjAwNS8wNi8xNCAwODoxODo1MCB3ZXNvbG93cyBFeHAgJAorICogdGczLmg6IERlZmluaXRpb25zIGZvciBCcm9hZGNvbSBUaWdvbjMgZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSmVmZiBHYXJ6aWsgKGpnYXJ6aWtAbWFuZHJha2Vzb2Z0LmNvbSkKKyAqLworCisjaWZuZGVmIF9UM19ICisjZGVmaW5lIF9UM19ICisKKyNpbmNsdWRlICJzdGRpbnQuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRtYV9hZGRyX3Q7CisKKy8qIEZyb20gbWlpLmggKi8KKworLyogSW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIGFkdmVydGlzZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsCQkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYJKDEgPDwgMikKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCSgxIDw8IDMpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBBRFZFUlRJU0VEX0F1dG9uZWcJCSgxIDw8IDYpCisjZGVmaW5lIEFEVkVSVElTRURfVFAJCQkoMSA8PCA3KQorI2RlZmluZSBBRFZFUlRJU0VEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIEFEVkVSVElTRURfTUlJCQkJKDEgPDwgOSkKKyNkZWZpbmUgQURWRVJUSVNFRF9GSUJSRQkJKDEgPDwgMTApCisjZGVmaW5lIEFEVkVSVElTRURfQk5DCQkJKDEgPDwgMTEpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbnZvbHZlZCBpbiBmb3JjaW5nIGEgcGFydGljdWxhciBsaW5rCisgKiBtb2RlIGZvciB0aGUgZGV2aWNlIGZvciBzZXR0aW5nIHRoaW5ncy4gIFdoZW4gZ2V0dGluZyB0aGUKKyAqIGRldmljZXMgc2V0dGluZ3MsIHRoZXNlIGluZGljYXRlIHRoZSBjdXJyZW50IG1vZGUgYW5kIHdoZXRoZXIKKyAqIGl0IHdhcyBmb2NlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KKyAqLworCisvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdC4gKi8KKyNkZWZpbmUgU1BFRURfMTAJCTAKKyNkZWZpbmUgU1BFRURfMTAwCQkxCisjZGVmaW5lIFNQRUVEXzEwMDAJCTIKKyNkZWZpbmUgU1BFRURfSU5WQUxJRCAgICAgICAgICAgMworCisKKy8qIER1cGxleCwgaGFsZiBvciBmdWxsLiAqLworI2RlZmluZSBEVVBMRVhfSEFMRgkJMHgwMAorI2RlZmluZSBEVVBMRVhfRlVMTAkJMHgwMQorI2RlZmluZSBEVVBMRVhfSU5WQUxJRCAgICAgICAgICAweDAyCisKKy8qIFdoaWNoIGNvbm5lY3RvciBwb3J0LiAqLworI2RlZmluZSBQT1JUX1RQCQkJMHgwMAorI2RlZmluZSBQT1JUX0FVSQkJMHgwMQorI2RlZmluZSBQT1JUX01JSQkJMHgwMgorI2RlZmluZSBQT1JUX0ZJQlJFCQkweDAzCisjZGVmaW5lIFBPUlRfQk5DCQkweDA0CisKKy8qIFdoaWNoIHRyYW5jZWl2ZXIgdG8gdXNlLiAqLworI2RlZmluZSBYQ1ZSX0lOVEVSTkFMCQkweDAwCisjZGVmaW5lIFhDVlJfRVhURVJOQUwJCTB4MDEKKyNkZWZpbmUgWENWUl9EVU1NWTEJCTB4MDIKKyNkZWZpbmUgWENWUl9EVU1NWTIJCTB4MDMKKyNkZWZpbmUgWENWUl9EVU1NWTMJCTB4MDQKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uLiAgSWYgdGhpcyBpcyBzZXQgdG8gZW5hYmxlLAorICogdGhlIGZvcmNlZCBsaW5rIG1vZGVzIGFib3ZlIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCisKKy8qIFdha2UtT24tTGFuIG9wdGlvbnMuICovCisjZGVmaW5lIFdBS0VfUEhZCQkoMSA8PCAwKQorI2RlZmluZSBXQUtFX1VDQVNUCQkoMSA8PCAxKQorI2RlZmluZSBXQUtFX01DQVNUCQkoMSA8PCAyKQorI2RlZmluZSBXQUtFX0JDQVNUCQkoMSA8PCAzKQorI2RlZmluZSBXQUtFX0FSUAkJKDEgPDwgNCkKKyNkZWZpbmUgV0FLRV9NQUdJQwkJKDEgPDwgNSkKKyNkZWZpbmUgV0FLRV9NQUdJQ1NFQ1VSRQkoMSA8PCA2KSAvKiBvbmx5IG1lYW5pbmdmdWwgaWYgV0FLRV9NQUdJQyAqLworCisvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAweDAwICAgICAgICAvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JNU1IgICAgICAgICAgICAweDAxICAgICAgICAvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyICAgICAgICAvKiBQSFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDIgICAgICAgICAweDAzICAgICAgICAvKiBQSFlTIElEIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0FEVkVSVElTRSAgICAgICAweDA0ICAgICAgICAvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICAgKi8KKyNkZWZpbmUgTUlJX0xQQSAgICAgICAgICAgICAweDA1ICAgICAgICAvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWcgICAgKi8KKyNkZWZpbmUgTUlJX0VYUEFOU0lPTiAgICAgICAweDA2ICAgICAgICAvKiBFeHBhbnNpb24gcmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0RDT1VOVEVSICAgICAgICAweDEyICAgICAgICAvKiBEaXNjb25uZWN0IGNvdW50ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0ZDU0NPVU5URVIgICAgICAweDEzICAgICAgICAvKiBGYWxzZSBjYXJyaWVyIGNvdW50ZXIgICAgICAgKi8KKyNkZWZpbmUgTUlJX05XQVlURVNUICAgICAgICAweDE0ICAgICAgICAvKiBOLXdheSBhdXRvLW5lZyB0ZXN0IHJlZyAgICAgKi8KKyNkZWZpbmUgTUlJX1JFUlJDT1VOVEVSICAgICAweDE1ICAgICAgICAvKiBSZWNlaXZlIGVycm9yIGNvdW50ZXIgICAgICAgKi8KKyNkZWZpbmUgTUlJX1NSRVZJU0lPTiAgICAgICAweDE2ICAgICAgICAvKiBTaWxpY29uIHJldmlzaW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFU1YxICAgICAgICAgICAweDE3ICAgICAgICAvKiBSZXNlcnZlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0xCUkVSUk9SICAgICAgICAweDE4ICAgICAgICAvKiBMcGJhY2ssIHJ4LCBieXBhc3MgZXJyb3IgICAgKi8KKyNkZWZpbmUgTUlJX1BIWUFERFIgICAgICAgICAweDE5ICAgICAgICAvKiBQSFkgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFU1YyICAgICAgICAgICAweDFhICAgICAgICAvKiBSZXNlcnZlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1RQSVNUQVRVUyAgICAgICAweDFiICAgICAgICAvKiBUUEkgc3RhdHVzIGZvciAxMG1icHMgICAgICAgKi8KKyNkZWZpbmUgTUlJX05DT05GSUcgICAgICAgICAweDFjICAgICAgICAvKiBOZXR3b3JrIGludGVyZmFjZSBjb25maWcgICAgKi8KKworLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCTUNSX1JFU1YgICAgICAgICAgICAgICAweDAwN2YgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0NUU1QgICAgICAgICAgICAgICAweDAwODAgIC8qIENvbGxpc2lvbiB0ZXN0ICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0ZVTExEUExYICAgICAgICAgICAweDAxMDAgIC8qIEZ1bGwgZHVwbGV4ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0FOUkVTVEFSVCAgICAgICAgICAweDAyMDAgIC8qIEF1dG8gbmVnb3RpYXRpb24gcmVzdGFydCAgICAqLworI2RlZmluZSBCTUNSX0lTT0xBVEUgICAgICAgICAgICAweDA0MDAgIC8qIERpc2Nvbm5lY3QgRFA4Mzg0MCBmcm9tIE1JSSAqLworI2RlZmluZSBCTUNSX1BET1dOICAgICAgICAgICAgICAweDA4MDAgIC8qIFBvd2VyZG93biB0aGUgRFA4Mzg0MCAgICAgICAqLworI2RlZmluZSBCTUNSX0FORU5BQkxFICAgICAgICAgICAweDEwMDAgIC8qIEVuYWJsZSBhdXRvIG5lZ290aWF0aW9uICAgICAqLworI2RlZmluZSBCTUNSX1NQRUVEMTAwICAgICAgICAgICAweDIwMDAgIC8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0xPT1BCQUNLICAgICAgICAgICAweDQwMDAgIC8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1JFU0VUICAgICAgICAgICAgICAweDgwMDAgIC8qIFJlc2V0IHRoZSBEUDgzODQwICAgICAgICAgICAqLworCisvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1TUl9FUkNBUCAgICAgICAgICAgICAgMHgwMDAxICAvKiBFeHQtcmVnIGNhcGFiaWxpdHkgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9KQ0QgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBKYWJiZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9MU1RBVFVTICAgICAgICAgICAgMHgwMDA0ICAvKiBMaW5rIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9BTkVHQ0FQQUJMRSAgICAgICAgMHgwMDA4ICAvKiBBYmxlIHRvIGRvIGF1dG8tbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgQk1TUl9SRkFVTFQgICAgICAgICAgICAgMHgwMDEwICAvKiBSZW1vdGUgZmF1bHQgZGV0ZWN0ZWQgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9BTkVHQ09NUExFVEUgICAgICAgMHgwMDIwICAvKiBBdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICAgKi8KKyNkZWZpbmUgQk1TUl9SRVNWICAgICAgICAgICAgICAgMHgwN2MwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl8xMEhBTEYgICAgICAgICAgICAgMHgwODAwICAvKiBDYW4gZG8gMTBtYnBzLCBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMEZVTEwgICAgICAgICAgICAgMHgxMDAwICAvKiBDYW4gZG8gMTBtYnBzLCBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMDBIQUxGICAgICAgICAgICAgMHgyMDAwICAvKiBDYW4gZG8gMTAwbWJwcywgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMICAgICAgICAgICAgMHg0MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBCQVNFNCAgICAgICAgICAgMHg4MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgNGsgcGFja2V0cyAgKi8KKworLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBRFZFUlRJU0VfU0xDVCAgICAgICAgICAweDAwMWYgIC8qIFNlbGVjdG9yIGJpdHMgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfQ1NNQSAgICAgICAgICAweDAwMDEgIC8qIE9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTBIQUxGICAgICAgICAweDAwMjAgIC8qIFRyeSBmb3IgMTBtYnBzIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTBGVUxMICAgICAgICAweDAwNDAgIC8qIFRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwSEFMRiAgICAgICAweDAwODAgIC8qIFRyeSBmb3IgMTAwbWJwcyBoYWxmLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwRlVMTCAgICAgICAweDAxMDAgIC8qIFRyeSBmb3IgMTAwbWJwcyBmdWxsLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwQkFTRTQgICAgICAweDAyMDAgIC8qIFRyeSBmb3IgMTAwbWJwcyA0ayBwYWNrZXRzICAqLworI2RlZmluZSBBRFZFUlRJU0VfUkVTViAgICAgICAgICAweDFjMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfUkZBVUxUICAgICAgICAweDIwMDAgIC8qIFNheSB3ZSBjYW4gZGV0ZWN0IGZhdWx0cyAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfTFBBQ0sgICAgICAgICAweDQwMDAgIC8qIEFjayBsaW5rIHBhcnRuZXJzIHJlc3BvbnNlICAqLworI2RlZmluZSBBRFZFUlRJU0VfTlBBR0UgICAgICAgICAweDgwMDAgIC8qIE5leHQgcGFnZSBiaXQgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEFEVkVSVElTRV9GVUxMIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisJCQlBRFZFUlRJU0VfQ1NNQSkKKyNkZWZpbmUgQURWRVJUSVNFX0FMTCAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBMUEFfU0xDVCAgICAgICAgICAgICAgICAweDAwMWYgIC8qIFNhbWUgYXMgYWR2ZXJ0aXNlIHNlbGVjdG9yICAqLworI2RlZmluZSBMUEFfMTBIQUxGICAgICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTBGVUxMICAgICAgICAgICAgICAweDAwNDAgIC8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwSEFMRiAgICAgICAgICAgICAweDAwODAgIC8qIENhbiBkbyAxMDBtYnBzIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBMUEFfMTAwRlVMTCAgICAgICAgICAgICAweDAxMDAgIC8qIENhbiBkbyAxMDBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBMUEFfMTAwQkFTRTQgICAgICAgICAgICAweDAyMDAgIC8qIENhbiBkbyAxMDBtYnBzIDRrIHBhY2tldHMgICAqLworI2RlZmluZSBMUEFfUkVTViAgICAgICAgICAgICAgICAweDFjMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUEFfUkZBVUxUICAgICAgICAgICAgICAweDIwMDAgIC8qIExpbmsgcGFydG5lciBmYXVsdGVkICAgICAgICAqLworI2RlZmluZSBMUEFfTFBBQ0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBMUEFfTlBBR0UgICAgICAgICAgICAgICAweDgwMDAgIC8qIE5leHQgcGFnZSBiaXQgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExQQV9EVVBMRVgJCShMUEFfMTBGVUxMIHwgTFBBXzEwMEZVTEwpCisjZGVmaW5lIExQQV8xMDAJCQkoTFBBXzEwMEZVTEwgfCBMUEFfMTAwSEFMRiB8IExQQV8xMDBCQVNFNCkKKworLyogRXhwYW5zaW9uIHJlZ2lzdGVyIGZvciBhdXRvLW5lZ290aWF0aW9uLiAqLworI2RlZmluZSBFWFBBTlNJT05fTldBWSAgICAgICAgICAweDAwMDEgIC8qIENhbiBkbyBOLXdheSBhdXRvLW5lZ28gICAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTENXUCAgICAgICAgICAweDAwMDIgIC8qIEdvdCBuZXcgUlggcGFnZSBjb2RlIHdvcmQgICAqLworI2RlZmluZSBFWFBBTlNJT05fRU5BQkxFTlBBR0UgICAweDAwMDQgIC8qIFRoaXMgZW5hYmxlcyBucGFnZSB3b3JkcyAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTlBDQVBBQkxFICAgICAweDAwMDggIC8qIExpbmsgcGFydG5lciBzdXBwb3J0cyBucGFnZSAqLworI2RlZmluZSBFWFBBTlNJT05fTUZBVUxUUyAgICAgICAweDAwMTAgIC8qIE11bHRpcGxlIGZhdWx0cyBkZXRlY3RlZCAgICAqLworI2RlZmluZSBFWFBBTlNJT05fUkVTViAgICAgICAgICAweGZmZTAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMSAgICAgICAgICAweDAwZmYgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOV0FZVEVTVF9MT09QQkFDSyAgICAgICAweDAxMDAgIC8qIEVuYWJsZSBsb29wYmFjayBmb3IgTi13YXkgICAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMiAgICAgICAgICAweGZlMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEZyb20gdGczLmggKi8KKworI2RlZmluZSBURzNfNjRCSVRfUkVHX0hJR0gJCTB4MDBVTAorI2RlZmluZSBURzNfNjRCSVRfUkVHX0xPVwkJMHgwNFVMCisKKy8qIERlc2NyaXB0b3IgYmxvY2sgaW5mby4gKi8KKyNkZWZpbmUgVEczX0JESU5GT19IT1NUX0FERFIJCTB4MFVMIC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNfQkRJTkZPX01BWExFTl9GTEFHUwkJMHg4VUwgLyogMzItYml0ICovCisjZGVmaW5lICBCRElORk9fRkxBR1NfVVNFX0VYVF9SRUNWCSAweDAwMDAwMDAxIC8qIGV4dCByeF9idWZmZXJfZGVzYyAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9NQVNLCSAweGZmZmYwMDAwCisjZGVmaW5lICBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUCSAxNgorI2RlZmluZSBURzNfQkRJTkZPX05JQ19BRERSCQkweGNVTCAvKiAzMi1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19TSVpFCQkJMHgxMFVMCisKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQgIAkJMjU2CisKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFCQkJMTUzNgorI2RlZmluZSBSWF9TVERfTUFYX1NJWkVfNTcwNQkJNTEyCisjZGVmaW5lIFJYX0pVTUJPX01BWF9TSVpFCQkweGRlYWRiZWVmIC8qIFhYWCAqLworCisvKiBGaXJzdCAyNTYgYnl0ZXMgYXJlIGEgbWlycm9yIG9mIFBDSSBjb25maWcgc3BhY2UuICovCisjZGVmaW5lIFRHM1BDSV9WRU5ET1IJCQkweDAwMDAwMDAwCisjZGVmaW5lICBURzNQQ0lfVkVORE9SX0JST0FEQ09NCQkgMHgxNGU0CisjZGVmaW5lIFRHM1BDSV9ERVZJQ0UJCQkweDAwMDAwMDAyCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18xCQkgMHgxNjQ0IC8qIEJDTTU3MDAgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzIJCSAweDE2NDUgLyogQkNNNTcwMSAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMwkJIDB4MTY0NiAvKiBCQ001NzAyICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM180CQkgMHgxNjQ3IC8qIEJDTTU3MDMgKi8KKyNkZWZpbmUgVEczUENJX0NPTU1BTkQJCQkweDAwMDAwMDA0CisjZGVmaW5lIFRHM1BDSV9TVEFUVVMJCQkweDAwMDAwMDA2CisjZGVmaW5lIFRHM1BDSV9DQ1JFVklECQkJMHgwMDAwMDAwOAorI2RlZmluZSBURzNQQ0lfQ0FDSEVMSU5FU1oJCTB4MDAwMDAwMGMKKyNkZWZpbmUgVEczUENJX0xBVFRJTUVSCQkJMHgwMDAwMDAwZAorI2RlZmluZSBURzNQQ0lfSEVBREVSVFlQRQkJMHgwMDAwMDAwZQorI2RlZmluZSBURzNQQ0lfQklTVAkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgVEczUENJX0JBU0UwX0xPVwkJMHgwMDAwMDAxMAorI2RlZmluZSBURzNQQ0lfQkFTRTBfSElHSAkJMHgwMDAwMDAxNAorLyogMHgxOCAtLT4gMHgyYyB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX1NVQlNZU1ZFTklECQkweDAwMDAwMDJjCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNJRAkJCTB4MDAwMDAwMmUKKyNkZWZpbmUgVEczUENJX1JPTUFERFIJCQkweDAwMDAwMDMwCisjZGVmaW5lIFRHM1BDSV9DQVBMSVNUCQkJMHgwMDAwMDAzNAorLyogMHgzNSAtLT4gMHgzYyB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX0lSUV9MSU5FCQkJMHgwMDAwMDAzYworI2RlZmluZSBURzNQQ0lfSVJRX1BJTgkJCTB4MDAwMDAwM2QKKyNkZWZpbmUgVEczUENJX01JTl9HTlQJCQkweDAwMDAwMDNlCisjZGVmaW5lIFRHM1BDSV9NQVhfTEFUCQkJMHgwMDAwMDAzZgorI2RlZmluZSBURzNQQ0lfWF9DQVBTCQkJMHgwMDAwMDA0MAorI2RlZmluZSAgUENJWF9DQVBTX1JFTEFYRURfT1JERVJJTkcJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9NQVNLCQkgMHgwMDcwMDAwMAorI2RlZmluZSAgUENJWF9DQVBTX1NQTElUX1NISUZUCQkgMjAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9NQVNLCQkgMHgwMDBjMDAwMAorI2RlZmluZSAgUENJWF9DQVBTX0JVUlNUX1NISUZUCQkgMTgKKyNkZWZpbmUgIFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IJIDIKKyNkZWZpbmUgVEczUENJX1BNX0NBUF9QVFIJCTB4MDAwMDAwNDEKKyNkZWZpbmUgVEczUENJX1hfQ09NTUFORAkJMHgwMDAwMDA0MgorI2RlZmluZSBURzNQQ0lfWF9TVEFUVVMJCQkweDAwMDAwMDQ0CisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfSUQJCTB4MDAwMDAwNDgKKyNkZWZpbmUgVEczUENJX1ZQRF9DQVBfUFRSCQkweDAwMDAwMDQ5CisjZGVmaW5lIFRHM1BDSV9QTV9DQVBTCQkJMHgwMDAwMDA0YQorI2RlZmluZSBURzNQQ0lfUE1fQ1RSTF9TVEFUCQkweDAwMDAwMDRjCisjZGVmaW5lIFRHM1BDSV9CUl9TVVBQX0VYVAkJMHgwMDAwMDA0ZQorI2RlZmluZSBURzNQQ0lfUE1fREFUQQkJCTB4MDAwMDAwNGYKKyNkZWZpbmUgVEczUENJX1ZQRF9DQVBfSUQJCTB4MDAwMDAwNTAKKyNkZWZpbmUgVEczUENJX01TSV9DQVBfUFRSCQkweDAwMDAwMDUxCisjZGVmaW5lIFRHM1BDSV9WUERfQUREUl9GTEFHCQkweDAwMDAwMDUyCisjZGVmaW5lICBWUERfQUREUl9GTEFHX1dSSVRFCQkweDAwMDA4MDAwCisjZGVmaW5lIFRHM1BDSV9WUERfREFUQQkJCTB4MDAwMDAwNTQKKyNkZWZpbmUgVEczUENJX01TSV9DQVBfSUQJCTB4MDAwMDAwNTgKKyNkZWZpbmUgVEczUENJX05YVF9DQVBfUFRSCQkweDAwMDAwMDU5CisjZGVmaW5lIFRHM1BDSV9NU0lfQ1RSTAkJCTB4MDAwMDAwNWEKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0xPVwkJMHgwMDAwMDA1YworI2RlZmluZSBURzNQQ0lfTVNJX0FERFJfSElHSAkJMHgwMDAwMDA2MAorI2RlZmluZSBURzNQQ0lfTVNJX0RBVEEJCQkweDAwMDAwMDY0CisvKiAweDY2IC0tPiAweDY4IHVudXNlZCAqLworI2RlZmluZSBURzNQQ0lfTUlTQ19IT1NUX0NUUkwJCTB4MDAwMDAwNjgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NMRUFSX0lOVAkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UCSAweDAwMDAwMDAyCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9CWVRFX1NXQVAJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1dPUkRfU1dBUAkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfUENJU1RBVEVfUlcJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NMS1JFR19SVwkgMHgwMDAwMDAyMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfUkVHV09SRF9TV0FQCSAweDAwMDAwMDQwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0lSUV9NQVNLX01PREUJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1RBR0dFRF9TVEFUVVMJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYJCSAweGZmZmYwMDAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUCSAxNgorI2RlZmluZSAgR0VUX0NISVBfUkVWX0lEKE1JU0NfSE9TVF9DVFJMKSBcCisJICgoKE1JU0NfSE9TVF9DVFJMKSAmIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYpID4+IFwKKwkgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVZfU0hJRlQpCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTAJCSAweDcwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BMQkJIDB4NzAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IwCQkgMHg3MTAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjEJCSAweDcxMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMwkJIDB4NzEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0FMVElNQQkJIDB4NzEwNAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0MwCQkgMHg3MjAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQTAJCSAweDAwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMAkJIDB4MDEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0IyCQkgMHgwMTAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjUJCSAweDAxMDUKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMAkJIDB4MTAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0ExCQkgMHgxMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTIJCSAweDEwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMwkJIDB4MTAwMworI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0EwCQkgMHgyMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTEJCSAweDIwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMgkJIDB4MjAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EwCQkgMHgzMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTEJCSAweDMwMDEKKyNkZWZpbmUJIENISVBSRVZfSURfNTcwNV9BMiAgICAgICAgICAgICAgMHgzMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTMgICAgICAgICAgICAgIDB4MzAwMworI2RlZmluZSAgR0VUX0FTSUNfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSA+PiAxMikKKyNkZWZpbmUgICBBU0lDX1JFVl81NzAwCQkJIDB4MDcKKyNkZWZpbmUgICBBU0lDX1JFVl81NzAxCQkJIDB4MDAKKyNkZWZpbmUgICBBU0lDX1JFVl81NzAzCQkJIDB4MDEKKyNkZWZpbmUgICBBU0lDX1JFVl81NzA0CQkJIDB4MDIKKyNkZWZpbmUgICBBU0lDX1JFVl81NzA1CQkJIDB4MDMKKyNkZWZpbmUgIEdFVF9DSElQX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgPj4gOCkKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQVgJCSAweDcwCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0JYCQkgMHg3MQorI2RlZmluZSAgIENISVBSRVZfNTcwMF9DWAkJIDB4NzIKKyNkZWZpbmUgICBDSElQUkVWXzU3MDFfQVgJCSAweDAwCisjZGVmaW5lICBHRVRfTUVUQUxfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSAmIDB4ZmYpCisjZGVmaW5lICAgTUVUQUxfUkVWX0EwCQkJIDB4MDAKKyNkZWZpbmUgICBNRVRBTF9SRVZfQTEJCQkgMHgwMQorI2RlZmluZSAgIE1FVEFMX1JFVl9CMAkJCSAweDAwCisjZGVmaW5lICAgTUVUQUxfUkVWX0IxCQkJIDB4MDEKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjIJCQkgMHgwMgorI2RlZmluZSBURzNQQ0lfRE1BX1JXX0NUUkwJCTB4MDAwMDAwNmMKKyNkZWZpbmUgIERNQV9SV0NUUkxfTUlOX0RNQQkJIDB4MDAwMDAwZmYKKyNkZWZpbmUgIERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVAkgMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZX01BU0sJIDB4MDAwMDA3MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV9ESVNBQgkgMHgwMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzE2CSAweDAwMDAwMTAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMzIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV82NAkgMHgwMDAwMDMwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEyOAkgMHgwMDAwMDQwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzI1NgkgMHgwMDAwMDUwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzUxMgkgMHgwMDAwMDYwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEwMjQJIDB4MDAwMDA3MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfTUFTSwkgMHgwMDAwMzgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9ESVNBQgkgMHgwMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xNgkgMHgwMDAwMDgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8zMgkgMHgwMDAwMTAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV82NAkgMHgwMDAwMTgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjgJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2CSAweDAwMDAyODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzUxMgkgMHgwMDAwMzAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMDI0CSAweDAwMDAzODAwCisjZGVmaW5lICBETUFfUldDVFJMX09ORV9ETUEJCSAweDAwMDA0MDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfV0FURVIJCSAweDAwMDcwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfV0FURVJfU0hJRlQJIDE2CisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX1dBVEVSCQkgMHgwMDM4MDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVAkgMTkKKyNkZWZpbmUgIERNQV9SV0NUUkxfVVNFX01FTV9SRUFEX01VTFQJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfQVNTRVJUX0FMTF9CRQkgMHgwMDgwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTUQJIDB4MGYwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1JFQURfQ01EX1NISUZUCSAyNAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01ECSAweGYwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQJIDI4CisjZGVmaW5lIFRHM1BDSV9QQ0lTVEFURQkJCTB4MDAwMDAwNzAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZPUkNFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUENJU1RBVEVfSU5UX05PVF9BQ1RJVkUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFBDSVNUQVRFX0NPTlZfUENJX01PREUJCSAweDAwMDAwMDA0CisjZGVmaW5lICBQQ0lTVEFURV9CVVNfU1BFRURfSElHSAkgMHgwMDAwMDAwOAorI2RlZmluZSAgUENJU1RBVEVfQlVTXzMyQklUCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUENJU1RBVEVfUk9NX0VOQUJMRQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFBDSVNUQVRFX1JPTV9SRVRSWV9FTkFCTEUJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZMQVRfVklFVwkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BCSAweDAwMDAyMDAwCisjZGVmaW5lIFRHM1BDSV9DTE9DS19DVFJMCQkweDAwMDAwMDc0CisjZGVmaW5lICBDTE9DS19DVFJMX0NPUkVDTEtfRElTQUJMRQkgMHgwMDAwMDIwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFCSAweDAwMDAwNDAwCisjZGVmaW5lICBDTE9DS19DVFJMX1RYQ0xLX0RJU0FCTEUJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfQUxUQ0xLCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9QV1JET1dOX1BMTDEzMwkgMHgwMDAwODAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFCQkgMHgwMDA0MDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF82MjVfQ09SRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOCSAweDAwMjAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFCSAweDAwNDAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVAkgMHg4MDAwMDAwMAorI2RlZmluZSBURzNQQ0lfUkVHX0JBU0VfQUREUgkJMHgwMDAwMDA3OAorI2RlZmluZSBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIJMHgwMDAwMDA3YworI2RlZmluZSBURzNQQ0lfUkVHX0RBVEEJCQkweDAwMDAwMDgwCisjZGVmaW5lIFRHM1BDSV9NRU1fV0lOX0RBVEEJCTB4MDAwMDAwODQKKyNkZWZpbmUgVEczUENJX01PREVfQ1RSTAkJMHgwMDAwMDA4OAorI2RlZmluZSBURzNQQ0lfTUlTQ19DRkcJCQkweDAwMDAwMDhjCisjZGVmaW5lIFRHM1BDSV9NSVNDX0xPQ0FMX0NUUkwJCTB4MDAwMDAwOTAKKy8qIDB4OTQgLS0+IDB4OTggdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVERfUklOR19QUk9EX0lEWAkweDAwMDAwMDk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNQQ0lfUkNWX1JFVF9SSU5HX0NPTl9JRFgJMHgwMDAwMDBhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczUENJX1NORF9QUk9EX0lEWAkJMHgwMDAwMDBhOCAvKiA2NC1iaXQgKi8KKy8qIDB4YjAgLS0+IDB4MTAwIHVudXNlZCAqLworCisvKiAweDEwMCAtLT4gMHgyMDAgdW51c2VkICovCisKKy8qIE1haWxib3ggcmVnaXN0ZXJzICovCisjZGVmaW5lIE1BSUxCT1hfSU5URVJSVVBUXzAJCTB4MDAwMDAyMDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfSU5URVJSVVBUXzEJCTB4MDAwMDAyMDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfSU5URVJSVVBUXzIJCTB4MDAwMDAyMTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfSU5URVJSVVBUXzMJCTB4MDAwMDAyMTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8wCQkweDAwMDAwMjIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMQkJMHgwMDAwMDIyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzIJCTB4MDAwMDAyMzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8zCQkweDAwMDAwMjM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNAkJMHgwMDAwMDI0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzUJCTB4MDAwMDAyNDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF82CQkweDAwMDAwMjUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNwkJMHgwMDAwMDI1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SRUxPQURfU1RBVAkJMHgwMDAwMDI2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfU1REX1BST0RfSURYCTB4MDAwMDAyNjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWX0pVTUJPX1BST0RfSURYCTB4MDAwMDAyNzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWX01JTklfUFJPRF9JRFgJMHgwMDAwMDI3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wCTB4MDAwMDAyODAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMQkweDAwMDAwMjg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzIJMHgwMDAwMDI5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8zCTB4MDAwMDAyOTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNAkweDAwMDAwMmEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzUJMHgwMDAwMDJhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF82CTB4MDAwMDAyYjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNwkweDAwMDAwMmI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzgJMHgwMDAwMDJjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF85CTB4MDAwMDAyYzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTAJMHgwMDAwMDJkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMQkweDAwMDAwMmQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEyCTB4MDAwMDAyZTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTMJMHgwMDAwMDJlOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xNAkweDAwMDAwMmYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzE1CTB4MDAwMDAyZjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wCTB4MDAwMDAzMDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xCTB4MDAwMDAzMDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8yCTB4MDAwMDAzMTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8zCTB4MDAwMDAzMTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF80CTB4MDAwMDAzMjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF81CTB4MDAwMDAzMjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF82CTB4MDAwMDAzMzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF83CTB4MDAwMDAzMzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF84CTB4MDAwMDAzNDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF85CTB4MDAwMDAzNDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMAkweDAwMDAwMzUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTEJMHgwMDAwMDM1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEyCTB4MDAwMDAzNjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMwkweDAwMDAwMzY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTQJMHgwMDAwMDM3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzE1CTB4MDAwMDAzNzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzAJMHgwMDAwMDM4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMQkweDAwMDAwMzg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8yCTB4MDAwMDAzOTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzMJMHgwMDAwMDM5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNAkweDAwMDAwM2EwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF81CTB4MDAwMDAzYTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzYJMHgwMDAwMDNiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNwkweDAwMDAwM2I4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF84CTB4MDAwMDAzYzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzkJMHgwMDAwMDNjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTAJMHgwMDAwMDNkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTEJMHgwMDAwMDNkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTIJMHgwMDAwMDNlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTMJMHgwMDAwMDNlOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTQJMHgwMDAwMDNmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMTUJMHgwMDAwMDNmOCAvKiA2NC1iaXQgKi8KKworLyogTUFDIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1BQ19NT0RFCQkJMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUFDX01PREVfSEFMRl9EVVBMRVgJCSAweDAwMDAwMDAyCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfTUFTSwkgMHgwMDAwMDAwYworI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX1RCSQkJIDB4MDAwMDAwMGMKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJCSAweDAwMDAwMDA4CisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfTUlJCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX05PTkUJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfSU5UX0xQQkFDSwkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX01PREVfVEFHR0VEX01BQ19DVFJMCSAweDAwMDAwMDgwCisjZGVmaW5lICBNQUNfTU9ERV9UWF9CVVJTVElORwkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE1BQ19NT0RFX01BWF9ERUZFUgkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIE1BQ19NT0RFX0xJTktfUE9MQVJJVFkJCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfRU5BQkxFCQkgMHgwMDAwMDgwMAorI2RlZmluZSAgTUFDX01PREVfUlhTVEFUX0NMRUFSCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTUFDX01PREVfUlhTVEFUX0ZMVVNICQkgMHgwMDAwMjAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0VOQUJMRQkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYU1RBVF9DTEVBUgkJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYU1RBVF9GTFVTSAkJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1NFTkRfQ09ORklHUwkJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX01BR0lDX1BLVF9FTkFCTEUJIDB4MDAwNDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX0FDUElfRU5BQkxFCQkgMHgwMDA4MDAwMAorI2RlZmluZSAgTUFDX01PREVfTUlQX0VOQUJMRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1RERV9FTkFCTEUJCSAweDAwMjAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9SREVfRU5BQkxFCQkgMHgwMDQwMDAwMAorI2RlZmluZSAgTUFDX01PREVfRkhERV9FTkFCTEUJCSAweDAwODAwMDAwCisjZGVmaW5lIE1BQ19TVEFUVVMJCQkweDAwMDAwNDA0CisjZGVmaW5lICBNQUNfU1RBVFVTX1BDU19TWU5DRUQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfU1RBVFVTX1NJR05BTF9ERVQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBNQUNfU1RBVFVTX1JDVkRfQ0ZHCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VECSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfU1RBVFVTX1BPUlRfREVDX0VSUgkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VECSAweDAwMDAxMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX01JX0NPTVBMRVRJT04JIDB4MDA0MDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTUlfSU5URVJSVVBUCSAweDAwODAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX0FQX0VSUk9SCQkgMHgwMTAwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19PRElfRVJST1IJCSAweDAyMDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX1JYU1RBVF9PVkVSUlVOCSAweDA0MDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX1RYU1RBVF9PVkVSUlVOCSAweDA4MDAwMDAwCisjZGVmaW5lIE1BQ19FVkVOVAkJCTB4MDAwMDA0MDgKKyNkZWZpbmUgIE1BQ19FVkVOVF9QT1JUX0RFQ09ERV9FUlIJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9MTktTVEFURV9DSEFOR0VECSAweDAwMDAxMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTUlfQ09NUExFVElPTgkgMHgwMDQwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX01JX0lOVEVSUlVQVAkJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9BUF9FUlJPUgkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9PRElfRVJST1IJCSAweDAyMDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfUlhTVEFUX09WRVJSVU4JIDB4MDQwMDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9UWFNUQVRfT1ZFUlJVTgkgMHgwODAwMDAwMAorI2RlZmluZSBNQUNfTEVEX0NUUkwJCQkweDAwMDAwNDBjCisjZGVmaW5lICBMRURfQ1RSTF9MTktMRURfT1ZFUlJJREUJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIExFRF9DVFJMXzEwMDBNQlBTX09OCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTEVEX0NUUkxfMTAwTUJQU19PTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIExFRF9DVFJMXzEwTUJQU19PTgkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfT1ZFUlJJREUJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfQkxJTksJCSAweDAwMDAwMDIwCisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX0xFRAkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIExFRF9DVFJMXzEwMDBNQlBTX1NUQVRVUwkgMHgwMDAwMDA4MAorI2RlZmluZSAgTEVEX0NUUkxfMTAwTUJQU19TVEFUVVMJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIExFRF9DVFJMXzEwTUJQU19TVEFUVVMJCSAweDAwMDAwMjAwCisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX1NUQVRVUwkgMHgwMDAwMDQwMAorI2RlZmluZSAgTEVEX0NUUkxfTUFDX01PREUJCSAweDAwMDAwMDAwCisjZGVmaW5lICBMRURfQ1RSTF9QSFlfTU9ERV8xCQkgMHgwMDAwMDgwMAorI2RlZmluZSAgTEVEX0NUUkxfUEhZX01PREVfMgkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfTUFTSwkgMHg3ZmY4MDAwMAorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUkFURV9TSElGVAkgMTkKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1BFUl9PVkVSUklERQkgMHgwMDA4MDAwMAorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUkFURV9PVkVSUklERQkgMHg4MDAwMDAwMAorI2RlZmluZSBNQUNfQUREUl8wX0hJR0gJCQkweDAwMDAwNDEwIC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMF9MT1cJCQkweDAwMDAwNDE0IC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMV9ISUdICQkJMHgwMDAwMDQxOCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzFfTE9XCQkJMHgwMDAwMDQxYyAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzJfSElHSAkJCTB4MDAwMDA0MjAgLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8yX0xPVwkJCTB4MDAwMDA0MjQgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8zX0hJR0gJCQkweDAwMDAwNDI4IC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfM19MT1cJCQkweDAwMDAwNDJjIC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FDUElfTUJVRl9QVFIJCTB4MDAwMDA0MzAKKyNkZWZpbmUgTUFDX0FDUElfTEVOX09GRlNFVAkJMHgwMDAwMDQzNAorI2RlZmluZSAgQUNQSV9MRU5PRkZfTEVOX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9MRU5fU0hJRlQJCSAwCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9PRkZfTUFTSwkJIDB4MGZmZjAwMDAKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX09GRl9TSElGVAkJIDE2CisjZGVmaW5lIE1BQ19UWF9CQUNLT0ZGX1NFRUQJCTB4MDAwMDA0MzgKKyNkZWZpbmUgIFRYX0JBQ0tPRkZfU0VFRF9NQVNLCQkgMHgwMDAwMDNmZgorI2RlZmluZSBNQUNfUlhfTVRVX1NJWkUJCQkweDAwMDAwNDNjCisjZGVmaW5lICBSWF9NVFVfU0laRV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSBNQUNfUENTX1RFU1QJCQkweDAwMDAwNDQwCisjZGVmaW5lICBQQ1NfVEVTVF9QQVRURVJOX01BU0sJCSAweDAwMGZmZmZmCisjZGVmaW5lICBQQ1NfVEVTVF9QQVRURVJOX1NISUZUCQkgMAorI2RlZmluZSAgUENTX1RFU1RfRU5BQkxFCQkgMHgwMDEwMDAwMAorI2RlZmluZSBNQUNfVFhfQVVUT19ORUcJCQkweDAwMDAwNDQ0CisjZGVmaW5lICBUWF9BVVRPX05FR19NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgVFhfQVVUT19ORUdfU0hJRlQJCSAwCisjZGVmaW5lIE1BQ19SWF9BVVRPX05FRwkJCTB4MDAwMDA0NDgKKyNkZWZpbmUgIFJYX0FVVE9fTkVHX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBSWF9BVVRPX05FR19TSElGVAkJIDAKKyNkZWZpbmUgTUFDX01JX0NPTQkJCTB4MDAwMDA0NGMKKyNkZWZpbmUgIE1JX0NPTV9DTURfTUFTSwkJIDB4MGMwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9DTURfV1JJVEUJCSAweDA0MDAwMDAwCisjZGVmaW5lICBNSV9DT01fQ01EX1JFQUQJCSAweDA4MDAwMDAwCisjZGVmaW5lICBNSV9DT01fUkVBRF9GQUlMRUQJCSAweDEwMDAwMDAwCisjZGVmaW5lICBNSV9DT01fU1RBUlQJCQkgMHgyMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0JVU1kJCQkgMHgyMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1BIWV9BRERSX01BU0sJCSAweDAzZTAwMDAwCisjZGVmaW5lICBNSV9DT01fUEhZX0FERFJfU0hJRlQJCSAyMQorI2RlZmluZSAgTUlfQ09NX1JFR19BRERSX01BU0sJCSAweDAwMWYwMDAwCisjZGVmaW5lICBNSV9DT01fUkVHX0FERFJfU0hJRlQJCSAxNgorI2RlZmluZSAgTUlfQ09NX0RBVEFfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgTUFDX01JX1NUQVQJCQkweDAwMDAwNDUwCisjZGVmaW5lICBNQUNfTUlfU1RBVF9MTktTVEFUX0FUVE5fRU5BQgkgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNfTUlfTU9ERQkJCTB4MDAwMDA0NTQKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0NMS18xME1IWgkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX1NIT1JUX1BSRUFNQkxFCSAweDAwMDAwMDAyCisjZGVmaW5lICBNQUNfTUlfTU9ERV9BVVRPX1BPTEwJCSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfTUlfTU9ERV9DT1JFX0NMS182Mk1IWgkgMHgwMDAwODAwMAorI2RlZmluZSAgTUFDX01JX01PREVfQkFTRQkJIDB4MDAwYzAwMDAgLyogWFhYIG1hZ2ljIHZhbHVlcyBYWFggKi8KKyNkZWZpbmUgTUFDX0FVVE9fUE9MTF9TVEFUVVMJCTB4MDAwMDA0NTgKKyNkZWZpbmUgIE1BQ19BVVRPX1BPTExfRVJST1IJCSAweDAwMDAwMDAxCisjZGVmaW5lIE1BQ19UWF9NT0RFCQkJMHgwMDAwMDQ1YworI2RlZmluZSAgVFhfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBUWF9NT0RFX0VOQUJMRQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBUWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEUJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFRYX01PREVfQklHX0JDS09GRl9FTkFCTEUJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFRYX01PREVfTE9OR19QQVVTRV9FTkFCTEUJIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRVUwkJCTB4MDAwMDA0NjAKKyNkZWZpbmUgIFRYX1NUQVRVU19YT0ZGRUQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBUWF9TVEFUVVNfU0VOVF9YT0ZGCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgVFhfU1RBVFVTX1NFTlRfWE9OCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgVFhfU1RBVFVTX0xJTktfVVAJCSAweDAwMDAwMDA4CisjZGVmaW5lICBUWF9TVEFUVVNfT0RJX1VOREVSUlVOCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgVFhfU1RBVFVTX09ESV9PVkVSUlVOCQkgMHgwMDAwMDAyMAorI2RlZmluZSBNQUNfVFhfTEVOR1RIUwkJCTB4MDAwMDA0NjQKKyNkZWZpbmUgIFRYX0xFTkdUSFNfU0xPVF9USU1FX01BU0sJIDB4MDAwMDAwZmYKKyNkZWZpbmUgIFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUCSAwCisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19NQVNLCQkgMHgwMDAwMGYwMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfU0hJRlQJCSA4CisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19DUlNfTUFTSwkgMHgwMDAwMzAwMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUCSAxMgorI2RlZmluZSBNQUNfUlhfTU9ERQkJCTB4MDAwMDA0NjgKKyNkZWZpbmUgIFJYX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUlhfTU9ERV9FTkFCTEUJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUlhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lICBSWF9NT0RFX0tFRVBfTUFDX0NUUkwJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSWF9NT0RFX0tFRVBfUEFVU0UJCSAweDAwMDAwMDEwCisjZGVmaW5lICBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJYX01PREVfQUNDRVBUX1JVTlRTCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgUlhfTU9ERV9MRU5fQ0hFQ0sJCSAweDAwMDAwMDgwCisjZGVmaW5lICBSWF9NT0RFX1BST01JU0MJCSAweDAwMDAwMTAwCisjZGVmaW5lICBSWF9NT0RFX05PX0NSQ19DSEVDSwkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJYX01PREVfS0VFUF9WTEFOX1RBRwkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgTUFDX1JYX1NUQVRVUwkJCTB4MDAwMDA0NmMKKyNkZWZpbmUgIFJYX1NUQVRVU19SRU1PVEVfVFhfWE9GRkVECSAweDAwMDAwMDAxCisjZGVmaW5lICBSWF9TVEFUVVNfWE9GRl9SQ1ZECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUlhfU1RBVFVTX1hPTl9SQ1ZECQkgMHgwMDAwMDAwNAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMAkJCTB4MDAwMDA0NzAKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzEJCQkweDAwMDAwNDc0CisjZGVmaW5lIE1BQ19IQVNIX1JFR18yCQkJMHgwMDAwMDQ3OAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMwkJCTB4MDAwMDA0N2MKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzAJCQkweDAwMDAwNDgwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMAkJCTB4MDAwMDA0ODQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEJCQkweDAwMDAwNDg4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMQkJCTB4MDAwMDA0OGMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzIJCQkweDAwMDAwNDkwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMgkJCTB4MDAwMDA0OTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzMJCQkweDAwMDAwNDk4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMwkJCTB4MDAwMDA0OWMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzQJCQkweDAwMDAwNGEwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNAkJCTB4MDAwMDA0YTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzUJCQkweDAwMDAwNGE4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNQkJCTB4MDAwMDA0YWMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzYJCQkweDAwMDAwNGIwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNgkJCTB4MDAwMDA0YjQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzcJCQkweDAwMDAwNGI4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNwkJCTB4MDAwMDA0YmMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzgJCQkweDAwMDAwNGMwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfOAkJCTB4MDAwMDA0YzQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzkJCQkweDAwMDAwNGM4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfOQkJCTB4MDAwMDA0Y2MKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEwCQkJMHgwMDAwMDRkMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEwCQkweDAwMDAwNGQ0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMQkJCTB4MDAwMDA0ZDgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMQkJMHgwMDAwMDRkYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTIJCQkweDAwMDAwNGUwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTIJCTB4MDAwMDA0ZTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEzCQkJMHgwMDAwMDRlOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEzCQkweDAwMDAwNGVjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xNAkJCTB4MDAwMDA0ZjAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xNAkJMHgwMDAwMDRmNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTUJCQkweDAwMDAwNGY4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTUJCTB4MDAwMDA0ZmMKKyNkZWZpbmUgIFJDVl9SVUxFX0RJU0FCTEVfTUFTSwkJIDB4N2ZmZmZmZmYKKyNkZWZpbmUgTUFDX1JDVl9SVUxFX0NGRwkJMHgwMDAwMDUwMAorI2RlZmluZSAgUkNWX1JVTEVfQ0ZHX0RFRkFVTFRfQ0xBU1MJMHgwMDAwMDAwOAorI2RlZmluZSBNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRQkweDAwMDAwNTA0CisvKiAweDUwOCAtLT4gMHg1MjAgdW51c2VkICovCisjZGVmaW5lIE1BQ19IQVNIUkVHVV8wCQkJMHgwMDAwMDUyMAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMQkJCTB4MDAwMDA1MjQKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzIJCQkweDAwMDAwNTI4CisjZGVmaW5lIE1BQ19IQVNIUkVHVV8zCQkJMHgwMDAwMDUyYworI2RlZmluZSBNQUNfRVhUQUREUl8wX0hJR0gJCTB4MDAwMDA1MzAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMF9MT1cJCTB4MDAwMDA1MzQKKyNkZWZpbmUgTUFDX0VYVEFERFJfMV9ISUdICQkweDAwMDAwNTM4CisjZGVmaW5lIE1BQ19FWFRBRERSXzFfTE9XCQkweDAwMDAwNTNjCisjZGVmaW5lIE1BQ19FWFRBRERSXzJfSElHSAkJMHgwMDAwMDU0MAorI2RlZmluZSBNQUNfRVhUQUREUl8yX0xPVwkJMHgwMDAwMDU0NAorI2RlZmluZSBNQUNfRVhUQUREUl8zX0hJR0gJCTB4MDAwMDA1NDgKKyNkZWZpbmUgTUFDX0VYVEFERFJfM19MT1cJCTB4MDAwMDA1NGMKKyNkZWZpbmUgTUFDX0VYVEFERFJfNF9ISUdICQkweDAwMDAwNTUwCisjZGVmaW5lIE1BQ19FWFRBRERSXzRfTE9XCQkweDAwMDAwNTU0CisjZGVmaW5lIE1BQ19FWFRBRERSXzVfSElHSAkJMHgwMDAwMDU1OAorI2RlZmluZSBNQUNfRVhUQUREUl81X0xPVwkJMHgwMDAwMDU1YworI2RlZmluZSBNQUNfRVhUQUREUl82X0hJR0gJCTB4MDAwMDA1NjAKKyNkZWZpbmUgTUFDX0VYVEFERFJfNl9MT1cJCTB4MDAwMDA1NjQKKyNkZWZpbmUgTUFDX0VYVEFERFJfN19ISUdICQkweDAwMDAwNTY4CisjZGVmaW5lIE1BQ19FWFRBRERSXzdfTE9XCQkweDAwMDAwNTZjCisjZGVmaW5lIE1BQ19FWFRBRERSXzhfSElHSAkJMHgwMDAwMDU3MAorI2RlZmluZSBNQUNfRVhUQUREUl84X0xPVwkJMHgwMDAwMDU3NAorI2RlZmluZSBNQUNfRVhUQUREUl85X0hJR0gJCTB4MDAwMDA1NzgKKyNkZWZpbmUgTUFDX0VYVEFERFJfOV9MT1cJCTB4MDAwMDA1N2MKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTBfSElHSAkJMHgwMDAwMDU4MAorI2RlZmluZSBNQUNfRVhUQUREUl8xMF9MT1cJCTB4MDAwMDA1ODQKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTFfSElHSAkJMHgwMDAwMDU4OAorI2RlZmluZSBNQUNfRVhUQUREUl8xMV9MT1cJCTB4MDAwMDA1OGMKKyNkZWZpbmUgTUFDX1NFUkRFU19DRkcJCQkweDAwMDAwNTkwCisjZGVmaW5lIE1BQ19TRVJERVNfU1RBVAkJCTB4MDAwMDA1OTQKKy8qIDB4NTk4IC0tPiAweDYwMCB1bnVzZWQgKi8KKyNkZWZpbmUgTUFDX1RYX01BQ19TVEFURV9CQVNFCQkweDAwMDAwNjAwIC8qIDE2IGJ5dGVzICovCisjZGVmaW5lIE1BQ19SWF9NQUNfU1RBVEVfQkFTRQkJMHgwMDAwMDYxMCAvKiAyMCBieXRlcyAqLworLyogMHg2MjQgLS0+IDB4ODAwIHVudXNlZCAqLworI2RlZmluZSBNQUNfVFhfU1RBVFNfT0NURVRTCQkweDAwMDAwODAwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMQkJMHgwMDAwMDgwNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfQ09MTElTSU9OUwkJMHgwMDAwMDgwOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfWE9OX1NFTlQJCTB4MDAwMDA4MGMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1hPRkZfU0VOVAkJMHgwMDAwMDgxMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjIJCTB4MDAwMDA4MTQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX01BQ19FUlJPUlMJCTB4MDAwMDA4MTgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1NJTkdMRV9DT0xMSVNJT05TCTB4MDAwMDA4MWMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX01VTFRfQ09MTElTSU9OUwkweDAwMDAwODIwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19ERUZFUlJFRAkJMHgwMDAwMDgyNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjMJCTB4MDAwMDA4MjgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0VYQ0VTU0lWRV9DT0wJMHgwMDAwMDgyYworI2RlZmluZSBNQUNfVFhfU1RBVFNfTEFURV9DT0wJCTB4MDAwMDA4MzAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzEJCTB4MDAwMDA4MzQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzIJCTB4MDAwMDA4MzgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzMJCTB4MDAwMDA4M2MKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzQJCTB4MDAwMDA4NDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzUJCTB4MDAwMDA4NDQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzYJCTB4MDAwMDA4NDgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzcJCTB4MDAwMDA4NGMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzgJCTB4MDAwMDA4NTAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzkJCTB4MDAwMDA4NTQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzEwCQkweDAwMDAwODU4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMQkJMHgwMDAwMDg1YworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTIJCTB4MDAwMDA4NjAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzEzCQkweDAwMDAwODY0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xNAkJMHgwMDAwMDg2OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfVUNBU1QJCTB4MDAwMDA4NmMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX01DQVNUCQkweDAwMDAwODcwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19CQ0FTVAkJMHgwMDAwMDg3NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjVfMQkJMHgwMDAwMDg3OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjVfMgkJMHgwMDAwMDg3YworI2RlZmluZSBNQUNfUlhfU1RBVFNfT0NURVRTCQkweDAwMDAwODgwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19SRVNWMQkJMHgwMDAwMDg4NAorI2RlZmluZSBNQUNfUlhfU1RBVFNfRlJBR01FTlRTCQkweDAwMDAwODg4CisjZGVmaW5lIE1BQ19SWF9TVEFUU19VQ0FTVAkJMHgwMDAwMDg4YworI2RlZmluZSBNQUNfUlhfU1RBVFNfTUNBU1QJCTB4MDAwMDA4OTAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0JDQVNUCQkweDAwMDAwODk0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19GQ1NfRVJST1JTCQkweDAwMDAwODk4CisjZGVmaW5lIE1BQ19SWF9TVEFUU19BTElHTl9FUlJPUlMJMHgwMDAwMDg5YworI2RlZmluZSBNQUNfUlhfU1RBVFNfWE9OX1BBVVNFX1JFQ1ZECTB4MDAwMDA4YTAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1hPRkZfUEFVU0VfUkVDVkQJMHgwMDAwMDhhNAorI2RlZmluZSBNQUNfUlhfU1RBVFNfTUFDX0NUUkxfUkVDVkQJMHgwMDAwMDhhOAorI2RlZmluZSBNQUNfUlhfU1RBVFNfWE9GRl9FTlRFUkVECTB4MDAwMDA4YWMKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZSQU1FX1RPT19MT05HCTB4MDAwMDA4YjAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0pBQkJFUlMJCTB4MDAwMDA4YjQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1VOREVSU0laRQkJMHgwMDAwMDhiOAorLyogMHg4YmMgLS0+IDB4YzAwIHVudXNlZCAqLworCisvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNORERBVEFJX01PREUJCQkweDAwMDAwYzAwCisjZGVmaW5lICBTTkREQVRBSV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUlfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkREQVRBSV9NT0RFX1NUQVRfT0ZMT1dfRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkREQVRBSV9TVEFUVVMJCQkweDAwMDAwYzA0CisjZGVmaW5lICBTTkREQVRBSV9TVEFUVVNfU1RBVF9PRkxPVwkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkREQVRBSV9TVEFUU0NUUkwJCTB4MDAwMDBjMDgKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0VOQUJMRQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0ZBU1RVUEQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9DTEVBUgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0ZMVVNICQkgMHgwMDAwMDAwOAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRk9SQ0VfWkVSTwkgMHgwMDAwMDAxMAorI2RlZmluZSBTTkREQVRBSV9TVEFUU0VOQUIJCTB4MDAwMDBjMGMKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNJTkNNQVNLCQkweDAwMDAwYzEwCisvKiAweGMxNCAtLT4gMHhjODAgdW51c2VkICovCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMAkJMHgwMDAwMGM4MAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEJCTB4MDAwMDBjODQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8yCQkweDAwMDAwYzg4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMwkJMHgwMDAwMGM4YworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzQJCTB4MDAwMDBjOTAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF81CQkweDAwMDAwYzk0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNgkJMHgwMDAwMGM5OAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzcJCTB4MDAwMDBjOWMKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF84CQkweDAwMDAwY2EwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfOQkJMHgwMDAwMGNhNAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEwCQkweDAwMDAwY2E4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTEJCTB4MDAwMDBjYWMKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMgkJMHgwMDAwMGNiMAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEzCQkweDAwMDAwY2I0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTQJCTB4MDAwMDBjYjgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xNQkJMHgwMDAwMGNiYworI2RlZmluZSBTTkREQVRBSV9ETUFfUkRRX0ZVTExfQ05UCTB4MDAwMDBjYzAKKyNkZWZpbmUgU05EREFUQUlfRE1BX1BSSU9fUkRRX0ZVTExfQ05UCTB4MDAwMDBjYzQKKyNkZWZpbmUgU05EREFUQUlfU0RDUV9GVUxMX0NOVAkJMHgwMDAwMGNjOAorI2RlZmluZSBTTkREQVRBSV9OSUNSTkdfU1NORF9QSURYX0NOVAkweDAwMDAwY2NjCisjZGVmaW5lIFNORERBVEFJX1NUQVRTX1VQREFURURfQ05UCTB4MDAwMDBjZDAKKyNkZWZpbmUgU05EREFUQUlfSU5URVJSVVBUU19DTlQJCTB4MDAwMDBjZDQKKyNkZWZpbmUgU05EREFUQUlfQVZPSURfSU5URVJSVVBUU19DTlQJMHgwMDAwMGNkOAorI2RlZmluZSBTTkREQVRBSV9TTkRfVEhSRVNIX0hJVF9DTlQJMHgwMDAwMGNkYworLyogMHhjZTAgLS0+IDB4MTAwMCB1bnVzZWQgKi8KKworLyogU2VuZCBkYXRhIGNvbXBsZXRpb24gY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EREFUQUNfTU9ERQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgIFNORERBVEFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKy8qIDB4MTAwNCAtLT4gMHgxNDAwIHVudXNlZCAqLworCisvKiBTZW5kIEJEIHJpbmcgc2VsZWN0b3IgKi8KKyNkZWZpbmUgU05EQkRTX01PREUJCQkweDAwMDAxNDAwCisjZGVmaW5lICBTTkRCRFNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNOREJEU19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNOREJEU19NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJEU19TVEFUVVMJCQkweDAwMDAxNDA0CisjZGVmaW5lICBTTkRCRFNfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRTX0hXRElBRwkJCTB4MDAwMDE0MDgKKy8qIDB4MTQwYyAtLT4gMHgxNDQwICovCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8wCQkweDAwMDAxNDQwCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xCQkweDAwMDAxNDQ0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8yCQkweDAwMDAxNDQ4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8zCQkweDAwMDAxNDRjCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF80CQkweDAwMDAxNDUwCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF81CQkweDAwMDAxNDU0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF82CQkweDAwMDAxNDU4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF83CQkweDAwMDAxNDVjCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF84CQkweDAwMDAxNDYwCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF85CQkweDAwMDAxNDY0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMAkJMHgwMDAwMTQ2OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTEJCTB4MDAwMDE0NmMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEyCQkweDAwMDAxNDcwCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMwkJMHgwMDAwMTQ3NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTQJCTB4MDAwMDE0NzgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzE1CQkweDAwMDAxNDdjCisvKiAweDE0ODAgLS0+IDB4MTgwMCB1bnVzZWQgKi8KKworLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EQkRJX01PREUJCQkweDAwMDAxODAwCisjZGVmaW5lICBTTkRCRElfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNOREJESV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNOREJESV9NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJESV9TVEFUVVMJCQkweDAwMDAxODA0CisjZGVmaW5lICBTTkRCRElfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzAJCTB4MDAwMDE4MDgKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzEJCTB4MDAwMDE4MGMKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzIJCTB4MDAwMDE4MTAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzMJCTB4MDAwMDE4MTQKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzQJCTB4MDAwMDE4MTgKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzUJCTB4MDAwMDE4MWMKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzYJCTB4MDAwMDE4MjAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzcJCTB4MDAwMDE4MjQKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzgJCTB4MDAwMDE4MjgKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzkJCTB4MDAwMDE4MmMKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzEwCQkweDAwMDAxODMwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMQkJMHgwMDAwMTgzNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTIJCTB4MDAwMDE4MzgKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzEzCQkweDAwMDAxODNjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xNAkJMHgwMDAwMTg0MAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTUJCTB4MDAwMDE4NDQKKy8qIDB4MTg0OCAtLT4gMHgxYzAwIHVudXNlZCAqLworCisvKiBTZW5kIEJEIGNvbXBsZXRpb24gY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EQkRDX01PREUJCQkweDAwMDAxYzAwCisjZGVmaW5lIFNOREJEQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSBTTkRCRENfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIFNOREJEQ19NT0RFX0FUVE5fRU5BQkxFCQkgMHgwMDAwMDAwNAorLyogMHgxYzA0IC0tPiAweDIwMDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWTFBDX01PREUJCQkweDAwMDAyMDAwCisjZGVmaW5lICBSQ1ZMUENfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX0NMQVNTMF9BVFROX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX01BUE9PUl9BQVRUTl9FTkFCCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZMUENfTU9ERV9TVEFUX09GTE9XX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWTFBDX1NUQVRVUwkJCTB4MDAwMDIwMDQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfQ0xBU1MwCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19NQVBPT1IJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX1NUQVRfT0ZMT1cJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWTFBDX0xPQ0sJCQkweDAwMDAyMDA4CisjZGVmaW5lICBSQ1ZMUENfTE9DS19SRVFfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX1JFUV9TSElGVAkJIDAKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX0dSQU5UX01BU0sJCSAweGZmZmYwMDAwCisjZGVmaW5lICBSQ1ZMUENfTE9DS19HUkFOVF9TSElGVAkgMTYKKyNkZWZpbmUgUkNWTFBDX05PTl9FTVBUWV9CSVRTCQkweDAwMDAyMDBjCisjZGVmaW5lICBSQ1ZMUENfTk9OX0VNUFRZX0JJVFNfTUFTSwkgMHgwMDAwZmZmZgorI2RlZmluZSBSQ1ZMUENfQ09ORklHCQkJMHgwMDAwMjAxMAorI2RlZmluZSBSQ1ZMUENfU1RBVFNDVFJMCQkweDAwMDAyMDE0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFNDVFJMX0VOQUJMRQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFBDX1NUQVRTQ1RSTF9GQVNUVVBECSAweDAwMDAwMDAyCisjZGVmaW5lIFJDVkxQQ19TVEFUU19FTkFCTEUJCTB4MDAwMDIwMTgKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0VOQUJfTE5HQlJTVF9SRklYCSAweDAwNDAwMDAwCisjZGVmaW5lIFJDVkxQQ19TVEFUU19JTkNNQVNLCQkweDAwMDAyMDFjCisvKiAweDIwMjAgLS0+IDB4MjEwMCB1bnVzZWQgKi8KKyNkZWZpbmUgUkNWTFBDX1NFTExTVF9CQVNFCQkweDAwMDAyMTAwIC8qIDE2IDE2LWJ5dGUgZW50cmllcyAqLworI2RlZmluZSAgU0VMTFNUX1RBSUwJCQkweDAwMDAwMDA0CisjZGVmaW5lICBTRUxMU1RfQ09OVAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgIFNFTExTVF9VTlVTRUQJCQkweDAwMDAwMDBjCisjZGVmaW5lIFJDVkxQQ19DT1NfQ05UTF9CQVNFCQkweDAwMDAyMjAwIC8qIDE2IDQtYnl0ZSBlbnRyaWVzICovCisjZGVmaW5lIFJDVkxQQ19EUk9QX0ZJTFRFUl9DTlQJCTB4MDAwMDIyNDAKKyNkZWZpbmUgUkNWTFBDX0RNQV9XUV9GVUxMX0NOVAkJMHgwMDAwMjI0NAorI2RlZmluZSBSQ1ZMUENfRE1BX0hJUFJJT19XUV9GVUxMX0NOVAkweDAwMDAyMjQ4CisjZGVmaW5lIFJDVkxQQ19OT19SQ1ZfQkRfQ05UCQkweDAwMDAyMjRjCisjZGVmaW5lIFJDVkxQQ19JTl9ESVNDQVJEU19DTlQJCTB4MDAwMDIyNTAKKyNkZWZpbmUgUkNWTFBDX0lOX0VSUk9SU19DTlQJCTB4MDAwMDIyNTQKKyNkZWZpbmUgUkNWTFBDX1JDVl9USFJFU0hfSElUX0NOVAkweDAwMDAyMjU4CisvKiAweDIyNWMgLS0+IDB4MjQwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sICovCisjZGVmaW5lIFJDVkRCRElfTU9ERQkJCTB4MDAwMDI0MDAKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZEQkRJX01PREVfSlVNQk9CRF9ORUVERUQJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9GUk1fVE9PX0JJRwkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWREJESV9NT0RFX0lOVl9SSU5HX1NaCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkRCRElfU1RBVFVTCQkJMHgwMDAwMjQwNAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfSlVNQk9CRF9ORUVERUQJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0ZSTV9UT09fQklHCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19JTlZfUklOR19TWgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZEQkRJX1NQTElUX0ZSQU1FX01JTlNaCTB4MDAwMDI0MDgKKy8qIDB4MjQwYyAtLT4gMHgyNDQwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZEQkRJX0pVTUJPX0JECQkweDAwMDAyNDQwIC8qIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIFJDVkRCRElfU1REX0JECQkJMHgwMDAwMjQ1MCAvKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBSQ1ZEQkRJX01JTklfQkQJCQkweDAwMDAyNDYwIC8qIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIFJDVkRCRElfSlVNQk9fQ09OX0lEWAkJMHgwMDAwMjQ3MAorI2RlZmluZSBSQ1ZEQkRJX1NURF9DT05fSURYCQkweDAwMDAyNDc0CisjZGVmaW5lIFJDVkRCRElfTUlOSV9DT05fSURYCQkweDAwMDAyNDc4CisvKiAweDI0N2MgLS0+IDB4MjQ4MCB1bnVzZWQgKi8KKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8wCQkweDAwMDAyNDgwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMQkJMHgwMDAwMjQ4NAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzIJCTB4MDAwMDI0ODgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8zCQkweDAwMDAyNDhjCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNAkJMHgwMDAwMjQ5MAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzUJCTB4MDAwMDI0OTQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF82CQkweDAwMDAyNDk4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNwkJMHgwMDAwMjQ5YworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzgJCTB4MDAwMDI0YTAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF85CQkweDAwMDAyNGE0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTAJCTB4MDAwMDI0YTgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMQkJMHgwMDAwMjRhYworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEyCQkweDAwMDAyNGIwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTMJCTB4MDAwMDI0YjQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xNAkJMHgwMDAwMjRiOAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzE1CQkweDAwMDAyNGJjCisjZGVmaW5lIFJDVkRCRElfSFdESUFHCQkJMHgwMDAwMjRjMAorLyogMHgyNGM0IC0tPiAweDI4MDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgUkNWRENDX01PREUJCQkweDAwMDAyODAwCisjZGVmaW5lICBSQ1ZEQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkRDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkRDQ19NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisvKiAweDI4MDQgLS0+IDB4MmMwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWQkRJX01PREUJCQkweDAwMDAyYzAwCisjZGVmaW5lICBSQ1ZCRElfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkJESV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkJESV9NT0RFX1JDQl9BVFROX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQkRJX1NUQVRVUwkJCTB4MDAwMDJjMDQKKyNkZWZpbmUgIFJDVkJESV9TVEFUVVNfUkNCX0FUVE4JCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkJESV9KVU1CT19QUk9EX0lEWAkJMHgwMDAwMmMwOAorI2RlZmluZSBSQ1ZCRElfU1REX1BST0RfSURYCQkweDAwMDAyYzBjCisjZGVmaW5lIFJDVkJESV9NSU5JX1BST0RfSURYCQkweDAwMDAyYzEwCisjZGVmaW5lIFJDVkJESV9NSU5JX1RIUkVTSAkJMHgwMDAwMmMxNAorI2RlZmluZSBSQ1ZCRElfU1REX1RIUkVTSAkJMHgwMDAwMmMxOAorI2RlZmluZSBSQ1ZCRElfSlVNQk9fVEhSRVNICQkweDAwMDAyYzFjCisvKiAweDJjMjAgLS0+IDB4MzAwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBCRCBDb21wbGV0aW9uIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkNDX01PREUJCQkweDAwMDAzMDAwCisjZGVmaW5lICBSQ1ZDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWQ0NfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZDQ19NT0RFX0FUVE5fRU5BQkxFCQkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZDQ19TVEFUVVMJCQkweDAwMDAzMDA0CisjZGVmaW5lICBSQ1ZDQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZDQ19KVU1QX1BST0RfSURYCQkweDAwMDAzMDA4CisjZGVmaW5lIFJDVkNDX1NURF9QUk9EX0lEWAkJMHgwMDAwMzAwYworI2RlZmluZSBSQ1ZDQ19NSU5JX1BST0RfSURYCQkweDAwMDAzMDEwCisvKiAweDMwMTQgLS0+IDB4MzQwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkxTQ19NT0RFCQkJMHgwMDAwMzQwMAorI2RlZmluZSAgUkNWTFNDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMU0NfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZMU0NfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZMU0NfU1RBVFVTCQkJMHgwMDAwMzQwNAorI2RlZmluZSAgUkNWTFNDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisvKiAweDM0MDggLS0+IDB4MzgwMCB1bnVzZWQgKi8KKworLyogTWJ1ZiBjbHVzdGVyIGZyZWUgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1CRlJFRV9NT0RFCQkJMHgwMDAwMzgwMAorI2RlZmluZSAgTUJGUkVFX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQkZSRUVfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1CRlJFRV9TVEFUVVMJCQkweDAwMDAzODA0CisvKiAweDM4MDggLS0+IDB4M2MwMCB1bnVzZWQgKi8KKworLyogSG9zdCBjb2FsZXNjaW5nIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhPU1RDQ19NT0RFCQkJMHgwMDAwM2MwMAorI2RlZmluZSAgSE9TVENDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9BVFROCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgSE9TVENDX01PREVfTk9XCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgSE9TVENDX01PREVfRlVMTF9TVEFUVVMJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFXzY0QllURQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFXzMyQllURQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0NMUlRJQ0tfUlhCRAkgMHgwMDAwMDIwMAorI2RlZmluZSAgSE9TVENDX01PREVfQ0xSVElDS19UWEJECSAweDAwMDAwNDAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT0lOVF9PTl9OT1cJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PSU5UX09OX0ZPUkNFCSAweDAwMDAxMDAwCisjZGVmaW5lIEhPU1RDQ19TVEFUVVMJCQkweDAwMDAzYzA0CisjZGVmaW5lICBIT1NUQ0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgSE9TVENDX1JYQ09MX1RJQ0tTCQkweDAwMDAzYzA4CisjZGVmaW5lICBMT1dfUlhDT0xfVElDS1MJCSAweDAwMDAwMDMyCisjZGVmaW5lICBERUZBVUxUX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA0OAorI2RlZmluZSAgSElHSF9SWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgSE9TVENDX1RYQ09MX1RJQ0tTCQkweDAwMDAzYzBjCisjZGVmaW5lICBMT1dfVFhDT0xfVElDS1MJCSAweDAwMDAwMDk2CisjZGVmaW5lICBERUZBVUxUX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDEyYworI2RlZmluZSAgSElHSF9UWENPTF9USUNLUwkJIDB4MDAwMDAxNDUKKyNkZWZpbmUgSE9TVENDX1JYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxMAorI2RlZmluZSAgTE9XX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIERFRkFVTFRfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgSElHSF9SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDEyCisjZGVmaW5lIEhPU1RDQ19UWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTQKKyNkZWZpbmUgIExPV19UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDM1CisjZGVmaW5lICBERUZBVUxUX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwNGIKKyNkZWZpbmUgIEhJR0hfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA1MgorI2RlZmluZSBIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzE4CisjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQorI2RlZmluZSBIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzFjCisjZGVmaW5lICBERUZBVUxUX1RYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQorI2RlZmluZSBIT1NUQ0NfUlhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzIwCisjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQorI2RlZmluZSBIT1NUQ0NfVFhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzI0CisjZGVmaW5lICBERUZBVUxUX1RYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQorI2RlZmluZSBIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTCQkweDAwMDAzYzI4CisjZGVmaW5lICBERUZBVUxUX1NUQVRfQ09BTF9USUNLUwkgMHgwMDBmNDI0MAorLyogMHgzYzJjIC0tPiAweDNjMzAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSCTB4MDAwMDNjMzAgLyogNjQtYml0ICovCisjZGVmaW5lIEhPU1RDQ19TVEFUVVNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX05JQ19BRERSCTB4MDAwMDNjNDAKKyNkZWZpbmUgSE9TVENDX1NUQVRVU19CTEtfTklDX0FERFIJMHgwMDAwM2M0NAorI2RlZmluZSBIT1NUQ0NfRkxPV19BVFROCQkweDAwMDAzYzQ4CisvKiAweDNjNGMgLS0+IDB4M2M1MCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX0pVTUJPX0NPTl9JRFgJCTB4MDAwMDNjNTAKKyNkZWZpbmUgSE9TVENDX1NURF9DT05fSURYCQkweDAwMDAzYzU0CisjZGVmaW5lIEhPU1RDQ19NSU5JX0NPTl9JRFgJCTB4MDAwMDNjNTgKKy8qIDB4M2M1YyAtLT4gMHgzYzgwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzAJCTB4MDAwMDNjODAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xCQkweDAwMDAzYzg0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMgkJMHgwMDAwM2M4OAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzMJCTB4MDAwMDNjOGMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF80CQkweDAwMDAzYzkwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNQkJMHgwMDAwM2M5NAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzYJCTB4MDAwMDNjOTgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF83CQkweDAwMDAzYzljCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfOAkJMHgwMDAwM2NhMAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzkJCTB4MDAwMDNjYTQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMAkJMHgwMDAwM2NhOAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzExCQkweDAwMDAzY2FjCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTIJCTB4MDAwMDNjYjAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMwkJMHgwMDAwM2NiNAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzE0CQkweDAwMDAzY2I4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTUJCTB4MDAwMDNjYmMKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzAJCTB4MDAwMDNjYzAKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzEJCTB4MDAwMDNjYzQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzIJCTB4MDAwMDNjYzgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzMJCTB4MDAwMDNjY2MKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzQJCTB4MDAwMDNjZDAKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzUJCTB4MDAwMDNjZDQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzYJCTB4MDAwMDNjZDgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzcJCTB4MDAwMDNjZGMKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzgJCTB4MDAwMDNjZTAKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzkJCTB4MDAwMDNjZTQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzEwCQkweDAwMDAzY2U4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMQkJMHgwMDAwM2NlYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTIJCTB4MDAwMDNjZjAKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzEzCQkweDAwMDAzY2Y0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xNAkJMHgwMDAwM2NmOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTUJCTB4MDAwMDNjZmMKKy8qIDB4M2QwMCAtLT4gMHg0MDAwIHVudXNlZCAqLworCisvKiBNZW1vcnkgYXJiaXRlciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNRU1BUkJfTU9ERQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIE1FTUFSQl9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUVNQVJCX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBNRU1BUkJfU1RBVFVTCQkJMHgwMDAwNDAwNAorI2RlZmluZSBNRU1BUkJfVFJBUF9BRERSX0xPVwkJMHgwMDAwNDAwOAorI2RlZmluZSBNRU1BUkJfVFJBUF9BRERSX0hJR0gJCTB4MDAwMDQwMGMKKy8qIDB4NDAxMCAtLT4gMHg0NDAwIHVudXNlZCAqLworCisvKiBCdWZmZXIgbWFuYWdlciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBCVUZNR1JfTU9ERQkJCTB4MDAwMDQ0MDAKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgQlVGTUdSX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX0JNX1RFU1QJCSAweDAwMDAwMDA4CisjZGVmaW5lICBCVUZNR1JfTU9ERV9NQkxPV19BVFROX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgQlVGTUdSX1NUQVRVUwkJCTB4MDAwMDQ0MDQKKyNkZWZpbmUgIEJVRk1HUl9TVEFUVVNfRVJST1IJCSAweDAwMDAwMDA0CisjZGVmaW5lICBCVUZNR1JfU1RBVFVTX01CTE9XCQkgMHgwMDAwMDAxMAorI2RlZmluZSBCVUZNR1JfTUJfUE9PTF9BRERSCQkweDAwMDA0NDA4CisjZGVmaW5lIEJVRk1HUl9NQl9QT09MX1NJWkUJCTB4MDAwMDQ0MGMKKyNkZWZpbmUgQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSCTB4MDAwMDQ0MTAKKyNkZWZpbmUgIERFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVIJIDB4MDAwMDAwNTAKKyNkZWZpbmUgIERFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfNTcwNQkgMHgwMDAwMDAwMAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl9KVU1CTyAweDAwMDAwMTMwCisjZGVmaW5lIEJVRk1HUl9NQl9NQUNSWF9MT1dfV0FURVIJMHgwMDAwNDQxNAorI2RlZmluZSAgREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVIJICAweDAwMDAwMDIwCisjZGVmaW5lICBERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUl81NzA1ICAweDAwMDAwMDEwCisjZGVmaW5lICBERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUl9KVU1CTyAweDAwMDAwMDk4CisjZGVmaW5lIEJVRk1HUl9NQl9ISUdIX1dBVEVSCQkweDAwMDA0NDE4CisjZGVmaW5lICBERUZBVUxUX01CX0hJR0hfV0FURVIJCSAweDAwMDAwMDYwCisjZGVmaW5lICBERUZBVUxUX01CX0hJR0hfV0FURVJfNTcwNQkgMHgwMDAwMDA2MAorI2RlZmluZSAgREVGQVVMVF9NQl9ISUdIX1dBVEVSX0pVTUJPCSAweDAwMDAwMTdjCisjZGVmaW5lIEJVRk1HUl9SWF9NQl9BTExPQ19SRVEJCTB4MDAwMDQ0MWMKKyNkZWZpbmUgIEJVRk1HUl9NQl9BTExPQ19CSVQJCSAweDEwMDAwMDAwCisjZGVmaW5lIEJVRk1HUl9SWF9NQl9BTExPQ19SRVNQCQkweDAwMDA0NDIwCisjZGVmaW5lIEJVRk1HUl9UWF9NQl9BTExPQ19SRVEJCTB4MDAwMDQ0MjQKKyNkZWZpbmUgQlVGTUdSX1RYX01CX0FMTE9DX1JFU1AJCTB4MDAwMDQ0MjgKKyNkZWZpbmUgQlVGTUdSX0RNQV9ERVNDX1BPT0xfQUREUgkweDAwMDA0NDJjCisjZGVmaW5lIEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUJMHgwMDAwNDQzMAorI2RlZmluZSBCVUZNR1JfRE1BX0xPV19XQVRFUgkJMHgwMDAwNDQzNAorI2RlZmluZSAgREVGQVVMVF9ETUFfTE9XX1dBVEVSCQkgMHgwMDAwMDAwNQorI2RlZmluZSBCVUZNR1JfRE1BX0hJR0hfV0FURVIJCTB4MDAwMDQ0MzgKKyNkZWZpbmUgIERFRkFVTFRfRE1BX0hJR0hfV0FURVIJCSAweDAwMDAwMDBhCisjZGVmaW5lIEJVRk1HUl9SWF9ETUFfQUxMT0NfUkVRCQkweDAwMDA0NDNjCisjZGVmaW5lIEJVRk1HUl9SWF9ETUFfQUxMT0NfUkVTUAkweDAwMDA0NDQwCisjZGVmaW5lIEJVRk1HUl9UWF9ETUFfQUxMT0NfUkVRCQkweDAwMDA0NDQ0CisjZGVmaW5lIEJVRk1HUl9UWF9ETUFfQUxMT0NfUkVTUAkweDAwMDA0NDQ4CisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMAkJCTB4MDAwMDQ0NGMKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18xCQkJMHgwMDAwNDQ1MAorI2RlZmluZSBCVUZNR1JfSFdESUFHXzIJCQkweDAwMDA0NDU0CisvKiAweDQ0NTggLS0+IDB4NDgwMCB1bnVzZWQgKi8KKworLyogUmVhZCBETUEgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkRNQUNfTU9ERQkJCTB4MDAwMDQ4MDAKKyNkZWZpbmUgIFJETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSRE1BQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJETUFDX01PREVfVEdUQUJPUlRfRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkRNQUNfTU9ERV9NU1RBQk9SVF9FTkFCCSAweDAwMDAwMDA4CisjZGVmaW5lICBSRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lICBSRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCCSAweDAwMDAwMDIwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCCSAweDAwMDAwMDQwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT09SRUFEX0VOQUIJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFJETUFDX01PREVfTE5HUkVBRF9FTkFCCSAweDAwMDAwMjAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1NQTElUX0VOQUJMRQkgMHgwMDAwMDgwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9TUExJVF9SRVNFVAkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT19TSVpFXzEyOAkgMHgwMDAyMDAwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPX0xPTkdfQlVSU1QJIDB4MDAwMzAwMDAKKyNkZWZpbmUgUkRNQUNfU1RBVFVTCQkJMHgwMDAwNDgwNAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX1RHVEFCT1JUCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX01TVEFCT1JUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX1BBUklUWUVSUgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19BRERST0ZMT1cJCSAweDAwMDAwMDIwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT09GTE9XCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0ZJRk9VUlVOCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0ZJRk9PUkVBRAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19MTkdSRUFECQkgMHgwMDAwMDIwMAorLyogMHg0ODA4IC0tPiAweDRjMDAgdW51c2VkICovCisKKy8qIFdyaXRlIERNQSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBXRE1BQ19NT0RFCQkJMHgwMDAwNGMwMAorI2RlZmluZSAgV0RNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFdETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgV0RNQUNfTU9ERV9UR1RBQk9SVF9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBXRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFdETUFDX01PREVfUEFSSVRZRVJSX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFdETUFDX01PREVfQUREUk9GTE9XX0VOQUIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFdETUFDX01PREVfRklGT09GTE9XX0VOQUIJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFdETUFDX01PREVfRklGT1VSVU5fRU5BQgkgMHgwMDAwMDA4MAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPT1JFQURfRU5BQgkgMHgwMDAwMDEwMAorI2RlZmluZSAgV0RNQUNfTU9ERV9MTkdSRUFEX0VOQUIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFdETUFDX01PREVfUlhfQUNDRUwJIAkgMHgwMDAwMDQwMAorI2RlZmluZSBXRE1BQ19TVEFUVVMJCQkweDAwMDA0YzA0CisjZGVmaW5lICBXRE1BQ19TVEFUVVNfVEdUQUJPUlQJCSAweDAwMDAwMDA0CisjZGVmaW5lICBXRE1BQ19TVEFUVVNfTVNUQUJPUlQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBXRE1BQ19TVEFUVVNfUEFSSVRZRVJSCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0FERFJPRkxPVwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPT0ZMT1cJCSAweDAwMDAwMDQwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfRklGT1VSVU4JCSAweDAwMDAwMDgwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfRklGT09SRUFECQkgMHgwMDAwMDEwMAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0xOR1JFQUQJCSAweDAwMDAwMjAwCisvKiAweDRjMDggLS0+IDB4NTAwMCB1bnVzZWQgKi8KKworLyogUGVyLWNwdSByZWdpc3RlciBvZmZzZXRzIChhcm05KSAqLworI2RlZmluZSBDUFVfTU9ERQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIENQVV9NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIENQVV9NT0RFX0hBTFQJCQkgMHgwMDAwMDQwMAorI2RlZmluZSBDUFVfU1RBVEUJCQkweDAwMDAwMDA0CisjZGVmaW5lIENQVV9FVlRNQVNLCQkJMHgwMDAwMDAwOAorLyogMHhjIC0tPiAweDFjIHJlc2VydmVkICovCisjZGVmaW5lIENQVV9QQwkJCQkweDAwMDAwMDFjCisjZGVmaW5lIENQVV9JTlNOCQkJMHgwMDAwMDAyMAorI2RlZmluZSBDUFVfU1BBRF9VRkxPVwkJCTB4MDAwMDAwMjQKKyNkZWZpbmUgQ1BVX1dET0dfQ0xFQVIJCQkweDAwMDAwMDI4CisjZGVmaW5lIENQVV9XRE9HX1ZFQ1RPUgkJCTB4MDAwMDAwMmMKKyNkZWZpbmUgQ1BVX1dET0dfUEMJCQkweDAwMDAwMDMwCisjZGVmaW5lIENQVV9IV19CUAkJCTB4MDAwMDAwMzQKKy8qIDB4MzggLS0+IDB4NDQgdW51c2VkICovCisjZGVmaW5lIENQVV9XRE9HX1NBVkVEX1NUQVRFCQkweDAwMDAwMDQ0CisjZGVmaW5lIENQVV9MQVNUX0JSQU5DSF9BRERSCQkweDAwMDAwMDQ4CisjZGVmaW5lIENQVV9TUEFEX1VGTE9XX1NFVAkJMHgwMDAwMDA0YworLyogMHg1MCAtLT4gMHgyMDAgdW51c2VkICovCisjZGVmaW5lIENQVV9SMAkJCQkweDAwMDAwMjAwCisjZGVmaW5lIENQVV9SMQkJCQkweDAwMDAwMjA0CisjZGVmaW5lIENQVV9SMgkJCQkweDAwMDAwMjA4CisjZGVmaW5lIENQVV9SMwkJCQkweDAwMDAwMjBjCisjZGVmaW5lIENQVV9SNAkJCQkweDAwMDAwMjEwCisjZGVmaW5lIENQVV9SNQkJCQkweDAwMDAwMjE0CisjZGVmaW5lIENQVV9SNgkJCQkweDAwMDAwMjE4CisjZGVmaW5lIENQVV9SNwkJCQkweDAwMDAwMjFjCisjZGVmaW5lIENQVV9SOAkJCQkweDAwMDAwMjIwCisjZGVmaW5lIENQVV9SOQkJCQkweDAwMDAwMjI0CisjZGVmaW5lIENQVV9SMTAJCQkJMHgwMDAwMDIyOAorI2RlZmluZSBDUFVfUjExCQkJCTB4MDAwMDAyMmMKKyNkZWZpbmUgQ1BVX1IxMgkJCQkweDAwMDAwMjMwCisjZGVmaW5lIENQVV9SMTMJCQkJMHgwMDAwMDIzNAorI2RlZmluZSBDUFVfUjE0CQkJCTB4MDAwMDAyMzgKKyNkZWZpbmUgQ1BVX1IxNQkJCQkweDAwMDAwMjNjCisjZGVmaW5lIENQVV9SMTYJCQkJMHgwMDAwMDI0MAorI2RlZmluZSBDUFVfUjE3CQkJCTB4MDAwMDAyNDQKKyNkZWZpbmUgQ1BVX1IxOAkJCQkweDAwMDAwMjQ4CisjZGVmaW5lIENQVV9SMTkJCQkJMHgwMDAwMDI0YworI2RlZmluZSBDUFVfUjIwCQkJCTB4MDAwMDAyNTAKKyNkZWZpbmUgQ1BVX1IyMQkJCQkweDAwMDAwMjU0CisjZGVmaW5lIENQVV9SMjIJCQkJMHgwMDAwMDI1OAorI2RlZmluZSBDUFVfUjIzCQkJCTB4MDAwMDAyNWMKKyNkZWZpbmUgQ1BVX1IyNAkJCQkweDAwMDAwMjYwCisjZGVmaW5lIENQVV9SMjUJCQkJMHgwMDAwMDI2NAorI2RlZmluZSBDUFVfUjI2CQkJCTB4MDAwMDAyNjgKKyNkZWZpbmUgQ1BVX1IyNwkJCQkweDAwMDAwMjZjCisjZGVmaW5lIENQVV9SMjgJCQkJMHgwMDAwMDI3MAorI2RlZmluZSBDUFVfUjI5CQkJCTB4MDAwMDAyNzQKKyNkZWZpbmUgQ1BVX1IzMAkJCQkweDAwMDAwMjc4CisjZGVmaW5lIENQVV9SMzEJCQkJMHgwMDAwMDI3YworLyogMHgyODAgLS0+IDB4NDAwIHVudXNlZCAqLworCisjZGVmaW5lIFJYX0NQVV9CQVNFCQkJMHgwMDAwNTAwMAorI2RlZmluZSBUWF9DUFVfQkFTRQkJCTB4MDAwMDU0MDAKKworLyogTWFpbGJveGVzICovCisjZGVmaW5lIEdSQ01CT1hfSU5URVJSVVBUXzAJCTB4MDAwMDU4MDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfSU5URVJSVVBUXzEJCTB4MDAwMDU4MDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfSU5URVJSVVBUXzIJCTB4MDAwMDU4MTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfSU5URVJSVVBUXzMJCTB4MDAwMDU4MTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8wCQkweDAwMDA1ODIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMQkJMHgwMDAwNTgyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzIJCTB4MDAwMDU4MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8zCQkweDAwMDA1ODM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNAkJMHgwMDAwNTg0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzUJCTB4MDAwMDU4NDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF82CQkweDAwMDA1ODUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNwkJMHgwMDAwNTg1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SRUxPQURfU1RBVAkJMHgwMDAwNTg2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZTVERfUFJPRF9JRFgJCTB4MDAwMDU4NjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWSlVNQk9fUFJPRF9JRFgJMHgwMDAwNTg3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZNSU5JX1BST0RfSURYCTB4MDAwMDU4NzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMAkweDAwMDA1ODgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEJMHgwMDAwNTg4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8yCTB4MDAwMDU4OTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMwkweDAwMDA1ODk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzQJMHgwMDAwNThhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF81CTB4MDAwMDU4YTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNgkweDAwMDA1OGIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzcJMHgwMDAwNThiOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF84CTB4MDAwMDU4YzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfOQkweDAwMDA1OGM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEwCTB4MDAwMDU4ZDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTEJMHgwMDAwNThkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMgkweDAwMDA1OGUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEzCTB4MDAwMDU4ZTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTQJMHgwMDAwNThmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xNQkweDAwMDA1OGY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMAkweDAwMDA1OTAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMQkweDAwMDA1OTA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMgkweDAwMDA1OTEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMwkweDAwMDA1OTE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfNAkweDAwMDA1OTIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfNQkweDAwMDA1OTI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfNgkweDAwMDA1OTMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfNwkweDAwMDA1OTM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfOAkweDAwMDA1OTQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfOQkweDAwMDA1OTQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTAJMHgwMDAwNTk1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzExCTB4MDAwMDU5NTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMgkweDAwMDA1OTYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTMJMHgwMDAwNTk2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzE0CTB4MDAwMDU5NzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xNQkweDAwMDA1OTc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8wCTB4MDAwMDU5ODAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzEJMHgwMDAwNTk4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMgkweDAwMDA1OTkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8zCTB4MDAwMDU5OTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzQJMHgwMDAwNTlhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNQkweDAwMDA1OWE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF82CTB4MDAwMDU5YjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzcJMHgwMDAwNTliOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfOAkweDAwMDA1OWMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF85CTB4MDAwMDU5YzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzEwCTB4MDAwMDU5ZDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzExCTB4MDAwMDU5ZDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzEyCTB4MDAwMDU5ZTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzEzCTB4MDAwMDU5ZTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzE0CTB4MDAwMDU5ZjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzE1CTB4MDAwMDU5ZjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfSElHSF9QUklPX0VWX1ZFQ1RPUgkweDAwMDA1YTAwCisjZGVmaW5lIEdSQ01CT1hfSElHSF9QUklPX0VWX01BU0sJMHgwMDAwNWEwNAorI2RlZmluZSBHUkNNQk9YX0xPV19QUklPX0VWX1ZFQwkJMHgwMDAwNWEwOAorI2RlZmluZSBHUkNNQk9YX0xPV19QUklPX0VWX01BU0sJMHgwMDAwNWEwYworLyogMHg1YTEwIC0tPiAweDVjMDAgKi8KKworLyogRmxvdyBUaHJvdWdoIHF1ZXVlcyAqLworI2RlZmluZSBGVFFfUkVTRVQJCQkweDAwMDA1YzAwCisvKiAweDVjMDQgLS0+IDB4NWMxMCB1bnVzZWQgKi8KKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfQ1RMCQkweDAwMDA1YzEwCisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX0ZVTExfQ05UCTB4MDAwMDVjMTQKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfRklGT19FTlFERVEJMHgwMDAwNWMxOAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9XUklURV9QRUVLCTB4MDAwMDVjMWMKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfQ1RMCQkweDAwMDA1YzIwCisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX0ZVTExfQ05UCTB4MDAwMDVjMjQKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfRklGT19FTlFERVEJMHgwMDAwNWMyOAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9XUklURV9QRUVLCTB4MDAwMDVjMmMKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfQ1RMCQkweDAwMDA1YzMwCisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX0ZVTExfQ05UCTB4MDAwMDVjMzQKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfRklGT19FTlFERVEJMHgwMDAwNWMzOAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19XUklURV9QRUVLCTB4MDAwMDVjM2MKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9DVEwJCTB4MDAwMDVjNDAKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9GVUxMX0NOVAkweDAwMDA1YzQ0CisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfRklGT19FTlFERVEJMHgwMDAwNWM0OAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWM0YworI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfQ1RMCQkweDAwMDA1YzUwCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9GVUxMX0NOVAkweDAwMDA1YzU0CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9GSUZPX0VOUURFUQkweDAwMDA1YzU4CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9XUklURV9QRUVLCTB4MDAwMDVjNWMKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX0NUTAkJMHgwMDAwNWM2MAorI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfRlVMTF9DTlQJMHgwMDAwNWM2NAorI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfRklGT19FTlFERVEJMHgwMDAwNWM2OAorI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfV1JJVEVfUEVFSwkweDAwMDA1YzZjCisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9DVEwJCTB4MDAwMDVjNzAKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX0ZVTExfQ05UCTB4MDAwMDVjNzQKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX0ZJRk9fRU5RREVRCTB4MDAwMDVjNzgKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX1dSSVRFX1BFRUsJMHgwMDAwNWM3YworI2RlZmluZSBGVFFfU1dUWVBFMV9DVEwJCQkweDAwMDA1YzgwCisjZGVmaW5lIEZUUV9TV1RZUEUxX0ZVTExfQ05UCQkweDAwMDA1Yzg0CisjZGVmaW5lIEZUUV9TV1RZUEUxX0ZJRk9fRU5RREVRCQkweDAwMDA1Yzg4CisjZGVmaW5lIEZUUV9TV1RZUEUxX1dSSVRFX1BFRUsJCTB4MDAwMDVjOGMKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX0NUTAkJMHgwMDAwNWM5MAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWM5NAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfRklGT19FTlFERVEJMHgwMDAwNWM5OAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1YzljCisjZGVmaW5lIEZUUV9IT1NUX0NPQUxfQ1RMCQkweDAwMDA1Y2EwCisjZGVmaW5lIEZUUV9IT1NUX0NPQUxfRlVMTF9DTlQJCTB4MDAwMDVjYTQKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9GSUZPX0VOUURFUQkweDAwMDA1Y2E4CisjZGVmaW5lIEZUUV9IT1NUX0NPQUxfV1JJVEVfUEVFSwkweDAwMDA1Y2FjCisjZGVmaW5lIEZUUV9NQUNfVFhfQ1RMCQkJMHgwMDAwNWNiMAorI2RlZmluZSBGVFFfTUFDX1RYX0ZVTExfQ05UCQkweDAwMDA1Y2I0CisjZGVmaW5lIEZUUV9NQUNfVFhfRklGT19FTlFERVEJCTB4MDAwMDVjYjgKKyNkZWZpbmUgRlRRX01BQ19UWF9XUklURV9QRUVLCQkweDAwMDA1Y2JjCisjZGVmaW5lIEZUUV9NQl9GUkVFX0NUTAkJCTB4MDAwMDVjYzAKKyNkZWZpbmUgRlRRX01CX0ZSRUVfRlVMTF9DTlQJCTB4MDAwMDVjYzQKKyNkZWZpbmUgRlRRX01CX0ZSRUVfRklGT19FTlFERVEJCTB4MDAwMDVjYzgKKyNkZWZpbmUgRlRRX01CX0ZSRUVfV1JJVEVfUEVFSwkJMHgwMDAwNWNjYworI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9DVEwJCTB4MDAwMDVjZDAKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfRlVMTF9DTlQJCTB4MDAwMDVjZDQKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfRklGT19FTlFERVEJMHgwMDAwNWNkOAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjZGMKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX0NUTAkJMHgwMDAwNWNlMAorI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfRlVMTF9DTlQJMHgwMDAwNWNlNAorI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfRklGT19FTlFERVEJMHgwMDAwNWNlOAorI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfV1JJVEVfUEVFSwkweDAwMDA1Y2VjCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9DVEwJCTB4MDAwMDVjZjAKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX0ZVTExfQ05UCTB4MDAwMDVjZjQKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX0ZJRk9fRU5RREVRCTB4MDAwMDVjZjgKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX1dSSVRFX1BFRUsJMHgwMDAwNWNmYworI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX0NUTAkJMHgwMDAwNWQwMAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX0ZVTExfQ05UCTB4MDAwMDVkMDQKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1ZDA4CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1ZDBjCisjZGVmaW5lIEZUUV9TV1RZUEUyX0NUTAkJCTB4MDAwMDVkMTAKKyNkZWZpbmUgRlRRX1NXVFlQRTJfRlVMTF9DTlQJCTB4MDAwMDVkMTQKKyNkZWZpbmUgRlRRX1NXVFlQRTJfRklGT19FTlFERVEJCTB4MDAwMDVkMTgKKyNkZWZpbmUgRlRRX1NXVFlQRTJfV1JJVEVfUEVFSwkJMHgwMDAwNWQxYworLyogMHg1ZDIwIC0tPiAweDYwMDAgdW51c2VkICovCisKKy8qIE1lc3NhZ2Ugc2lnbmFsZWQgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworI2RlZmluZSBNU0dJTlRfTU9ERQkJCTB4MDAwMDYwMDAKKyNkZWZpbmUgIE1TR0lOVF9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTVNHSU5UX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBNU0dJTlRfU1RBVFVTCQkJMHgwMDAwNjAwNAorI2RlZmluZSBNU0dJTlRfRklGTwkJCTB4MDAwMDYwMDgKKy8qIDB4NjAwYyAtLT4gMHg2NDAwIHVudXNlZCAqLworCisvKiBETUEgY29tcGxldGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BQ19NT0RFCQkJMHgwMDAwNjQwMAorI2RlZmluZSAgRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgRE1BQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKy8qIDB4NjQwNCAtLT4gMHg2ODAwIHVudXNlZCAqLworCisvKiBHUkMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEdSQ19NT0RFCQkJMHgwMDAwNjgwMAorI2RlZmluZSAgR1JDX01PREVfVVBEX09OX0NPQUwJCTB4MDAwMDAwMDEKKyNkZWZpbmUgIEdSQ19NT0RFX0JTV0FQX05PTkZSTV9EQVRBCTB4MDAwMDAwMDIKKyNkZWZpbmUgIEdSQ19NT0RFX1dTV0FQX05PTkZSTV9EQVRBCTB4MDAwMDAwMDQKKyNkZWZpbmUgIEdSQ19NT0RFX0JTV0FQX0RBVEEJCTB4MDAwMDAwMTAKKyNkZWZpbmUgIEdSQ19NT0RFX1dTV0FQX0RBVEEJCTB4MDAwMDAwMjAKKyNkZWZpbmUgIEdSQ19NT0RFX1NQTElUSERSCQkweDAwMDAwMTAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0ZSTV9DUkFDS0lORwkweDAwMDAwMjAwCisjZGVmaW5lICBHUkNfTU9ERV9JTkNMX0NSQwkJMHgwMDAwMDQwMAorI2RlZmluZSAgR1JDX01PREVfQUxMT1dfQkFEX0ZSTVMJMHgwMDAwMDgwMAorI2RlZmluZSAgR1JDX01PREVfTk9JUlFfT05fU0VORFMJMHgwMDAwMjAwMAorI2RlZmluZSAgR1JDX01PREVfTk9JUlFfT05fUkNWCQkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTU9ERV9GT1JDRV9QQ0kzMkJJVAkweDAwMDA4MDAwCisjZGVmaW5lICBHUkNfTU9ERV9IT1NUX1NUQUNLVVAJCTB4MDAwMTAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0hPU1RfU0VOREJEUwkJMHgwMDAyMDAwMAorI2RlZmluZSAgR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNCTB4MDAxMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTQkweDAwODAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fVFhfQ1BVX0FUVE4JMHgwMTAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX1JYX0NQVV9BVFROCTB4MDIwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9NQUNfQVRUTgkweDA0MDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fRE1BX0FUVE4JMHgwODAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX0ZMT1dfQVRUTgkweDEwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUwkweDIwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9NQ0FTVF9GUk1fRU5BQkxFCTB4NDAwMDAwMDAKKyNkZWZpbmUgR1JDX01JU0NfQ0ZHCQkJMHgwMDAwNjgwNAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0NPUkVDTEtfUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9NQVNLCTB4MDAwMDAwZmUKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQJMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX01BU0sJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDAJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDEJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDJGRQkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMwkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwM1MJMHgwMDAwMjAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDQJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDRDSU9CRSAweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNF9BMgkweDAwMDA4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OAkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OE0JMHgwMDAxODAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX0FDOTEwMDJBMSAweDAwMDE4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfS0VFUF9HUEhZX1BPV0VSCTB4MDQwMDAwMDAKKyNkZWZpbmUgR1JDX0xPQ0FMX0NUUkwJCQkweDAwMDA2ODA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfQUNUSVZFCQkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTENMQ1RSTF9DTEVBUklOVAkJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX0xDTENUUkxfU0VUSU5UCQkweDAwMDAwMDA0CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTgkweDAwMDAwMDA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMAkweDAwMDAwMTAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMQkweDAwMDAwMjAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMgkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMAkJMHgwMDAwMDgwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTEJCTB4MDAwMDEwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyCQkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMgkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9FWFRNRU1fRU5BQkxFCTB4MDAwMjAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaX01BU0sJCTB4MDAxYzAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzI1NksJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzUxMksJCTB4MDAwNDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzFNCQkweDAwMDgwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8yTQkJMHgwMDBjMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfNE0JCTB4MDAxMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzhNCQkweDAwMTQwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8xNk0JCTB4MDAxODAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0JBTktfU0VMRUNUCTB4MDAyMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX1NTUkFNX1RZUEUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTQkweDAxMDAwMDAwCisjZGVmaW5lIEdSQ19USU1FUgkJCTB4MDAwMDY4MGMKKyNkZWZpbmUgR1JDX1JYX0NQVV9FVkVOVAkJMHgwMDAwNjgxMAorI2RlZmluZSBHUkNfUlhfVElNRVJfUkVGCQkweDAwMDA2ODE0CisjZGVmaW5lIEdSQ19SWF9DUFVfU0VNCQkJMHgwMDAwNjgxOAorI2RlZmluZSBHUkNfUkVNT1RFX1JYX0NQVV9BVFROCQkweDAwMDA2ODFjCisjZGVmaW5lIEdSQ19UWF9DUFVfRVZFTlQJCTB4MDAwMDY4MjAKKyNkZWZpbmUgR1JDX1RYX1RJTUVSX1JFRgkJMHgwMDAwNjgyNAorI2RlZmluZSBHUkNfVFhfQ1BVX1NFTQkJCTB4MDAwMDY4MjgKKyNkZWZpbmUgR1JDX1JFTU9URV9UWF9DUFVfQVRUTgkJMHgwMDAwNjgyYworI2RlZmluZSBHUkNfTUVNX1BPV0VSX1VQCQkweDAwMDA2ODMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNfRUVQUk9NX0FERFIJCQkweDAwMDA2ODM4CisjZGVmaW5lICBFRVBST01fQUREUl9XUklURQkJMHgwMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfUkVBRAkJMHg4MDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfQ09NUExFVEUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0ZTTV9SRVNFVAkJMHgyMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfTUFTSwkJMHgxYzAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfU0hJRlQJMjYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1NUQVJUCQkweDAyMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9DTEtQRVJEX1NISUZUCTE2CisjZGVmaW5lICBFRVBST01fQUREUl9BRERSX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgIEVFUFJPTV9ERUZBVUxUX0NMT0NLX1BFUklPRAkweDYwCisjZGVmaW5lICBFRVBST01fQ0hJUF9TSVpFCQkoNjQgKiAxMDI0KQorI2RlZmluZSBHUkNfRUVQUk9NX0RBVEEJCQkweDAwMDA2ODNjCisjZGVmaW5lIEdSQ19FRVBST01fQ1RSTAkJCTB4MDAwMDY4NDAKKyNkZWZpbmUgR1JDX01ESV9DVFJMCQkJMHgwMDAwNjg0NAorI2RlZmluZSBHUkNfU0VFUFJPTV9ERUxBWQkJMHgwMDAwNjg0OAorLyogMHg2ODRjIC0tPiAweDZjMDAgdW51c2VkICovCisKKy8qIDB4NmMwMCAtLT4gMHg3MDAwIHVudXNlZCAqLworCisvKiBOVlJBTSBDb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVlJBTV9DTUQJCQkweDAwMDA3MDAwCisjZGVmaW5lICBOVlJBTV9DTURfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBOVlJBTV9DTURfRE9ORQkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOVlJBTV9DTURfR08JCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTlZSQU1fQ01EX1dSCQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE5WUkFNX0NNRF9SRAkJCSAweDAwMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DTURfRVJBU0UJCSAweDAwMDAwMDQwCisjZGVmaW5lICBOVlJBTV9DTURfRklSU1QJCSAweDAwMDAwMDgwCisjZGVmaW5lICBOVlJBTV9DTURfTEFTVAkJCSAweDAwMDAwMTAwCisjZGVmaW5lIE5WUkFNX1NUQVQJCQkweDAwMDA3MDA0CisjZGVmaW5lIE5WUkFNX1dSREFUQQkJCTB4MDAwMDcwMDgKKyNkZWZpbmUgTlZSQU1fQUREUgkJCTB4MDAwMDcwMGMKKyNkZWZpbmUgIE5WUkFNX0FERFJfTVNLCQkJMHgwMGZmZmZmZgorI2RlZmluZSBOVlJBTV9SRERBVEEJCQkweDAwMDA3MDEwCisjZGVmaW5lIE5WUkFNX0NGRzEJCQkweDAwMDA3MDE0CisjZGVmaW5lICBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQgkgMHgwMDAwMDAwMQorI2RlZmluZSAgTlZSQU1fQ0ZHMV9CVUZGRVJFRF9NT0RFCSAweDAwMDAwMDAyCisjZGVmaW5lICBOVlJBTV9DRkcxX1BBU1NfVEhSVQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5WUkFNX0NGRzFfQklUX0JBTkcJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOVlJBTV9DRkcxX0NPTVBBVF9CWVBBU1MJIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlZSQU1fQ0ZHMgkJCTB4MDAwMDcwMTgKKyNkZWZpbmUgTlZSQU1fQ0ZHMwkJCTB4MDAwMDcwMWMKKyNkZWZpbmUgTlZSQU1fU1dBUkIJCQkweDAwMDA3MDIwCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMgkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMwkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMAkJCSAweDAwMDAwMDEwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMQkJCSAweDAwMDAwMDIwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMgkJCSAweDAwMDAwMDQwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMwkJCSAweDAwMDAwMDgwCisjZGVmaW5lICBTV0FSQl9HTlQwCQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFNXQVJCX0dOVDEJCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgU1dBUkJfR05UMgkJCSAweDAwMDAwNDAwCisjZGVmaW5lICBTV0FSQl9HTlQzCQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFNXQVJCX1JFUTAJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgU1dBUkJfUkVRMQkJCSAweDAwMDAyMDAwCisjZGVmaW5lICBTV0FSQl9SRVEyCQkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTMJCQkgMHgwMDAwODAwMAorI2RlZmluZSAgICBOVlJBTV9CVUZGRVJFRF9QQUdFX1NJWkUJICAgMjY0CisjZGVmaW5lICAgIE5WUkFNX0JVRkZFUkVEX1BBR0VfUE9TCSAgIDkKKy8qIDB4NzAyNCAtLT4gMHg3NDAwIHVudXNlZCAqLworCisvKiAweDc0MDAgLS0+IDB4ODAwMCB1bnVzZWQgKi8KKworLyogMzJLIFdpbmRvdyBpbnRvIE5JQyBpbnRlcm5hbCBtZW1vcnkgKi8KKyNkZWZpbmUgTklDX1NSQU1fV0lOX0JBU0UJCTB4MDAwMDgwMDAKKworLyogT2Zmc2V0cyBpbnRvIGZpcnN0IDMyayBvZiBOSUMgaW50ZXJuYWwgbWVtb3J5LiAqLworI2RlZmluZSBOSUNfU1JBTV9QQUdFX1pFUk8JCTB4MDAwMDAwMDAKKyNkZWZpbmUgTklDX1NSQU1fU0VORF9SQ0IJCTB4MDAwMDAxMDAgLyogMTYgKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBOSUNfU1JBTV9SQ1ZfUkVUX1JDQgkJMHgwMDAwMDIwMCAvKiAxNiAqIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIE5JQ19TUkFNX1NUQVRTX0JMSwkJMHgwMDAwMDMwMAorI2RlZmluZSBOSUNfU1JBTV9TVEFUVVNfQkxLCQkweDAwMDAwYjAwCisKKyNkZWZpbmUgTklDX1NSQU1fRklSTVdBUkVfTUJPWAkJMHgwMDAwMGI1MAorI2RlZmluZSAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEJIDB4NEI2NTc2NTQKKyNkZWZpbmUgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMyCSAweDQ4NjE3NjRiIC8qICFkbWEgb24gbGlua2NoZyAqLworCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfU0lHCQkweDAwMDAwYjU0CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1NJR19NQUdJQwkgMHg0YjY1NzY1NCAvKiBhc2NpaSBmb3IgJ0tldlQnICovCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9DRkcJCQkweDAwMDAwYjU4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLCSAweDAwMDAwMDBjCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9VTktOT1dOCSAweDAwMDAwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfVFJJUExFX1NQRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX09QRU5fRFJBSU4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9MSU5LX1NQRAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9PVVRQVVQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLCSAweDAwMDAwMDMwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9VTktOT1dOCSAweDAwMDAwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9DT1BQRVIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0ZJQkVSCSAweDAwMDAwMDIwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19XT0xfRU5BQkxFCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX01JTklfUENJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MCQkgMHgwMDAwNDAwMAorCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfUEhZX0lECQkweDAwMDAwYjc0CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1BIWV9JRDFfTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9QSFlfSUQyX01BU0sJIDB4MDAwMGZmZmYKKworI2RlZmluZSBOSUNfU1JBTV9GV19DTURfTUJPWAkJMHgwMDAwMGI3OAorI2RlZmluZSAgRldDTURfTklDRFJWX0FMSVZFCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgRldDTURfTklDRFJWX1BBVVNFX0ZXCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgRldDTURfTklDRFJWX0lQVjRBRERSX0NIRwkgMHgwMDAwMDAwMworI2RlZmluZSAgRldDTURfTklDRFJWX0lQVjZBRERSX0NIRwkgMHgwMDAwMDAwNAorI2RlZmluZSAgRldDTURfTklDRFJWX0ZJWF9ETUFSCQkgMHgwMDAwMDAwNQorI2RlZmluZSAgRldDTURfTklDRFJWX0ZJWF9ETUFXCQkgMHgwMDAwMDAwNgorI2RlZmluZSBOSUNfU1JBTV9GV19DTURfTEVOX01CT1gJMHgwMDAwMGI3YworI2RlZmluZSBOSUNfU1JBTV9GV19DTURfREFUQV9NQk9YCTB4MDAwMDBiODAKKyNkZWZpbmUgTklDX1NSQU1fRldfQVNGX1NUQVRVU19NQk9YCTB4MDAwMDBjMDAKKyNkZWZpbmUgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gJMHgwMDAwMGMwNAorI2RlZmluZSAgRFJWX1NUQVRFX1NUQVJUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgRFJWX1NUQVRFX1VOTE9BRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIERSVl9TVEFURV9XT0wJCQkgMHgwMDAwMDAwMworI2RlZmluZSAgRFJWX1NUQVRFX1NVU1BFTkQJCSAweDAwMDAwMDA0CisKKyNkZWZpbmUgTklDX1NSQU1fRldfUkVTRVRfVFlQRV9NQk9YCTB4MDAwMDBjMDgKKworI2RlZmluZSBOSUNfU1JBTV9NQUNfQUREUl9ISUdIX01CT1gJMHgwMDAwMGMxNAorI2RlZmluZSBOSUNfU1JBTV9NQUNfQUREUl9MT1dfTUJPWAkweDAwMDAwYzE4CisKKyNkZWZpbmUgTklDX1NSQU1fUlhfTUlOSV9CVUZGRVJfREVTQwkweDAwMDAxMDAwCisKKyNkZWZpbmUgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9CQVNFCTB4MDAwMDIwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfU0laRQkgMHgwMDAwMjAwMAorI2RlZmluZSBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQwkJMHgwMDAwNDAwMCAvKiA1MTIgZW50cmllcyAqLworI2RlZmluZSBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQwkJMHgwMDAwNjAwMCAvKiAyNTYgZW50cmllcyAqLworI2RlZmluZSBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQwkweDAwMDA3MDAwIC8qIDI1NiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFCQkweDAwMDA4MDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTk2CSAweDAwMDE4MDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTY0CSAweDAwMDEwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRTU3MDUJMHgwMDAxMDAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU1NzA1CTB4MDAwMGUwMDAKKworLyogQ3VycmVudGx5IHRoaXMgaXMgZml4ZWQuICovCisjZGVmaW5lIFBIWV9BRERSCQkweDAxCisKKy8qIFRpZ29uMyBzcGVjaWZpYyBQSFkgTUlJIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgIFRHM19CTUNSX1NQRUVEMTAwMAkJMHgwMDQwCisKKyNkZWZpbmUgTUlJX1RHM19DVFJMCQkJMHgwOSAvKiAxMDAwLWJhc2VUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGCTB4MDEwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwJMHgwMjAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQVNfTUFTVEVSCQkweDA4MDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSCTB4MTAwMAorCisjZGVmaW5lIE1JSV9URzNfRVhUX0NUUkwJCTB4MTAgLyogRXh0ZW5kZWQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19FWFRfQ1RSTF9MTkszX0xFRF9NT0RFCTB4MDAwMgorI2RlZmluZSAgTUlJX1RHM19FWFRfQ1RSTF9UQkkJCTB4ODAwMAorCisjZGVmaW5lIE1JSV9URzNfRVhUX1NUQVQJCTB4MTEgLyogRXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9TVEFUX0xQQVNTCQkweDAxMDAKKworI2RlZmluZSBNSUlfVEczX0RTUF9SV19QT1JUCQkweDE1IC8qIERTUCBjb2VmZmljaWVudCByZWFkL3dyaXRlIHBvcnQgKi8KKworI2RlZmluZSBNSUlfVEczX0RTUF9BRERSRVNTCQkweDE3IC8qIERTUCBhZGRyZXNzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUlJX1RHM19BVVhfQ1RSTAkJMHgxOCAvKiBhdXhpbGxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUCQkweDE5IC8qIGF1eGlsbGlhcnkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfTFBBU1MJCTB4MDAwNAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUX1NQRE1BU0sJMHgwNzAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTBIQUxGCQkweDAxMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMEZVTEwJCTB4MDIwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMEhBTEYJMHgwMzAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwXzQJCTB4MDQwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMEZVTEwJMHgwNTAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwMEhBTEYJMHgwNjAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwMEZVTEwJMHgwNzAwCisKKyNkZWZpbmUgTUlJX1RHM19JU1RBVAkJCTB4MWEgLyogSVJRIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfVEczX0lNQVNLCQkJMHgxYiAvKiBJUlEgbWFzayByZWdpc3RlciAqLworCisvKiBJU1RBVC9JTUFTSyBldmVudCBiaXRzICovCisjZGVmaW5lIE1JSV9URzNfSU5UX0xJTktDSEcJCTB4MDAwMgorI2RlZmluZSBNSUlfVEczX0lOVF9TUEVFRENIRwkJMHgwMDA0CisjZGVmaW5lIE1JSV9URzNfSU5UX0RVUExFWENIRwkJMHgwMDA4CisjZGVmaW5lIE1JSV9URzNfSU5UX0FORUdfUEFHRV9SWAkweDA0MDAKKworLyogWFhYIEFkZCB0aGlzIHRvIG1paS5oICovCisjaWZuZGVmIEFEVkVSVElTRV9QQVVTRQorI2RlZmluZSBBRFZFUlRJU0VfUEFVU0VfQ0FQCQkweDA0MDAKKyNlbmRpZgorI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0VfQVNZTQorI2RlZmluZSBBRFZFUlRJU0VfUEFVU0VfQVNZTQkJMHgwODAwCisjZW5kaWYKKyNpZm5kZWYgTFBBX1BBVVNFCisjZGVmaW5lIExQQV9QQVVTRV9DQVAJCQkweDA0MDAKKyNlbmRpZgorI2lmbmRlZiBMUEFfUEFVU0VfQVNZTQorI2RlZmluZSBMUEFfUEFVU0VfQVNZTQkJCTB4MDgwMAorI2VuZGlmCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYW5hZ2UgdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSB0aWdvbjMuCisgKiBFaXRoZXIgdGhlIGRlc2NyaXB0b3JzIGFyZSBpbiBob3N0IERNQSdhYmxlIG1lbW9yeSwgb3IgdGhleQorICogZXhpc3Qgb25seSBpbiB0aGUgY2FyZHMgb24tY2hpcCBTUkFNLiAgQWxsIDE2IHNlbmQgYmRzIGFyZSB1bmRlcgorICogdGhlIHNhbWUgbW9kZSwgdGhleSBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgaW5kaXZpZHVhbGx5LgorICoKKyAqIFRoZSBtb2RlIHdlIHVzZSBpcyBjb250cm9sbGVkIGJ5IFRHM19GTEFHX0hPU1RfVFhEUyBpbiB0cC0+dGczX2ZsYWdzLgorICoKKyAqIFRvIHVzZSBob3N0IG1lbW9yeSBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaW4gR1JDX01PREUgcmVnaXN0ZXIuCisgKgkgICBNYWtlIHN1cmUgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgaXMgY2xlYXIuCisgKgkyKSBBbGxvY2F0ZSBETUEnYWJsZSBtZW1vcnkuCisgKgkzKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIERNQSBhZGRyZXNzIG9mIG1lbW9yeQorICoJICAgICAgb2J0YWluZWQgaW4gc3RlcCAyCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQy4KKyAqCSAgIGMpIFNldCBsZW4gZmllbGQgb2YgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgdG8gbnVtYmVyCisgKiAgICAgICAgICAgIG9mIFRYIGRlc2NyaXB0b3JzLiAgTGVhdmUgZmxhZ3MgZmllbGQgY2xlYXIuCisgKgk0KSBBY2Nlc3MgVFggZGVzY3JpcHRvcnMgdmlhIGhvc3QgbWVtb3J5LiAgVGhlIGNoaXAKKyAqCSAgIHdpbGwgcmVmZXRjaCBpbnRvIGxvY2FsIFNSQU0gYXMgbmVlZGVkIHdoZW4gcHJvZHVjZXIKKyAqCSAgIGluZGV4IG1haWxib3hlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBUbyB1c2Ugb24tY2hpcCBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyBpbiBHUkNfTU9ERSByZWdpc3Rlci4KKyAqCSAgIE1ha2Ugc3VyZSBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaXMgY2xlYXIuCisgKgkyKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIHplcm8uCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQworICoJICAgYykgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgaXMgZG9uJ3QgY2FyZS4KKyAqCTMpIEFjY2VzcyBUWCBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiBvbi1jaGlwIFNSQU0KKyAqCSAgIHVzaW5nIG5vcm1hbCB7cmVhZCx3cml0ZX1sKCkuICAoYW5kIG5vdCB1c2luZworICogICAgICAgICBwb2ludGVyIGRlcmVmZXJlbmNpbmcgb2YgaW9yZW1hcCgpJ2QgbWVtb3J5IGxpa2UKKyAqCSAgIHRoZSBicm9rZW4gQnJvYWRjb20gZHJpdmVyIGRvZXMpCisgKgorICogTm90ZSB0aGF0IEJESU5GT19GTEFHU19ESVNBQkxFRCBzaG91bGQgYmUgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBvZgorICogVEczX0JESU5GT19NQVhMRU5fRkxBR1Mgb2YgYWxsIHVudXNlZCBTRU5EX1JDQiBpbmRpY2VzLgorICovCitzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHsKKwl1aW50MzJfdAkJCWFkZHJfaGk7CisJdWludDMyX3QJCQlhZGRyX2xvOworCisJdWludDMyX3QJCQlsZW5fZmxhZ3M7CisjZGVmaW5lIFRYRF9GTEFHX1RDUFVEUF9DU1VNCQkweDAwMDEKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfQ1NVTQkJMHgwMDAyCisjZGVmaW5lIFRYRF9GTEFHX0VORAkJCTB4MDAwNAorI2RlZmluZSBUWERfRkxBR19JUF9GUkFHCQkweDAwMDgKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfRlJBR19FTkQJCTB4MDAxMAorI2RlZmluZSBUWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFRYRF9GTEFHX0NPQUxfTk9XCQkweDAwODAKKyNkZWZpbmUgVFhEX0ZMQUdfQ1BVX1BSRV9ETUEJCTB4MDEwMAorI2RlZmluZSBUWERfRkxBR19DUFVfUE9TVF9ETUEJCTB4MDIwMAorI2RlZmluZSBUWERfRkxBR19BRERfU1JDX0FERFIJCTB4MTAwMAorI2RlZmluZSBUWERfRkxBR19DSE9PU0VfU1JDX0FERFIJMHg2MDAwCisjZGVmaW5lIFRYRF9GTEFHX05PX0NSQwkJCTB4ODAwMAorI2RlZmluZSBUWERfTEVOX1NISUZUCQkJMTYKKworCXVpbnQzMl90CQkJdmxhbl90YWc7CisjZGVmaW5lIFRYRF9WTEFOX1RBR19TSElGVAkJMAorI2RlZmluZSBUWERfTVNTX1NISUZUCQkJMTYKK307CisKKyNkZWZpbmUgVFhEX0FERFIJCQkweDAwVUwgLyogNjQtYml0ICovCisjZGVmaW5lIFRYRF9MRU5fRkxBR1MJCQkweDA4VUwgLyogMzItYml0ICh1cHBlciAxNi1iaXRzIGFyZSBsZW4pICovCisjZGVmaW5lIFRYRF9WTEFOX1RBRwkJCTB4MGNVTCAvKiAzMi1iaXQgKHVwcGVyIDE2LWJpdHMgYXJlIHRhZykgKi8KKyNkZWZpbmUgVFhEX1NJWkUJCQkweDEwVUwKKworc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyB7CisJdWludDMyX3QJCQlhZGRyX2hpOworCXVpbnQzMl90CQkJYWRkcl9sbzsKKworCXVpbnQzMl90CQkJaWR4X2xlbjsKKyNkZWZpbmUgUlhEX0lEWF9NQVNLCTB4ZmZmZjAwMDAKKyNkZWZpbmUgUlhEX0lEWF9TSElGVAkxNgorI2RlZmluZSBSWERfTEVOX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBSWERfTEVOX1NISUZUCTAKKworCXVpbnQzMl90CQkJdHlwZV9mbGFnczsKKyNkZWZpbmUgUlhEX1RZUEVfU0hJRlQJMTYKKyNkZWZpbmUgUlhEX0ZMQUdTX1NISUZUCTAKKworI2RlZmluZSBSWERfRkxBR19FTkQJCQkweDAwMDQKKyNkZWZpbmUgUlhEX0ZMQUdfTUlOSQkJCTB4MDgwMAorI2RlZmluZSBSWERfRkxBR19KVU1CTwkJCTB4MDAyMAorI2RlZmluZSBSWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFJYRF9GTEFHX0VSUk9SCQkJMHgwNDAwCisjZGVmaW5lIFJYRF9GTEFHX0lQX0NTVU0JCTB4MTAwMAorI2RlZmluZSBSWERfRkxBR19UQ1BVRFBfQ1NVTQkJMHgyMDAwCisjZGVmaW5lIFJYRF9GTEFHX0lTX1RDUAkJCTB4NDAwMAorCisJdWludDMyX3QJCQlpcF90Y3BfY3N1bTsKKyNkZWZpbmUgUlhEX0lQQ1NVTV9NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JUENTVU1fU0hJRlQJMTYKKyNkZWZpbmUgUlhEX1RDUENTVU1fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9UQ1BDU1VNX1NISUZUCTAKKworCXVpbnQzMl90CQkJZXJyX3ZsYW47CisKKyNkZWZpbmUgUlhEX1ZMQU5fTUFTSwkJCTB4MDAwMGZmZmYKKworI2RlZmluZSBSWERfRVJSX0JBRF9DUkMJCQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9FUlJfQ09MTElTSU9OCQkweDAwMDIwMDAwCisjZGVmaW5lIFJYRF9FUlJfTElOS19MT1NUCQkweDAwMDQwMDAwCisjZGVmaW5lIFJYRF9FUlJfUEhZX0RFQ09ERQkJMHgwMDA4MDAwMAorI2RlZmluZSBSWERfRVJSX09ERF9OSUJCTEVfUkNWRF9NSUkJMHgwMDEwMDAwMAorI2RlZmluZSBSWERfRVJSX01BQ19BQlJUCQkweDAwMjAwMDAwCisjZGVmaW5lIFJYRF9FUlJfVE9PX1NNQUxMCQkweDAwNDAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTk9fUkVTT1VSQ0VTCQkweDAwODAwMDAwCisjZGVmaW5lIFJYRF9FUlJfSFVHRV9GUkFNRQkJMHgwMTAwMDAwMAorI2RlZmluZSBSWERfRVJSX01BU0sJCQkweGZmZmYwMDAwCisKKwl1aW50MzJfdAkJCXJlc2VydmVkOworCXVpbnQzMl90CQkJb3BhcXVlOworI2RlZmluZSBSWERfT1BBUVVFX0lOREVYX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX09QQVFVRV9JTkRFWF9TSElGVAkJMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfU1RECQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19KVU1CTwkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUlOSQkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUFTSwkJMHgwMDA3MDAwMAorfTsKKworc3RydWN0IHRnM19leHRfcnhfYnVmZmVyX2Rlc2MgeworCXN0cnVjdCB7CisJCXVpbnQzMl90CQlhZGRyX2hpOworCQl1aW50MzJfdAkJYWRkcl9sbzsKKwl9CQkJCWFkZHJsaXN0WzNdOworCXVpbnQzMl90CQkJbGVuMl9sZW4xOworCXVpbnQzMl90CQkJcmVzdl9sZW4zOworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJc3RkOworfTsKKworLyogV2Ugb25seSB1c2UgdGhpcyB3aGVuIHRlc3Rpbmcgb3V0IHRoZSBETUEgZW5naW5lCisgKiBhdCBwcm9iZSB0aW1lLiAgVGhpcyBpcyB0aGUgaW50ZXJuYWwgZm9ybWF0IG9mIGJ1ZmZlcgorICogZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgY2hpcCBhdCBOSUNfU1JBTV9ETUFfREVTQ1MuCisgKi8KK3N0cnVjdCB0ZzNfaW50ZXJuYWxfYnVmZmVyX2Rlc2MgeworCXVpbnQzMl90CQkJYWRkcl9oaTsKKwl1aW50MzJfdAkJCWFkZHJfbG87CisJdWludDMyX3QJCQluaWNfbWJ1ZjsKKwkvKiBYWFggRklYIFRISVMgKi8KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQljcWlkX3NxaWQ7CisJdWludDE2X3QJCQlsZW47CisjZWxzZQorCXVpbnQxNl90CQkJbGVuOworCXVpbnQxNl90CQkJY3FpZF9zcWlkOworI2VuZGlmCisJdWludDMyX3QJCQlmbGFnczsKKwl1aW50MzJfdAkJCV9fY29va2llMTsKKwl1aW50MzJfdAkJCV9fY29va2llMjsKKwl1aW50MzJfdAkJCV9fY29va2llMzsKK307CisKKyNkZWZpbmUgVEczX0hXX1NUQVRVU19TSVpFCQkweDUwCitzdHJ1Y3QgdGczX2h3X3N0YXR1cyB7CisJdWludDMyX3QJCQlzdGF0dXM7CisjZGVmaW5lIFNEX1NUQVRVU19VUERBVEVECQkweDAwMDAwMDAxCisjZGVmaW5lIFNEX1NUQVRVU19MSU5LX0NIRwkJMHgwMDAwMDAwMgorI2RlZmluZSBTRF9TVEFUVVNfRVJST1IJCQkweDAwMDAwMDA0CisKKwl1aW50MzJfdAkJCXN0YXR1c190YWc7CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQlyeF9jb25zdW1lcjsKKwl1aW50MTZfdAkJCXJ4X2p1bWJvX2NvbnN1bWVyOworI2Vsc2UKKwl1aW50MTZfdAkJCXJ4X2p1bWJvX2NvbnN1bWVyOworCXVpbnQxNl90CQkJcnhfY29uc3VtZXI7CisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSAgX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQlyZXNlcnZlZDsKKwl1aW50MTZfdAkJCXJ4X21pbmlfY29uc3VtZXI7CisjZWxzZQorCXVpbnQxNl90CQkJcnhfbWluaV9jb25zdW1lcjsKKwl1aW50MTZfdAkJCXJlc2VydmVkOworI2VuZGlmCisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gIF9fQklHX0VORElBTgorCQl1aW50MTZfdAkJdHhfY29uc3VtZXI7CisJCXVpbnQxNl90CQlyeF9wcm9kdWNlcjsKKyNlbHNlCisJCXVpbnQxNl90CQlyeF9wcm9kdWNlcjsKKwkJdWludDE2X3QJCXR4X2NvbnN1bWVyOworI2VuZGlmCisJfQkJCQlpZHhbMTZdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGhpZ2gsIGxvdzsKK30gdGczX3N0YXQ2NF90OworCitzdHJ1Y3QgdGczX2h3X3N0YXRzIHsKKwl1aW50OF90CQkJCV9fcmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyeF9vY3RldHM7CisJdWludDY0X3QJCQlfX3Jlc2VydmVkMTsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mcmFnbWVudHM7CisJdGczX3N0YXQ2NF90CQkJcnhfdWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9tY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2JjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfZmNzX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9hbGlnbl9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9uX3BhdXNlX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9mZl9wYXVzZV9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X21hY19jdHJsX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9mZl9lbnRlcmVkOworCXRnM19zdGF0NjRfdAkJCXJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9qYWJiZXJzOworCXRnM19zdGF0NjRfdAkJCXJ4X3VuZGVyc2l6ZV9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2luX2xlbmd0aF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfb3V0X2xlbmd0aF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfNjRfb3JfbGVzc19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8yNTZfdG9fNTExX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xNTIzX3RvXzIwNDdfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF84MTkyX3RvXzkwMjJfb2N0ZXRfcGFja2V0czsKKworCXVpbnQ2NF90CQkJX191bnVzZWQwWzM3XTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBUcmFuc21pdCBNQUMuICovCisJdGczX3N0YXQ2NF90CQkJdHhfb2N0ZXRzOworCXVpbnQ2NF90CQkJX19yZXNlcnZlZDI7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b25fc2VudDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b2ZmX3NlbnQ7CisJdGczX3N0YXQ2NF90CQkJdHhfZmxvd19jb250cm9sOworCXRnM19zdGF0NjRfdAkJCXR4X21hY19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfc2luZ2xlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbXVsdF9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2RlZmVycmVkOworCXVpbnQ2NF90CQkJX19yZXNlcnZlZDM7CisJdGczX3N0YXQ2NF90CQkJdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbGF0ZV9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfM3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfN3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfOHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfOXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTB0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzExdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTN0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzE0dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xNXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X3VjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfbWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9iY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXR4X2Rpc2NhcmRzOworCXRnM19zdGF0NjRfdAkJCXR4X2Vycm9yczsKKworCXVpbnQ2NF90CQkJX191bnVzZWQxWzMxXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCXRnM19zdGF0NjRfdAkJCUNPU19yeF9wYWNrZXRzWzE2XTsKKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfZmlsdGVyX2Ryb3BwZWQ7CisJdGczX3N0YXQ2NF90CQkJZG1hX3dyaXRlcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZV9wcmlvcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCXJ4YmRzX2VtcHR5OworCXRnM19zdGF0NjRfdAkJCXJ4X2Rpc2NhcmRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF90aHJlc2hvbGRfaGl0OworCisJdWludDY0X3QJCQlfX3VudXNlZDJbOV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgU2VuZCBEYXRhIEluaXRpYXRvci4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1Nfb3V0X3BhY2tldHNbMTZdOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkX3ByaW9xX2Z1bGw7CisJdGczX3N0YXQ2NF90CQkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXg7CisJdGczX3N0YXQ2NF90CQkJcmluZ19zdGF0dXNfdXBkYXRlOworCXRnM19zdGF0NjRfdAkJCW5pY19pcnFzOworCXRnM19zdGF0NjRfdAkJCW5pY19hdm9pZGVkX2lycXM7CisJdGczX3N0YXQ2NF90CQkJbmljX3R4X3RocmVzaG9sZF9oaXQ7CisKKwl1aW50OF90CQkJCV9fcmVzZXJ2ZWQ0WzB4YjAwLTB4OWMwXTsKK307CisKK2VudW0gcGh5X2xlZF9tb2RlIHsKKwlsZWRfbW9kZV9hdXRvLAorCWxlZF9tb2RlX3RocmVlX2xpbmssCisJbGVkX21vZGVfbGluazEwCit9OworCisjaWYgMAorLyogJ21hcHBpbmcnIGlzIHN1cGVyZmx1b3VzIGFzIHRoZSBjaGlwIGRvZXMgbm90IHdyaXRlIGludG8KKyAqIHRoZSB0eC9yeCBwb3N0IHJpbmdzIHNvIHdlIGNvdWxkIGp1c3QgZmV0Y2ggaXQgZnJvbSB0aGVyZS4KKyAqIEJ1dCB0aGUgY2FjaGUgYmVoYXZpb3IgaXMgYmV0dGVyIGhvdyB3ZSBhcmUgZG9pbmcgaXQgbm93LgorICovCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CisJREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBwaW5nKQorfTsKKworc3RydWN0IHR4X3JpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKKwl1aW50MzJfdAkJCXByZXZfdmxhbl90YWc7Cit9OworI2VuZGlmCisKK3N0cnVjdCB0ZzNfY29uZmlnX2luZm8geworCXVpbnQzMl90CQkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgdGczX2xpbmtfY29uZmlnIHsKKwkvKiBEZXNjcmliZXMgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gZ2V0LiAqLworCXVpbnQzMl90CQkJYWR2ZXJ0aXNpbmc7CisjaWYgMAorCXVpbnQxNl90CQkJc3BlZWQ7CisJdWludDhfdAkJCQlkdXBsZXg7CisJdWludDhfdAkJCQlhdXRvbmVnOworI2RlZmluZSBTUEVFRF9JTlZBTElECQkweGZmZmYKKyNkZWZpbmUgRFVQTEVYX0lOVkFMSUQJCTB4ZmYKKyNkZWZpbmUgQVVUT05FR19JTlZBTElECQkweGZmCisjZW5kaWYKKworCS8qIERlc2NyaWJlcyB3aGF0IHdlIGFjdHVhbGx5IGhhdmUuICovCisJdWludDhfdAkJCQlhY3RpdmVfc3BlZWQ7CisJdWludDhfdAkJCQlhY3RpdmVfZHVwbGV4OworCisJLyogV2hlbiB3ZSBnbyBpbiBhbmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlIHdlIG5lZWQKKwkgKiB0byBzd2FwIHdpdGggdGhpcyBzdGF0ZS4KKwkgKi8KKyNpZiAwCisJaW50CQkJCXBoeV9pc19sb3dfcG93ZXI7CisJdWludDE2X3QJCQlvcmlnX3NwZWVkOworCXVpbnQ4X3QJCQkJb3JpZ19kdXBsZXg7CisJdWludDhfdAkJCQlvcmlnX2F1dG9uZWc7CisjZW5kaWYKK307CisKK3N0cnVjdCB0ZzNfYnVmbWdyX2NvbmZpZyB7CisJdWludDMyX3QJCW1idWZfcmVhZF9kbWFfbG93X3dhdGVyOworCXVpbnQzMl90CQltYnVmX21hY19yeF9sb3dfd2F0ZXI7CisJdWludDMyX3QJCW1idWZfaGlnaF93YXRlcjsKKworCXVpbnQzMl90CQltYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibzsKKwl1aW50MzJfdAkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyX2p1bWJvOworCXVpbnQzMl90CQltYnVmX2hpZ2hfd2F0ZXJfanVtYm87CisKKwl1aW50MzJfdAkJZG1hX2xvd193YXRlcjsKKwl1aW50MzJfdAkJZG1hX2hpZ2hfd2F0ZXI7Cit9OworCitzdHJ1Y3QgdGczIHsKKyNpZiAwCisJLyogU01QIGxvY2tpbmcgc3RyYXRlZ3k6CisJICoKKwkgKiBsb2NrOiBIZWxkIGR1cmluZyBhbGwgb3BlcmF0aW9ucyBleGNlcHQgVFggcGFja2V0CisJICogICAgICAgcHJvY2Vzc2luZy4KKwkgKgorCSAqIHR4X2xvY2s6IEhlbGQgZHVyaW5nIHRnM19zdGFydF94bWl0eyxfNGdidWd9IGFuZCB0ZzNfdHgKKwkgKgorCSAqIElmIHlvdSB3YW50IHRvIHNodXQgdXAgYWxsIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIHlvdSBtdXN0CisJICogYWNxdWlyZSBib3RoIGxvY2tzLCAnbG9jaycgdGFrZW4gYmVmb3JlICd0eF9sb2NrJy4gIElSUXMgbXVzdAorCSAqIGJlIGRpc2FibGVkIHRvIHRha2UgJ2xvY2snIGJ1dCBvbmx5IHNvZnRpcnEgZGlzYWJsaW5nIGlzCisJICogbmVjZXNzYXJ5IGZvciBhY3F1aXNpdGlvbiBvZiAndHhfbG9jaycuCisJICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3BpbmxvY2tfdAkJCXR4X2xvY2s7CisjZW5kaWYKKworCXVpbnQzMl90CQkJdHhfcHJvZDsKKyNpZiAwCisJdWludDMyX3QJCQl0eF9jb25zOworI2VuZGlmCisJdWludDMyX3QJCQlyeF9yY2JfcHRyOworCXVpbnQzMl90CQkJcnhfc3RkX3B0cjsKKyNpZiAwCisJdWludDMyX3QJCQlyeF9qdW1ib19wdHI7CisJc3BpbmxvY2tfdAkJCWluZGlyZWN0X2xvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHNfcHJldjsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcJCQlwaHlfY3JjX2Vycm9yczsKKworI2lmIDAKKwl1aW50MzJfdAkJCXJ4X29mZnNldDsKKyNlbmRpZgorCXVpbnQzMl90CQkJdGczX2ZsYWdzOworI2lmIDAKKyNkZWZpbmUgVEczX0ZMQUdfSE9TVF9UWERTCQkweDAwMDAwMDAxCisjZW5kaWYKKyNkZWZpbmUgVEczX0ZMQUdfVFhEX01CT1hfSFdCVUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TCQkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRwkweDAwMDAwMDA4CisjZGVmaW5lIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfRkxBR19FTkFCTEVfQVNGCQkweDAwMDAwMDIwCisjZGVmaW5lIFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRwkweDAwMDAwMDQwCisjZGVmaW5lIFRHM19GTEFHX1BPTExfU0VSREVTCQkweDAwMDAwMDgwCisjZGVmaW5lIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUgkweDAwMDAwMTAwCisjZGVmaW5lIFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHCTB4MDAwMDAyMDAKKyNkZWZpbmUgVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CCTB4MDAwMDA0MDAKKyNkZWZpbmUgVEczX0ZMQUdfV09MX0VOQUJMRQkJMHgwMDAwMDgwMAorI2RlZmluZSBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVAkweDAwMDAxMDAwCisjZGVmaW5lIFRHM19GTEFHX05WUkFNCQkJMHgwMDAwMjAwMAorI2RlZmluZSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRAkJMHgwMDAwNDAwMAorI2RlZmluZSBURzNfRkxBR19SWF9QQVVTRQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNfRkxBR19UWF9QQVVTRQkJMHgwMDAxMDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lYX01PREUJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJX0hJR0hfU1BFRUQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJXzMyQklUCQkweDAwMDgwMDAwCisjZGVmaW5lIFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNCTB4MDAxMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTk9fUlhfUFNFVURPX0NTVU0JMHgwMDIwMDAwMAorI2RlZmluZSBURzNfRkxBR19TRVJERVNfV09MX0NBUAkJMHgwMDQwMDAwMAorI2RlZmluZSBURzNfRkxBR19KVU1CT19FTkFCTEUJCTB4MDA4MDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfMTBfMTAwX09OTFkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUEFVU0VfQVVUT05FRwkJMHgwMjAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9SWAkJMHgwNDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9UWAkJMHgwODAwMDAwMAorI2RlZmluZSBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TCTB4MTAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfR09UX1NFUkRFU19GTE9XQ1RMCTB4MjAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfU1BMSVRfTU9ERQkJMHg0MDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19JTklUX0NPTVBMRVRFCQkweDgwMDAwMDAwCisKKwl1aW50MzJfdAkJCXRnM19mbGFnczI7CisjZGVmaW5lIFRHM19GTEcyX1JFU1RBUlRfVElNRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVEczX0ZMRzJfU1VOXzU3MDQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQJMHgwMDAwMDAwNAorI2RlZmluZSBURzNfRkxHMl9JU181Nzg4CQkweDAwMDAwMDA4CisjZGVmaW5lIFRHM19GTEcyX01BWF9SWFBFTkRfNjQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczX0ZMRzJfVFNPX0NBUEFCTEUJCTB4MDAwMDAwMjAKKworCisKKwl1aW50MzJfdAkJCXNwbGl0X21vZGVfbWF4X3JlcXM7CisjZGVmaW5lIFNQTElUX01PREVfNTcwNF9NQVhfUkVRCQkzCisKKyNpZiAwCisJc3RydWN0IHRpbWVyX2xpc3QJCXRpbWVyOworCXVpbnQxNl90CQkJdGltZXJfY291bnRlcjsKKwl1aW50MTZfdAkJCXRpbWVyX211bHRpcGxpZXI7CisJdWludDMyX3QJCQl0aW1lcl9vZmZzZXQ7CisJdWludDE2X3QJCQlhc2ZfY291bnRlcjsKKwl1aW50MTZfdAkJCWFzZl9tdWx0aXBsaWVyOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX2xpbmtfY29uZmlnCQlsaW5rX2NvbmZpZzsKKwlzdHJ1Y3QgdGczX2J1Zm1ncl9jb25maWcJYnVmbWdyX2NvbmZpZzsKKworI2lmIDAKKwl1aW50MzJfdAkJCXJ4X3BlbmRpbmc7CisJdWludDMyX3QJCQlyeF9qdW1ib19wZW5kaW5nOworCXVpbnQzMl90CQkJdHhfcGVuZGluZzsKKyNlbmRpZgorCisJLyogY2FjaGUgaC93IHZhbHVlcywgb2Z0ZW4gcGFzc2VkIHN0cmFpZ2h0IHRvIGgvdyAqLworCXVpbnQzMl90CQkJcnhfbW9kZTsKKwl1aW50MzJfdAkJCXR4X21vZGU7CisJdWludDMyX3QJCQltYWNfbW9kZTsKKwl1aW50MzJfdAkJCW1pX21vZGU7CisJdWludDMyX3QJCQltaXNjX2hvc3RfY3RybDsKKwl1aW50MzJfdAkJCWdyY19tb2RlOworCXVpbnQzMl90CQkJZ3JjX2xvY2FsX2N0cmw7CisJdWludDMyX3QJCQlkbWFfcndjdHJsOworI2lmIDAKKwl1aW50MzJfdAkJCWNvYWxlc2NlX21vZGU7CisjZW5kaWYKKworCS8qIFBDSSBibG9jayAqLworCXVpbnQxNl90CQkJcGNpX2NoaXBfcmV2X2lkOworI2lmIDAKKwl1aW50OF90CQkJCXBjaV9jYWNoZWxpbmVfc3o7CisJdWludDhfdAkJCQlwY2lfbGF0X3RpbWVyOworCXVpbnQ4X3QJCQkJcGNpX2hkcl90eXBlOworCXVpbnQ4X3QJCQkJcGNpX2Jpc3Q7CisjZW5kaWYKKwl1aW50MzJfdAkJCXBjaV9jZmdfc3RhdGVbNjQgLyBzaXplb2YodWludDMyX3QpXTsKKworCWludAkJCQlwbV9jYXA7CisKKwkvKiBQSFkgaW5mbyAqLworCXVpbnQzMl90CQkJcGh5X2lkOworI2RlZmluZSBQSFlfSURfTUFTSwkJCTB4ZmZmZmZmZjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MDAJCQkweDYwMDA4MDQwCisjZGVmaW5lIFBIWV9JRF9CQ001NDAxCQkJMHg2MDAwODA1MAorI2RlZmluZSBQSFlfSURfQkNNNTQxMQkJCTB4NjAwMDgwNzAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDEJCQkweDYwMDA4MTEwCisjZGVmaW5lIFBIWV9JRF9CQ001NzAzCQkJMHg2MDAwODE2MAorI2RlZmluZSBQSFlfSURfQkNNNTcwNAkJCTB4NjAwMDgxOTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDUJCQkweDYwMDA4MWEwCisjZGVmaW5lIFBIWV9JRF9CQ004MDAyCQkJMHg2MDAxMDE0MAorI2RlZmluZSBQSFlfSURfU0VSREVTCQkJMHhmZWVkYmVlMAorI2RlZmluZSBQSFlfSURfSU5WQUxJRAkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgUEhZX0lEX1JFVl9NQVNLCQkJMHgwMDAwMDAwZgorI2RlZmluZSBQSFlfUkVWX0JDTTU0MDFfQjAJCTB4MQorI2RlZmluZSBQSFlfUkVWX0JDTTU0MDFfQjIJCTB4MworI2RlZmluZSBQSFlfUkVWX0JDTTU0MDFfQzAJCTB4NgorI2RlZmluZSBQSFlfUkVWX0JDTTU0MTFfWDAJCTB4MSAvKiBGb3VuZCBvbiBOZXRnZWFyIEdBMzAyVCAqLworCisJZW51bSBwaHlfbGVkX21vZGUJCWxlZF9tb2RlOworCisJY2hhcgkJCQlib2FyZF9wYXJ0X251bWJlclsyNF07CisJdWludDMyX3QJCQluaWNfc3JhbV9kYXRhX2NmZzsKKwl1aW50MzJfdAkJCXBjaV9jbG9ja19jdHJsOworI2lmIDAKKwlzdHJ1Y3QgcGNpX2RldmljZQkJKnBkZXZfcGVlcjsKKyNlbmRpZgorCisJLyogVGhpcyBtYWNybyBhc3N1bWVzIHRoZSBwYXNzZWQgUEhZIElEIGlzIGFscmVhZHkgbWFza2VkCisJICogd2l0aCBQSFlfSURfTUFTSy4KKwkgKi8KKyNkZWZpbmUgS05PV05fUEhZX0lEKFgpCQlcCisJKChYKSA9PSBQSFlfSURfQkNNNTQwMCB8fCAoWCkgPT0gUEhZX0lEX0JDTTU0MDEgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU0MTEgfHwgKFgpID09IFBIWV9JRF9CQ001NzAxIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NzAzIHx8IChYKSA9PSBQSFlfSURfQkNNNTcwNCB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTcwNSB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNODAwMiB8fCAoWCkgPT0gUEhZX0lEX1NFUkRFUykKKworCXVuc2lnbmVkIGxvbmcJCQlyZWdzOworCXN0cnVjdCBwY2lfZGV2aWNlCQkqcGRldjsKKwlzdHJ1Y3QgbmljCQkJKm5pYzsKKyNpZiAwCisJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CisjZW5kaWYKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCXN0cnVjdCB2bGFuX2dyb3VwCQkqdmxncnA7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X3N0ZDsKKyNpZiAwCisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X3N0ZF9idWZmZXJzOworCWRtYV9hZGRyX3QJCQlyeF9zdGRfbWFwcGluZzsKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9qdW1ibzsKKwlzdHJ1Y3QgcmluZ19pbmZvCQkqcnhfanVtYm9fYnVmZmVyczsKKwlkbWFfYWRkcl90CQkJcnhfanVtYm9fbWFwcGluZzsKKyNlbmRpZgorCisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfcmNiOworI2lmIDAKKwlkbWFfYWRkcl90CQkJcnhfcmNiX21hcHBpbmc7CisjZW5kaWYKKworCS8qIFRYIGRlc2NzIGFyZSBvbmx5IHVzZWQgaWYgVEczX0ZMQUdfSE9TVF9UWERTIGlzIHNldC4gKi8KKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjCSp0eF9yaW5nOworI2lmIDAKKwlzdHJ1Y3QgdHhfcmluZ19pbmZvCQkqdHhfYnVmZmVyczsKKwlkbWFfYWRkcl90CQkJdHhfZGVzY19tYXBwaW5nOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cwkJKmh3X3N0YXR1czsKKyNpZiAwCisJZG1hX2FkZHJfdAkJCXN0YXR1c19tYXBwaW5nOworI2VuZGlmCisjaWYgMAorCXVpbnQzMl90CQkJbXNnX2VuYWJsZTsKKyNlbmRpZgorCisJc3RydWN0IHRnM19od19zdGF0cwkJKmh3X3N0YXRzOworI2lmIDAKKwlkbWFfYWRkcl90CQkJc3RhdHNfbWFwcGluZzsKKyNlbmRpZgorCisJaW50CQkJCWNhcnJpZXJfb2s7CisJdWludDE2X3QJCQlzdWJzeXN0ZW1fdmVuZG9yOworCXVpbnQxNl90CQkJc3Vic3lzdGVtX2RldmljZTsKK307CisKKyNlbmRpZiAvKiAhKF9UM19IKSAqLwpJbmRleDogYi9uZXRib290L3RpYXJhLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L3RpYXJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQotCi1USUFSQSAoRnVqaXRzdSBFdGhlcnN0YXIpIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAotQ29weXJpZ2h0IChjKSBLZW4gWWFwIDE5OTgKLQotSW5mb3JtYXRpb24gZ2xlYW5lZCBmcm9tOgotCi1USUFSQS5BU00gUGFja2V0IGRyaXZlciBieSBCcmlhbiBGaXNoZXIsIFF1ZWVucyBVLCBLaW5nc3RvbiwgT250YXJpbwotRnVqaXRzdSBNQjg2OTYwIHNwZWMgc2hlZXQgKGRpZmZlcmVudCBjaGlwIGJ1dCBzYW1lIGZhbWlseSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0vKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLwotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0KLS8qCi0JRXRoZXJTdGFyIEkvTyBSZWdpc3RlciBvZmZzZXRzCi0qLwotCi0vKiBPZmZzZXRzIG9mIHJlZ2lzdGVycyAqLwotI2RlZmluZQlETENSX1hNSVRfU1RBVAkweDAwCi0jZGVmaW5lCURMQ1JfWE1JVF9NQVNLCTB4MDEKLSNkZWZpbmUJRExDUl9SRUNWX1NUQVQJMHgwMgotI2RlZmluZQlETENSX1JFQ1ZfTUFTSwkweDAzCi0jZGVmaW5lCURMQ1JfWE1JVF9NT0RFCTB4MDQKLSNkZWZpbmUJRExDUl9SRUNWX01PREUJMHgwNQotI2RlZmluZQlETENSX0VOQUJMRQkweDA2Ci0jZGVmaW5lCURMQ1JfVERSX0xPVwkweDA3Ci0jZGVmaW5lCURMQ1JfTk9ERV9JRAkweDA4Ci0jZGVmaW5lCURMQ1JfVERSX0hJR0gJMHgwRgotI2RlZmluZQlCTVBSX01FTV9QT1JUCTB4MTAKLSNkZWZpbmUJQk1QUl9QS1RfTEVOCTB4MTIKLSNkZWZpbmUJQk1QUl9ETUFfRU5BQkxFCTB4MTQKLSNkZWZpbmUJUFJPTV9JRAkJMHgxOAotCi0jZGVmaW5lCVRNU1QJCTB4ODAKLSNkZWZpbmUJVE1UX09LCQkweDgwCi0jZGVmaW5lCVRNVF8xNkNPTEwJMHgwMgotI2RlZmluZQlCVUZfRU1QVFkJMHg0MAotCi0jZGVmaW5lCUNBUkRfRElTQUJMRQkweDgwCS8qIHdyaXR0ZW4gdG8gRExDUl9FTkFCTEUgdG8gZGlzYWJsZSBjYXJkICovCi0jZGVmaW5lCUNBUkRfRU5BQkxFCTAJLyogd3JpdHRlbiB0byBETENSX0VOQUJMRSB0byBlbmFibGUgY2FyZCAqLwotCi0jZGVmaW5lCUNMRUFSX1NUQVRVUwkweDBGCS8qIHVzZWQgdG8gY2xlYXIgc3RhdHVzIGluZm8gKi8KLS8qCi0JMDAwMDExMTFCCi0JISEhISEhISEtLS0tLS0tLQotCSEhISEhISErLS0tLS0tLS1DTEVBUiBCVVMgV1JJVEUgRVJST1IKLQkhISEhISErLS0tLS0tLS0tQ0xFQVIgMTYgQ09MTElTSU9OCi0JISEhISErLS0tLS0tLS0tLUNMRUFSIENPTExJU0lPTgotCSEhISErLS0tLS0tLS0tLS1DTEVBUiBVTkRFUkZMT1cKLQkhISErLS0tLS0tLS0tLS0tTkMKLQkhISstLS0tLS0tLS0tLS0tTkMKLQkhKy0tLS0tLS0tLS0tLS0tTkMKLQkrLS0tLS0tLS0tLS0tLS0tTkMKLSovCi0KLSNkZWZpbmUJTk9fVFhfSVJRUwkwCS8qIHdyaXR0ZW4gdG8gY2xlYXIgdHJhbnNtaXQgSVJRcyAqLwotCi0jZGVmaW5lCUNMUl9SQ1ZfU1RBVFVTCTB4Q0YJLyogY2xlYXJzIHJlY2VpdmUgc3RhdHVzICovCi0KLSNkZWZpbmUJRU5fUkNWX0lSUVMJMHg4MAkvKiBlbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCi0vKgotCTEwMDAwMDAwQgotCSEhISEhISEhLS0tLS0tLS0KLQkhISEhISEhKy0tLS0tLS0tRU5BQkxFIE9WRVJGTE9XCi0JISEhISEhKy0tLS0tLS0tLUVOQUJMRSBDUkMKLQkhISEhISstLS0tLS0tLS0tRU5BQkxFIEFMSUdOCi0JISEhISstLS0tLS0tLS0tLUVOQUJMRSBTSE9SVCBQS1QKLQkhISErLS0tLS0tLS0tLS0tRElTQUJMRSBSRU1PVEUgUkVTRVQKLQkhISstLS0tLS0tLS0tLS0tUkVTRVJWRUQKLQkhKy0tLS0tLS0tLS0tLS0tUkVTRVJWRUQKLQkrLS0tLS0tLS0tLS0tLS0tRU5BQkxFIFBLVCBSRUFEWQotKi8KLQotI2RlZmluZQlYTUlUX01PREUJMHgwMgotLyoKLQkwMDAwMDAxMEIKLQkhISEhISEhIS0tLS0tLS0tLUVOQUJMRSBDQVJSSUVSIERFVEVDVAotCSEhISEhISErLS0tLS0tLS0tRElTQUJMRSBMT09QQkFDSwotKi8KLQotI2RlZmluZQlSRUNWX01PREUJMHgwMgotLyoKLQkwMDAwMDAxMEIKLQkhISEhISEhIS0tLS0tLS0tLUFDQ0VQVCBBTEwgUEFDS0VUUwotCSEhISEhISErLS0tLS0tLS0tQUNDRVBUIFBIWVNJQ0FMLCBNVUxUSUNBU1QsIEFORAotCSEhISEhISstLS0tLS0tLS0tQlJPQURDQVNUIFBBQ0tFVFMKLQkhISEhISstLS0tLS0tLS0tLURJU0FCTEUgUkVNT1RFIFJFU0VUCi0JISEhISstLS0tLS0tLS0tLS1ESVNBQkxFIFNIT1JUIFBBQ0tFVFMKLQkhISErLS0tLS0tLS0tLS0tLVVTRSA2IEJZVEUgQUREUkVTUwotCSEhKy0tLS0tLS0tLS0tLS0tTkMKLQkhKy0tLS0tLS0tLS0tLS0tLU5DCi0JKy0tLS0tLS0tLS0tLS0tLS1ESVNBQkxFIENSQyBURVNUIE1PREUKLSovCi0KLS8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYWRkcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHRpYXJhX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCWk7Ci0KLQlvdXRiKENBUkRfRElTQUJMRSwgaW9hZGRyICsgRExDUl9FTkFCTEUpOwotCW91dGIoQ0xFQVJfU1RBVFVTLCBpb2FkZHIgKyBETENSX1hNSVRfU1RBVCk7Ci0Jb3V0YihOT19UWF9JUlFTLCBpb2FkZHIgKyBETENSX1hNSVRfTUFTSyk7Ci0Jb3V0YihDTFJfUkNWX1NUQVRVUywgaW9hZGRyICsgRExDUl9SRUNWX1NUQVQpOwotCW91dGIoWE1JVF9NT0RFLCBpb2FkZHIgKyBETENSX1hNSVRfTU9ERSk7Ci0Jb3V0YihSRUNWX01PREUsIGlvYWRkciArIERMQ1JfUkVDVl9NT0RFKTsKLQkvKiBWYWN1dW0gcmVjdiBidWZmZXIgKi8KLQl3aGlsZSAoKGluYihpb2FkZHIgKyBETENSX1JFQ1ZfTU9ERSkgJiBCVUZfRU1QVFkpID09IDApCi0JCWluYihpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsKLQkvKiBTZXQgbm9kZSBhZGRyZXNzICovCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyArK2kpCi0JCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIGlvYWRkciArIERMQ1JfTk9ERV9JRCArIGkpOwotCW91dGIoQ0xSX1JDVl9TVEFUVVMsIGlvYWRkciArIERMQ1JfUkVDVl9TVEFUKTsKLQlvdXRiKENBUkRfRU5BQkxFLCBpb2FkZHIgKyBETENSX0VOQUJMRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgdGlhcmFfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JdW5zaWduZWQgaW50CQlsZW47Ci0KLQlpZiAoaW5iKGlvYWRkciArIERMQ1JfUkVDVl9NT0RFKSAmIEJVRl9FTVBUWSkKLQkJcmV0dXJuICgwKTsKLQkvKiBBY2sgcGFja2V0ICovCi0Jb3V0dyhDTFJfUkNWX1NUQVRVUywgaW9hZGRyICsgRExDUl9SRUNWX1NUQVQpOwotCWxlbiA9IGludyhpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsJCS8qIHRocm93IGF3YXkgc3RhdHVzICovCi0JbGVuID0gaW53KGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwotCS8qIERyb3Agb3Zlcmxlbmd0aCBwYWNrZXRzICovCi0JaWYgKGxlbiA+IEVUSF9GUkFNRV9MRU4pCi0JCXJldHVybiAoMCk7CQkvKiBzaG91bGQgd2UgZHJhaW4gdGhlIGJ1ZmZlcj8gKi8KLQlpbnN3KGlvYWRkciArIEJNUFJfTUVNX1BPUlQsIG5pYy0+cGFja2V0LCBsZW4gLyAyKTsKLQkvKiBJZiBpdCdzIG91ciBvd24sIGRyb3AgaXQgKi8KLQlpZiAobWVtY21wKG5pYy0+cGFja2V0ICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTikgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQluaWMtPnBhY2tldGxlbiA9IGxlbjsKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdGlhcmFfdHJhbnNtaXQoCi1zdHJ1Y3QgbmljICpuaWMsCi1jb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi11bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCi11bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi1jb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCXVuc2lnbmVkIGludAlsZW47Ci0JdW5zaWduZWQgbG9uZwl0aW1lOwotCi0JbGVuID0gcyArIEVUSF9ITEVOOwotCWlmIChsZW4gPCBFVEhfWkxFTikKLQkJbGVuID0gRVRIX1pMRU47Ci0JdCA9IGh0b25zKHQpOwotCW91dHN3KGlvYWRkciArIEJNUFJfTUVNX1BPUlQsIGQsIEVUSF9BTEVOIC8gMik7Ci0Jb3V0c3coaW9hZGRyICsgQk1QUl9NRU1fUE9SVCwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOIC8gMik7Ci0Jb3V0dyh0LCBpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsKLQlvdXRzdyhpb2FkZHIgKyBCTVBSX01FTV9QT1JULCBwLCBzIC8gMik7Ci0JaWYgKHMgJiAxKQkJCQkJLyogbGFzdCBieXRlICovCi0JCW91dGIocFtzLTFdLCBpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsKLQl3aGlsZSAocysrIDwgRVRIX1pMRU4gLSBFVEhfSExFTikJLyogcGFkICovCi0JCW91dGIoMCwgaW9hZGRyICsgQk1QUl9NRU1fUE9SVCk7Ci0Jb3V0dyhsZW4gfCAoVE1TVCA8PCA4KSwgaW9hZGRyICsgQk1QUl9QS1RfTEVOKTsKLQkvKiB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLwotCXRpbWUgPSBjdXJydGlja3MoKSArIFRJQ0tTX1BFUl9TRUM7CQkvKiB3YWl0IG9uZSBzZWNvbmQgKi8KLQl3aGlsZSAoY3VycnRpY2tzKCkgPCB0aW1lICYmIChpbmIoaW9hZGRyKSAmIChUTVRfT0t8VE1UXzE2Q09MTCkpID09IDApCi0JCTsKLQlpZiAoKGluYihpb2FkZHIpICYgKFRNVF9PS3xUTVRfMTZDT0xMKSkgPT0gMCkKLQkJcHJpbnRmKCJUaWFyYSB0aW1lZCBvdXQgb24gdHJhbnNtaXRcbiIpOwotCS8qIERvIHdlIG5lZWQgdG8gYWNrIHRoZSB0cmFuc21pdD8gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0aWFyYV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQkvKiBBcHBhcmVudGx5IG9ubHkgYSBwb3dlciBkb3duIGNhbiBkbyB0aGlzIHByb3Blcmx5ICovCi0Jb3V0YihDQVJEX0RJU0FCTEUsIGlvYWRkciArIERMQ1JfRU5BQkxFKTsKLX0KLQotc3RhdGljIGludCB0aWFyYV9wcm9iZTEoc3RydWN0IG5pYyAqbmljKQotewotCS8qIEhvcGUgYWxsIHRoZSBUaWFyYSBjYXJkcyBoYXZlIHRoaXMgdmVuZG9yIHByZWZpeCAqLwotCXN0YXRpYyBjaGFyCXZlbmRvcl9wcmVmaXhbXSA9IHsgMHgwOCwgMHgwMCwgMHgxQSB9OwotCXN0YXRpYyBjaGFyCWFsbF9vbmVzW10gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKLQlpbnQJCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgUFJPTV9JRCArIGkpOwotCWlmIChtZW1jbXAobmljLT5ub2RlX2FkZHIsIHZlbmRvcl9wcmVmaXgsIHNpemVvZih2ZW5kb3JfcHJlZml4KSkgIT0gMCkKLQkJcmV0dXJuICgwKTsKLQlpZiAobWVtY21wKG5pYy0+bm9kZV9hZGRyLCBhbGxfb25lcywgc2l6ZW9mKGFsbF9vbmVzKSkgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQlwcmludGYoIlxuVGlhcmEgaW9hZGRyICUjaFgsIGFkZHIgJSFcbiIsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOwotCXJldHVybiAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICp0aWFyYV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLXsKLQkvKiBtaXNzaW5nIGVudHJpZXMgYXJlIGFkZHJlc3NlcyB1c3VhbGx5IGFscmVhZHkgdXNlZCAqLwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0gewotCQkweDEwMCwgMHgxMjAsIDB4MTQwLCAweDE2MCwKLQkJMHgxODAsIDB4MUEwLCAweDFDMCwgMHgxRTAsCi0JCTB4MjAwLCAweDIyMCwgMHgyNDAsIC8qUGFyKi8KLQkJMHgyODAsIDB4MkEwLCAweDJDMCwgLypTZXIqLwotCQkweDMwMCwgMHgzMjAsIDB4MzQwLCAvKlBhciovCi0JCTB4MzgwLCAvKlZpZCxQYXIqLyAweDNDMCwgLypTZXIqLwotCQkweDAKLQl9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQotCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gcm91dGluZSBjYW4gdXNlIGEgaGFyZHdpcmVkIGRlZmF1bHQgKi8KLQlpZiAocHJvYmVfYWRkcnMgPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKLQlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyArK3ApCi0JCWlmICh0aWFyYV9wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCS8qIGlmIGJvYXJkIGZvdW5kICovCi0JaWYgKGlvYWRkciAhPSAwKQotCXsKLQkJdGlhcmFfcmVzZXQobmljKTsKLQkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JCW5pYy0+cmVzZXQgPSB0aWFyYV9yZXNldDsKLQkJbmljLT5wb2xsID0gdGlhcmFfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IHRpYXJhX3RyYW5zbWl0OwotCQluaWMtPmRpc2FibGUgPSB0aWFyYV9kaXNhYmxlOwotCQlyZXR1cm4gbmljOwotCX0KLQllbHNlCi0JCXJldHVybiAoMCk7Ci19CkluZGV4OiBiL25ldGJvb3QvdGltZXIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvdGltZXIuYworKysgYi9uZXRib290L3RpbWVyLmMKQEAgLTYsMTIyICs2LDI0IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQotI2luY2x1ZGUJImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgICAgICAgICJncnViLmgiCiAjaW5jbHVkZQkidGltZXIuaCIKIAotdm9pZCBsb2FkX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpCi17Ci0JLyogU2V0IHVwIHRoZSB0aW1lciBnYXRlLCB0dXJuIG9mZiB0aGUgc3BlYWtlciAqLwotCW91dGIoKGluYihQUENfUE9SVEIpICYgflBQQ0JfU1BLUikgfCBQUENCX1QyR0FURSwgUFBDX1BPUlRCKTsKLQlvdXRiKFRJTUVSMl9TRUx8V09SRF9BQ0NFU1N8TU9ERTB8QklOQVJZX0NPVU5ULCBUSU1FUl9NT0RFX1BPUlQpOwotCW91dGIodGlja3MgJiAweEZGLCBUSU1FUjJfUE9SVCk7Ci0Jb3V0Yih0aWNrcyA+PiA4LCBUSU1FUjJfUE9SVCk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19UU0NfQ1VSUlRJQ0tTKQotI2RlZmluZSByZHRzYyhsb3csaGlnaCkgXAotICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmR0c2MiIDogIj1hIiAobG93KSwgIj1kIiAoaGlnaCkpCi0KLSNkZWZpbmUgcmR0c2NsbCh2YWwpIFwKLSAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyZHRzYyIgOiAiPUEiICh2YWwpKQotCi0KLSNkZWZpbmUgSFogVElDS1NfUEVSX1NFQwotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MFUgLyogVW5kZXJseWluZyBIWiAqLwotLyogTEFUQ0ggaXMgdXNlZCBpbiB0aGUgaW50ZXJ2YWwgdGltZXIgYW5kIGZ0YXBlIHNldHVwLiAqLwotI2RlZmluZSBMQVRDSCAgKChDTE9DS19USUNLX1JBVEUgKyBIWi8yKSAvIEhaKQkvKiBGb3IgZGl2aWRlciAqLworLyogTWFjaGluZSBJbmRlcGVuZGFudCB0aW1lciBoZWxwZXIgZnVuY3Rpb25zICovCiAKLQotLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0gCi0gKiBSZXR1cm4gMl4zMiAqICgxIC8gKFRTQyBjbG9ja3MgcGVyIHVzZWMpKSBmb3IgZG9fZmFzdF9nZXR0aW1lb2Zmc2V0KCkuCi0gKiBUb28gbXVjaCA2NC1iaXQgYXJpdGhtZXRpYyBoZXJlIHRvIGRvIHRoaXMgY2xlYW5seSBpbiBDLCBhbmQgZm9yCi0gKiBhY2N1cmFjeSdzIHNha2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBvdmVyaGVhZCBvbiB0aGUgQ1RDIHNwZWFrZXIgKGNoYW5uZWwgMikKLSAqIG91dHB1dCBidXN5IGxvb3AgYXMgbG93IGFzIHBvc3NpYmxlLiBXZSBhdm9pZCByZWFkaW5nIHRoZSBDVEMgcmVnaXN0ZXJzCi0gKiBkaXJlY3RseSBiZWNhdXNlIG9mIHRoZSBhd2t3YXJkIDgtYml0IGFjY2VzcyBtZWNoYW5pc20gb2YgdGhlIDgyQzU0Ci0gKiBkZXZpY2UuCi0gKi8KLQotI2RlZmluZSBDQUxJQlJBVEVfTEFUQ0gJKDUgKiBMQVRDSCkKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjYWxpYnJhdGVfdHNjKHZvaWQpCit2b2lkIG1kZWxheSh1bnNpZ25lZCBpbnQgbXNlY3MpCiB7Ci0JLyogU2V0IHRoZSBHYXRlIGhpZ2gsIGRpc2FibGUgc3BlYWtlciAqLwotCW91dGIoKGluYigweDYxKSAmIH4weDAyKSB8IDB4MDEsIDB4NjEpOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgdGFrZSBjYXJlIG9mIENUQyBjaGFubmVsIDIKLQkgKgotCSAqIFNldCB0aGUgR2F0ZSBoaWdoLCBwcm9ncmFtIENUQyBjaGFubmVsIDIgZm9yIG1vZGUgMCwKLQkgKiAoaW50ZXJydXB0IG9uIHRlcm1pbmFsIGNvdW50IG1vZGUpLCBiaW5hcnkgY291bnQsCi0JICogbG9hZCA1ICogTEFUQ0ggY291bnQsIChMU0IgYW5kIE1TQikgdG8gYmVnaW4gY291bnRkb3duLgotCSAqLwotCW91dGIoMHhiMCwgMHg0Myk7CQkJLyogYmluYXJ5LCBtb2RlIDAsIExTQi9NU0IsIENoIDIgKi8KLQlvdXRiKENBTElCUkFURV9MQVRDSCAmIDB4ZmYsIDB4NDIpOwkvKiBMU0Igb2YgY291bnQgKi8KLQlvdXRiKENBTElCUkFURV9MQVRDSCA+PiA4LCAweDQyKTsJLyogTVNCIG9mIGNvdW50ICovCi0KLQl7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnRsb3csIHN0YXJ0aGlnaDsKLQkJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7Ci0JCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0KLQkJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKLQkJY291bnQgPSAwOwotCQlkbyB7Ci0JCQljb3VudCsrOwotCQl9IHdoaWxlICgoaW5iKDB4NjEpICYgMHgyMCkgPT0gMCk7Ci0JCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKLQotCQkvKiBFcnJvcjogRUNUQ05FVkVSU0VUICovCi0JCWlmIChjb3VudCA8PSAxKQotCQkJZ290byBiYWRfY3RjOwotCi0JCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KLQkJX19hc21fXygic3VibCAlMiwlMFxuXHQiCi0JCQkic2JibCAlMywlMSIKLQkJCToiPWEiIChlbmRsb3cpLCAiPWQiIChlbmRoaWdoKQotCQkJOiJnIiAoc3RhcnRsb3cpLCAiZyIgKHN0YXJ0aGlnaCksCi0JCQkgIjAiIChlbmRsb3cpLCAiMSIgKGVuZGhpZ2gpKTsKLQotCQkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KLQkJaWYgKGVuZGhpZ2gpCi0JCQlnb3RvIGJhZF9jdGM7Ci0KLQkJZW5kbG93IC89IDU7Ci0JCXJldHVybiBlbmRsb3c7CisJdW5zaWduZWQgaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgbXNlY3M7IGkrKykgeworCQl1ZGVsYXkoMTAwMCk7CisJCXBvbGxfaW50ZXJydXB0aW9ucygpOwogCX0KLQotCS8qCi0JICogVGhlIENUQyB3YXNuJ3QgcmVsaWFibGU6IHdlIGdvdCBhIGhpdCBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLAotCSAqIG9yIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KLQkgKiAzMiBiaXRzLi4KLQkgKi8KLWJhZF9jdGM6Ci0JcHJpbnRmKCJiYWRfY3RjXG4iKTsKLQlyZXR1cm4gMDsKIH0KIAotCi11bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyh2b2lkKQordm9pZCB3YWl0b25fdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcykKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBjbG9ja3NfcGVyX3RpY2s7Ci0JdW5zaWduZWQgbG9uZyBjbG9ja3NfaGlnaCwgY2xvY2tzX2xvdzsKLQl1bnNpZ25lZCBsb25nIGN1cnJ0aWNrczsKLQlpZiAoIWNsb2Nrc19wZXJfdGljaykgewotCQljbG9ja3NfcGVyX3RpY2sgPSBjYWxpYnJhdGVfdHNjKCk7Ci0JCXByaW50ZigiY2xvY2tzX3Blcl90aWNrID0gJWRcbiIsIGNsb2Nrc19wZXJfdGljayk7CisJbG9hZF90aW1lcjIodGlja3MpOworCXdoaWxlKHRpbWVyMl9ydW5uaW5nKCkpIHsKKwkJcG9sbF9pbnRlcnJ1cHRpb25zKCk7CiAJfQotCi0JLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCi0JcmR0c2MoY2xvY2tzX2xvdywgY2xvY2tzX2hpZ2gpOwotCi0JLyogY3VycnRpY2tzID0gY2xvY2tzIC8gY2xvY2tzX3Blcl90aWNrOyAqLwotCV9fYXNtX18oImRpdmwgJTEiCi0JCToiPWEiIChjdXJydGlja3MpCi0JCToiciIgKGNsb2Nrc19wZXJfdGljayksICIwIiAoY2xvY2tzX2xvdyksICJkIiAoY2xvY2tzX2hpZ2gpKTsKLQotCi0JcmV0dXJuIGN1cnJ0aWNrczsKIH0KLQotI2VuZGlmIC8qIFJUQ19DVVJSVElDS1MgKi8KSW5kZXg6IGIvbmV0Ym9vdC90aW1lci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC90aW1lci5oCisrKyBiL25ldGJvb3QvdGltZXIuaApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZQlCQ0RfQ09VTlQJMHgwMQogCiAvKiBUaW1lcnMgdGljayBvdmVyIGF0IHRoaXMgcmF0ZSAqLwotI2RlZmluZQlUSUNLU19QRVJfTVMJMTE5MworI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MFUKKyNkZWZpbmUJVElDS1NfUEVSX01TCShDTE9DS19USUNLX1JBVEUvMTAwMCkKIAogLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBDb250cm9sbGVyIFBvcnQgQiAqLwogI2RlZmluZQlQUENfUE9SVEIJMHg2MQpAQCAtNDksMTYgKzUwLDE5IEBACiAvKiBUaWNrcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjU1MzUgKDAgPT0gNjU1MzYpCiAgICBiZWNhdXNlIGl0IGlzIGEgMTYgYml0IGNvdW50ZXIgKi8KIGV4dGVybiB2b2lkIGxvYWRfdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcyk7Ci1leHRlcm4gaW5saW5lIGludCB0aW1lcjJfcnVubmluZyh2b2lkKQotewotCXJldHVybiAoKGluYihQUENfUE9SVEIpICYgUFBDQl9UMk9VVCkgPT0gMCk7Ci19Ci0KLWV4dGVybiBpbmxpbmUgdm9pZCB3YWl0b25fdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcykKLXsKLQlsb2FkX3RpbWVyMih0aWNrcyk7Ci0Jd2hpbGUgKChpbmIoUFBDX1BPUlRCKSAmIFBQQ0JfVDJPVVQpID09IDApCi0JCTsKLX0KK2V4dGVybiBpbmxpbmUgaW50IHRpbWVyMl9ydW5uaW5nKHZvaWQpOworZXh0ZXJuIHZvaWQgd2FpdG9uX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpOworZXh0ZXJuIHZvaWQgX19sb2FkX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpOworCitleHRlcm4gdm9pZCBzZXR1cF90aW1lcnModm9pZCk7CitleHRlcm4gdm9pZCBuZGVsYXkodW5zaWduZWQgaW50IG5zZWNzKTsKK2V4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBpbnQgdXNlY3MpOworZXh0ZXJuIHZvaWQgbWRlbGF5KHVuc2lnbmVkIGludCBtc2Vjcyk7CisvL2V4dGVybiB1bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyh2b2lkKTsKKworc3RydWN0IHRpbWV2YWwgeworCWxvbmcgdHZfc2VjOworCWxvbmcgdHZfdXNlYzsKK307CiAKICNlbmRpZgkvKiBUSU1FUl9IICovCkluZGV4OiBiL25ldGJvb3QvdGxhbi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGEvbmV0Ym9vdC90bGFuLmMKKysrIGIvbmV0Ym9vdC90bGFuLmMKQEAgLTEsMzc0NiArMSwxODE0IEBACisjZGVmaW5lIEVCNTEKKworI2lmZGVmIEVCNTAKKyNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi1UTEFOIGRyaXZlciBmb3IgRXRoZXJib290CisqCisqICAgIHRsYW4uYyAtLSBFdGhlcmJvb3QgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRodW5kZXJMQU4KKyogICAgV3JpdHRlbiAyMDAzLTIwMDMgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCWxhbi5jOiBMaW51eCBUaHVuZGVyTGFuIERyaXZlcjoKKyoKKyoJYnkgSmFtZXMgQmFua3MKKyoKKyogIAkoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyoJKEMpIDE5OTggSmFtZXMgQmFua3MKKyoJKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisqCShDKSAyMDAyIFNhbXVlbCBDaGVzc21hbgorKgorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqICAgIHYxLjAJMDctMDgtMjAwMwl0aW1sZWdnZQlJbml0aWFsIG5vdCBxdWl0ZSB3b3JraW5nIHZlcnNpb24KKyogICAgdjEuMQkwNy0yNy0yMDAzCXRpbWxlZ2dlCVN5bmMgNS4wIGFuZCA1LjEgdmVyc2lvbnMKKyogICAgdjEuMgkwOC0xOS0yMDAzCXRpbWxlZ2dlCUltcGxlbWVudCBNdWx0aWNhc3QgU3VwcG9ydAorKiAgICB2MS4zCTA4LTIzLTIwMDMJdGltbGVnZ2UJRml4IHRoZSB0cmFuc21pdCBGdW5jdGlvbgorKiAgICB2MS40CTAxLTE3LTIwMDQJdGltbGVnZ2UJSW5pdGlhbCBkcml2ZXIgb3V0cHV0IGNsZWFudXAgICAgCisqICAgIAorKiAgICBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQogLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLwogI2luY2x1ZGUgIm5pYy5oIgogLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCiAjaW5jbHVkZSAicGNpLmgiCi0vKiB0byBnZXQgb3VyIG93biBwcm90b3R5cGUgKi8KLSNpbmNsdWRlICJjYXJkcy5oIgotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVExhbiBEZWZpbml0aW9ucwotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJ0bGFuLmgiCiAKLSNkZWZpbmUgVExBTl9NSU5fRlJBTUVfU0laRQk2NAotI2RlZmluZSBUTEFOX01BWF9GUkFNRV9TSVpFCTE2MDAKKyNkZWZpbmUgZHJ2X3ZlcnNpb24gInYxLjQiCisjZGVmaW5lIGRydl9kYXRlICIwMS0xNy0yMDA0IgogCi0jZGVmaW5lIFRMQU5fTlVNX1JYX0xJU1RTCTMyCi0jZGVmaW5lIFRMQU5fTlVNX1RYX0xJU1RTCTY0CisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisjZGVmaW5lIEhaIDEwMAorI2RlZmluZSBUWF9USU1FX09VVAkgICg2KkhaKQogCi0jZGVmaW5lIFRMQU5fSUdOT1JFCQkwCi0jZGVmaW5lIFRMQU5fUkVDT1JECQkxCisjaWZkZWYgRUI1MAorI2RlZmluZQljcHVfdG9fbGUzMih2YWwpICh2YWwpCisjZGVmaW5lCWxlMzJfdG9fY3B1KHZhbCkgKHZhbCkKKyNkZWZpbmUJdmlydF90b19idXMoeCkgKCh1bnNpZ25lZCBsb25nKSB4KQorI2RlZmluZQlidXNfdG9fdmlydCh4KSAoKHVuc2lnbmVkIGxvbmcpIHgpCisjZW5kaWYKIAotI2RlZmluZSBUTEFOX0RCRyhsdmwsIGZvcm1hdCwgYXJncy4uLikJaWYgKGRlYnVnJmx2bCkgcHJpbnRmKCJUTEFOOiAiIGZvcm1hdCwgIyNhcmdzICk7Ci0jZGVmaW5lIFRMQU5fREVCVUdfR05STAkJMHgwMDAxCi0jZGVmaW5lIFRMQU5fREVCVUdfVFgJCTB4MDAwMgotI2RlZmluZSBUTEFOX0RFQlVHX1JYCQkweDAwMDQgCi0jZGVmaW5lIFRMQU5fREVCVUdfTElTVAkJMHgwMDA4Ci0jZGVmaW5lIFRMQU5fREVCVUdfUFJPQkUJMHgwMDEwCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkuICovCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQorI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpICBidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKIAotI2RlZmluZSBNQVhfVExBTl9CT0FSRFMJCTgJIC8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIERldmljZSBJZGVudGlmaWNhdGlvbiBEZWZpbml0aW9ucwotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwX1QyCQkJMHhCMDEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAJMHhCMDMwCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJCQkweDAwMTMKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CQkJMHgwMDEyCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkJCTB4MDAxNAotI2VuZGlmCi0jZGVmaW5lIFRMQU5fQURBUFRFUl9OT05FCQkweDAwMDAwMDAwCi0jZGVmaW5lIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZCTB4MDAwMDAwMDEKLSNkZWZpbmUgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWQkweDAwMDAwMDAyCi0jZGVmaW5lIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwCTB4MDAwMDAwMDQKLSNkZWZpbmUgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRAkweDAwMDAwMDA4Ci0jZGVmaW5lIFRMQU5fU1BFRURfREVGQVVMVAkwCi0jZGVmaW5lIFRMQU5fU1BFRURfMTAJCTEwCi0jZGVmaW5lIFRMQU5fU1BFRURfMTAwCQkxMDAKLSNkZWZpbmUgVExBTl9EVVBMRVhfREVGQVVMVAkwCi0jZGVmaW5lIFRMQU5fRFVQTEVYX0hBTEYJMQotI2RlZmluZSBUTEFOX0RVUExFWF9GVUxMCTIKLSNkZWZpbmUgVExBTl9CVUZGRVJTX1BFUl9MSVNUCTEwCi0jZGVmaW5lIFRMQU5fTEFTVF9CVUZGRVIJMHg4MDAwMDAwMAotI2RlZmluZSBUTEFOX0NTVEFUX1VOVVNFRAkweDgwMDAKLSNkZWZpbmUgVExBTl9DU1RBVF9GUk1fQ01QCTB4NDAwMAotI2RlZmluZSBUTEFOX0NTVEFUX1JFQURZCTB4MzAwMAotI2RlZmluZSBUTEFOX0NTVEFUX0VPQwkJMHgwODAwCi0jZGVmaW5lIFRMQU5fQ1NUQVRfUlhfRVJST1IJMHgwNDAwCi0jZGVmaW5lIFRMQU5fQ1NUQVRfUEFTU19DUkMJMHgwMjAwCi0jZGVmaW5lIFRMQU5fQ1NUQVRfRFBfUFIJMHgwMTAwCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBQSFkgZGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFRMQU5fUEhZX01BWF9BRERSCTB4MUYKLSNkZWZpbmUgVExBTl9QSFlfTk9ORQkJMHgyMAotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVExhbiBEcml2ZXIgVGltZXIgRGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFRMQU5fVElNRVJfTElOS19CRUFUCQkxCi0jZGVmaW5lIFRMQU5fVElNRVJfQUNUSVZJVFkJCTIKLSNkZWZpbmUgVExBTl9USU1FUl9QSFlfUERPV04JCTMKLSNkZWZpbmUgVExBTl9USU1FUl9QSFlfUFVQCQk0Ci0jZGVmaW5lIFRMQU5fVElNRVJfUEhZX1JFU0VUCQk1Ci0jZGVmaW5lIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksJNgotI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4JNwotI2RlZmluZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVAkJOAotI2RlZmluZSBUTEFOX1RJTUVSX0FDVF9ERUxBWQkJKEhaLzEwKQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVExhbiBEcml2ZXIgRWVwcm9tIERlZmluaXRpb25zCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBUTEFOX0VFUFJPTV9BQ0sJCTAKLSNkZWZpbmUgVExBTl9FRVBST01fU1RPUAkxCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBIb3N0IFJlZ2lzdGVyIE9mZnNldHMgYW5kIENvbnRlbnRzCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBUTEFOX0hPU1RfQ01ECQkJMHgwMAotI2RlZmluZSAJVExBTl9IQ19HTwkJMHg4MDAwMDAwMAotI2RlZmluZQkJVExBTl9IQ19TVE9QCQkweDQwMDAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0FDSwkJMHgyMDAwMDAwMAotI2RlZmluZQkJVExBTl9IQ19DU19NQVNLCQkweDFGRTAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0VPQwkJMHgwMDEwMDAwMAotI2RlZmluZQkJVExBTl9IQ19SVAkJMHgwMDA4MDAwMAotI2RlZmluZQkJVExBTl9IQ19ORVMJCTB4MDAwNDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfQURfUlNUCQkweDAwMDA4MDAwCi0jZGVmaW5lCQlUTEFOX0hDX0xEX1RNUgkJMHgwMDAwNDAwMAotI2RlZmluZQkJVExBTl9IQ19MRF9USFIJCTB4MDAwMDIwMDAKLSNkZWZpbmUJCVRMQU5fSENfUkVRX0lOVAkJMHgwMDAwMTAwMAotI2RlZmluZQkJVExBTl9IQ19JTlRfT0ZGCQkweDAwMDAwODAwCi0jZGVmaW5lCQlUTEFOX0hDX0lOVF9PTgkJMHgwMDAwMDQwMAotI2RlZmluZQkJVExBTl9IQ19BQ19NQVNLCQkweDAwMDAwMEZGCi0jZGVmaW5lIFRMQU5fQ0hfUEFSTQkJCTB4MDQKLSNkZWZpbmUgVExBTl9ESU9fQURSCQkJMHgwOAotI2RlZmluZQkJVExBTl9EQV9BRFJfSU5DCQkweDgwMDAKLSNkZWZpbmUJCVRMQU5fREFfUkFNX0FEUgkJMHg0MDAwCi0jZGVmaW5lIFRMQU5fSE9TVF9JTlQJCQkweDBBCi0jZGVmaW5lCQlUTEFOX0hJX0lWX01BU0sJCTB4MUZFMAotI2RlZmluZQkJVExBTl9ISV9JVF9NQVNLCQkweDAwMUMKLSNkZWZpbmUgVExBTl9ESU9fREFUQQkJCTB4MEMKLQotLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLwotCi0jZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAotI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAotI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0Ci0jZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQotI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCi0jZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAotI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4Ci0jZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0Ci0jZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgotI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKLSNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgotI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAotI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgotI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMwotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKLSNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAotI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCi0jZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2Ci0jZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAotI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKLSNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKLSNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKLSNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQotI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCi0jZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAotI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKLSNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCi0jZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgotI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKLSNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCi0jZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCi0jZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKLSNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKLSNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNwotI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4Ci0jZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKLSNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgotI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKLSNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQotI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCi0jZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQotI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgotI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCi0jZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKLSNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAotI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQotI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKLSNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2Ci0jZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKLSNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0Ci0jZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgotI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKLQotLyogVGh1bmRlckxBTiBJbnRlcnJ1cHQgQ29kZXMgKi8KLQotI2RlZmluZSBUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UUwk4Ci0KLSNkZWZpbmUgVExBTl9JTlRfTk9ORQkJCTB4MDAwMAotI2RlZmluZSBUTEFOX0lOVF9UWF9FT0YJCQkweDAwMDEKLSNkZWZpbmUgVExBTl9JTlRfU1RBVF9PVkVSRkxPVwkJMHgwMDAyCi0jZGVmaW5lIFRMQU5fSU5UX1JYX0VPRgkJCTB4MDAwMwotI2RlZmluZSBUTEFOX0lOVF9EVU1NWQkJCTB4MDAwNAotI2RlZmluZSBUTEFOX0lOVF9UWF9FT0MJCQkweDAwMDUKLSNkZWZpbmUgVExBTl9JTlRfU1RBVFVTX0NIRUNLCQkweDAwMDYKLSNkZWZpbmUgVExBTl9JTlRfUlhfRU9DCQkJMHgwMDA3Ci0jZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCi0jZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQotI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAotI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAotI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAotI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCi0jZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKLSNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4Ci0jZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAotI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCi0jZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQotI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKLSNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAotI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCi0jZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAotI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKLSNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5Ci0jZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKLSNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKLSNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAotI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCi0KLQotLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCi0KLS8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKLSNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCi0jZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKLSNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCi0jZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCi0jZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAotI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAotI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKLSNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAotI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAotI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKLSNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCi0jZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKLSNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCi0jZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAotI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCi0jZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKLSNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCi0jZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAotI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAotI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAotI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAotI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCi0jZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKLSNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKLSNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKLSNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKLSNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAotI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKLSNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKLSNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKLSNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKLQotLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIAlUTEFOX1RDX0lHTElOSwkJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX1RDX1NXQVBPTAkJMHg0MDAwCi0jZGVmaW5lCQlUTEFOX1RDX0FVSVNFTAkJMHgyMDAwCi0jZGVmaW5lCQlUTEFOX1RDX1NRRUVOCQkweDEwMDAKLSNkZWZpbmUJCVRMQU5fVENfTVRFU1QJCTB4MDgwMAotI2RlZmluZQkJVExBTl9UQ19SRVNFUlZFRAkweDA3RjgKLSNkZWZpbmUJCVRMQU5fVENfTkZFVwkJMHgwMDA0Ci0jZGVmaW5lCQlUTEFOX1RDX0lOVEVOCQkweDAwMDIKLSNkZWZpbmUJCVRMQU5fVENfVElOVAkJMHgwMDAxCi0jZGVmaW5lCQlUTEFOX1RTX01JTlQJCTB4ODAwMAotI2RlZmluZQkJVExBTl9UU19QSE9LCQkweDQwMDAKLSNkZWZpbmUJCVRMQU5fVFNfUE9MT0sJCTB4MjAwMAotI2RlZmluZQkJVExBTl9UU19UUEVORVJHWQkweDEwMDAKLSNkZWZpbmUJCVRMQU5fVFNfUkVTRVJWRUQJMHgwRkZGCi0jZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKLSNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKLSNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAotI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCi0KLS8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KLSNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKLSNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKLSNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAotI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCi0KLSNkZWZpbmUgVExhbl9DbGVhckJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpICYgfmJpdCwgcG9ydCkKLSNkZWZpbmUgVExhbl9HZXRCaXQoIGJpdCwgcG9ydCApCSgoaW50KSAoaW5iX3AocG9ydCkgJiBiaXQpKQotI2RlZmluZSBUTGFuX1NldEJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpIHwgYml0LCBwb3J0KQotCi10eXBlZGVmCXVuc2lnbmVkIGludAl1MzI7Ci10eXBlZGVmCXVuc2lnbmVkIHNob3J0CXUxNjsKLXR5cGVkZWYJdW5zaWduZWQgY2hhcgl1ODsKK3N0YXRpYyB2b2lkIFRMYW5fUmVzZXRMaXN0cyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOworc3RhdGljIHZvaWQgVExhbl9SZXNldEFkYXB0ZXIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKK3N0YXRpYyB2b2lkIFRMYW5fRmluaXNoUmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKIAotLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KK3N0YXRpYyB2b2lkIFRMYW5fRWVTZW5kU3RhcnQodTE2KTsKK3N0YXRpYyBpbnQgVExhbl9FZVNlbmRCeXRlKHUxNiwgdTgsIGludCk7CitzdGF0aWMgdm9pZCBUTGFuX0VlUmVjZWl2ZUJ5dGUodTE2LCB1OCAqLCBpbnQpOworc3RhdGljIGludCBUTGFuX0VlUmVhZEJ5dGUodTE2IGlvX2Jhc2UsIHU4LCB1OCAqKTsKIAotaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCi17Ci0Jb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOwotCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOwotCQotfSAvKiBUTGFuX0Rpb1JlYWQ4ICovCitzdGF0aWMgdm9pZCBUTGFuX1BoeURldGVjdChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgVExhbl9QaHlQb3dlckRvd24oc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5UG93ZXJVcChzdHJ1Y3QgbmljICpuaWMpOwogCi1pbmxpbmUgdTE2IFRMYW5fRGlvUmVhZDE2KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQotewotCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKLQlyZXR1cm4gKGludygoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpKTsKIAotfSAvKiBUTGFuX0Rpb1JlYWQxNiAqLworc3RhdGljIHZvaWQgVExhbl9TZXRNYWMoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgYXJlZywgY2hhciAqbWFjKTsKIAotaW5saW5lIHUzMiBUTGFuX0Rpb1JlYWQzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKLXsKLQlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0JcmV0dXJuIChpbmwoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkpOworc3RhdGljIHZvaWQgVExhbl9QaHlSZXNldChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgVExhbl9QaHlTdGFydExpbmsoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5RmluaXNoQXV0b05lZyhzdHJ1Y3QgbmljICpuaWMpOwogCi19IC8qIFRMYW5fRGlvUmVhZDMyICovCisjaWZkZWYgTU9OSVRPUgorc3RhdGljIHZvaWQgVExhbl9QaHlNb25pdG9yKHN0cnVjdCBuaWMgKm5pYyk7CisjZW5kaWYKIAotaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHU4IGRhdGEpCi17Ci0Jb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOwotCW91dGIoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSk7CiAKLX0KK3N0YXRpYyB2b2lkIHJlZmlsbF9yeChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOwogCi1pbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlMTYodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHUxNiBkYXRhKQotewotCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKLQlvdXR3KGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpOworc3RhdGljIGludCBUTGFuX01paVJlYWRSZWcoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MTYsIHUxNiwgdTE2ICopOworc3RhdGljIHZvaWQgVExhbl9NaWlTZW5kRGF0YSh1MTYsIHUzMiwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgVExhbl9NaWlTeW5jKHUxNik7CitzdGF0aWMgdm9pZCBUTGFuX01paVdyaXRlUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2LCB1MTYsIHUxNik7CiAKLX0KIAotaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTMyKHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MzIgZGF0YSkKLXsKLQlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0Jb3V0bChkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKK2NvbnN0IGNoYXIgKm1lZGlhW10gPSB7CisJIjEwQmFzZVQtSEQgIiwgIjEwQmFzZVQtRkQgIiwgIjEwMGJhc2VUeC1IRCAiLAorCSIxMDBiYXNlVHgtRkQiLCAiMTAwYmFzZVQ0IiwgMAorfTsKIAotfQorLyogVGhpcyBtdWNoIG1hdGNoIHRsYW5fcGNpX3RibFtdISAgKi8KK2VudW0gdGxhbl9uaWNzIHsKKwlORVRFTDEwID0gMCwgTkVURUwxMDAgPSAxLCBORVRGTEVYM0kgPSAyLCBUSFVOREVSID0gMywgTkVURkxFWDNCID0KKwkgICAgNCwgTkVURUwxMDBQSSA9IDUsCisJTkVURUwxMDBEID0gNiwgTkVURUwxMDBJID0gNywgT0MyMTgzID0gOCwgT0MyMzI1ID0gOSwgT0MyMzI2ID0KKwkgICAgMTAsIE5FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwID0gMTEsCisJTkVURUxMSUdFTlRfMTBfVDIgPSAxMgorfTsKIAotLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworc3RydWN0IHBjaV9pZF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBuaWNfaWQ7CisJc3RydWN0IG1hdGNoX2luZm8geworCQl1MzIgcGNpLCBwY2lfbWFzaywgc3Vic3lzdGVtLCBzdWJzeXN0ZW1fbWFzazsKKwkJdTMyIHJldmlzaW9uLCByZXZpc2lvbl9tYXNrOwkvKiBPbmx5IDggYml0cy4gKi8KKwl9IGlkOworCXUzMiBmbGFnczsKKwl1MTYgYWRkck9mczsJCS8qIEFkZHJlc3MgT2Zmc2V0ICovCit9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHN0cnVjdCBwY2lfaWRfaW5mbyB0bGFuX3BjaV90YmxbXSA9IHsKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAiLCBORVRFTDEwLAorCSB7MHhhZTM0MGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiwgTkVURUwxMDAsCisJIHsweGFlMzIwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgSW50ZWdyYXRlZCBOZXRGbGV4LTMvUCIsIE5FVEZMRVgzSSwKKwkgezB4YWUzNTBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJDb21wYXEgTmV0RmxleC0zL1AiLCBUSFVOREVSLAorCSB7MHhmMTMwMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4M30sCisJeyJDb21wYXEgTmV0RmxleC0zL1AiLCBORVRGTEVYM0IsCisJIHsweGYxNTAwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX05PTkUsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIE5FVEVMMTAwUEksCisJIHsweGFlNDMwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUCIsIE5FVEVMMTAwRCwKKwkgezB4YWU0MDBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIEVtYmVkZGVkIFVUUCIsIE5FVEVMMTAwSSwKKwkgezB4YjAxMTBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJPbGljb20gT0MtMjE4My8yMTg1IiwgT0MyMTgzLAorCSB7MHgwMDEzMTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweDgzfSwKKwl7Ik9saWNvbSBPQy0yMzI1IiwgT0MyMzI1LAorCSB7MHgwMDEyMTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZLCAweEY4fSwKKwl7Ik9saWNvbSBPQy0yMzI2IiwgT0MyMzI2LAorCSB7MHgwMDE0MTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweEY4fSwKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQIiwgTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAsCisJIHsweGIwMzAwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVC8yIFBDSSBVVFAvQ29heCIsIE5FVEVMTElHRU5UXzEwX1QyLAorCSB7MHhiMDEyMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9OT05FLCAweDgzfSwKKwl7IkNvbXBhcSBOZXRGbGV4LTMvRSIsIDAsCS8qIEVJU0EgY2FyZCAqLworCSB7MCwgMCwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgfCBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8CisJIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODN9LAorCXsiQ29tcGFxIE5ldEZsZXgtMy9FIiwgMCwJLyogRUlTQSBjYXJkICovCisJIHswLCAwLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJezAsIDAsCisJIHswLCAwLCAwLCAwLCAwLCAwfSwKKwkgMCwgMH0sCit9OwogCi0JVGh1bmRlckxBTiBEcml2ZXIgRWVwcm9tIHJvdXRpbmVzCiAKLQlUaGUgQ29tcGFxIE5ldGVsbGlnZW50IDEwIGFuZCAxMC8xMDAgY2FyZHMgdXNlIGEgTWljcm9jaGlwIDI0QzAyQQotCUVFUFJPTS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gTWljcm9jaGlwJ3MKLQlkYXRhIHNoZWV0LiAgSSBkb24ndCBrbm93IGhvdyB3ZWxsIHRoaXMgZnVuY3Rpb25zIHdpbGwgd29yayB3aXRoCi0Jb3RoZXIgRUVQUk9Ncy4KK3N0cnVjdCBUTGFuTGlzdCB7CisJdTMyIGZvcndhcmQ7CisJdTE2IGNTdGF0OworCXUxNiBmcmFtZVNpemU7CisJc3RydWN0IHsKKwkJdTMyIGNvdW50OworCQl1MzIgYWRkcmVzczsKKwl9IGJ1ZmZlcltUTEFOX0JVRkZFUlNfUEVSX0xJU1RdOworfTsKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0VlU2VuZFN0YXJ0Ci0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6CQotCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQotCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bwotCSAqCQkJCXVzZS4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzdGFydCBjeWNsZSB0byBhbiBFRVBST00gYXR0YWNoZWQKLQkgKgl0byBhIFRMQU4gY2hpcC4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgVExhbl9FZVNlbmRTdGFydCggdTE2IGlvX2Jhc2UgKQotewotCXUxNglzaW87CitzdHJ1Y3QgVExhbkxpc3QgdHhfcmluZ1tUTEFOX05VTV9UWF9MSVNUU107CitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbVExBTl9NQVhfRlJBTUVfU0laRSAqIFRMQU5fTlVNX1RYX0xJU1RTXTsKIAotCW91dHcoIFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUiApOwotCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworc3RydWN0IFRMYW5MaXN0IHJ4X3JpbmdbVExBTl9OVU1fUlhfTElTVFNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW1RMQU5fTUFYX0ZSQU1FX1NJWkUgKiBUTEFOX05VTV9SWF9MSVNUU107CiAKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKLQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwotCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Cit0eXBlZGVmIHU4IFRMYW5CdWZmZXJbVExBTl9NQVhfRlJBTUVfU0laRV07CiAKLX0gLyogVExhbl9FZVNlbmRTdGFydCAqLwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fRWVTZW5kQnl0ZQotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJSWYgdGhlIGNvcnJlY3QgYWNrIHdhcyByZWNlaXZlZCwgMCwgb3RoZXJ3aXNlIDEKLQkgKglQYXJtczoJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKLQkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KLQkgKgkJCQl1c2UuCi0JICoJCWRhdGEJCVRoZSA4IGJpdHMgb2YgaW5mb3JtYXRpb24gdG8KLQkgKgkJCQlzZW5kIHRvIHRoZSBFRVBST00uCi0JICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCi0JICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQotCSAqCQkJCWJ5dGUgaXMgc2VudCBhZnRlciB0aGUgYWNrIGlzCi0JICoJCQkJcmVhZC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBieXRlIG9uIHRoZSBzZXJpYWwgRUVQUk9NIGxpbmUsCi0JICoJZHJpdmluZyB0aGUgY2xvY2sgdG8gc2VuZCBlYWNoIGJpdC4gVGhlIGZ1bmN0aW9uIHRoZW4KLQkgKglyZXZlcnNlcyB0cmFuc21pc3Npb24gZGlyZWN0aW9uIGFuZCByZWFkcyBhbiBhY2tub3dsZWRnZQotCSAqCWJpdC4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjaGlwX2lkeDsKIAotc3RhdGljIGludCBUTGFuX0VlU2VuZEJ5dGUoIHUxNiBpb19iYXNlLCB1OCBkYXRhLCBpbnQgc3RvcCApCi17Ci0JaW50CWVycjsKLQl1OAlwbGFjZTsKLQl1MTYJc2lvOwogCi0Jb3V0dyggVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSICk7Ci0Jc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVExBTiBQcml2YXRlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCB0bGFuX3ByaXZhdGUgeworCXVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZDsJLyogUENJIFZlbmRvciBjb2RlICovCisJdW5zaWduZWQgc2hvcnQgZGV2X2lkOwkvKiBQQ0kgRGV2aWNlIGNvZGUgKi8KKwljb25zdCBjaGFyICpuaWNfbmFtZTsKKwl1OCAqcGFkQnVmZmVyOworCXU4ICpyeEJ1ZmZlcjsKKwlzdHJ1Y3QgVExhbkxpc3QgKnJ4X2hlYWRfZGVzYzsKKwl1MzIgcnhIZWFkOworCXUzMiByeFRhaWw7CisJdTMyIHJ4RW9jQ291bnQ7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNpZXMgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwl1bnNpZ25lZCByeF9idWZfc3o7CS8qIEJhc2VkIG9uIG10dSArIFNsYWNrICovCisJc3RydWN0IFRMYW5MaXN0ICp0eExpc3Q7CisJc3RydWN0IFRMYW5MaXN0ICpyeExpc3Q7CisJdTggKnR4QnVmZmVyOworCXUzMiB0eEhlYWQ7CisJdTMyIHR4SW5Qcm9ncmVzczsKKwl1MzIgdHhUYWlsOworCWludCBlb2M7CisJdTMyIHR4QnVzeUNvdW50OworCXUzMiBwaHlPbmxpbmU7CisJdTMyIHRpbWVyU2V0QXQ7CisJdTMyIHRpbWVyVHlwZTsKKwl1MzIgYWRhcHRlclJldjsKKwl1MzIgYXVpOworCXUzMiBkZWJ1ZzsKKwl1MzIgZHVwbGV4OworCXUzMiBwaHlbMl07CisJdTMyIHBoeU51bTsKKwl1MzIgc3BlZWQ7CisJdTggdGxhblJldjsKKwl1OCB0bGFuRnVsbER1cGxleDsKKwljaGFyIGRldk5hbWVbOF07CisJdTggbGluazsKKwl1OCBpc19laXNhOworCXU4IG5lZ19iZV92ZXJib3NlOworfSBUTGFuUHJpdmF0ZUluZm87CiAKLQkvKiBBc3N1bWUgY2xvY2sgaXMgbG93LCB0eCBpcyBlbmFibGVkOyAqLwotCWZvciAoIHBsYWNlID0gMHg4MDsgcGxhY2UgIT0gMDsgcGxhY2UgPj49IDEgKSB7Ci0JCWlmICggcGxhY2UgJiBkYXRhICkKLQkJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwotCQllbHNlCi0JCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQl9Ci0JVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQllcnIgPSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworc3RhdGljIHN0cnVjdCB0bGFuX3ByaXZhdGUgKnByaXY7CiAKLQlpZiAoICggISBlcnIgKSAmJiBzdG9wICkgewotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwotCX0KK3UzMiBCQVNFOwogCi0JcmV0dXJuICggZXJyICk7CiAKLX0gLyogVExhbl9FZVNlbmRCeXRlICovCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9FZVJlY2VpdmVCeXRlCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCi0JICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCi0JICoJCQkJdXNlLgotCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQotCSAqCQkJCWRhdGEgc2VudCBmcm9tIHRoZSBFRVBST00uCi0JICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCi0JICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQotCSAqCQkJCWJ5dGUgaXMgcmVjZWl2ZWQsIGFuZCBubyBhY2sgaXMKLQkgKgkJCQlzZW50LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiByZWNlaXZlcyA4IGJpdHMgb2YgZGF0YSBmcm9tIHRoZSBFRVBST00KLQkgKglvdmVyIHRoZSBzZXJpYWwgbGluay4gIEl0IHRoZW4gc2VuZHMgYW5kIGFjayBiaXQsIG9yIG5vCi0JICoJYWNrIGFuZCBhIHN0b3AgYml0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlCi0JICoJZGF0YSBhZnRlciB0aGUgYWRkcmVzcyBvZiBhIGJ5dGUgaW4gdGhlIEVFUFJPTSBoYXMgYmVlbgotCSAqCXNlbnQuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCVRMYW5fUmVzZXRMaXN0cworKgorKglSZXR1cm5zOgorKgkJTm90aGluZworKglQYXJtczoKKyoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHRoZSBsaXN0CisqCQkJc3R1Y3R1cmVzIHRvIGJlIHJlc2V0LgorKgorKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBtYW5hZ2luZworKgl0aGUgVExBTiBsaXN0cyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBUTGFuX0VlUmVjZWl2ZUJ5dGUoIHUxNiBpb19iYXNlLCB1OCAqZGF0YSwgaW50IHN0b3AgKQordm9pZCBUTGFuX1Jlc2V0TGlzdHMoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotCXU4ICBwbGFjZTsKLQl1MTYgc2lvOwogCi0Jb3V0dyggVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSICk7Ci0Jc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87Ci0JKmRhdGEgPSAwOworCWludCBpOworCXN0cnVjdCBUTGFuTGlzdCAqbGlzdDsKKwlwcml2LT50eEhlYWQgPSAwOworCXByaXYtPnR4VGFpbCA9IDA7CiAKLQkvKiBBc3N1bWUgY2xvY2sgaXMgbG93LCB0eCBpcyBlbmFibGVkOyAqLwotCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7Ci0JZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZTsgcGxhY2UgPj49IDEgKSB7Ci0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCQlpZiAoIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApICkKLQkJCSpkYXRhIHw9IHBsYWNlOwotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCWZvciAoaSA9IDA7IGkgPCBUTEFOX05VTV9UWF9MSVNUUzsgaSsrKSB7CisJCWxpc3QgPSAmdHhfcmluZ1tpXTsKKwkJbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKy8qCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IDA7ICovCisJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXModHhiICsgCisJCQkJKGkgKiBUTEFOX01BWF9GUkFNRV9TSVpFKSk7IAorCQlsaXN0LT5idWZmZXJbMl0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMl0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKy8qCQlsaXN0LT5mb3J3YXJkID0gMDsgKi8KIAl9CiAKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKLQlpZiAoICEgc3RvcCApIHsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJLyogQWNrID0gMCAqLwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQl9IGVsc2UgewotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJCS8qIE5vIGFjayA9IDEgKD8pICovCi0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwotCX0KKwlwcml2LT5jdXJfcnggPSAwOworCXByaXYtPnJ4X2J1Zl9zeiA9IChUTEFOX01BWF9GUkFNRV9TSVpFKTsKKwlwcml2LT5yeF9oZWFkX2Rlc2MgPSAmcnhfcmluZ1swXTsKKworCS8qIEluaXRpYWxpemUgYWxsIHRoZSBSeCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrKSB7CisJCXJ4X3JpbmdbaV0uZm9yd2FyZCA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSArIDFdKTsKKwkJcnhfcmluZ1tpXS5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7CisJCXJ4X3JpbmdbaV0uZnJhbWVTaXplID0gVExBTl9NQVhfRlJBTUVfU0laRTsKKwkJcnhfcmluZ1tpXS5idWZmZXJbMF0uY291bnQgPQorCQkgICAgVExBTl9NQVhfRlJBTUVfU0laRSB8IFRMQU5fTEFTVF9CVUZGRVI7CisJCXJ4X3JpbmdbaV0uYnVmZmVyWzBdLmFkZHJlc3MgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBUTEFOX01BWF9GUkFNRV9TSVpFXSk7CisJCXJ4X3JpbmdbaV0uYnVmZmVyWzFdLmNvdW50ID0gMDsKKwkJcnhfcmluZ1tpXS5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CisJfQorCisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZyAqLworCXJ4X3JpbmdbaSAtIDFdLmZvcndhcmQgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKKwlwcml2LT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpIChpIC0gVExBTl9OVU1fUlhfTElTVFMpOwogCi19IC8qIFRMYW5fRWVSZWNlaXZlQnl0ZSAqLworfSAvKiBUTGFuX1Jlc2V0TGlzdHMgKi8KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0VlUmVhZEJ5dGUKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vIGVycm9yID0gMCwgZWxzZSwgdGhlIHN0YWdlIGF0IHdoaWNoIHRoZSBlcnJvcgotCSAqCQlvY2N1cnJlZC4KLQkgKglQYXJtczoKLQkgKgkJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKLQkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KLQkgKgkJCQl1c2UuCi0JICoJCWVlX2FkZHIJCVRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGluIHRoZQotCSAqCQkJCUVFUFJPTSB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUKLQkgKgkJCQlyZXRyaWV2ZWQuCi0JICoJCWRhdGEJCUFuIGFkZHJlc3MgdG8gYSBjaGFyIHRvIGhvbGQgdGhlCi0JICoJCQkJZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBFRVBST00uCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgYnl0ZSBvZiBpbmZvcm1hdGlvbiBmcm9tIGFuIGJ5dGUKLQkgKgljZWxsIGluIHRoZSBFRVBST00uCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCVRMYW5fUmVzZXQKKyoKKyoJUmV0dXJuczoKKyoJCTAKKyoJUGFybXM6CisqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKKyoJCQl0byBiZSByZXNldC4KKyoKKyoJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGFkYXB0ZXIgYW5kIGl0J3MgcGh5c2ljYWwKKyoJZGV2aWNlLiAgU2VlIENoYXAuIDMsIHBwLiA5LTEwIG9mIHRoZSAiVGh1bmRlckxBTgorKglQcm9ncmFtbWVyJ3MgR3VpZGUiIGZvciBkZXRhaWxzLiAgVGhlIHJvdXRpbmUgdHJpZXMgdG8KKyoJaW1wbGVtZW50IHdoYXQgaXMgZGV0YWlsZWQgdGhlcmUsIHRob3VnaCBhZGp1c3RtZW50cworKgloYXZlIGJlZW4gbWFkZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IFRMYW5fRWVSZWFkQnl0ZSggdTE2IGlvX2Jhc2UsIHU4IGVlX2FkZHIsIHU4ICpkYXRhICkKK3ZvaWQgVExhbl9SZXNldEFkYXB0ZXIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JaW50IHJldD0wOworCWludCBpOworCXUzMiBhZGRyOworCXUzMiBkYXRhOworCXU4IGRhdGE4OwogCi0JVExhbl9FZVNlbmRTdGFydCggaW9fYmFzZSApOwotCWVyciA9IFRMYW5fRWVTZW5kQnl0ZSggaW9fYmFzZSwgMHhBMCwgVExBTl9FRVBST01fQUNLICk7Ci0JaWYgKGVycikKLQl7Ci0JCXJldD0xOwotCQlnb3RvIGZhaWw7Ci0JfQotCWVyciA9IFRMYW5fRWVTZW5kQnl0ZSggaW9fYmFzZSwgZWVfYWRkciwgVExBTl9FRVBST01fQUNLICk7Ci0JaWYgKGVycikKLQl7Ci0JCXJldD0yOwotCQlnb3RvIGZhaWw7Ci0JfQotCVRMYW5fRWVTZW5kU3RhcnQoIGlvX2Jhc2UgKTsKLQllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGlvX2Jhc2UsIDB4QTEsIFRMQU5fRUVQUk9NX0FDSyApOwotCWlmIChlcnIpCi0JewotCQlyZXQ9MzsKLQkJZ290byBmYWlsOwotCX0KLQlUTGFuX0VlUmVjZWl2ZUJ5dGUoIGlvX2Jhc2UsIGRhdGEsIFRMQU5fRUVQUk9NX1NUT1AgKTsKLWZhaWw6CisJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBGQUxTRTsKKwlwcml2LT5waHlPbmxpbmUgPSAwOworLyogIDEuCUFzc2VydCByZXNldCBiaXQuICovCiAKLQlyZXR1cm4gcmV0OworCWRhdGEgPSBpbmwoQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19BRF9SU1Q7CisJb3V0bChkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAKLX0gLyogVExhbl9FZVJlYWRCeXRlICovCisJdWRlbGF5KDEwMDApOwogCi0jaWYJMAotLyogTm90IHlldCBjb252ZXJ0ZWQgZnJvbSBMaW51eCBkcml2ZXIgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAgMi4JVHVybiBvZmYgaW50ZXJydXB0cy4gKCBQcm9iYWJseSBpc24ndCBuZWNlc3NhcnkgKSAqLwogCi0JVGh1bmRlckxBTiBEcml2ZXIgUEhZIExheWVyIFJvdXRpbmVzCisJZGF0YSA9IGlubChCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0bChkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisvKiAgMy4JQ2xlYXIgQVJFR3MgYW5kIEhBU0hzLiAqLwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWZvciAoaSA9IFRMQU5fQVJFR18wOyBpIDw9IFRMQU5fSEFTSF8yOyBpICs9IDQpIHsKKwkJVExhbl9EaW9Xcml0ZTMyKEJBU0UsICh1MTYpIGksIDApOworCX0KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1BoeVByaW50Ci0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlCi0JICoJCQlUTEFOIGRldmljZSBoYXZpbmcgdGhlIFBIWXMgdG8gYmUgZGV0YWlsZWQuCi0JICoJCQkJCi0JICoJVGhpcyBmdW5jdGlvbiBwcmludHMgdGhlIHJlZ2lzdGVycyBhIFBIWSAoYWthIHRyYW5jZWl2ZXIpLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIDQuCVNldHVwIE5ldENvbmZpZyByZWdpc3Rlci4gKi8KIAotdm9pZCBUTGFuX1BoeVByaW50KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2IGksIGRhdGEwLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBwaHk7CisJZGF0YSA9CisJICAgIFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSk7CiAKLQlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKy8qICA1LglMb2FkIExkX1RtciBhbmQgTGRfVGhyIGluIEhPU1RfQ01ELiAqLwogCi0JaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgewotCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgVW5tYW5hZ2VkIFBIWS5cbiIsIGRldi0+bmFtZSApOwotCX0gZWxzZSBpZiAoIHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUiApIHsKLQkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFBIWSAweCUwMnguXG4iLCBkZXYtPm5hbWUsIHBoeSApOwotCQlwcmludGsoICJUTEFOOiAgICAgIE9mZi4gICswICAgICArMSAgICAgKzIgICAgICszIFxuIiApOwotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMHgyMDsgaSs9IDQgKSB7Ci0JCQlwcmludGsoICJUTEFOOiAgICAgIDB4JTAyeCIsIGkgKTsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGksICZkYXRhMCApOwotCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMCApOwotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDEsICZkYXRhMSApOwotCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMSApOwotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDIsICZkYXRhMiApOwotCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMiApOwotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDMsICZkYXRhMyApOwotCQkJcHJpbnRrKCAiIDB4JTA0aHhcbiIsIGRhdGEzICk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgSW52YWxpZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKLQl9CisJb3V0bChUTEFOX0hDX0xEX1RNUiB8IDB4M2YsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwlvdXRsKFRMQU5fSENfTERfVEhSIHwgMHgwLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAKLX0gLyogVExhbl9QaHlQcmludCAqLworLyogIDYuCVVucmVzZXQgdGhlIE1JSSBieSBzZXR0aW5nIE5NUlNUIChpbiBOZXRTaW8pIHRvIDEuICovCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9QaHlEZXRlY3QKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJZGV2CUEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUgYWRhcHRlcgotCSAqCQkJZm9yIHdoaWNoIHRoZSBQSFkgbmVlZHMgZGV0ZXJtaW5lZC4KLQkgKgotCSAqCVNvIGZhciBJJ3ZlIGZvdW5kIHRoYXQgYWRhcHRlcnMgd2hpY2ggaGF2ZSBleHRlcm5hbCBQSFlzCi0JICoJbWF5IGFsc28gdXNlIHRoZSBpbnRlcm5hbCBQSFkgZm9yIHBhcnQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkuCi0JICoJKGVnLCBBVUkvVGhpbm5ldCkuICBUaGlzIGZ1bmN0aW9uIGZpbmRzIG91dCBpZiB0aGlzIFRMQU4KLQkgKgljaGlwIGhhcyBhbiBpbnRlcm5hbCBQSFksIGFuZCB0aGVuIGZpbmRzIHRoZSBmaXJzdCBleHRlcm5hbAotCSAqCVBIWSAoc3RhcnRpbmcgZnJvbSBhZGRyZXNzIDApIGlmIGl0IGV4aXN0cykuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJb3V0dyhUTEFOX05FVF9TSU8sIEJBU0UgKyBUTEFOX0RJT19BRFIpOworCWFkZHIgPSBCQVNFICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTk1SU1QsIGFkZHIpOwogCi12b2lkIFRMYW5fUGh5RGV0ZWN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2CQljb250cm9sOwotCXUxNgkJaGk7Ci0JdTE2CQlsbzsKLQl1MzIJCXBoeTsKKy8qICA3LglTZXR1cCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KIAotCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKLQkJcHJpdi0+cGh5TnVtID0gMHhGRkZGOwotCQlyZXR1cm47CisJaWYgKHByaXYtPnRsYW5SZXYgPj0gMHgzMCkgeworCQlkYXRhOCA9IFRMQU5fSURfVFhfRU9DIHwgVExBTl9JRF9SWF9FT0M7CisJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fSU5UX0RJUywgZGF0YTgpOwogCX0KKwlUTGFuX1BoeURldGVjdChuaWMpOworCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU47CiAKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgVExBTl9QSFlfTUFYX0FERFIsIE1JSV9HRU5fSURfSEksICZoaSApOwotCQotCWlmICggaGkgIT0gMHhGRkZGICkgewotCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9NQVhfQUREUjsKLQl9IGVsc2UgewotCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9OT05FOworCWlmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19CSVQ7CisJCWlmIChwcml2LT5hdWkgPT0gMSkgeworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BQ09NTUlULCAweDBhKTsKKwkJfSBlbHNlIGlmIChwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BQ09NTUlULCAweDAwKTsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fQUNPTU1JVCwgMHgwOCk7CisJCX0KIAl9CiAKLQlwcml2LT5waHlbMV0gPSBUTEFOX1BIWV9OT05FOwotCWZvciAoIHBoeSA9IDA7IHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUjsgcGh5KysgKSB7Ci0JCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmY29udHJvbCApOwotCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0hJLCAmaGkgKTsKLQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9MTywgJmxvICk7Ci0JCWlmICggKCBjb250cm9sICE9IDB4RkZGRiApIHx8ICggaGkgIT0gMHhGRkZGICkgfHwgKCBsbyAhPSAweEZGRkYgKSApIHsKLQkJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICJQSFkgZm91bmQgYXQgJTAyeCAlMDR4ICUwNHggJTA0eFxuIiwgcGh5LCBjb250cm9sLCBoaSwgbG8gKTsKLQkJCWlmICggKCBwcml2LT5waHlbMV0gPT0gVExBTl9QSFlfTk9ORSApICYmICggcGh5ICE9IFRMQU5fUEhZX01BWF9BRERSICkgKSB7Ci0JCQkJcHJpdi0+cGh5WzFdID0gcGh5OwotCQkJfQotCQl9CisJaWYgKHByaXYtPnBoeU51bSA9PSAwKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ0ZHX1BIWV9FTjsKIAl9CisJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSk7CiAKLQlpZiAoIHByaXYtPnBoeVsxXSAhPSBUTEFOX1BIWV9OT05FICkgewotCQlwcml2LT5waHlOdW0gPSAxOwotCX0gZWxzZSBpZiAoIHByaXYtPnBoeVswXSAhPSBUTEFOX1BIWV9OT05FICkgewotCQlwcml2LT5waHlOdW0gPSAwOworCWlmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkpIHsKKwkJVExhbl9GaW5pc2hSZXNldChuaWMpOwogCX0gZWxzZSB7Ci0JCXByaW50ayggIlRMQU46ICBDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UsIG5vIFBIWSB3YXMgZm91bmQhXG4iICk7CisJCVRMYW5fUGh5UG93ZXJEb3duKG5pYyk7CiAJfQogCi19IC8qIFRMYW5fUGh5RGV0ZWN0ICovCit9CS8qIFRMYW5fUmVzZXRBZGFwdGVyICovCiAKLXZvaWQgVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCBUTGFuX0ZpbmlzaFJlc2V0KHN0cnVjdCBuaWMgKm5pYykKIHsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2CQl2YWx1ZTsKIAotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgZG93biBQSFkocykuXG4iLCBkZXYtPm5hbWUgKTsKLQl2YWx1ZSA9IE1JSV9HQ19QRE9XTiB8IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfSVNPTEFURTsKLQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7Ci0JVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7Ci0JaWYgKCAoIHByaXYtPnBoeU51bSA9PSAwICkgJiYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApICYmICggISAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAgKSApICkgewotCQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7Ci0JCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5WzFdLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwl1OCBkYXRhOworCXUzMiBwaHk7CisJdTggc2lvOworCXUxNiBzdGF0dXM7CisJdTE2IHBhcnRuZXI7CisJdTE2IHRscGh5X2N0bDsKKwl1MTYgdGxwaHlfcGFyOworCXUxNiB0bHBoeV9pZDEsIHRscGh5X2lkMjsKKwlpbnQgaTsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJZGF0YSA9IFRMQU5fTkVUX0NNRF9OUkVTRVQgfCBUTEFOX05FVF9DTURfTldSQVA7CisJaWYgKHByaXYtPnRsYW5GdWxsRHVwbGV4KSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ01EX0RVUExFWDsKIAl9CisJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfQ01ELCBkYXRhKTsKKwlkYXRhID0gVExBTl9ORVRfTUFTS19NQVNLNCB8IFRMQU5fTkVUX01BU0tfTUFTSzU7CisJaWYgKHByaXYtPnBoeU51bSA9PSAwKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfTUFTS19NQVNLNzsKKwl9CisJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfTUFTSywgZGF0YSk7CisJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTUFYX1JYLCAoKDE1MzYpICsgNykgJiB+Nyk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX0lEX0hJLCAmdGxwaHlfaWQxKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fSURfTE8sICZ0bHBoeV9pZDIpOwogCi0JLyogV2FpdCBmb3IgNTAgbXMgYW5kIHBvd2VydXAKLQkgKiBUaGlzIGlzIGFiaXRyYXJ5LiAgSXQgaXMgaW50ZW5kZWQgdG8gbWFrZSBzdXJlIHRoZQotCSAqIHRyYW5jZWl2ZXIgc2V0dGxlcy4KLQkgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1BVUCApOworCWlmICgodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZKQorCSAgICB8fCAocHJpdi0+YXVpKSkgeworCQlzdGF0dXMgPSBNSUlfR1NfTElOSzsKKwkJcHJpbnRmKCJUTEFOOiAgJXM6IExpbmsgZm9yY2VkLlxuIiwgcHJpdi0+bmljX25hbWUpOworCX0gZWxzZSB7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMpOworCQl1ZGVsYXkoMTAwMCk7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMpOworCQlpZiAoKHN0YXR1cyAmIE1JSV9HU19MSU5LKSAmJgkvKiBXZSBvbmx5IHN1cHBvcnQgbGluayBpbmZvIG9uIE5hdC5TZW0uIFBIWSdzICovCisJCSAgICAodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKQorCQkgICAgJiYgKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikpIHsKKwkJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0FOX0xQQSwgJnBhcnRuZXIpOworCQkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX1BBUiwKKwkJCQkJJnRscGh5X3Bhcik7CiAKLX0gLyogVExhbl9QaHlQb3dlckRvd24gKi8KKwkJCXByaW50ZigiVExBTjogJXM6IExpbmsgYWN0aXZlIHdpdGggIiwKKwkJCSAgICAgICBwcml2LT5uaWNfbmFtZSk7CisJCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgeworCQkJCXByaW50ZigiZm9yY2VkIDEwJXNNYnBzICVzLUR1cGxleFxuIiwKKwkJCQkgICAgICAgdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIKKwkJCQkgICAgICAgOiAiMCIsCisJCQkJICAgICAgIHRscGh5X3BhciAmIFRMQU5fUEhZX0RVUExFWF9GVUxMID8KKwkJCQkgICAgICAgIkZ1bGwiIDogIkhhbGYiKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmCisJCQkJICAgICgiQXV0b05lZ290aWF0aW9uIGVuYWJsZWQsIGF0IDEwJXNNYnBzICVzLUR1cGxleFxuIiwKKwkJCQkgICAgIHRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDoKKwkJCQkgICAgICIwIiwKKwkJCQkgICAgIHRscGh5X3BhciAmIFRMQU5fUEhZX0RVUExFWF9GVUxMID8KKwkJCQkgICAgICJGdWxsIiA6ICJIYWxmIik7CisJCQkJcHJpbnRmKCJUTEFOOiBQYXJ0bmVyIGNhcGFiaWxpdHk6ICIpOworCQkJCWZvciAoaSA9IDU7IGkgPD0gMTA7IGkrKykKKwkJCQkJaWYgKHBhcnRuZXIgJiAoMSA8PCBpKSkKKwkJCQkJCXByaW50ZigiJXMiLCBtZWRpYVtpIC0gNV0pOworCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KIAotdm9pZCBUTGFuX1BoeVBvd2VyVXAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1MTYJCXZhbHVlOworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LKTsKKyNpZmRlZiBNT05JVE9SCisJCQkvKiBXZSBoYXZlIGxpbmsgYmVhdC4uZm9yIG5vdyBhbnl3YXkgKi8KKwkJCXByaXYtPmxpbmsgPSAxOworCQkJLypFbmFibGluZyBsaW5rIGJlYXQgbW9uaXRvcmluZyAqLworCQkJLyogVExhbl9TZXRUaW1lciggbmljLCAoMTAqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOyAqLworCQkJbWRlbGF5KDEwMDAwKTsKKwkJCVRMYW5fUGh5TW9uaXRvcihuaWMpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUlJX0dTX0xJTkspIHsKKwkJCXByaW50ZigiVExBTjogJXM6IExpbmsgYWN0aXZlXG4iLCBwcml2LT5uaWNfbmFtZSk7CisJCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTkspOworCQl9CisJfQogCi0JVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBQb3dlcmluZyB1cCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKLQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7Ci0JdmFsdWUgPSBNSUlfR0NfTE9PUEJLOwotCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5W3ByaXYtPnBoeU51bV0sIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOwotCVRMYW5fTWlpU3luYyhkZXYtPmJhc2VfYWRkcik7Ci0JLyogV2FpdCBmb3IgNTAwIG1zIGFuZCByZXNldCB0aGUKLQkgKiB0cmFuY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKLQkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KLQkgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1JFU0VUICk7CisJaWYgKHByaXYtPnBoeU51bSA9PSAwKSB7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwpOworCQl0bHBoeV9jdGwgfD0gVExBTl9UQ19JTlRFTjsKKwkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7CisJCXNpbyA9IFRMYW5fRGlvUmVhZDgoQkFTRSwgVExBTl9ORVRfU0lPKTsKKwkJc2lvIHw9IFRMQU5fTkVUX1NJT19NSU5URU47CisJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTkVUX1NJTywgc2lvKTsKKwl9CiAKLX0gLyogVExhbl9QaHlQb3dlclVwICovCisJaWYgKHN0YXR1cyAmIE1JSV9HU19MSU5LKSB7CisJCVRMYW5fU2V0TWFjKG5pYywgMCwgbmljLT5ub2RlX2FkZHIpOworCQlwcml2LT5waHlPbmxpbmUgPSAxOworCQlvdXRiKChUTEFOX0hDX0lOVF9PTiA+PiA4KSwgQkFTRSArIFRMQU5fSE9TVF9DTUQgKyAxKTsKKy8qCQlpZiAoIGRlYnVnID49IDEgJiYgZGVidWcgIT0gVExBTl9ERUJVR19QUk9CRSApIHsKKwkJCW91dGIoICggVExBTl9IQ19SRVFfSU5UID4+IDggKSwgQkFTRSArIFRMQU5fSE9TVF9DTUQgKyAxICk7CisJCX0KIAotdm9pZCBUTGFuX1BoeVJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2CQlwaHk7Ci0JdTE2CQl2YWx1ZTsKKwkJKi8KKwkJb3V0bCh2aXJ0X3RvX2J1cygmcnhfcmluZyksIEJBU0UgKyBUTEFOX0NIX1BBUk0pOworCQlvdXRsKFRMQU5fSENfR08gfCBUTEFOX0hDX1JULCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmCisJCSAgICAoIlRMQU46ICVzOiBMaW5rIGluYWN0aXZlLCB3aWxsIHJldHJ5IGluIDEwIHNlY3MuLi5cbiIsCisJCSAgICAgcHJpdi0+bmljX25hbWUpOworCQkvKiBUTGFuX1NldFRpbWVyKCBuaWMsICgxMCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7ICovCisJCW1kZWxheSgxMDAwMCk7CisJCVRMYW5fRmluaXNoUmVzZXQobmljKTsKKwkJcmV0dXJuOwogCi0JcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJfQogCi0JVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBSZXNldGluZyBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKLQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7Ci0JdmFsdWUgPSBNSUlfR0NfTE9PUEJLIHwgTUlJX0dDX1JFU0VUOwotCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgJnZhbHVlICk7Ci0Jd2hpbGUgKCB2YWx1ZSAmIE1JSV9HQ19SRVNFVCApIHsKLQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSApOwotCX0KLQotCS8qIFdhaXQgZm9yIDUwMCBtcyBhbmQgaW5pdGlhbGl6ZS4KLQkgKiBJIGRvbid0IHJlbWVtYmVyIHdoeSBJIHdhaXQgdGhpcyBsb25nLgotCSAqIEkndmUgY2hhbmdlZCB0aGlzIHRvIDUwbXMsIGFzIGl0IHNlZW1zIGxvbmcgZW5vdWdoLgotCSAqLwotCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzIwKSwgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSyApOwotCi19IC8qIFRMYW5fUGh5UmVzZXQgKi8KLQotdm9pZCBUTGFuX1BoeVN0YXJ0TGluayggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUxNgkJYWJpbGl0eTsKLQl1MTYJCWNvbnRyb2w7Ci0JdTE2CQlkYXRhOwotCXUxNgkJcGh5OwotCXUxNgkJc3RhdHVzOwotCXUxNgkJdGN0bDsKLQotCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOwotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJ5aW5nIHRvIGFjdGl2YXRlIGxpbmsuXG4iLCBkZXYtPm5hbWUgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOwotCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmYWJpbGl0eSApOwotCi0JaWYgKCAoIHN0YXR1cyAmIE1JSV9HU19BVVRPTkVHICkgJiYgCi0JICAgICAoICEgcHJpdi0+YXVpICkgKSB7Ci0JCWFiaWxpdHkgPSBzdGF0dXMgPj4gMTE7Ci0JCWlmICggcHJpdi0+c3BlZWQgID09IFRMQU5fU1BFRURfMTAgJiYgCi0JCSAgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgwMDAwKTsKLQkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMCAmJgotCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7Ci0JCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7Ci0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDEwMCk7Ci0JCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCi0JCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMDAwKTsKLQkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKLQkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgewotCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOwotCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDIxMDApOwotCQl9IGVsc2UgewotCQotCQkJLyogU2V0IEF1dG8tTmVnIGFkdmVydGlzZW1lbnQgKi8KLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAoYWJpbGl0eSA8PCA1KSB8IDEpOwotCQkJLyogRW5hYmxlZSBBdXRvLU5lZyAqLwotCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDEwMDAgKTsKLQkJCS8qIFJlc3RhcnQgQXV0by1OZWcgKi8KLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMjAwICk7Ci0JCQkvKiBXYWl0IGZvciA0IHNlYyBmb3IgYXV0b25lZ290aWF0aW9uCi0JCSAJKiB0byBjb21wbGV0ZS4gIFRoZSBtYXggc3BlYyB0aW1lIGlzIGxlc3MgdGhhbiB0aGlzCi0JCSAJKiBidXQgdGhlIGNhcmQgbmVlZCBhZGRpdGlvbmFsIHRpbWUgdG8gc3RhcnQgQU4uCi0JCSAJKiAuNSBzZWMgc2hvdWxkIGJlIHBsZW50eSBleHRyYS4KLQkJIAkqLwotCQkJcHJpbnRrKCAiVExBTjogJXM6IFN0YXJ0aW5nIGF1dG9uZWdvdGlhdGlvbi5cbiIsIGRldi0+bmFtZSApOwotCQkJVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTiApOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCX0JCi0JCi0JaWYgKCAoIHByaXYtPmF1aSApICYmICggcHJpdi0+cGh5TnVtICE9IDAgKSApIHsKLQkJcHJpdi0+cGh5TnVtID0gMDsKLQkJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47Ci0JCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSApOwotCQlUTGFuX1NldFRpbWVyKCBkZXYsICg0MCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKLQkJcmV0dXJuOwotCX0gIGVsc2UgaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKLSAgICAgICAgCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGN0bCApOwotCQlpZiAoIHByaXYtPmF1aSApIHsKLSAgICAgICAgICAgICAgICAJdGN0bCB8PSBUTEFOX1RDX0FVSVNFTDsKLQkJfSBlbHNlIHsgCi0gICAgICAgICAgICAgICAgCXRjdGwgJj0gflRMQU5fVENfQVVJU0VMOwotCQkJY29udHJvbCA9IDA7Ci0JCQlpZiAoIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMICkgewotCQkJCWNvbnRyb2wgfD0gTUlJX0dDX0RVUExFWDsKLQkJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7Ci0JCQl9Ci0JCQlpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICkgewotCQkJCWNvbnRyb2wgfD0gTUlJX0dDX1NQRUVEU0VMOwotCQkJfQotICAgICAgIAkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgY29udHJvbCApOwotCQl9Ci0gICAgICAgIAlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRjdGwgKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciAyIHNlYyB0byBnaXZlIHRoZSB0cmFuY2VpdmVyIHRpbWUKLQkgKiB0byBlc3RhYmxpc2ggbGluay4KLQkgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsICg0KkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKLQotfSAvKiBUTGFuX1BoeVN0YXJ0TGluayAqLwotCi12b2lkIFRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUxNgkJYW5fYWR2OwotCXUxNgkJYW5fbHBhOwotCXUxNgkJZGF0YTsKLQl1MTYJCW1vZGU7Ci0JdTE2CQlwaHk7Ci0JdTE2CQlzdGF0dXM7Ci0JCi0JcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07Ci0KLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOwotCXVkZWxheSggMTAwMCApOwotCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7Ci0KLQlpZiAoICEgKCBzdGF0dXMgJiBNSUlfR1NfQVVUT0NNUExUICkgKSB7Ci0JCS8qIFdhaXQgZm9yIDggc2VjIHRvIGdpdmUgdGhlIHByb2Nlc3MKLQkJICogbW9yZSB0aW1lLiAgUGVyaGFwcyB3ZSBzaG91bGQgZmFpbCBhZnRlciBhIHdoaWxlLgotCQkgKi8KLQkJIGlmICghcHJpdi0+bmVnX2JlX3ZlcmJvc2UrKykgewotCQkJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBHaXZpbmcgYXV0b25lZ290aWF0aW9uIG1vcmUgdGltZS5cbiIpOwotCQkgCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgUGxlYXNlIGNoZWNrIHRoYXQgeW91ciBhZGFwdGVyIGhhc1xuIik7Ci0JCSAJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBiZWVuIHByb3Blcmx5IGNvbm5lY3RlZCB0byBhIEhVQiBvciBTd2l0Y2guXG4iKTsKLQkJCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgVHJ5aW5nIHRvIGVzdGFibGlzaCBsaW5rIGluIHRoZSBiYWNrZ3JvdW5kLi4uXG4iKTsKLQkJIH0KLQkJVExhbl9TZXRUaW1lciggZGV2LCAoOCpIWiksIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTiApOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRrKCAiVExBTjogJXM6IEF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZS5cbiIsIGRldi0+bmFtZSApOwotCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9BTl9BRFYsICZhbl9hZHYgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fTFBBLCAmYW5fbHBhICk7Ci0JbW9kZSA9IGFuX2FkdiAmIGFuX2xwYSAmIDB4MDNFMDsKLQlpZiAoIG1vZGUgJiAweDAxMDAgKSB7Ci0JCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKLQl9IGVsc2UgaWYgKCAhICggbW9kZSAmIDB4MDA4MCApICYmICggbW9kZSAmIDB4MDA0MCApICkgewotCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7Ci0JfQotCi0JaWYgKCAoICEgKCBtb2RlICYgMHgwMTgwICkgKSAmJiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAgKSAmJiAoIHByaXYtPnBoeU51bSAhPSAwICkgKSB7Ci0JCXByaXYtPnBoeU51bSA9IDA7Ci0JCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfCBUTEFOX05FVF9DRkdfUEhZX0VOOwotCQlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsIGRhdGEgKTsKLQkJVExhbl9TZXRUaW1lciggZGV2LCAoNDAwKkhaLzEwMDApLCBUTEFOX1RJTUVSX1BIWV9QRE9XTiApOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKLQkJaWYgKCAoIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMICkgfHwgKCBhbl9hZHYgJiBhbl9scGEgJiAweDAwNDAgKSApIHsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgTUlJX0dDX0FVVE9FTkIgfCBNSUlfR0NfRFVQTEVYICk7Ci0JCQlwcmludGsoICJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggRlVMTC1EVVBMRVhcbiIgKTsKLQkJfSBlbHNlIHsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgTUlJX0dDX0FVVE9FTkIgKTsKLQkJCXByaW50ayggIlRMQU46ICBTdGFydGluZyBpbnRlcm5hbCBQSFkgd2l0aCBIQUxGLURVUExFWFxuIiApOwotCQl9Ci0JfQotCi0JLyogV2FpdCBmb3IgMTAwIG1zLiAgTm8gcmVhc29uIGluIHBhcnRpdGljdWxhci4KLQkgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8xMCksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7Ci0JCQotfSAvKiBUTGFuX1BoeUZpbmlzaEF1dG9OZWcgKi8KLQotI2lmZGVmIE1PTklUT1IKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICoKLSAgICAgICAgKiAgICAgIFRMYW5fcGh5TW9uaXRvcgotICAgICAgICAqCi0gICAgICAgICogICAgICBSZXR1cm5zOiAKLSAgICAgICAgKiAgICAgICAgICAgICAgTm9uZQotICAgICAgICAqCi0gICAgICAgICogICAgICBQYXJhbXM6Ci0gICAgICAgICogICAgICAgICAgICAgIGRldiAgICAgICAgICAgICBUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGlzIGRldmljZS4KLSAgICAgICAgKgotICAgICAgICAqICAgICAgCi0gICAgICAgICogICAgICBUaGlzIGZ1bmN0aW9uIG1vbml0b3JzIFBIWSBjb25kaXRpb24gYnkgcmVhZGluZyB0aGUgc3RhdHVzCi0gICAgICAgICogICAgICByZWdpc3RlciB2aWEgdGhlIE1JSSBidXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZ2l2ZSBpbmZvCi0gICAgICAgICogICAgICBhYm91dCBsaW5rIGNoYW5nZXMgKHVwL2Rvd24pLCBhbmQgcG9zc2libGUgc3dpdGNoIHRvIGFsdGVybmF0ZQotICAgICAgICAqICAgICAgbWVkaWEuCi0gICAgICAgICoKLSAgICAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgVExhbl9QaHlNb25pdG9yKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2ICAgICBwaHk7Ci0JdTE2ICAgICBwaHlfc3RhdHVzOwotCi0JcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07Ci0KLSAgICAgICAgLyogR2V0IFBIWSBzdGF0dXMgcmVnaXN0ZXIgKi8KLSAgICAgICAgVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZwaHlfc3RhdHVzICk7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgbGluayBoYXMgYmVlbiBsb3N0ICovCi0gICAgICAgIGlmICghKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykpIHsgCi0gCSAgICAgICBpZiAocHJpdi0+bGluaykgewotCQkgICAgICBwcml2LT5saW5rID0gMDsKLQkgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAlcyBoYXMgbG9zdCBsaW5rXG4iLCBkZXYtPm5hbWUpOwotCSAgICAgICAgICAgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7Ci0JCSAgICAgIFRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOwotCQkgICAgICByZXR1cm47Ci0JCX0KLQl9Ci0KLSAgICAgICAgLyogTGluayByZXN0YWJsaXNoZWQ/ICovCi0gICAgICAgIGlmICgocGh5X3N0YXR1cyAmIE1JSV9HU19MSU5LKSAmJiAhcHJpdi0+bGluaykgewotIAkJcHJpdi0+bGluayA9IDE7Ci0gICAgICAgIAlwcmludGsoS0VSTl9ERUJVRyAiVExBTjogJXMgaGFzIHJlZXN0YWJsaXNoZWQgbGlua1xuIiwgZGV2LT5uYW1lKTsKLSAgICAgICAgCWRldi0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7Ci0gICAgICAgIH0KLQotCS8qIFNldHVwIGEgbmV3IG1vbml0b3IgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKLX0JCi0KLSNlbmRpZiAvKiBNT05JVE9SICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlUaHVuZGVyTEFOIERyaXZlciBNSUkgUm91dGluZXMKLQotCVRoZXNlIHJvdXRpbmVzIGFyZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gQ2hhcC4gMiBvZiB0aGUKLQkiVGh1bmRlckxBTiBQcm9ncmFtbWVyJ3MgR3VpZGUiLCBwcC4gMTUtMjQuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9NaWlSZWFkUmVnCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkwCWlmIGFjayByZWNlaXZlZCBvawotCSAqCQkxCW90aGVyd2lzZS4KLQkgKgotCSAqCVBhcm1zOgotCSAqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcKLQkgKgkJCQlUaGUgaW8gYWRkcmVzcyBhbmQgaW50ZXJydXB0IGNvdW50Ci0JICoJCQkJZm9yIHRoaXMgZGV2aWNlLgotCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KLQkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCi0JICoJCQkJcmV0cmVpdmVkLgotCSAqCQl2YWwJCUEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZQotCSAqCQkJCXJldHJpZXZlZCB2YWx1ZS4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgVExBTidzIE1JSSBidXMgdG8gcmV0cmVpdmUgdGhlIGNvbnRlbnRzCi0JICoJb2YgYSBnaXZlbiByZWdpc3RlciBvbiBhIFBIWS4gIEl0IHNlbmRzIHRoZSBhcHByb3ByaWF0ZSBpbmZvCi0JICoJYW5kIHRoZW4gcmVhZHMgdGhlIDE2LWJpdCByZWdpc3RlciB2YWx1ZSBmcm9tIHRoZSBNSUkgYnVzIHZpYQotCSAqCXRoZSBUTEFOIFNJTyByZWdpc3Rlci4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IFRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHBoeSwgdTE2IHJlZywgdTE2ICp2YWwgKQotewotCXU4CW5hY2s7Ci0JdTE2CXNpbywgdG1wOwotIAl1MzIJaTsKLQlpbnQJZXJyOwotCWludAltaW50ZW47Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JZXJyID0gRkFMU0U7Ci0Jb3V0dyhUTEFOX05FVF9TSU8sIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKLQlzaW8gPSBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87Ci0JCi0JaWYgKCFpbl9pcnEoKSkKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCVRMYW5fTWlpU3luYyhkZXYtPmJhc2VfYWRkcik7Ci0KLQltaW50ZW4gPSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7Ci0JaWYgKCBtaW50ZW4gKQotCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7Ci0KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFN0YXJ0ICggMDFiICkgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgyLCAyICk7CS8qIFJlYWQgICggMTBiICkgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcGh5LCA1ICk7CS8qIERldmljZSAjICAgICAgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcmVnLCA1ICk7CS8qIFJlZ2lzdGVyICMgICAgKi8KLQotCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOwkJLyogQ2hhbmdlIGRpcmVjdGlvbiAqLwotCi0JVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIENsb2NrIElkbGUgYml0ICovCi0JVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7Ci0JVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIFdhaXQgMzAwbnMgKi8KLQotCW5hY2sgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CS8qIENoZWNrIGZvciBBQ0sgKi8KLQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIEZpbmlzaCBBQ0sgKi8KLQlpZiAobmFjaykgewkJCQkJLyogTm8gQUNLLCBzbyBmYWtlIGl0ICovCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7Ci0JCX0KLQkJdG1wID0gMHhmZmZmOwotCQllcnIgPSBUUlVFOwotCX0gZWxzZSB7CQkJCQkvKiBBQ0ssIHNvIHJlYWQgZGF0YSAqLwotCQlmb3IgKHRtcCA9IDAsIGkgPSAweDgwMDA7IGk7IGkgPj49IDEpIHsKLQkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7Ci0JCQlpZiAoVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pKQotCQkJCXRtcCB8PSBpOwotCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7Ci0JCX0KLQl9Ci0KLQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkJLyogSWRsZSBjeWNsZSAqLwotCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCi0JaWYgKCBtaW50ZW4gKQotCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOwotCi0JKnZhbCA9IHRtcDsKLQkKLQlpZiAoIWluX2lycSgpKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gZXJyOwotCi19IC8qIFRMYW5fTWlpUmVhZFJlZyAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fTWlpU2VuZERhdGEKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIJaW4KLQkgKgkJCQlxdWVzdGlvbi4KLQkgKgkJZGV2CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCi0JICoJCWRhdGEJCVRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCi0JICoJCW51bV9iaXRzCVRoZSBudW1iZXIgb2YgYml0cyBpbiBkYXRhIHRoYXQgYXJlIHRvCi0JICoJCQkJYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBvbiBzZXF1ZW5jZSBvZiBiaXRzIG9uIHRoZSBNSUkKLQkgKgljb25maWd1cmF0aW9uIGJ1cy4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBUTGFuX01paVNlbmREYXRhKCB1MTYgYmFzZV9wb3J0LCB1MzIgZGF0YSwgdW5zaWduZWQgbnVtX2JpdHMgKQotewotCXUxNiBzaW87Ci0JdTMyIGk7Ci0KLQlpZiAoIG51bV9iaXRzID09IDAgKQotCQlyZXR1cm47Ci0KLQlvdXR3KCBUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUiApOwotCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87Ci0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7Ci0KLQlmb3IgKCBpID0gKCAweDEgPDwgKCBudW1fYml0cyAtIDEgKSApOyBpOyBpID4+PSAxICkgewotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7Ci0JCSh2b2lkKSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwotCQlpZiAoIGRhdGEgJiBpICkKLQkJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOwotCQllbHNlCi0JCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwotCQkodm9pZCkgVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKLQl9Ci0KLX0gLyogVExhbl9NaWlTZW5kRGF0YSAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fTWlpU3luYwotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlciBpbgotCSAqCQkJCXF1ZXN0aW9uLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbnMgc3luY3MgYWxsIFBIWXMgaW4gdGVybXMgb2YgdGhlIE1JSSBjb25maWd1cmF0aW9uCi0JICoJYnVzLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFRMYW5fTWlpU3luYyggdTE2IGJhc2VfcG9ydCApCi17Ci0JaW50IGk7Ci0JdTE2IHNpbzsKLQotCW91dHcoIFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSICk7Ci0Jc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKLQotCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7Ci0JZm9yICggaSA9IDA7IGkgPCAzMjsgaSsrICkgewotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7Ci0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7Ci0JfQotCi19IC8qIFRMYW5fTWlpU3luYyAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fTWlpV3JpdGVSZWcKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQotCSAqCQkJCXRvIHdyaXRlIHRvLgotCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgd3JpdHRlbiB0by4KLQkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCi0JICoJCQkJd3JpdHRlbi4KLQkgKgkJdmFsCQlUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhCi0JICoJZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbyBhbmQgdGhlbgotCSAqCXdyaXRlcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBjb25maWd1cmF0aW9uIGJ1cwotCSAqCXZpYSB0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgVExhbl9NaWlXcml0ZVJlZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHBoeSwgdTE2IHJlZywgdTE2IHZhbCApCi17Ci0JdTE2CXNpbzsKLQlpbnQJbWludGVuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQotCW91dHcoVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0Jc2lvID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOwotCQotCWlmICghaW5faXJxKCkpCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7Ci0KLQltaW50ZW4gPSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7Ci0JaWYgKCBtaW50ZW4gKQotCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKLQotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogU3RhcnQgKCAwMWIgKSAqLwotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogV3JpdGUgKCAwMWIgKSAqLwotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCBwaHksIDUgKTsJLyogRGV2aWNlICMgICAgICAqLwotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCByZWcsIDUgKTsJLyogUmVnaXN0ZXIgIyAgICAqLwotCi0JVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MiwgMiApOwkvKiBTZW5kIEFDSyAqLwotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCB2YWwsIDE2ICk7CS8qIFNlbmQgRGF0YSAqLwotCi0JVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwkvKiBJZGxlIGN5Y2xlICovCi0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKLQotCWlmICggbWludGVuICkKLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOwotCQotCWlmICghaW5faXJxKCkpCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotfSAvKiBUTGFuX01paVdyaXRlUmVnICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNrZWxfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBPTEwgLSBXYWl0IGZvciBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNrZWxfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLwotCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCi0JLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KLQlyZXR1cm4gKDApOwkvKiBpbml0aWFsbHkgYXMgdGhpcyBpcyBjYWxsZWQgdG8gZmx1c2ggdGhlIGlucHV0ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBza2VsX3RyYW5zbWl0KAotCXN0cnVjdCBuaWMgKm5pYywKLQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwotCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNrZWxfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCi1Zb3Ugc2hvdWxkIG9taXQgdGhlIGxhc3QgYXJndW1lbnQgc3RydWN0IHBjaV9kZXZpY2UgKiBmb3IgYSBub24tUENJIE5JQwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqdGxhbl9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycywKLQlzdHJ1Y3QgcGNpX2RldmljZSAqcCkKLXsKLQkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0JLyogaWYgYm9hcmQgZm91bmQgKi8KLQl7Ci0JCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLwotCQluaWMtPnJlc2V0ID0gc2tlbF9yZXNldDsKLQkJbmljLT5wb2xsID0gc2tlbF9wb2xsOwotCQluaWMtPnRyYW5zbWl0ID0gc2tlbF90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gc2tlbF9kaXNhYmxlOwotCQlyZXR1cm4gbmljOwotCX0KLQkvKiBlbHNlICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZgkwCi0jaWZuZGVmIFRMQU5fSAotI2RlZmluZSBUTEFOX0gKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBMaW51eCBUaHVuZGVyTEFOIERyaXZlcgotICoKLSAqICB0bGFuLmgKLSAqICBieSBKYW1lcyBCYW5rcwotICoKLSAqICAoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KLSAqICAoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KLSAqIAotICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKLSAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotICoKLSAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggdGFic3RvcD00LCBjb2x1bXM+PTEzMgotICoKLSAqICAKLSAqICBEZWMgMTAsIDE5OTkJVG9yYmVuIE1hdGhpYXNlbiA8dG9yYmVuLm1hdGhpYXNlbkBjb21wYXEuY29tPgotICoJCQlOZXcgTWFpbnRhaW5lcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jZGVmaW5lIEZBTFNFCQkJMAotI2RlZmluZSBUUlVFCQkJMQotCi0jZGVmaW5lIFRYX1RJTUVPVVQJCSgxMCpIWikJIC8qIFdlIG5lZWQgdGltZSBmb3IgYXV0by1uZWcgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdGxhbl9hZGFwdGVyX2VudHJ5IHsKLQl1MTYJdmVuZG9ySWQ7Ci0JdTE2CWRldmljZUlkOwotCWNoYXIJKmRldmljZUxhYmVsOwotCXUzMglmbGFnczsKLQl1MTYJYWRkck9mczsKLX0gVExhbkFkYXB0ZXJFbnRyeTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIEVJU0EgRGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVJU0FfSUQgICAgICAweGM4MCAgIC8qIEVJU0EgSUQgUmVnaXN0ZXJzICovIAotI2RlZmluZSBFSVNBX0lEMCAgICAgMHhjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDAgKi8gCi0jZGVmaW5lIEVJU0FfSUQxICAgICAweGM4MSAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKLSNkZWZpbmUgRUlTQV9JRDIgICAgIDB4YzgyICAgLyogRUlTQSBJRCBSZWdpc3RlciAyICovIAotI2RlZmluZSBFSVNBX0lEMyAgICAgMHhjODMgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDMgKi8gCi0jZGVmaW5lIEVJU0FfQ1IgICAgICAweGM4NCAgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBFSVNBX1JFRzAgICAgMHhjODggICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLwotI2RlZmluZSBFSVNBX1JFRzEgICAgMHhjODkgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLwotI2RlZmluZSBFSVNBX1JFRzIgICAgMHhjOGEgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLwotI2RlZmluZSBFSVNBX1JFRzMgICAgMHhjOGYgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLwotI2RlZmluZSBFSVNBX0FQUk9NICAgMHhjOTAgICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFJ4L1R4IExpc3QgRGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB0bGFuX2J1ZmZlcl9yZWZfdGFnIHsKLQl1MzIJY291bnQ7Ci0JdTMyCWFkZHJlc3M7Ci19IFRMYW5CdWZmZXJSZWY7Ci0KLXR5cGVkZWYgc3RydWN0IHRsYW5fbGlzdF90YWcgewotCXUzMgkJZm9yd2FyZDsKLQl1MTYJCWNTdGF0OwotCXUxNgkJZnJhbWVTaXplOwotCVRMYW5CdWZmZXJSZWYJYnVmZmVyW1RMQU5fQlVGRkVSU19QRVJfTElTVF07Ci19IFRMYW5MaXN0OwotCi10eXBlZGVmIHU4IFRMYW5CdWZmZXJbVExBTl9NQVhfRlJBTUVfU0laRV07Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUTEFOIFByaXZhdGUgSW5mb3JtYXRpb24gU3RydWN0dXJlCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdGxhbl9wcml2YXRlX3RhZyB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKm5leHREZXZpY2U7Ci0Jdm9pZAkJCSpkbWFTdG9yYWdlOwotCXU4CQkJKnBhZEJ1ZmZlcjsKLQlUTGFuTGlzdCAgICAgICAgICAgICAgICAqcnhMaXN0OwotCXU4CQkJKnJ4QnVmZmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHJ4SGVhZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICByeFRhaWw7Ci0JdTMyCQkJcnhFb2NDb3VudDsKLQlUTGFuTGlzdCAgICAgICAgICAgICAgICAqdHhMaXN0OwotCXU4CQkJKnR4QnVmZmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4SGVhZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICB0eEluUHJvZ3Jlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgdHhUYWlsOwotCXUzMgkJCXR4QnVzeUNvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHBoeU9ubGluZTsKLQl1MzIJCQl0aW1lclNldEF0OwotCXUzMgkJCXRpbWVyVHlwZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKLQlzdHJ1Y3QgYm9hcmQJCSphZGFwdGVyOwotCXUzMgkJCWFkYXB0ZXJSZXY7Ci0JdTMyCQkJYXVpOwotCXUzMgkJCWRlYnVnOwotCXUzMgkJCWR1cGxleDsKLQl1MzIJCQlwaHlbMl07Ci0JdTMyCQkJcGh5TnVtOwotCXUzMgkJCXNwZWVkOwotCXU4CQkJdGxhblJldjsKLQl1OAkJCXRsYW5GdWxsRHVwbGV4OwotCWNoYXIgICAgICAgICAgICAgICAgICAgIGRldk5hbWVbOF07Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQl1OAkJCWxpbms7Ci0JdTgJCQlpc19laXNhOwotCXN0cnVjdCB0cV9zdHJ1Y3QJdGxhbl90cXVldWU7Ci0JdTgJCQluZWdfYmVfdmVyYm9zZTsKLX0gVExhblByaXZhdGVJbmZvOwotCi0jZGVmaW5lIAlUTEFOX0hDX0dPCQkweDgwMDAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX1NUT1AJCTB4NDAwMDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfQUNLCQkweDIwMDAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0NTX01BU0sJCTB4MUZFMDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfRU9DCQkweDAwMTAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX1JUCQkweDAwMDgwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX05FUwkJMHgwMDA0MDAwMAotI2RlZmluZQkJVExBTl9IQ19BRF9SU1QJCTB4MDAwMDgwMDAKLSNkZWZpbmUJCVRMQU5fSENfTERfVE1SCQkweDAwMDA0MDAwCi0jZGVmaW5lCQlUTEFOX0hDX0xEX1RIUgkJMHgwMDAwMjAwMAotI2RlZmluZQkJVExBTl9IQ19SRVFfSU5UCQkweDAwMDAxMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0lOVF9PRkYJCTB4MDAwMDA4MDAKLSNkZWZpbmUJCVRMQU5fSENfSU5UX09OCQkweDAwMDAwNDAwCi0jZGVmaW5lCQlUTEFOX0hDX0FDX01BU0sJCTB4MDAwMDAwRkYKLSNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAotI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKLSNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCi0KLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAotI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAotI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0Ci0jZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQotI2RlZmluZSAJVExBTl9ORVRfU0lPX01JTlRFTgkweDgwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fRUNMT0sJMHg0MAotI2RlZmluZQkJVExBTl9ORVRfU0lPX0VUWEVOCTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19FREFUQQkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fTk1SU1QJMHgwOAotI2RlZmluZQkJVExBTl9ORVRfU0lPX01DTEsJMHgwNAotI2RlZmluZQkJVExBTl9ORVRfU0lPX01UWEVOCTB4MDIKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19NREFUQQkweDAxCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfTUlSUQkweDgwCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfSEJFQVQJMHg0MAotI2RlZmluZQkJVExBTl9ORVRfU1RTX1RYU1RPUAkweDIwCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfUlhTVE9QCTB4MTAKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19SU1JWRAkweDBGCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s3CTB4ODAKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzYJMHg0MAotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNQkweDIwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s0CTB4MTAKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfUlNSVkQJMHgwRgotI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCi0jZGVmaW5lCQlUTEFOX0xFRF9BQ1QJCTB4MTAKLSNkZWZpbmUJCVRMQU5fTEVEX0xJTksJCTB4MDEKLSNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0Ci0jZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgotI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKLQotI2RlZmluZSBDSVJDX0lOQyggYSwgYiApIGlmICggKythID49IGIgKSBhID0gMAotCi0jaWZkZWYgSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OCi0vKiBnaXZlbiA2IGJ5dGVzLCB2aWV3IHRoZW0gYXMgOCA2LWJpdCBudW1iZXJzIGFuZCByZXR1cm4gdGhlIFhPUiBvZiB0aG9zZSAqLwotLyogdGhlIGNvZGUgYmVsb3cgaXMgYWJvdXQgc2V2ZW4gdGltZXMgYXMgZmFzdCBhcyB0aGUgb3JpZ2luYWwgY29kZSAqLwotaW5saW5lIHUzMiBUTGFuX0hhc2hGdW5jKCB1OCAqYSApCi17Ci0gICAgICAgIHU4ICAgICBoYXNoOwotCi0gICAgICAgIGhhc2ggPSAoYVswXV5hWzNdKTsgICAgICAgICAgICAgLyogJiAwNzcgKi8KLSAgICAgICAgaGFzaCBePSAoKGFbMF1eYVszXSk+PjYpOyAgICAgICAvKiAmIDAwMyAqLwotICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKTw8Mik7ICAgICAgIC8qICYgMDc0ICovCi0gICAgICAgIGhhc2ggXj0gKChhWzFdXmFbNF0pPj40KTsgICAgICAgLyogJiAwMTcgKi8KLSAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk8PDQpOyAgICAgICAvKiAmIDA2MCAqLwotICAgICAgICBoYXNoIF49ICgoYVsyXV5hWzVdKT4+Mik7ICAgICAgIC8qICYgMDc3ICovCi0KLSAgICAgICAgcmV0dXJuIChoYXNoICYgMDc3KTsKLX0KLQotI2Vsc2UgLyogb3JpZ2luYWwgY29kZSAqLwotCi1pbmxpbmUJdTMyCXhvciggdTMyIGEsIHUzMiBiICkKLXsKLQlyZXR1cm4gKCAoIGEgJiYgISBiICkgfHwgKCAhIGEgJiYgYiApICk7Ci19Ci0jZGVmaW5lIFhPUjgoIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGggKQl4b3IoIGEsIHhvciggYiwgeG9yKCBjLCB4b3IoIGQsIHhvciggZSwgeG9yKCBmLCB4b3IoIGcsIGggKSApICkgKSApICkgKQotI2RlZmluZSBEQSggYSwgYml0ICkJCQkJCSggKCAodTgpIGFbYml0LzhdICkgJiAoICh1OCkgKCAxIDw8IGJpdCU4ICkgKSApCi0KLWlubGluZSB1MzIgVExhbl9IYXNoRnVuYyggdTggKmEgKQotewotCXUzMgloYXNoOwotCi0JaGFzaCAgPSBYT1I4KCBEQShhLDApLCBEQShhLCA2KSwgREEoYSwxMiksIERBKGEsMTgpLCBEQShhLDI0KSwgREEoYSwzMCksIERBKGEsMzYpLCBEQShhLDQyKSApOwotCWhhc2ggfD0gWE9SOCggREEoYSwxKSwgREEoYSwgNyksIERBKGEsMTMpLCBEQShhLDE5KSwgREEoYSwyNSksIERBKGEsMzEpLCBEQShhLDM3KSwgREEoYSw0MykgKSA8PCAxOwotCWhhc2ggfD0gWE9SOCggREEoYSwyKSwgREEoYSwgOCksIERBKGEsMTQpLCBEQShhLDIwKSwgREEoYSwyNiksIERBKGEsMzIpLCBEQShhLDM4KSwgREEoYSw0NCkgKSA8PCAyOwotCWhhc2ggfD0gWE9SOCggREEoYSwzKSwgREEoYSwgOSksIERBKGEsMTUpLCBEQShhLDIxKSwgREEoYSwyNyksIERBKGEsMzMpLCBEQShhLDM5KSwgREEoYSw0NSkgKSA8PCAzOwotCWhhc2ggfD0gWE9SOCggREEoYSw0KSwgREEoYSwxMCksIERBKGEsMTYpLCBEQShhLDIyKSwgREEoYSwyOCksIERBKGEsMzQpLCBEQShhLDQwKSwgREEoYSw0NikgKSA8PCA0OwotCWhhc2ggfD0gWE9SOCggREEoYSw1KSwgREEoYSwxMSksIERBKGEsMTcpLCBEQShhLDIzKSwgREEoYSwyOSksIERBKGEsMzUpLCBEQShhLDQxKSwgREEoYSw0NykgKSA8PCA1OwotCi0JcmV0dXJuIGhhc2g7Ci0KLX0gCi0KLSNlbmRpZiAvKiBJX0xJS0VfQV9GQVNUX0hBU0hfRlVOQ1RJT04gKi8KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgTGludXggVGh1bmRlckxBTiBEcml2ZXIKLSAqCi0gKiAgdGxhbi5jCi0gKiAgYnkgSmFtZXMgQmFua3MKLSAqCi0gKiAgKEMpIDE5OTctMTk5OCBDYWxkZXJhLCBJbmMuCi0gKiAgKEMpIDE5OTggSmFtZXMgQmFua3MKLSAqICAoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KLSAqCi0gKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwotICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICoqIFRoaXMgZmlsZSBpcyBiZXN0IHZpZXdlZC9lZGl0ZWQgd2l0aCBjb2x1bW5zPj0xMzIuCi0gKgotICoqIFVzZWZ1bCAoaWYgbm90IHJlcXVpcmVkKSByZWFkaW5nOgotICoKLSAqCQlUZXhhcyBJbnN0cnVtZW50cywgVGh1bmRlckxBTiBQcm9ncmFtbWVyJ3MgR3VpZGUsCi0gKgkJCVRJIExpdGVyYXR1cmUgTnVtYmVyIFNQV1UwMTNBCi0gKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LnRpLmNvbQotICoJCUxldmVsIE9uZSwgTFhUOTAxIGFuZCBMWFQ5NzAgRGF0YSBTaGVldHMKLSAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubGV2ZWwxLmNvbQotICoJCU5hdGlvbmFsIFNlbWljb25kdWN0b3IsIERQODM4NDBBIERhdGEgU2hlZXQKLSAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubmF0aW9uYWwuY29tCi0gKgkJTWljcm9jaGlwIFRlY2hub2xvZ3ksIDI0QzAxQS8wMkEvMDRBIERhdGEgU2hlZXQKLSAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubWljcm9jaGlwLmNvbQotICoKLSAqIENoYW5nZSBIaXN0b3J5Ci0gKgotICoJVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT46CVRMYW5fUGNpUHJvYmUoKSBub3cgdXNlcwotICoJCQkJCQluZXcgUENJIEJJT1MgaW50ZXJmYWNlLgotICoJQWxhbiBDb3gJPGFsYW5AcmVkaGF0LmNvbT46CUZpeGVkIHRoZSBvdXQgb2YgbWVtb3J5Ci0gKgkJCQkJCWhhbmRsaW5nLgotICogICAgICAKLSAqCVRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4gTmV3IE1haW50YWluZXIhCi0gKgotICoJdjEuMSBEZWMgMjAsIDE5OTkgICAgLSBSZW1vdmVkIGxpbnV4IHZlcnNpb24gY2hlY2tpbmcKLSAqCQkJICAgICAgIFBhdGNoIGZyb20gVGlncmFuIEFpdmF6aWFuLiAKLSAqCQkJICAgICAtIHYxLjEgaW5jbHVkZXMgQWxhbidzIFNNUCB1cGRhdGVzLgotICoJCQkgICAgIC0gV2Ugc3RpbGwgaGF2ZSBwcm9ibGVtcyBvbiBTTVAgdGhvdWdoLAotICoJCQkgICAgICAgYnV0IEknbSBsb29raW5nIGludG8gdGhhdC4gCi0gKgkJCQotICoJdjEuMiBKYW4gMDIsIDIwMDAgICAgLSBIb3BlZnVsbHkgZml4ZWQgdGhlIFNNUCBkZWFkbG9jay4KLSAqCQkJICAgICAtIFJlbW92ZWQgZGVwZW5kZW5jeSBvZiBIWiBiZWluZyAxMDAuCi0gKgkJCSAgICAgLSBXZSBub3cgYWxsb3cgaGlnaGVyIHByaW9yaXR5IHRpbWVycyB0byAKLSAqCQkJICAgICAgIG92ZXJ3cml0ZSB0aW1lcnMgbGlrZSBUTEFOX1RJTUVSX0FDVElWSVRZCi0gKgkJCSAgICAgICBQYXRjaCBmcm9tIEpvaG4gQ2FnbGUgPGpvaG4uY2FnbGVAY29tcGFxLmNvbT4uCi0gKgkJCSAgICAgLSBGaXhlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncy4KLSAqCi0gKgl2MS4zIEZlYiAwNCwgMjAwMCAgICAtIEZpeGVkIHRoZSByZW1haW5pbmcgSFogaXNzdWVzLgotICoJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIHBjaV9wcmVzZW50KCkuIAotICoJCQkgICAgIC0gUmVtb3ZlZCBTQV9JTlRFUlJVUFQgZmxhZyBmcm9tIGlycSBoYW5kbGVyLgotICoJCQkgICAgIC0gQWRkZWQgX19pbml0IGFuZCBfX2luaXRkYXRhIHRvIHJlZHVjZSByZXNpc2RlbnQgCi0gKgkJCSAgICAgICBjb2RlIHNpemUuCi0gKgkJCSAgICAgLSBEcml2ZXIgbm93IHVzZXMgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQuCi0gKgkJCSAgICAgLSBSZXdyb3RlIGluaXRfbW9kdWxlIGFuZCB0bGFuX3Byb2JlIHRvCi0gKgkJCSAgICAgICBzaGFyZSBhIGxvdCBtb3JlIGNvZGUuIFdlIG5vdyB1c2UgdGxhbl9wcm9iZQotICoJCQkgICAgICAgd2l0aCBidWlsdGluIGFuZCBtb2R1bGUgZHJpdmVyLgotICoJCQkgICAgIC0gRHJpdmVyIHBvcnRlZCB0byBuZXcgbmV0IEFQSS4gCi0gKgkJCSAgICAgLSB0bGFuLnR4dCBoYXMgYmVlbiByZXdvcmtlZCB0byByZWZsZWN0IGN1cnJlbnQgCi0gKgkJCSAgICAgICBkcml2ZXIgKGFsbW9zdCkKLSAqCQkJICAgICAtIE90aGVyIG1pbm9yIHN0dWZmCi0gKgotICoJdjEuNCBGZWIgMTAsIDIwMDAgICAgLSBVcGRhdGVkIHdpdGggbW9yZSBjaGFuZ2VzIHJlcXVpcmVkIGFmdGVyIERhdmUncwotICoJICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGNsZWFudXAgaW4gMi4zLjQzcHJlNyAoVGlncmFuICYgbXlzZWxmKQotICoJICAgICAgICAgICAgICAgICAgICAgLSBNaW5vciBzdHVmZi4KLSAqCi0gKgl2MS41IE1hcmNoIDIyLCAyMDAwICAtIEZpeGVkIGFub3RoZXIgdGltZXIgYnVnIHRoYXQgd291bGQgaGFuZyB0aGUgZHJpdmVyCi0gKgkJCSAgICAgICBpZiBubyBjYWJsZS9saW5rIHdlcmUgcHJlc2VudC4KLSAqCQkJICAgICAtIENvc21ldGljIGNoYW5nZXMuCi0gKgkJCSAgICAgLSBUT0RPOiBQb3J0IGNvbXBsZXRlbHkgdG8gbmV3IFBDSS9ETUEgQVBJCi0gKgkJCSAgICAgCSAgICAgQXV0by1OZWcgZmFsbGJhY2suCi0gKgotICogCXYxLjYgQXByaWwgMDQsIDIwMDAgIC0gRml4ZWQgZHJpdmVyIHN1cHBvcnQgZm9yIGtlcm5lbC1wYXJhbWV0ZXJzLiBIYXZlbid0Ci0gKiAJCQkgICAgICAgdGVzdGVkIGl0IHRob3VnaCwgYXMgdGhlIGtlcm5lbCBzdXBwb3J0IGlzIGN1cnJlbnRseSAKLSAqIAkJCSAgICAgICBicm9rZW4gKDIuMy45OXA0cDMpLgotICogCQkJICAgICAtIFVwZGF0ZWQgdGxhbi50eHQgYWNjb3JkaW5nbHkuCi0gKiAJCQkgICAgIC0gQWRqdXN0ZWQgbWluaW11bS9tYXhpbXVtIGZyYW1lIGxlbmd0aC4KLSAqIAkJCSAgICAgLSBUaGVyZSBpcyBub3cgYSBUTEFOIHdlYnNpdGUgdXAgYXQgCi0gKiAJCQkgICAgICAgaHR0cDovL3RsYW4ua2VybmVsLmRrCi0gKgotICogCXYxLjcgQXByaWwgMDcsIDIwMDAgIC0gU3RhcnRlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGlvY3Rscy4gRHJpdmVyIG5vdwotICogCQkJICAgICAgIHJlcG9ydHMgUEhZIGluZm9ybWF0aW9uIHdoZW4gdXNlZCB3aXRoIERvbmFsZAotICogCQkJICAgICAgIEJlY2tlcnMgdXNlcnNwYWNlIE1JSSBkaWFnbm9zdGljcyB1dGlsaXR5LgotICoKLSAqIAl2MS44IEFwcmlsIDIzLCAyMDAwICAtIEZpeGVkIHN1cHBvcnQgZm9yIGZvcmNlZCBzcGVlZC9kdXBsZXggc2V0dGluZ3MuCi0gKiAJCQkgICAgIC0gQWRkZWQgbGluayBpbmZvcm1hdGlvbiB0byBBdXRvLU5lZyBhbmQgZm9yY2VkCi0gKiAJCQkgICAgICAgbW9kZXMuIFdoZW4gTklDIG9wZXJhdGVzIHdpdGggYXV0by1uZWcgdGhlIGRyaXZlcgotICogCQkJICAgICAgIHdpbGwgcmVwb3J0IExpbmsgc3BlZWQgJiBkdXBsZXggbW9kZXMgYXMgd2VsbCBhcwotICogCQkJICAgICAgIGxpbmsgcGFydG5lciBhYmlsaXRpZXMuIFdoZW4gZm9yY2VkIGxpbmsgaXMgdXNlZCwKLSAqIAkJCSAgICAgICB0aGUgZHJpdmVyIHdpbGwgcmVwb3J0IHN0YXR1cyBvZiB0aGUgZXN0YWJsaXNoZWQKLSAqIAkJCSAgICAgICBsaW5rLgotICogCQkJICAgICAgIFBsZWFzZSByZWFkIHRsYW4udHh0IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAKLSAqIAkJCSAgICAgLSBSZW1vdmVkIGNhbGwgdG8gY2hlY2tfcmVnaW9uKCksIGFuZCB1c2VkIAotICogCQkJICAgICAgIHJldHVybiB2YWx1ZSBvZiByZXF1ZXN0X3JlZ2lvbigpIGluc3RlYWQuCi0gKgkKLSAqCXYxLjhhIE1heSAyOCwgMjAwMCAgIC0gTWlub3IgdXBkYXRlcy4KLSAqCi0gKgl2MS45IEp1bHkgMjUsIDIwMDAgICAtIEZpeGVkIGEgZmV3IHJlbWFpbmluZyBGdWxsLUR1cGxleCBpc3N1ZXMuCi0gKgkgICAgICAgICAgICAgICAgICAgICAtIFVwZGF0ZWQgd2l0aCB0aW1lciBmaXhlcyBmcm9tIEFuZHJldyBNb3J0b24uCi0gKgkgICAgICAgICAgICAgICAgICAgICAtIEZpeGVkIG1vZHVsZSByYWNlIGluIFRMYW5fT3Blbi4KLSAqCSAgICAgICAgICAgICAgICAgICAgIC0gQWRkZWQgcm91dGluZSB0byBtb25pdG9yIFBIWSBzdGF0dXMuCi0gKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIGFjdGl2aXR5IGxlZCBzdXBwb3J0IGZvciBQcm9saWFudCBkZXZpY2VzLgotICoKLSAqCXYxLjEwIEF1ZyAzMCwgMjAwMCAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgRUlTQSBiYXNlZCB0bGFuIGNvbnRyb2xsZXJzIAotICoJCQkgICAgICAgbGlrZSB0aGUgQ29tcGFxIE5ldEZsZXgzL0UuIAotICoJCQkgICAgIC0gUmV3cm90ZSB0bGFuX3Byb2JlIHRvIGJldHRlciBoYW5kbGUgbXVsdGlwbGUKLSAqCQkJICAgICAgIGJ1cyBwcm9iZXMuIFByb2JpbmcgYW5kIGRldmljZSBzZXR1cCBpcyBub3cKLSAqCQkJICAgICAgIGRvbmUgdGhyb3VnaCBUTGFuX1Byb2JlIGFuZCBUTGFuX2luaXRfb25lLiBBY3R1YWwKLSAqCQkJICAgICAgIGhhcmR3YXJlIHByb2JlIGlzIGRvbmUgd2l0aCBrZXJuZWwgQVBJIGFuZCAKLSAqCQkJICAgICAgIFRMYW5fRWlzYVByb2JlLgotICoJCQkgICAgIC0gQWRqdXN0ZWQgZGVidWcgaW5mb3JtYXRpb24gZm9yIHByb2JpbmcuCi0gKgkJCSAgICAgLSBGaXhlZCBidWcgdGhhdCB3b3VsZCBjYXVzZSBnZW5lcmFsIGRlYnVnIGluZm9ybWF0aW9uIAotICoJCQkgICAgICAgdG8gYmUgcHJpbnRlZCBhZnRlciBkcml2ZXIgcmVtb3ZhbC4gCi0gKgkJCSAgICAgLSBBZGRlZCB0cmFuc21pdCB0aW1lb3V0IGhhbmRsaW5nLgotICoJCQkgICAgIC0gRml4ZWQgT09NIHJldHVybiB2YWx1ZXMgaW4gdGxhbl9wcm9iZS4gCi0gKgkJCSAgICAgLSBGaXhlZCBwb3NzaWJsZSBtZW0gbGVhayBpbiB0bGFuX2V4aXQgCi0gKgkJCSAgICAgICAobm93IHRsYW5fcmVtb3ZlX29uZSkuCi0gKgkJCSAgICAgLSBGaXhlZCB0aW1lciBidWcgaW4gVExhbl9waHlNb25pdG9yLgotICoJCQkgICAgIC0gVGhpcyBkcml2ZXIgdmVyc2lvbiBpcyBhbHBoYSBxdWFsaXR5LCBwbGVhc2UKLSAqCQkJICAgICAgIHNlbmQgbWUgYW55IGJ1ZyBpc3N1ZXMgeW91IG1heSBlbmNvdW50ZXIuCi0gKgotICoJdjEuMTEgQXVnIDMxLCAyMDAwICAgLSBEbyBub3QgdHJ5IHRvIHJlZ2lzdGVyIGlycSAwIGlmIG5vIGlycSBsaW5lIHdhcyAKLSAqCQkJICAgICAgIHNldCBmb3IgRUlTQSBjYXJkcy4KLSAqCQkJICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIE5ldEZsZXgzL0Ugd2l0aCBuaWJibGUtcmF0ZQotICoJCQkgICAgICAgMTBCYXNlLVQgUEhZLiBUaGlzIGlzIHVudGVzdGV0IGFzIEkgaGF2ZW4ndCBnb3QKLSAqCQkJICAgICAgIG9uZSBvZiB0aGVzZSBjYXJkcy4KLSAqCQkJICAgICAtIEZpeGVkIHRpbWVyIGJlaW5nIGFkZGVkIHR3aWNlLgotICoJCQkgICAgIC0gRGlzYWJsZWQgUGh5TW9uaXRvcmluZyBieSBkZWZhdWx0IGFzIHRoaXMgaXMKLSAqCQkJICAgICAgIHdvcmsgaW4gcHJvZ3Jlc3MuIERlZmluZSBNT05JVE9SIHRvIGVuYWJsZSBpdC4KLSAqCQkJICAgICAtIE5vdyB3ZSBkb24ndCBkaXNwbGF5IGxpbmsgaW5mbyB3aXRoIFBIWXMgdGhhdAotICoJCQkgICAgICAgZG9lc24ndCBzdXBwb3J0IGl0IChsZXZlbDEpLgotICoJCQkgICAgIC0gSW5jcmVzZWQgdHhfdGltZW91dCBiZWFjdXNlIG9mIGF1dG8tbmVnLgotICoJCQkgICAgIC0gQWRqdXN0ZWQgdGltZXJzIGZvciBmb3JjZWQgc3BlZWRzLgotICoKLSAqCXYxLjEyIE9jdCAxMiwgMjAwMCAgIC0gTWlub3IgZml4ZXMgKG1lbWxlYWssIGluaXQsIGV0Yy4pCi0gKgotICogCXYxLjEzIE5vdiAyOCwgMjAwMCAgIC0gU3RvcCBmbG9vZGluZyBjb25zb2xlIHdpdGggYXV0by1uZWcgaXNzdWVzCi0gKiAJCQkgICAgICAgd2hlbiBsaW5rIGNhbid0IGJlIGVzdGFibGlzaGVkLgotICoJCQkgICAgIC0gQWRkZWQgdGhlIGJidWYgb3B0aW9uIGFzIGEga2VybmVsIHBhcmFtZXRlci4KLSAqCQkJICAgICAtIEZpeGVkIGlvYWRkciBwcm9iZSBidWcuCi0gKgkJCSAgICAgLSBGaXhlZCBzdHVwaWQgZGVhZGxvY2sgd2l0aCBNSUkgaW50ZXJydXB0cy4KLSAqCQkJICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWVkL2R1cGxleCBzZWxlY3Rpb24gd2l0aCAKLSAqCQkJICAgICAgIG11bHRpcGxlIG5pY3MuCi0gKgkJCSAgICAgLSBBZGRlZCBwYXJ0bHkgZml4IGZvciBUWCBDaGFubmVsIGxvY2t1cCB3aXRoCi0gKgkJCSAgICAgICBUTEFOIHYxLjAgc2lsaWNvbi4gVGhpcyBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQKLSAqCQkJICAgICAgIGZ1cnRoZXIuCi0gKgotICogCXYxLjE0IERlYyAxNiwgMjAwMCAgIC0gQWRkZWQgc3VwcG9ydCBmb3Igc2VydmljaW5nIG11bHRpcGxlIGZyYW1lcyBwZXIuCi0gKiAJCQkgICAgICAgaW50ZXJydXB0LiBUaGFua3MgZ29lcyB0bwotICogCQkJICAgICAgIEFkYW0gS2V5cyA8YWRhbUB0aS5jb20+Ci0gKiAJCQkgICAgICAgRGVuaXMgQmVhdWRvaW4gPGRiZWF1ZG9pbkB0aS5jb20+Ci0gKiAJCQkgICAgICAgZm9yIHByb3ZpZGluZyB0aGUgcGF0Y2guCi0gKiAJCQkgICAgIC0gRml4ZWQgYXV0by1uZWcgb3V0cHV0IHdoZW4gdXNpbmcgbXVsdGlwbGUKLSAqIAkJCSAgICAgICBhZGFwdGVycy4KLSAqIAkJCSAgICAgLSBDb252ZXJ0ZWQgdG8gdXNlIG5ldyB0YXNrcSBpbnRlcmZhY2UuCi0gKgotICogCXYxLjE0YSBKYW4gNiwgMjAwMSAgIC0gTWlub3IgYWRqdXN0bWVudHMgKHNwaW5sb2NrcywgZXRjLikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgInRsYW4uaCIKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9taWkuaD4KLQotdHlwZWRlZiB1MzIgKFRMYW5JbnRWZWN0b3JGdW5jKSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci0KLS8qIEZvciByZW1vdmluZyBFSVNBIGRldmljZXMgKi8KLXN0YXRpYwlzdHJ1Y3QgbmV0X2RldmljZQkqVExhbl9FaXNhX0RldmljZXM7Ci0KLXN0YXRpYwlpbnQJCVRMYW5EZXZpY2VzSW5zdGFsbGVkOwotCi0vKiBTZXQgc3BlZWQsIGR1cGxleCBhbmQgYXVpIHNldHRpbmdzICovCi1zdGF0aWMgIGludCBhdWlbTUFYX1RMQU5fQk9BUkRTXTsKLXN0YXRpYyAgaW50IGR1cGxleFtNQVhfVExBTl9CT0FSRFNdOwotc3RhdGljICBpbnQgc3BlZWRbTUFYX1RMQU5fQk9BUkRTXTsKLXN0YXRpYyAgaW50IGJvYXJkc19mb3VuZDsKLQotTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogVG9yYmVuIE1hdGhpYXNlbiA8dG9yYmVuLm1hdGhpYXNlbkBjb21wYXEuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFRJIFRodW5kZXJMQU4gYmFzZWQgZXRoZXJuZXQgUENJIGFkYXB0ZXJzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLU1PRFVMRV9QQVJNKGF1aSwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1RMQU5fQk9BUkRTKSAiaSIpOwotTU9EVUxFX1BBUk0oZHVwbGV4LCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfVExBTl9CT0FSRFMpICJpIik7Ci1NT0RVTEVfUEFSTShzcGVlZCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1RMQU5fQk9BUkRTKSAiaSIpOwotTU9EVUxFX1BBUk0oZGVidWcsICJpIik7Ci1NT0RVTEVfUEFSTShiYnVmLCAiaSIpOwotTU9EVUxFX1BBUk1fREVTQyhhdWksICJUaHVuZGVyTEFOIHVzZSBBVUkgcG9ydChzKSAoMC0xKSIpOwotTU9EVUxFX1BBUk1fREVTQyhkdXBsZXgsICJUaHVuZGVyTEFOIGR1cGxleCBzZXR0aW5nKHMpICgwLWRlZmF1bHQsIDEtaGFsZiwgMi1mdWxsKSIpOwotTU9EVUxFX1BBUk1fREVTQyhzcGVlZCwgIlRodW5kZXJMQU4gcG9ydCBzcGVlbiBzZXR0aW5nKHMpICgwLDEwLDEwMCkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUaHVuZGVyTEFOIGRlYnVnIG1hc2siKTsKLU1PRFVMRV9QQVJNX0RFU0MoYmJ1ZiwgIlRodW5kZXJMQU4gdXNlIGJpZyBidWZmZXIgKDAtMSkiKTsKLUVYUE9SVF9OT19TWU1CT0xTOwotCi0vKiBEZWZpbmUgdGhpcyB0byBlbmFibGUgTGluayBiZWF0IG1vbml0b3JpbmcgKi8KLSN1bmRlZiBNT05JVE9SCi0KLS8qIFR1cm4gb24gZGVidWdnaW5nLiBTZWUgbGludXgvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RsYW4udHh0IGZvciBkZXRhaWxzICovCi1zdGF0aWMgIGludAkJZGVidWc7Ci0KLXN0YXRpYwlpbnQJCWJidWY7Ci1zdGF0aWMJdTgJCSpUTGFuUGFkQnVmZmVyOwotc3RhdGljCWNoYXIJCVRMYW5TaWduYXR1cmVbXSA9ICJUTEFOIjsKLXN0YXRpYyBjb25zdCBjaGFyIHRsYW5fYmFubmVyW10gPSAiVGh1bmRlckxBTiBkcml2ZXIgdjEuMTRhXG4iOwotc3RhdGljIGludCB0bGFuX2hhdmVfcGNpOwotc3RhdGljIGludCB0bGFuX2hhdmVfZWlzYTsKLQotY29uc3QgY2hhciAqbWVkaWFbXSA9IHsKLQkiMTBCYXNlVC1IRCAiLCAiMTBCYXNlVC1GRCAiLCIxMDBiYXNlVHgtSEQgIiwgCi0JIjEwMGJhc2VUeC1GRCIsICIxMDBiYXNlVDQiLCAwCi19OwotCi1pbnQgbWVkaWFfbWFwW10gPSB7IDB4MDAyMCwgMHgwMDQwLCAweDAwODAsIDB4MDEwMCwgMHgwMjAwLH07Ci0KLXN0YXRpYyBzdHJ1Y3QgYm9hcmQgewotCWNvbnN0IGNoYXIJKmRldmljZUxhYmVsOwotCXUzMgkgICAJZmxhZ3M7Ci0JdTE2CSAgIAlhZGRyT2ZzOwotfSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVCBQQ0kgVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAotCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggUENJIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKLQl7ICJDb21wYXEgSW50ZWdyYXRlZCBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldEZsZXgtMy9QIiwgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgfCBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZLCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldEZsZXgtMy9QIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgSW50ZWdyYXRlZCAxMC8xMDAgVFggVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAotCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCBEdWFsIDEwLzEwMCBUWCBQQ0kgVVRQIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIEVtYmVkZGVkIFVUUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCi0JeyAiT2xpY29tIE9DLTIxODMvMjE4NSIsIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweDgzIH0sCi0JeyAiT2xpY29tIE9DLTIzMjUiLCBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSwgMHhGOCB9LAotCXsgIk9saWNvbSBPQy0yMzI2IiwgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAsIDB4RjggfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVC8yIFBDSSBVVFAvQ29heCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldEZsZXgtMy9FIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCB8IAkvKiBFSVNBIGNhcmQgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8IFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODMgfSwJCi0JeyAiQ29tcGFxIE5ldEZsZXgtMy9FIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LCAvKiBFSVNBIGNhcmQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0bGFuX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0gewotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEZMRVgzSSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RIVU5ERVIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0IsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDQgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMFBJLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1IH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBELAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2IH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBJLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3IH0sCi0JeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA4IH0sCi0JeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA5IH0sCi0JeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMCB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTIgfSwKLQl7IDAsfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bGFuX3BjaV90YmwpOwkJCi0KLXN0YXRpYyB2b2lkCVRMYW5fRWlzYVByb2JlKCB2b2lkICk7Ci1zdGF0aWMgdm9pZAlUTGFuX0Vpc2FfQ2xlYW51cCggdm9pZCApOwotc3RhdGljIGludCAgICAgIFRMYW5fSW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIGludAlUTGFuX09wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKLXN0YXRpYyBpbnQJVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyB2b2lkCVRMYW5fSGFuZGxlSW50ZXJydXB0KCBpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1zdGF0aWMgaW50CVRMYW5fQ2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIHN0cnVjdAluZXRfZGV2aWNlX3N0YXRzICpUTGFuX0dldFN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyB2b2lkCVRMYW5fU2V0TXVsdGljYXN0TGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50CVRMYW5faW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwotc3RhdGljIGludCAgICAgIFRMYW5fcHJvYmUxKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgbG9uZyBpb2FkZHIsIGludCBpcnEsIGludCByZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIHZvaWQJVExhbl90eF90aW1lb3V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgCXRsYW5faW5pdF9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLQotc3RhdGljIHUzMglUTGFuX0hhbmRsZUludmFsaWQoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9GKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3coIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotc3RhdGljIHUzMglUTGFuX0hhbmRsZVJ4RU9GKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVEdW1teSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci1zdGF0aWMgdTMyCVRMYW5fSGFuZGxlVHhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotc3RhdGljIHUzMglUTGFuX0hhbmRsZVN0YXR1c0NoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci0KLXN0YXRpYyB2b2lkCVRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgKTsKLQotc3RhdGljIHZvaWQJVExhbl9SZXNldExpc3RzKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX0ZyZWVMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QcmludERpbyggdTE2ICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1ByaW50TGlzdCggVExhbkxpc3QgKiwgY2hhciAqLCBpbnQgKTsKLXN0YXRpYyB2b2lkCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCApOwotc3RhdGljIHZvaWQJVExhbl9SZXNldEFkYXB0ZXIoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fRmluaXNoUmVzZXQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fU2V0TWFjKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgYXJlZywgY2hhciAqbWFjICk7Ci0KLXN0YXRpYyB2b2lkCVRMYW5fUGh5UHJpbnQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fUGh5RGV0ZWN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1BoeVBvd2VyRG93biggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlclVwKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1BoeVJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1BoeVN0YXJ0TGluayggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QaHlGaW5pc2hBdXRvTmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci0jaWZkZWYgTU9OSVRPUgotc3RhdGljIHZvaWQgICAgIFRMYW5fUGh5TW9uaXRvciggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotI2VuZGlmCi0KLS8qCi1zdGF0aWMgaW50CVRMYW5fUGh5Tm9wKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgaW50CVRMYW5fUGh5SW50ZXJuYWxDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsU2VydmljZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIGludAlUTGFuX1BoeURwODM4NDBhQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLSovCi0KLXN0YXRpYyBpbnQJVExhbl9NaWlSZWFkUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fTWlpU2VuZERhdGEoIHUxNiwgdTMyLCB1bnNpZ25lZCApOwotc3RhdGljIHZvaWQJVExhbl9NaWlTeW5jKCB1MTYgKTsKLXN0YXRpYyB2b2lkCVRMYW5fTWlpV3JpdGVSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiwgdTE2LCB1MTYgKTsKLQotc3RhdGljIHZvaWQJVExhbl9FZVNlbmRTdGFydCggdTE2ICk7Ci1zdGF0aWMgaW50CVRMYW5fRWVTZW5kQnl0ZSggdTE2LCB1OCwgaW50ICk7Ci1zdGF0aWMgdm9pZAlUTGFuX0VlUmVjZWl2ZUJ5dGUoIHUxNiwgdTggKiwgaW50ICk7Ci1zdGF0aWMgaW50CVRMYW5fRWVSZWFkQnl0ZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTgsIHU4ICogKTsKLQotc3RhdGljIFRMYW5JbnRWZWN0b3JGdW5jICpUTGFuSW50VmVjdG9yW1RMQU5fSU5UX05VTUJFUl9PRl9JTlRTXSA9IHsKLQlUTGFuX0hhbmRsZUludmFsaWQsCi0JVExhbl9IYW5kbGVUeEVPRiwKLQlUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdywKLQlUTGFuX0hhbmRsZVJ4RU9GLAotCVRMYW5fSGFuZGxlRHVtbXksCi0JVExhbl9IYW5kbGVUeEVPQywKLQlUTGFuX0hhbmRsZVN0YXR1c0NoZWNrLAotCVRMYW5fSGFuZGxlUnhFT0MKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotVExhbl9TZXRUaW1lciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRpY2tzLCB1MzIgdHlwZSApCi17Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCQotCWlmICghaW5faXJxKCkpCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiAhPSBOVUxMICYmCi0JCXByaXYtPnRpbWVyVHlwZSAhPSBUTEFOX1RJTUVSX0FDVElWSVRZICkgeyAKLQkJaWYgKCFpbl9pcnEoKSkKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlwcml2LT50aW1lci5mdW5jdGlvbiA9ICZUTGFuX1RpbWVyOwotCWlmICghaW5faXJxKCkpCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwotCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOwotCXByaXYtPnRpbWVyVHlwZSA9IHR5cGU7Ci0JbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyArIHRpY2tzKTsKLQkKLX0gLyogVExhbl9TZXRUaW1lciAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JVGh1bmRlckxBTiBEcml2ZXIgUHJpbWFyeSBGdW5jdGlvbnMKLQotCVRoZXNlIGZ1bmN0aW9ucyBhcmUgbW9yZSBvciBsZXNzIGNvbW1vbiB0byBhbGwgTGludXggbmV0d29yayBkcml2ZXJzLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCXRsYW5fcmVtb3ZlX29uZQotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlOb25lCi0JICoKLQkgKglHb2VzIHRocm91Z2ggdGhlIFRMYW5EZXZpY2VzIGxpc3QgYW5kIGZyZWVzIHRoZSBkZXZpY2UKLQkgKglzdHJ1Y3RzIGFuZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZGV2aWNlIChsaXN0cwotCSAqCWFuZCBidWZmZXJzKS4gIEl0IGFsc28gdXJlc2VydmVzIHRoZSBJTyBwb3J0IHJlZ2lvbnMKLQkgKglhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0bGFuX3JlbW92ZV9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JCi0JdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOwotCi0JaWYgKCBwcml2LT5kbWFTdG9yYWdlICkgewotCQlrZnJlZSggcHJpdi0+ZG1hU3RvcmFnZSApOwotCX0KLQotCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgMHgxMCApOwotCQotCWtmcmVlKCBkZXYgKTsKLQkJCi0JcGNpX3NldF9kcnZkYXRhKCBwZGV2LCBOVUxMICk7Ci19IAotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGxhbl9kcml2ZXIgPSB7Ci0JbmFtZToJCSJ0bGFuIiwKLQlpZF90YWJsZToJdGxhbl9wY2lfdGJsLAotCXByb2JlOgkJdGxhbl9pbml0X29uZSwKLQlyZW1vdmU6CQl0bGFuX3JlbW92ZV9vbmUsCQotfTsKLQotc3RhdGljIGludCBfX2luaXQgdGxhbl9wcm9iZSh2b2lkKQotewotCXN0YXRpYyBpbnQJcGFkX2FsbG9jYXRlZDsKLQkKLQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHRsYW5fYmFubmVyKTsKLQkKLQlUTGFuUGFkQnVmZmVyID0gKHU4ICopIGttYWxsb2MoVExBTl9NSU5fRlJBTUVfU0laRSwgCi0JCQkJCUdGUF9LRVJORUwpOwotCi0JaWYgKFRMYW5QYWRCdWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhZCBidWZmZXIuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtc2V0KFRMYW5QYWRCdWZmZXIsIDAsIFRMQU5fTUlOX0ZSQU1FX1NJWkUpOwotCXBhZF9hbGxvY2F0ZWQgPSAxOwotCi0JVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIFBDSSBQcm9iZS4uLi5cbiIpOwotCQotCS8qIFVzZSBuZXcgc3R5bGUgUENJIHByb2JpbmcuIE5vdyB0aGUga2VybmVsIHdpbGwKLQkgICBkbyBtb3N0IG9mIHRoaXMgZm9yIHVzICovCi0JcGNpX3JlZ2lzdGVyX2RyaXZlcigmdGxhbl9kcml2ZXIpOwotCi0JVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIEVJU0EgUHJvYmUuLi4uXG4iKTsKLQlUTGFuX0Vpc2FQcm9iZSgpOwotCQkKLQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiAlZCBkZXZpY2UlcyBpbnN0YWxsZWQsIFBDSTogJWQgIEVJU0E6ICVkXG4iLCAKLQkJIFRMYW5EZXZpY2VzSW5zdGFsbGVkLCBUTGFuRGV2aWNlc0luc3RhbGxlZCA9PSAxID8gIiIgOiAicyIsCi0JCSB0bGFuX2hhdmVfcGNpLCB0bGFuX2hhdmVfZWlzYSk7Ci0KLQlpZiAoVExhbkRldmljZXNJbnN0YWxsZWQgPT0gMCkgewotCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKLQkJa2ZyZWUoVExhblBhZEJ1ZmZlcik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKLX0KLQkKLQotc3RhdGljIGludCBfX2RldmluaXQgdGxhbl9pbml0X29uZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JcmV0dXJuIFRMYW5fcHJvYmUxKCBwZGV2LCAtMSwgLTEsIDAsIGVudCk7Ci19Ci0KLS8qCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJdGxhbl9wcm9iZTEKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgotCSAqCVBhcm1zOiAKLQkgKgkJbm9uZQotCSAqCi0JICoJVGhlIG5hbWUgaXMgbG93ZXIgY2FzZSB0byBmaXQgaW4gd2l0aCBhbGwgdGhlIHJlc3Qgb2YKLQkgKgl0aGUgbmV0Y2FyZF9wcm9iZSBuYW1lcy4gIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIAotCSAqCWFub3RoZXIgVExhbiBiYXNlZCBhZGFwdGVyLCBzZXR0aW5nIGl0IHVwIHdpdGggdGhlCi0JICoJYWxsb2NhdGVkIGRldmljZSBzdHJ1Y3QgaWYgb25lIGlzIGZvdW5kLgotCSAqCXRsYW5fcHJvYmUgaGFzIGJlZW4gcG9ydGVkIHRvIHRoZSBuZXcgbmV0IEFQSSBhbmQKLQkgKglub3cgYWxsb2NhdGVzIGl0cyBvd24gZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbgotCSAqCWlzIGFsc28gdXNlZCBieSBtb2R1bGVzLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBUTGFuX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgCi0JCQkJbG9uZyBpb2FkZHIsIGludCBpcnEsIGludCByZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKQotewotCi0Jc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7Ci0JVExhblByaXZhdGVJbmZvICAgICpwcml2OwotCXU4CQkgICBwY2lfcmV2OwotCXUxNgkJICAgZGV2aWNlX2lkOwotCWludAkJICAgcmVnOwotCi0JaWYgKHBkZXYgJiYgcGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JCXJldHVybiAtRUlPOwotCi0JZGV2ID0gaW5pdF9ldGhlcmRldihOVUxMLCBzaXplb2YoVExhblByaXZhdGVJbmZvKSk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0JCi0JcHJpdiA9IGRldi0+cHJpdjsKLQotCS8qIElzIHRoaXMgYSBQQ0kgZGV2aWNlPyAqLwotCWlmIChwZGV2KSB7Ci0JCXUzMiAJCSAgIHBjaV9pb19iYXNlID0gMDsKLQotCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bZW50LT5kcml2ZXJfZGF0YV07Ci0KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKCBwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZwY2lfcmV2KTsKLQotCQlmb3IgKCByZWc9IDA7IHJlZyA8PSA1OyByZWcgKysgKSB7Ci0JCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIHJlZykgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCQkJcGNpX2lvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmVnKTsKLQkJCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiSU8gbWFwcGluZyBpcyBhdmFpbGFibGUgYXQgJXguXG4iLAotCQkJCQkJcGNpX2lvX2Jhc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghcGNpX2lvX2Jhc2UpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogTm8gSU8gbWFwcGluZ3MgYXZhaWxhYmxlXG4iKTsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JCQlrZnJlZShkZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJCi0JCWRldi0+YmFzZV9hZGRyID0gcGNpX2lvX2Jhc2U7Ci0JCWRldi0+aXJxID0gcGRldi0+aXJxOwotCQlwcml2LT5hZGFwdGVyUmV2ID0gcGNpX3JldjsgCi0JCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQotCX0gZWxzZQl7ICAgICAvKiBFSVNBIGNhcmQgKi8KLQkJLyogVGhpcyBpcyBhIGhhY2suIFdlIG5lZWQgdG8ga25vdyB3aGljaCBib2FyZCBzdHJ1Y3R1cmUKLQkJICogaXMgc3VpdGVkIGZvciB0aGlzIGFkYXB0ZXIgKi8KLQkJZGV2aWNlX2lkID0gaW53KGlvYWRkciArIEVJU0FfSUQyKTsKLQkJcHJpdi0+aXNfZWlzYSA9IDE7Ci0JCWlmIChkZXZpY2VfaWQgPT0gMHgyMEYxKSB7Ci0JCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bMTNdOyAJLyogTmV0RmxleC0zL0UgKi8KLQkJCXByaXYtPmFkYXB0ZXJSZXYgPSAyMzsJCQkvKiBUTEFOIDIuMyAqLwotCQl9IGVsc2UgewotCQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvWzE0XTsKLQkJCXByaXYtPmFkYXB0ZXJSZXYgPSAxMDsJCQkvKiBUTEFOIDEuMCAqLwotCQl9Ci0JCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOwotCQlkZXYtPmlycSA9IGlycTsKLQl9Ci0KLQkvKiBLZXJuZWwgcGFyYW1ldGVycyAqLwotCWlmIChkZXYtPm1lbV9zdGFydCkgewotCQlwcml2LT5hdWkgICAgPSBkZXYtPm1lbV9zdGFydCAmIDB4MDE7Ci0JCXByaXYtPmR1cGxleCA9ICgoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA9PSAweDA2KSA/IDAgOiAoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA+PiAxOwotCQlwcml2LT5zcGVlZCAgPSAoKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPT0gMHgxOCkgPyAwIDogKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPj4gMzsKLQkKLQkJaWYgKHByaXYtPnNwZWVkID09IDB4MSkgewotCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwOwotCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IDB4MikgewotCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwMDsKLQkJfQotCQlkZWJ1ZyA9IHByaXYtPmRlYnVnID0gZGV2LT5tZW1fZW5kOwotCX0gZWxzZSB7Ci0JCXByaXYtPmF1aSAgICA9IGF1aVtib2FyZHNfZm91bmRdOwotCQlwcml2LT5zcGVlZCAgPSBzcGVlZFtib2FyZHNfZm91bmRdOwotCQlwcml2LT5kdXBsZXggPSBkdXBsZXhbYm9hcmRzX2ZvdW5kXTsKLQkJcHJpdi0+ZGVidWcgPSBkZWJ1ZzsKLQl9Ci0JCi0JLyogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBnZXQgYW4gYWRhcHRlciBlcnJvciBmcm9tCi0JICogd2l0aGluIG91ciBpcnEgaGFuZGxlciAqLwotCUlOSVRfTElTVF9IRUFEKCZwcml2LT50bGFuX3RxdWV1ZS5saXN0KTsKLQlwcml2LT50bGFuX3RxdWV1ZS5zeW5jID0gMDsKLQlwcml2LT50bGFuX3RxdWV1ZS5yb3V0aW5lID0gKHZvaWQgKikodm9pZCopVExhbl90eF90aW1lb3V0OwotCXByaXYtPnRsYW5fdHF1ZXVlLmRhdGEgPSBkZXY7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7Ci0JCi0JaWYgKFRMYW5fSW5pdChkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOwotCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQlrZnJlZShkZXYpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9IGVsc2UgewotCQotCVRMYW5EZXZpY2VzSW5zdGFsbGVkKys7Ci0JYm9hcmRzX2ZvdW5kKys7Ci0JCi0JLyogcGRldiBpcyBOVUxMIGlmIHRoaXMgaXMgYW4gRUlTQSBkZXZpY2UgKi8KLQlpZiAocGRldikKLQkJdGxhbl9oYXZlX3BjaSsrOwotCWVsc2UgewotCQlwcml2LT5uZXh0RGV2aWNlID0gVExhbl9FaXNhX0RldmljZXM7Ci0JCVRMYW5fRWlzYV9EZXZpY2VzID0gZGV2OwotCQl0bGFuX2hhdmVfZWlzYSsrOwotCX0KLQkKLQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiAlcyBpcnE9JTJkLCBpbz0lMDR4LCAlcywgUmV2LiAlZFxuIiwKLQkJCWRldi0+bmFtZSwKLQkJCShpbnQpIGRldi0+aXJxLAotCQkJKGludCkgZGV2LT5iYXNlX2FkZHIsCi0JCQlwcml2LT5hZGFwdGVyLT5kZXZpY2VMYWJlbCwKLQkJCXByaXYtPmFkYXB0ZXJSZXYpOwotCXJldHVybiAwOwotCX0KLQotfQorfQkvKiBUTGFuX0ZpbmlzaFJlc2V0ICovCiAKLXN0YXRpYyB2b2lkIFRMYW5fRWlzYV9DbGVhbnVwKHZvaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXY7Ci0JCi0Jd2hpbGUoIHRsYW5faGF2ZV9laXNhICkgewotCQlkZXYgPSBUTGFuX0Vpc2FfRGV2aWNlczsKLQkJcHJpdiA9IGRldi0+cHJpdjsKLQkJaWYgKHByaXYtPmRtYVN0b3JhZ2UpIHsKLQkJCWtmcmVlKHByaXYtPmRtYVN0b3JhZ2UpOwotCQl9Ci0JCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgMHgxMCk7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKLQkJVExhbl9FaXNhX0RldmljZXMgPSBwcml2LT5uZXh0RGV2aWNlOwotCQlrZnJlZSggZGV2ICk7Ci0JCXRsYW5faGF2ZV9laXNhLS07Ci0JfQotfQotCQotCQkKLXN0YXRpYyB2b2lkIF9fZXhpdCB0bGFuX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKLQotCWlmICh0bGFuX2hhdmVfZWlzYSkKLQkJVExhbl9FaXNhX0NsZWFudXAoKTsKLQotCWtmcmVlKCBUTGFuUGFkQnVmZmVyICk7Ci0KLX0KLQotLyogTW9kdWxlIGxvYWRpbmcvdW5sb2FkaW5nICovCi1tb2R1bGVfaW5pdCh0bGFuX3Byb2JlKTsKLW1vZHVsZV9leGl0KHRsYW5fZXhpdCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAJVExhbl9FaXNhUHJvYmUKLQkgKgotCSAqICAJUmV0dXJuczogMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQotCSAqCi0JICogIAlQYXJtczoJIE5vbmUKLQkgKgotCSAqCi0JICogIAlUaGlzIGZ1bmN0aW9ucyBwcm9iZXMgZm9yIEVJU0EgZGV2aWNlcyBhbmQgY2FsbHMgCi0JICogIAlUTGFuX3Byb2JlMSB3aGVuIG9uZSBpcyBmb3VuZC4gCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgIF9faW5pdCBUTGFuX0Vpc2FQcm9iZSAodm9pZCkgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHRsYW5fcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKLQlsb25nIAlpb2FkZHI7Ci0JaW50IAlyYyA9IC1FTk9ERVY7Ci0JaW50IAlpcnE7Ci0JdTE2CWRldmljZV9pZDsKLQotCWlmICghRUlTQV9idXMpIHsJCi0JCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJObyBFSVNBIGJ1cyBwcmVzZW50XG4iKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvKiBMb29wIHRocm91Z2ggYWxsIHNsb3RzIG9mIHRoZSBFSVNBIGJ1cyAqLwotCWZvciAoaW9hZGRyID0gMHgxMDAwOyBpb2FkZHIgPCAweDkwMDA7IGlvYWRkciArPSAweDEwMDApIHsKLQkJCi0JVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwiRUlTQV9JRCAweCU0eDogMHglNHhcbiIsIChpbnQpIGlvYWRkciArIDB4QzgwLCBpbncoaW9hZGRyICsgRUlTQV9JRCkpOwkKLQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCJFSVNBX0lEIDB4JTR4OiAweCU0eFxuIiwgKGludCkgaW9hZGRyICsgMHhDODIsIGludyhpb2FkZHIgKyBFSVNBX0lEMikpOworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisJdTMyIGZyYW1lc2l6ZTsKKwl1MzIgaG9zdF9jbWQgPSAwOworCXUzMiBhY2sgPSAxOworCWludCBlb2MgPSAwOworCWludCBlbnRyeSA9IHByaXYtPmN1cl9yeCAlIFRMQU5fTlVNX1JYX0xJU1RTOworCXUxNiB0bXBDU3RhdCA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLmNTdGF0KTsKKwl1MTYgaG9zdF9pbnQgPSBpbncoQkFTRSArIFRMQU5fSE9TVF9JTlQpOwogCi0JCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJQcm9iaW5nIGZvciBFSVNBIGFkYXB0ZXIgYXQgSU86IDB4JTR4IDogIiwKLQkJCQkgICAJKGludCkgaW9hZGRyKTsKLQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgMHgxMCwgVExhblNpZ25hdHVyZSkgPT0gTlVMTCkgCi0JCQlnb3RvIG91dDsKLQotCQlpZiAoaW53KGlvYWRkciArIEVJU0FfSUQpICE9IDB4MTEwRSkgewkJCi0JCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIDB4MTApOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJCi0JCWRldmljZV9pZCA9IGludyhpb2FkZHIgKyBFSVNBX0lEMik7Ci0JCWlmIChkZXZpY2VfaWQgIT0gIDB4MjBGMSAmJiBkZXZpY2VfaWQgIT0gMHg0MEYxKSB7IAkJCi0JCQlyZWxlYXNlX3JlZ2lvbiAoaW9hZGRyLCAweDEwKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCQotCSAJaWYgKGluYihpb2FkZHIgKyBFSVNBX0NSKSAhPSAweDEpIHsgCS8qIENoZWNrIGlmIGFkYXB0ZXIgaXMgZW5hYmxlZCAqLwotCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7Ci0JCQlnb3RvIG91dDI7Ci0JCX0KLQkJCi0JCWlmIChkZWJ1ZyA9PSAweDEwKQkJCi0JCQlwcmludGsoIkZvdW5kIG9uZVxuIik7CisJaWYgKCh0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgIXJldHJpZXZlKQorCSAgcmV0dXJuIDE7CiAKLQkJLyogR2V0IGlycSBmcm9tIGJvYXJkICovCi0JCXN3aXRjaCAoaW5iKGlvYWRkciArIDB4Q0MwKSkgewotCQkJY2FzZSgweDEwKToKLQkJCQlpcnE9NTsKLQkJCQlicmVhazsKLQkJCWNhc2UoMHgyMCk6Ci0JCQkJaXJxPTk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKDB4NDApOgotCQkJCWlycT0xMDsKLQkJCQlicmVhazsKLQkJCWNhc2UoMHg4MCk6Ci0JCQkJaXJxPTExOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIG91dDsKLQkJfSAgICAgICAgICAgICAgIAotCQkKLQkJCi0JCS8qIFNldHVwIHRoZSBuZXdseSBmb3VuZCBlaXNhIGFkYXB0ZXIgKi8KLQkJcmMgPSBUTGFuX3Byb2JlMSggTlVMTCwgaW9hZGRyLCBpcnEsCi0JCQkJCTEyLCBOVUxMKTsKLQkJY29udGludWU7Ci0JCQotCQlvdXQ6Ci0JCQlpZiAoZGVidWcgPT0gMHgxMCkKLQkJCQlwcmludGsoIk5vbmUgZm91bmRcbiIpOwotCQkJY29udGludWU7Ci0KLQkJb3V0MjoJaWYgKGRlYnVnID09IDB4MTApCi0JCQkJcHJpbnRrKCJDYXJkIGZvdW5kIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCwgc2tpcHBpbmdcbiIpOwotCQkJY29udGludWU7Ci0JCQotCX0KKwlvdXR3KGhvc3RfaW50LCBCQVNFICsgVExBTl9IT1NUX0lOVCk7CiAKLX0gLyogVExhbl9FaXNhUHJvYmUgKi8KKwlpZiAoISh0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkpCisJCXJldHVybiAwOwogCi0JCisJLyogcHJpbnRmKCJQSS0xOiAweCVoWFxuIiwgaG9zdF9pbnQpOyAqLworCWlmICh0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRU9DKQorCQllb2MgPSAxOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSW5pdAotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLQkgKglQYXJtczoKLQkgKgkJZGV2CVRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRldmljZSB0byBiZQotCSAqCQkJaW5pdCdlZC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKglkZXZpY2Ugc3RydWN0dXJlIGFuZCBkcml2ZXIuICBJdCByZXNlcnZlcyB0aGUgSU8KLQkgKglhZGRyZXNzZXMsIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBsaXN0cyBhbmQgYm91bmNlCi0JICoJYnVmZmVycywgcmV0cmlldmVzIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20KLQkgKglhbmQgYXNzaWduZXMgdGhlIGRldmljZSdzIG1ldGhvZHMuCi0JICoJCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWZyYW1lc2l6ZSA9IHJ4X3JpbmdbZW50cnldLmZyYW1lU2l6ZTsKIAotc3RhdGljIGludCBUTGFuX0luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCWludAkJZG1hX3NpemU7Ci0JaW50IAkJZXJyOwotCWludAkJaTsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXY7CisJbmljLT5wYWNrZXRsZW4gPSBmcmFtZXNpemU7CiAKLQlwcml2ID0gZGV2LT5wcml2OwotCQotCWlmICghcHJpdi0+aXNfZWlzYSkJLyogRUlTQSBkZXZpY2VzIGhhdmUgYWxyZWFkeSByZXF1ZXN0ZWQgSU8gKi8KLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTAsIFRMYW5TaWduYXR1cmUgKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAlczogSU8gcG9ydCByZWdpb24gMHglbHggc2l6ZSAweCV4IGluIHVzZS5cbiIsCi0JCQkJZGV2LT5uYW1lLAotCQkJCWRldi0+YmFzZV9hZGRyLAotCQkJCTB4MTAgKTsKLQkJCXJldHVybiAtRUlPOworI2lmZGVmIEVCREVCVUcKKyAgICAgcHJpbnRmKCIuJWQuIiwgZnJhbWVzaXplKTsgCisjZW5kaWYKKyAgICAgCisJbWVtY3B5KG5pYy0+cGFja2V0LCByeGIgKworCSAgICAgICAocHJpdi0+Y3VyX3J4ICogVExBTl9NQVhfRlJBTUVfU0laRSksIG5pYy0+cGFja2V0bGVuKTsKKworCXJ4X3JpbmdbZW50cnldLmNTdGF0ID0gMDsKKyNpZmRlZiBFQkRFQlVHCisJLy9oZXhfZHVtcChuaWMtPnBhY2tldCwgbmljLT5wYWNrZXRsZW4pOworCXByaW50ZigiJWQiLCBlbnRyeSk7ICAKKyNlbmRpZgorCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBUTEFOX05VTV9SWF9MSVNUUzsKKwlwcml2LT5jdXJfcnggPSBlbnRyeTsKKwlpZiAoZW9jKSB7CisJCWlmICgocnhfcmluZ1tlbnRyeV0uY1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZKSA9PQorCQkgICAgVExBTl9DU1RBVF9SRUFEWSkgeworCQkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOworCQkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8IDB4MDAxQzAwMDA7CisJCQlvdXRsKGhvc3RfY21kLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAJCX0KLQkKLQlpZiAoIGJidWYgKSB7Ci0JCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKLQkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICsgVExBTl9NQVhfRlJBTUVfU0laRSApOwogCX0gZWxzZSB7Ci0JCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKLQkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICk7Ci0JfQotCXByaXYtPmRtYVN0b3JhZ2UgPSBrbWFsbG9jKGRtYV9zaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCBwcml2LT5kbWFTdG9yYWdlID09IE5VTEwgKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVExBTjogIENvdWxkIG5vdCBhbGxvY2F0ZSBsaXN0cyBhbmQgYnVmZmVycyBmb3IgJXMuXG4iLAotCQkJZGV2LT5uYW1lICk7Ci0JCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgMHgxMCApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtc2V0KCBwcml2LT5kbWFTdG9yYWdlLCAwLCBkbWFfc2l6ZSApOwotCXByaXYtPnJ4TGlzdCA9IChUTGFuTGlzdCAqKSAKLQkJICAgICAgICggKCAoICh1MzIpIHByaXYtPmRtYVN0b3JhZ2UgKSArIDcgKSAmIDB4RkZGRkZGRjggKTsKLQlwcml2LT50eExpc3QgPSBwcml2LT5yeExpc3QgKyBUTEFOX05VTV9SWF9MSVNUUzsKLQlpZiAoIGJidWYgKSB7Ci0JCXByaXYtPnJ4QnVmZmVyID0gKHU4ICopICggcHJpdi0+dHhMaXN0ICsgVExBTl9OVU1fVFhfTElTVFMgKTsKLQkJcHJpdi0+dHhCdWZmZXIgPSBwcml2LT5yeEJ1ZmZlcgotCQkJCSArICggVExBTl9OVU1fUlhfTElTVFMgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7Ci0JfQotCi0JZXJyID0gMDsKLQlmb3IgKCBpID0gMDsgIGkgPCA2IDsgaSsrICkKLQkJZXJyIHw9IFRMYW5fRWVSZWFkQnl0ZSggZGV2LAotCQkJCQkodTgpIHByaXYtPmFkYXB0ZXItPmFkZHJPZnMgKyBpLAotCQkJCQkodTggKikgJmRldi0+ZGV2X2FkZHJbaV0gKTsKLQlpZiAoIGVyciApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAlczogRXJyb3IgcmVhZGluZyBNQUMgZnJvbSBlZXByb206ICVkXG4iLAotCQkJZGV2LT5uYW1lLAotCQkJZXJyICk7Ci0JfQotCWRldi0+YWRkcl9sZW4gPSA2OwotCQotCS8qIERldmljZSBtZXRob2RzICovCi0JZGV2LT5vcGVuID0gJlRMYW5fT3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZUTGFuX1N0YXJ0VHg7Ci0JZGV2LT5zdG9wID0gJlRMYW5fQ2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmVExhbl9HZXRTdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZUTGFuX1NldE11bHRpY2FzdExpc3Q7Ci0JZGV2LT5kb19pb2N0bCA9ICZUTGFuX2lvY3RsOwotCWRldi0+dHhfdGltZW91dCA9ICZUTGFuX3R4X3RpbWVvdXQ7Ci0JZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0KLQlyZXR1cm4gMDsKLQotfSAvKiBUTGFuX0luaXQgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX09wZW4KLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0JICoJUGFybXM6Ci0JICoJCWRldglTdHJ1Y3R1cmUgb2YgZGV2aWNlIHRvIGJlIG9wZW5lZC4KLQkgKgotCSAqCVRoaXMgcm91dGluZSBwdXRzIHRoZSBkcml2ZXIgYW5kIFRMQU4gYWRhcHRlciBpbiBhCi0JICoJc3RhdGUgd2hlcmUgaXQgaXMgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwYWNrZXRzLgotCSAqCUl0IGFsbG9jYXRlcyB0aGUgSVJRLCByZXNldHMgYW5kIGJyaW5ncyB0aGUgYWRhcHRlcgotCSAqCW91dCBvZiByZXNldCwgYW5kIGFsbG93cyBpbnRlcnJ1cHRzLiAgSXQgYWxzbyBkZWxheXMKLQkgKgl0aGUgc3RhcnR1cCBmb3IgYXV0b25lZ290aWF0aW9uIG9yIHNlbmRzIGEgUnggR08KLQkgKgljb21tYW5kIHRvIHRoZSBhZGFwdGVyLCBhcyBhcHByb3ByaWF0ZS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBUTGFuX09wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQlpbnQJCWVycjsKLQkKLQlwcml2LT50bGFuUmV2ID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fREVGX1JFVklTSU9OICk7Ci0JZXJyID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBUTGFuX0hhbmRsZUludGVycnVwdCwgU0FfU0hJUlEsIFRMYW5TaWduYXR1cmUsIGRldiApOwotCQotCWlmICggZXJyICkgewotCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDYW5ub3Qgb3BlbiAlcyBiZWNhdXNlIElSUSAlZCBpcyBhbHJlYWR5IGluIHVzZS5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEgKTsKLQkJcmV0dXJuIGVycjsKKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8ICgweDAwMEMwMDAwKTsKKwkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworI2lmZGVmIEVCREVCVUcKKwkJcHJpbnRmKCJBQzogMHglaFhcbiIsIGludyhCQVNFICsgVExBTl9DSF9QQVJNKSk7IAorCQlob3N0X2ludCA9IGludyhCQVNFICsgVExBTl9IT1NUX0lOVCk7CisJCXByaW50ZigiUEktMjogMHglaFhcbiIsIGhvc3RfaW50KTsgCisjZW5kaWYKIAl9Ci0JCi0JaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JCi0JLyogTk9URTogSXQgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBzdGF0cyBiZWZvcmUgYQotCQkJIHJlc2V0IGlmIHlvdSBkb24ndCBjYXJlIHdoYXQgdGhlIHZhbHVlcyBhcmUuCi0JKi8KLQlUTGFuX1Jlc2V0TGlzdHMoIGRldiApOwotCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKLQlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7Ci0KLQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IE9wZW5lZC4gIFRMQU4gQ2hpcCBSZXY6ICV4XG4iLCBkZXYtPm5hbWUsIHByaXYtPnRsYW5SZXYgKTsKLQotCXJldHVybiAwOwotCi19IC8qIFRMYW5fT3BlbiAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9pb2N0bAotCSAqCQotCSAqCVJldHVybnM6Ci0JICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKLQkgKglQYXJhbXM6Ci0JICoJCWRldglzdHJ1Y3R1cmUgb2YgZGV2aWNlIHRvIHJlY2VpdmUgaW9jdGwuCi0JICoJCQotCSAqCQlycQlpZnJlcSBzdHJ1Y3R1cmUgdG8gaG9sZCB1c2Vyc3BhY2UgZGF0YS4KLQkgKgotCSAqCQljbWQJaW9jdGwgY29tbWFuZC4KLQkgKgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJcmVmaWxsX3J4KG5pYyk7CisJcmV0dXJuICgxKTsJCS8qIGluaXRpYWxseSBhcyB0aGlzIGlzIGNhbGxlZCB0byBmbHVzaCB0aGUgaW5wdXQgKi8KK30KIAotc3RhdGljIGludCBUTGFuX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCitzdGF0aWMgdm9pZCByZWZpbGxfcngoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSAoc3RydWN0IG1paV9pb2N0bF9kYXRhICopJnJxLT5pZnJfZGF0YTsKLQl1MzIgcGh5ICAgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKLQkKLQlpZiAoIXByaXYtPnBoeU9ubGluZSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlzd2l0Y2goY21kKSB7Ci0JY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLwotCWNhc2UgU0lPQ0RFVlBSSVZBVEU6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLwotCQkJZGF0YS0+cGh5X2lkID0gcGh5OwotCi0JY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KLQljYXNlIFNJT0NERVZQUklWQVRFKzE6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLwotCQkJVExhbl9NaWlSZWFkUmVnKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsICZkYXRhLT52YWxfb3V0KTsKLQkJCXJldHVybiAwOwotCQkKKwlpbnQgZW50cnkgPSAwOwogCi0JY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCi0JY2FzZSBTSU9DREVWUFJJVkFURSsyOgkJLyogZm9yIGJpbmFyeSBjb21wYXQsIHJlbW92ZSBpbiAyLjUgKi8KLQkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJVExhbl9NaWlXcml0ZVJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOwotCQkJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZm9yICg7CisJICAgICAocHJpdi0+Y3VyX3J4IC0gcHJpdi0+ZGlydHlfcnggKworCSAgICAgIFRMQU5fTlVNX1JYX0xJU1RTKSAlIFRMQU5fTlVNX1JYX0xJU1RTID4gMDsKKwkgICAgIHByaXYtPmRpcnR5X3J4ID0gKHByaXYtPmRpcnR5X3J4ICsgMSkgJSBUTEFOX05VTV9SWF9MSVNUUykgeworCQllbnRyeSA9IHByaXYtPmRpcnR5X3J4ICUgVExBTl9OVU1fVFhfTElTVFM7CisJCXJ4X3JpbmdbZW50cnldLmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7CisJCXJ4X3JpbmdbZW50cnldLmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKIAl9Ci19IC8qIHRsYW5faW9jdGwgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAJVExhbl90eF90aW1lb3V0Ci0JICoKLQkgKiAJUmV0dXJuczogbm90aGluZwotCSAqCi0JICogCVBhcmFtczoKLQkgKiAJCWRldglzdHJ1Y3R1cmUgb2YgZGV2aWNlIHdoaWNoIHRpbWVkIG91dCAKLQkgKiAJCQlkdXJpbmcgdHJhbnNtaXQuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIFRMYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCQotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJhbnNtaXQgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKLQkKLQkvKiBPayBzbyB3ZSB0aW1lZCBvdXQsIGxldHMgc2VlIHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0Li4uKi8KLQlUTGFuX0ZyZWVMaXN0cyggZGV2ICk7Ci0JVExhbl9SZXNldExpc3RzKCBkZXYgKTsJCQotCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKLQlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7Ci0JZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JbmV0aWZfd2FrZV9xdWV1ZSggZGV2ICk7CQogCiB9Ci0JCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9TdGFydFR4Ci0JICogIAotCSAqCVJldHVybnM6Ci0JICoJCTAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KLQkgKglQYXJtczoKLQkgKgkJc2tiCUEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiBjb250YWluaW5nIHRoZQotCSAqCQkJZnJhbWUgdG8gYmUgc2VudC4KLQkgKgkJZGV2CVRoZSBkZXZpY2UgdG8gc2VuZCB0aGUgZGF0YSBvbi4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gYWRkcyBhIGZyYW1lIHRvIHRoZSBUeCBsaXN0IHRvIGJlIHNlbnQKLQkgKglBU0FQLiAgRmlyc3QgaXQJdmVyaWZpZXMgdGhhdCB0aGUgYWRhcHRlciBpcyByZWFkeSBhbmQKLQkgKgl0aGVyZSBpcyByb29tIGluIHRoZSBxdWV1ZS4gIFRoZW4gaXQgc2V0cyB1cCB0aGUgbmV4dAotCSAqCWF2YWlsYWJsZSBsaXN0LCBjb3BpZXMgdGhlIGZyYW1lIHRvIHRoZQljb3JyZXNwb25kaW5nCi0JICoJYnVmZmVyLiAgSWYgdGhlIGFkYXB0ZXIgVHggY2hhbm5lbCBpcyBpZGxlLCBpdCBnaXZlcwotCSAqCXRoZSBhZGFwdGVyIGEgVHggR28gY29tbWFuZCBvbiB0aGUgbGlzdCwgb3RoZXJ3aXNlIGl0Ci0JICoJc2V0cyB0aGUgZm9yd2FyZCBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBsaXN0IHRvIHBvaW50Ci0JICoJdG8gdGhpcyBvbmUuICBUaGVuIGl0IGZyZWVzIHRoZSBza19idWZmLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogI2RlZmluZSBFQkRFQlVHICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGxhbl90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsCS8qIERlc3RpbmF0aW9uICovCisJCQkgIHVuc2lnbmVkIGludCB0LAkvKiBUeXBlICovCisJCQkgIHVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCisJCQkgIGNvbnN0IGNoYXIgKnApCit7CQkJCS8qIFBhY2tldCAqLworCXUxNiBuc3R5cGU7CisJdTMyIHRvOworCXN0cnVjdCBUTGFuTGlzdCAqdGFpbF9saXN0OworCXN0cnVjdCBUTGFuTGlzdCAqaGVhZF9saXN0OworCXU4ICp0YWlsX2J1ZmZlcjsKKwl1MzIgYWNrID0gMDsKKwl1MzIgaG9zdF9jbWQ7CisJaW50IGVvYyA9IDA7CisJdTE2IHRtcENTdGF0OworI2lmZGVmIEVCREVCVUcKKwl1MTYgaG9zdF9pbnQgPSBpbncoQkFTRSArIFRMQU5fSE9TVF9JTlQpOworI2VuZGlmCisJaW50IGVudHJ5ID0gMDsKIAotc3RhdGljIGludCBUTGFuX1N0YXJ0VHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQlUTGFuTGlzdAkqdGFpbF9saXN0OwotCXU4CQkqdGFpbF9idWZmZXI7Ci0JaW50CQlwYWQ7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQotCWlmICggISBwcml2LT5waHlPbmxpbmUgKSB7Ci0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBQSFkgaXMgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUgKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJcmV0dXJuIDA7CisjaWZkZWYgRUJERUJVRworCXByaW50ZigiSU5UMC0weCVoWFxuIiwgaG9zdF9pbnQpOworI2VuZGlmCisKKwlpZiAoIXByaXYtPnBoeU9ubGluZSkgeworCQlwcmludGYoIlRSQU5TTUlUOiAgJXMgUEhZIGlzIG5vdCByZWFkeVxuIiwgcHJpdi0+bmljX25hbWUpOworCQlyZXR1cm47CiAJfQogCiAJdGFpbF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhUYWlsOwotCQotCWlmICggdGFpbF9saXN0LT5jU3RhdCAhPSBUTEFOX0NTVEFUX1VOVVNFRCApIHsKLQkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogICVzIGlzIGJ1c3kgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIGRldi0+bmFtZSwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKHRhaWxfbGlzdC0+Y1N0YXQgIT0gVExBTl9DU1RBVF9VTlVTRUQpIHsKKwkJcHJpbnRmKCJUUkFOU01JVDogJXMgaXMgYnVzeSAoSGVhZD0lZCBUYWlsPSVkKVxuIiwKKwkJICAgICAgIHByaXYtPm5pY19uYW1lLCBwcml2LT50eExpc3QsIHByaXYtPnR4VGFpbCk7CisJCXR4X3JpbmdbZW50cnldLmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CiAJCXByaXYtPnR4QnVzeUNvdW50Kys7Ci0JCXJldHVybiAxOworCQlyZXR1cm47CiAJfQogCiAJdGFpbF9saXN0LT5mb3J3YXJkID0gMDsKIAotCWlmICggYmJ1ZiApIHsKLQkJdGFpbF9idWZmZXIgPSBwcml2LT50eEJ1ZmZlciArICggcHJpdi0+dHhUYWlsICogVExBTl9NQVhfRlJBTUVfU0laRSApOwotCQltZW1jcHkoIHRhaWxfYnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuICk7Ci0JfSBlbHNlIHsKLQkJdGFpbF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCBza2ItPmRhdGEgKTsKLQkJdGFpbF9saXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9ICh1MzIpIHNrYjsKLQl9CisJdGFpbF9idWZmZXIgPSB0eGIgKyAocHJpdi0+dHhUYWlsICogVExBTl9NQVhfRlJBTUVfU0laRSk7CiAKLQlwYWQgPSBUTEFOX01JTl9GUkFNRV9TSVpFIC0gc2tiLT5sZW47Ci0KLQlpZiAoIHBhZCA+IDAgKSB7Ci0JCXRhaWxfbGlzdC0+ZnJhbWVTaXplID0gKHUxNikgc2tiLT5sZW4gKyBwYWQ7Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gKHUzMikgc2tiLT5sZW47Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHBhZDsKLQkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCBUTGFuUGFkQnVmZmVyICk7Ci0JfSBlbHNlIHsKLQkJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBza2ItPmxlbjsKLQkJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgc2tiLT5sZW47Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gMDsKLQkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7Ci0JfQorCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworCW1lbWNweSh0YWlsX2J1ZmZlciwgZCwgRVRIX0FMRU4pOworCW1lbWNweSh0YWlsX2J1ZmZlciArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW5zdHlwZSA9IGh0b25zKCh1MTYpIHQpOworCW1lbWNweSh0YWlsX2J1ZmZlciArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkodGFpbF9idWZmZXIgKyBFVEhfSExFTiwgcCwgcyk7CisKKwlzICs9IEVUSF9ITEVOOworCXMgJj0gMHgwRkZGOworCXdoaWxlIChzIDwgRVRIX1pMRU4pCisJCXRhaWxfYnVmZmVyW3MrK10gPSAnXDAnOworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJLyogUmVjZWl2ZQorCSAqIDAwMDAgMDAwMCAwMDAxIDExMDAKKwkgKiAwMDAwIDAwMDAgMDAwMCAxMTAwCisJICogMDAwMCAwMDAwIDAwMDAgMDAxMSA9IDB4MDAwMworCSAqCisJICogMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDExCisJICogMDAwMCAwMDAwIDAwMDAgMTEwMCAwMDAwIDAwMDAgMDAwMCAwMDAwID0gMHgwMDBDMDAwMAorCSAqCisJICogVHJhbnNtaXQKKwkgKiAwMDAwIDAwMDAgMDAwMSAxMTAwCisJICogMDAwMCAwMDAwIDAwMDAgMDEwMAorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMDEgPSAweDAwMDEKKwkgKgorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMQorCSAqIDAwMDAgMDAwMCAwMDAwIDAxMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MDAwNDAwMDAKKwkgKiAqLworCisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwl0YWlsX2xpc3QtPmZyYW1lU2l6ZSA9ICh1MTYpIHM7CisJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgczsKKwl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5jb3VudCA9IDA7CisJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXRhaWxfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOwotCWlmICggISBwcml2LT50eEluUHJvZ3Jlc3MgKSB7CisKKyNpZmRlZiBFQkRFQlVHCisJaG9zdF9pbnQgPSBpbncoQkFTRSArIFRMQU5fSE9TVF9JTlQpOworCXByaW50ZigiSU5UMS0weCVoWFxuIiwgaG9zdF9pbnQpOworI2VuZGlmCisKKwlpZiAoIXByaXYtPnR4SW5Qcm9ncmVzcykgewogCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAxOwotCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgU3RhcnRpbmcgVFggb24gYnVmZmVyICVkXG4iLCBwcml2LT50eFRhaWwgKTsKLQkJb3V0bCggdmlydF90b19idXMoIHRhaWxfbGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOwotCQlvdXRsKCBUTEFOX0hDX0dPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwkJb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKHRhaWxfbGlzdCksIEJBU0UgKyBUTEFOX0NIX1BBUk0pOworCQlvdXRsKFRMQU5fSENfR08sIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKIAl9IGVsc2UgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgQWRkaW5nIGJ1ZmZlciAlZCB0byBUWCBjaGFubmVsXG4iLCBwcml2LT50eFRhaWwgKTsKLQkJaWYgKCBwcml2LT50eFRhaWwgPT0gMCApIHsKLQkJCSggcHJpdi0+dHhMaXN0ICsgKCBUTEFOX05VTV9UWF9MSVNUUyAtIDEgKSApLT5mb3J3YXJkID0gdmlydF90b19idXMoIHRhaWxfbGlzdCApOworCQlpZiAocHJpdi0+dHhUYWlsID09IDApIHsKKyNpZmRlZiBFQkRFQlVHCisJCQlwcmludGYoIk91dCBidWZmZXJcbiIpOworI2VuZGlmCisJCQkocHJpdi0+dHhMaXN0ICsgKFRMQU5fTlVNX1RYX0xJU1RTIC0gMSkpLT5mb3J3YXJkID0KKwkJCSAgICB2aXJ0X3RvX2xlMzJkZXNjKHRhaWxfbGlzdCk7CiAJCX0gZWxzZSB7Ci0JCQkoIHByaXYtPnR4TGlzdCArICggcHJpdi0+dHhUYWlsIC0gMSApICktPmZvcndhcmQgPSB2aXJ0X3RvX2J1cyggdGFpbF9saXN0ICk7CisjaWZkZWYgRUJERUJVRworCQkJcHJpbnRmKCJGaXggdGhpcyBcbiIpOworI2VuZGlmCisJCQkocHJpdi0+dHhMaXN0ICsgKHByaXYtPnR4VGFpbCAtIDEpKS0+Zm9yd2FyZCA9CisJCQkgICAgdmlydF90b19sZTMyZGVzYyh0YWlsX2xpc3QpOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUNJUkNfSU5DKCBwcml2LT50eFRhaWwsIFRMQU5fTlVNX1RYX0xJU1RTICk7Ci0KLQlpZiAoIGJidWYgKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkKLQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQlyZXR1cm4gMDsKLQotfSAvKiBUTGFuX1N0YXJ0VHggKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZUludGVycnVwdAotCSAqICAKLQkgKglSZXR1cm5zOgkKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlpcnEJVGhlIGxpbmUgb24gd2hpY2ggdGhlIGludGVycnVwdAotCSAqCQkJb2NjdXJyZWQuCi0JICoJCWRldl9pZAlBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBhc3NpZ25lZCB0bwotCSAqCQkJdGhpcyBpcnEgbGluZS4KLQkgKgkJcmVncwk/Pz8KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IGl0cwotCSAqCWFzc2lnbmVkIFRMQU4gYWRhcHRlci4gIFRoZSBmdW5jdGlvbiBkZWFjdGl2YXRlcwotCSAqCWludGVycnVwdHMgb24gaXRzIGFkYXB0ZXIsIHJlY29yZHMgdGhlIHR5cGUgb2YKLQkgKglpbnRlcnJ1cHQsIGV4ZWN1dGVzIHRoZSBhcHByb3ByaWF0ZSBzdWJoYW5kbGVyLCBhbmQKLQkgKglhY2tub3dkZ2VzIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGFkYXB0ZXIgKHRodXMKLQkgKglyZS1lbmFibGluZyBhZGFwdGVyIGludGVycnVwdHMuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIFRMYW5fSGFuZGxlSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdTMyCQlhY2s7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKLQl1MzIJCWhvc3RfY21kOwotCXUxNgkJaG9zdF9pbnQ7Ci0JaW50CQl0eXBlOwotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdjsKLQotCWRldiA9IGRldl9pZDsKLQlwcml2ID0gZGV2LT5wcml2OwotCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQotCWhvc3RfaW50ID0gaW53KCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9JTlQgKTsKLQlvdXR3KCBob3N0X2ludCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfSU5UICk7CisJCisJQ0lSQ19JTkMocHJpdi0+dHhUYWlsLCBUTEFOX05VTV9UWF9MSVNUUyk7CiAKLQl0eXBlID0gKCBob3N0X2ludCAmIFRMQU5fSElfSVRfTUFTSyApID4+IDI7CisjaWZkZWYgRUJERUJVRworCWhvc3RfaW50ID0gaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKTsKKwlwcmludGYoIklOVDItMHglaFhcbiIsIGhvc3RfaW50KTsKKyNlbmRpZgogCi0JYWNrID0gVExhbkludFZlY3Rvclt0eXBlXSggZGV2LCBob3N0X2ludCApOworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKwl3aGlsZSAoKHRhaWxfbGlzdC0+Y1N0YXQgPT0gVExBTl9DU1RBVF9SRUFEWSkgJiYgY3VycnRpY2tzKCkgPCB0byk7CiAKLQlpZiAoIGFjayApIHsKLQkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8ICggdHlwZSA8PCAxOCApOwotCQlvdXRsKCBob3N0X2NtZCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCXdoaWxlICgoKHRtcENTdGF0ID0gaGVhZF9saXN0LT5jU3RhdCkgJiBUTEFOX0NTVEFUX0ZSTV9DTVApIAorCQkJJiYgKGFjayA8IDI1NSkpIHsKKwkJYWNrKys7CisJCWlmKHRtcENTdGF0ICYgVExBTl9DU1RBVF9FT0MpCisJCQllb2MgPTE7CisJCWhlYWRfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKwkJQ0lSQ19JTkMocHJpdi0+dHhIZWFkLCBUTEFOX05VTV9UWF9MSVNUUyk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJCiAJfQorCWlmKCFhY2spCisJCXByaW50ZigiSW5jb21wbGV0ZSBUWCBGcmFtZVxuIik7CiAKLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLX0gLyogVExhbl9IYW5kbGVJbnRlcnJ1cHRzICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9DbG9zZQotCSAqICAKLQkgKiAJUmV0dXJuczoKLQkgKgkJQW4gZXJyb3IgY29kZS4KLQkgKglQYXJtczoKLQkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8KLQkgKgkJCWNsb3NlLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIHRoZSBhZGFwdGVyLiAgSXQgcmVjb3JkcyBhbnkKLQkgKglzdGF0cywgcHV0cyB0aGUgYWRhcHRlciBpbnRvIHJlc2V0IHN0YXRlLCBkZWFjdGl2YXRlcwotCSAqCWl0cyB0aW1lIGFzIG5lZWRlZCwgYW5kCWZyZWVzIHRoZSBpcnEgaXQgaXMgdXNpbmcuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgVExhbl9DbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQlwcml2LT5uZWdfYmVfdmVyYm9zZSA9IDA7Ci0KLQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7Ci0Jb3V0bCggVExBTl9IQ19BRF9SU1QsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOwotCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCApIHsKLQkJZGVsX3RpbWVyX3N5bmMoICZwcml2LT50aW1lciApOwotCQlwcml2LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7CisJaWYoZW9jKSB7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaWYgKChoZWFkX2xpc3QtPmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSkgPT0gVExBTl9DU1RBVF9SRUFEWSkgeworCQkJb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKGhlYWRfbGlzdCksIEJBU0UgKyBUTEFOX0NIX1BBUk0pOworCQkJYWNrIHw9IFRMQU5fSENfR087CisJCX0gZWxzZSB7CisJCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAwOworCQl9CiAJfQotCQotCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7Ci0JVExhbl9GcmVlTGlzdHMoIGRldiApOwotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICJEZXZpY2UgJXMgY2xvc2VkLlxuIiwgZGV2LT5uYW1lICk7Ci0KLQlyZXR1cm4gMDsKLQotfSAvKiBUTGFuX0Nsb3NlICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9HZXRTdGF0cwotCSAqICAKLQkgKglSZXR1cm5zOgotCSAqCQlBIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgotCSAqCVBhcm1zOgotCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRoZQotCSAqCQkJc3RhdHMgZm9yLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBkZXZpY2VzIHN0YXRpc3RpY3MgYnkgcmVhZGluZwotCSAqCXRoZSBUTEFOIGNoaXAncyBvbmJvYXJkIHJlZ2lzdGVycy4gIFRoZW4gaXQgcmV0dXJucyB0aGUKLQkgKglhZGRyZXNzIG9mIHRoZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpUTGFuX0dldFN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JaW50IGk7Ci0KLQkvKiBTaG91bGQgb25seSByZWFkIHN0YXRzIGlmIG9wZW4gPyAqLwotCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKLQotCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogICVzIEVPQyBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnJ4RW9jQ291bnQgKTsKLQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgQnVzeSBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4QnVzeUNvdW50ICk7Ci0JaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfR05STCApIHsKLQkJVExhbl9QcmludERpbyggZGV2LT5iYXNlX2FkZHIgKTsKLQkJVExhbl9QaHlQcmludCggZGV2ICk7CQkKLQl9Ci0JaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfTElTVCApIHsKLQkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrICkKLQkJCVRMYW5fUHJpbnRMaXN0KCBwcml2LT5yeExpc3QgKyBpLCAiUlgiLCBpICk7Ci0JCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApCi0JCQlUTGFuX1ByaW50TGlzdCggcHJpdi0+dHhMaXN0ICsgaSwgIlRYIiwgaSApOworCWlmKGFjaykgeworCQlob3N0X2NtZCA9IFRMQU5fSENfQUNLIHwgYWNrOworCQlvdXRsKGhvc3RfY21kLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAJfQogCQotCXJldHVybiAoICYoIChUTGFuUHJpdmF0ZUluZm8gKikgZGV2LT5wcml2ICktPnN0YXRzICk7Ci0KLX0gLyogVExhbl9HZXRTdGF0cyAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fU2V0TXVsdGljYXN0TGlzdAotCSAqICAKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSB0byBzZXQgdGhlCi0JICoJCQltdWx0aWNhc3QgbGlzdCBmb3IuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFRMQU4gYWRhcHRvciB0byB2YXJpb3VzIHJlY2VpdmUKLQkgKgltb2Rlcy4gIElmIHRoZSBJRkZfUFJPTUlTQyBmbGFnIGlzIHNldCwgcHJvbWlzY3VvdXMKLQkgKgltb2RlIGlzIGFjaXR2aWF0ZWQuICBPdGhlcndpc2UsCXByb21pc2N1b3VzIG1vZGUgaXMKLQkgKgl0dXJuZWQgb2ZmLiAgSWYgdGhlIElGRl9BTExNVUxUSSBmbGFnIGlzIHNldCwgdGhlbgotCSAqCXRoZSBoYXNoIHRhYmxlIGlzIHNldCB0byByZWNlaXZlIGFsbCBncm91cCBhZGRyZXNzZXMuCi0JICoJT3RoZXJ3aXNlLCB0aGUgZmlyc3QgdGhyZWUgbXVsdGljYXN0IGFkZHJlc3NlcyBhcmUKLQkgKglzdG9yZWQgaW4gQVJFR18xLTMsIGFuZCB0aGUgcmVzdCBhcmUgc2VsZWN0ZWQgdmlhIHRoZQotCSAqCWhhc2ggdGFibGUsIGFzIG5lY2Vzc2FyeS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgVExhbl9TZXRNdWx0aWNhc3RMaXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsJCi0Jc3RydWN0IGRldl9tY19saXN0CSpkbWkgPSBkZXYtPm1jX2xpc3Q7Ci0JdTMyCQkJaGFzaDEgPSAwOwotCXUzMgkJCWhhc2gyID0gMDsKLQlpbnQJCQlpOwotCXUzMgkJCW9mZnNldDsKLQl1OAkJCXRtcDsKLQotCWlmICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgewotCQl0bXAgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01EICk7Ci0JCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCB0bXAgfCBUTEFOX05FVF9DTURfQ0FGICk7Ci0JfSBlbHNlIHsKLQkJdG1wID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCApOwotCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCwgdG1wICYgflRMQU5fTkVUX0NNRF9DQUYgKTsKLQkJaWYgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkgewotCQkJZm9yICggaSA9IDA7IGkgPCAzOyBpKysgKSAKLQkJCQlUTGFuX1NldE1hYyggZGV2LCBpICsgMSwgTlVMTCApOwotCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzEsIDB4RkZGRkZGRkYgKTsKLQkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8yLCAweEZGRkZGRkZGICk7CisJaWYocHJpdi0+dGxhblJldiA8IDB4MzAgKSB7CisJCWFjayA9IDE7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaWYgKChoZWFkX2xpc3QtPmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSkgPT0gVExBTl9DU1RBVF9SRUFEWSkgeworCQkJb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKGhlYWRfbGlzdCksIEJBU0UgKyBUTEFOX0NIX1BBUk0pOworCQkJYWNrIHw9IFRMQU5fSENfR087CiAJCX0gZWxzZSB7Ci0JCQlmb3IgKCBpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKyApIHsKLQkJCQlpZiAoIGkgPCAzICkgewotCQkJCQlUTGFuX1NldE1hYyggZGV2LCBpICsgMSwgKGNoYXIgKikgJmRtaS0+ZG1pX2FkZHIgKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXQgPSBUTGFuX0hhc2hGdW5jKCAodTggKikgJmRtaS0+ZG1pX2FkZHIgKTsKLQkJCQkJaWYgKCBvZmZzZXQgPCAzMiApIAotCQkJCQkJaGFzaDEgfD0gKCAxIDw8IG9mZnNldCApOwotCQkJCQllbHNlCi0JCQkJCQloYXNoMiB8PSAoIDEgPDwgKCBvZmZzZXQgLSAzMiApICk7Ci0JCQkJfQotCQkJCWRtaSA9IGRtaS0+bmV4dDsKLQkJCX0KLQkJCWZvciAoIDsgaSA8IDM7IGkrKyApIAotCQkJCVRMYW5fU2V0TWFjKCBkZXYsIGkgKyAxLCBOVUxMICk7Ci0JCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMSwgaGFzaDEgKTsKLQkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8yLCBoYXNoMiApOworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKIAkJfQorCQlob3N0X2NtZCA9IFRMQU5fSENfQUNLIHwgYWNrIHwgMHgwMDE0MDAwMDsKKwkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCQkKIAl9CisJCQkKKwlpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKwkJcHJpbnRmKCJUWCBUaW1lIE91dCIpOworCX0KK30KIAotfSAvKiBUTGFuX1NldE11bHRpY2FzdExpc3QgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBUaHVuZGVyTEFOIERyaXZlciBJbnRlcnJ1cHQgVmVjdG9ycyBhbmQgVGFibGUKLQotCVBsZWFzZSBzZWUgQ2hhcC4gNCwgIkludGVycnVwdCBIYW5kbGluZyIgb2YgdGhlICJUaHVuZGVyTEFOCi0JUHJvZ3JhbW1lcidzIEd1aWRlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgb24gaGFuZGxpbmcgaW50ZXJydXB0cwotCWdlbmVyYXRlZCBieSBUTEFOIGJhc2VkIGFkYXB0ZXJzLiAgCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVJbnZhbGlkCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkwCi0JICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGludmFsaWQgaW50ZXJydXB0cy4gIFRoaXMgc2hvdWxkCi0JICoJbmV2ZXIgaGFwcGVuIHVubGVzcyBzb21lIG90aGVyIGFkYXB0ZXIgaXMgdHJ5aW5nIHRvIHVzZQotCSAqCXRoZSBJUlEgbGluZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MzIgVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgRUI1MQorc3RhdGljIHZvaWQgdGxhbl9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKKyNlbHNlCitzdGF0aWMgdm9pZCB0bGFuX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQorI2VuZGlmCiB7Ci0JLyogcHJpbnRrKCAiVExBTjogIEludmFsaWQgaW50ZXJydXB0IG9uICVzLlxuIiwgZGV2LT5uYW1lICk7ICovCi0JcmV0dXJuIDA7Ci0KLX0gLyogVExhbl9IYW5kbGVJbnZhbGlkICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVUeEVPRgotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJMQotCSAqCVBhcm1zOgotCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCi0JICoJCQkJcmFpc2VkLgotCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCi0JICoJCQkJcG9ydC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBUeCBFT0YgaW50ZXJydXB0cyB3aGljaCBhcmUgcmFpc2VkCi0JICoJYnkgdGhlIGFkYXB0ZXIgd2hlbiBpdCBoYXMgY29tcGxldGVkIHNlbmRpbmcgdGhlCi0JICoJY29udGVudHMgb2YgYSBidWZmZXIuICBJZiBkZXRlbWluZXMgd2hpY2ggbGlzdC9idWZmZXIKLQkgKgl3YXMgY29tcGxldGVkIGFuZCByZXNldHMgaXQuICBJZiB0aGUgYnVmZmVyIHdhcyB0aGUgbGFzdAotCSAqCWluIHRoZSBjaGFubmVsIChFT0MpLCB0aGVuIHRoZSBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmCi0JICoJYW5vdGhlciBidWZmZXIgaXMgcmVhZHkgdG8gc2VuZCwgYW5kIGlmIHNvLCBzZW5kcyBhIFR4Ci0JICoJR28gY29tbWFuZC4gIEZpbmFsbHksIHRoZSBkcml2ZXIgYWN0aXZhdGVzL2NvbnRpbnVlcyB0aGUKLQkgKglhY3Rpdml0eSBMRUQuCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJLyogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgMyBwdXJwb3Nlcy4KKwkgKiBUaGlzIGRpc2FibGVzIERNQSBhbmQgaW50ZXJydXB0cyBzbyB3ZSBkb24ndCByZWNlaXZlCisJICogIHVuZXhwZWN0ZWQgcGFja2V0cyBvciBpbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYWZ0ZXIKKwkgKiAgZXRoZXJib290IGhhcyBmaW5pc2hlZC4KKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAJICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJICovCisJb3V0bChUTEFOX0hDX0FEX1JTVCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworfQogCi11MzIgVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0bGFuX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCiB7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCWludAkJZW9jID0gMDsKLQlUTGFuTGlzdAkqaGVhZF9saXN0OwotCXUzMgkJYWNrID0gMDsKLQl1MTYJCXRtcENTdGF0OwotCQotCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0YgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7Ci0JaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KIAotCXdoaWxlICgoKHRtcENTdGF0ID0gaGVhZF9saXN0LT5jU3RhdCApICYgVExBTl9DU1RBVF9GUk1fQ01QKSAmJiAoYWNrIDwgMjU1KSkgewotCQlhY2srKzsKLQkJaWYgKCAhIGJidWYgKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueSggKHN0cnVjdCBza19idWZmICopIGhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgKTsKLQkJCWhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOwotCQl9Ci0JCi0JCWlmICggdG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQyApCi0JCQllb2MgPSAxOwotCQkJCi0JCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworc3RhdGljIHZvaWQgVExhbl9TZXRNdWx0aWNhc3RMaXN0KHN0cnVjdCBuaWMgKm5pYykgeworCWludCBpOworCXU4IHRtcDsKIAotCQloZWFkX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7Ci0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CQkKLQkJQ0lSQ19JTkMoIHByaXYtPnR4SGVhZCwgVExBTl9OVU1fVFhfTElTVFMgKTsgCi0JCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKLQl9CisJLyogIUlGRl9QUk9NSVNDICovCisJdG1wID0gVExhbl9EaW9SZWFkOChCQVNFLCBUTEFOX05FVF9DTUQpOworCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTkVUX0NNRCwgdG1wICYgflRMQU5fTkVUX0NNRF9DQUYpOworCisJLyogSUZGX0FMTE1VTFRJICovCisJZm9yKGkgPSAwOyBpPCAzOyBpKyspCisJCVRMYW5fU2V0TWFjKG5pYywgaSArIDEsIE5VTEwpOworCVRMYW5fRGlvV3JpdGUzMihCQVNFLCBUTEFOX0hBU0hfMSwgMHhGRkZGRkZGRik7CisJVExhbl9EaW9Xcml0ZTMyKEJBU0UsIFRMQU5fSEFTSF8yLCAweEZGRkZGRkZGKTsKIAotCWlmICghYWNrKQotCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBSZWNlaXZlZCBpbnRlcnJ1cHQgZm9yIHVuY29tcGxldGVkIFRYIGZyYW1lLlxuIik7Ci0JCi0JaWYgKCBlb2MgKSB7Ci0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7Ci0JCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKLQkJaWYgKCAoIGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZICkgPT0gVExBTl9DU1RBVF9SRUFEWSApIHsKLQkJCW91dGwoIHZpcnRfdG9fYnVzKCBoZWFkX2xpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJCWFjayB8PSBUTEFOX0hDX0dPOwotCQl9IGVsc2UgewotCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKLQkJfQotCX0KIAkKLQlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCApIHsKLQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgfCBUTEFOX0xFRF9BQ1QgKTsKLQkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgewotCQkJIHByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7Ci0JCQkgcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7Ci0JCQkgcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKLQkJCSBwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKLQkJCSBwcml2LT50aW1lclR5cGUgPSBUTEFOX1RJTUVSX0FDVElWSVRZOwotCQkJIGFkZF90aW1lcigmcHJpdi0+dGltZXIpOwotCQl9IGVsc2UgaWYgKCBwcml2LT50aW1lclR5cGUgPT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsKLQkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBib2FyZF9mb3VuZCAxCisjZGVmaW5lIHZhbGlkX2xpbmsgMAorI2lmZGVmIEVCNTEKK3N0YXRpYyBpbnQgdGxhbl9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKikgZGV2OworI2Vsc2UKK3N0cnVjdCBuaWMgKnRsYW5fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisjZW5kaWYKKwkJdTE2IGRhdGEgPSAwOworCWludCBlcnI7CisJaW50IGk7CisKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworCisJQkFTRSA9IHBjaS0+aW9hZGRyOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoInRsYW4uYzogJXMsICVzXG4iLCBkcnZfdmVyc2lvbiwgZHJ2X2RhdGUpOworCXByaW50ZigiJXM6IFByb2JpbmcgZm9yIFZlbmRvciAweCVoWCwgRGV2aWNlIDB4JWhYIiwKKwkgICAgICAgcGNpLT5uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZfaWQpOworCisKKwkvKiBJIHJlYWxseSBtdXN0IGZpbmQgb3V0IHdoYXQgdGhpcyBkb2VzICovCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCS8qIFBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCXByaXYgPSAmVExhblByaXZhdGVJbmZvOworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggY2hpcCB3ZSdyZSBkZWFsaW5nIHdpdGggKi8KKwlpID0gMDsKKwljaGlwX2lkeCA9IC0xOworCisJd2hpbGUgKHRsYW5fcGNpX3RibFtpXS5uYW1lKSB7CisJCWlmICgoKCh1MzIpIHBjaS0+ZGV2X2lkIDw8IDE2KSB8IHBjaS0+dmVuZG9yKSA9PQorCQkgICAgKHRsYW5fcGNpX3RibFtpXS5pZC5wY2kgJiAweGZmZmZmZmZmKSkgeworCQkJY2hpcF9pZHggPSBpOworCQkJYnJlYWs7CiAJCX0KKwkJaSsrOwogCX0KIAotCXJldHVybiBhY2s7CisJcHJpdi0+dmVuZG9yX2lkID0gcGNpLT52ZW5kb3I7CisJcHJpdi0+ZGV2X2lkID0gcGNpLT5kZXZfaWQ7CisJcHJpdi0+bmljX25hbWUgPSBwY2ktPm5hbWU7CisJcHJpdi0+ZW9jID0gMDsKIAotfSAvKiBUTGFuX0hhbmRsZVR4RU9GICovCisJZXJyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQllcnIgfD0gVExhbl9FZVJlYWRCeXRlKEJBU0UsCisJCQkJICAgICAgICh1OCkgdGxhbl9wY2lfdGJsW2NoaXBfaWR4XS4KKwkJCQkgICAgICAgYWRkck9mcyArIGksCisJCQkJICAgICAgICh1OCAqKSAmIG5pYy0+bm9kZV9hZGRyW2ldKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ZigiVExBTjogJXM6IEVycm9yIHJlYWRpbmcgTUFDIGZyb20gZWVwcm9tOiAlZFxuIiwKKwkJICAgICAgIHBjaS0+bmFtZSwgZXJyKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCJcbkFkZHJlc3M6ICUhXG4iLCBuaWMtPm5vZGVfYWRkcik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3cKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCTEKLQkgKglQYXJtczoKLQkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcwotCSAqCQkJCXJhaXNlZC4KLQkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAotCSAqCQkJCXBvcnQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFN0YXRpc3RpY3MgT3ZlcmZsb3cgaW50ZXJydXB0Ci0JICoJd2hpY2ggbWVhbnMgdGhhdCBvbmUgb3IgbW9yZSBvZiB0aGUgVExBTiBzdGF0aXN0aWNzCi0JICoJcmVnaXN0ZXJzIGhhcyByZWFjaGVkIDEvMiBjYXBhY2l0eSBhbmQgbmVlZHMgdG8gYmUgcmVhZC4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwcml2LT50bGFuUmV2ID0gVExhbl9EaW9SZWFkOChCQVNFLCBUTEFOX0RFRl9SRVZJU0lPTik7CisJcHJpbnRmKCJcblJldmlzaW9uID0gMHglaFhcbiIsIHByaXYtPnRsYW5SZXYpOwogCi11MzIgVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3coIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCi17Ci0JVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOworCVRMYW5fUmVzZXRMaXN0cyhuaWMpOworCVRMYW5fUmVzZXRBZGFwdGVyKG5pYyk7CisvKgorCWRhdGEgPSBpbmwoQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19FT0M7CisJb3V0dyhkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisqLworCisJZGF0YSA9IGlubChCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0dyhkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAKKwlUTGFuX1NldE11bHRpY2FzdExpc3QobmljKTsKKwl1ZGVsYXkoMTAwKTsgCisJcHJpdi0+dHhMaXN0ID0gdHhfcmluZzsKKwlwcml2LT5yeExpc3QgPSByeF9yaW5nOworLyoJaWYgKGJvYXJkX2ZvdW5kICYmIHZhbGlkX2xpbmspCisJeyovCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisjaWZkZWYgRUI1MQorCWRldi0+ZGlzYWJsZSA9IHRsYW5fZGlzYWJsZTsKKwluaWMtPnBvbGwgPSB0bGFuX3BvbGw7CisJbmljLT50cmFuc21pdCA9IHRsYW5fdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgPSB0bGFuX2lycTsKIAlyZXR1cm4gMTsKKyNlbHNlCisJbmljLT5kaXNhYmxlID0gdGxhbl9kaXNhYmxlOworCW5pYy0+cG9sbCA9IHRsYW5fcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gdGxhbl90cmFuc21pdDsKKwluaWMtPmlycSAgICA9IHRsYW5faXJxOworCXJldHVybiBuaWM7CisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgRWVwcm9tIHJvdXRpbmVzCisKKwlUaGUgQ29tcGFxIE5ldGVsbGlnZW50IDEwIGFuZCAxMC8xMDAgY2FyZHMgdXNlIGEgTWljcm9jaGlwIDI0QzAyQQorCUVFUFJPTS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gTWljcm9jaGlwJ3MKKwlkYXRhIHNoZWV0LiAgSSBkb24ndCBrbm93IGhvdyB3ZWxsIHRoaXMgZnVuY3Rpb25zIHdpbGwgd29yayB3aXRoCisJb3RoZXIgRUVQUk9Ncy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotfSAvKiBUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdyAqLwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSGFuZGxlUnhFT0YKKwkgKglUTGFuX0VlU2VuZFN0YXJ0CiAJICoKIAkgKglSZXR1cm5zOgotCSAqCQkxCisJICoJCU5vdGhpbmcKIAkgKglQYXJtczoKLQkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcwotCSAqCQkJCXJhaXNlZC4KLQkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAotCSAqCQkJCXBvcnQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFJ4IEVPRiBpbnRlcnJ1cHQgd2hpY2gKLQkgKglpbmRpY2F0ZXMgYSBmcmFtZSBoYXMgYmVlbiByZWNlaXZlZCBieSB0aGUgYWRhcHRlciBmcm9tCi0JICoJdGhlIG5ldCBhbmQgdGhlIGZyYW1lIGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG1lbW9yeS4KLQkgKglUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYm91bmNlIGJ1ZmZlciB0aGUgZnJhbWUgaGFzCi0JICoJYmVlbiBsb2FkZWQgaW50bywgY3JlYXRlcyBhIG5ldyBza19idWZmIGJpZyBlbm91Z2ggdG8KLQkgKglob2xkIHRoZSBmcmFtZSwgYW5kIHNlbmRzIGl0IHRvIHByb3RvY29sIHN0YWNrLiAgSXQKLQkgKgl0aGVuIHJlc2V0cyB0aGUgdXNlZCBidWZmZXIgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGVuZAotCSAqCW9mIHRoZSBsaXN0LiAgSWYgdGhlIGZyYW1lIHdhcyB0aGUgbGFzdCBpbiB0aGUgUngKLQkgKgljaGFubmVsIChFT0MpLCB0aGUgZnVuY3Rpb24gcmVzdGFydHMgdGhlIHJlY2VpdmUgY2hhbm5lbAotCSAqCWJ5IHNlbmRpbmcgYW4gUnggR28gY29tbWFuZCB0byB0aGUgYWRhcHRlci4gIFRoZW4gaXQKLQkgKglhY3RpdmF0ZXMvY29udGludWVzIHRoZSBhY3Rpdml0eSBMRUQuCisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHN0YXJ0IGN5Y2xlIHRvIGFuIEVFUFJPTSBhdHRhY2hlZAorCSAqCXRvIGEgVExBTiBjaGlwLgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIgVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3ZvaWQgVExhbl9FZVNlbmRTdGFydCh1MTYgaW9fYmFzZSkKIHsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTMyCQlhY2sgPSAwOwotCWludAkJZW9jID0gMDsKLQl1OAkJKmhlYWRfYnVmZmVyOwotCVRMYW5MaXN0CSpoZWFkX2xpc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlUTGFuTGlzdAkqdGFpbF9saXN0OwotCXZvaWQJCSp0OwotCXUzMgkJZnJhbWVTaXplOwotCXUxNgkJdG1wQ1N0YXQ7Ci0KLQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0YgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7Ci0JaGVhZF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhIZWFkOwotCQotCXdoaWxlICgoKHRtcENTdGF0ID0gaGVhZF9saXN0LT5jU3RhdCkgJiBUTEFOX0NTVEFUX0ZSTV9DTVApICYmIChhY2sgPCAyNTUpKSB7Ci0JCWZyYW1lU2l6ZSA9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOwotCQlhY2srKzsKLQkJaWYgKHRtcENTdGF0ICYgVExBTl9DU1RBVF9FT0MpCi0JCQllb2MgPSAxOwotCQkKLQkJaWYgKGJidWYpIHsKLQkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJhbWVTaXplICsgNyk7Ci0JCQlpZiAoc2tiID09IE5VTEwpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWNlaXZlZCBkYXRhLlxuIik7Ci0JCQllbHNlIHsKLQkJCQloZWFkX2J1ZmZlciA9IHByaXYtPnJ4QnVmZmVyICsgKHByaXYtPnJ4SGVhZCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUpOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwotCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7Ci0JCQkJdCA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBmcmFtZVNpemUpOwotCQkKLQkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBoZWFkX2xpc3QtPmZyYW1lU2l6ZTsKLQotCQkJCW1lbWNweSggdCwgaGVhZF9idWZmZXIsIGZyYW1lU2l6ZSApOwotCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyggc2tiLCBkZXYgKTsKLQkJCQluZXRpZl9yeCggc2tiICk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKLQkJCi0JCQkvKgotCQkgCSoJSSBjaGFuZ2VkIHRoZSBhbGdvcml0aG0gaGVyZS4gV2hhdCB3ZSBub3cgZG8KLQkJIAkqCWlzIGFsbG9jYXRlIHRoZSBuZXcgZnJhbWUuIElmIHRoaXMgZmFpbHMgd2UKLQkJIAkqCXNpbXBseSByZWN5Y2xlIHRoZSBmcmFtZS4KLQkJIAkqLwotCQkKLQkJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKCBUTEFOX01BWF9GUkFNRV9TSVpFICsgNyApOwotCQkJCi0JCQlpZiAoIG5ld19za2IgIT0gTlVMTCApIHsKLQkJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuZWQgaXQgd291bGQgYmUgYSBwcm9ibGVtICovCi0JCQkJLyogbm90IGFueSBtb3JlIC0gYWMgKi8KLQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgaGVhZF9saXN0LT5idWZmZXJbOV0uYWRkcmVzczsKLQkJCQlza2JfdHJpbSggc2tiLCBmcmFtZVNpemUgKTsKLQotCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGZyYW1lU2l6ZTsKKwl1MTYgc2lvOwogCi0JCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOwotCQkJCW5ldGlmX3J4KCBza2IgKTsKLQkKLQkJCQluZXdfc2tiLT5kZXYgPSBkZXY7Ci0JCQkJc2tiX3Jlc2VydmUoIG5ld19za2IsIDIgKTsKLQkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggbmV3X3NrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOwotCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyggdCApOwotCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAodTMyKSB0OwotCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAodTMyKSBuZXdfc2tiOwotCQkJfSBlbHNlIAotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7Ci0JCX0KKwlvdXR3KFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CiAKLQkJaGVhZF9saXN0LT5mb3J3YXJkID0gMDsKLQkJaGVhZF9saXN0LT5jU3RhdCA9IDA7Ci0JCXRhaWxfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4VGFpbDsKLQkJdGFpbF9saXN0LT5mb3J3YXJkID0gdmlydF90b19idXMoIGhlYWRfbGlzdCApOwotCi0JCUNJUkNfSU5DKCBwcml2LT5yeEhlYWQsIFRMQU5fTlVNX1JYX0xJU1RTICk7Ci0JCUNJUkNfSU5DKCBwcml2LT5yeFRhaWwsIFRMQU5fTlVNX1JYX0xJU1RTICk7Ci0JCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKLQl9CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CiAKLQlpZiAoIWFjaykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogUmVjZWl2ZWQgaW50ZXJydXB0IGZvciB1bmNvbXBsZXRlZCBSWCBmcmFtZS5cbiIpOwotCQorfQkJCQkvKiBUTGFuX0VlU2VuZFN0YXJ0ICovCiAKLQlpZiAoIGVvYyApIHsgCi0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogIEhhbmRsaW5nIFJYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+cnhIZWFkLCBwcml2LT5yeFRhaWwgKTsKLQkJaGVhZF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhIZWFkOwotCQlvdXRsKCB2aXJ0X3RvX2J1cyggaGVhZF9saXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7Ci0JCWFjayB8PSBUTEFOX0hDX0dPIHwgVExBTl9IQ19SVDsKLQkJcHJpdi0+cnhFb2NDb3VudCsrOwotCX0KLQotCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEICkgewotCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyB8IFRMQU5fTEVEX0FDVCApOwotCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSAgewotCQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKLQkJCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwotCQkJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKLQkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOwotCQkJcHJpdi0+dGltZXJUeXBlID0gVExBTl9USU1FUl9BQ1RJVklUWTsKLQkJCWFkZF90aW1lcigmcHJpdi0+dGltZXIpOwotCQl9IGVsc2UgaWYgKCBwcml2LT50aW1lclR5cGUgPT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsKLQkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOwotCQl9Ci0JfQogCi0JZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkKLQlyZXR1cm4gYWNrOwogCi19IC8qIFRMYW5fSGFuZGxlUnhFT0YgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZUR1bW15CisJICoJVExhbl9FZVNlbmRCeXRlCiAJICoKIAkgKglSZXR1cm5zOgotCSAqCQkxCi0JICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBEdW1teSBpbnRlcnJ1cHQsIHdoaWNoIGlzCi0JICoJcmFpc2VkIHdoZW5ldmVyIGEgdGVzdCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJ5IHNldHRpbmcKLQkgKgl0aGUgUmVxX0ludCBiaXQgb2YgSE9TVF9DTUQgdG8gMS4KKwkgKgkJSWYgdGhlIGNvcnJlY3QgYWNrIHdhcyByZWNlaXZlZCwgMCwgb3RoZXJ3aXNlIDEKKwkgKglQYXJtczoJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoJCWRhdGEJCVRoZSA4IGJpdHMgb2YgaW5mb3JtYXRpb24gdG8KKwkgKgkJCQlzZW5kIHRvIHRoZSBFRVBST00uCisJICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCisJICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorCSAqCQkJCWJ5dGUgaXMgc2VudCBhZnRlciB0aGUgYWNrIGlzCisJICoJCQkJcmVhZC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBieXRlIG9uIHRoZSBzZXJpYWwgRUVQUk9NIGxpbmUsCisJICoJZHJpdmluZyB0aGUgY2xvY2sgdG8gc2VuZCBlYWNoIGJpdC4gVGhlIGZ1bmN0aW9uIHRoZW4KKwkgKglyZXZlcnNlcyB0cmFuc21pc3Npb24gZGlyZWN0aW9uIGFuZCByZWFkcyBhbiBhY2tub3dsZWRnZQorCSAqCWJpdC4KIAkgKgogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyIFRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCitpbnQgVExhbl9FZVNlbmRCeXRlKHUxNiBpb19iYXNlLCB1OCBkYXRhLCBpbnQgc3RvcCkKIHsKLQlwcmludGsoICJUTEFOOiAgVGVzdCBpbnRlcnJ1cHQgb24gJXMuXG4iLCBkZXYtPm5hbWUgKTsKLQlyZXR1cm4gMTsKKwlpbnQgZXJyOworCXU4IHBsYWNlOworCXUxNiBzaW87CiAKLX0gLyogVExhbl9IYW5kbGVEdW1teSAqLworCW91dHcoVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZVR4RU9DCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkxCi0JICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBkcml2ZXIgaXMgc3RydWN0dXJlZCB0byBkZXRlcm1pbmUgRU9DIG9jY3VyYW5jZXMgYnkKLQkgKglyZWFkaW5nIHRoZSBDU1RBVCBtZW1iZXIgb2YgdGhlIGxpc3Qgc3RydWN0dXJlLiAgVHggRU9DCi0JICoJaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgdmlhIHRoZSBESU8gSU5URElTIHJlZ2lzdGVyLgotCSAqCUhvd2V2ZXIsIFRMQU4gY2hpcHMgYmVmb3JlIHJldmlzaW9uIDMuMCBkaWRuJ3QgaGF2ZSB0aGlzCi0JICoJZnVuY3Rpb25hbGl0eSwgc28gcHJvY2VzcyBFT0MgZXZlbnRzIGlmIHRoaXMgaXMgdGhlCi0JICoJY2FzZS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBBc3N1bWUgY2xvY2sgaXMgbG93LCB0eCBpcyBlbmFibGVkOyAqLworCWZvciAocGxhY2UgPSAweDgwOyBwbGFjZSAhPSAwOyBwbGFjZSA+Pj0gMSkgeworCQlpZiAocGxhY2UgJiBkYXRhKQorCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOworCQllbHNlCisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwl9CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCWVyciA9IFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CiAKLXUzMiBUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQotewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQlUTGFuTGlzdAkJKmhlYWRfbGlzdDsKLQl1MzIJCQlhY2sgPSAxOwotCQotCWhvc3RfaW50ID0gMDsKLQlpZiAoIHByaXYtPnRsYW5SZXYgPCAweDMwICkgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgSGFuZGxpbmcgVFggRU9DIChIZWFkPSVkIFRhaWw9JWQpIC0tIElSUVxuIiwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKLQkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOwotCQlpZiAoICggaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkgKSA9PSBUTEFOX0NTVEFUX1JFQURZICkgewotCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQkJb3V0bCggdmlydF90b19idXMoIGhlYWRfbGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOwotCQkJYWNrIHw9IFRMQU5fSENfR087Ci0JCX0gZWxzZSB7Ci0JCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAwOwotCQl9CisJaWYgKCghZXJyKSAmJiBzdG9wKSB7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CiAJfQogCi0JcmV0dXJuIGFjazsKKwlyZXR1cm4gKGVycik7CisKK30JCQkJLyogVExhbl9FZVNlbmRCeXRlICovCisKKwogCi19IC8qIFRMYW5fSGFuZGxlVHhFT0MgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZVN0YXR1c0NoZWNrCisJICoJVExhbl9FZVJlY2VpdmVCeXRlCiAJICoKIAkgKglSZXR1cm5zOgotCSAqCQkwIGlmIEFkYXB0ZXIgY2hlY2ssIDEgaWYgTmV0d29yayBTdGF0dXMgY2hlY2suCisJICoJCU5vdGhpbmcKIAkgKglQYXJtczoKLQkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcwotCSAqCQkJCXJhaXNlZC4KLQkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAotCSAqCQkJCXBvcnQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQWRhcHRlciBDaGVjay9OZXR3b3JrIFN0YXR1cwotCSAqCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBhZGFwdGVyLiAgSXQgY2hlY2tzIHRoZQotCSAqCXZlY3RvciBpbiB0aGUgSE9TVF9JTlQgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzCi0JICoJYW4gQWRhcHRlciBDaGVjayBpbnRlcnJ1cHQuICBJZiBzbywgaXQgcmVzZXRzIHRoZQotCSAqCWFkYXB0ZXIuICBPdGhlcndpc2UgaXQgY2xlYXJzIHRoZSBzdGF0dXMgcmVnaXN0ZXJzCi0JICoJYW5kIHNlcnZpY2VzIHRoZSBQSFkuCisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorCSAqCQkJCWRhdGEgc2VudCBmcm9tIHRoZSBFRVBST00uCisJICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCisJICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorCSAqCQkJCWJ5dGUgaXMgcmVjZWl2ZWQsIGFuZCBubyBhY2sgaXMKKwkgKgkJCQlzZW50LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiByZWNlaXZlcyA4IGJpdHMgb2YgZGF0YSBmcm9tIHRoZSBFRVBST00KKwkgKglvdmVyIHRoZSBzZXJpYWwgbGluay4gIEl0IHRoZW4gc2VuZHMgYW5kIGFjayBiaXQsIG9yIG5vCisJICoJYWNrIGFuZCBhIHN0b3AgYml0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlCisJICoJZGF0YSBhZnRlciB0aGUgYWRkcmVzcyBvZiBhIGJ5dGUgaW4gdGhlIEVFUFJPTSBoYXMgYmVlbgorCSAqCXNlbnQuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMiBUTGFuX0hhbmRsZVN0YXR1c0NoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQotewkKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTMyCQlhY2s7Ci0JdTMyCQllcnJvcjsKLQl1OAkJbmV0X3N0czsKLQl1MzIJCXBoeTsKLQl1MTYJCXRscGh5X2N0bDsKLQl1MTYJCXRscGh5X3N0czsKLQkKLQlhY2sgPSAxOwotCWlmICggaG9zdF9pbnQgJiBUTEFOX0hJX0lWX01BU0sgKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOwotCQllcnJvciA9IGlubCggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJcHJpbnRrKCAiVExBTjogICVzOiBBZGFwdG9yIEVycm9yID0gMHgleFxuIiwgZGV2LT5uYW1lLCBlcnJvciApOwotCQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7Ci0JCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKLQkJCi0JCXF1ZXVlX3Rhc2soJnByaXYtPnRsYW5fdHF1ZXVlLCAmdHFfaW1tZWRpYXRlKTsKLQkJbWFya19iaChJTU1FRElBVEVfQkgpOwotCQkKLQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCQlhY2sgPSAwOwotCX0gZWxzZSB7Ci0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogU3RhdHVzIENoZWNrXG4iLCBkZXYtPm5hbWUgKTsKLQkJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07Cit2b2lkIFRMYW5fRWVSZWNlaXZlQnl0ZSh1MTYgaW9fYmFzZSwgdTggKiBkYXRhLCBpbnQgc3RvcCkKK3sKKwl1OCBwbGFjZTsKKwl1MTYgc2lvOwogCi0JCW5ldF9zdHMgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfU1RTICk7Ci0JCWlmICggbmV0X3N0cyApIHsKLQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfU1RTLCBuZXRfc3RzICk7Ci0JCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6ICAgIE5ldF9TdHMgPSAleFxuIiwgZGV2LT5uYW1lLCAodW5zaWduZWQpIG5ldF9zdHMgKTsKLQkJfQotCQlpZiAoICggbmV0X3N0cyAmIFRMQU5fTkVUX1NUU19NSVJRICkgJiYgICggcHJpdi0+cGh5TnVtID09IDAgKSApIHsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfU1RTLCAmdGxwaHlfc3RzICk7Ci0JCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRscGh5X2N0bCApOwotICAgICAgICAJCWlmICggISAoIHRscGh5X3N0cyAmIFRMQU5fVFNfUE9MT0sgKSAmJiAhICggdGxwaHlfY3RsICYgVExBTl9UQ19TV0FQT0wgKSApIHsKLSAgICAgICAgICAgICAgICAJCXRscGh5X2N0bCB8PSBUTEFOX1RDX1NXQVBPTDsKLSAgICAgICAgICAgICAgICAJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGxwaHlfY3RsKTsKLSAgICAgICAgCQl9IGVsc2UgaWYgKCAoIHRscGh5X3N0cyAmIFRMQU5fVFNfUE9MT0sgKSAmJiAoIHRscGh5X2N0bCAmIFRMQU5fVENfU1dBUE9MICkgKSB7Ci0gICAgICAgICAgICAgICAgCQl0bHBoeV9jdGwgJj0gflRMQU5fVENfU1dBUE9MOwotICAgICAgICAgICAgICAgIAkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwpOwotICAgICAgICAJCX0KKwlvdXR3KFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJKmRhdGEgPSAwOwogCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlUTGFuX1BoeVByaW50KCBkZXYgKTsJCQotCQkJfQotCQl9CisJLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvKTsKKwlmb3IgKHBsYWNlID0gMHg4MDsgcGxhY2U7IHBsYWNlID4+PSAxKSB7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJaWYgKFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKSkKKwkJCSpkYXRhIHw9IHBsYWNlOworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwl9CisKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CisJaWYgKCFzdG9wKSB7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwkvKiBBY2sgPSAwICovCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJfSBlbHNlIHsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwkvKiBObyBhY2sgPSAxICg/KSAqLworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogU1RPUCwgcmFpc2UgZGF0YSB3aGlsZSBjbG9jayBpcyBoaWdoICovCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwogCX0KIAotCXJldHVybiBhY2s7Cit9CQkJCS8qIFRMYW5fRWVSZWNlaXZlQnl0ZSAqLworCiAKLX0gLyogVExhbl9IYW5kbGVTdGF0dXNDaGVjayAqLwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSGFuZGxlUnhFT0MKKwkgKglUTGFuX0VlUmVhZEJ5dGUKIAkgKgogCSAqCVJldHVybnM6Ci0JICoJCTEKKwkgKgkJTm8gZXJyb3IgPSAwLCBlbHNlLCB0aGUgc3RhZ2UgYXQgd2hpY2ggdGhlIGVycm9yCisJICoJCW9jY3VycmVkLgogCSAqCVBhcm1zOgotCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCi0JICoJCQkJcmFpc2VkLgotCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCi0JICoJCQkJcG9ydC4KLQkgKgotCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cmFuY2VzIGJ5Ci0JICoJcmVhZGluZyB0aGUgQ1NUQVQgbWVtYmVyIG9mIHRoZSBsaXN0IHN0cnVjdHVyZS4gIFJ4IEVPQwotCSAqCWludGVycnVwdHMgYXJlIGRpc2FibGVkIHZpYSB0aGUgRElPIElOVERJUyByZWdpc3Rlci4KLQkgKglIb3dldmVyLCBUTEFOIGNoaXBzIGJlZm9yZSByZXZpc2lvbiAzLjAgZGlkbid0IGhhdmUgdGhpcwotCSAqCUNTVEFUIG1lbWJlciBvciBhIElOVERJUyByZWdpc3Rlciwgc28gaWYgdGhpcyBjaGlwIGlzCi0JICoJcHJlLTMuMCwgcHJvY2VzcyBFT0MgaW50ZXJydXB0cyBub3JtYWxseS4KKwkgKgkJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoJCWVlX2FkZHIJCVRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGluIHRoZQorCSAqCQkJCUVFUFJPTSB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUKKwkgKgkJCQlyZXRyaWV2ZWQuCisJICoJCWRhdGEJCUFuIGFkZHJlc3MgdG8gYSBjaGFyIHRvIGhvbGQgdGhlCisJICoJCQkJZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBFRVBST00uCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgYnl0ZSBvZiBpbmZvcm1hdGlvbiBmcm9tIGFuIGJ5dGUKKwkgKgljZWxsIGluIHRoZSBFRVBST00uCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMiBUTGFuX0hhbmRsZVJ4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoraW50IFRMYW5fRWVSZWFkQnl0ZSh1MTYgaW9fYmFzZSwgdTggZWVfYWRkciwgdTggKiBkYXRhKQogewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQlUTGFuTGlzdAkqaGVhZF9saXN0OwotCXUzMgkJYWNrID0gMTsKKwlpbnQgZXJyOworCWludCByZXQgPSAwOwogCi0JaWYgKCAgcHJpdi0+dGxhblJldiA8IDB4MzAgKSB7Ci0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogIEhhbmRsaW5nIFJYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKSAtLSBJUlFcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7Ci0JCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKLQkJb3V0bCggdmlydF90b19idXMoIGhlYWRfbGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOwotCQlhY2sgfD0gVExBTl9IQ19HTyB8IFRMQU5fSENfUlQ7Ci0JCXByaXYtPnJ4RW9jQ291bnQrKzsKKworCVRMYW5fRWVTZW5kU3RhcnQoaW9fYmFzZSk7CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKGlvX2Jhc2UsIDB4QTAsIFRMQU5fRUVQUk9NX0FDSyk7CisJaWYgKGVycikgeworCQlyZXQgPSAxOworCQlnb3RvIGZhaWw7CisJfQorCWVyciA9IFRMYW5fRWVTZW5kQnl0ZShpb19iYXNlLCBlZV9hZGRyLCBUTEFOX0VFUFJPTV9BQ0spOworCWlmIChlcnIpIHsKKwkJcmV0ID0gMjsKKwkJZ290byBmYWlsOworCX0KKwlUTGFuX0VlU2VuZFN0YXJ0KGlvX2Jhc2UpOworCWVyciA9IFRMYW5fRWVTZW5kQnl0ZShpb19iYXNlLCAweEExLCBUTEFOX0VFUFJPTV9BQ0spOworCWlmIChlcnIpIHsKKwkJcmV0ID0gMzsKKwkJZ290byBmYWlsOwogCX0KKwlUTGFuX0VlUmVjZWl2ZUJ5dGUoaW9fYmFzZSwgZGF0YSwgVExBTl9FRVBST01fU1RPUCk7CisgICAgICBmYWlsOgogCi0JcmV0dXJuIGFjazsKKwlyZXR1cm4gcmV0OworCit9CQkJCS8qIFRMYW5fRWVSZWFkQnl0ZSAqLwogCi19IC8qIFRMYW5fSGFuZGxlUnhFT0MgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotCVRodW5kZXJMQU4gRHJpdmVyIFRpbWVyIEZ1bmN0aW9uCisJVGh1bmRlckxBTiBEcml2ZXIgTUlJIFJvdXRpbmVzCisKKwlUaGVzZSByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIENoYXAuIDIgb2YgdGhlCisJIlRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlIiwgcHAuIDE1LTI0LgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9UaW1lcgorCSAqCVRMYW5fTWlpUmVhZFJlZwogCSAqCiAJICoJUmV0dXJuczoKLQkgKgkJTm90aGluZworCSAqCQkwCWlmIGFjayByZWNlaXZlZCBvaworCSAqCQkxCW90aGVyd2lzZS4KKwkgKgogCSAqCVBhcm1zOgotCSAqCQlkYXRhCUEgdmFsdWUgZ2l2ZW4gdG8gYWRkIHRpbWVyIHdoZW4KLQkgKgkJCWFkZF90aW1lciB3YXMgY2FsbGVkLgorCSAqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcKKwkgKgkJCQlUaGUgaW8gYWRkcmVzcyBhbmQgaW50ZXJydXB0IGNvdW50CisJICoJCQkJZm9yIHRoaXMgZGV2aWNlLgorCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KKwkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJcmV0cmVpdmVkLgorCSAqCQl2YWwJCUEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZQorCSAqCQkJCXJldHJpZXZlZCB2YWx1ZS4KIAkgKgotCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aW1lZCBmdW5jdGlvbmFsaXR5IGZvciB0aGUKLQkgKglUTEFOIGRyaXZlci4gIFRoZSB0d28gY3VycmVudCB0aW1lciB1c2VzIGFyZSBmb3IKLQkgKglkZWxheWluZyBmb3IgYXV0b25lZ290aW9uYXRpb24gYW5kIGRyaXZpbmcgdGhlIEFDVCBMRUQuCi0JICoJLQlBdXRvbmVnb3RpYXRpb24gcmVxdWlyZXMgYmVpbmcgYWxsb3dlZCBhYm91dAotCSAqCQkyIDEvMiBzZWNvbmRzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHRyYW5zbWl0IGEKLQkgKgkJcGFja2V0LiAgSXQgd291bGQgYmUgYSB2ZXJ5IGJhZCB0aGluZyB0byBoYW5nCi0JICoJCXRoZSBrZXJuZWwgdGhpcyBsb25nLCBzbyB0aGUgZHJpdmVyIGRvZXNuJ3QKLQkgKgkJYWxsb3cgdHJhbnNtaXNzaW9uICd0aWwgYWZ0ZXIgdGhpcyB0aW1lLCBmb3IKLQkgKgkJY2VydGFpbiBQSFlzLiAgSXQgd291bGQgYmUgbXVjaCBuaWNlciBpZiBhbGwKLQkgKgkJUEhZcyB3ZXJlIGludGVycnVwdC1jYXBhYmxlIGxpa2UgdGhlIGludGVybmFsCi0JICoJCVBIWS4KLQkgKgktCVRoZSBBQ1QgTEVELCB3aGljaCBzaG93cyBhZGFwdGVyIGFjdGl2aXR5LCBpcwotCSAqCQlkcml2ZW4gYnkgdGhlIGRyaXZlciwgYW5kIHNvIG11c3QgYmUgbGVmdCBvbgotCSAqCQlmb3IgYSBzaG9ydCBwZXJpb2QgdG8gcG93ZXIgdXAgdGhlIExFRCBzbyBpdAotCSAqCQljYW4gYmUgc2Vlbi4gIFRoaXMgZGVsYXkgY2FuIGJlIGNoYW5nZWQgYnkKLQkgKgkJY2hhbmdpbmcgdGhlIFRMQU5fVElNRVJfQUNUX0RFTEFZIGluIHRsYW4uaCwKLQkgKgkJaWYgZGVzaXJlZC4gIDEwMCBtcyAgcHJvZHVjZXMgYSBzbGlnaHRseQotCSAqCQlzbHVnZ2lzaCByZXNwb25zZS4KKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHJldHJlaXZlIHRoZSBjb250ZW50cworCSAqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbworCSAqCWFuZCB0aGVuIHJlYWRzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGJ1cyB2aWEKKwkgKgl0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgVExhbl9UaW1lciggdW5zaWduZWQgbG9uZyBkYXRhICkKK2ludCBUTGFuX01paVJlYWRSZWcoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MTYgcGh5LCB1MTYgcmVnLCB1MTYgKiB2YWwpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOwotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1MzIJCWVsYXBzZWQ7Ci0JdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7Ci0KLQlwcml2LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7Ci0KLQlzd2l0Y2ggKCBwcml2LT50aW1lclR5cGUgKSB7Ci0jaWZkZWYgTU9OSVRPUgkJCi0JCWNhc2UgVExBTl9USU1FUl9MSU5LX0JFQVQ6Ci0JCQlUTGFuX1BoeU1vbml0b3IoIGRldiApOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QRE9XTjoKLQkJCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKLQkJCWJyZWFrOwotCQljYXNlIFRMQU5fVElNRVJfUEhZX1BVUDoKLQkJCVRMYW5fUGh5UG93ZXJVcCggZGV2ICk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTEFOX1RJTUVSX1BIWV9SRVNFVDoKLQkJCVRMYW5fUGh5UmVzZXQoIGRldiApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSzoKLQkJCVRMYW5fUGh5U3RhcnRMaW5rKCBkZXYgKTsKLQkJCWJyZWFrOwotCQljYXNlIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTjoKLQkJCVRMYW5fUGh5RmluaXNoQXV0b05lZyggZGV2ICk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVDoKLQkJCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVExBTl9USU1FUl9BQ1RJVklUWToKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSB7Ci0JCQkJZWxhcHNlZCA9IGppZmZpZXMgLSBwcml2LT50aW1lclNldEF0OwotCQkJCWlmICggZWxhcHNlZCA+PSBUTEFOX1RJTUVSX0FDVF9ERUxBWSApIHsKLQkJCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKLQkJCQl9IGVsc2UgIHsKLQkJCQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKLQkJCQkJcHJpdi0+dGltZXIuZXhwaXJlcyA9IHByaXYtPnRpbWVyU2V0QXQgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJCQlhZGRfdGltZXIoICZwcml2LT50aW1lciApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCXU4IG5hY2s7CisJdTE2IHNpbywgdG1wOworCXUzMiBpOworCWludCBlcnI7CisJaW50IG1pbnRlbjsKKworCWVyciA9IEZBTFNFOworCW91dHcoVExBTl9ORVRfU0lPLCBCQVNFICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBCQVNFICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fTWlpU3luYyhCQVNFKTsKKworCW1pbnRlbiA9IFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisJaWYgKG1pbnRlbikKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDEsIDIpOwkvKiBTdGFydCAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDIsIDIpOwkvKiBSZWFkICAoIDEwYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCBwaHksIDUpOwkvKiBEZXZpY2UgIyAgICAgICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCByZWcsIDUpOwkvKiBSZWdpc3RlciAjICAgICovCisKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOwkvKiBDaGFuZ2UgZGlyZWN0aW9uICovCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkvKiBDbG9jayBJZGxlIGJpdCAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CS8qIFdhaXQgMzAwbnMgKi8KKworCW5hY2sgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CS8qIENoZWNrIGZvciBBQ0sgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogRmluaXNoIEFDSyAqLworCWlmIChuYWNrKSB7CQkvKiBObyBBQ0ssIHNvIGZha2UgaXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJfQorCQl0bXAgPSAweGZmZmY7CisJCWVyciA9IFRSVUU7CisJfSBlbHNlIHsJCS8qIEFDSywgc28gcmVhZCBkYXRhICovCisJCWZvciAodG1wID0gMCwgaSA9IDB4ODAwMDsgaTsgaSA+Pj0gMSkgeworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJCWlmIChUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbykpCisJCQkJdG1wIHw9IGk7CisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJfQogCX0KIAotfSAvKiBUTGFuX1RpbWVyICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwogCi0JVGh1bmRlckxBTiBEcml2ZXIgQWRhcHRlciBSZWxhdGVkIFJvdXRpbmVzCisJaWYgKG1pbnRlbikKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkqdmFsID0gdG1wOworCisJcmV0dXJuIGVycjsKKworfQkJCQkvKiBUTGFuX01paVJlYWRSZWcgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1Jlc2V0TGlzdHMKLQkgKiAgCisJICoJVExhbl9NaWlTZW5kRGF0YQorCSAqCiAJICoJUmV0dXJuczoKIAkgKgkJTm90aGluZwogCSAqCVBhcm1zOgotCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAotCSAqCQkJc3R1Y3R1cmVzIHRvIGJlIHJlc2V0LgorCSAqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlcglpbgorCSAqCQkJCXF1ZXN0aW9uLgorCSAqCQlkZXYJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KKwkgKgkJZGF0YQkJVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KKwkgKgkJbnVtX2JpdHMJVGhlIG51bWJlciBvZiBiaXRzIGluIGRhdGEgdGhhdCBhcmUgdG8KKwkgKgkJCQliZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCiAJICoKLQkgKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBtYW5hZ2luZwotCSAqCXRoZSBUTEFOIGxpc3RzIHRvIHRoZWlyIGluaXRpYWwgdmFsdWVzLgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgb24gc2VxdWVuY2Ugb2YgYml0cyBvbiB0aGUgTUlJCisJICoJY29uZmlndXJhdGlvbiBidXMuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgVExhbl9SZXNldExpc3RzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgVExhbl9NaWlTZW5kRGF0YSh1MTYgYmFzZV9wb3J0LCB1MzIgZGF0YSwgdW5zaWduZWQgbnVtX2JpdHMpCiB7Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCWludAkJaTsKLQlUTGFuTGlzdAkqbGlzdDsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCXZvaWQJCSp0ID0gTlVMTDsKKwl1MTYgc2lvOworCXUzMiBpOwogCi0JcHJpdi0+dHhIZWFkID0gMDsKLQlwcml2LT50eFRhaWwgPSAwOwotCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKLQkJbGlzdCA9IHByaXYtPnR4TGlzdCArIGk7Ci0JCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7Ci0JCWlmICggYmJ1ZiApIHsKLQkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXMoIHByaXYtPnR4QnVmZmVyICsgKCBpICogVExBTl9NQVhfRlJBTUVfU0laRSApICk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IDA7Ci0JCX0KLQkJbGlzdC0+YnVmZmVyWzJdLmNvdW50ID0gMDsKLQkJbGlzdC0+YnVmZmVyWzJdLmFkZHJlc3MgPSAwOwotCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7Ci0JfQorCWlmIChudW1fYml0cyA9PSAwKQorCQlyZXR1cm47CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBiYXNlX3BvcnQgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsKIAotCXByaXYtPnJ4SGVhZCA9IDA7Ci0JcHJpdi0+cnhUYWlsID0gVExBTl9OVU1fUlhfTElTVFMgLSAxOwotCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKLQkJbGlzdCA9IHByaXYtPnJ4TGlzdCArIGk7Ci0JCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKLQkJbGlzdC0+ZnJhbWVTaXplID0gVExBTl9NQVhfRlJBTUVfU0laRTsKLQkJbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gVExBTl9NQVhfRlJBTUVfU0laRSB8IFRMQU5fTEFTVF9CVUZGRVI7Ci0JCWlmICggYmJ1ZiApIHsKLQkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXMoIHByaXYtPnJ4QnVmZmVyICsgKCBpICogVExBTl9NQVhfRlJBTUVfU0laRSApICk7Ci0JCX0gZWxzZSB7Ci0JCQlza2IgPSBkZXZfYWxsb2Nfc2tiKCBUTEFOX01BWF9GUkFNRV9TSVpFICsgNyApOwotCQkJaWYgKCBza2IgPT0gTlVMTCApIHsKLQkJCQlwcmludGsoICJUTEFOOiAgQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWNlaXZlZCBkYXRhLlxuIiApOwotCQkJCS8qIElmIHRoaXMgZXZlciBoYXBwZW5lZCBpdCB3b3VsZCBiZSBhIHByb2JsZW0gKi8KLQkJCX0gZWxzZSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7Ci0JCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwotCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KCBza2IsIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKLQkJCX0KLQkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXMoIHQgKTsKLQkJCWxpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gKHUzMikgdDsKLQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gKHUzMikgc2tiOwotCQl9Ci0JCWxpc3QtPmJ1ZmZlclsxXS5jb3VudCA9IDA7Ci0JCWxpc3QtPmJ1ZmZlclsxXS5hZGRyZXNzID0gMDsKLQkJaWYgKCBpIDwgVExBTl9OVU1fUlhfTElTVFMgLSAxICkKLQkJCWxpc3QtPmZvcndhcmQgPSB2aXJ0X3RvX2J1cyggbGlzdCArIDEgKTsKKwlmb3IgKGkgPSAoMHgxIDw8IChudW1fYml0cyAtIDEpKTsgaTsgaSA+Pj0gMSkgeworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkodm9pZCkgVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCWlmIChkYXRhICYgaSkKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKTsKIAkJZWxzZQotCQkJbGlzdC0+Zm9yd2FyZCA9IDA7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKTsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCSh2b2lkKSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKIAl9CiAKLX0gLyogVExhbl9SZXNldExpc3RzICovCit9CQkJCS8qIFRMYW5fTWlpU2VuZERhdGEgKi8KIAotdm9pZCBUTGFuX0ZyZWVMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCWludAkJaTsKLQlUTGFuTGlzdAkqbGlzdDsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCi0JaWYgKCAhIGJidWYgKSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKLQkJCWxpc3QgPSBwcml2LT50eExpc3QgKyBpOwotCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzOwotCQkJaWYgKCBza2IgKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOwotCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKLQkJCX0KLQkJfQogCi0JCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKLQkJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOwotCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzOwotCQkJaWYgKCBza2IgKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOwotCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKLQkJCX0KLQkJfQotCX0KIAotfSAvKiBUTGFuX0ZyZWVMaXN0cyAqLwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fUHJpbnREaW8KLQkgKiAgCisJICoJVExhbl9NaWlTeW5jCisJICoKIAkgKglSZXR1cm5zOgogCSAqCQlOb3RoaW5nCiAJICoJUGFybXM6Ci0JICoJCWlvX2Jhc2UJCUJhc2UgSU8gcG9ydCBvZiB0aGUgZGV2aWNlIG9mCi0JICoJCQkJd2hpY2ggdG8gcHJpbnQgRElPIHJlZ2lzdGVycy4KKwkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIgaW4KKwkgKgkJCQlxdWVzdGlvbi4KIAkgKgotCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBhbGwgdGhlIGludGVybmFsIChESU8pCi0JICoJcmVnaXN0ZXJzIG9mIGEgVExBTiBjaGlwLgorCSAqCVRoaXMgZnVuY3Rpb25zIHN5bmNzIGFsbCBQSFlzIGluIHRlcm1zIG9mIHRoZSBNSUkgY29uZmlndXJhdGlvbgorCSAqCWJ1cy4KIAkgKgogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBUTGFuX1ByaW50RGlvKCB1MTYgaW9fYmFzZSApCit2b2lkIFRMYW5fTWlpU3luYyh1MTYgYmFzZV9wb3J0KQogewotCXUzMiBkYXRhMCwgZGF0YTE7Ci0JaW50CWk7CisJaW50IGk7CisJdTE2IHNpbzsKIAotCXByaW50ayggIlRMQU46ICAgQ29udGVudHMgb2YgaW50ZXJuYWwgcmVnaXN0ZXJzIGZvciBpbyBiYXNlIDB4JTA0aHguXG4iLCBpb19iYXNlICk7Ci0JcHJpbnRrKCAiVExBTjogICAgICBPZmYuICArMCAgICAgICAgICs0XG4iICk7Ci0JZm9yICggaSA9IDA7IGkgPCAweDRDOyBpKz0gOCApIHsKLQkJZGF0YTAgPSBUTGFuX0Rpb1JlYWQzMiggaW9fYmFzZSwgaSApOwotCQlkYXRhMSA9IFRMYW5fRGlvUmVhZDMyKCBpb19iYXNlLCBpICsgMHg0ICk7Ci0JCXByaW50ayggIlRMQU46ICAgICAgMHglMDJ4ICAweCUwOHggMHglMDh4XG4iLCBpLCBkYXRhMCwgZGF0YTEgKTsKKwlvdXR3KFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBiYXNlX3BvcnQgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyk7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CiAJfQogCi19IC8qIFRMYW5fUHJpbnREaW8gKi8KK30JCQkJLyogVExhbl9NaWlTeW5jICovCisKKworCiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9QcmludExpc3QKLQkgKiAgCisJICoJVExhbl9NaWlXcml0ZVJlZworCSAqCiAJICoJUmV0dXJuczoKIAkgKgkJTm90aGluZwogCSAqCVBhcm1zOgotCSAqCQlsaXN0CUEgcG9pbnRlciB0byB0aGUgVExhbkxpc3Qgc3RydWN0dXJlIHRvCi0JICoJCQliZSBwcmludGVkLgotCSAqCQl0eXBlCUEgc3RyaW5nIHRvIGRlc2lnbmF0ZSB0eXBlIG9mIGxpc3QsCi0JICoJCQkiUngiIG9yICJUeCIuCi0JICoJCW51bQlUaGUgaW5kZXggb2YgdGhlIGxpc3QuCisJICoJCWRldgkJVGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKwkgKgkJCQl0byB3cml0ZSB0by4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHdyaXR0ZW4gdG8uCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXdyaXR0ZW4uCisJICoJCXZhbAkJVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHJlZ2lzdGVyLgogCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdAotCSAqCXBvaW50ZWQgdG8gYnkgdGhlIGxpc3QgcGFyYW1ldGVyLgorCSAqCVRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgVExBTidzIE1JSSBidXMgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEKKwkgKglnaXZlbiByZWdpc3RlciBvbiBhIFBIWS4gIEl0IHNlbmRzIHRoZSBhcHByb3ByaWF0ZSBpbmZvIGFuZCB0aGVuCisJICoJd3JpdGVzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGNvbmZpZ3VyYXRpb24gYnVzCisJICoJdmlhIHRoZSBUTEFOIFNJTyByZWdpc3Rlci4KIAkgKgogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBUTGFuX1ByaW50TGlzdCggVExhbkxpc3QgKmxpc3QsIGNoYXIgKnR5cGUsIGludCBudW0pCit2b2lkIFRMYW5fTWlpV3JpdGVSZWcoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MTYgcGh5LCB1MTYgcmVnLCB1MTYgdmFsKQogewotCWludCBpOworCXUxNiBzaW87CisJaW50IG1pbnRlbjsKKworCW91dHcoVExBTl9ORVRfU0lPLCBCQVNFICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBCQVNFICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fTWlpU3luYyhCQVNFKTsKKworCW1pbnRlbiA9IFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisJaWYgKG1pbnRlbikKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDEsIDIpOwkvKiBTdGFydCAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDEsIDIpOwkvKiBXcml0ZSAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCBwaHksIDUpOwkvKiBEZXZpY2UgIyAgICAgICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCByZWcsIDUpOwkvKiBSZWdpc3RlciAjICAgICovCisKKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIDB4MiwgMik7CS8qIFNlbmQgQUNLICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCB2YWwsIDE2KTsJLyogU2VuZCBEYXRhICovCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkvKiBJZGxlIGN5Y2xlICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisKKwlpZiAobWludGVuKQorCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOwogCi0JcHJpbnRrKCAiVExBTjogICAlcyBMaXN0ICVkIGF0IDB4JTA4eFxuIiwgdHlwZSwgbnVtLCAodTMyKSBsaXN0ICk7Ci0JcHJpbnRrKCAiVExBTjogICAgICBGb3J3YXJkICAgID0gMHglMDh4XG4iLCAgbGlzdC0+Zm9yd2FyZCApOwotCXByaW50ayggIlRMQU46ICAgICAgQ1NUQVQgICAgICA9IDB4JTA0aHhcbiIsIGxpc3QtPmNTdGF0ICk7Ci0JcHJpbnRrKCAiVExBTjogICAgICBGcmFtZSBTaXplID0gMHglMDRoeFxuIiwgbGlzdC0+ZnJhbWVTaXplICk7Ci0JLyogZm9yICggaSA9IDA7IGkgPCAxMDsgaSsrICkgeyAqLwotCWZvciAoIGkgPSAwOyBpIDwgMjsgaSsrICkgewotCQlwcmludGsoICJUTEFOOiAgICAgIEJ1ZmZlclslZF0uY291bnQsIGFkZHIgPSAweCUwOHgsIDB4JTA4eFxuIiwgaSwgbGlzdC0+YnVmZmVyW2ldLmNvdW50LCBsaXN0LT5idWZmZXJbaV0uYWRkcmVzcyApOwotCX0KIAotfSAvKiBUTGFuX1ByaW50TGlzdCAqLworfQkJCQkvKiBUTGFuX01paVdyaXRlUmVnICovCiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cworCSAqCVRMYW5fU2V0TWFjCiAJICoKIAkgKglSZXR1cm5zOgogCSAqCQlOb3RoaW5nCiAJICoJUGFybXM6CiAJICoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgotCSAqCQkJdG8gd2hpY2ggdG8gcmVhZCBzdGF0cy4KLQkgKgkJcmVjb3JkCUZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGFkZCAKKwkgKgkJCW9uIHdoaWNoIHRvIGNoYW5nZSB0aGUgQVJFRy4KKwkgKgkJYXJlZwlUaGUgQVJFRyB0byBzZXQgdGhlIGFkZHJlc3MgaW4gKDAgLSAzKS4KKwkgKgkJbWFjCUEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycy4gIEVhY2gKKwkgKgkJCWVsZW1lbnQgc3RvcmVzIG9uZSBieXRlIG9mIHRoZSBhZGRyZXNzLgorCSAqCQkJSUUsIGl0IGlzbid0IGluIGFzY2lpLgogCSAqCi0JICoJVGhpcyBmdW5jdGlvbnMgcmVhZHMgYWxsIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXJzCi0JICoJb2YgdGhlIFRMQU4gY2hpcCwgd2hpY2ggY2xlYXJzIHRoZW0gYXMgYSBzaWRlIGVmZmVjdC4KLQkgKglJdCB0aGVuIGVpdGhlciBhZGRzIHRoZSB2YWx1ZXMgdG8gdGhlIGRldmljZSdzIHN0YXR1cwotCSAqCXN0cnVjdCwgb3IgZGlzY2FyZHMgdGhlbSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcmVjb3JkCi0JICoJaXMgVExBTl9SRUNPUkQgKCE9MCkgIG9yIFRMQU5fSUdOT1JFICg9PTApLgorCSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIGEgTUFDIGFkZHJlc3MgdG8gb25lIG9mIHRoZQorCSAqCVRMQU4gQVJFR3MgKGFkZHJlc3MgcmVnaXN0ZXJzKS4gIFRoZSBUTEFOIGNoaXAgbG9ja3MKKwkgKgl0aGUgcmVnaXN0ZXIgb24gd3JpdGluZyB0byBvZmZzZXQgMCBhbmQgdW5sb2NrcyB0aGUKKwkgKglyZWdpc3RlciBhZnRlciB3cml0aW5nIHRvIG9mZnNldCA1LiAgSWYgTlVMTCBpcyBwYXNzZWQKKwkgKglpbiBtYWMsIHRoZW4gdGhlIEFSRUcgaXMgZmlsbGVkIHdpdGggMCdzLgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIFRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWNvcmQgKQordm9pZCBUTGFuX1NldE1hYyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBhcmVnLCBjaGFyICptYWMpCiB7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUzMgkJdHhfZ29vZCwgdHhfdW5kZXI7Ci0JdTMyCQlyeF9nb29kLCByeF9vdmVyOwotCXUzMgkJZGVmX3R4LCBjcmMsIGNvZGU7Ci0JdTMyCQltdWx0aV9jb2wsIHNpbmdsZV9jb2w7Ci0JdTMyCQlleGNlc3NfY29sLCBsYXRlX2NvbCwgbG9zczsKLQotCW91dHcoIFRMQU5fR09PRF9UWF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCXR4X2dvb2QgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKLQl0eF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7Ci0JdHhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKSA8PCAxNjsKLQl0eF91bmRlciA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOwotCi0Jb3V0dyggVExBTl9HT09EX1JYX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7Ci0JcnhfZ29vZCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOwotCXJ4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKLQlyeF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApIDw8IDE2OwotCXJ4X292ZXIgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7Ci0JCQotCW91dHcoIFRMQU5fREVGRVJSRURfVFgsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7Ci0JZGVmX3R4ICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7Ci0JZGVmX3R4ICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7Ci0JY3JjICAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApOwotCWNvZGUgICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKLQkKLQlvdXR3KCBUTEFOX01VTFRJQ09MX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7Ci0JbXVsdGlfY29sICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOwotCW11bHRpX2NvbCAgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKLQlzaW5nbGVfY29sICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApOwotCXNpbmdsZV9jb2wgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICkgPDwgODsKLQotCW91dHcoIFRMQU5fRVhDRVNTQ09MX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7Ci0JZXhjZXNzX2NvbCA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7Ci0JbGF0ZV9jb2wgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApOwotCWxvc3MgICAgICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKTsKLQotCWlmICggcmVjb3JkICkgewotCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzICs9IHJ4X2dvb2Q7Ci0JCXByaXYtPnN0YXRzLnJ4X2Vycm9ycyAgKz0gcnhfb3ZlciArIGNyYyArIGNvZGU7Ci0JCXByaXYtPnN0YXRzLnR4X3BhY2tldHMgKz0gdHhfZ29vZDsKLQkJcHJpdi0+c3RhdHMudHhfZXJyb3JzICArPSB0eF91bmRlciArIGxvc3M7Ci0JCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gbXVsdGlfY29sICsgc2luZ2xlX2NvbCArIGV4Y2Vzc19jb2wgKyBsYXRlX2NvbDsKLQotCQlwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycyAgICArPSByeF9vdmVyOwotCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICAgICArPSBjcmM7Ci0JCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyAgICs9IGNvZGU7CisJaW50IGk7CiAKLQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgKz0gdHhfdW5kZXI7Ci0JCXByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICs9IGxvc3M7CisJYXJlZyAqPSA2OworCisJaWYgKG1hYyAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX0FSRUdfMCArIGFyZWcgKyBpLAorCQkJCSAgICAgICBtYWNbaV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX0FSRUdfMCArIGFyZWcgKyBpLCAwKTsKIAl9Ci0JCQkKLX0gLyogVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyAqLwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fUmVzZXQKK30JCQkJLyogVExhbl9TZXRNYWMgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1BoeURldGVjdAogCSAqCiAJICoJUmV0dXJuczoKLQkgKgkJMAorCSAqCQlOb3RoaW5nCiAJICoJUGFybXM6Ci0JICoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgotCSAqCQkJdG8gYmUgcmVzZXQuCisJICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlIGFkYXB0ZXIKKwkgKgkJCWZvciB3aGljaCB0aGUgUEhZIG5lZWRzIGRldGVybWluZWQuCiAJICoKLQkgKglUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgYWRhcHRlciBhbmQgaXQncyBwaHlzaWNhbAotCSAqCWRldmljZS4gIFNlZSBDaGFwLiAzLCBwcC4gOS0xMCBvZiB0aGUgIlRodW5kZXJMQU4KLQkgKglQcm9ncmFtbWVyJ3MgR3VpZGUiIGZvciBkZXRhaWxzLiAgVGhlIHJvdXRpbmUgdHJpZXMgdG8KLQkgKglpbXBsZW1lbnQgd2hhdCBpcyBkZXRhaWxlZCB0aGVyZSwgdGhvdWdoIGFkanVzdG1lbnRzCi0JICoJaGF2ZSBiZWVuIG1hZGUuCisJICoJU28gZmFyIEkndmUgZm91bmQgdGhhdCBhZGFwdGVycyB3aGljaCBoYXZlIGV4dGVybmFsIFBIWXMKKwkgKgltYXkgYWxzbyB1c2UgdGhlIGludGVybmFsIFBIWSBmb3IgcGFydCBvZiB0aGUgZnVuY3Rpb25hbGl0eS4KKwkgKgkoZWcsIEFVSS9UaGlubmV0KS4gIFRoaXMgZnVuY3Rpb24gZmluZHMgb3V0IGlmIHRoaXMgVExBTgorCSAqCWNoaXAgaGFzIGFuIGludGVybmFsIFBIWSwgYW5kIHRoZW4gZmluZHMgdGhlIGZpcnN0IGV4dGVybmFsCisJICoJUEhZIChzdGFydGluZyBmcm9tIGFkZHJlc3MgMCkgaWYgaXQgZXhpc3RzKS4KIAkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLVRMYW5fUmVzZXRBZGFwdGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgVExhbl9QaHlEZXRlY3Qoc3RydWN0IG5pYyAqbmljKQogewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQlpbnQJCWk7Ci0JdTMyCQlhZGRyOwotCXUzMgkJZGF0YTsKLQl1OAkJZGF0YTg7CisJdTE2IGNvbnRyb2w7CisJdTE2IGhpOworCXUxNiBsbzsKKwl1MzIgcGh5OwogCi0JcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBGQUxTRTsKLQlwcml2LT5waHlPbmxpbmU9MDsKLS8qICAxLglBc3NlcnQgcmVzZXQgYml0LiAqLworCWlmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkpIHsKKwkJcHJpdi0+cGh5TnVtID0gMHhGRkZGOworCQlyZXR1cm47CisJfQogCi0JZGF0YSA9IGlubChkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOwotCWRhdGEgfD0gVExBTl9IQ19BRF9SU1Q7Ci0Jb3V0bChkYXRhLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOwotCQotCXVkZWxheSgxMDAwKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBUTEFOX1BIWV9NQVhfQUREUiwgTUlJX0dFTl9JRF9ISSwgJmhpKTsKIAotLyogIDIuCVR1cm4gb2ZmIGludGVycnVwdHMuICggUHJvYmFibHkgaXNuJ3QgbmVjZXNzYXJ5ICkgKi8KKwlpZiAoaGkgIT0gMHhGRkZGKSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX01BWF9BRERSOworCX0gZWxzZSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX05PTkU7CisJfQogCi0JZGF0YSA9IGlubChkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOwotCWRhdGEgfD0gVExBTl9IQ19JTlRfT0ZGOwotCW91dGwoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwlwcml2LT5waHlbMV0gPSBUTEFOX1BIWV9OT05FOworCWZvciAocGh5ID0gMDsgcGh5IDw9IFRMQU5fUEhZX01BWF9BRERSOyBwaHkrKykgeworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAmY29udHJvbCk7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9JRF9ISSwgJmhpKTsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX0lEX0xPLCAmbG8pOworCQlpZiAoKGNvbnRyb2wgIT0gMHhGRkZGKSB8fCAoaGkgIT0gMHhGRkZGKQorCQkgICAgfHwgKGxvICE9IDB4RkZGRikpIHsKKwkJCXByaW50ZigiUEhZIGZvdW5kIGF0ICVoWCAlaFggJWhYICVoWFxuIiwgcGh5LAorCQkJICAgICAgIGNvbnRyb2wsIGhpLCBsbyk7CisJCQlpZiAoKHByaXYtPnBoeVsxXSA9PSBUTEFOX1BIWV9OT05FKQorCQkJICAgICYmIChwaHkgIT0gVExBTl9QSFlfTUFYX0FERFIpKSB7CisJCQkJcHJpdi0+cGh5WzFdID0gcGh5OworCQkJfQorCQl9CisJfQogCi0vKiAgMy4JQ2xlYXIgQVJFR3MgYW5kIEhBU0hzLiAqLworCWlmIChwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSkgeworCQlwcml2LT5waHlOdW0gPSAxOworCX0gZWxzZSBpZiAocHJpdi0+cGh5WzBdICE9IFRMQU5fUEhZX05PTkUpIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwl9IGVsc2UgeworCQlwcmludGYKKwkJICAgICgiVExBTjogIENhbm5vdCBpbml0aWFsaXplIGRldmljZSwgbm8gUEhZIHdhcyBmb3VuZCFcbiIpOworCX0KKworfQkJCQkvKiBUTGFuX1BoeURldGVjdCAqLwogCi0gCWZvciAoIGkgPSBUTEFOX0FSRUdfMDsgaSA8PSBUTEFOX0hBU0hfMjsgaSArPSA0ICkgewotCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCAodTE2KSBpLCAwICk7Cit2b2lkIFRMYW5fUGh5UG93ZXJEb3duKHN0cnVjdCBuaWMgKm5pYykKK3sKKworCXUxNiB2YWx1ZTsKKwlwcmludGYoIiVzOiBQb3dlcmluZyBkb3duIFBIWShzKS5cbiIsIHByaXYtPm5pY19uYW1lKTsKKwl2YWx1ZSA9IE1JSV9HQ19QRE9XTiB8IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfSVNPTEFURTsKKwlUTGFuX01paVN5bmMoQkFTRSk7CisJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHByaXYtPnBoeVtwcml2LT5waHlOdW1dLCBNSUlfR0VOX0NUTCwgdmFsdWUpOworCWlmICgocHJpdi0+cGh5TnVtID09IDApICYmIChwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSkKKwkgICAgJiYKKwkgICAgKCEodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS4KKwkgICAgICAgZmxhZ3MgJiBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCkpKSB7CisJCVRMYW5fTWlpU3luYyhCQVNFKTsKKwkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHByaXYtPnBoeVsxXSwgTUlJX0dFTl9DVEwsIHZhbHVlKTsKIAl9CiAKLS8qICA0LglTZXR1cCBOZXRDb25maWcgcmVnaXN0ZXIuICovCisJLyogV2FpdCBmb3IgNTAgbXMgYW5kIHBvd2VydXAKKwkgKiBUaGlzIGlzIGFiaXRyYXJ5LiAgSXQgaXMgaW50ZW5kZWQgdG8gbWFrZSBzdXJlIHRoZQorCSAqIHRyYW5jZWl2ZXIgc2V0dGxlcy4KKwkgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1BVUCApOyAqLworCW1kZWxheSg1MCk7CisJVExhbl9QaHlQb3dlclVwKG5pYyk7CiAKLQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKLQlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsICh1MTYpIGRhdGEgKTsKK30JCQkJLyogVExhbl9QaHlQb3dlckRvd24gKi8KIAotLyogIDUuCUxvYWQgTGRfVG1yIGFuZCBMZF9UaHIgaW4gSE9TVF9DTUQuICovCiAKLSAJb3V0bCggVExBTl9IQ19MRF9UTVIgfCAweDNmLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKLSAJb3V0bCggVExBTl9IQ19MRF9USFIgfCAweDksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOwordm9pZCBUTGFuX1BoeVBvd2VyVXAoc3RydWN0IG5pYyAqbmljKQoreworCXUxNiB2YWx1ZTsKIAotLyogIDYuCVVucmVzZXQgdGhlIE1JSSBieSBzZXR0aW5nIE5NUlNUIChpbiBOZXRTaW8pIHRvIDEuICovCisJcHJpbnRmKCIlczogUG93ZXJpbmcgdXAgUEhZLlxuIiwgcHJpdi0+bmljX25hbWUpOworCVRMYW5fTWlpU3luYyhCQVNFKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQks7CisJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHByaXYtPnBoeVtwcml2LT5waHlOdW1dLCBNSUlfR0VOX0NUTCwgdmFsdWUpOworCVRMYW5fTWlpU3luYyhCQVNFKTsKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIHJlc2V0IHRoZQorCSAqIHRyYW5jZWl2ZXIuICBUaGUgVExBTiBkb2NzIHNheSBib3RoIDUwIG1zIGFuZAorCSAqIDUwMCBtcywgc28gZG8gdGhlIGxvbmdlciwganVzdCBpbiBjYXNlLgorCSAqLworCW1kZWxheSg1MDApOworCVRMYW5fUGh5UmVzZXQobmljKTsKKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1JFU0VUICk7ICovCiAKLQlvdXR3KCBUTEFOX05FVF9TSU8sIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7Ci0JYWRkciA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX05NUlNULCBhZGRyICk7Cit9CQkJCS8qIFRMYW5fUGh5UG93ZXJVcCAqLwogCi0vKiAgNy4JU2V0dXAgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCit2b2lkIFRMYW5fUGh5UmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCXUxNiBwaHk7CisJdTE2IHZhbHVlOwogCi0JaWYgKCBwcml2LT50bGFuUmV2ID49IDB4MzAgKSB7Ci0JCWRhdGE4ID0gVExBTl9JRF9UWF9FT0MgfCBUTEFOX0lEX1JYX0VPQzsKLQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0lOVF9ESVMsIGRhdGE4ICk7CisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlwcmludGYoIiVzOiBSZXNldGluZyBQSFkuXG4iLCBwcml2LT5uaWNfbmFtZSk7CisJVExhbl9NaWlTeW5jKEJBU0UpOworCXZhbHVlID0gTUlJX0dDX0xPT1BCSyB8IE1JSV9HQ19SRVNFVDsKKwlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgdmFsdWUpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSk7CisJd2hpbGUgKHZhbHVlICYgTUlJX0dDX1JFU0VUKSB7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSk7CiAJfQotCVRMYW5fUGh5RGV0ZWN0KCBkZXYgKTsKLQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOOwotCQotCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZICkgewotCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19CSVQ7Ci0JCWlmICggcHJpdi0+YXVpID09IDEgKSB7Ci0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwYSApOwotCQl9IGVsc2UgaWYgKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHsKLQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BQ09NTUlULCAweDAwICk7CisKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIGluaXRpYWxpemUuCisJICogSSBkb24ndCByZW1lbWJlciB3aHkgSSB3YWl0IHRoaXMgbG9uZy4KKwkgKiBJJ3ZlIGNoYW5nZWQgdGhpcyB0byA1MG1zLCBhcyBpdCBzZWVtcyBsb25nIGVub3VnaC4KKwkgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksgKTsgKi8KKwltZGVsYXkoNTApOworCVRMYW5fUGh5U3RhcnRMaW5rKG5pYyk7CisKK30JCQkJLyogVExhbl9QaHlSZXNldCAqLworCisKK3ZvaWQgVExhbl9QaHlTdGFydExpbmsoc3RydWN0IG5pYyAqbmljKQoreworCisJdTE2IGFiaWxpdHk7CisJdTE2IGNvbnRyb2w7CisJdTE2IGRhdGE7CisJdTE2IHBoeTsKKwl1MTYgc3RhdHVzOworCXUxNiB0Y3RsOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJcHJpbnRmKCIlczogVHJ5aW5nIHRvIGFjdGl2YXRlIGxpbmsuXG4iLCBwcml2LT5uaWNfbmFtZSk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX1NUUywgJmFiaWxpdHkpOworCisJaWYgKChzdGF0dXMgJiBNSUlfR1NfQVVUT05FRykgJiYgKCFwcml2LT5hdWkpKSB7CisJCWFiaWxpdHkgPSBzdGF0dXMgPj4gMTE7CisJCWlmIChwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwICYmCisJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfSEFMRikgeworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDAwMCk7CisJCX0gZWxzZSBpZiAocHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMCAmJgorCQkJICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAweDAxMDApOworCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCisJCQkgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfSEFMRikgeworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MjAwMCk7CisJCX0gZWxzZSBpZiAocHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKKwkJCSAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CiAJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMTAwKTsKIAkJfSBlbHNlIHsKLQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BQ09NTUlULCAweDA4ICk7CisKKwkJCS8qIFNldCBBdXRvLU5lZyBhZHZlcnRpc2VtZW50ICovCisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQU5fQURWLAorCQkJCQkgKGFiaWxpdHkgPDwgNSkgfCAxKTsKKwkJCS8qIEVuYWJsZWUgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAweDEwMDApOworCQkJLyogUmVzdGFydCBBdXRvLU5lZyAqLworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MTIwMCk7CisJCQkvKiBXYWl0IGZvciA0IHNlYyBmb3IgYXV0b25lZ290aWF0aW9uCisJCQkgKiB0byBjb21wbGV0ZS4gIFRoZSBtYXggc3BlYyB0aW1lIGlzIGxlc3MgdGhhbiB0aGlzCisJCQkgKiBidXQgdGhlIGNhcmQgbmVlZCBhZGRpdGlvbmFsIHRpbWUgdG8gc3RhcnQgQU4uCisJCQkgKiAuNSBzZWMgc2hvdWxkIGJlIHBsZW50eSBleHRyYS4KKwkJCSAqLworCQkJcHJpbnRmKCJUTEFOOiAlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLlxuIiwKKwkJCSAgICAgICBwcml2LT5uaWNfbmFtZSk7CisJCQltZGVsYXkoNDAwMCk7CisJCQlUTGFuX1BoeUZpbmlzaEF1dG9OZWcobmljKTsKKwkJCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsgKi8KKwkJCXJldHVybjsKIAkJfQotCX0KIAotCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7Ci0JCWRhdGEgfD0gVExBTl9ORVRfQ0ZHX1BIWV9FTjsKIAl9Ci0JVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7CiAKLQlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB7Ci0JCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOwotCX0gZWxzZSB7Ci0JCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKKwlpZiAoKHByaXYtPmF1aSkgJiYgKHByaXYtPnBoeU51bSAhPSAwKSkgeworCQlwcml2LT5waHlOdW0gPSAwOworCQlkYXRhID0KKwkJICAgIFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8CisJCSAgICBUTEFOX05FVF9DRkdfUEhZX0VOOworCQlUTGFuX0Rpb1dyaXRlMTYoQkFTRSwgVExBTl9ORVRfQ09ORklHLCBkYXRhKTsKKwkJbWRlbGF5KDUwKTsKKwkJLyogVExhbl9TZXRUaW1lciggZGV2LCAoNDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7ICovCisJCVRMYW5fUGh5UG93ZXJEb3duKG5pYyk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHByaXYtPnBoeU51bSA9PSAwKSB7CisJCWNvbnRyb2wgPSAwOworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGN0bCk7CisJCWlmIChwcml2LT5hdWkpIHsKKwkJCXRjdGwgfD0gVExBTl9UQ19BVUlTRUw7CisJCX0gZWxzZSB7CisJCQl0Y3RsICY9IH5UTEFOX1RDX0FVSVNFTDsKKwkJCWlmIChwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJCWNvbnRyb2wgfD0gTUlJX0dDX0RVUExFWDsKKwkJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQl9CisJCQlpZiAocHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDApIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19TUEVFRFNFTDsKKwkJCX0KKwkJfQorCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgY29udHJvbCk7CisJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0Y3RsKTsKIAl9CiAKLX0gLyogVExhbl9SZXNldEFkYXB0ZXIgKi8KKwkvKiBXYWl0IGZvciAyIHNlYyB0byBnaXZlIHRoZSB0cmFuY2VpdmVyIHRpbWUKKwkgKiB0byBlc3RhYmxpc2ggbGluay4KKwkgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICg0KkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsgKi8KKwltZGVsYXkoMjAwMCk7CisJVExhbl9GaW5pc2hSZXNldChuaWMpOworCit9CQkJCS8qIFRMYW5fUGh5U3RhcnRMaW5rICovCiAKLXZvaWQKLVRMYW5fRmluaXNoUmVzZXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoc3RydWN0IG5pYyAqbmljKQogewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1OAkJZGF0YTsKLQl1MzIJCXBoeTsKLQl1OAkJc2lvOwotCXUxNgkJc3RhdHVzOwotCXUxNgkJcGFydG5lcjsKLQl1MTYJCXRscGh5X2N0bDsKLQl1MTYgCQl0bHBoeV9wYXI7Ci0JdTE2CQl0bHBoeV9pZDEsIHRscGh5X2lkMjsKLQlpbnQgCQlpOworCisJdTE2IGFuX2FkdjsKKwl1MTYgYW5fbHBhOworCXUxNiBkYXRhOworCXUxNiBtb2RlOworCXUxNiBwaHk7CisJdTE2IHN0YXR1czsKIAogCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOwogCi0JZGF0YSA9IFRMQU5fTkVUX0NNRF9OUkVTRVQgfCBUTEFOX05FVF9DTURfTldSQVA7Ci0JaWYgKCBwcml2LT50bGFuRnVsbER1cGxleCApIHsKLQkJZGF0YSB8PSBUTEFOX05FVF9DTURfRFVQTEVYOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMpOworCXVkZWxheSgxMDAwKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzKTsKKworCWlmICghKHN0YXR1cyAmIE1JSV9HU19BVVRPQ01QTFQpKSB7CisJCS8qIFdhaXQgZm9yIDggc2VjIHRvIGdpdmUgdGhlIHByb2Nlc3MKKwkJICogbW9yZSB0aW1lLiAgUGVyaGFwcyB3ZSBzaG91bGQgZmFpbCBhZnRlciBhIHdoaWxlLgorCQkgKi8KKwkJaWYgKCFwcml2LT5uZWdfYmVfdmVyYm9zZSsrKSB7CisJCQlwcmludGYKKwkJCSAgICAoIlRMQU46ICBHaXZpbmcgYXV0b25lZ290aWF0aW9uIG1vcmUgdGltZS5cbiIpOworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgUGxlYXNlIGNoZWNrIHRoYXQgeW91ciBhZGFwdGVyIGhhc1xuIik7CisJCQlwcmludGYKKwkJCSAgICAoIlRMQU46ICBiZWVuIHByb3Blcmx5IGNvbm5lY3RlZCB0byBhIEhVQiBvciBTd2l0Y2guXG4iKTsKKwkJCXByaW50ZgorCQkJICAgICgiVExBTjogIFRyeWluZyB0byBlc3RhYmxpc2ggbGluayBpbiB0aGUgYmFja2dyb3VuZC4uLlxuIik7CisJCX0KKwkJbWRlbGF5KDgwMDApOworCQlUTGFuX1BoeUZpbmlzaEF1dG9OZWcobmljKTsKKwkJLyogVExhbl9TZXRUaW1lciggZGV2LCAoOCpIWiksIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTiApOyAqLworCQlyZXR1cm47CiAJfQotCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCBkYXRhICk7Ci0JZGF0YSA9IFRMQU5fTkVUX01BU0tfTUFTSzQgfCBUTEFOX05FVF9NQVNLX01BU0s1OyAKLQlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgewotCQlkYXRhIHw9IFRMQU5fTkVUX01BU0tfTUFTSzc7IAotCX0KLQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX01BU0ssIGRhdGEgKTsKLQlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX01BWF9SWCwgKCgxNTM2KSs3KSZ+NyApOwotCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZ0bHBoeV9pZDEgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmdGxwaHlfaWQyICk7Ci0JCi0JaWYgKCAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB8fCAoIHByaXYtPmF1aSApICkgewotCQlzdGF0dXMgPSBNSUlfR1NfTElOSzsKLQkJcHJpbnRrKCAiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIGRldi0+bmFtZSApOwotCX0gZWxzZSB7Ci0JCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7Ci0JCXVkZWxheSggMTAwMCApOwotCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOwotCQlpZiAoIChzdGF0dXMgJiBNSUlfR1NfTElOSykgJiYJIC8qIFdlIG9ubHkgc3VwcG9ydCBsaW5rIGluZm8gb24gTmF0LlNlbS4gUEhZJ3MgKi8gCi0JCQkodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKSAmJgotCQkJKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikgKSB7Ci0JCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fTFBBLCAmcGFydG5lciApOwotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9QQVIsICZ0bHBoeV9wYXIgKTsKLQkJCQotCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlIHdpdGggIiwgZGV2LT5uYW1lICk7Ci0JCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgewotCQkJICAgICAgCSBwcmludGsoICJmb3JjZWQgMTAlc01icHMgJXMtRHVwbGV4XG4iLCAKLQkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDogIjAiLAotCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPyAiRnVsbCIgOiAiSGFsZiIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoICJBdXRvTmVnb3RpYXRpb24gZW5hYmxlZCwgYXQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAotCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOiAiMCIsCi0JCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7Ci0JCQkJcHJpbnRrKCJUTEFOOiBQYXJ0bmVyIGNhcGFiaWxpdHk6ICIpOwotCQkJCQlmb3IgKGkgPSA1OyBpIDw9IDEwOyBpKyspCi0JCQkJCQlpZiAocGFydG5lciAmICgxPDxpKSkKLQkJCQkJCQlwcmludGsoIiVzIiwgbWVkaWFbaS01XSk7Ci0JCQkJCQkJcHJpbnRrKCJcbiIpOwotCQkJfQogCi0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyApOwotI2lmZGVmIE1PTklUT1IJCQkKLQkJCS8qIFdlIGhhdmUgbGluayBiZWF0Li5mb3Igbm93IGFueXdheSAqLwotCSAgICAgICAgCXByaXYtPmxpbmsgPSAxOwotCSAgICAgICAgCS8qRW5hYmxpbmcgbGluayBiZWF0IG1vbml0b3JpbmcgKi8KLQkJCVRMYW5fU2V0VGltZXIoIGRldiwgKDEwKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKLSNlbmRpZiAKLQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNSUlfR1NfTElOSykgIHsKLQkJCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGFjdGl2ZVxuIiwgZGV2LT5uYW1lICk7Ci0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyApOwotCQl9CisJcHJpbnRmKCJUTEFOOiAlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlLlxuIiwgcHJpdi0+bmljX25hbWUpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0FOX0FEViwgJmFuX2Fkdik7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQU5fTFBBLCAmYW5fbHBhKTsKKwltb2RlID0gYW5fYWR2ICYgYW5fbHBhICYgMHgwM0UwOworCWlmIChtb2RlICYgMHgwMTAwKSB7CisJCXByaW50ZigiRnVsbCBEdXBsZXhcbiIpOworCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJfSBlbHNlIGlmICghKG1vZGUgJiAweDAwODApICYmIChtb2RlICYgMHgwMDQwKSkgeworCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCXByaW50ZigiRnVsbCBEdXBsZXhcbiIpOwogCX0KIAotCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7Ci0gICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRscGh5X2N0bCApOwotICAgICAgICAJdGxwaHlfY3RsIHw9IFRMQU5fVENfSU5URU47Ci0gICAgICAgIAlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCApOwotICAgICAgICAJc2lvID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NJTyApOwotICAgICAgICAJc2lvIHw9IFRMQU5fTkVUX1NJT19NSU5URU47Ci0gICAgICAgIAlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NJTywgc2lvICk7CisJaWYgKCghKG1vZGUgJiAweDAxODApKQorCSAgICAmJiAodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS5mbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwKQorCSAgICAmJiAocHJpdi0+cGh5TnVtICE9IDApKSB7CisJCXByaXYtPnBoeU51bSA9IDA7CisJCWRhdGEgPQorCQkgICAgVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwKKwkJICAgIFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNihCQVNFLCBUTEFOX05FVF9DT05GSUcsIGRhdGEpOworCQkvKiBUTGFuX1NldFRpbWVyKCBuaWMsICg0MDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7ICovCisJCW1kZWxheSg0MDApOworCQlUTGFuX1BoeVBvd2VyRG93bihuaWMpOworCQlyZXR1cm47CiAJfQogCi0JaWYgKCBzdGF0dXMgJiBNSUlfR1NfTElOSyApIHsKLQkJVExhbl9TZXRNYWMoIGRldiwgMCwgZGV2LT5kZXZfYWRkciApOwotCQlwcml2LT5waHlPbmxpbmUgPSAxOwotCQlvdXRiKCAoIFRMQU5fSENfSU5UX09OID4+IDggKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICsgMSApOwotCQlpZiAoIGRlYnVnID49IDEgJiYgZGVidWcgIT0gVExBTl9ERUJVR19QUk9CRSApIHsKLQkJCW91dGIoICggVExBTl9IQ19SRVFfSU5UID4+IDggKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICsgMSApOworCWlmIChwcml2LT5waHlOdW0gPT0gMCkgeworCQlpZiAoKHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKQorCQkgICAgfHwgKGFuX2FkdiAmIGFuX2xwYSAmIDB4MDA0MCkpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLAorCQkJCQkgTUlJX0dDX0FVVE9FTkIgfCBNSUlfR0NfRFVQTEVYKTsKKwkJCXByaW50ZgorCQkJICAgICgiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEZVTEwtRFVQTEVYXG4iKTsKKwkJfSBlbHNlIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLAorCQkJCQkgTUlJX0dDX0FVVE9FTkIpOworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggSEFMRi1EVVBMRVhcbiIpOwogCQl9Ci0JCW91dGwoIHZpcnRfdG9fYnVzKCBwcml2LT5yeExpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJb3V0bCggVExBTl9IQ19HTyB8IFRMQU5fSENfUlQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOwotCX0gZWxzZSB7Ci0JCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGluYWN0aXZlLCB3aWxsIHJldHJ5IGluIDEwIHNlY3MuLi5cbiIsIGRldi0+bmFtZSApOwotCQlUTGFuX1NldFRpbWVyKCBkZXYsICgxMCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7Ci0JCXJldHVybjsKIAl9CiAKLX0gLyogVExhbl9GaW5pc2hSZXNldCAqLworCS8qIFdhaXQgZm9yIDEwMCBtcy4gIE5vIHJlYXNvbiBpbiBwYXJ0aXRpY3VsYXIuCisJICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMTApLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOyAqLworCW1kZWxheSgxMDApOworCVRMYW5fRmluaXNoUmVzZXQobmljKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1NldE1hYwotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKLQkgKgkJCW9uIHdoaWNoIHRvIGNoYW5nZSB0aGUgQVJFRy4KLQkgKgkJYXJlZwlUaGUgQVJFRyB0byBzZXQgdGhlIGFkZHJlc3MgaW4gKDAgLSAzKS4KLQkgKgkJbWFjCUEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycy4gIEVhY2gKLQkgKgkJCWVsZW1lbnQgc3RvcmVzIG9uZSBieXRlIG9mIHRoZSBhZGRyZXNzLgotCSAqCQkJSUUsIGl0IGlzbid0IGluIGFzY2lpLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiB0cmFuc2ZlcnMgYSBNQUMgYWRkcmVzcyB0byBvbmUgb2YgdGhlCi0JICoJVExBTiBBUkVHcyAoYWRkcmVzcyByZWdpc3RlcnMpLiAgVGhlIFRMQU4gY2hpcCBsb2NrcwotCSAqCXRoZSByZWdpc3RlciBvbiB3cml0aW5nIHRvIG9mZnNldCAwIGFuZCB1bmxvY2tzIHRoZQotCSAqCXJlZ2lzdGVyIGFmdGVyIHdyaXRpbmcgdG8gb2Zmc2V0IDUuICBJZiBOVUxMIGlzIHBhc3NlZAotCSAqCWluIG1hYywgdGhlbiB0aGUgQVJFRyBpcyBmaWxsZWQgd2l0aCAwJ3MuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit9CQkJCS8qIFRMYW5fUGh5RmluaXNoQXV0b05lZyAqLworCisjaWZkZWYgTU9OSVRPUgorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAqCisgICAgICAgICogICAgICBUTGFuX3BoeU1vbml0b3IKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUmV0dXJuczoKKyAgICAgICAgKiAgICAgICAgICAgICAgTm9uZQorICAgICAgICAqCisgICAgICAgICogICAgICBQYXJhbXM6CisgICAgICAgICogICAgICAgICAgICAgIGRldiAgICAgICAgICAgICBUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGlzIGRldmljZS4KKyAgICAgICAgKgorICAgICAgICAqCisgICAgICAgICogICAgICBUaGlzIGZ1bmN0aW9uIG1vbml0b3JzIFBIWSBjb25kaXRpb24gYnkgcmVhZGluZyB0aGUgc3RhdHVzCisgICAgICAgICogICAgICByZWdpc3RlciB2aWEgdGhlIE1JSSBidXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZ2l2ZSBpbmZvCisgICAgICAgICogICAgICBhYm91dCBsaW5rIGNoYW5nZXMgKHVwL2Rvd24pLCBhbmQgcG9zc2libGUgc3dpdGNoIHRvIGFsdGVybmF0ZQorICAgICAgICAqICAgICAgbWVkaWEuCisgICAgICAgICoKKyAgICAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgVExhbl9TZXRNYWMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhcmVnLCBjaGFyICptYWMgKQordm9pZCBUTGFuX1BoeU1vbml0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpbnQgaTsKLQkJCQotCWFyZWcgKj0gNjsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTE2IHBoeTsKKwl1MTYgcGh5X3N0YXR1czsKIAotCWlmICggbWFjICE9IE5VTEwgKSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKLQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgbWFjW2ldICk7Ci0JfSBlbHNlIHsKLQkJZm9yICggaSA9IDA7IGkgPCA2OyBpKysgKQotCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FSRUdfMCArIGFyZWcgKyBpLCAwICk7CisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwkvKiBHZXQgUEhZIHN0YXR1cyByZWdpc3RlciAqLworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZwaHlfc3RhdHVzKTsKKworCS8qIENoZWNrIGlmIGxpbmsgaGFzIGJlZW4gbG9zdCAqLworCWlmICghKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykpIHsKKwkJaWYgKHByaXYtPmxpbmspIHsKKwkJCXByaXYtPmxpbmsgPSAwOworCQkJcHJpbnRmKCJUTEFOOiAlcyBoYXMgbG9zdCBsaW5rXG4iLCBwcml2LT5uaWNfbmFtZSk7CisJCQlwcml2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCQltZGVsYXkoMjAwMCk7CisJCQlUTGFuX1BoeU1vbml0b3IobmljKTsKKwkJCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOyAqLworCQkJcmV0dXJuOworCQl9CiAJfQogCi19IC8qIFRMYW5fU2V0TWFjICovCisJLyogTGluayByZXN0YWJsaXNoZWQ/ICovCisJaWYgKChwaHlfc3RhdHVzICYgTUlJX0dTX0xJTkspICYmICFwcml2LT5saW5rKSB7CisJCXByaXYtPmxpbmsgPSAxOworCQlwcmludGYoIlRMQU46ICVzIGhhcyByZWVzdGFibGlzaGVkIGxpbmtcbiIsCisJCSAgICAgICBwcml2LT5uaWNfbmFtZSk7CisJCXByaXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworCX0KKworCS8qIFNldHVwIGEgbmV3IG1vbml0b3IgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsgKi8KKwltZGVsYXkoMjAwMCk7CisJVExhbl9QaHlNb25pdG9yKG5pYyk7Cit9CiAKKyNlbmRpZgkJCQkvKiBNT05JVE9SICovCisKKyNpZmRlZiBFQjUxCitzdGF0aWMgc3RydWN0IHBjaV9pZCB0bGFuX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MGUxMSwgMHhhZTM0LCAibmV0ZWwxMCIsICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVCBQQ0kgVVRQIiksCisJUENJX1JPTSgweDBlMTEsIDB4YWUzMiwgIm5ldGVsMTAwIiwiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiksCisJUENJX1JPTSgweDBlMTEsIDB4YWUzNSwgIm5ldGZsZXgzaSIsICJDb21wYXEgSW50ZWdyYXRlZCBOZXRGbGV4LTMvUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGYxMzAsICJ0aHVuZGVyIiwgIkNvbXBhcSBOZXRGbGV4LTMvUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGYxNTAsICJuZXRmbGV4M2IiLCAiQ29tcGFxIE5ldEZsZXgtMy9QIiksCisJUENJX1JPTSgweDBlMTEsIDB4YWU0MywgIm5ldGVsMTAwcGkiLCAiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGFlNDAsICJuZXRlbDEwMGQiLCAiQ29tcGFxIE5ldGVsbGlnZW50IER1YWwgMTAvMTAwIFRYIFBDSSBVVFAiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDExLCAibmV0ZWwxMDBpIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQIiksCisJUENJX1JPTSgweDEwOGQsIDB4MDAxMywgIm9jMjE4MyIsICJPbGljb20gT0MtMjE4My8yMTg1IiksCisJUENJX1JPTSgweDEwOGQsIDB4MDAxMiwgIm9jMjMyNSIsICJPbGljb20gT0MtMjMyNSIpLAorCVBDSV9ST00oMHgxMDhkLCAweDAwMTQsICJvYzIzMjYiLCAiT2xpY29tIE9DLTIzMjYiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDMwLCAibmV0ZWxsaWdlbnRfMTBfMTAwX3dzXzUxMDAiLCAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBVVFAiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDEyLCAibmV0ZWxsaWdlbnRfMTBfdDIiLCAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHRsYW5fZHJpdmVyID0geworCS50eXBlID0gTklDX0RSSVZFUiwKKwkubmFtZSA9ICJUTEFOL1BDSSIsCisJLnByb2JlID0gdGxhbl9wcm9iZSwKKwkuaWRzID0gdGxhbl9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZih0bGFuX25pY3MpIC8gc2l6ZW9mKHRsYW5fbmljc1swXSksCisJLmNsYXNzID0gMCwKK307CiAjZW5kaWYKSW5kZXg6IGIvbmV0Ym9vdC90bGFuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdGxhbi5oCkBAIC0wLDAgKzEsNTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgdGxhbi5jIC0tIEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVGh1bmRlckxBTgorKiAgICBXcml0dGVuIDIwMDMtMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSAoYWxtb3N0IGFsbCkgYmFzZWQgb246CisqICAgICAgICAgICAgICAgdGxhbi5jOiBMaW51eCBUaHVuZGVyTGFuIERyaXZlcjoKKyoKKyoJCQkJYnkgSmFtZXMgQmFua3MKKyoKKyogIAkJCQkoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyoJCQkgIAkoQykgMTk5OCBKYW1lcyBCYW5rcworKgkJCQkoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KKyoJCQkJKEMpIDIwMDIgU2FtdWVsIENoZXNzbWFuCisqCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwNy0wOC0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgbm90IHF1aXRlIHdvcmtpbmcgdmVyc2lvbgorKgorKiBJbmRlbnQgU3R5bGU6IGluZGVudCAta3IgLWk4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZBTFNFCQkJMAorI2RlZmluZSBUUlVFCQkJMQorCisjZGVmaW5lIFRMQU5fTUlOX0ZSQU1FX1NJWkUJNjQKKyNkZWZpbmUgVExBTl9NQVhfRlJBTUVfU0laRQkxNjAwCisKKyNkZWZpbmUgVExBTl9OVU1fUlhfTElTVFMJNAorI2RlZmluZSBUTEFOX05VTV9UWF9MSVNUUwkyCisKKyNkZWZpbmUgVExBTl9JR05PUkUJCTAKKyNkZWZpbmUgVExBTl9SRUNPUkQJCTEKKy8qCisjZGVmaW5lIFRMQU5fREJHKGx2bCwgZm9ybWF0LCBhcmdzLi4uKQlpZiAoZGVidWcmbHZsKSBwcmludGYoIlRMQU46ICIgZm9ybWF0LCAjI2FyZ3MgKTsKKyovCisjZGVmaW5lIFRMQU5fREVCVUdfR05STAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fREVCVUdfVFgJCTB4MDAwMgorI2RlZmluZSBUTEFOX0RFQlVHX1JYCQkweDAwMDQKKyNkZWZpbmUgVExBTl9ERUJVR19MSVNUCQkweDAwMDgKKyNkZWZpbmUgVExBTl9ERUJVR19QUk9CRQkweDAwMTAKKworI2RlZmluZSBUWF9USU1FT1VUCQkoMTAqSFopCS8qIFdlIG5lZWQgdGltZSBmb3IgYXV0by1uZWcgKi8KKyNkZWZpbmUgTUFYX1RMQU5fQk9BUkRTCQk4CS8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRGV2aWNlIElkZW50aWZpY2F0aW9uIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwX1QyCQkJMHhCMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAJMHhCMDMwCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJCQkweDAwMTMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CQkJMHgwMDEyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkJCTB4MDAxNAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fYWRhcHRlcl9lbnRyeSB7CisJdTE2IHZlbmRvcklkOworCXUxNiBkZXZpY2VJZDsKKwljaGFyICpkZXZpY2VMYWJlbDsKKwl1MzIgZmxhZ3M7CisJdTE2IGFkZHJPZnM7Cit9IFRMYW5BZGFwdGVyRW50cnk7CisKKyNkZWZpbmUgVExBTl9BREFQVEVSX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkJMHgwMDAwMDAwMQorI2RlZmluZSBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZCTB4MDAwMDAwMDIKKyNkZWZpbmUgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAJMHgwMDAwMDAwNAorI2RlZmluZSBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVECTB4MDAwMDAwMDgKKworI2RlZmluZSBUTEFOX1NQRUVEX0RFRkFVTFQJMAorI2RlZmluZSBUTEFOX1NQRUVEXzEwCQkxMAorI2RlZmluZSBUTEFOX1NQRUVEXzEwMAkJMTAwCisKKyNkZWZpbmUgVExBTl9EVVBMRVhfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fRFVQTEVYX0hBTEYJMQorI2RlZmluZSBUTEFOX0RVUExFWF9GVUxMCTIKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBFSVNBIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFSVNBX0lEICAgICAgMHhjODAJLyogRUlTQSBJRCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRUlTQV9JRDAgICAgIDB4YzgwCS8qIEVJU0EgSUQgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX0lEMSAgICAgMHhjODEJLyogRUlTQSBJRCBSZWdpc3RlciAxICovCisjZGVmaW5lIEVJU0FfSUQyICAgICAweGM4MgkvKiBFSVNBIElEIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRUlTQV9JRDMgICAgIDB4YzgzCS8qIEVJU0EgSUQgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0NSICAgICAgMHhjODQJLyogRUlTQSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEVJU0FfUkVHMCAgICAweGM4OAkvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX1JFRzEgICAgMHhjODkJLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUlTQV9SRUcyICAgIDB4YzhhCS8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIEVJU0FfUkVHMyAgICAweGM4ZgkvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0FQUk9NICAgMHhjOTAJLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUngvVHggTGlzdCBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9CVUZGRVJTX1BFUl9MSVNUCTEwCisjZGVmaW5lIFRMQU5fTEFTVF9CVUZGRVIJMHg4MDAwMDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1VOVVNFRAkweDgwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9GUk1fQ01QCTB4NDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1JFQURZCTB4MzAwMAorI2RlZmluZSBUTEFOX0NTVEFUX0VPQwkJMHgwODAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUlhfRVJST1IJMHgwNDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUEFTU19DUkMJMHgwMjAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRFBfUFIJMHgwMTAwCisKKworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUEhZIGRlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX1BIWV9NQVhfQUREUgkweDFGCisjZGVmaW5lIFRMQU5fUEhZX05PTkUJCTB4MjAKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERyaXZlciBUaW1lciBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9USU1FUl9MSU5LX0JFQVQJCTEKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RJVklUWQkJMgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QRE9XTgkJMworI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QVVAJCTQKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUkVTRVQJCTUKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSwk2CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTgk3CisjZGVmaW5lIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUCQk4CisKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RfREVMQVkJCShIWi8xMCkKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRHJpdmVyIEVlcHJvbSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9FRVBST01fQUNLCQkwCisjZGVmaW5lIFRMQU5fRUVQUk9NX1NUT1AJMQorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogSG9zdCBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb250ZW50cworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9IT1NUX0NNRAkJCTB4MDAKKyNkZWZpbmUgCVRMQU5fSENfR08JCTB4ODAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfU1RPUAkJMHg0MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19BQ0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQ1NfTUFTSwkJMHgxRkUwMDAwMAorI2RlZmluZQkJVExBTl9IQ19FT0MJCTB4MDAxMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfUlQJCTB4MDAwODAwMDAKKyNkZWZpbmUJCVRMQU5fSENfTkVTCQkweDAwMDQwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FEX1JTVAkJMHgwMDAwODAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9UTVIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJCVRMQU5fSENfTERfVEhSCQkweDAwMDAyMDAwCisjZGVmaW5lCQlUTEFOX0hDX1JFUV9JTlQJCTB4MDAwMDEwMDAKKyNkZWZpbmUJCVRMQU5fSENfSU5UX09GRgkJMHgwMDAwMDgwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT04JCTB4MDAwMDA0MDAKKyNkZWZpbmUJCVRMQU5fSENfQUNfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBUTEFOX0NIX1BBUk0JCQkweDA0CisjZGVmaW5lIFRMQU5fRElPX0FEUgkJCTB4MDgKKyNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAorI2RlZmluZSBUTEFOX0hPU1RfSU5UCQkJMHgwQQorI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKKyNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCisjZGVmaW5lIFRMQU5fRElPX0RBVEEJCQkweDBDCisKKworLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLworCisjZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCisjZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMworI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAorI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCisjZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2CisjZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAorI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKKyNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKKyNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKKyNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQorI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCisjZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAorI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKKyNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCisjZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgorI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKKyNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCisjZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCisjZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKKyNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKKyNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNworI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4CisjZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKKyNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgorI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKKyNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQorI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCisjZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQorI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgorI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCisjZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKKyNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAorI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQorI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKKyNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2CisjZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKKyNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0CisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgorI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKKworCisKKy8qIFRodW5kZXJMQU4gSW50ZXJydXB0IENvZGVzICovCisKKyNkZWZpbmUgVExBTl9JTlRfTlVNQkVSX09GX0lOVFMJOAorCisjZGVmaW5lIFRMQU5fSU5UX05PTkUJCQkweDAwMDAKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9GCQkJMHgwMDAxCisjZGVmaW5lIFRMQU5fSU5UX1NUQVRfT1ZFUkZMT1cJCTB4MDAwMgorI2RlZmluZSBUTEFOX0lOVF9SWF9FT0YJCQkweDAwMDMKKyNkZWZpbmUgVExBTl9JTlRfRFVNTVkJCQkweDAwMDQKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9DCQkJMHgwMDA1CisjZGVmaW5lIFRMQU5fSU5UX1NUQVRVU19DSEVDSwkJMHgwMDA2CisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPQwkJCTB4MDAwNworCisKKworLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCisKKy8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKKyNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCisjZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAorI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAorI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKKyNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAorI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAorI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKKyNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCisjZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCisjZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAorI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKKyNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCisjZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAorI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAorI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAorI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAorI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCisjZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKKyNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKKyNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKKyNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKKyNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAorI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKKyNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKKyNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKKyNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKKworLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCisjZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQorI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKKyNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4CisjZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAorI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCisjZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQorI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKKyNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAorI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKKyNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5CisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKy8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KKyNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKKyNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKKyNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAorI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCisKKyNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKKworLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKworaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDggKi8KKworCisKKworaW5saW5lIHUxNiBUTGFuX0Rpb1JlYWQxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbncoKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpICsgKGludGVybmFsX2FkZHIgJiAweDIpKSk7CisKK30JCQkJLyogVExhbl9EaW9SZWFkMTYgKi8KKworCisKKworaW5saW5lIHUzMiBUTGFuX0Rpb1JlYWQzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbmwoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDMyICovCisKKworCisKK2lubGluZSB2b2lkIFRMYW5fRGlvV3JpdGU4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1OCBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXRiKGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpOworCit9CisKKworCisKK2lubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTE2IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dHcoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworCisKKworaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTMyKHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MzIgZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0bChkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKKworfQorCisKKworI2lmIDAKK2lubGluZSB2b2lkIFRMYW5fQ2xlYXJCaXQodTggYml0LCB1MTYgcG9ydCkKK3sKKwlvdXRiX3AoaW5iX3AocG9ydCkgJiB+Yml0LCBwb3J0KTsKK30KKworCisKKworaW5saW5lIGludCBUTGFuX0dldEJpdCh1OCBiaXQsIHUxNiBwb3J0KQoreworCXJldHVybiAoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSk7Cit9CisKKworCisKK2lubGluZSB2b2lkIFRMYW5fU2V0Qml0KHU4IGJpdCwgdTE2IHBvcnQpCit7CisJb3V0Yl9wKGluYl9wKHBvcnQpIHwgYml0LCBwb3J0KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRMYW5fQ2xlYXJCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSAmIH5iaXQsIHBvcnQpCisjZGVmaW5lIFRMYW5fR2V0Qml0KCBiaXQsIHBvcnQgKQkoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSkKKyNkZWZpbmUgVExhbl9TZXRCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSB8IGJpdCwgcG9ydCkKKworI2lmZGVmIElfTElLRV9BX0ZBU1RfSEFTSF9GVU5DVElPTgorLyogZ2l2ZW4gNiBieXRlcywgdmlldyB0aGVtIGFzIDggNi1iaXQgbnVtYmVycyBhbmQgcmV0dXJuIHRoZSBYT1Igb2YgdGhvc2UgKi8KKy8qIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgKi8KK2lubGluZSB1MzIgVExhbl9IYXNoRnVuYyh1OCAqIGEpCit7CisJdTggaGFzaDsKKworCWhhc2ggPSAoYVswXSBeIGFbM10pOwkvKiAmIDA3NyAqLworCWhhc2ggXj0gKChhWzBdIF4gYVszXSkgPj4gNik7CS8qICYgMDAzICovCisJaGFzaCBePSAoKGFbMV0gXiBhWzRdKSA8PCAyKTsJLyogJiAwNzQgKi8KKwloYXNoIF49ICgoYVsxXSBeIGFbNF0pID4+IDQpOwkvKiAmIDAxNyAqLworCWhhc2ggXj0gKChhWzJdIF4gYVs1XSkgPDwgNCk7CS8qICYgMDYwICovCisJaGFzaCBePSAoKGFbMl0gXiBhWzVdKSA+PiAyKTsJLyogJiAwNzcgKi8KKworCXJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisKKyNlbHNlCQkJCS8qIG9yaWdpbmFsIGNvZGUgKi8KKworaW5saW5lIHUzMiB4b3IodTMyIGEsIHUzMiBiKQoreworCXJldHVybiAoKGEgJiYgIWIpIHx8ICghYSAmJiBiKSk7Cit9CisKKyNkZWZpbmUgWE9SOCggYSwgYiwgYywgZCwgZSwgZiwgZywgaCApCXhvciggYSwgeG9yKCBiLCB4b3IoIGMsIHhvciggZCwgeG9yKCBlLCB4b3IoIGYsIHhvciggZywgaCApICkgKSApICkgKSApCisjZGVmaW5lIERBKCBhLCBiaXQgKQkJCQkJKCAoICh1OCkgYVtiaXQvOF0gKSAmICggKHU4KSAoIDEgPDwgYml0JTggKSApICkKKworaW5saW5lIHUzMiBUTGFuX0hhc2hGdW5jKHU4ICogYSkKK3sKKwl1MzIgaGFzaDsKKworCWhhc2ggPQorCSAgICBYT1I4KERBKGEsIDApLCBEQShhLCA2KSwgREEoYSwgMTIpLCBEQShhLCAxOCksIERBKGEsIDI0KSwKKwkJIERBKGEsIDMwKSwgREEoYSwgMzYpLCBEQShhLCA0MikpOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAxKSwgREEoYSwgNyksIERBKGEsIDEzKSwgREEoYSwgMTkpLCBEQShhLCAyNSksCisJCSBEQShhLCAzMSksIERBKGEsIDM3KSwgREEoYSwgNDMpKSA8PCAxOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAyKSwgREEoYSwgOCksIERBKGEsIDE0KSwgREEoYSwgMjApLCBEQShhLCAyNiksCisJCSBEQShhLCAzMiksIERBKGEsIDM4KSwgREEoYSwgNDQpKSA8PCAyOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAzKSwgREEoYSwgOSksIERBKGEsIDE1KSwgREEoYSwgMjEpLCBEQShhLCAyNyksCisJCSBEQShhLCAzMyksIERBKGEsIDM5KSwgREEoYSwgNDUpKSA8PCAzOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCA0KSwgREEoYSwgMTApLCBEQShhLCAxNiksIERBKGEsIDIyKSwgREEoYSwgMjgpLAorCQkgREEoYSwgMzQpLCBEQShhLCA0MCksIERBKGEsIDQ2KSkgPDwgNDsKKwloYXNoIHw9CisJICAgIFhPUjgoREEoYSwgNSksIERBKGEsIDExKSwgREEoYSwgMTcpLCBEQShhLCAyMyksIERBKGEsIDI5KSwKKwkJIERBKGEsIDM1KSwgREEoYSwgNDEpLCBEQShhLCA0NykpIDw8IDU7CisKKwlyZXR1cm4gaGFzaDsKKworfQorCisjZW5kaWYJCQkJLyogSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OICovCkluZGV4OiBiL25ldGJvb3QvdHVsaXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvdHVsaXAuYworKysgYi9uZXRib290L3R1bGlwLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCisgIDA3IFNlcCAyMDAzICB0aW1sZWdnZQlNdWx0aWNhc3QgU3VwcG9ydCBBZGRlZAogICAxMSBBcHIgMjAwMSAgbWRjICAgICBbcGF0Y2ggdG8gZXRoZXJib290IDQuNy4yNF0KICAgICAgTWFqb3IgcmV3cml0ZSB0byBpbmNsdWRlIExpbnV4IHR1bGlwIGRyaXZlciBtZWRpYSBkZXRlY3Rpb24KICAgICAgY29kZS4gIFRoaXMgZHJpdmVyIHNob3VsZCBzdXBwb3J0IGEgbG90IG1vcmUgY2FyZHMgbm93LgpAQCAtOTgsNyArOTksNiBAQAogICAgICBhbmQgdGhpbmd1aW4gbWFpbGluZyBsaXN0cy4KICovCiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwNiwzMSArMTA2LDI5IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKIAogLyogVXNlciBzZXR0YWJsZSBwYXJhbWV0ZXJzICovCiAKLSN1bmRlZiAgIFRVTElQX0RFQlVHCi0jdW5kZWYgICBUVUxJUF9ERUJVR19XSEVSRQorI3VuZGVmCVRVTElQX0RFQlVHCisjdW5kZWYJVFVMSVBfREVCVUdfV0hFUkUKKyNpZmRlZglUVUxJUF9ERUJVRwogc3RhdGljIGludCB0dWxpcF9kZWJ1ZyA9IDI7ICAgICAgICAgICAgIC8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KKyNlbmRpZgogCiAjZGVmaW5lIFRYX1RJTUVfT1VUICAgICAgIDIqVElDS1NfUEVSX1NFQwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHU4OwotdHlwZWRlZiAgIHNpZ25lZCBjaGFyICBzODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwotdHlwZWRlZiAgIHNpZ25lZCBzaG9ydCBzMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIHUzMjsKLXR5cGVkZWYgICBzaWduZWQgaW50ICAgczMyOwordHlwZWRlZiB1aW50OF90ICAgIHU4OwordHlwZWRlZiAgaW50OF90ICAgIHM4OwordHlwZWRlZiB1aW50MTZfdCAgIHUxNjsKK3R5cGVkZWYgIGludDE2X3QgICBzMTY7Cit0eXBlZGVmIHVpbnQzMl90ICAgdTMyOwordHlwZWRlZiAgaW50MzJfdCAgIHMzMjsKIAogLyogaGVscGZ1bCBtYWNyb3MgaWYgb24gYSBiaWdfZW5kaWFuIG1hY2hpbmUgZm9yIGNoYW5naW5nIGJ5dGUgb3JkZXIuCiAgICBub3Qgc3RyaWN0bHkgbmVlZGVkIG9uIEludGVsICovCi0jZGVmaW5lIGxlMTZfdG9fY3B1KHZhbCkgKHZhbCkKLSNkZWZpbmUgY3B1X3RvX2xlMzIodmFsKSAodmFsKQogI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgKCoocHRyKSkKICNkZWZpbmUgcHV0X3VuYWxpZ25lZCh2YWwsIHB0cikgKCh2b2lkKSggKihwdHIpID0gKHZhbCkgKSkKICNkZWZpbmUgZ2V0X3UxNihwdHIpICgqKHUxNiAqKShwdHIpKQotI2RlZmluZSB2aXJ0X3RvX2J1cyh4KSAoKHVuc2lnbmVkIGxvbmcpeCkKICNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgdmlydF90b19idXMoYWRkcikKIAogI2RlZmluZSBUVUxJUF9JT1RZUEUgIFBDSV9VU0VTX01BU1RFUiB8IFBDSV9VU0VTX0lPIHwgUENJX0FERFIwCkBAIC0yMTIsNiArMjEwLDggQEAKICAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBQTklDMiB9LAogICAgIHsgIkFETXRlayBBTjk4MSBDb21ldCIsIHsgMHgwOTgxMTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAogICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNVGVrIEFOOTgzIENvbWV0IiwgeyAweDEyMTYxMTEzLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgQ09NRVQgfSwKICAgICB7ICJBRE10ZWsgQ2VudGF1ci1QIiwgeyAweDA5ODUxMzE3LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCiAgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgQ09NRVQgfSwKICAgICB7ICJBRE10ZWsgQ2VudGF1ci1DIiwgeyAweDE5ODUxMzE3LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCkBAIC0yODAsOSArMjgwLDEzIEBACiBzdGF0aWMgdTE2IHQyMTA0MV9jc3IxNFtdID0geyAweEZGRkYsIDB4RjdGRCwgMHhGN0ZELCAweDdGM0YsIDB4N0YzRCwgfTsKIHN0YXRpYyB1MTYgdDIxMDQxX2NzcjE1W10gPSB7IDB4MDAwOCwgMHgwMDA2LCAweDAwMEUsIDB4MDAwOCwgMHgwMDA4LCB9OwogCisvKiBub3QgdXNlZAogc3RhdGljIHUxNiB0MjExNDJfY3NyMTNbXSA9IHsgMHgwMDAxLCAweDAwMDksIDB4MDAwOSwgMHgwMDAwLCAweDAwMDEsIH07CisqLwogc3RhdGljIHUxNiB0MjExNDJfY3NyMTRbXSA9IHsgMHhGRkZGLCAweDA3MDUsIDB4MDcwNSwgMHgwMDAwLCAweDdGM0QsIH07CisvKiBub3QgdXNlZAogc3RhdGljIHUxNiB0MjExNDJfY3NyMTVbXSA9IHsgMHgwMDA4LCAweDAwMDYsIDB4MDAwRSwgMHgwMDA4LCAweDAwMDgsIH07CisqLwogCiAvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKICAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLwpAQCAtMzAwLDYgKzMwNCwxNCBAQAogICAgIFR4RklGT1VuZGVyZmxvdz0weDIwLCBUeEphYmJlcj0weDA4LCBUeE5vQnVmPTB4MDQsIFR4RGllZD0weDAyLCBUeEludHI9MHgwMSwKIH07CiAKKy8qIFRoZSBjb25maWd1cmF0aW9uIGJpdHMgaW4gQ1NSNi4gKi8KK2VudW0gY3NyNl9tb2RlX2JpdHMgeworCVR4T249MHgyMDAwLCBSeE9uPTB4MDAwMiwgRnVsbER1cGxleD0weDAyMDAsCisJQWNjZXB0QnJvYWRjYXN0PTB4MDEwMCwgQWNjZXB0QWxsTXVsdGljYXN0PTB4MDA4MCwKKwlBY2NlcHRBbGxQaHlzPTB4MDA0MCwgQWNjZXB0UnVudD0weDAwMDgsCit9OworCisKIGVudW0gZGVzY19zdGF0dXNfYml0cyB7CiAgICAgRGVzY093bmRlZD0weDgwMDAwMDAwLCBSeERlc2NGYXRhbEVycj0weDgwMDAsIFJ4V2hvbGVQa3Q9MHgwMzAwLAogfTsKQEAgLTM4NCwyMSArMzk2LDExIEBACiAKICNkZWZpbmUgVFhfUklOR19TSVpFCTIKIHN0YXRpYyBzdHJ1Y3QgdHVsaXBfdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLQotI2lmZGVmIFVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHR4YiAoKGNoYXIgKikweDEwMDAwIC0gQlVGTEVOKQotI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltCVUZMRU5dIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0jZW5kaWYKIAogI2RlZmluZSBSWF9SSU5HX1NJWkUJNAogc3RhdGljIHN0cnVjdCB0dWxpcF9yeF9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotCi0jaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBSWF9SSU5HX1NJWkUgKiBCVUZMRU4gLSBCVUZMRU4pCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW1JYX1JJTkdfU0laRSAqIEJVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLSNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHR1bGlwX3ByaXZhdGUgewogICAgIGludCBjdXJfcng7CkBAIC00NzEsNyArNDczLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogYmxvY2tfbmFtZVtdID0geyIyMTE0MCBub24tTUlJIiwgIjIxMTQwIE1JSSBQSFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIxMTQyIFNlcmlhbCBQSFkiLCAiMjExNDIgTUlJIFBIWSIsICIyMTE0MyBTWU0gUEhZIiwgIjIxMTQzIHJlc2V0IG1ldGhvZCJ9OwogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NzksMTQgKzQ4MCwxMyBAQAogc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKIHN0YXRpYyBpbnQgcmVhZF9lZXByb20odW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKTsKIHN0YXRpYyB2b2lkIHBhcnNlX2VlcHJvbShzdHJ1Y3QgbmljICpuaWMpOwotc3RydWN0IG5pYyAqdHVsaXBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKK3N0YXRpYyBpbnQgdHVsaXBfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKIHN0YXRpYyB2b2lkIHR1bGlwX2luaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMpOwogc3RhdGljIHZvaWQgdHVsaXBfcmVzZXQoc3RydWN0IG5pYyAqbmljKTsKIHN0YXRpYyB2b2lkIHR1bGlwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7Ci1zdGF0aWMgaW50IHR1bGlwX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgdHVsaXBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSk7CitzdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldik7CiBzdGF0aWMgdm9pZCBud2F5X3N0YXJ0KHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5pYyAqbmljKTsKIHN0YXRpYyB2b2lkIHNlbGVjdF9tZWRpYShzdHJ1Y3QgbmljICpuaWMsIGludCBzdGFydHVwKTsKQEAgLTUwNCw3ICs1MDQsNiBAQAogc3RhdGljIHZvaWQgdHVsaXBfbW9yZSh2b2lkKTsKICNlbmRpZgogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVXRpbGl0eSBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MzUsNyArNTM0LDYgQEAKICAgICAgICAgLyogd2FpdCAqLyA7CiB9CiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNZWRpYSBEZXNjcmlwdG9yIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU2NSw3ICs1NjMsNyBAQAogICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKICAgIGZvciBkZXRhaWxzLiAqLwogCi1pbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoraW50IG1kaW9fcmVhZChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKIHsKICAgICBpbnQgaTsKICAgICBpbnQgcmVhZF9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CkBAIC02MjYsNyArNjI0LDcgQEAKICAgICByZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7CiB9CiAKLXZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQordm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCiB7CiAgICAgaW50IGk7CiAgICAgaW50IGNtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb248PDE4KSB8IHZhbHVlOwpAQCAtNjgyLDcgKzY4MCw2IEBACiAgICAgfQogfQogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRUVQUk9NIFJlYWRpbmcgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03MjcsNyArNzI0LDYgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRUVQUk9NIFBhcnNpbmcgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04OTUsMTEgKzg5MSwxMCBAQAogICAgIH0KIH0KIAotDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIHR1bGlwX2luaXRfcmluZyAtIHNldHVwIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvcnMgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgdHVsaXBfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICBpbnQgaTsKIApAQCAtOTM1LDcgKzkzMCwyMiBAQAogICAgIC8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcsIHRob3VnaCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICB0eF9yaW5nWzFdLmxlbmd0aCAgPSBjcHVfdG9fbGUzMihERVNDX1JJTkdfV1JBUCB8IEJVRkxFTik7CiB9Ci0MCisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkgeworCWludCBjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDBENTsKKworCXRwLT5jc3I2ICY9IH4weDAwRDU7CisgCisJLyogIUlGRl9QUk9NSVNDICovCisJdHAtPmNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCisJb3V0bChjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKworCQorCQorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX3Jlc2V0IC0gUmVzZXQgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NDMsNyArOTUzLDYgQEAKIHsKICAgICBpbnQgaTsKICAgICB1bnNpZ25lZCBsb25nIHRvOwotICAgIHUzMiBhZGRyX2xvdywgYWRkcl9oaWdoOwogCiAjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKICAgICB3aGVyZWFtaSgidHVsaXBfcmVzZXRcbiIpOwpAQCAtOTU2LDcgKzk2NSw3IEBACiAgICAgaWYgKHRwLT5taWlfY250ICB8fCAgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5oYXNfbWlpKSkgewogCW91dGwoMHg4MTRDMDAwMCwgaW9hZGRyICsgQ1NSNik7CiAgICAgfQotICAKKyAKICAgICAvKiBSZXNldCB0aGUgY2hpcCwgaG9sZGluZyBiaXQgMCBzZXQgYXQgbGVhc3QgNTAgUENJIGN5Y2xlcy4gKi8KICAgICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjApOwogICAgIHR1bGlwX3dhaXQoMSk7CkBAIC0xMDIyLDggKzEwMzEsOCBAQAogICAgIH0KIAogICAgIC8qIFBvaW50IHRvIHJ4IGFuZCB0eCBkZXNjcmlwdG9ycyAqLwotICAgIG91dGwoKHVuc2lnbmVkIGxvbmcpJnJ4X3JpbmdbMF0sIGlvYWRkciArIENTUjMpOwotICAgIG91dGwoKHVuc2lnbmVkIGxvbmcpJnR4X3JpbmdbMF0sIGlvYWRkciArIENTUjQpOworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmcnhfcmluZ1swXSksIGlvYWRkciArIENTUjMpOworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSksIGlvYWRkciArIENTUjQpOwogCiAgICAgaW5pdF9tZWRpYShuaWMpOwogCkBAIC0xMDQ5LDExICsxMDU4LDEyIEBACiAgICAgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KQogCXR1bGlwX2NoZWNrX2R1cGxleChuaWMpOwogCisgICAgc2V0X3J4X21vZGUobmljKTsgCQorICAgICAgICAKICAgICAvKiBlbmFibGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgKi8KICAgICBvdXRsKHRwLT5jc3I2IHwgMHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CiB9CiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfdHJhbnNtaXQgLSBUcmFuc21pdCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwOTUsNyArMTEwNSw3IEBACiAgICAgdHhfcmluZ1swXS5zdGF0dXMgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKIAogICAgIC8qIFBvaW50IHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KLSAgICBvdXRsKCh1MzIpJnR4X3JpbmdbMF0sIGlvYWRkciArIENTUjQpOworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSksIGlvYWRkciArIENTUjQpOwogCiAgICAgLyogRW5hYmxlIFR4ICovCiAgICAgb3V0bChjc3I2IHwgMHgwMDAwMjAwMCwgaW9hZGRyICsgQ1NSNik7CkBAIC0xMTEzLDExICsxMTIzLDExIEBACiAgICAgLyogRGlzYWJsZSBUeCAqLwogICAgIG91dGwoY3NyNiAmIH4weDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKIH0KLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGV0aF9wb2xsIC0gV2FpdCBmb3IgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgdHVsaXBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKIAogI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCkBAIC0xMTI4LDYgKzExMzgsOCBAQAogICAgIGlmIChyeF9yaW5nW3RwLT5jdXJfcnhdLnN0YXR1cyAmIDB4ODAwMDAwMDApCiAgICAgICAgIHJldHVybiAwOwogCisgICAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQogICAgIHdoZXJlYW1pKCJ0dWxpcF9wb2xsIGdvdCBvbmVcbiIpOwogI2VuZGlmCkBAIC0xMTUxLDE3ICsxMTYzLDIwIEBACiAKICAgICByZXR1cm4gMTsKIH0KLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGV0aF9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdHVsaXBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKIHsKLQorICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCiAgICAgd2hlcmVhbWkoInR1bGlwX2Rpc2FibGVcbiIpOwogI2VuZGlmCiAKKyAgICAvKiBtZXJnZSByZXNldCBhbmQgZGlzYWJsZSAqLworICAgIHR1bGlwX3Jlc2V0KG5pYyk7CisKICAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KICAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjcpOwogCkBAIC0xMTcxLDI0ICsxMTg2LDQxIEBACiAgICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KICAgICAodm9sYXRpbGUgdW5zaWduZWQgbG9uZylpbmwoaW9hZGRyICsgQ1NSOCk7CiB9Ci0MCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKklSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHR1bGlwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICp0dWxpcF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHR1bGlwX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKLSAgICB1MzIgaSwgbDEsIGwyOworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIHUzMiBpOwogICAgIHU4ICBjaGlwX3JldjsKICAgICB1OCBlZV9kYXRhW0VFUFJPTV9TSVpFXTsKICAgICB1bnNpZ25lZCBzaG9ydCBzdW07CiAgICAgaW50IGNoaXBfaWR4OwogICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfcGh5c19hZGRyW0VUSF9BTEVOXSA9IHsweDAwLCAnTCcsICdpJywgJ24nLCAndScsICd4J307CiAKLSAgICBpZiAoaW9fYWRkcnMgPT0gMCB8fCAqaW9fYWRkcnMgPT0gMCkKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpb2FkZHIgICAgICAgICA9ICppb19hZGRyczsKKyAgICBpb2FkZHIgICAgICAgICA9IHBjaS0+aW9hZGRyOworICAgIG5pYy0+aW9hZGRyICAgID0gcGNpLT5pb2FkZHIgJiB+MzsKKyAgICBuaWMtPmlycW5vICAgICA9IDA7CiAKICAgICAvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KICAgICB0cCA9ICZ0cHg7CkBAIC0xMzc4LDE1ICsxNDEwLDE1IEBACiAgICAgLyogcmVzZXQgdGhlIGRldmljZSBhbmQgbWFrZSByZWFkeSBmb3IgdHggYW5kIHJ4IG9mIHBhY2tldHMgKi8KICAgICB0dWxpcF9yZXNldChuaWMpOwogCi0gICAgbmljLT5yZXNldCAgICA9IHR1bGlwX3Jlc2V0OworICAgIGRldi0+ZGlzYWJsZSAgPSB0dWxpcF9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSB0dWxpcF9wb2xsOwogICAgIG5pYy0+dHJhbnNtaXQgPSB0dWxpcF90cmFuc21pdDsKLSAgICBuaWMtPmRpc2FibGUgID0gdHVsaXBfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gdHVsaXBfaXJxOwogCiAgICAgLyogZ2l2ZSB0aGUgYm9hcmQgYSBjaGFuY2UgdG8gcmVzZXQgYmVmb3JlIHJldHVybmluZyAqLwogICAgIHR1bGlwX3dhaXQoNCpUSUNLU19QRVJfU0VDKTsKIAotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YXJ0X2xpbmsoc3RydWN0IG5pYyAqbmljKQpAQCAtMTUwOCw3ICsxNTQwLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIG53YXlfc3RhcnQoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgbndheV9zdGFydChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCiB7CiAgICAgaW50IGNzcjE0ID0gKCh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDc4MCkgPDwgOSkgIHwKICAgICAgICAgKCh0cC0+c3ltX2FkdmVydGlzZSYweDAwMjApPDwxKSB8IDB4ZmZiZjsKQEAgLTE2NjIsNyArMTY5NCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgcG5pY19kb19ud2F5KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICB1MzIgcGh5X3JlZyA9IGlubChpb2FkZHIgKyAweEI4KTsKICAgICB1MzIgbmV3X2NzcjYgPSB0cC0+Y3NyNiAmIH4weDQwQzQwMjAwOwpAQCAtMTg4Niw4ICsxOTE4LDggQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gREMyMTA0MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMTA0MCAqLwogICAgICAgICAvKiBUdXJuIG9uIHRoZSB4Y3ZyIGludGVyZmFjZS4gKi8KLSAgICAgICAgaW50IGNzcjEyID0gaW5sKGlvYWRkciArIENTUjEyKTsKICNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICBpbnQgY3NyMTIgPSBpbmwoaW9hZGRyICsgQ1NSMTIpOwogICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQogICAgICAgICAgICAgcHJpbnRmKCIlczogMjEwNDAgbWVkaWEgdHlwZSBpcyAlcywgQ1NSMTIgaXMgJWhoWC5cbiIsCiAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBtZWRpYW5hbWVbdHAtPmlmX3BvcnRdLCBjc3IxMik7CkBAIC0xOTg3LDMgKzIwMTksNTEgQEAKIAogICAgICAgICByZXR1cm4gMDsKIH0KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgdHVsaXBfbmljc1tdID0geworUENJX1JPTSgweDEwMTEsIDB4MDAwMiwgImRjMjEwNDAiLCAgICAgIkRpZ2l0YWwgVHVsaXAiKSwKK1BDSV9ST00oMHgxMDExLCAweDAwMDksICJkczIxMTQwIiwgICAgICJEaWdpdGFsIFR1bGlwIEZhc3QiKSwKK1BDSV9ST00oMHgxMDExLCAweDAwMTQsICJkYzIxMDQxIiwgICAgICJEaWdpdGFsIFR1bGlwKyIpLAorUENJX1JPTSgweDEwMTEsIDB4MDAxOSwgImRzMjExNDIiLCAgICAgIkRpZ2l0YWwgVHVsaXAgMjExNDIiKSwKK1BDSV9ST00oMHgxMGI3LCAweDkzMDAsICIzY3NvaG8xMDBiLXR4IiwiM0NvbVNPSE8xMDBCLVRYIiksCitQQ0lfUk9NKDB4MTBiOSwgMHg1MjYxLCAiYWxpMTU2MyIsICAgICAiQUxpIDE1NjMgaW50ZWdyYXRlZCBldGhlcm5ldCIpLAorUENJX1JPTSgweDEwZDksIDB4MDUxMiwgIm14OTg3MTMiLCAgICAgIk1hY3Jvbml4IE1YOTg3eDMiKSwKK1BDSV9ST00oMHgxMGQ5LCAweDA1MzEsICJteDk4NzE1IiwgICAgICJNYWNyb25peCBNWDk4N3g1IiksCitQQ0lfUk9NKDB4MTExMywgMHgxMjE3LCAibXhpYy05ODcxNSIsICAiTWFjcm9uaXggTVg5ODd4NSIpLAorUENJX1JPTSgweDExYWQsIDB4YzExNSwgImxjODJjMTE1IiwgICAgIkxpbmtTeXMgTE5FMTAwVFgiKSwKK1BDSV9ST00oMHgxMWFkLCAweDAwMDIsICI4MmMxNjgiLCAgICAgICJOZXRnZWFyIEZBMzEwVFgiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMDAsICJkbTkxMDAiLCAgICAgICJEYXZpY29tIDkxMDAiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMDIsICJkbTkxMDIiLCAgICAgICJEYXZpY29tIDkxMDIiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkwMDksICJkbTkwMDkiLCAgICAgICJEYXZpY29tIDkwMDkiKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMzIsICJkbTkxMzIiLCAgICAgICJEYXZpY29tIDkxMzIiKSwKK1BDSV9ST00oMHgxMzE3LCAweDA5ODUsICJjZW50YXVyLXAiLCAgICJBRE10ZWsgQ2VudGF1ci1QIiksCitQQ0lfUk9NKDB4MTMxNywgMHgwOTgxLCAiYW45ODEiLCAgICAgICAiQURNdGVrIEFOOTgxIENvbWV0IiksCQkvKiBBRE1UZWsgQ2VudGF1ci1QIChzdG1pY3JvKSAqLworUENJX1JPTSgweDExMTMsIDB4MTIxNiwgImFuOTgzIiwgICAgICAgIkFETVRlayBBTjk4MyBDb21ldCIpLAorUENJX1JPTSgweDEzMTcsIDB4OTUxMSwgImFuOTgzYiIsICAgICAgIkFETVRlayBDb21ldCA5ODNiIiksCitQQ0lfUk9NKDB4MTMxNywgMHgxOTg1LCAiY2VudGF1ci1jIiwgICAiQURNVGVrIENlbnRhdXItQyIpLAorUENJX1JPTSgweDgwODYsIDB4MDAzOSwgImludGVsMjExNDUiLCAgIkludGVsIFR1bGlwIiksCitQQ0lfUk9NKDB4MTI1YiwgMHgxNDAwLCAiYXg4ODE0MCIsICAgICAiQVNJWCBBWDg4MTQwIiksCitQQ0lfUk9NKDB4MTFmNiwgMHg5ODgxLCAicmwxMDB0eCIsICAgICAiQ29tcGV4IFJMMTAwLVRYIiksCitQQ0lfUk9NKDB4MTE1ZCwgMHgwMDAzLCAieGlyY29tdHVsaXAiLCAiWGlyY29tIFR1bGlwIiksCitQQ0lfUk9NKDB4MTA0YSwgMHgwOTgxLCAidHVsaXAtMDk4MSIsICAiVHVsaXAgMHgxMDRhIDB4MDk4MSIpLAorUENJX1JPTSgweDEwNGEsIDB4Mjc3NCwgInR1bGlwLTI3NzQiLCAgIlR1bGlwIDB4MTA0YSAweDI3NzQiKSwKK1BDSV9ST00oMHgxMTEzLCAweDk1MTEsICJ0dWxpcC05NTExIiwgICJUdWxpcCAweDExMTMgMHg5NTExIiksCitQQ0lfUk9NKDB4MTE4NiwgMHgxNTYxLCAidHVsaXAtMTU2MSIsICAiVHVsaXAgMHgxMTg2IDB4MTU2MSIpLAorUENJX1JPTSgweDEyNTksIDB4YTEyMCwgInR1bGlwLWExMjAiLCAgIlR1bGlwIDB4MTI1OSAweGExMjAiKSwKK1BDSV9ST00oMHgxM2QxLCAweGFiMDIsICJ0dWxpcC1hYjAyIiwgICJUdWxpcCAweDEzZDEgMHhhYjAyIiksCitQQ0lfUk9NKDB4MTNkMSwgMHhhYjAzLCAidHVsaXAtYWIwMyIsICAiVHVsaXAgMHgxM2QxIDB4YWIwMyIpLAorUENJX1JPTSgweDEzZDEsIDB4YWIwOCwgInR1bGlwLWFiMDgiLCAgIlR1bGlwIDB4MTNkMSAweGFiMDgiKSwKK1BDSV9ST00oMHgxNGYxLCAweDE4MDMsICJsYW5maW5pdHkiLCAgICJDb25leGFudCBMQU5maW5pdHkiKSwKK1BDSV9ST00oMHgxNjI2LCAweDg0MTAsICJ0dWxpcC04NDEwIiwgICJUdWxpcCAweDE2MjYgMHg4NDEwIiksCitQQ0lfUk9NKDB4MTczNywgMHhhYjA4LCAidHVsaXAtMTczNy1hYjA4IiwiVHVsaXAgMHgxNzM3IDB4YWIwOCIpLAorUENJX1JPTSgweDE3MzcsIDB4YWIwOSwgInR1bGlwLWFiMDkiLCAgIlR1bGlwIDB4MTczNyAweGFiMDkiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHR1bGlwX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJUdWxpcCIsCisJLnByb2JlICAgID0gdHVsaXBfcHJvYmUsCisJLmlkcyAgICAgID0gdHVsaXBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YodHVsaXBfbmljcykvc2l6ZW9mKHR1bGlwX25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpJbmRleDogYi9uZXRib290L3R1bGlwLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL25ldGJvb3QvdHVsaXAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgotdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0KLVRoaXMgaXMgYSB0dWxpcCBhbmQgY2xvbmUgZHJpdmVyIGZvciBFdGhlcmJvb3QuICBTZWUgdGhlIHJldmlzaW9uCi1oaXN0b3J5IGluIHRoZSB0dWxpcC5jIGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGNoYW5nZXMuICBUaGlzIHZlcnNpb24KLW9mIHRoZSBkcml2ZXIgaW5jb3Jwb3JhdGVzIGNoYW5nZXMgZnJvbSBCb2IgRWR3YXJkcyBhbmQgUGF1bCBNYWNrZXJyYXMKLXdobyBjYW50cmlidXRlZCBjaGFuZ2VzIHRvIHN1cHBvcnQgdGhlIFRSRU5EbmV0IFRFMTAwLVBDSUEgTklDIHdoaWNoCi11c2VzIGEgZ2VudWluZSBJbnRlbCAyMTE0My1QRCBjaGlwc2V0LiAgVGhlcmUgYXJlIGFsc28gdmFyaW91cyBjb2RlCi1jbGVhbnVwcyB0byBtYWtlIHRpbWUtYmFzZWQgYWN0aXZpdGllcyBtb3JlIHJlbGlhYmxlLgotCi1PZiBjb3Vyc2UgeW91IGhhdmUgdG8gaGF2ZSBhbGwgdGhlIHVzdWFsIEV0aGVyYm9vdCBlbnZpcm9ubWVudAotKGJvb3RwL2RoY3AvTkZTKSBzZXQgdXAsIGFuZCB5b3UgbmVlZCBhIExpbnV4IGtlcm5lbCB3aXRoIHYwLjkxZwotKDcuMTYuOTkpIG9yIGxhdGVyIG9mIHRoZSB0dWxpcC5jIGRyaXZlciBjb21waWxlZCBpbiB0byBzdXBwb3J0IHNvbWUKLU1YOTg3MTUgYmFzZWQgY2FyZHMuICBUaGF0IGZpbGUgaXMgYXZhaWxhYmxlIGF0OgotCi0gIGh0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9kcml2ZXJzL3Rlc3QvdHVsaXAuYwotCi1OT1RFUwotCi1JJ3ZlIHRlc3RlZCB0aGlzIGRyaXZlciB3aXRoIGEgU09IT3dhcmUgRmFzdCAxMC8xMDAgTW9kZWwgU0RBMTEwQSwKLWEgTGlua3N5cyBMTkUxMDBUWCB2Mi4wLCBhbmQgYSBOZXRnZWFyIEZBMzEwVFggY2FyZCwgYW5kIGl0IHdvcmtlZCBhdAotYm90aCAxMCBhbmQgMTAwIG1iaXRzLiBPdGhlciBjYXJkcyBiYXNlZCBvbiB0aGUgdHVsaXAgZmFtaWx5IG1heSB3b3JrIGFzCi13ZWxsLgotCi1UaGVzZSBjYXJkcyBhcmUgYWJvdXQgMjAkVVMsIGFyZSBzdXBwb3J0ZWQgYnkgTGludXggYW5kIG5vdyBFdGhlcmJvb3QsCi1hbmQgYmVpbmcgUENJLCB0aGV5IGF1dG8tY29uZmlndXJlIElSUSBhbmQgSU9BRERSIGFuZCBhdXRvLW5lZ290aWF0ZQotMTAvMTAwIGhhbGYvZnVsbCBkdXBsZXguIEl0IHNlZW1zIGxpa2UgYSBwcmV0dHkgZ29vZCB2YWx1ZSBjb21wYXJlZCB0bwotc29tZSBvZiB0aGUgcHJpY2llciBjYXJkcywgYW5kIGNhbiBsb3dlciB0aGUgY29zdCBvZiBidWlsZGluZy9hZGFwdGluZwotdGhpbiBjbGllbnQgd29ya3N0YXRpb25zIHN1YnN0YW50aWFsbHkgd2hpbGUgZ2l2aW5nIGEgY29uc2lkZXJhYmxlCi1wZXJmb3JtYW5jZSBpbmNyZWFzZS4KLQotT24gc29tZSBQQ0kgdHVsaXAgY2xvbmUgY2hpcHNldHMgKE1YOTg3eDUsIExDODJDMTE1LCBMQzgyQzE2OCkgdGhpcyBkcml2ZXIgCi1sZXRzIHRoZSBjYXJkIGNob29zZSB0aGUgZmFzdGVzdCBzcGVlZCBpdCBjYW4gbmVnb3RpYXRlIHdpdGggdGhlIHBlZXIKLWRldmljZS4gIE9uIG90aGVyIGNhcmRzLCBpdCBjaG9vc2VzIDEwbWJpdCBoYWxmLWR1cGxleC4KLQotSSBidXJuZWQgYW4gQU0yN0MyNTYgKDMyS0J5dGUpIEVQUk9NIHdpdGggbXg5ODd4NS5senJvbSBhbmQgaXQgd29ya2VkLgotQWNjb3JkaW5nIHRvIHRoZSBkYXRhIHNoZWV0IHRoZSBNWDk4NzE1QSBzdXBwb3J0cyB1cCB0byA2NEsgKDI3QzUxMikKLUVQUk9NcywgCi0KLUkndmUgbGliZXJhbGx5IGNvbW1lbnRlZCB0aGUgY29kZSBhbmQgaGVhZGVyIGZpbGVzIGluIHRoZSBob3BlIHRoYXQgaXQKLXdpbGwgaGVscCB0aGUgbmV4dCBwZXJzb24gd2hvIGhhY2tzIHRoZSBjb2RlIG9yIG5lZWRzIHRvIHN1cHBvcnQgc29tZQotdHVsaXAgY2xvbmUgY2FyZCwgb3Igd2lzaGVzIHRvIGFkZCBmdW5jdGlvbmFsaXR5LgotCi1Bbnl3YXksIHBsZWFzZSB0ZXN0IHRoaXMgaWYgeW91IGNhbiBvbiB5b3VyIHR1bGlwIGJhc2VkIGNhcmQsIGFuZCBsZXQKLW1lIChtZGNAdGhpbmd1aW4ub3JnKSBhbmQgdGhlIG5ldGJvb3QgbGlzdCAobmV0Ym9vdEBiYWdoaXJhLmhhbi5kZSkKLWtub3cgaG93IHRoaW5ncyBnby4gIEkgYWxzbyB3b3VsZCBhcHByZWNpYXRlIGNvZGUgcmV2aWV3IGJ5IHBlb3BsZSB3aG8KLXByb2dyYW0uICBJJ20gYSBzdHJvbmcgYmVsaWV2ZXIgaW4gImFub3RoZXIgc2V0IG9mIGV5ZXMiLgotCi1SZWdhcmRzLAotCi1NYXJ0eSBDb25ub3IKLW1kY0B0aGluZ3Vpbi5vcmcKLWh0dHA6Ly93d3cudGhpbmd1aW4ub3JnLwpJbmRleDogYi9uZXRib290L3R5cGVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdHlwZXMuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9UWVBFU19ICisjZGVmaW5lIF9UWVBFU19ICisKKy8qIEknbSBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlZCA6LSkgKi8KKworLyogCisgKiBJdCdzIGFyY2hpdGVjdHVyZSBkZXBlbmRlZCBoZWFkZXJzIGZvciBjb21tb24gaW50ZWdlciB0eXBlcworICovCisjaW5jbHVkZSAic3RkaW50LmgiCisKKy8qIAorICogSGVyZSBhcmUgc29tZSBSUEMgdHlwZXMgZGVmaW5lIGZyb20gbGludXggL3Vzci9pbmNsdWRlL3JwYy90eXBlcy5oCisgKi8KK3R5cGVkZWYgaW50IGJvb2xfdDsKK3R5cGVkZWYgaW50IGVudW1fdDsKK3R5cGVkZWYgdWludDMyX3QgcnBjcHJvZ190OwordHlwZWRlZiB1aW50MzJfdCBycGN2ZXJzX3Q7Cit0eXBlZGVmIHVpbnQzMl90IHJwY3Byb2NfdDsKK3R5cGVkZWYgdWludDMyX3QgcnBjcHJvdF90OwordHlwZWRlZiB1aW50MzJfdCBycGNwb3J0X3Q7CisKKy8qIEZvciBib29sX3QgKi8KKy8qIHR5cGVkZWYgZW51bSB7ICovCisvKiAgCUZBTFNFID0gMCwgKi8KKy8qICAJVFJVRSA9IDEgKi8KKy8qIH0gYm9vbGVhbl90OyAqLworCisKKworLyogU29tZSBCU0Qgb3IgUlBDIHN0eWxlIHR5cGVzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdV9sb25nOwordHlwZWRlZiBsb25nIGxvbmcgcXVhZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdV9xdWFkX3Q7Cit0eXBlZGVmIHN0cnVjdCB7CisJaW50IF9fdmFsWzJdOworfWZzaWRfdDsJCQkvKiBUeXBlIG9mIGZpbGUgc3lzdGVtIElEcywgZnJvbSBiaXRzL3R5cGVzLmggKi8KKwordHlwZWRlZiBpbnQgZGFkZHJfdDsJCS8qIFRoZSB0eXBlIG9mIGEgZGlzayBhZGRyZXNzLCBmcm9tIGJpdHMvdHlwZXMuaCAqLwordHlwZWRlZiBjaGFyICogY2FkZHJfdDsKKworI2VuZGlmIC8qIF9UWVBFU19IICovCkluZGV4OiBiL25ldGJvb3QvdWRwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdWRwLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZglfVURQX0gKKyNkZWZpbmUJX1VEUF9ICisKKy8qIFdlIG5lZWQgJ3VpbnQxNl90JyBhbmQgJ3VpbnQ4X3QnICAqLworI2luY2x1ZGUgInR5cGVzLmgiCisvKiBXZSBuZWVkICdpbl9hZGRyJyAqLworI2luY2x1ZGUgImluLmgiCisKK3N0cnVjdCB1ZHBfcHNldWRvX2hkciB7CisJaW5fYWRkciAgc3JjOworCWluX2FkZHIgIGRlc3Q7CisJdWludDhfdCAgdW51c2VkOworCXVpbnQ4X3QgIHByb3RvY29sOworCXVpbnQxNl90IGxlbjsKK307CitzdHJ1Y3QgdWRwaGRyIHsKKwl1aW50MTZfdCBzcmM7CisJdWludDE2X3QgZGVzdDsKKwl1aW50MTZfdCBsZW47CisJdWludDE2X3QgY2hrc3VtOworfTsKKworZXh0ZXJuIHZvaWQgYnVpbGRfdWRwX2hkcih1bnNpZ25lZCBsb25nIF9fZGVzdGlwLCB1bnNpZ25lZCBpbnQgX19zcmNzb2NrLCAKKwkgICAgICB1bnNpZ25lZCBpbnQgX19kZXN0c29jaywgaW50IF9fdHRsLCBpbnQgX19sZW4sIAorCSAgICAgIGNvbnN0IHZvaWQgKiBfX2J1Zik7CisKK2V4dGVybiBpbnQgdWRwX3RyYW5zbWl0KHVuc2lnbmVkIGxvbmcgX19kZXN0aXAsIHVuc2lnbmVkIGludCBfX3NyY3NvY2ssCisJCQl1bnNpZ25lZCBpbnQgX19kZXN0c29jaywgaW50IF9fbGVuLCBjb25zdCB2b2lkICogX19idWYpOworCisjZW5kaWYJLyogX1VEUF9IICovCkluZGV4OiBiL25ldGJvb3QvdmlhLXJoaW5lLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L3ZpYS1yaGluZS5jCisrKyBiL25ldGJvb3QvdmlhLXJoaW5lLmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAicmhpbmUuYyB2MS4wLjAgMjAwMC0wMS0wN1xuIjsKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gInJoaW5lLmMgdjEuMC4xIDIwMDMtMDItMDZcbiI7CiAKIC8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KIApAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogI2luY2x1ZGUgIm5pYy5oIgogI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCiAKIC8qIGRlZmluZSBhbGwgaW9hZGRyICovCiAKQEAgLTEwMyw2ICsxMDIsMTEgQEAKICNkZWZpbmUgYnlDRkdECQkJCWlvYWRkciArIDB4N2IKICNkZWZpbmUgd1RhbGx5Q250TVBBCQkJaW9hZGRyICsgMHg3YwogI2RlZmluZSB3VGFsbHlDbnRDUkMJCQlpb2FkZHIgKyAweDdkCisjZGVmaW5lIGJ5U1RJQ0tIVwkJCWlvYWRkciArIDB4ODMKKyNkZWZpbmUgYnlXT0xjckNscgkJCWlvYWRkciArIDB4QTQKKyNkZWZpbmUgYnlXT0xjZ0NscgkJCWlvYWRkciArIDB4QTcKKyNkZWZpbmUgYnlQd3Jjc3JDbHIJCQlpb2FkZHIgKyAweEFDCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeGlvYWRkciBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTYxNyw5ICs2MjEsNiBAQAogCiAqLwogCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfRkVUCQkweDExMDYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9GRVRfMzA0MwkJMHgzMDQzCi0KIC8qIFRoZSByZXN0IG9mIHRoZXNlIHZhbHVlcyBzaG91bGQgbmV2ZXIgY2hhbmdlLiAqLwogI2RlZmluZSBOVU1fVFhfREVTQwkyCS8qIE51bWJlciBvZiBUeCBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gKi8KIApAQCAtNjUyLDIzICs2NTMsMTkgQEAKIH0KIHJoaW5lOwogCi1zdGF0aWMgc3RydWN0IG5pYyAqcmhpbmVfcHJvYmUxIChzdHJ1Y3QgbmljICpkZXYsIGludCBpb2FkZHIsCitzdGF0aWMgdm9pZCByaGluZV9wcm9iZTEgKHN0cnVjdCBuaWMgKm5pYywgaW50IGlvYWRkciwKIAkJCQkgaW50IGNoaXBfaWQsIGludCBvcHRpb25zKTsKIHN0YXRpYyBpbnQgUXVlcnlBdXRvIChpbnQpOwogc3RhdGljIGludCBSZWFkTUlJIChpbnQgYnlNSUlJbmRleCwgaW50KTsKIHN0YXRpYyB2b2lkIFdyaXRlTUlJIChjaGFyLCBjaGFyLCBjaGFyLCBpbnQpOwogc3RhdGljIHZvaWQgTUlJRGVsYXkgKHZvaWQpOwogc3RhdGljIHZvaWQgcmhpbmVfaW5pdF9yaW5nIChzdHJ1Y3QgbmljICpkZXYpOwotc3RhdGljIHZvaWQgcmhpbmVfZGlzYWJsZSAoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHJoaW5lX2Rpc2FibGUgKHN0cnVjdCBkZXYgKmRldik7CiBzdGF0aWMgdm9pZCByaGluZV9yZXNldCAoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyBpbnQgcmhpbmVfcG9sbCAoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgcmhpbmVfcG9sbCAoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmVpdmUpOwogc3RhdGljIHZvaWQgcmhpbmVfdHJhbnNtaXQgKHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCiAJCQkgICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOwogCi0vKiBMaW51eCBzdXBwb3J0IGZ1bmN0aW9ucyAqLwotI2RlZmluZSB2aXJ0X3RvX2J1cyh4KSAoKHVuc2lnbmVkIGxvbmcpeCkKLSNkZWZpbmUgYnVzX3RvX3ZpcnQoeCkgKCh2b2lkICopeCkKLQogLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KIHN0YXRpYyB2b2lkCiByaGluZV9pbml0X3JpbmcgKHN0cnVjdCBuaWMgKm5pYykKQEAgLTg1NCwyNiArODUxLDk5IEBACiAgICAgfQogfQogCi1zdHJ1Y3QgbmljICoKLXJoaW5lX3Byb2JlIChzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLAotCSAgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KK2VudW0gcmVnaXN0ZXJfb2Zmc2V0cyB7CisgICAgICAgIFN0YXRpb25BZGRyPTB4MDAsIFJ4Q29uZmlnPTB4MDYsIFR4Q29uZmlnPTB4MDcsIENoaXBDbWQ9MHgwOCwKKyAgICAgICAgSW50clN0YXR1cz0weDBDLCBJbnRyRW5hYmxlPTB4MEUsCisgICAgICAgIE11bHRpY2FzdEZpbHRlcjA9MHgxMCwgTXVsdGljYXN0RmlsdGVyMT0weDE0LAorICAgICAgICBSeFJpbmdQdHI9MHgxOCwgVHhSaW5nUHRyPTB4MUMsIEdGSUZPVGVzdD0weDU0LAorICAgICAgICBNSUlQaHlBZGRyPTB4NkMsIE1JSVN0YXR1cz0weDZELCBQQ0lCdXNDb25maWc9MHg2RSwKKyAgICAgICAgTUlJQ21kPTB4NzAsIE1JSVJlZ0FkZHI9MHg3MSwgTUlJRGF0YT0weDcyLCBNQUNSZWdFRWNzcj0weDc0LAorICAgICAgICBDb25maWdBPTB4NzgsIENvbmZpZ0I9MHg3OSwgQ29uZmlnQz0weDdBLCBDb25maWdEPTB4N0IsCisgICAgICAgIFJ4TWlzc2VkPTB4N0MsIFJ4Q1JDRXJycz0weDdFLCBNaXNjQ21kPTB4ODEsCisgICAgICAgIFN0aWNreUhXPTB4ODMsIEludHJTdGF0dXMyPTB4ODQsIFdPTGNyQ2xyPTB4QTQsIFdPTGNnQ2xyPTB4QTcsCisgICAgICAgIFB3cmNzckNscj0weEFDLAorfTsKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisgICAgICAgIEludHJSeERvbmU9MHgwMDAxLCBJbnRyUnhFcnI9MHgwMDA0LCBJbnRyUnhFbXB0eT0weDAwMjAsCisgICAgICAgIEludHJUeERvbmU9MHgwMDAyLCBJbnRyVHhFcnJvcj0weDAwMDgsIEludHJUeFVuZGVycnVuPTB4MDIxMCwKKyAgICAgICAgSW50clBDSUVycj0weDAwNDAsCisgICAgICAgIEludHJTdGF0c01heD0weDAwODAsIEludHJSeEVhcmx5PTB4MDEwMCwKKyAgICAgICAgSW50clJ4T3ZlcmZsb3c9MHgwNDAwLCBJbnRyUnhEcm9wcGVkPTB4MDgwMCwgSW50clJ4Tm9CdWY9MHgxMDAwLAorICAgICAgICBJbnRyVHhBYm9ydGVkPTB4MjAwMCwgSW50ckxpbmtDaGFuZ2U9MHg0MDAwLAorICAgICAgICBJbnRyUnhXYWtlVXA9MHg4MDAwLAorICAgICAgICBJbnRyTm9ybWFsU3VtbWFyeT0weDAwMDMsIEludHJBYm5vcm1hbFN1bW1hcnk9MHhDMjYwLAorICAgICAgICBJbnRyVHhEZXNjUmFjZT0weDA4MDAwMCwgICAgICAgIC8qIG1hcHBlZCBmcm9tIEludHJTdGF0dXMyICovCisgICAgICAgIEludHJUeEVyclN1bW1hcnk9MHgwODIyMTgsCit9OworI2RlZmluZSBERUZBVUxUX0lOVFIgKEludHJSeERvbmUgfCBJbnRyUnhFcnIgfCBJbnRyUnhFbXB0eXwgSW50clJ4T3ZlcmZsb3cgfCBcCisgICAgICAgICAgICAgICAgICAgSW50clJ4RHJvcHBlZCB8IEludHJSeE5vQnVmKSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIElSUSAtIFBYRSBJUlEgSGFuZGxlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCByaGluZV9pcnEgKCBzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24gKSB7CisgICAgIHN0cnVjdCByaGluZV9wcml2YXRlICp0cCA9IChzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqKSBuaWMtPnByaXZfZGF0YTsKKyAgICAgLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgIHVuc2lnbmVkIGludCBpbnRyX3N0YXR1czsKKworICAgICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgICAgICAgICAgY2FzZSBESVNBQkxFIDoKKyAgICAgICAgICBjYXNlIEVOQUJMRSA6CisgICAgICAgICAgICAgICBpbnRyX3N0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworICAgICAgICAgICAgICAgLyogT24gUmhpbmUtSUksIEJpdCAzIGluZGljYXRlcyBUeCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcmFjZS4gKi8KKyAgICAgICAgICAgICAgIGlmICh0cC0+Y2hpcF9pZCA9PSAweDMwNjUpCisgICAgICAgICAgICAgICAgICAgaW50cl9zdGF0dXMgfD0gaW5iKG5pYy0+aW9hZGRyICsgSW50clN0YXR1czIpIDw8IDE2OworICAgICAgICAgICAgICAgaW50cl9zdGF0dXMgPSAoaW50cl9zdGF0dXMgJiB+REVGQVVMVF9JTlRSKTsKKyAgICAgICAgICAgICAgIGlmICggYWN0aW9uID09IEVOQUJMRSApIAorICAgICAgICAgICAgICAgICAgIGludHJfc3RhdHVzID0gaW50cl9zdGF0dXMgfCBERUZBVUxUX0lOVFI7CisgICAgICAgICAgICAgICBvdXR3KGludHJfc3RhdHVzLCBuaWMtPmlvYWRkciArIEludHJFbmFibGUpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEZPUkNFIDoKKyAgICAgICAgICAgICAgIG91dHcoMHgwMDEwLCBuaWMtPmlvYWRkciArIDB4ODQpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3JoaW5lX3Byb2JlIChzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCiB7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gJnJoaW5lOwogICAgIGlmICghcGNpLT5pb2FkZHIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbmljID0gcmhpbmVfcHJvYmUxIChuaWMsIHBjaS0+aW9hZGRyLCAwLCAtMSk7CisJcmV0dXJuIDA7CisgICAgcmhpbmVfcHJvYmUxIChuaWMsIHBjaS0+aW9hZGRyLCBwY2ktPmRldl9pZCwgLTEpOwogCi0gICAgaWYgKG5pYykKLQlhZGp1c3RfcGNpX2RldmljZShwY2kpOwotICAgIG5pYy0+cG9sbCA9IHJoaW5lX3BvbGw7Ci0gICAgbmljLT50cmFuc21pdCA9IHJoaW5lX3RyYW5zbWl0OwotICAgIG5pYy0+cmVzZXQgPSByaGluZV9yZXNldDsKLSAgICBuaWMtPmRpc2FibGUgPSByaGluZV9kaXNhYmxlOworICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAgICAgcmhpbmVfcmVzZXQgKG5pYyk7CiAKLSAgICByZXR1cm4gbmljOworICAgIGRldi0+ZGlzYWJsZSAgPSByaGluZV9kaXNhYmxlOworICAgIG5pYy0+cG9sbCAgICAgPSByaGluZV9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSByaGluZV90cmFuc21pdDsKKyAgICBuaWMtPmlycW5vCSAgPSBwY2ktPmlycTsKKyAgICBuaWMtPmlycSAgICAgID0gcmhpbmVfaXJxOworICAgIG5pYy0+aW9hZGRyICAgPSB0cC0+aW9hZGRyOworCisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSB7CisgICAgCXN0cnVjdCByaGluZV9wcml2YXRlICp0cCA9IChzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqKSBuaWMtPnByaXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHJ4X21vZGU7CisgICAgCWludCBpb2FkZHIgPSB0cC0+aW9hZGRyOworCisJLyogISBJRkZfUFJPTUlTQyAqLworCW91dGwoMHhmZmZmZmZmZiwgYnlNQVIwKTsKKwlvdXRsKDB4ZmZmZmZmZmYsIGJ5TUFSNCk7CisJcnhfbW9kZSA9IDB4MEM7CisKKwlvdXRiKDB4NjAgLyogdGhyZXNoICovIHwgcnhfbW9kZSwgYnlSQ1IgKTsKIH0KIAotc3RhdGljIHN0cnVjdCBuaWMgKgorc3RhdGljIHZvaWQKIHJoaW5lX3Byb2JlMSAoc3RydWN0IG5pYyAqbmljLCBpbnQgaW9hZGRyLCBpbnQgY2hpcF9pZCwgaW50IG9wdGlvbnMpCiB7CiAgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwOwpAQCAtODg1LDYgKzk1NSwyOSBAQAogCiAgICAgaWYgKHJoaW5lX2RlYnVnID4gMCAmJiBkaWRfdmVyc2lvbisrID09IDApCiAJcHJpbnRmICh2ZXJzaW9uKTsKKworICAgIC8qIEQtTGluayBwcm92aWRlZCByZXNldCBjb2RlICh3aXRoIGNvbW1lbnQgYWRkaXRpb25zKSAqLworICAgIGlmKChjaGlwX2lkICE9IDB4MzA0MykgJiYgKGNoaXBfaWQgIT0gMHg2MTAwKSkgeworCXVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKKwkKKwlpZihyaGluZV9kZWJ1ZyA+IDApCisJCXByaW50ZigiRW5hYmxpbmcgU3RpY2t5IEJpdCBXb3JrYXJvdW5kIGZvciBDaGlwX2lkOiAweCVoWFxuIgorCQkJCSwgY2hpcF9pZCk7CisJLyogY2xlYXIgc3RpY2t5IGJpdCBiZWZvcmUgcmVzZXQgJiByZWFkIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlieU9yZ1ZhbHVlID0gaW5iKGJ5U1RJQ0tIVyk7CisJYnlPcmdWYWx1ZSA9IGJ5T3JnVmFsdWUgJiAweEZDOworCW91dGIoYnlPcmdWYWx1ZSwgYnlTVElDS0hXKTsKKworCS8qIChiaXRzIHdyaXR0ZW4gYXJlIGNsZWFyZWQ/KSAqLworCS8qIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZSAqLworCW91dGIoMHg4MCwgYnlXT0xjZ0Nscik7CisJLyogZGlzYWJsZSBwb3dlci1ldmVudCBjb25maWcgYml0ICovCisJb3V0YigweEZGLCBieVdPTGNyQ2xyKTsKKwkvKiBjbGVhciBwb3dlciBzdGF0dXMgKHVuZG9jdW1lbnRlZCBpbiB2dDYxMDIgZG9jcz8pICovCisJb3V0YigweEZGLCBieVB3cmNzckNscik7CisJCisgICAgfQorCiAgICAgLyogUGVyaGFwcyB0aGlzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIEVFUFJPTT8gKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAluaWMtPm5vZGVfYWRkcltpXSA9IGluYiAoYnlQQVIwICsgaSk7CkBAIC05MjAsNiArMTAxMyw3IEBACiAJfQogI2VuZGlmCiAKKyAgICAKICAgICAvKiBxdWVyeSBNSUkgdG8ga25vdyBMaW5lU3BlZWQsZHVwbGV4IG1vZGUgKi8KICAgICBieU1JSXZhbHVlID0gaW5iIChpb2FkZHIgKyAweDZkKTsKICAgICBMaW5lU3BlZWQgPSBieU1JSXZhbHVlICYgTUlJU1JfU1BFRUQ7CkBAIC05NzEsMTUgKzEwNjUsMTkgQEAKIAlpZiAodHAtPmRlZmF1bHRfcG9ydCkKIAkgICAgdHAtPm1lZGlhbG9jayA9IDE7CiAgICAgfQotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZAotcmhpbmVfZGlzYWJsZSAoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgCityaGluZV9kaXNhYmxlIChzdHJ1Y3QgZGV2ICpkZXYpCiB7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOwogICAgIGludCBpb2FkZHIgPSB0cC0+aW9hZGRyOwogCisgICAgLyogbWVyZ2UgcmVzZXQgYW5kIGRpc2FibGUgKi8KKyAgICByaGluZV9yZXNldChuaWMpOworCiAgICAgcHJpbnRmICgicmhpbmUgZGlzYWJsZVxuIik7CiAgICAgLyogU3dpdGNoIHRvIGxvb3BiYWNrIG1vZGUgdG8gYXZvaWQgaGFyZHdhcmUgcmFjZXMuICovCiAgICAgd3JpdGViKDB4NjAgfCAweDAxLCBieVRDUik7CkBAIC0xMDAyLDE3ICsxMTAwLDEwIEBACiAgICAgaW50IHJ4X2J1ZnNfdG1wLCByeF9idWZzX3RtcDE7CiAgICAgaW50IHR4X2J1ZnNfdG1wLCB0eF9idWZzX3RtcDE7CiAKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSBidWYxICgweDEwMDAwIC0gKFJYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1ogKyAzMikpCi0jZGVmaW5lIGJ1ZjIgKGJ1ZjEgLSAoUlhfUklOR19TSVpFICogUEtUX0JVRl9TWiArIDMyKSkKLSNkZWZpbmUgZGVzYzEgKGJ1ZjIgLSAoVFhfUklOR19TSVpFICogc2l6ZW9mIChzdHJ1Y3QgcmhpbmVfdHhfZGVzYykgKyAzMikpCi0jZGVmaW5lIGRlc2MyIChkZXNjMSAtIChUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyKSkKLSNlbHNlCiAgICAgc3RhdGljIGNoYXIgYnVmMVtSWF9SSU5HX1NJWkUgKiBQS1RfQlVGX1NaICsgMzJdOwogICAgIHN0YXRpYyBjaGFyIGJ1ZjJbUlhfUklOR19TSVpFICogUEtUX0JVRl9TWiArIDMyXTsKICAgICBzdGF0aWMgY2hhciBkZXNjMVtUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyXTsKICAgICBzdGF0aWMgY2hhciBkZXNjMltUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyXTsKLSNlbmRpZgogCiAgICAgLyogcHJpbnRmICgicmhpbmVfcmVzZXRcbiIpOyAqLwogICAgIC8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCkBAIC0xMDY5LDYgKzExNjAsOSBAQAogICAgIG91dGwgKHZpcnRfdG9fYnVzICh0cC0+cnhfcmluZyksIGR3Q3VycmVudFJ4RGVzY0FkZHIpOwogICAgIG91dGwgKHZpcnRfdG9fYnVzICh0cC0+dHhfcmluZyksIGR3Q3VycmVudFR4RGVzY0FkZHIpOwogCisgICAgLyogU2V0dXAgTXVsdGljYXN0ICovCQorICAgIHNldF9yeF9tb2RlKG5pYyk7CisKICAgICAvKiBjbG9zZSBJTVIgKi8KICAgICBvdXR3ICgweDAwMDAsIGJ5SU1SMCk7CiAKQEAgLTEwOTMsMTUgKzExODcsMzQgQEAKICAgICAvKnNldCBJTVIgdG8gd29yayAqLwogICAgIG91dHcgKElNUlNoYWRvdywgYnlJTVIwKTsKIH0KKy8qIEJld2FyZSBvZiBQQ0kgcG9zdGVkIHdyaXRlcyAqLworI2RlZmluZSBJT1NZTkMgIGRvIHsgcmVhZGIobmljLT5pb2FkZHIgKyBTdGF0aW9uQWRkcik7IH0gd2hpbGUgKDApCiAKIHN0YXRpYyBpbnQKLXJoaW5lX3BvbGwgKHN0cnVjdCBuaWMgKm5pYykKK3JoaW5lX3BvbGwgKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJlaXZlKQogewogICAgIHN0cnVjdCByaGluZV9wcml2YXRlICp0cCA9IChzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqKSBuaWMtPnByaXZfZGF0YTsKICAgICBpbnQgcnhzdGF0dXMsIGdvb2QgPSAwOzsKIAogICAgIGlmICh0cC0+cnhfcmluZ1t0cC0+Y3VyX3J4XS5yeF9zdGF0dXMuYml0cy5vd25fYml0ID09IDApCiAgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgaW50cl9zdGF0dXM7CisgICAgICAgIC8qIFRoZXJlIGlzIGEgcGFja2V0IHJlYWR5ICovCisgICAgICAgIGlmKCFyZXRyZWl2ZSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGludHJfc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CisgICAgICAgIC8qIE9uIFJoaW5lLUlJLCBCaXQgMyBpbmRpY2F0ZXMgVHggZGVzY3JpcHRvciB3cml0ZS1iYWNrIHJhY2UuICovCisjaWYgMAorCWlmICh0cC0+Y2hpcF9pZCA9PSAweDMwNjUpCisJICBpbnRyX3N0YXR1cyB8PSBpbmIobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzMikgPDwgMTY7CisjZW5kaWYKKyAgICAgICAgLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisgICAgICAgIGlmIChpbnRyX3N0YXR1cyAmIEludHJUeERlc2NSYWNlKQorICAgICAgICAgICBvdXRiKDB4MDgsIG5pYy0+aW9hZGRyICsgSW50clN0YXR1czIpOworICAgICAgICBvdXR3KGludHJfc3RhdHVzICYgMHhmZmZmLCBuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworCUlPU1lOQzsKKwogCXJ4c3RhdHVzID0gdHAtPnJ4X3JpbmdbdHAtPmN1cl9yeF0ucnhfc3RhdHVzLmx3OwogCWlmICgocnhzdGF0dXMgJiAweDAzMDApICE9IDB4MDMwMCkKIAl7CkBAIC0xMTI0LDYgKzEyMzcsMTEgQEAKIAl0cC0+Y3VyX3J4Kys7CiAJdHAtPmN1cl9yeCA9IHRwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CiAgICAgfQorICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKyAgICAgICAgb3V0dyhERUZBVUxUX0lOVFIgJiB+SW50clJ4RG9uZSwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworICAgICAgICBJT1NZTkM7CisKICAgICByZXR1cm4gZ29vZDsKIH0KIApAQCAtMTE1Miw3ICsxMjcwLDcgQEAKICAgICB3aGlsZSAocyA8IEVUSF9aTEVOKQogCSooKGNoYXIgKikgdHAtPnR4X2J1ZmZzW2VudHJ5XSArIEVUSF9ITEVOICsgKHMrKykpID0gMDsKIAotICAgIHRwLT50eF9yaW5nW2VudHJ5XS50eF9jdHJsLmJpdHMudHhfYnVmX3NpemUgPSBFVEhfSExFTiArIHM7CisgICAgdHAtPnR4X3JpbmdbZW50cnldLnR4X2N0cmwuYml0cy50eF9idWZfc2l6ZSA9IHM7CiAKICAgICB0cC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzLmJpdHMub3duX2JpdCA9IDE7CiAKQEAgLTExNzAsNiArMTI4OCw5IEBACiAgICAgLypwcmludGYoInRkND1bJVhdIixpbmwoZHdDdXJyZW50VERTRTMpKTsgKi8KIAogICAgIG91dGIgKENSMWJhaywgYnlDUjEpOworICAgIC8qIFdhaXQgdW50aWwgdHJhbnNtaXQgaXMgZmluaXNoZWQgKi8KKyAgICB3aGlsZSAodHAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cy5iaXRzLm93bl9iaXQgIT0gMCkKKwk7CiAgICAgdHAtPmN1cl90eCsrOwogCiAgICAgLypvdXR3KElNUlNoYWRvdyxieUlNUjApOyAqLwpAQCAtMTE3Nyw0ICsxMjk4LDIxIEBACiAgICAgLyp0cC0+dHhfc2tidWZmW2VudHJ5XSA9IDA7ICovCiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHJoaW5lX25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMTA2LCAweDMwNjUsICJkbGluay01MzB0eCIsICAgICAiVklBIDYxMDIiKSwKK1BDSV9ST00oMHgxMTA2LCAweDMxMDYsICJ2aWEtcmhpbmUtNjEwNSIsICAiVklBIDYxMDUiKSwKK1BDSV9ST00oMHgxMTA2LCAweDMwNDMsICJkbGluay01MzB0eC1vbGQiLCAiVklBIDMwNDMiKSwJCS8qIFJoaW5lLUkgODZjMTAwYSAqLworUENJX1JPTSgweDExMDYsIDB4MzA1MywgInZpYTYxMDVtIiwgICAgICAgICJWSUEgNjEwNU0iKSwJCitQQ0lfUk9NKDB4MTEwNiwgMHg2MTAwLCAidmlhLXJoaW5lLW9sZCIsICAgIlZJQSA4NkMxMDBBIiksCS8qIFJoaW5lLUlJICovCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciByaGluZV9kcml2ZXIgPSB7CisJLnR5cGUgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgPSAiVklBIDg2QzEwMCIsCisJLnByb2JlICAgID0gcmhpbmVfcHJvYmUsCisJLmlkcyAgICAgID0gcmhpbmVfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YocmhpbmVfbmljcykvc2l6ZW9mKHJoaW5lX25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OworCiAvKiBFT0YgdmlhLXJoaW5lLmMgKi8KSW5kZXg6IGIvbmV0Ym9vdC93ODljODQwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYS9uZXRib290L3c4OWM4NDAuYworKysgYi9uZXRib290L3c4OWM4NDAuYwpAQCAtNDMsNiArNDMsOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aW1lcjIgcm91dGluZXMuIFByb3Bvc2VkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEtlbiBZYXAgdG8gZWxpbWluYXRlIENQVSBzcGVlZAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LgorICogICAgICAgICAgICAgRGVjIDEyIDIwMDMgIFYwLjk0ICAgdGltbGVnZ2UJRml4ZWQgaXNzdWVzIGluIDUuMiwgcmVtb3ZlZCAKKyAqICAgICAgICAgICAgIAkJCQkJaW50ZXJydXB0IHVzYWdlLCBlbmFibGVkCisgKiAgICAgICAgICAgICAJCQkJCW11bHRpY2FzdCBzdXBwb3J0CiAgKgogICogVGhpcyBpcyB0aGUgZXRoZXJib290IGRyaXZlciBmb3IgY2FyZHMgYmFzZWQgb24gV2luYm9uZCBXODljODQwRiBjaGlwLgogICoKQEAgLTc3LDEwICs4MCw5IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCi1zdGF0aWMgY29uc3QgY2hhciAqdzg5Yzg0MF92ZXJzaW9uID0gImRpdmVyIFZlcnNpb24gMC45MiAtIEF1Z3VzdCAyNywgMjAwMCI7CitzdGF0aWMgY29uc3QgY2hhciAqdzg5Yzg0MF92ZXJzaW9uID0gImRyaXZlciBWZXJzaW9uIDAuOTQgLSBEZWNlbWJlciAxMiwgMjAwMyI7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7CiB0eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwpAQCAtOTAsOSArOTIsNiBAQAogdHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7CiAKIC8qIExpbnV4IHN1cHBvcnQgZnVuY3Rpb25zICovCi0jZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQotI2RlZmluZSBidXNfdG9fdmlydCh4KSAoKHZvaWQgKil4KQotCiAjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIHZpcnRfdG9fYnVzKGFkZHIpCiAjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGFkZHIpCiAKQEAgLTEwOSw3ICsxMDgsNiBAQAogICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgogICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCiAjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAyCi0KICNkZWZpbmUgUlhfUklOR19TSVpFICAgIDIKIAogLyogVGhlIHByZXN1bWVkIEZJRk8gc2l6ZSBmb3Igd29ya2luZyBhcm91bmQgdGhlIFR4LUZJRk8tb3ZlcmZsb3cgYnVnLgpAQCAtMjYwLDMyICsyNTgsMjAgQEAKIAogc3RhdGljIGludCBpb2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZWVwcm9tIFsweDQwXTsKLQotI2lmZGVmICAgIFVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHJ4X3BhY2tldCAoKGNoYXIgKikweDEwMDAwIC0gUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRSkKLSNkZWZpbmUgdHhfcGFja2V0ICgoY2hhciAqKTB4MTAwMDAgLSBQS1RfQlVGX1NaICogUlhfUklOR19TSVpFIC0gUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSkKLSNlbHNlCiBzdGF0aWMgY2hhciAgICAgICAgcnhfcGFja2V0W1BLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkVdOwogc3RhdGljIGNoYXIgICAgICAgIHR4X3BhY2tldFtQS1RfQlVGX1NaICogVFhfUklOR19TSVpFXTsKLSNlbmRpZgogCiBzdGF0aWMgaW50ICBlZXByb21fcmVhZChsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyBpbnQgIG1kaW9fcmVhZChpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworI2lmIDAKIHN0YXRpYyB2b2lkIG1kaW9fd3JpdGUoaW50IGJhc2VfYWRkcmVzcywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNoZWNrX2R1cGxleCh2b2lkKTsKIHN0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHZvaWQpOwogc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpOwogCi0vKgotc3RhdGljIHZvaWQgd2FpdF9sb25nX3RpbWUodm9pZCkKLXsKLSAgICBwcmludGYoIlBhdXNlZCAtIHBsZWFzZSByZWFkIG91dHB1dCBhYm92ZSB0aGlzIGxpbmVcbiIpOwotICAgIHNsZWVwKDMpOwotfQotKi8KLQotI2lmIGRlZmluZWQgVzg5Qzg0MF9ERUJVRworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKIHN0YXRpYyB2b2lkIGRlY29kZV9pbnRlcnJ1cHQodTMyIGludHJfc3RhdHVzKQogewogICAgIHByaW50ZigiSW50ZXJydXB0IHN0YXR1czogIik7CkBAIC0zNDksMTUgKzMzNSwxNyBAQAogICAgIGNoZWNrX2R1cGxleCgpOwogICAgIHNldF9yeF9tb2RlKCk7CiAKLSAgICAvKiBDbGVhciBhbmQgRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgLyogRG8gbm90IGVuYWJsZSB0aGUgaW50ZXJydXB0cyBFdGhlcmJvb3QgZG9lc24ndCBuZWVkIHRoZW0gKi8KKy8qCiAgICAgd3JpdGVsKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOwogICAgIHdyaXRlbCgweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKLQorKi8KICNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCiAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IERvbmUgcmVzZXQuXG4iKTsKICNlbmRpZgogfQogCisjaWYgMAogc3RhdGljIHZvaWQgaGFuZGxlX2ludHIodTMyIGludHJfc3RhdCkKIHsKICAgICBpZiAoKGludHJfc3RhdCAmIChOb3JtYWxJbnRyfEFibm9ybWFsSW50cikpID09IDApIHsKQEAgLTM3Miw3ICszNjAsNyBAQAogICAgICAgICAvKiBUaGVyZSB3YXMgYW4gYWJub3JtYWwgaW50ZXJydXB0ICovCiAgICAgICAgIHByaW50ZigiXG4tPS0gQWJub3JtYWwgaW50ZXJydXB0LlxuIik7CiAKLSNpZiBkZWZpbmVkIChXODlDODQwX0RFQlVHKQorI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKICAgICAgICAgZGVjb2RlX2ludGVycnVwdChpbnRyX3N0YXQpOwogI2VuZGlmCiAKQEAgLTM4MywxOSArMzcxLDIxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiB3ODljODQwX3BvbGwgLSBXYWl0IGZvciBhIGZyYW1lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHc4OWM4NDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IHc4OWM4NDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKICAgICAvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCiAgICAgLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KICAgICAvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLwogICAgIGludCBwYWNrZXRfcmVjZWl2ZWQgPSAwOwogCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQogICAgIHUzMiBpbnRyX3N0YXR1cyA9IHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOwotICAgIC8qIGhhbmRsZV9pbnRyKGludHJfc3RhdHVzKTsgKi8gLyogLS0gaGFuZGxlZCBsYXRlciAqLworI2VuZGlmCiAKICAgICBkbyB7CiAgICAgICAgIC8qIENvZGUgZnJvbSBuZXRkZXZfcngoZGV2KSAqLwpAQCAtNDExLDYgKzQwMSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoICFyZXRyaWV2ZSApIHsKKyAgICAgICAgICAgIHBhY2tldF9yZWNlaXZlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSB7CiAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDAzMDApICE9IDB4MDMwMCkgewogICAgICAgICAgICAgICAgIC8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCkBAIC00NzgsMTEgKzQ3Myw3IEBACiAgICAgICAgIGVudHJ5ID0gKCsrdzg0MHByaXZhdGUuY3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKICAgICAgICAgdzg0MHByaXZhdGUucnhfaGVhZF9kZXNjID0gJnc4NDBwcml2YXRlLnJ4X3JpbmdbZW50cnldOwogICAgIH0gd2hpbGUgKDApOwotCi0gICAgaWYgKGludHJfc3RhdHVzICYgKEFibm9ybWFsSW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IEludHJQQ0lFcnIgfFRpbWVySW50IHwgSW50clR4U3RvcHBlZCkpIHsKLSAgICAgICAgaGFuZGxlX2ludHIoaW50cl9zdGF0dXMpOwotICAgIH0KLQorICAgIAogICAgIHJldHVybiBwYWNrZXRfcmVjZWl2ZWQ7CiB9CiAKQEAgLTUyMSwxMyArNTEyLDEzIEBACiAKICAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19sZTMyZGVzYyh0eF9wYWNrZXQpOwogCi0gICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKERlc2NXaG9sZVBrdCB8IHMpOworICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IChEZXNjV2hvbGVQa3QgfCAodTMyKSBzKTsKICAgICBpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpICAgICAgICAgLyogV3JhcCByaW5nICovCiAgICAgICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCB8PSAoRGVzY0ludHIgfCBEZXNjRW5kUmluZyk7CiAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gKERlc2NPd24pOwogICAgIHc4NDBwcml2YXRlLmN1cl90eCsrOwogCi0gICAgdzg0MHByaXZhdGUudHhfcV9ieXRlcyArPSBzOworICAgIHc4NDBwcml2YXRlLnR4X3FfYnl0ZXMgPSAodTE2KSBzOwogICAgIHdyaXRlbCgwLCBpb2FkZHIgKyBUeFN0YXJ0RGVtYW5kKTsKIAogICAgIC8qIFdvcmsgYXJvdW5kIGhvcnJpYmxlIGJ1ZyBpbiB0aGUgY2hpcCBieSBtYXJraW5nIHRoZSBxdWV1ZSBhcyBmdWxsCkBAIC01NTAsMzMgKzU0MSwyOSBAQAogICAgIGxvYWRfdGltZXIyKFRYX1RJTUVPVVQpOwogCiAgICAgeworI2lmIGRlZmluZWQgVzg5Qzg0MF9ERUJVRwogICAgICAgICB1MzIgaW50cl9zdGF0ID0gMDsKLQorI2VuZGlmCiAgICAgICAgIHdoaWxlICgxKSB7CiAKLSAgICAgICAgICAgIGludHJfc3RhdCA9IHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOwogI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKLSAgICAgICAgICAgIGRlY29kZV9pbnRlcnJ1cHQoaW50cl9zdGF0KTsKKwkgICAgICBkZWNvZGVfaW50ZXJydXB0KGludHJfc3RhdCk7CiAjZW5kaWYKIAotICAgICAgICAgICAgaWYgKGludHJfc3RhdCAmIChOb3JtYWxJbnRyIHwgSW50clR4RG9uZSkpIHsKLQogICAgICAgICAgICAgICAgIHdoaWxlICggKHRyYW5zbWl0X3N0YXR1cyAmIERlc2NPd24pICYmIHRpbWVyMl9ydW5uaW5nKCkpIHsKIAogICAgICAgICAgICAgICAgICAgICB0cmFuc21pdF9zdGF0dXMgPSB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgd3JpdGVsKGludHJfc3RhdCAmIDB4MDAwMWZmZmYsIGlvYWRkciArIEludHJTdGF0dXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCh0cmFuc21pdF9zdGF0dXMgJiBEZXNjT3duKSA9PSAwKSB7CiAKICNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCi0gICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiB0cmFuc21pc3Npb24gY29tcGxldGUgYWZ0ZXIgJWQgd2FpdCBsb29wIGl0ZXJhdGlvbnMsIHN0YXR1cyAlWFxuIiwKLSAgICAgICAgICAgICAgIFRYX0xPT1BfQ09VTlQgLSB0cmFuc21pdF9sb29wX2NvdW50ZXIsIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisgICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiB0cmFuc21pc3Npb24gY29tcGxldGUgYWZ0ZXIgd2FpdCBsb29wIGl0ZXJhdGlvbnMsIHN0YXR1cyAlWFxuIiwKKyAgICAgICAgICAgICAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOwogI2VuZGlmCiAKICAgICAgICAgcmV0dXJuOwpAQCAtNTkyLDggKzU3OSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiB3ODljODQwX2Rpc2FibGUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHc4OWM4NDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCB3ODljODQwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgdzg5Yzg0MF9yZXNldChuaWMpOworCiAgICAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHRvIGRpc2FibGUgdGhlIGJvYXJkLiBJcyB0aGlzIG5lZWRlZCBhdCBhbGw/ICovCiAgICAgLyogWWVzLCBhIGxpdmUgTklDIGNhbiBjb3JydXB0IHRoZSBsb2FkZWQgbWVtb3J5IGxhdGVyIFtLZW5dICovCiAgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCkBAIC02MDEsMjAgKzU5MiwzNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfaXJxIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3ODljODQwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIHc4OWM4NDBfcHJvYmUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICp3ODljODQwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcCkKK3N0YXRpYyBpbnQgdzg5Yzg0MF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogICAgIHUxNiBzdW0gPSAwOwotICAgIGludCBpLCBqLCB0bzsKKyAgICBpbnQgaSwgajsKICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLSAgICBpbnQgb3B0aW9uczsKLSAgICBpbnQgcHJvbWlzYzsKIAotICAgIGlmIChwcm9iZV9hZGRycyA9PSAwIHx8IHByb2JlX2FkZHJzWzBdID09IDApCisgICAgaWYgKHAtPmlvYWRkciA9PSAwKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlvYWRkciA9IHByb2JlX2FkZHJzWzBdOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisgICAgaW9hZGRyICAgICAgPSBwLT5pb2FkZHI7CisgICAgbmljLT5pb2FkZHIgPSBwLT5pb2FkZHIgJiB+MzsKKyAgICBuaWMtPmlycW5vICA9IDA7CisKIAogI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKICAgICBwcmludGYoIndpbmJvbmQtODQwOiBQQ0kgYnVzICVoaFggZGV2aWNlIGZ1bmN0aW9uICVoaFg6IEkvTyBhZGRyZXNzOiAlaFhcbiIsIHAtPmJ1cywgcC0+ZGV2Zm4sIGlvYWRkcik7CkBAIC02MjIsOCArNjMwLDYgQEAKIAogICAgIGlvYWRkciA9IGlvYWRkciAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCiAKLSAgICAvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0KICAgICAvKiBGcm9tIE1hdHQgSG9ydG1hbiA8bWJob3J0bWFuQGFjcHRoaW5jbGllbnQuY29tPiAqLwogICAgIGlmIChwLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9XSU5CT05EMgogICAgICAgICAmJiBwLT5kZXZfaWQgPT0gUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDApIHsKQEAgLTY4OSwxNCArNjk1LDE0IEBACiAgICAgfQogCiAgICAgLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0gICAgbmljLT5yZXNldCA9IHc4OWM4NDBfcmVzZXQ7Ci0gICAgbmljLT5wb2xsID0gdzg5Yzg0MF9wb2xsOworICAgIGRldi0+ZGlzYWJsZSAgPSB3ODljODQwX2Rpc2FibGU7CisgICAgbmljLT5wb2xsICAgICA9IHc4OWM4NDBfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gdzg5Yzg0MF90cmFuc21pdDsKLSAgICBuaWMtPmRpc2FibGUgPSB3ODljODQwX2Rpc2FibGU7CisgICAgbmljLT5pcnEgICAgICA9IHc4OWM4NDBfaXJxOwogCiAgICAgdzg5Yzg0MF9yZXNldChuaWMpOwogCi0gICAgcmV0dXJuIG5pYzsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogUmVhZCB0aGUgRUVQUk9NIGFuZCBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlcy4gIFRoZXNlIGFyZQpAQCAtODE0LDYgKzgyMCw3IEBACiAgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOwogfQogCisjaWYgMAogc3RhdGljIHZvaWQgbWRpb193cml0ZShpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKICAgICBsb25nIG1kaW9fYWRkciA9IGJhc2VfYWRkcmVzcyArIE1JSUN0cmw7CkBAIC04NDQsNiArODUxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNoZWNrX2R1cGxleCh2b2lkKQogewpAQCAtODc3LDEyICs4ODUsMTAgQEAKICAgICBtZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CiAKIC8qCi0gKiBBY3R1YWxseSwgc2hvdWxkIHdvcmsgT0sgd2l0aCBtdWx0aWNhc3QgZW5hYmxlZC4gLS0gaWtvCi0gKi8KLS8qCi0gKiAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5cyB8IEFjY2VwdE11bHRpY2FzdDsKKyAqIHdvcmtzIE9LIHdpdGggbXVsdGljYXN0IGVuYWJsZWQuIAogICovCi0gICAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKworICAgIHJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXMgfCBBY2NlcHRNdWx0aWNhc3Q7CiAKICAgICB3cml0ZWwobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKICAgICB3cml0ZWwobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKQEAgLTkzMiwzICs5MzgsMTggQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHc4OWM4NDBfbmljc1tdID0geworUENJX1JPTSgweDEwNTAsIDB4MDg0MCwgIndpbmJvbmQ4NDAiLCAgICAgIldpbmJvbmQgVzg5Qzg0MEYiKSwKK1BDSV9ST00oMHgxMWY2LCAweDIwMTEsICJjb21wZXhybDEwMGF0eCIsICJDb21wZXggUkwxMDBBVFgiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHc4OWM4NDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlc4OUM4NDBGIiwKKwkucHJvYmUgICAgPSB3ODljODQwX3Byb2JlLAorCS5pZHMgICAgICA9IHc4OWM4NDBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2Yodzg5Yzg0MF9uaWNzKS9zaXplb2Yodzg5Yzg0MF9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKSW5kZXg6IGIvc3RhZ2UyL2Rpc2tfaW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhL3N0YWdlMi9kaXNrX2lvLmMKKysrIGIvc3RhZ2UyL2Rpc2tfaW8uYwpAQCAtMjUsNiArMjUsNyBAQAogI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAogIyBkZWZpbmUgR1JVQgkxCiAjIGluY2x1ZGUgPGV0aGVyYm9vdC5oPgorIyBpbmNsdWRlIDxncnViLmg+CiAjZW5kaWYKIAogI2lmZGVmIEdSVUJfVVRJTAo=